@ondewo/csi-client-angular 5.0.0 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/api/ondewo/csi/conversation.pb.d.ts +4 -1
  2. package/api/ondewo/s2t/speech-to-text.pb.d.ts +5 -1
  3. package/fesm2022/ondewo-csi-client-angular.mjs +60 -53
  4. package/fesm2022/ondewo-csi-client-angular.mjs.map +1 -1
  5. package/package.json +1 -3
  6. package/esm2022/api/google/api/annotations.pb.mjs +0 -2
  7. package/esm2022/api/google/api/http.pb.mjs +0 -524
  8. package/esm2022/api/google/rpc/status.pb.mjs +0 -138
  9. package/esm2022/api/google/type/latlng.pb.mjs +0 -119
  10. package/esm2022/api/ondewo/csi/conversation.pb.mjs +0 -2070
  11. package/esm2022/api/ondewo/csi/conversation.pbconf.mjs +0 -13
  12. package/esm2022/api/ondewo/csi/conversation.pbsc.mjs +0 -315
  13. package/esm2022/api/ondewo/nlu/agent.pb.mjs +0 -11502
  14. package/esm2022/api/ondewo/nlu/agent.pbconf.mjs +0 -13
  15. package/esm2022/api/ondewo/nlu/agent.pbsc.mjs +0 -1246
  16. package/esm2022/api/ondewo/nlu/aiservices.pb.mjs +0 -5313
  17. package/esm2022/api/ondewo/nlu/aiservices.pbconf.mjs +0 -13
  18. package/esm2022/api/ondewo/nlu/aiservices.pbsc.mjs +0 -374
  19. package/esm2022/api/ondewo/nlu/ccai-project.pb.mjs +0 -2691
  20. package/esm2022/api/ondewo/nlu/ccai-project.pbconf.mjs +0 -13
  21. package/esm2022/api/ondewo/nlu/ccai-project.pbsc.mjs +0 -224
  22. package/esm2022/api/ondewo/nlu/common.pb.mjs +0 -1963
  23. package/esm2022/api/ondewo/nlu/context.pb.mjs +0 -1380
  24. package/esm2022/api/ondewo/nlu/context.pbconf.mjs +0 -13
  25. package/esm2022/api/ondewo/nlu/context.pbsc.mjs +0 -225
  26. package/esm2022/api/ondewo/nlu/entity-type.pb.mjs +0 -3909
  27. package/esm2022/api/ondewo/nlu/entity-type.pbconf.mjs +0 -13
  28. package/esm2022/api/ondewo/nlu/entity-type.pbsc.mjs +0 -526
  29. package/esm2022/api/ondewo/nlu/intent.pb.mjs +0 -11252
  30. package/esm2022/api/ondewo/nlu/intent.pbconf.mjs +0 -13
  31. package/esm2022/api/ondewo/nlu/intent.pbsc.mjs +0 -856
  32. package/esm2022/api/ondewo/nlu/operation-metadata.pb.mjs +0 -487
  33. package/esm2022/api/ondewo/nlu/operations.pb.mjs +0 -1003
  34. package/esm2022/api/ondewo/nlu/operations.pbconf.mjs +0 -13
  35. package/esm2022/api/ondewo/nlu/operations.pbsc.mjs +0 -165
  36. package/esm2022/api/ondewo/nlu/project-role.pb.mjs +0 -1061
  37. package/esm2022/api/ondewo/nlu/project-role.pbconf.mjs +0 -13
  38. package/esm2022/api/ondewo/nlu/project-role.pbsc.mjs +0 -195
  39. package/esm2022/api/ondewo/nlu/project-statistics.pb.mjs +0 -460
  40. package/esm2022/api/ondewo/nlu/project-statistics.pbconf.mjs +0 -13
  41. package/esm2022/api/ondewo/nlu/project-statistics.pbsc.mjs +0 -285
  42. package/esm2022/api/ondewo/nlu/server-statistics.pb.mjs +0 -103
  43. package/esm2022/api/ondewo/nlu/server-statistics.pbconf.mjs +0 -13
  44. package/esm2022/api/ondewo/nlu/server-statistics.pbsc.mjs +0 -136
  45. package/esm2022/api/ondewo/nlu/session.pb.mjs +0 -13750
  46. package/esm2022/api/ondewo/nlu/session.pbconf.mjs +0 -13
  47. package/esm2022/api/ondewo/nlu/session.pbsc.mjs +0 -1246
  48. package/esm2022/api/ondewo/nlu/user.pb.mjs +0 -3865
  49. package/esm2022/api/ondewo/nlu/user.pbconf.mjs +0 -13
  50. package/esm2022/api/ondewo/nlu/user.pbsc.mjs +0 -706
  51. package/esm2022/api/ondewo/nlu/utility.pb.mjs +0 -3302
  52. package/esm2022/api/ondewo/nlu/utility.pbconf.mjs +0 -13
  53. package/esm2022/api/ondewo/nlu/utility.pbsc.mjs +0 -284
  54. package/esm2022/api/ondewo/nlu/webhook.pb.mjs +0 -1596
  55. package/esm2022/api/ondewo/nlu/webhook.pbconf.mjs +0 -13
  56. package/esm2022/api/ondewo/nlu/webhook.pbsc.mjs +0 -225
  57. package/esm2022/api/ondewo/s2t/speech-to-text.pb.mjs +0 -8346
  58. package/esm2022/api/ondewo/s2t/speech-to-text.pbconf.mjs +0 -13
  59. package/esm2022/api/ondewo/s2t/speech-to-text.pbsc.mjs +0 -495
  60. package/esm2022/api/ondewo/t2s/text-to-speech.pb.mjs +0 -7974
  61. package/esm2022/api/ondewo/t2s/text-to-speech.pbconf.mjs +0 -13
  62. package/esm2022/api/ondewo/t2s/text-to-speech.pbsc.mjs +0 -525
  63. package/esm2022/ondewo-csi-client-angular.mjs +0 -5
  64. package/esm2022/public-api.mjs +0 -58
@@ -1,3302 +0,0 @@
1
- /* tslint:disable */
2
- /* eslint-disable */
3
- // @ts-nocheck
4
- //
5
- // THIS IS A GENERATED FILE
6
- // DO NOT MODIFY IT! YOUR CHANGES WILL BE LOST
7
- import { uint8ArrayToBase64 } from '@ngx-grpc/common';
8
- import { BinaryReader, BinaryWriter } from 'google-protobuf';
9
- import * as ondewoNlu008 from '../../ondewo/nlu/intent.pb';
10
- import * as ondewoNlu009 from '../../ondewo/nlu/entity-type.pb';
11
- export var ReannotateEntitiesOptions;
12
- (function (ReannotateEntitiesOptions) {
13
- ReannotateEntitiesOptions[ReannotateEntitiesOptions["REANNOTATE_NEVER"] = 0] = "REANNOTATE_NEVER";
14
- ReannotateEntitiesOptions[ReannotateEntitiesOptions["REANNOTATE_ALWAYS"] = 1] = "REANNOTATE_ALWAYS";
15
- ReannotateEntitiesOptions[ReannotateEntitiesOptions["REANNOTATE_IF_EMPTY"] = 2] = "REANNOTATE_IF_EMPTY";
16
- ReannotateEntitiesOptions[ReannotateEntitiesOptions["REANNOTATE_AFTER_DELETION"] = 3] = "REANNOTATE_AFTER_DELETION";
17
- ReannotateEntitiesOptions[ReannotateEntitiesOptions["REANNOTATE_IF_EMPTY_OR_AFTER_DELETION"] = 4] = "REANNOTATE_IF_EMPTY_OR_AFTER_DELETION";
18
- })(ReannotateEntitiesOptions || (ReannotateEntitiesOptions = {}));
19
- /**
20
- * Message implementation for ondewo.nlu.ValidateRegexRequest
21
- */
22
- export class ValidateRegexRequest {
23
- static { this.id = 'ondewo.nlu.ValidateRegexRequest'; }
24
- /**
25
- * Deserialize binary data to message
26
- * @param instance message instance
27
- */
28
- static deserializeBinary(bytes) {
29
- const instance = new ValidateRegexRequest();
30
- ValidateRegexRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
31
- return instance;
32
- }
33
- /**
34
- * Check all the properties and set default protobuf values if necessary
35
- * @param _instance message instance
36
- */
37
- static refineValues(_instance) {
38
- _instance.regex = _instance.regex || '';
39
- }
40
- /**
41
- * Deserializes / reads binary message into message instance using provided binary reader
42
- * @param _instance message instance
43
- * @param _reader binary reader instance
44
- */
45
- static deserializeBinaryFromReader(_instance, _reader) {
46
- while (_reader.nextField()) {
47
- if (_reader.isEndGroup())
48
- break;
49
- switch (_reader.getFieldNumber()) {
50
- case 1:
51
- _instance.regex = _reader.readString();
52
- break;
53
- default:
54
- _reader.skipField();
55
- }
56
- }
57
- ValidateRegexRequest.refineValues(_instance);
58
- }
59
- /**
60
- * Serializes a message to binary format using provided binary reader
61
- * @param _instance message instance
62
- * @param _writer binary writer instance
63
- */
64
- static serializeBinaryToWriter(_instance, _writer) {
65
- if (_instance.regex) {
66
- _writer.writeString(1, _instance.regex);
67
- }
68
- }
69
- /**
70
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
71
- * @param _value initial values object or instance of ValidateRegexRequest to deeply clone from
72
- */
73
- constructor(_value) {
74
- _value = _value || {};
75
- this.regex = _value.regex;
76
- ValidateRegexRequest.refineValues(this);
77
- }
78
- get regex() {
79
- return this._regex;
80
- }
81
- set regex(value) {
82
- this._regex = value;
83
- }
84
- /**
85
- * Serialize message to binary data
86
- * @param instance message instance
87
- */
88
- serializeBinary() {
89
- const writer = new BinaryWriter();
90
- ValidateRegexRequest.serializeBinaryToWriter(this, writer);
91
- return writer.getResultBuffer();
92
- }
93
- /**
94
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
95
- */
96
- toObject() {
97
- return {
98
- regex: this.regex
99
- };
100
- }
101
- /**
102
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
103
- */
104
- toJSON() {
105
- return this.toObject();
106
- }
107
- /**
108
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
109
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
110
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
111
- */
112
- toProtobufJSON(
113
- // @ts-ignore
114
- options) {
115
- return {
116
- regex: this.regex
117
- };
118
- }
119
- }
120
- /**
121
- * Message implementation for ondewo.nlu.ValidateRegexResponse
122
- */
123
- export class ValidateRegexResponse {
124
- static { this.id = 'ondewo.nlu.ValidateRegexResponse'; }
125
- /**
126
- * Deserialize binary data to message
127
- * @param instance message instance
128
- */
129
- static deserializeBinary(bytes) {
130
- const instance = new ValidateRegexResponse();
131
- ValidateRegexResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
132
- return instance;
133
- }
134
- /**
135
- * Check all the properties and set default protobuf values if necessary
136
- * @param _instance message instance
137
- */
138
- static refineValues(_instance) {
139
- _instance.errorMessages = _instance.errorMessages || [];
140
- }
141
- /**
142
- * Deserializes / reads binary message into message instance using provided binary reader
143
- * @param _instance message instance
144
- * @param _reader binary reader instance
145
- */
146
- static deserializeBinaryFromReader(_instance, _reader) {
147
- while (_reader.nextField()) {
148
- if (_reader.isEndGroup())
149
- break;
150
- switch (_reader.getFieldNumber()) {
151
- case 1:
152
- (_instance.errorMessages = _instance.errorMessages || []).push(_reader.readString());
153
- break;
154
- default:
155
- _reader.skipField();
156
- }
157
- }
158
- ValidateRegexResponse.refineValues(_instance);
159
- }
160
- /**
161
- * Serializes a message to binary format using provided binary reader
162
- * @param _instance message instance
163
- * @param _writer binary writer instance
164
- */
165
- static serializeBinaryToWriter(_instance, _writer) {
166
- if (_instance.errorMessages && _instance.errorMessages.length) {
167
- _writer.writeRepeatedString(1, _instance.errorMessages);
168
- }
169
- }
170
- /**
171
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
172
- * @param _value initial values object or instance of ValidateRegexResponse to deeply clone from
173
- */
174
- constructor(_value) {
175
- _value = _value || {};
176
- this.errorMessages = (_value.errorMessages || []).slice();
177
- ValidateRegexResponse.refineValues(this);
178
- }
179
- get errorMessages() {
180
- return this._errorMessages;
181
- }
182
- set errorMessages(value) {
183
- this._errorMessages = value;
184
- }
185
- /**
186
- * Serialize message to binary data
187
- * @param instance message instance
188
- */
189
- serializeBinary() {
190
- const writer = new BinaryWriter();
191
- ValidateRegexResponse.serializeBinaryToWriter(this, writer);
192
- return writer.getResultBuffer();
193
- }
194
- /**
195
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
196
- */
197
- toObject() {
198
- return {
199
- errorMessages: (this.errorMessages || []).slice()
200
- };
201
- }
202
- /**
203
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
204
- */
205
- toJSON() {
206
- return this.toObject();
207
- }
208
- /**
209
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
210
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
211
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
212
- */
213
- toProtobufJSON(
214
- // @ts-ignore
215
- options) {
216
- return {
217
- errorMessages: (this.errorMessages || []).slice()
218
- };
219
- }
220
- }
221
- /**
222
- * Message implementation for ondewo.nlu.ValidateEmbeddedRegexRequest
223
- */
224
- export class ValidateEmbeddedRegexRequest {
225
- static { this.id = 'ondewo.nlu.ValidateEmbeddedRegexRequest'; }
226
- /**
227
- * Deserialize binary data to message
228
- * @param instance message instance
229
- */
230
- static deserializeBinary(bytes) {
231
- const instance = new ValidateEmbeddedRegexRequest();
232
- ValidateEmbeddedRegexRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
233
- return instance;
234
- }
235
- /**
236
- * Check all the properties and set default protobuf values if necessary
237
- * @param _instance message instance
238
- */
239
- static refineValues(_instance) {
240
- _instance.entityType = _instance.entityType || undefined;
241
- }
242
- /**
243
- * Deserializes / reads binary message into message instance using provided binary reader
244
- * @param _instance message instance
245
- * @param _reader binary reader instance
246
- */
247
- static deserializeBinaryFromReader(_instance, _reader) {
248
- while (_reader.nextField()) {
249
- if (_reader.isEndGroup())
250
- break;
251
- switch (_reader.getFieldNumber()) {
252
- case 1:
253
- _instance.entityType = new ondewoNlu009.EntityType.Entity();
254
- _reader.readMessage(_instance.entityType, ondewoNlu009.EntityType.Entity.deserializeBinaryFromReader);
255
- break;
256
- default:
257
- _reader.skipField();
258
- }
259
- }
260
- ValidateEmbeddedRegexRequest.refineValues(_instance);
261
- }
262
- /**
263
- * Serializes a message to binary format using provided binary reader
264
- * @param _instance message instance
265
- * @param _writer binary writer instance
266
- */
267
- static serializeBinaryToWriter(_instance, _writer) {
268
- if (_instance.entityType) {
269
- _writer.writeMessage(1, _instance.entityType, ondewoNlu009.EntityType.Entity.serializeBinaryToWriter);
270
- }
271
- }
272
- /**
273
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
274
- * @param _value initial values object or instance of ValidateEmbeddedRegexRequest to deeply clone from
275
- */
276
- constructor(_value) {
277
- _value = _value || {};
278
- this.entityType = _value.entityType
279
- ? new ondewoNlu009.EntityType.Entity(_value.entityType)
280
- : undefined;
281
- ValidateEmbeddedRegexRequest.refineValues(this);
282
- }
283
- get entityType() {
284
- return this._entityType;
285
- }
286
- set entityType(value) {
287
- this._entityType = value;
288
- }
289
- /**
290
- * Serialize message to binary data
291
- * @param instance message instance
292
- */
293
- serializeBinary() {
294
- const writer = new BinaryWriter();
295
- ValidateEmbeddedRegexRequest.serializeBinaryToWriter(this, writer);
296
- return writer.getResultBuffer();
297
- }
298
- /**
299
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
300
- */
301
- toObject() {
302
- return {
303
- entityType: this.entityType ? this.entityType.toObject() : undefined
304
- };
305
- }
306
- /**
307
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
308
- */
309
- toJSON() {
310
- return this.toObject();
311
- }
312
- /**
313
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
314
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
315
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
316
- */
317
- toProtobufJSON(
318
- // @ts-ignore
319
- options) {
320
- return {
321
- entityType: this.entityType
322
- ? this.entityType.toProtobufJSON(options)
323
- : null
324
- };
325
- }
326
- }
327
- /**
328
- * Message implementation for ondewo.nlu.ValidateEmbeddedRegexResponse
329
- */
330
- export class ValidateEmbeddedRegexResponse {
331
- static { this.id = 'ondewo.nlu.ValidateEmbeddedRegexResponse'; }
332
- /**
333
- * Deserialize binary data to message
334
- * @param instance message instance
335
- */
336
- static deserializeBinary(bytes) {
337
- const instance = new ValidateEmbeddedRegexResponse();
338
- ValidateEmbeddedRegexResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
339
- return instance;
340
- }
341
- /**
342
- * Check all the properties and set default protobuf values if necessary
343
- * @param _instance message instance
344
- */
345
- static refineValues(_instance) {
346
- _instance.errorMessages = _instance.errorMessages || [];
347
- }
348
- /**
349
- * Deserializes / reads binary message into message instance using provided binary reader
350
- * @param _instance message instance
351
- * @param _reader binary reader instance
352
- */
353
- static deserializeBinaryFromReader(_instance, _reader) {
354
- while (_reader.nextField()) {
355
- if (_reader.isEndGroup())
356
- break;
357
- switch (_reader.getFieldNumber()) {
358
- case 1:
359
- (_instance.errorMessages = _instance.errorMessages || []).push(_reader.readString());
360
- break;
361
- default:
362
- _reader.skipField();
363
- }
364
- }
365
- ValidateEmbeddedRegexResponse.refineValues(_instance);
366
- }
367
- /**
368
- * Serializes a message to binary format using provided binary reader
369
- * @param _instance message instance
370
- * @param _writer binary writer instance
371
- */
372
- static serializeBinaryToWriter(_instance, _writer) {
373
- if (_instance.errorMessages && _instance.errorMessages.length) {
374
- _writer.writeRepeatedString(1, _instance.errorMessages);
375
- }
376
- }
377
- /**
378
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
379
- * @param _value initial values object or instance of ValidateEmbeddedRegexResponse to deeply clone from
380
- */
381
- constructor(_value) {
382
- _value = _value || {};
383
- this.errorMessages = (_value.errorMessages || []).slice();
384
- ValidateEmbeddedRegexResponse.refineValues(this);
385
- }
386
- get errorMessages() {
387
- return this._errorMessages;
388
- }
389
- set errorMessages(value) {
390
- this._errorMessages = value;
391
- }
392
- /**
393
- * Serialize message to binary data
394
- * @param instance message instance
395
- */
396
- serializeBinary() {
397
- const writer = new BinaryWriter();
398
- ValidateEmbeddedRegexResponse.serializeBinaryToWriter(this, writer);
399
- return writer.getResultBuffer();
400
- }
401
- /**
402
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
403
- */
404
- toObject() {
405
- return {
406
- errorMessages: (this.errorMessages || []).slice()
407
- };
408
- }
409
- /**
410
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
411
- */
412
- toJSON() {
413
- return this.toObject();
414
- }
415
- /**
416
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
417
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
418
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
419
- */
420
- toProtobufJSON(
421
- // @ts-ignore
422
- options) {
423
- return {
424
- errorMessages: (this.errorMessages || []).slice()
425
- };
426
- }
427
- }
428
- /**
429
- * Message implementation for ondewo.nlu.CleanAllIntentsRequest
430
- */
431
- export class CleanAllIntentsRequest {
432
- static { this.id = 'ondewo.nlu.CleanAllIntentsRequest'; }
433
- /**
434
- * Deserialize binary data to message
435
- * @param instance message instance
436
- */
437
- static deserializeBinary(bytes) {
438
- const instance = new CleanAllIntentsRequest();
439
- CleanAllIntentsRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
440
- return instance;
441
- }
442
- /**
443
- * Check all the properties and set default protobuf values if necessary
444
- * @param _instance message instance
445
- */
446
- static refineValues(_instance) {
447
- _instance.parent = _instance.parent || '';
448
- _instance.languageCode = _instance.languageCode || '';
449
- _instance.specialCharacters = _instance.specialCharacters || '';
450
- _instance.substringWhiteList = _instance.substringWhiteList || [];
451
- _instance.dryRun = _instance.dryRun || false;
452
- _instance.trainingPhraseCleanerOptions =
453
- _instance.trainingPhraseCleanerOptions || undefined;
454
- _instance.reannotateEntitiesOptions =
455
- _instance.reannotateEntitiesOptions || 0;
456
- _instance.numberOfWorkers = _instance.numberOfWorkers || 0;
457
- }
458
- /**
459
- * Deserializes / reads binary message into message instance using provided binary reader
460
- * @param _instance message instance
461
- * @param _reader binary reader instance
462
- */
463
- static deserializeBinaryFromReader(_instance, _reader) {
464
- while (_reader.nextField()) {
465
- if (_reader.isEndGroup())
466
- break;
467
- switch (_reader.getFieldNumber()) {
468
- case 1:
469
- _instance.parent = _reader.readString();
470
- break;
471
- case 2:
472
- _instance.languageCode = _reader.readString();
473
- break;
474
- case 3:
475
- _instance.specialCharacters = _reader.readString();
476
- break;
477
- case 4:
478
- (_instance.substringWhiteList =
479
- _instance.substringWhiteList || []).push(_reader.readString());
480
- break;
481
- case 5:
482
- _instance.dryRun = _reader.readBool();
483
- break;
484
- case 6:
485
- _instance.trainingPhraseCleanerOptions = new TrainingPhraseCleanerOptions();
486
- _reader.readMessage(_instance.trainingPhraseCleanerOptions, TrainingPhraseCleanerOptions.deserializeBinaryFromReader);
487
- break;
488
- case 7:
489
- _instance.reannotateEntitiesOptions = _reader.readEnum();
490
- break;
491
- case 8:
492
- _instance.numberOfWorkers = _reader.readInt32();
493
- break;
494
- default:
495
- _reader.skipField();
496
- }
497
- }
498
- CleanAllIntentsRequest.refineValues(_instance);
499
- }
500
- /**
501
- * Serializes a message to binary format using provided binary reader
502
- * @param _instance message instance
503
- * @param _writer binary writer instance
504
- */
505
- static serializeBinaryToWriter(_instance, _writer) {
506
- if (_instance.parent) {
507
- _writer.writeString(1, _instance.parent);
508
- }
509
- if (_instance.languageCode) {
510
- _writer.writeString(2, _instance.languageCode);
511
- }
512
- if (_instance.specialCharacters) {
513
- _writer.writeString(3, _instance.specialCharacters);
514
- }
515
- if (_instance.substringWhiteList && _instance.substringWhiteList.length) {
516
- _writer.writeRepeatedString(4, _instance.substringWhiteList);
517
- }
518
- if (_instance.dryRun) {
519
- _writer.writeBool(5, _instance.dryRun);
520
- }
521
- if (_instance.trainingPhraseCleanerOptions) {
522
- _writer.writeMessage(6, _instance.trainingPhraseCleanerOptions, TrainingPhraseCleanerOptions.serializeBinaryToWriter);
523
- }
524
- if (_instance.reannotateEntitiesOptions) {
525
- _writer.writeEnum(7, _instance.reannotateEntitiesOptions);
526
- }
527
- if (_instance.numberOfWorkers) {
528
- _writer.writeInt32(8, _instance.numberOfWorkers);
529
- }
530
- }
531
- /**
532
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
533
- * @param _value initial values object or instance of CleanAllIntentsRequest to deeply clone from
534
- */
535
- constructor(_value) {
536
- _value = _value || {};
537
- this.parent = _value.parent;
538
- this.languageCode = _value.languageCode;
539
- this.specialCharacters = _value.specialCharacters;
540
- this.substringWhiteList = (_value.substringWhiteList || []).slice();
541
- this.dryRun = _value.dryRun;
542
- this.trainingPhraseCleanerOptions = _value.trainingPhraseCleanerOptions
543
- ? new TrainingPhraseCleanerOptions(_value.trainingPhraseCleanerOptions)
544
- : undefined;
545
- this.reannotateEntitiesOptions = _value.reannotateEntitiesOptions;
546
- this.numberOfWorkers = _value.numberOfWorkers;
547
- CleanAllIntentsRequest.refineValues(this);
548
- }
549
- get parent() {
550
- return this._parent;
551
- }
552
- set parent(value) {
553
- this._parent = value;
554
- }
555
- get languageCode() {
556
- return this._languageCode;
557
- }
558
- set languageCode(value) {
559
- this._languageCode = value;
560
- }
561
- get specialCharacters() {
562
- return this._specialCharacters;
563
- }
564
- set specialCharacters(value) {
565
- this._specialCharacters = value;
566
- }
567
- get substringWhiteList() {
568
- return this._substringWhiteList;
569
- }
570
- set substringWhiteList(value) {
571
- this._substringWhiteList = value;
572
- }
573
- get dryRun() {
574
- return this._dryRun;
575
- }
576
- set dryRun(value) {
577
- this._dryRun = value;
578
- }
579
- get trainingPhraseCleanerOptions() {
580
- return this._trainingPhraseCleanerOptions;
581
- }
582
- set trainingPhraseCleanerOptions(value) {
583
- this._trainingPhraseCleanerOptions = value;
584
- }
585
- get reannotateEntitiesOptions() {
586
- return this._reannotateEntitiesOptions;
587
- }
588
- set reannotateEntitiesOptions(value) {
589
- this._reannotateEntitiesOptions = value;
590
- }
591
- get numberOfWorkers() {
592
- return this._numberOfWorkers;
593
- }
594
- set numberOfWorkers(value) {
595
- this._numberOfWorkers = value;
596
- }
597
- /**
598
- * Serialize message to binary data
599
- * @param instance message instance
600
- */
601
- serializeBinary() {
602
- const writer = new BinaryWriter();
603
- CleanAllIntentsRequest.serializeBinaryToWriter(this, writer);
604
- return writer.getResultBuffer();
605
- }
606
- /**
607
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
608
- */
609
- toObject() {
610
- return {
611
- parent: this.parent,
612
- languageCode: this.languageCode,
613
- specialCharacters: this.specialCharacters,
614
- substringWhiteList: (this.substringWhiteList || []).slice(),
615
- dryRun: this.dryRun,
616
- trainingPhraseCleanerOptions: this.trainingPhraseCleanerOptions
617
- ? this.trainingPhraseCleanerOptions.toObject()
618
- : undefined,
619
- reannotateEntitiesOptions: this.reannotateEntitiesOptions,
620
- numberOfWorkers: this.numberOfWorkers
621
- };
622
- }
623
- /**
624
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
625
- */
626
- toJSON() {
627
- return this.toObject();
628
- }
629
- /**
630
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
631
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
632
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
633
- */
634
- toProtobufJSON(
635
- // @ts-ignore
636
- options) {
637
- return {
638
- parent: this.parent,
639
- languageCode: this.languageCode,
640
- specialCharacters: this.specialCharacters,
641
- substringWhiteList: (this.substringWhiteList || []).slice(),
642
- dryRun: this.dryRun,
643
- trainingPhraseCleanerOptions: this.trainingPhraseCleanerOptions
644
- ? this.trainingPhraseCleanerOptions.toProtobufJSON(options)
645
- : null,
646
- reannotateEntitiesOptions: ReannotateEntitiesOptions[this.reannotateEntitiesOptions === null ||
647
- this.reannotateEntitiesOptions === undefined
648
- ? 0
649
- : this.reannotateEntitiesOptions],
650
- numberOfWorkers: this.numberOfWorkers
651
- };
652
- }
653
- }
654
- /**
655
- * Message implementation for ondewo.nlu.CleanAllIntentsResponse
656
- */
657
- export class CleanAllIntentsResponse {
658
- static { this.id = 'ondewo.nlu.CleanAllIntentsResponse'; }
659
- /**
660
- * Deserialize binary data to message
661
- * @param instance message instance
662
- */
663
- static deserializeBinary(bytes) {
664
- const instance = new CleanAllIntentsResponse();
665
- CleanAllIntentsResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
666
- return instance;
667
- }
668
- /**
669
- * Check all the properties and set default protobuf values if necessary
670
- * @param _instance message instance
671
- */
672
- static refineValues(_instance) {
673
- _instance.cleanedIntents = _instance.cleanedIntents || [];
674
- _instance.intentUpdateList = _instance.intentUpdateList || [];
675
- }
676
- /**
677
- * Deserializes / reads binary message into message instance using provided binary reader
678
- * @param _instance message instance
679
- * @param _reader binary reader instance
680
- */
681
- static deserializeBinaryFromReader(_instance, _reader) {
682
- while (_reader.nextField()) {
683
- if (_reader.isEndGroup())
684
- break;
685
- switch (_reader.getFieldNumber()) {
686
- case 1:
687
- const messageInitializer1 = new ondewoNlu008.Intent();
688
- _reader.readMessage(messageInitializer1, ondewoNlu008.Intent.deserializeBinaryFromReader);
689
- (_instance.cleanedIntents = _instance.cleanedIntents || []).push(messageInitializer1);
690
- break;
691
- case 2:
692
- const messageInitializer2 = new IntentUpdate();
693
- _reader.readMessage(messageInitializer2, IntentUpdate.deserializeBinaryFromReader);
694
- (_instance.intentUpdateList = _instance.intentUpdateList || []).push(messageInitializer2);
695
- break;
696
- default:
697
- _reader.skipField();
698
- }
699
- }
700
- CleanAllIntentsResponse.refineValues(_instance);
701
- }
702
- /**
703
- * Serializes a message to binary format using provided binary reader
704
- * @param _instance message instance
705
- * @param _writer binary writer instance
706
- */
707
- static serializeBinaryToWriter(_instance, _writer) {
708
- if (_instance.cleanedIntents && _instance.cleanedIntents.length) {
709
- _writer.writeRepeatedMessage(1, _instance.cleanedIntents, ondewoNlu008.Intent.serializeBinaryToWriter);
710
- }
711
- if (_instance.intentUpdateList && _instance.intentUpdateList.length) {
712
- _writer.writeRepeatedMessage(2, _instance.intentUpdateList, IntentUpdate.serializeBinaryToWriter);
713
- }
714
- }
715
- /**
716
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
717
- * @param _value initial values object or instance of CleanAllIntentsResponse to deeply clone from
718
- */
719
- constructor(_value) {
720
- _value = _value || {};
721
- this.cleanedIntents = (_value.cleanedIntents || []).map(m => new ondewoNlu008.Intent(m));
722
- this.intentUpdateList = (_value.intentUpdateList || []).map(m => new IntentUpdate(m));
723
- CleanAllIntentsResponse.refineValues(this);
724
- }
725
- get cleanedIntents() {
726
- return this._cleanedIntents;
727
- }
728
- set cleanedIntents(value) {
729
- this._cleanedIntents = value;
730
- }
731
- get intentUpdateList() {
732
- return this._intentUpdateList;
733
- }
734
- set intentUpdateList(value) {
735
- this._intentUpdateList = value;
736
- }
737
- /**
738
- * Serialize message to binary data
739
- * @param instance message instance
740
- */
741
- serializeBinary() {
742
- const writer = new BinaryWriter();
743
- CleanAllIntentsResponse.serializeBinaryToWriter(this, writer);
744
- return writer.getResultBuffer();
745
- }
746
- /**
747
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
748
- */
749
- toObject() {
750
- return {
751
- cleanedIntents: (this.cleanedIntents || []).map(m => m.toObject()),
752
- intentUpdateList: (this.intentUpdateList || []).map(m => m.toObject())
753
- };
754
- }
755
- /**
756
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
757
- */
758
- toJSON() {
759
- return this.toObject();
760
- }
761
- /**
762
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
763
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
764
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
765
- */
766
- toProtobufJSON(
767
- // @ts-ignore
768
- options) {
769
- return {
770
- cleanedIntents: (this.cleanedIntents || []).map(m => m.toProtobufJSON(options)),
771
- intentUpdateList: (this.intentUpdateList || []).map(m => m.toProtobufJSON(options))
772
- };
773
- }
774
- }
775
- /**
776
- * Message implementation for ondewo.nlu.CleanIntentRequest
777
- */
778
- export class CleanIntentRequest {
779
- static { this.id = 'ondewo.nlu.CleanIntentRequest'; }
780
- /**
781
- * Deserialize binary data to message
782
- * @param instance message instance
783
- */
784
- static deserializeBinary(bytes) {
785
- const instance = new CleanIntentRequest();
786
- CleanIntentRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
787
- return instance;
788
- }
789
- /**
790
- * Check all the properties and set default protobuf values if necessary
791
- * @param _instance message instance
792
- */
793
- static refineValues(_instance) {
794
- _instance.parent = _instance.parent || '';
795
- _instance.intentName = _instance.intentName || '';
796
- _instance.languageCode = _instance.languageCode || '';
797
- _instance.specialCharacters = _instance.specialCharacters || '';
798
- _instance.substringWhiteList = _instance.substringWhiteList || [];
799
- _instance.dryRun = _instance.dryRun || false;
800
- _instance.trainingPhraseCleanerOptions =
801
- _instance.trainingPhraseCleanerOptions || undefined;
802
- _instance.reannotateEntitiesOptions =
803
- _instance.reannotateEntitiesOptions || 0;
804
- }
805
- /**
806
- * Deserializes / reads binary message into message instance using provided binary reader
807
- * @param _instance message instance
808
- * @param _reader binary reader instance
809
- */
810
- static deserializeBinaryFromReader(_instance, _reader) {
811
- while (_reader.nextField()) {
812
- if (_reader.isEndGroup())
813
- break;
814
- switch (_reader.getFieldNumber()) {
815
- case 1:
816
- _instance.parent = _reader.readString();
817
- break;
818
- case 2:
819
- _instance.intentName = _reader.readString();
820
- break;
821
- case 3:
822
- _instance.languageCode = _reader.readString();
823
- break;
824
- case 4:
825
- _instance.specialCharacters = _reader.readString();
826
- break;
827
- case 5:
828
- (_instance.substringWhiteList =
829
- _instance.substringWhiteList || []).push(_reader.readString());
830
- break;
831
- case 6:
832
- _instance.dryRun = _reader.readBool();
833
- break;
834
- case 7:
835
- _instance.trainingPhraseCleanerOptions = new TrainingPhraseCleanerOptions();
836
- _reader.readMessage(_instance.trainingPhraseCleanerOptions, TrainingPhraseCleanerOptions.deserializeBinaryFromReader);
837
- break;
838
- case 8:
839
- _instance.reannotateEntitiesOptions = _reader.readEnum();
840
- break;
841
- default:
842
- _reader.skipField();
843
- }
844
- }
845
- CleanIntentRequest.refineValues(_instance);
846
- }
847
- /**
848
- * Serializes a message to binary format using provided binary reader
849
- * @param _instance message instance
850
- * @param _writer binary writer instance
851
- */
852
- static serializeBinaryToWriter(_instance, _writer) {
853
- if (_instance.parent) {
854
- _writer.writeString(1, _instance.parent);
855
- }
856
- if (_instance.intentName) {
857
- _writer.writeString(2, _instance.intentName);
858
- }
859
- if (_instance.languageCode) {
860
- _writer.writeString(3, _instance.languageCode);
861
- }
862
- if (_instance.specialCharacters) {
863
- _writer.writeString(4, _instance.specialCharacters);
864
- }
865
- if (_instance.substringWhiteList && _instance.substringWhiteList.length) {
866
- _writer.writeRepeatedString(5, _instance.substringWhiteList);
867
- }
868
- if (_instance.dryRun) {
869
- _writer.writeBool(6, _instance.dryRun);
870
- }
871
- if (_instance.trainingPhraseCleanerOptions) {
872
- _writer.writeMessage(7, _instance.trainingPhraseCleanerOptions, TrainingPhraseCleanerOptions.serializeBinaryToWriter);
873
- }
874
- if (_instance.reannotateEntitiesOptions) {
875
- _writer.writeEnum(8, _instance.reannotateEntitiesOptions);
876
- }
877
- }
878
- /**
879
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
880
- * @param _value initial values object or instance of CleanIntentRequest to deeply clone from
881
- */
882
- constructor(_value) {
883
- _value = _value || {};
884
- this.parent = _value.parent;
885
- this.intentName = _value.intentName;
886
- this.languageCode = _value.languageCode;
887
- this.specialCharacters = _value.specialCharacters;
888
- this.substringWhiteList = (_value.substringWhiteList || []).slice();
889
- this.dryRun = _value.dryRun;
890
- this.trainingPhraseCleanerOptions = _value.trainingPhraseCleanerOptions
891
- ? new TrainingPhraseCleanerOptions(_value.trainingPhraseCleanerOptions)
892
- : undefined;
893
- this.reannotateEntitiesOptions = _value.reannotateEntitiesOptions;
894
- CleanIntentRequest.refineValues(this);
895
- }
896
- get parent() {
897
- return this._parent;
898
- }
899
- set parent(value) {
900
- this._parent = value;
901
- }
902
- get intentName() {
903
- return this._intentName;
904
- }
905
- set intentName(value) {
906
- this._intentName = value;
907
- }
908
- get languageCode() {
909
- return this._languageCode;
910
- }
911
- set languageCode(value) {
912
- this._languageCode = value;
913
- }
914
- get specialCharacters() {
915
- return this._specialCharacters;
916
- }
917
- set specialCharacters(value) {
918
- this._specialCharacters = value;
919
- }
920
- get substringWhiteList() {
921
- return this._substringWhiteList;
922
- }
923
- set substringWhiteList(value) {
924
- this._substringWhiteList = value;
925
- }
926
- get dryRun() {
927
- return this._dryRun;
928
- }
929
- set dryRun(value) {
930
- this._dryRun = value;
931
- }
932
- get trainingPhraseCleanerOptions() {
933
- return this._trainingPhraseCleanerOptions;
934
- }
935
- set trainingPhraseCleanerOptions(value) {
936
- this._trainingPhraseCleanerOptions = value;
937
- }
938
- get reannotateEntitiesOptions() {
939
- return this._reannotateEntitiesOptions;
940
- }
941
- set reannotateEntitiesOptions(value) {
942
- this._reannotateEntitiesOptions = value;
943
- }
944
- /**
945
- * Serialize message to binary data
946
- * @param instance message instance
947
- */
948
- serializeBinary() {
949
- const writer = new BinaryWriter();
950
- CleanIntentRequest.serializeBinaryToWriter(this, writer);
951
- return writer.getResultBuffer();
952
- }
953
- /**
954
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
955
- */
956
- toObject() {
957
- return {
958
- parent: this.parent,
959
- intentName: this.intentName,
960
- languageCode: this.languageCode,
961
- specialCharacters: this.specialCharacters,
962
- substringWhiteList: (this.substringWhiteList || []).slice(),
963
- dryRun: this.dryRun,
964
- trainingPhraseCleanerOptions: this.trainingPhraseCleanerOptions
965
- ? this.trainingPhraseCleanerOptions.toObject()
966
- : undefined,
967
- reannotateEntitiesOptions: this.reannotateEntitiesOptions
968
- };
969
- }
970
- /**
971
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
972
- */
973
- toJSON() {
974
- return this.toObject();
975
- }
976
- /**
977
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
978
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
979
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
980
- */
981
- toProtobufJSON(
982
- // @ts-ignore
983
- options) {
984
- return {
985
- parent: this.parent,
986
- intentName: this.intentName,
987
- languageCode: this.languageCode,
988
- specialCharacters: this.specialCharacters,
989
- substringWhiteList: (this.substringWhiteList || []).slice(),
990
- dryRun: this.dryRun,
991
- trainingPhraseCleanerOptions: this.trainingPhraseCleanerOptions
992
- ? this.trainingPhraseCleanerOptions.toProtobufJSON(options)
993
- : null,
994
- reannotateEntitiesOptions: ReannotateEntitiesOptions[this.reannotateEntitiesOptions === null ||
995
- this.reannotateEntitiesOptions === undefined
996
- ? 0
997
- : this.reannotateEntitiesOptions]
998
- };
999
- }
1000
- }
1001
- /**
1002
- * Message implementation for ondewo.nlu.CleanIntentResponse
1003
- */
1004
- export class CleanIntentResponse {
1005
- static { this.id = 'ondewo.nlu.CleanIntentResponse'; }
1006
- /**
1007
- * Deserialize binary data to message
1008
- * @param instance message instance
1009
- */
1010
- static deserializeBinary(bytes) {
1011
- const instance = new CleanIntentResponse();
1012
- CleanIntentResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1013
- return instance;
1014
- }
1015
- /**
1016
- * Check all the properties and set default protobuf values if necessary
1017
- * @param _instance message instance
1018
- */
1019
- static refineValues(_instance) {
1020
- _instance.cleanedIntent = _instance.cleanedIntent || undefined;
1021
- _instance.intentUpdate = _instance.intentUpdate || undefined;
1022
- }
1023
- /**
1024
- * Deserializes / reads binary message into message instance using provided binary reader
1025
- * @param _instance message instance
1026
- * @param _reader binary reader instance
1027
- */
1028
- static deserializeBinaryFromReader(_instance, _reader) {
1029
- while (_reader.nextField()) {
1030
- if (_reader.isEndGroup())
1031
- break;
1032
- switch (_reader.getFieldNumber()) {
1033
- case 1:
1034
- _instance.cleanedIntent = new ondewoNlu008.Intent();
1035
- _reader.readMessage(_instance.cleanedIntent, ondewoNlu008.Intent.deserializeBinaryFromReader);
1036
- break;
1037
- case 2:
1038
- _instance.intentUpdate = new IntentUpdate();
1039
- _reader.readMessage(_instance.intentUpdate, IntentUpdate.deserializeBinaryFromReader);
1040
- break;
1041
- default:
1042
- _reader.skipField();
1043
- }
1044
- }
1045
- CleanIntentResponse.refineValues(_instance);
1046
- }
1047
- /**
1048
- * Serializes a message to binary format using provided binary reader
1049
- * @param _instance message instance
1050
- * @param _writer binary writer instance
1051
- */
1052
- static serializeBinaryToWriter(_instance, _writer) {
1053
- if (_instance.cleanedIntent) {
1054
- _writer.writeMessage(1, _instance.cleanedIntent, ondewoNlu008.Intent.serializeBinaryToWriter);
1055
- }
1056
- if (_instance.intentUpdate) {
1057
- _writer.writeMessage(2, _instance.intentUpdate, IntentUpdate.serializeBinaryToWriter);
1058
- }
1059
- }
1060
- /**
1061
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1062
- * @param _value initial values object or instance of CleanIntentResponse to deeply clone from
1063
- */
1064
- constructor(_value) {
1065
- _value = _value || {};
1066
- this.cleanedIntent = _value.cleanedIntent
1067
- ? new ondewoNlu008.Intent(_value.cleanedIntent)
1068
- : undefined;
1069
- this.intentUpdate = _value.intentUpdate
1070
- ? new IntentUpdate(_value.intentUpdate)
1071
- : undefined;
1072
- CleanIntentResponse.refineValues(this);
1073
- }
1074
- get cleanedIntent() {
1075
- return this._cleanedIntent;
1076
- }
1077
- set cleanedIntent(value) {
1078
- this._cleanedIntent = value;
1079
- }
1080
- get intentUpdate() {
1081
- return this._intentUpdate;
1082
- }
1083
- set intentUpdate(value) {
1084
- this._intentUpdate = value;
1085
- }
1086
- /**
1087
- * Serialize message to binary data
1088
- * @param instance message instance
1089
- */
1090
- serializeBinary() {
1091
- const writer = new BinaryWriter();
1092
- CleanIntentResponse.serializeBinaryToWriter(this, writer);
1093
- return writer.getResultBuffer();
1094
- }
1095
- /**
1096
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1097
- */
1098
- toObject() {
1099
- return {
1100
- cleanedIntent: this.cleanedIntent
1101
- ? this.cleanedIntent.toObject()
1102
- : undefined,
1103
- intentUpdate: this.intentUpdate ? this.intentUpdate.toObject() : undefined
1104
- };
1105
- }
1106
- /**
1107
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1108
- */
1109
- toJSON() {
1110
- return this.toObject();
1111
- }
1112
- /**
1113
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1114
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1115
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1116
- */
1117
- toProtobufJSON(
1118
- // @ts-ignore
1119
- options) {
1120
- return {
1121
- cleanedIntent: this.cleanedIntent
1122
- ? this.cleanedIntent.toProtobufJSON(options)
1123
- : null,
1124
- intentUpdate: this.intentUpdate
1125
- ? this.intentUpdate.toProtobufJSON(options)
1126
- : null
1127
- };
1128
- }
1129
- }
1130
- /**
1131
- * Message implementation for ondewo.nlu.TrainingPhraseCleanerOptions
1132
- */
1133
- export class TrainingPhraseCleanerOptions {
1134
- static { this.id = 'ondewo.nlu.TrainingPhraseCleanerOptions'; }
1135
- /**
1136
- * Deserialize binary data to message
1137
- * @param instance message instance
1138
- */
1139
- static deserializeBinary(bytes) {
1140
- const instance = new TrainingPhraseCleanerOptions();
1141
- TrainingPhraseCleanerOptions.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1142
- return instance;
1143
- }
1144
- /**
1145
- * Check all the properties and set default protobuf values if necessary
1146
- * @param _instance message instance
1147
- */
1148
- static refineValues(_instance) {
1149
- _instance.deleteRepeatedWhitespaces =
1150
- _instance.deleteRepeatedWhitespaces || false;
1151
- _instance.deleteLeadingSpecialCharacters =
1152
- _instance.deleteLeadingSpecialCharacters || false;
1153
- _instance.deleteTrailingSpecialCharacters =
1154
- _instance.deleteTrailingSpecialCharacters || false;
1155
- }
1156
- /**
1157
- * Deserializes / reads binary message into message instance using provided binary reader
1158
- * @param _instance message instance
1159
- * @param _reader binary reader instance
1160
- */
1161
- static deserializeBinaryFromReader(_instance, _reader) {
1162
- while (_reader.nextField()) {
1163
- if (_reader.isEndGroup())
1164
- break;
1165
- switch (_reader.getFieldNumber()) {
1166
- case 1:
1167
- _instance.deleteRepeatedWhitespaces = _reader.readBool();
1168
- break;
1169
- case 2:
1170
- _instance.deleteLeadingSpecialCharacters = _reader.readBool();
1171
- break;
1172
- case 3:
1173
- _instance.deleteTrailingSpecialCharacters = _reader.readBool();
1174
- break;
1175
- default:
1176
- _reader.skipField();
1177
- }
1178
- }
1179
- TrainingPhraseCleanerOptions.refineValues(_instance);
1180
- }
1181
- /**
1182
- * Serializes a message to binary format using provided binary reader
1183
- * @param _instance message instance
1184
- * @param _writer binary writer instance
1185
- */
1186
- static serializeBinaryToWriter(_instance, _writer) {
1187
- if (_instance.deleteRepeatedWhitespaces) {
1188
- _writer.writeBool(1, _instance.deleteRepeatedWhitespaces);
1189
- }
1190
- if (_instance.deleteLeadingSpecialCharacters) {
1191
- _writer.writeBool(2, _instance.deleteLeadingSpecialCharacters);
1192
- }
1193
- if (_instance.deleteTrailingSpecialCharacters) {
1194
- _writer.writeBool(3, _instance.deleteTrailingSpecialCharacters);
1195
- }
1196
- }
1197
- /**
1198
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1199
- * @param _value initial values object or instance of TrainingPhraseCleanerOptions to deeply clone from
1200
- */
1201
- constructor(_value) {
1202
- _value = _value || {};
1203
- this.deleteRepeatedWhitespaces = _value.deleteRepeatedWhitespaces;
1204
- this.deleteLeadingSpecialCharacters = _value.deleteLeadingSpecialCharacters;
1205
- this.deleteTrailingSpecialCharacters =
1206
- _value.deleteTrailingSpecialCharacters;
1207
- TrainingPhraseCleanerOptions.refineValues(this);
1208
- }
1209
- get deleteRepeatedWhitespaces() {
1210
- return this._deleteRepeatedWhitespaces;
1211
- }
1212
- set deleteRepeatedWhitespaces(value) {
1213
- this._deleteRepeatedWhitespaces = value;
1214
- }
1215
- get deleteLeadingSpecialCharacters() {
1216
- return this._deleteLeadingSpecialCharacters;
1217
- }
1218
- set deleteLeadingSpecialCharacters(value) {
1219
- this._deleteLeadingSpecialCharacters = value;
1220
- }
1221
- get deleteTrailingSpecialCharacters() {
1222
- return this._deleteTrailingSpecialCharacters;
1223
- }
1224
- set deleteTrailingSpecialCharacters(value) {
1225
- this._deleteTrailingSpecialCharacters = value;
1226
- }
1227
- /**
1228
- * Serialize message to binary data
1229
- * @param instance message instance
1230
- */
1231
- serializeBinary() {
1232
- const writer = new BinaryWriter();
1233
- TrainingPhraseCleanerOptions.serializeBinaryToWriter(this, writer);
1234
- return writer.getResultBuffer();
1235
- }
1236
- /**
1237
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1238
- */
1239
- toObject() {
1240
- return {
1241
- deleteRepeatedWhitespaces: this.deleteRepeatedWhitespaces,
1242
- deleteLeadingSpecialCharacters: this.deleteLeadingSpecialCharacters,
1243
- deleteTrailingSpecialCharacters: this.deleteTrailingSpecialCharacters
1244
- };
1245
- }
1246
- /**
1247
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1248
- */
1249
- toJSON() {
1250
- return this.toObject();
1251
- }
1252
- /**
1253
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1254
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1255
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1256
- */
1257
- toProtobufJSON(
1258
- // @ts-ignore
1259
- options) {
1260
- return {
1261
- deleteRepeatedWhitespaces: this.deleteRepeatedWhitespaces,
1262
- deleteLeadingSpecialCharacters: this.deleteLeadingSpecialCharacters,
1263
- deleteTrailingSpecialCharacters: this.deleteTrailingSpecialCharacters
1264
- };
1265
- }
1266
- }
1267
- /**
1268
- * Message implementation for ondewo.nlu.StringUpdate
1269
- */
1270
- export class StringUpdate {
1271
- static { this.id = 'ondewo.nlu.StringUpdate'; }
1272
- /**
1273
- * Deserialize binary data to message
1274
- * @param instance message instance
1275
- */
1276
- static deserializeBinary(bytes) {
1277
- const instance = new StringUpdate();
1278
- StringUpdate.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1279
- return instance;
1280
- }
1281
- /**
1282
- * Check all the properties and set default protobuf values if necessary
1283
- * @param _instance message instance
1284
- */
1285
- static refineValues(_instance) {
1286
- _instance.new = _instance.new || '';
1287
- _instance.old = _instance.old || '';
1288
- }
1289
- /**
1290
- * Deserializes / reads binary message into message instance using provided binary reader
1291
- * @param _instance message instance
1292
- * @param _reader binary reader instance
1293
- */
1294
- static deserializeBinaryFromReader(_instance, _reader) {
1295
- while (_reader.nextField()) {
1296
- if (_reader.isEndGroup())
1297
- break;
1298
- switch (_reader.getFieldNumber()) {
1299
- case 1:
1300
- _instance.new = _reader.readString();
1301
- break;
1302
- case 2:
1303
- _instance.old = _reader.readString();
1304
- break;
1305
- default:
1306
- _reader.skipField();
1307
- }
1308
- }
1309
- StringUpdate.refineValues(_instance);
1310
- }
1311
- /**
1312
- * Serializes a message to binary format using provided binary reader
1313
- * @param _instance message instance
1314
- * @param _writer binary writer instance
1315
- */
1316
- static serializeBinaryToWriter(_instance, _writer) {
1317
- if (_instance.new) {
1318
- _writer.writeString(1, _instance.new);
1319
- }
1320
- if (_instance.old) {
1321
- _writer.writeString(2, _instance.old);
1322
- }
1323
- }
1324
- /**
1325
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1326
- * @param _value initial values object or instance of StringUpdate to deeply clone from
1327
- */
1328
- constructor(_value) {
1329
- _value = _value || {};
1330
- this.new = _value.new;
1331
- this.old = _value.old;
1332
- StringUpdate.refineValues(this);
1333
- }
1334
- get new() {
1335
- return this._new;
1336
- }
1337
- set new(value) {
1338
- this._new = value;
1339
- }
1340
- get old() {
1341
- return this._old;
1342
- }
1343
- set old(value) {
1344
- this._old = value;
1345
- }
1346
- /**
1347
- * Serialize message to binary data
1348
- * @param instance message instance
1349
- */
1350
- serializeBinary() {
1351
- const writer = new BinaryWriter();
1352
- StringUpdate.serializeBinaryToWriter(this, writer);
1353
- return writer.getResultBuffer();
1354
- }
1355
- /**
1356
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1357
- */
1358
- toObject() {
1359
- return {
1360
- new: this.new,
1361
- old: this.old
1362
- };
1363
- }
1364
- /**
1365
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1366
- */
1367
- toJSON() {
1368
- return this.toObject();
1369
- }
1370
- /**
1371
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1372
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1373
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1374
- */
1375
- toProtobufJSON(
1376
- // @ts-ignore
1377
- options) {
1378
- return {
1379
- new: this.new,
1380
- old: this.old
1381
- };
1382
- }
1383
- }
1384
- /**
1385
- * Message implementation for ondewo.nlu.IntentUpdate
1386
- */
1387
- export class IntentUpdate {
1388
- static { this.id = 'ondewo.nlu.IntentUpdate'; }
1389
- /**
1390
- * Deserialize binary data to message
1391
- * @param instance message instance
1392
- */
1393
- static deserializeBinary(bytes) {
1394
- const instance = new IntentUpdate();
1395
- IntentUpdate.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1396
- return instance;
1397
- }
1398
- /**
1399
- * Check all the properties and set default protobuf values if necessary
1400
- * @param _instance message instance
1401
- */
1402
- static refineValues(_instance) {
1403
- _instance.intentDisplayName = _instance.intentDisplayName || '';
1404
- _instance.trainingPhraseUpdateList =
1405
- _instance.trainingPhraseUpdateList || [];
1406
- _instance.deletedParameters = _instance.deletedParameters || [];
1407
- }
1408
- /**
1409
- * Deserializes / reads binary message into message instance using provided binary reader
1410
- * @param _instance message instance
1411
- * @param _reader binary reader instance
1412
- */
1413
- static deserializeBinaryFromReader(_instance, _reader) {
1414
- while (_reader.nextField()) {
1415
- if (_reader.isEndGroup())
1416
- break;
1417
- switch (_reader.getFieldNumber()) {
1418
- case 1:
1419
- _instance.intentDisplayName = _reader.readString();
1420
- break;
1421
- case 2:
1422
- const messageInitializer2 = new IntentUpdate.TrainingPhraseUpdate();
1423
- _reader.readMessage(messageInitializer2, IntentUpdate.TrainingPhraseUpdate.deserializeBinaryFromReader);
1424
- (_instance.trainingPhraseUpdateList =
1425
- _instance.trainingPhraseUpdateList || []).push(messageInitializer2);
1426
- break;
1427
- case 3:
1428
- (_instance.deletedParameters =
1429
- _instance.deletedParameters || []).push(_reader.readString());
1430
- break;
1431
- default:
1432
- _reader.skipField();
1433
- }
1434
- }
1435
- IntentUpdate.refineValues(_instance);
1436
- }
1437
- /**
1438
- * Serializes a message to binary format using provided binary reader
1439
- * @param _instance message instance
1440
- * @param _writer binary writer instance
1441
- */
1442
- static serializeBinaryToWriter(_instance, _writer) {
1443
- if (_instance.intentDisplayName) {
1444
- _writer.writeString(1, _instance.intentDisplayName);
1445
- }
1446
- if (_instance.trainingPhraseUpdateList &&
1447
- _instance.trainingPhraseUpdateList.length) {
1448
- _writer.writeRepeatedMessage(2, _instance.trainingPhraseUpdateList, IntentUpdate.TrainingPhraseUpdate.serializeBinaryToWriter);
1449
- }
1450
- if (_instance.deletedParameters && _instance.deletedParameters.length) {
1451
- _writer.writeRepeatedString(3, _instance.deletedParameters);
1452
- }
1453
- }
1454
- /**
1455
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1456
- * @param _value initial values object or instance of IntentUpdate to deeply clone from
1457
- */
1458
- constructor(_value) {
1459
- _value = _value || {};
1460
- this.intentDisplayName = _value.intentDisplayName;
1461
- this.trainingPhraseUpdateList = (_value.trainingPhraseUpdateList || []).map(m => new IntentUpdate.TrainingPhraseUpdate(m));
1462
- this.deletedParameters = (_value.deletedParameters || []).slice();
1463
- IntentUpdate.refineValues(this);
1464
- }
1465
- get intentDisplayName() {
1466
- return this._intentDisplayName;
1467
- }
1468
- set intentDisplayName(value) {
1469
- this._intentDisplayName = value;
1470
- }
1471
- get trainingPhraseUpdateList() {
1472
- return this._trainingPhraseUpdateList;
1473
- }
1474
- set trainingPhraseUpdateList(value) {
1475
- this._trainingPhraseUpdateList = value;
1476
- }
1477
- get deletedParameters() {
1478
- return this._deletedParameters;
1479
- }
1480
- set deletedParameters(value) {
1481
- this._deletedParameters = value;
1482
- }
1483
- /**
1484
- * Serialize message to binary data
1485
- * @param instance message instance
1486
- */
1487
- serializeBinary() {
1488
- const writer = new BinaryWriter();
1489
- IntentUpdate.serializeBinaryToWriter(this, writer);
1490
- return writer.getResultBuffer();
1491
- }
1492
- /**
1493
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1494
- */
1495
- toObject() {
1496
- return {
1497
- intentDisplayName: this.intentDisplayName,
1498
- trainingPhraseUpdateList: (this.trainingPhraseUpdateList || []).map(m => m.toObject()),
1499
- deletedParameters: (this.deletedParameters || []).slice()
1500
- };
1501
- }
1502
- /**
1503
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1504
- */
1505
- toJSON() {
1506
- return this.toObject();
1507
- }
1508
- /**
1509
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1510
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1511
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1512
- */
1513
- toProtobufJSON(
1514
- // @ts-ignore
1515
- options) {
1516
- return {
1517
- intentDisplayName: this.intentDisplayName,
1518
- trainingPhraseUpdateList: (this.trainingPhraseUpdateList || []).map(m => m.toProtobufJSON(options)),
1519
- deletedParameters: (this.deletedParameters || []).slice()
1520
- };
1521
- }
1522
- }
1523
- (function (IntentUpdate) {
1524
- /**
1525
- * Message implementation for ondewo.nlu.IntentUpdate.TrainingPhraseUpdate
1526
- */
1527
- class TrainingPhraseUpdate {
1528
- static { this.id = 'ondewo.nlu.IntentUpdate.TrainingPhraseUpdate'; }
1529
- /**
1530
- * Deserialize binary data to message
1531
- * @param instance message instance
1532
- */
1533
- static deserializeBinary(bytes) {
1534
- const instance = new TrainingPhraseUpdate();
1535
- TrainingPhraseUpdate.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1536
- return instance;
1537
- }
1538
- /**
1539
- * Check all the properties and set default protobuf values if necessary
1540
- * @param _instance message instance
1541
- */
1542
- static refineValues(_instance) {
1543
- _instance.trainingPhraseUpdate =
1544
- _instance.trainingPhraseUpdate || undefined;
1545
- _instance.entityUpdates = _instance.entityUpdates || [];
1546
- _instance.entitiesReannotated = _instance.entitiesReannotated || [];
1547
- _instance.containsUpdateVariable =
1548
- _instance.containsUpdateVariable || false;
1549
- }
1550
- /**
1551
- * Deserializes / reads binary message into message instance using provided binary reader
1552
- * @param _instance message instance
1553
- * @param _reader binary reader instance
1554
- */
1555
- static deserializeBinaryFromReader(_instance, _reader) {
1556
- while (_reader.nextField()) {
1557
- if (_reader.isEndGroup())
1558
- break;
1559
- switch (_reader.getFieldNumber()) {
1560
- case 1:
1561
- _instance.trainingPhraseUpdate = new StringUpdate();
1562
- _reader.readMessage(_instance.trainingPhraseUpdate, StringUpdate.deserializeBinaryFromReader);
1563
- break;
1564
- case 2:
1565
- const messageInitializer2 = new StringUpdate();
1566
- _reader.readMessage(messageInitializer2, StringUpdate.deserializeBinaryFromReader);
1567
- (_instance.entityUpdates = _instance.entityUpdates || []).push(messageInitializer2);
1568
- break;
1569
- case 3:
1570
- (_instance.entitiesReannotated =
1571
- _instance.entitiesReannotated || []).push(_reader.readString());
1572
- break;
1573
- case 4:
1574
- _instance.containsUpdateVariable = _reader.readBool();
1575
- break;
1576
- default:
1577
- _reader.skipField();
1578
- }
1579
- }
1580
- TrainingPhraseUpdate.refineValues(_instance);
1581
- }
1582
- /**
1583
- * Serializes a message to binary format using provided binary reader
1584
- * @param _instance message instance
1585
- * @param _writer binary writer instance
1586
- */
1587
- static serializeBinaryToWriter(_instance, _writer) {
1588
- if (_instance.trainingPhraseUpdate) {
1589
- _writer.writeMessage(1, _instance.trainingPhraseUpdate, StringUpdate.serializeBinaryToWriter);
1590
- }
1591
- if (_instance.entityUpdates && _instance.entityUpdates.length) {
1592
- _writer.writeRepeatedMessage(2, _instance.entityUpdates, StringUpdate.serializeBinaryToWriter);
1593
- }
1594
- if (_instance.entitiesReannotated &&
1595
- _instance.entitiesReannotated.length) {
1596
- _writer.writeRepeatedString(3, _instance.entitiesReannotated);
1597
- }
1598
- if (_instance.containsUpdateVariable) {
1599
- _writer.writeBool(4, _instance.containsUpdateVariable);
1600
- }
1601
- }
1602
- /**
1603
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1604
- * @param _value initial values object or instance of TrainingPhraseUpdate to deeply clone from
1605
- */
1606
- constructor(_value) {
1607
- _value = _value || {};
1608
- this.trainingPhraseUpdate = _value.trainingPhraseUpdate
1609
- ? new StringUpdate(_value.trainingPhraseUpdate)
1610
- : undefined;
1611
- this.entityUpdates = (_value.entityUpdates || []).map(m => new StringUpdate(m));
1612
- this.entitiesReannotated = (_value.entitiesReannotated || []).slice();
1613
- this.containsUpdateVariable = _value.containsUpdateVariable;
1614
- TrainingPhraseUpdate.refineValues(this);
1615
- }
1616
- get trainingPhraseUpdate() {
1617
- return this._trainingPhraseUpdate;
1618
- }
1619
- set trainingPhraseUpdate(value) {
1620
- this._trainingPhraseUpdate = value;
1621
- }
1622
- get entityUpdates() {
1623
- return this._entityUpdates;
1624
- }
1625
- set entityUpdates(value) {
1626
- this._entityUpdates = value;
1627
- }
1628
- get entitiesReannotated() {
1629
- return this._entitiesReannotated;
1630
- }
1631
- set entitiesReannotated(value) {
1632
- this._entitiesReannotated = value;
1633
- }
1634
- get containsUpdateVariable() {
1635
- return this._containsUpdateVariable;
1636
- }
1637
- set containsUpdateVariable(value) {
1638
- this._containsUpdateVariable = value;
1639
- }
1640
- /**
1641
- * Serialize message to binary data
1642
- * @param instance message instance
1643
- */
1644
- serializeBinary() {
1645
- const writer = new BinaryWriter();
1646
- TrainingPhraseUpdate.serializeBinaryToWriter(this, writer);
1647
- return writer.getResultBuffer();
1648
- }
1649
- /**
1650
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1651
- */
1652
- toObject() {
1653
- return {
1654
- trainingPhraseUpdate: this.trainingPhraseUpdate
1655
- ? this.trainingPhraseUpdate.toObject()
1656
- : undefined,
1657
- entityUpdates: (this.entityUpdates || []).map(m => m.toObject()),
1658
- entitiesReannotated: (this.entitiesReannotated || []).slice(),
1659
- containsUpdateVariable: this.containsUpdateVariable
1660
- };
1661
- }
1662
- /**
1663
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1664
- */
1665
- toJSON() {
1666
- return this.toObject();
1667
- }
1668
- /**
1669
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1670
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1671
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1672
- */
1673
- toProtobufJSON(
1674
- // @ts-ignore
1675
- options) {
1676
- return {
1677
- trainingPhraseUpdate: this.trainingPhraseUpdate
1678
- ? this.trainingPhraseUpdate.toProtobufJSON(options)
1679
- : null,
1680
- entityUpdates: (this.entityUpdates || []).map(m => m.toProtobufJSON(options)),
1681
- entitiesReannotated: (this.entitiesReannotated || []).slice(),
1682
- containsUpdateVariable: this.containsUpdateVariable
1683
- };
1684
- }
1685
- }
1686
- IntentUpdate.TrainingPhraseUpdate = TrainingPhraseUpdate;
1687
- })(IntentUpdate || (IntentUpdate = {}));
1688
- /**
1689
- * Message implementation for ondewo.nlu.EntityTypeUpdate
1690
- */
1691
- export class EntityTypeUpdate {
1692
- static { this.id = 'ondewo.nlu.EntityTypeUpdate'; }
1693
- /**
1694
- * Deserialize binary data to message
1695
- * @param instance message instance
1696
- */
1697
- static deserializeBinary(bytes) {
1698
- const instance = new EntityTypeUpdate();
1699
- EntityTypeUpdate.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1700
- return instance;
1701
- }
1702
- /**
1703
- * Check all the properties and set default protobuf values if necessary
1704
- * @param _instance message instance
1705
- */
1706
- static refineValues(_instance) {
1707
- _instance.entityTypeName = _instance.entityTypeName || '';
1708
- _instance.valuesUpdateList = _instance.valuesUpdateList || [];
1709
- }
1710
- /**
1711
- * Deserializes / reads binary message into message instance using provided binary reader
1712
- * @param _instance message instance
1713
- * @param _reader binary reader instance
1714
- */
1715
- static deserializeBinaryFromReader(_instance, _reader) {
1716
- while (_reader.nextField()) {
1717
- if (_reader.isEndGroup())
1718
- break;
1719
- switch (_reader.getFieldNumber()) {
1720
- case 1:
1721
- _instance.entityTypeName = _reader.readString();
1722
- break;
1723
- case 2:
1724
- const messageInitializer2 = new EntityTypeUpdate.EntityUpdate();
1725
- _reader.readMessage(messageInitializer2, EntityTypeUpdate.EntityUpdate.deserializeBinaryFromReader);
1726
- (_instance.valuesUpdateList = _instance.valuesUpdateList || []).push(messageInitializer2);
1727
- break;
1728
- default:
1729
- _reader.skipField();
1730
- }
1731
- }
1732
- EntityTypeUpdate.refineValues(_instance);
1733
- }
1734
- /**
1735
- * Serializes a message to binary format using provided binary reader
1736
- * @param _instance message instance
1737
- * @param _writer binary writer instance
1738
- */
1739
- static serializeBinaryToWriter(_instance, _writer) {
1740
- if (_instance.entityTypeName) {
1741
- _writer.writeString(1, _instance.entityTypeName);
1742
- }
1743
- if (_instance.valuesUpdateList && _instance.valuesUpdateList.length) {
1744
- _writer.writeRepeatedMessage(2, _instance.valuesUpdateList, EntityTypeUpdate.EntityUpdate.serializeBinaryToWriter);
1745
- }
1746
- }
1747
- /**
1748
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1749
- * @param _value initial values object or instance of EntityTypeUpdate to deeply clone from
1750
- */
1751
- constructor(_value) {
1752
- _value = _value || {};
1753
- this.entityTypeName = _value.entityTypeName;
1754
- this.valuesUpdateList = (_value.valuesUpdateList || []).map(m => new EntityTypeUpdate.EntityUpdate(m));
1755
- EntityTypeUpdate.refineValues(this);
1756
- }
1757
- get entityTypeName() {
1758
- return this._entityTypeName;
1759
- }
1760
- set entityTypeName(value) {
1761
- this._entityTypeName = value;
1762
- }
1763
- get valuesUpdateList() {
1764
- return this._valuesUpdateList;
1765
- }
1766
- set valuesUpdateList(value) {
1767
- this._valuesUpdateList = value;
1768
- }
1769
- /**
1770
- * Serialize message to binary data
1771
- * @param instance message instance
1772
- */
1773
- serializeBinary() {
1774
- const writer = new BinaryWriter();
1775
- EntityTypeUpdate.serializeBinaryToWriter(this, writer);
1776
- return writer.getResultBuffer();
1777
- }
1778
- /**
1779
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1780
- */
1781
- toObject() {
1782
- return {
1783
- entityTypeName: this.entityTypeName,
1784
- valuesUpdateList: (this.valuesUpdateList || []).map(m => m.toObject())
1785
- };
1786
- }
1787
- /**
1788
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1789
- */
1790
- toJSON() {
1791
- return this.toObject();
1792
- }
1793
- /**
1794
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1795
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1796
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1797
- */
1798
- toProtobufJSON(
1799
- // @ts-ignore
1800
- options) {
1801
- return {
1802
- entityTypeName: this.entityTypeName,
1803
- valuesUpdateList: (this.valuesUpdateList || []).map(m => m.toProtobufJSON(options))
1804
- };
1805
- }
1806
- }
1807
- (function (EntityTypeUpdate) {
1808
- /**
1809
- * Message implementation for ondewo.nlu.EntityTypeUpdate.EntityUpdate
1810
- */
1811
- class EntityUpdate {
1812
- static { this.id = 'ondewo.nlu.EntityTypeUpdate.EntityUpdate'; }
1813
- /**
1814
- * Deserialize binary data to message
1815
- * @param instance message instance
1816
- */
1817
- static deserializeBinary(bytes) {
1818
- const instance = new EntityUpdate();
1819
- EntityUpdate.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1820
- return instance;
1821
- }
1822
- /**
1823
- * Check all the properties and set default protobuf values if necessary
1824
- * @param _instance message instance
1825
- */
1826
- static refineValues(_instance) {
1827
- _instance.entityValueUpdate = _instance.entityValueUpdate || undefined;
1828
- _instance.entitySynonymUpdates = _instance.entitySynonymUpdates || [];
1829
- }
1830
- /**
1831
- * Deserializes / reads binary message into message instance using provided binary reader
1832
- * @param _instance message instance
1833
- * @param _reader binary reader instance
1834
- */
1835
- static deserializeBinaryFromReader(_instance, _reader) {
1836
- while (_reader.nextField()) {
1837
- if (_reader.isEndGroup())
1838
- break;
1839
- switch (_reader.getFieldNumber()) {
1840
- case 1:
1841
- _instance.entityValueUpdate = new StringUpdate();
1842
- _reader.readMessage(_instance.entityValueUpdate, StringUpdate.deserializeBinaryFromReader);
1843
- break;
1844
- case 2:
1845
- const messageInitializer2 = new StringUpdate();
1846
- _reader.readMessage(messageInitializer2, StringUpdate.deserializeBinaryFromReader);
1847
- (_instance.entitySynonymUpdates =
1848
- _instance.entitySynonymUpdates || []).push(messageInitializer2);
1849
- break;
1850
- default:
1851
- _reader.skipField();
1852
- }
1853
- }
1854
- EntityUpdate.refineValues(_instance);
1855
- }
1856
- /**
1857
- * Serializes a message to binary format using provided binary reader
1858
- * @param _instance message instance
1859
- * @param _writer binary writer instance
1860
- */
1861
- static serializeBinaryToWriter(_instance, _writer) {
1862
- if (_instance.entityValueUpdate) {
1863
- _writer.writeMessage(1, _instance.entityValueUpdate, StringUpdate.serializeBinaryToWriter);
1864
- }
1865
- if (_instance.entitySynonymUpdates &&
1866
- _instance.entitySynonymUpdates.length) {
1867
- _writer.writeRepeatedMessage(2, _instance.entitySynonymUpdates, StringUpdate.serializeBinaryToWriter);
1868
- }
1869
- }
1870
- /**
1871
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1872
- * @param _value initial values object or instance of EntityUpdate to deeply clone from
1873
- */
1874
- constructor(_value) {
1875
- _value = _value || {};
1876
- this.entityValueUpdate = _value.entityValueUpdate
1877
- ? new StringUpdate(_value.entityValueUpdate)
1878
- : undefined;
1879
- this.entitySynonymUpdates = (_value.entitySynonymUpdates || []).map(m => new StringUpdate(m));
1880
- EntityUpdate.refineValues(this);
1881
- }
1882
- get entityValueUpdate() {
1883
- return this._entityValueUpdate;
1884
- }
1885
- set entityValueUpdate(value) {
1886
- this._entityValueUpdate = value;
1887
- }
1888
- get entitySynonymUpdates() {
1889
- return this._entitySynonymUpdates;
1890
- }
1891
- set entitySynonymUpdates(value) {
1892
- this._entitySynonymUpdates = value;
1893
- }
1894
- /**
1895
- * Serialize message to binary data
1896
- * @param instance message instance
1897
- */
1898
- serializeBinary() {
1899
- const writer = new BinaryWriter();
1900
- EntityUpdate.serializeBinaryToWriter(this, writer);
1901
- return writer.getResultBuffer();
1902
- }
1903
- /**
1904
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1905
- */
1906
- toObject() {
1907
- return {
1908
- entityValueUpdate: this.entityValueUpdate
1909
- ? this.entityValueUpdate.toObject()
1910
- : undefined,
1911
- entitySynonymUpdates: (this.entitySynonymUpdates || []).map(m => m.toObject())
1912
- };
1913
- }
1914
- /**
1915
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1916
- */
1917
- toJSON() {
1918
- return this.toObject();
1919
- }
1920
- /**
1921
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1922
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1923
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1924
- */
1925
- toProtobufJSON(
1926
- // @ts-ignore
1927
- options) {
1928
- return {
1929
- entityValueUpdate: this.entityValueUpdate
1930
- ? this.entityValueUpdate.toProtobufJSON(options)
1931
- : null,
1932
- entitySynonymUpdates: (this.entitySynonymUpdates || []).map(m => m.toProtobufJSON(options))
1933
- };
1934
- }
1935
- }
1936
- EntityTypeUpdate.EntityUpdate = EntityUpdate;
1937
- })(EntityTypeUpdate || (EntityTypeUpdate = {}));
1938
- /**
1939
- * Message implementation for ondewo.nlu.CleanAllEntityTypesRequest
1940
- */
1941
- export class CleanAllEntityTypesRequest {
1942
- static { this.id = 'ondewo.nlu.CleanAllEntityTypesRequest'; }
1943
- /**
1944
- * Deserialize binary data to message
1945
- * @param instance message instance
1946
- */
1947
- static deserializeBinary(bytes) {
1948
- const instance = new CleanAllEntityTypesRequest();
1949
- CleanAllEntityTypesRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1950
- return instance;
1951
- }
1952
- /**
1953
- * Check all the properties and set default protobuf values if necessary
1954
- * @param _instance message instance
1955
- */
1956
- static refineValues(_instance) {
1957
- _instance.parent = _instance.parent || '';
1958
- _instance.languageCode = _instance.languageCode || '';
1959
- _instance.specialCharacters = _instance.specialCharacters || '';
1960
- _instance.substringWhiteList = _instance.substringWhiteList || [];
1961
- _instance.maxEntityCountUpdate = _instance.maxEntityCountUpdate || 0;
1962
- _instance.forbiddenEntityTypePatterns =
1963
- _instance.forbiddenEntityTypePatterns || [];
1964
- _instance.dryRun = _instance.dryRun || false;
1965
- _instance.numberOfWorkers = _instance.numberOfWorkers || 0;
1966
- }
1967
- /**
1968
- * Deserializes / reads binary message into message instance using provided binary reader
1969
- * @param _instance message instance
1970
- * @param _reader binary reader instance
1971
- */
1972
- static deserializeBinaryFromReader(_instance, _reader) {
1973
- while (_reader.nextField()) {
1974
- if (_reader.isEndGroup())
1975
- break;
1976
- switch (_reader.getFieldNumber()) {
1977
- case 1:
1978
- _instance.parent = _reader.readString();
1979
- break;
1980
- case 2:
1981
- _instance.languageCode = _reader.readString();
1982
- break;
1983
- case 3:
1984
- _instance.specialCharacters = _reader.readString();
1985
- break;
1986
- case 4:
1987
- (_instance.substringWhiteList =
1988
- _instance.substringWhiteList || []).push(_reader.readString());
1989
- break;
1990
- case 5:
1991
- _instance.maxEntityCountUpdate = _reader.readInt32();
1992
- break;
1993
- case 6:
1994
- (_instance.forbiddenEntityTypePatterns =
1995
- _instance.forbiddenEntityTypePatterns || []).push(_reader.readString());
1996
- break;
1997
- case 7:
1998
- _instance.dryRun = _reader.readBool();
1999
- break;
2000
- case 8:
2001
- _instance.numberOfWorkers = _reader.readInt32();
2002
- break;
2003
- default:
2004
- _reader.skipField();
2005
- }
2006
- }
2007
- CleanAllEntityTypesRequest.refineValues(_instance);
2008
- }
2009
- /**
2010
- * Serializes a message to binary format using provided binary reader
2011
- * @param _instance message instance
2012
- * @param _writer binary writer instance
2013
- */
2014
- static serializeBinaryToWriter(_instance, _writer) {
2015
- if (_instance.parent) {
2016
- _writer.writeString(1, _instance.parent);
2017
- }
2018
- if (_instance.languageCode) {
2019
- _writer.writeString(2, _instance.languageCode);
2020
- }
2021
- if (_instance.specialCharacters) {
2022
- _writer.writeString(3, _instance.specialCharacters);
2023
- }
2024
- if (_instance.substringWhiteList && _instance.substringWhiteList.length) {
2025
- _writer.writeRepeatedString(4, _instance.substringWhiteList);
2026
- }
2027
- if (_instance.maxEntityCountUpdate) {
2028
- _writer.writeInt32(5, _instance.maxEntityCountUpdate);
2029
- }
2030
- if (_instance.forbiddenEntityTypePatterns &&
2031
- _instance.forbiddenEntityTypePatterns.length) {
2032
- _writer.writeRepeatedString(6, _instance.forbiddenEntityTypePatterns);
2033
- }
2034
- if (_instance.dryRun) {
2035
- _writer.writeBool(7, _instance.dryRun);
2036
- }
2037
- if (_instance.numberOfWorkers) {
2038
- _writer.writeInt32(8, _instance.numberOfWorkers);
2039
- }
2040
- }
2041
- /**
2042
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2043
- * @param _value initial values object or instance of CleanAllEntityTypesRequest to deeply clone from
2044
- */
2045
- constructor(_value) {
2046
- _value = _value || {};
2047
- this.parent = _value.parent;
2048
- this.languageCode = _value.languageCode;
2049
- this.specialCharacters = _value.specialCharacters;
2050
- this.substringWhiteList = (_value.substringWhiteList || []).slice();
2051
- this.maxEntityCountUpdate = _value.maxEntityCountUpdate;
2052
- this.forbiddenEntityTypePatterns = (_value.forbiddenEntityTypePatterns || []).slice();
2053
- this.dryRun = _value.dryRun;
2054
- this.numberOfWorkers = _value.numberOfWorkers;
2055
- CleanAllEntityTypesRequest.refineValues(this);
2056
- }
2057
- get parent() {
2058
- return this._parent;
2059
- }
2060
- set parent(value) {
2061
- this._parent = value;
2062
- }
2063
- get languageCode() {
2064
- return this._languageCode;
2065
- }
2066
- set languageCode(value) {
2067
- this._languageCode = value;
2068
- }
2069
- get specialCharacters() {
2070
- return this._specialCharacters;
2071
- }
2072
- set specialCharacters(value) {
2073
- this._specialCharacters = value;
2074
- }
2075
- get substringWhiteList() {
2076
- return this._substringWhiteList;
2077
- }
2078
- set substringWhiteList(value) {
2079
- this._substringWhiteList = value;
2080
- }
2081
- get maxEntityCountUpdate() {
2082
- return this._maxEntityCountUpdate;
2083
- }
2084
- set maxEntityCountUpdate(value) {
2085
- this._maxEntityCountUpdate = value;
2086
- }
2087
- get forbiddenEntityTypePatterns() {
2088
- return this._forbiddenEntityTypePatterns;
2089
- }
2090
- set forbiddenEntityTypePatterns(value) {
2091
- this._forbiddenEntityTypePatterns = value;
2092
- }
2093
- get dryRun() {
2094
- return this._dryRun;
2095
- }
2096
- set dryRun(value) {
2097
- this._dryRun = value;
2098
- }
2099
- get numberOfWorkers() {
2100
- return this._numberOfWorkers;
2101
- }
2102
- set numberOfWorkers(value) {
2103
- this._numberOfWorkers = value;
2104
- }
2105
- /**
2106
- * Serialize message to binary data
2107
- * @param instance message instance
2108
- */
2109
- serializeBinary() {
2110
- const writer = new BinaryWriter();
2111
- CleanAllEntityTypesRequest.serializeBinaryToWriter(this, writer);
2112
- return writer.getResultBuffer();
2113
- }
2114
- /**
2115
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2116
- */
2117
- toObject() {
2118
- return {
2119
- parent: this.parent,
2120
- languageCode: this.languageCode,
2121
- specialCharacters: this.specialCharacters,
2122
- substringWhiteList: (this.substringWhiteList || []).slice(),
2123
- maxEntityCountUpdate: this.maxEntityCountUpdate,
2124
- forbiddenEntityTypePatterns: (this.forbiddenEntityTypePatterns || []).slice(),
2125
- dryRun: this.dryRun,
2126
- numberOfWorkers: this.numberOfWorkers
2127
- };
2128
- }
2129
- /**
2130
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2131
- */
2132
- toJSON() {
2133
- return this.toObject();
2134
- }
2135
- /**
2136
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2137
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2138
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2139
- */
2140
- toProtobufJSON(
2141
- // @ts-ignore
2142
- options) {
2143
- return {
2144
- parent: this.parent,
2145
- languageCode: this.languageCode,
2146
- specialCharacters: this.specialCharacters,
2147
- substringWhiteList: (this.substringWhiteList || []).slice(),
2148
- maxEntityCountUpdate: this.maxEntityCountUpdate,
2149
- forbiddenEntityTypePatterns: (this.forbiddenEntityTypePatterns || []).slice(),
2150
- dryRun: this.dryRun,
2151
- numberOfWorkers: this.numberOfWorkers
2152
- };
2153
- }
2154
- }
2155
- /**
2156
- * Message implementation for ondewo.nlu.CleanAllEntityTypesResponse
2157
- */
2158
- export class CleanAllEntityTypesResponse {
2159
- static { this.id = 'ondewo.nlu.CleanAllEntityTypesResponse'; }
2160
- /**
2161
- * Deserialize binary data to message
2162
- * @param instance message instance
2163
- */
2164
- static deserializeBinary(bytes) {
2165
- const instance = new CleanAllEntityTypesResponse();
2166
- CleanAllEntityTypesResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2167
- return instance;
2168
- }
2169
- /**
2170
- * Check all the properties and set default protobuf values if necessary
2171
- * @param _instance message instance
2172
- */
2173
- static refineValues(_instance) {
2174
- _instance.cleanedEntityTypes = _instance.cleanedEntityTypes || [];
2175
- _instance.deletedEntityTypes = _instance.deletedEntityTypes || [];
2176
- _instance.entityTypeUpdates = _instance.entityTypeUpdates || [];
2177
- _instance.entityTypeDeletions = _instance.entityTypeDeletions || [];
2178
- }
2179
- /**
2180
- * Deserializes / reads binary message into message instance using provided binary reader
2181
- * @param _instance message instance
2182
- * @param _reader binary reader instance
2183
- */
2184
- static deserializeBinaryFromReader(_instance, _reader) {
2185
- while (_reader.nextField()) {
2186
- if (_reader.isEndGroup())
2187
- break;
2188
- switch (_reader.getFieldNumber()) {
2189
- case 1:
2190
- const messageInitializer1 = new ondewoNlu009.EntityType();
2191
- _reader.readMessage(messageInitializer1, ondewoNlu009.EntityType.deserializeBinaryFromReader);
2192
- (_instance.cleanedEntityTypes =
2193
- _instance.cleanedEntityTypes || []).push(messageInitializer1);
2194
- break;
2195
- case 2:
2196
- const messageInitializer2 = new ondewoNlu009.EntityType();
2197
- _reader.readMessage(messageInitializer2, ondewoNlu009.EntityType.deserializeBinaryFromReader);
2198
- (_instance.deletedEntityTypes =
2199
- _instance.deletedEntityTypes || []).push(messageInitializer2);
2200
- break;
2201
- case 3:
2202
- const messageInitializer3 = new EntityTypeUpdate();
2203
- _reader.readMessage(messageInitializer3, EntityTypeUpdate.deserializeBinaryFromReader);
2204
- (_instance.entityTypeUpdates =
2205
- _instance.entityTypeUpdates || []).push(messageInitializer3);
2206
- break;
2207
- case 4:
2208
- const messageInitializer4 = new EntityTypeUpdate();
2209
- _reader.readMessage(messageInitializer4, EntityTypeUpdate.deserializeBinaryFromReader);
2210
- (_instance.entityTypeDeletions =
2211
- _instance.entityTypeDeletions || []).push(messageInitializer4);
2212
- break;
2213
- default:
2214
- _reader.skipField();
2215
- }
2216
- }
2217
- CleanAllEntityTypesResponse.refineValues(_instance);
2218
- }
2219
- /**
2220
- * Serializes a message to binary format using provided binary reader
2221
- * @param _instance message instance
2222
- * @param _writer binary writer instance
2223
- */
2224
- static serializeBinaryToWriter(_instance, _writer) {
2225
- if (_instance.cleanedEntityTypes && _instance.cleanedEntityTypes.length) {
2226
- _writer.writeRepeatedMessage(1, _instance.cleanedEntityTypes, ondewoNlu009.EntityType.serializeBinaryToWriter);
2227
- }
2228
- if (_instance.deletedEntityTypes && _instance.deletedEntityTypes.length) {
2229
- _writer.writeRepeatedMessage(2, _instance.deletedEntityTypes, ondewoNlu009.EntityType.serializeBinaryToWriter);
2230
- }
2231
- if (_instance.entityTypeUpdates && _instance.entityTypeUpdates.length) {
2232
- _writer.writeRepeatedMessage(3, _instance.entityTypeUpdates, EntityTypeUpdate.serializeBinaryToWriter);
2233
- }
2234
- if (_instance.entityTypeDeletions && _instance.entityTypeDeletions.length) {
2235
- _writer.writeRepeatedMessage(4, _instance.entityTypeDeletions, EntityTypeUpdate.serializeBinaryToWriter);
2236
- }
2237
- }
2238
- /**
2239
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2240
- * @param _value initial values object or instance of CleanAllEntityTypesResponse to deeply clone from
2241
- */
2242
- constructor(_value) {
2243
- _value = _value || {};
2244
- this.cleanedEntityTypes = (_value.cleanedEntityTypes || []).map(m => new ondewoNlu009.EntityType(m));
2245
- this.deletedEntityTypes = (_value.deletedEntityTypes || []).map(m => new ondewoNlu009.EntityType(m));
2246
- this.entityTypeUpdates = (_value.entityTypeUpdates || []).map(m => new EntityTypeUpdate(m));
2247
- this.entityTypeDeletions = (_value.entityTypeDeletions || []).map(m => new EntityTypeUpdate(m));
2248
- CleanAllEntityTypesResponse.refineValues(this);
2249
- }
2250
- get cleanedEntityTypes() {
2251
- return this._cleanedEntityTypes;
2252
- }
2253
- set cleanedEntityTypes(value) {
2254
- this._cleanedEntityTypes = value;
2255
- }
2256
- get deletedEntityTypes() {
2257
- return this._deletedEntityTypes;
2258
- }
2259
- set deletedEntityTypes(value) {
2260
- this._deletedEntityTypes = value;
2261
- }
2262
- get entityTypeUpdates() {
2263
- return this._entityTypeUpdates;
2264
- }
2265
- set entityTypeUpdates(value) {
2266
- this._entityTypeUpdates = value;
2267
- }
2268
- get entityTypeDeletions() {
2269
- return this._entityTypeDeletions;
2270
- }
2271
- set entityTypeDeletions(value) {
2272
- this._entityTypeDeletions = value;
2273
- }
2274
- /**
2275
- * Serialize message to binary data
2276
- * @param instance message instance
2277
- */
2278
- serializeBinary() {
2279
- const writer = new BinaryWriter();
2280
- CleanAllEntityTypesResponse.serializeBinaryToWriter(this, writer);
2281
- return writer.getResultBuffer();
2282
- }
2283
- /**
2284
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2285
- */
2286
- toObject() {
2287
- return {
2288
- cleanedEntityTypes: (this.cleanedEntityTypes || []).map(m => m.toObject()),
2289
- deletedEntityTypes: (this.deletedEntityTypes || []).map(m => m.toObject()),
2290
- entityTypeUpdates: (this.entityTypeUpdates || []).map(m => m.toObject()),
2291
- entityTypeDeletions: (this.entityTypeDeletions || []).map(m => m.toObject())
2292
- };
2293
- }
2294
- /**
2295
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2296
- */
2297
- toJSON() {
2298
- return this.toObject();
2299
- }
2300
- /**
2301
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2302
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2303
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2304
- */
2305
- toProtobufJSON(
2306
- // @ts-ignore
2307
- options) {
2308
- return {
2309
- cleanedEntityTypes: (this.cleanedEntityTypes || []).map(m => m.toProtobufJSON(options)),
2310
- deletedEntityTypes: (this.deletedEntityTypes || []).map(m => m.toProtobufJSON(options)),
2311
- entityTypeUpdates: (this.entityTypeUpdates || []).map(m => m.toProtobufJSON(options)),
2312
- entityTypeDeletions: (this.entityTypeDeletions || []).map(m => m.toProtobufJSON(options))
2313
- };
2314
- }
2315
- }
2316
- /**
2317
- * Message implementation for ondewo.nlu.CleanEntityTypeRequest
2318
- */
2319
- export class CleanEntityTypeRequest {
2320
- static { this.id = 'ondewo.nlu.CleanEntityTypeRequest'; }
2321
- /**
2322
- * Deserialize binary data to message
2323
- * @param instance message instance
2324
- */
2325
- static deserializeBinary(bytes) {
2326
- const instance = new CleanEntityTypeRequest();
2327
- CleanEntityTypeRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2328
- return instance;
2329
- }
2330
- /**
2331
- * Check all the properties and set default protobuf values if necessary
2332
- * @param _instance message instance
2333
- */
2334
- static refineValues(_instance) {
2335
- _instance.parent = _instance.parent || '';
2336
- _instance.entityTypeName = _instance.entityTypeName || '';
2337
- _instance.languageCode = _instance.languageCode || '';
2338
- _instance.specialCharacters = _instance.specialCharacters || '';
2339
- _instance.substringWhiteList = _instance.substringWhiteList || [];
2340
- _instance.maxEntityCountUpdate = _instance.maxEntityCountUpdate || 0;
2341
- _instance.dryRun = _instance.dryRun || false;
2342
- }
2343
- /**
2344
- * Deserializes / reads binary message into message instance using provided binary reader
2345
- * @param _instance message instance
2346
- * @param _reader binary reader instance
2347
- */
2348
- static deserializeBinaryFromReader(_instance, _reader) {
2349
- while (_reader.nextField()) {
2350
- if (_reader.isEndGroup())
2351
- break;
2352
- switch (_reader.getFieldNumber()) {
2353
- case 1:
2354
- _instance.parent = _reader.readString();
2355
- break;
2356
- case 2:
2357
- _instance.entityTypeName = _reader.readString();
2358
- break;
2359
- case 3:
2360
- _instance.languageCode = _reader.readString();
2361
- break;
2362
- case 4:
2363
- _instance.specialCharacters = _reader.readString();
2364
- break;
2365
- case 5:
2366
- (_instance.substringWhiteList =
2367
- _instance.substringWhiteList || []).push(_reader.readString());
2368
- break;
2369
- case 6:
2370
- _instance.maxEntityCountUpdate = _reader.readInt32();
2371
- break;
2372
- case 7:
2373
- _instance.dryRun = _reader.readBool();
2374
- break;
2375
- default:
2376
- _reader.skipField();
2377
- }
2378
- }
2379
- CleanEntityTypeRequest.refineValues(_instance);
2380
- }
2381
- /**
2382
- * Serializes a message to binary format using provided binary reader
2383
- * @param _instance message instance
2384
- * @param _writer binary writer instance
2385
- */
2386
- static serializeBinaryToWriter(_instance, _writer) {
2387
- if (_instance.parent) {
2388
- _writer.writeString(1, _instance.parent);
2389
- }
2390
- if (_instance.entityTypeName) {
2391
- _writer.writeString(2, _instance.entityTypeName);
2392
- }
2393
- if (_instance.languageCode) {
2394
- _writer.writeString(3, _instance.languageCode);
2395
- }
2396
- if (_instance.specialCharacters) {
2397
- _writer.writeString(4, _instance.specialCharacters);
2398
- }
2399
- if (_instance.substringWhiteList && _instance.substringWhiteList.length) {
2400
- _writer.writeRepeatedString(5, _instance.substringWhiteList);
2401
- }
2402
- if (_instance.maxEntityCountUpdate) {
2403
- _writer.writeInt32(6, _instance.maxEntityCountUpdate);
2404
- }
2405
- if (_instance.dryRun) {
2406
- _writer.writeBool(7, _instance.dryRun);
2407
- }
2408
- }
2409
- /**
2410
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2411
- * @param _value initial values object or instance of CleanEntityTypeRequest to deeply clone from
2412
- */
2413
- constructor(_value) {
2414
- _value = _value || {};
2415
- this.parent = _value.parent;
2416
- this.entityTypeName = _value.entityTypeName;
2417
- this.languageCode = _value.languageCode;
2418
- this.specialCharacters = _value.specialCharacters;
2419
- this.substringWhiteList = (_value.substringWhiteList || []).slice();
2420
- this.maxEntityCountUpdate = _value.maxEntityCountUpdate;
2421
- this.dryRun = _value.dryRun;
2422
- CleanEntityTypeRequest.refineValues(this);
2423
- }
2424
- get parent() {
2425
- return this._parent;
2426
- }
2427
- set parent(value) {
2428
- this._parent = value;
2429
- }
2430
- get entityTypeName() {
2431
- return this._entityTypeName;
2432
- }
2433
- set entityTypeName(value) {
2434
- this._entityTypeName = value;
2435
- }
2436
- get languageCode() {
2437
- return this._languageCode;
2438
- }
2439
- set languageCode(value) {
2440
- this._languageCode = value;
2441
- }
2442
- get specialCharacters() {
2443
- return this._specialCharacters;
2444
- }
2445
- set specialCharacters(value) {
2446
- this._specialCharacters = value;
2447
- }
2448
- get substringWhiteList() {
2449
- return this._substringWhiteList;
2450
- }
2451
- set substringWhiteList(value) {
2452
- this._substringWhiteList = value;
2453
- }
2454
- get maxEntityCountUpdate() {
2455
- return this._maxEntityCountUpdate;
2456
- }
2457
- set maxEntityCountUpdate(value) {
2458
- this._maxEntityCountUpdate = value;
2459
- }
2460
- get dryRun() {
2461
- return this._dryRun;
2462
- }
2463
- set dryRun(value) {
2464
- this._dryRun = value;
2465
- }
2466
- /**
2467
- * Serialize message to binary data
2468
- * @param instance message instance
2469
- */
2470
- serializeBinary() {
2471
- const writer = new BinaryWriter();
2472
- CleanEntityTypeRequest.serializeBinaryToWriter(this, writer);
2473
- return writer.getResultBuffer();
2474
- }
2475
- /**
2476
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2477
- */
2478
- toObject() {
2479
- return {
2480
- parent: this.parent,
2481
- entityTypeName: this.entityTypeName,
2482
- languageCode: this.languageCode,
2483
- specialCharacters: this.specialCharacters,
2484
- substringWhiteList: (this.substringWhiteList || []).slice(),
2485
- maxEntityCountUpdate: this.maxEntityCountUpdate,
2486
- dryRun: this.dryRun
2487
- };
2488
- }
2489
- /**
2490
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2491
- */
2492
- toJSON() {
2493
- return this.toObject();
2494
- }
2495
- /**
2496
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2497
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2498
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2499
- */
2500
- toProtobufJSON(
2501
- // @ts-ignore
2502
- options) {
2503
- return {
2504
- parent: this.parent,
2505
- entityTypeName: this.entityTypeName,
2506
- languageCode: this.languageCode,
2507
- specialCharacters: this.specialCharacters,
2508
- substringWhiteList: (this.substringWhiteList || []).slice(),
2509
- maxEntityCountUpdate: this.maxEntityCountUpdate,
2510
- dryRun: this.dryRun
2511
- };
2512
- }
2513
- }
2514
- /**
2515
- * Message implementation for ondewo.nlu.CleanEntityTypeResponse
2516
- */
2517
- export class CleanEntityTypeResponse {
2518
- static { this.id = 'ondewo.nlu.CleanEntityTypeResponse'; }
2519
- /**
2520
- * Deserialize binary data to message
2521
- * @param instance message instance
2522
- */
2523
- static deserializeBinary(bytes) {
2524
- const instance = new CleanEntityTypeResponse();
2525
- CleanEntityTypeResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2526
- return instance;
2527
- }
2528
- /**
2529
- * Check all the properties and set default protobuf values if necessary
2530
- * @param _instance message instance
2531
- */
2532
- static refineValues(_instance) {
2533
- _instance.cleanedEntityType = _instance.cleanedEntityType || undefined;
2534
- _instance.entityTypeUpdate = _instance.entityTypeUpdate || undefined;
2535
- }
2536
- /**
2537
- * Deserializes / reads binary message into message instance using provided binary reader
2538
- * @param _instance message instance
2539
- * @param _reader binary reader instance
2540
- */
2541
- static deserializeBinaryFromReader(_instance, _reader) {
2542
- while (_reader.nextField()) {
2543
- if (_reader.isEndGroup())
2544
- break;
2545
- switch (_reader.getFieldNumber()) {
2546
- case 1:
2547
- _instance.cleanedEntityType = new ondewoNlu009.EntityType();
2548
- _reader.readMessage(_instance.cleanedEntityType, ondewoNlu009.EntityType.deserializeBinaryFromReader);
2549
- break;
2550
- case 2:
2551
- _instance.entityTypeUpdate = new EntityTypeUpdate();
2552
- _reader.readMessage(_instance.entityTypeUpdate, EntityTypeUpdate.deserializeBinaryFromReader);
2553
- break;
2554
- default:
2555
- _reader.skipField();
2556
- }
2557
- }
2558
- CleanEntityTypeResponse.refineValues(_instance);
2559
- }
2560
- /**
2561
- * Serializes a message to binary format using provided binary reader
2562
- * @param _instance message instance
2563
- * @param _writer binary writer instance
2564
- */
2565
- static serializeBinaryToWriter(_instance, _writer) {
2566
- if (_instance.cleanedEntityType) {
2567
- _writer.writeMessage(1, _instance.cleanedEntityType, ondewoNlu009.EntityType.serializeBinaryToWriter);
2568
- }
2569
- if (_instance.entityTypeUpdate) {
2570
- _writer.writeMessage(2, _instance.entityTypeUpdate, EntityTypeUpdate.serializeBinaryToWriter);
2571
- }
2572
- }
2573
- /**
2574
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2575
- * @param _value initial values object or instance of CleanEntityTypeResponse to deeply clone from
2576
- */
2577
- constructor(_value) {
2578
- _value = _value || {};
2579
- this.cleanedEntityType = _value.cleanedEntityType
2580
- ? new ondewoNlu009.EntityType(_value.cleanedEntityType)
2581
- : undefined;
2582
- this.entityTypeUpdate = _value.entityTypeUpdate
2583
- ? new EntityTypeUpdate(_value.entityTypeUpdate)
2584
- : undefined;
2585
- CleanEntityTypeResponse.refineValues(this);
2586
- }
2587
- get cleanedEntityType() {
2588
- return this._cleanedEntityType;
2589
- }
2590
- set cleanedEntityType(value) {
2591
- this._cleanedEntityType = value;
2592
- }
2593
- get entityTypeUpdate() {
2594
- return this._entityTypeUpdate;
2595
- }
2596
- set entityTypeUpdate(value) {
2597
- this._entityTypeUpdate = value;
2598
- }
2599
- /**
2600
- * Serialize message to binary data
2601
- * @param instance message instance
2602
- */
2603
- serializeBinary() {
2604
- const writer = new BinaryWriter();
2605
- CleanEntityTypeResponse.serializeBinaryToWriter(this, writer);
2606
- return writer.getResultBuffer();
2607
- }
2608
- /**
2609
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2610
- */
2611
- toObject() {
2612
- return {
2613
- cleanedEntityType: this.cleanedEntityType
2614
- ? this.cleanedEntityType.toObject()
2615
- : undefined,
2616
- entityTypeUpdate: this.entityTypeUpdate
2617
- ? this.entityTypeUpdate.toObject()
2618
- : undefined
2619
- };
2620
- }
2621
- /**
2622
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2623
- */
2624
- toJSON() {
2625
- return this.toObject();
2626
- }
2627
- /**
2628
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2629
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2630
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2631
- */
2632
- toProtobufJSON(
2633
- // @ts-ignore
2634
- options) {
2635
- return {
2636
- cleanedEntityType: this.cleanedEntityType
2637
- ? this.cleanedEntityType.toProtobufJSON(options)
2638
- : null,
2639
- entityTypeUpdate: this.entityTypeUpdate
2640
- ? this.entityTypeUpdate.toProtobufJSON(options)
2641
- : null
2642
- };
2643
- }
2644
- }
2645
- /**
2646
- * Message implementation for ondewo.nlu.AddTrainingPhrasesRequest
2647
- */
2648
- export class AddTrainingPhrasesRequest {
2649
- static { this.id = 'ondewo.nlu.AddTrainingPhrasesRequest'; }
2650
- /**
2651
- * Deserialize binary data to message
2652
- * @param instance message instance
2653
- */
2654
- static deserializeBinary(bytes) {
2655
- const instance = new AddTrainingPhrasesRequest();
2656
- AddTrainingPhrasesRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2657
- return instance;
2658
- }
2659
- /**
2660
- * Check all the properties and set default protobuf values if necessary
2661
- * @param _instance message instance
2662
- */
2663
- static refineValues(_instance) {
2664
- _instance.parent = _instance.parent || '';
2665
- _instance.languageCode = _instance.languageCode || '';
2666
- _instance.trainingPhraseList = _instance.trainingPhraseList || [];
2667
- _instance.extractEntities = _instance.extractEntities || false;
2668
- _instance.specialCharacters = _instance.specialCharacters || '';
2669
- _instance.trainingPhraseCleanerOptions =
2670
- _instance.trainingPhraseCleanerOptions || undefined;
2671
- _instance.numberOfWorkers = _instance.numberOfWorkers || 0;
2672
- }
2673
- /**
2674
- * Deserializes / reads binary message into message instance using provided binary reader
2675
- * @param _instance message instance
2676
- * @param _reader binary reader instance
2677
- */
2678
- static deserializeBinaryFromReader(_instance, _reader) {
2679
- while (_reader.nextField()) {
2680
- if (_reader.isEndGroup())
2681
- break;
2682
- switch (_reader.getFieldNumber()) {
2683
- case 1:
2684
- _instance.parent = _reader.readString();
2685
- break;
2686
- case 2:
2687
- _instance.languageCode = _reader.readString();
2688
- break;
2689
- case 3:
2690
- const messageInitializer3 = new AddTrainingPhrasesRequest.TrainingPhraseForIntent();
2691
- _reader.readMessage(messageInitializer3, AddTrainingPhrasesRequest.TrainingPhraseForIntent
2692
- .deserializeBinaryFromReader);
2693
- (_instance.trainingPhraseList =
2694
- _instance.trainingPhraseList || []).push(messageInitializer3);
2695
- break;
2696
- case 4:
2697
- _instance.extractEntities = _reader.readBool();
2698
- break;
2699
- case 5:
2700
- _instance.specialCharacters = _reader.readString();
2701
- break;
2702
- case 6:
2703
- _instance.trainingPhraseCleanerOptions = new TrainingPhraseCleanerOptions();
2704
- _reader.readMessage(_instance.trainingPhraseCleanerOptions, TrainingPhraseCleanerOptions.deserializeBinaryFromReader);
2705
- break;
2706
- case 7:
2707
- _instance.numberOfWorkers = _reader.readInt32();
2708
- break;
2709
- default:
2710
- _reader.skipField();
2711
- }
2712
- }
2713
- AddTrainingPhrasesRequest.refineValues(_instance);
2714
- }
2715
- /**
2716
- * Serializes a message to binary format using provided binary reader
2717
- * @param _instance message instance
2718
- * @param _writer binary writer instance
2719
- */
2720
- static serializeBinaryToWriter(_instance, _writer) {
2721
- if (_instance.parent) {
2722
- _writer.writeString(1, _instance.parent);
2723
- }
2724
- if (_instance.languageCode) {
2725
- _writer.writeString(2, _instance.languageCode);
2726
- }
2727
- if (_instance.trainingPhraseList && _instance.trainingPhraseList.length) {
2728
- _writer.writeRepeatedMessage(3, _instance.trainingPhraseList, AddTrainingPhrasesRequest.TrainingPhraseForIntent
2729
- .serializeBinaryToWriter);
2730
- }
2731
- if (_instance.extractEntities) {
2732
- _writer.writeBool(4, _instance.extractEntities);
2733
- }
2734
- if (_instance.specialCharacters) {
2735
- _writer.writeString(5, _instance.specialCharacters);
2736
- }
2737
- if (_instance.trainingPhraseCleanerOptions) {
2738
- _writer.writeMessage(6, _instance.trainingPhraseCleanerOptions, TrainingPhraseCleanerOptions.serializeBinaryToWriter);
2739
- }
2740
- if (_instance.numberOfWorkers) {
2741
- _writer.writeInt32(7, _instance.numberOfWorkers);
2742
- }
2743
- }
2744
- /**
2745
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2746
- * @param _value initial values object or instance of AddTrainingPhrasesRequest to deeply clone from
2747
- */
2748
- constructor(_value) {
2749
- _value = _value || {};
2750
- this.parent = _value.parent;
2751
- this.languageCode = _value.languageCode;
2752
- this.trainingPhraseList = (_value.trainingPhraseList || []).map(m => new AddTrainingPhrasesRequest.TrainingPhraseForIntent(m));
2753
- this.extractEntities = _value.extractEntities;
2754
- this.specialCharacters = _value.specialCharacters;
2755
- this.trainingPhraseCleanerOptions = _value.trainingPhraseCleanerOptions
2756
- ? new TrainingPhraseCleanerOptions(_value.trainingPhraseCleanerOptions)
2757
- : undefined;
2758
- this.numberOfWorkers = _value.numberOfWorkers;
2759
- AddTrainingPhrasesRequest.refineValues(this);
2760
- }
2761
- get parent() {
2762
- return this._parent;
2763
- }
2764
- set parent(value) {
2765
- this._parent = value;
2766
- }
2767
- get languageCode() {
2768
- return this._languageCode;
2769
- }
2770
- set languageCode(value) {
2771
- this._languageCode = value;
2772
- }
2773
- get trainingPhraseList() {
2774
- return this._trainingPhraseList;
2775
- }
2776
- set trainingPhraseList(value) {
2777
- this._trainingPhraseList = value;
2778
- }
2779
- get extractEntities() {
2780
- return this._extractEntities;
2781
- }
2782
- set extractEntities(value) {
2783
- this._extractEntities = value;
2784
- }
2785
- get specialCharacters() {
2786
- return this._specialCharacters;
2787
- }
2788
- set specialCharacters(value) {
2789
- this._specialCharacters = value;
2790
- }
2791
- get trainingPhraseCleanerOptions() {
2792
- return this._trainingPhraseCleanerOptions;
2793
- }
2794
- set trainingPhraseCleanerOptions(value) {
2795
- this._trainingPhraseCleanerOptions = value;
2796
- }
2797
- get numberOfWorkers() {
2798
- return this._numberOfWorkers;
2799
- }
2800
- set numberOfWorkers(value) {
2801
- this._numberOfWorkers = value;
2802
- }
2803
- /**
2804
- * Serialize message to binary data
2805
- * @param instance message instance
2806
- */
2807
- serializeBinary() {
2808
- const writer = new BinaryWriter();
2809
- AddTrainingPhrasesRequest.serializeBinaryToWriter(this, writer);
2810
- return writer.getResultBuffer();
2811
- }
2812
- /**
2813
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2814
- */
2815
- toObject() {
2816
- return {
2817
- parent: this.parent,
2818
- languageCode: this.languageCode,
2819
- trainingPhraseList: (this.trainingPhraseList || []).map(m => m.toObject()),
2820
- extractEntities: this.extractEntities,
2821
- specialCharacters: this.specialCharacters,
2822
- trainingPhraseCleanerOptions: this.trainingPhraseCleanerOptions
2823
- ? this.trainingPhraseCleanerOptions.toObject()
2824
- : undefined,
2825
- numberOfWorkers: this.numberOfWorkers
2826
- };
2827
- }
2828
- /**
2829
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2830
- */
2831
- toJSON() {
2832
- return this.toObject();
2833
- }
2834
- /**
2835
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2836
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2837
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2838
- */
2839
- toProtobufJSON(
2840
- // @ts-ignore
2841
- options) {
2842
- return {
2843
- parent: this.parent,
2844
- languageCode: this.languageCode,
2845
- trainingPhraseList: (this.trainingPhraseList || []).map(m => m.toProtobufJSON(options)),
2846
- extractEntities: this.extractEntities,
2847
- specialCharacters: this.specialCharacters,
2848
- trainingPhraseCleanerOptions: this.trainingPhraseCleanerOptions
2849
- ? this.trainingPhraseCleanerOptions.toProtobufJSON(options)
2850
- : null,
2851
- numberOfWorkers: this.numberOfWorkers
2852
- };
2853
- }
2854
- }
2855
- (function (AddTrainingPhrasesRequest) {
2856
- /**
2857
- * Message implementation for ondewo.nlu.AddTrainingPhrasesRequest.TrainingPhraseForIntent
2858
- */
2859
- class TrainingPhraseForIntent {
2860
- static { this.id = 'ondewo.nlu.AddTrainingPhrasesRequest.TrainingPhraseForIntent'; }
2861
- /**
2862
- * Deserialize binary data to message
2863
- * @param instance message instance
2864
- */
2865
- static deserializeBinary(bytes) {
2866
- const instance = new TrainingPhraseForIntent();
2867
- TrainingPhraseForIntent.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2868
- return instance;
2869
- }
2870
- /**
2871
- * Check all the properties and set default protobuf values if necessary
2872
- * @param _instance message instance
2873
- */
2874
- static refineValues(_instance) {
2875
- _instance.trainingPhrase = _instance.trainingPhrase || '';
2876
- _instance.intentDisplayName = _instance.intentDisplayName || '';
2877
- _instance.entities = _instance.entities || [];
2878
- }
2879
- /**
2880
- * Deserializes / reads binary message into message instance using provided binary reader
2881
- * @param _instance message instance
2882
- * @param _reader binary reader instance
2883
- */
2884
- static deserializeBinaryFromReader(_instance, _reader) {
2885
- while (_reader.nextField()) {
2886
- if (_reader.isEndGroup())
2887
- break;
2888
- switch (_reader.getFieldNumber()) {
2889
- case 1:
2890
- _instance.trainingPhrase = _reader.readString();
2891
- break;
2892
- case 2:
2893
- _instance.intentDisplayName = _reader.readString();
2894
- break;
2895
- case 3:
2896
- const messageInitializer3 = new ondewoNlu008.Intent.TrainingPhrase.Entity();
2897
- _reader.readMessage(messageInitializer3, ondewoNlu008.Intent.TrainingPhrase.Entity
2898
- .deserializeBinaryFromReader);
2899
- (_instance.entities = _instance.entities || []).push(messageInitializer3);
2900
- break;
2901
- default:
2902
- _reader.skipField();
2903
- }
2904
- }
2905
- TrainingPhraseForIntent.refineValues(_instance);
2906
- }
2907
- /**
2908
- * Serializes a message to binary format using provided binary reader
2909
- * @param _instance message instance
2910
- * @param _writer binary writer instance
2911
- */
2912
- static serializeBinaryToWriter(_instance, _writer) {
2913
- if (_instance.trainingPhrase) {
2914
- _writer.writeString(1, _instance.trainingPhrase);
2915
- }
2916
- if (_instance.intentDisplayName) {
2917
- _writer.writeString(2, _instance.intentDisplayName);
2918
- }
2919
- if (_instance.entities && _instance.entities.length) {
2920
- _writer.writeRepeatedMessage(3, _instance.entities, ondewoNlu008.Intent.TrainingPhrase.Entity.serializeBinaryToWriter);
2921
- }
2922
- }
2923
- /**
2924
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2925
- * @param _value initial values object or instance of TrainingPhraseForIntent to deeply clone from
2926
- */
2927
- constructor(_value) {
2928
- _value = _value || {};
2929
- this.trainingPhrase = _value.trainingPhrase;
2930
- this.intentDisplayName = _value.intentDisplayName;
2931
- this.entities = (_value.entities || []).map(m => new ondewoNlu008.Intent.TrainingPhrase.Entity(m));
2932
- TrainingPhraseForIntent.refineValues(this);
2933
- }
2934
- get trainingPhrase() {
2935
- return this._trainingPhrase;
2936
- }
2937
- set trainingPhrase(value) {
2938
- this._trainingPhrase = value;
2939
- }
2940
- get intentDisplayName() {
2941
- return this._intentDisplayName;
2942
- }
2943
- set intentDisplayName(value) {
2944
- this._intentDisplayName = value;
2945
- }
2946
- get entities() {
2947
- return this._entities;
2948
- }
2949
- set entities(value) {
2950
- this._entities = value;
2951
- }
2952
- /**
2953
- * Serialize message to binary data
2954
- * @param instance message instance
2955
- */
2956
- serializeBinary() {
2957
- const writer = new BinaryWriter();
2958
- TrainingPhraseForIntent.serializeBinaryToWriter(this, writer);
2959
- return writer.getResultBuffer();
2960
- }
2961
- /**
2962
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2963
- */
2964
- toObject() {
2965
- return {
2966
- trainingPhrase: this.trainingPhrase,
2967
- intentDisplayName: this.intentDisplayName,
2968
- entities: (this.entities || []).map(m => m.toObject())
2969
- };
2970
- }
2971
- /**
2972
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2973
- */
2974
- toJSON() {
2975
- return this.toObject();
2976
- }
2977
- /**
2978
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2979
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2980
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2981
- */
2982
- toProtobufJSON(
2983
- // @ts-ignore
2984
- options) {
2985
- return {
2986
- trainingPhrase: this.trainingPhrase,
2987
- intentDisplayName: this.intentDisplayName,
2988
- entities: (this.entities || []).map(m => m.toProtobufJSON(options))
2989
- };
2990
- }
2991
- }
2992
- AddTrainingPhrasesRequest.TrainingPhraseForIntent = TrainingPhraseForIntent;
2993
- })(AddTrainingPhrasesRequest || (AddTrainingPhrasesRequest = {}));
2994
- /**
2995
- * Message implementation for ondewo.nlu.AddTrainingPhrasesResponse
2996
- */
2997
- export class AddTrainingPhrasesResponse {
2998
- static { this.id = 'ondewo.nlu.AddTrainingPhrasesResponse'; }
2999
- /**
3000
- * Deserialize binary data to message
3001
- * @param instance message instance
3002
- */
3003
- static deserializeBinary(bytes) {
3004
- const instance = new AddTrainingPhrasesResponse();
3005
- AddTrainingPhrasesResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
3006
- return instance;
3007
- }
3008
- /**
3009
- * Check all the properties and set default protobuf values if necessary
3010
- * @param _instance message instance
3011
- */
3012
- static refineValues(_instance) {
3013
- _instance.errorMessages = _instance.errorMessages || [];
3014
- }
3015
- /**
3016
- * Deserializes / reads binary message into message instance using provided binary reader
3017
- * @param _instance message instance
3018
- * @param _reader binary reader instance
3019
- */
3020
- static deserializeBinaryFromReader(_instance, _reader) {
3021
- while (_reader.nextField()) {
3022
- if (_reader.isEndGroup())
3023
- break;
3024
- switch (_reader.getFieldNumber()) {
3025
- case 1:
3026
- (_instance.errorMessages = _instance.errorMessages || []).push(_reader.readString());
3027
- break;
3028
- default:
3029
- _reader.skipField();
3030
- }
3031
- }
3032
- AddTrainingPhrasesResponse.refineValues(_instance);
3033
- }
3034
- /**
3035
- * Serializes a message to binary format using provided binary reader
3036
- * @param _instance message instance
3037
- * @param _writer binary writer instance
3038
- */
3039
- static serializeBinaryToWriter(_instance, _writer) {
3040
- if (_instance.errorMessages && _instance.errorMessages.length) {
3041
- _writer.writeRepeatedString(1, _instance.errorMessages);
3042
- }
3043
- }
3044
- /**
3045
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
3046
- * @param _value initial values object or instance of AddTrainingPhrasesResponse to deeply clone from
3047
- */
3048
- constructor(_value) {
3049
- _value = _value || {};
3050
- this.errorMessages = (_value.errorMessages || []).slice();
3051
- AddTrainingPhrasesResponse.refineValues(this);
3052
- }
3053
- get errorMessages() {
3054
- return this._errorMessages;
3055
- }
3056
- set errorMessages(value) {
3057
- this._errorMessages = value;
3058
- }
3059
- /**
3060
- * Serialize message to binary data
3061
- * @param instance message instance
3062
- */
3063
- serializeBinary() {
3064
- const writer = new BinaryWriter();
3065
- AddTrainingPhrasesResponse.serializeBinaryToWriter(this, writer);
3066
- return writer.getResultBuffer();
3067
- }
3068
- /**
3069
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
3070
- */
3071
- toObject() {
3072
- return {
3073
- errorMessages: (this.errorMessages || []).slice()
3074
- };
3075
- }
3076
- /**
3077
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
3078
- */
3079
- toJSON() {
3080
- return this.toObject();
3081
- }
3082
- /**
3083
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
3084
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
3085
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
3086
- */
3087
- toProtobufJSON(
3088
- // @ts-ignore
3089
- options) {
3090
- return {
3091
- errorMessages: (this.errorMessages || []).slice()
3092
- };
3093
- }
3094
- }
3095
- /**
3096
- * Message implementation for ondewo.nlu.AddTrainingPhrasesFromCSVRequest
3097
- */
3098
- export class AddTrainingPhrasesFromCSVRequest {
3099
- static { this.id = 'ondewo.nlu.AddTrainingPhrasesFromCSVRequest'; }
3100
- /**
3101
- * Deserialize binary data to message
3102
- * @param instance message instance
3103
- */
3104
- static deserializeBinary(bytes) {
3105
- const instance = new AddTrainingPhrasesFromCSVRequest();
3106
- AddTrainingPhrasesFromCSVRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
3107
- return instance;
3108
- }
3109
- /**
3110
- * Check all the properties and set default protobuf values if necessary
3111
- * @param _instance message instance
3112
- */
3113
- static refineValues(_instance) {
3114
- _instance.parent = _instance.parent || '';
3115
- _instance.languageCode = _instance.languageCode || '';
3116
- _instance.csvContents = _instance.csvContents || new Uint8Array();
3117
- _instance.extractEntities = _instance.extractEntities || false;
3118
- _instance.specialCharacters = _instance.specialCharacters || '';
3119
- _instance.trainingPhraseCleanerOptions =
3120
- _instance.trainingPhraseCleanerOptions || undefined;
3121
- _instance.numberOfWorkers = _instance.numberOfWorkers || 0;
3122
- }
3123
- /**
3124
- * Deserializes / reads binary message into message instance using provided binary reader
3125
- * @param _instance message instance
3126
- * @param _reader binary reader instance
3127
- */
3128
- static deserializeBinaryFromReader(_instance, _reader) {
3129
- while (_reader.nextField()) {
3130
- if (_reader.isEndGroup())
3131
- break;
3132
- switch (_reader.getFieldNumber()) {
3133
- case 1:
3134
- _instance.parent = _reader.readString();
3135
- break;
3136
- case 2:
3137
- _instance.languageCode = _reader.readString();
3138
- break;
3139
- case 3:
3140
- _instance.csvContents = _reader.readBytes();
3141
- break;
3142
- case 4:
3143
- _instance.extractEntities = _reader.readBool();
3144
- break;
3145
- case 5:
3146
- _instance.specialCharacters = _reader.readString();
3147
- break;
3148
- case 6:
3149
- _instance.trainingPhraseCleanerOptions = new TrainingPhraseCleanerOptions();
3150
- _reader.readMessage(_instance.trainingPhraseCleanerOptions, TrainingPhraseCleanerOptions.deserializeBinaryFromReader);
3151
- break;
3152
- case 7:
3153
- _instance.numberOfWorkers = _reader.readInt32();
3154
- break;
3155
- default:
3156
- _reader.skipField();
3157
- }
3158
- }
3159
- AddTrainingPhrasesFromCSVRequest.refineValues(_instance);
3160
- }
3161
- /**
3162
- * Serializes a message to binary format using provided binary reader
3163
- * @param _instance message instance
3164
- * @param _writer binary writer instance
3165
- */
3166
- static serializeBinaryToWriter(_instance, _writer) {
3167
- if (_instance.parent) {
3168
- _writer.writeString(1, _instance.parent);
3169
- }
3170
- if (_instance.languageCode) {
3171
- _writer.writeString(2, _instance.languageCode);
3172
- }
3173
- if (_instance.csvContents && _instance.csvContents.length) {
3174
- _writer.writeBytes(3, _instance.csvContents);
3175
- }
3176
- if (_instance.extractEntities) {
3177
- _writer.writeBool(4, _instance.extractEntities);
3178
- }
3179
- if (_instance.specialCharacters) {
3180
- _writer.writeString(5, _instance.specialCharacters);
3181
- }
3182
- if (_instance.trainingPhraseCleanerOptions) {
3183
- _writer.writeMessage(6, _instance.trainingPhraseCleanerOptions, TrainingPhraseCleanerOptions.serializeBinaryToWriter);
3184
- }
3185
- if (_instance.numberOfWorkers) {
3186
- _writer.writeInt32(7, _instance.numberOfWorkers);
3187
- }
3188
- }
3189
- /**
3190
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
3191
- * @param _value initial values object or instance of AddTrainingPhrasesFromCSVRequest to deeply clone from
3192
- */
3193
- constructor(_value) {
3194
- _value = _value || {};
3195
- this.parent = _value.parent;
3196
- this.languageCode = _value.languageCode;
3197
- this.csvContents = _value.csvContents;
3198
- this.extractEntities = _value.extractEntities;
3199
- this.specialCharacters = _value.specialCharacters;
3200
- this.trainingPhraseCleanerOptions = _value.trainingPhraseCleanerOptions
3201
- ? new TrainingPhraseCleanerOptions(_value.trainingPhraseCleanerOptions)
3202
- : undefined;
3203
- this.numberOfWorkers = _value.numberOfWorkers;
3204
- AddTrainingPhrasesFromCSVRequest.refineValues(this);
3205
- }
3206
- get parent() {
3207
- return this._parent;
3208
- }
3209
- set parent(value) {
3210
- this._parent = value;
3211
- }
3212
- get languageCode() {
3213
- return this._languageCode;
3214
- }
3215
- set languageCode(value) {
3216
- this._languageCode = value;
3217
- }
3218
- get csvContents() {
3219
- return this._csvContents;
3220
- }
3221
- set csvContents(value) {
3222
- this._csvContents = value;
3223
- }
3224
- get extractEntities() {
3225
- return this._extractEntities;
3226
- }
3227
- set extractEntities(value) {
3228
- this._extractEntities = value;
3229
- }
3230
- get specialCharacters() {
3231
- return this._specialCharacters;
3232
- }
3233
- set specialCharacters(value) {
3234
- this._specialCharacters = value;
3235
- }
3236
- get trainingPhraseCleanerOptions() {
3237
- return this._trainingPhraseCleanerOptions;
3238
- }
3239
- set trainingPhraseCleanerOptions(value) {
3240
- this._trainingPhraseCleanerOptions = value;
3241
- }
3242
- get numberOfWorkers() {
3243
- return this._numberOfWorkers;
3244
- }
3245
- set numberOfWorkers(value) {
3246
- this._numberOfWorkers = value;
3247
- }
3248
- /**
3249
- * Serialize message to binary data
3250
- * @param instance message instance
3251
- */
3252
- serializeBinary() {
3253
- const writer = new BinaryWriter();
3254
- AddTrainingPhrasesFromCSVRequest.serializeBinaryToWriter(this, writer);
3255
- return writer.getResultBuffer();
3256
- }
3257
- /**
3258
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
3259
- */
3260
- toObject() {
3261
- return {
3262
- parent: this.parent,
3263
- languageCode: this.languageCode,
3264
- csvContents: this.csvContents
3265
- ? this.csvContents.subarray(0)
3266
- : new Uint8Array(),
3267
- extractEntities: this.extractEntities,
3268
- specialCharacters: this.specialCharacters,
3269
- trainingPhraseCleanerOptions: this.trainingPhraseCleanerOptions
3270
- ? this.trainingPhraseCleanerOptions.toObject()
3271
- : undefined,
3272
- numberOfWorkers: this.numberOfWorkers
3273
- };
3274
- }
3275
- /**
3276
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
3277
- */
3278
- toJSON() {
3279
- return this.toObject();
3280
- }
3281
- /**
3282
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
3283
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
3284
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
3285
- */
3286
- toProtobufJSON(
3287
- // @ts-ignore
3288
- options) {
3289
- return {
3290
- parent: this.parent,
3291
- languageCode: this.languageCode,
3292
- csvContents: this.csvContents ? uint8ArrayToBase64(this.csvContents) : '',
3293
- extractEntities: this.extractEntities,
3294
- specialCharacters: this.specialCharacters,
3295
- trainingPhraseCleanerOptions: this.trainingPhraseCleanerOptions
3296
- ? this.trainingPhraseCleanerOptions.toProtobufJSON(options)
3297
- : null,
3298
- numberOfWorkers: this.numberOfWorkers
3299
- };
3300
- }
3301
- }
3302
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbGl0eS5wYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2FwaS9vbmRld28vbmx1L3V0aWxpdHkucGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQixjQUFjO0FBQ2QsRUFBRTtBQUNGLDJCQUEyQjtBQUMzQiw4Q0FBOEM7QUFDOUMsT0FBTyxFQUlMLGtCQUFrQixFQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFTekUsT0FBTyxLQUFLLFlBQVksTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEtBQUssWUFBWSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE1BQU0sQ0FBTixJQUFZLHlCQU1YO0FBTkQsV0FBWSx5QkFBeUI7SUFDbkMsaUdBQW9CLENBQUE7SUFDcEIsbUdBQXFCLENBQUE7SUFDckIsdUdBQXVCLENBQUE7SUFDdkIsbUhBQTZCLENBQUE7SUFDN0IsMklBQXlDLENBQUE7QUFDM0MsQ0FBQyxFQU5XLHlCQUF5QixLQUF6Qix5QkFBeUIsUUFNcEM7QUFDRDs7R0FFRztBQUNILE1BQU0sT0FBTyxvQkFBb0I7YUFDeEIsT0FBRSxHQUFHLGlDQUFpQyxDQUFDO0lBRTlDOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFpQjtRQUN4QyxNQUFNLFFBQVEsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDNUMsb0JBQW9CLENBQUMsMkJBQTJCLENBQzlDLFFBQVEsRUFDUixJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FDeEIsQ0FBQztRQUNGLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQStCO1FBQ2pELFNBQVMsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssSUFB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LElBQUksQ0FBQyxlQUFlO1NBQ3RDLENBQUM7SUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vLyBAdHMtbm9jaGVja1xuLy9cbi8vIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRVxuLy8gRE8gTk9UIE1PRElGWSBJVCEgWU9VUiBDSEFOR0VTIFdJTEwgQkUgTE9TVFxuaW1wb3J0IHtcbiAgR3JwY01lc3NhZ2UsXG4gIFJlY3Vyc2l2ZVBhcnRpYWwsXG4gIFRvUHJvdG9idWZKU09OT3B0aW9ucyxcbiAgdWludDhBcnJheVRvQmFzZTY0XG59IGZyb20gJ0BuZ3gtZ3JwYy9jb21tb24nO1xuaW1wb3J0IHsgQmluYXJ5UmVhZGVyLCBCaW5hcnlXcml0ZXIsIEJ5dGVTb3VyY2UgfSBmcm9tICdnb29nbGUtcHJvdG9idWYnO1xuaW1wb3J0ICogYXMgZ29vZ2xlQXBpMDAwIGZyb20gJy4uLy4uL2dvb2dsZS9hcGkvYW5ub3RhdGlvbnMucGInO1xuaW1wb3J0ICogYXMgb25kZXdvTmx1MDAxIGZyb20gJy4uLy4uL29uZGV3by9ubHUvY29udGV4dC5wYic7XG5pbXBvcnQgKiBhcyBvbmRld29ObHUwMDIgZnJvbSAnLi4vLi4vb25kZXdvL25sdS9jb21tb24ucGInO1xuaW1wb3J0ICogYXMgb25kZXdvTmx1MDAzIGZyb20gJy4uLy4uL29uZGV3by9ubHUvb3BlcmF0aW9ucy5wYic7XG5pbXBvcnQgKiBhcyBnb29nbGVQcm90b2J1ZjAwNCBmcm9tICdAbmd4LWdycGMvd2VsbC1rbm93bi10eXBlcyc7XG5pbXBvcnQgKiBhcyBnb29nbGVQcm90b2J1ZjAwNSBmcm9tICdAbmd4LWdycGMvd2VsbC1rbm93bi10eXBlcyc7XG5pbXBvcnQgKiBhcyBnb29nbGVQcm90b2J1ZjAwNiBmcm9tICdAbmd4LWdycGMvd2VsbC1rbm93bi10eXBlcyc7XG5pbXBvcnQgKiBhcyBnb29nbGVQcm90b2J1ZjAwNyBmcm9tICdAbmd4LWdycGMvd2VsbC1rbm93bi10eXBlcyc7XG5pbXBvcnQgKiBhcyBvbmRld29ObHUwMDggZnJvbSAnLi4vLi4vb25kZXdvL25sdS9pbnRlbnQucGInO1xuaW1wb3J0ICogYXMgb25kZXdvTmx1MDA5IGZyb20gJy4uLy4uL29uZGV3by9ubHUvZW50aXR5LXR5cGUucGInO1xuZXhwb3J0IGVudW0gUmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyB7XG4gIFJFQU5OT1RBVEVfTkVWRVIgPSAwLFxuICBSRUFOTk9UQVRFX0FMV0FZUyA9IDEsXG4gIFJFQU5OT1RBVEVfSUZfRU1QVFkgPSAyLFxuICBSRUFOTk9UQVRFX0FGVEVSX0RFTEVUSU9OID0gMyxcbiAgUkVBTk5PVEFURV9JRl9FTVBUWV9PUl9BRlRFUl9ERUxFVElPTiA9IDRcbn1cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5WYWxpZGF0ZVJlZ2V4UmVxdWVzdFxuICovXG5leHBvcnQgY2xhc3MgVmFsaWRhdGVSZWdleFJlcXVlc3QgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LlZhbGlkYXRlUmVnZXhSZXF1ZXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgVmFsaWRhdGVSZWdleFJlcXVlc3QoKTtcbiAgICBWYWxpZGF0ZVJlZ2V4UmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IFZhbGlkYXRlUmVnZXhSZXF1ZXN0KSB7XG4gICAgX2luc3RhbmNlLnJlZ2V4ID0gX2luc3RhbmNlLnJlZ2V4IHx8ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogVmFsaWRhdGVSZWdleFJlcXVlc3QsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLnJlZ2V4ID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBWYWxpZGF0ZVJlZ2V4UmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IFZhbGlkYXRlUmVnZXhSZXF1ZXN0LFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLnJlZ2V4KSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDEsIF9pbnN0YW5jZS5yZWdleCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVnZXg6IHN0cmluZztcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIFZhbGlkYXRlUmVnZXhSZXF1ZXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPFZhbGlkYXRlUmVnZXhSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnJlZ2V4ID0gX3ZhbHVlLnJlZ2V4O1xuICAgIFZhbGlkYXRlUmVnZXhSZXF1ZXN0LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgcmVnZXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcmVnZXg7XG4gIH1cbiAgc2V0IHJlZ2V4KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9yZWdleCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIFZhbGlkYXRlUmVnZXhSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IFZhbGlkYXRlUmVnZXhSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVnZXg6IHRoaXMucmVnZXhcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBWYWxpZGF0ZVJlZ2V4UmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZ2V4OiB0aGlzLnJlZ2V4XG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBWYWxpZGF0ZVJlZ2V4UmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgVmFsaWRhdGVSZWdleFJlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIHJlZ2V4OiBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgVmFsaWRhdGVSZWdleFJlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIHJlZ2V4OiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1LlZhbGlkYXRlUmVnZXhSZXNwb25zZVxuICovXG5leHBvcnQgY2xhc3MgVmFsaWRhdGVSZWdleFJlc3BvbnNlIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5WYWxpZGF0ZVJlZ2V4UmVzcG9uc2UnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBWYWxpZGF0ZVJlZ2V4UmVzcG9uc2UoKTtcbiAgICBWYWxpZGF0ZVJlZ2V4UmVzcG9uc2UuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBWYWxpZGF0ZVJlZ2V4UmVzcG9uc2UpIHtcbiAgICBfaW5zdGFuY2UuZXJyb3JNZXNzYWdlcyA9IF9pbnN0YW5jZS5lcnJvck1lc3NhZ2VzIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogVmFsaWRhdGVSZWdleFJlc3BvbnNlLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIChfaW5zdGFuY2UuZXJyb3JNZXNzYWdlcyA9IF9pbnN0YW5jZS5lcnJvck1lc3NhZ2VzIHx8IFtdKS5wdXNoKFxuICAgICAgICAgICAgX3JlYWRlci5yZWFkU3RyaW5nKClcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgVmFsaWRhdGVSZWdleFJlc3BvbnNlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogVmFsaWRhdGVSZWdleFJlc3BvbnNlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmVycm9yTWVzc2FnZXMgJiYgX2luc3RhbmNlLmVycm9yTWVzc2FnZXMubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRTdHJpbmcoMSwgX2luc3RhbmNlLmVycm9yTWVzc2FnZXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2Vycm9yTWVzc2FnZXM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgVmFsaWRhdGVSZWdleFJlc3BvbnNlIHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPFZhbGlkYXRlUmVnZXhSZXNwb25zZS5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5lcnJvck1lc3NhZ2VzID0gKF92YWx1ZS5lcnJvck1lc3NhZ2VzIHx8IFtdKS5zbGljZSgpO1xuICAgIFZhbGlkYXRlUmVnZXhSZXNwb25zZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGVycm9yTWVzc2FnZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9lcnJvck1lc3NhZ2VzO1xuICB9XG4gIHNldCBlcnJvck1lc3NhZ2VzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2Vycm9yTWVzc2FnZXMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBWYWxpZGF0ZVJlZ2V4UmVzcG9uc2Uuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogVmFsaWRhdGVSZWdleFJlc3BvbnNlLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3JNZXNzYWdlczogKHRoaXMuZXJyb3JNZXNzYWdlcyB8fCBbXSkuc2xpY2UoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IFZhbGlkYXRlUmVnZXhSZXNwb25zZS5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yTWVzc2FnZXM6ICh0aGlzLmVycm9yTWVzc2FnZXMgfHwgW10pLnNsaWNlKClcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIFZhbGlkYXRlUmVnZXhSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgVmFsaWRhdGVSZWdleFJlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBWYWxpZGF0ZVJlZ2V4UmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5WYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXF1ZXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5WYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXF1ZXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVxdWVzdCgpO1xuICAgIFZhbGlkYXRlRW1iZWRkZWRSZWdleFJlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXF1ZXN0KSB7XG4gICAgX2luc3RhbmNlLmVudGl0eVR5cGUgPSBfaW5zdGFuY2UuZW50aXR5VHlwZSB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlID0gbmV3IG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlLkVudGl0eSgpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UuZW50aXR5VHlwZSxcbiAgICAgICAgICAgIG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlLkVudGl0eS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IFZhbGlkYXRlRW1iZWRkZWRSZWdleFJlcXVlc3QsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UuZW50aXR5VHlwZSkge1xuICAgICAgX3dyaXRlci53cml0ZU1lc3NhZ2UoXG4gICAgICAgIDEsXG4gICAgICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlIGFzIGFueSxcbiAgICAgICAgb25kZXdvTmx1MDA5LkVudGl0eVR5cGUuRW50aXR5LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2VudGl0eVR5cGU/OiBvbmRld29ObHUwMDkuRW50aXR5VHlwZS5FbnRpdHk7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXF1ZXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPFZhbGlkYXRlRW1iZWRkZWRSZWdleFJlcXVlc3QuQXNPYmplY3Q+XG4gICkge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLmVudGl0eVR5cGUgPSBfdmFsdWUuZW50aXR5VHlwZVxuICAgICAgPyBuZXcgb25kZXdvTmx1MDA5LkVudGl0eVR5cGUuRW50aXR5KF92YWx1ZS5lbnRpdHlUeXBlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVxdWVzdC5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGVudGl0eVR5cGUoKTogb25kZXdvTmx1MDA5LkVudGl0eVR5cGUuRW50aXR5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZW50aXR5VHlwZTtcbiAgfVxuICBzZXQgZW50aXR5VHlwZSh2YWx1ZTogb25kZXdvTmx1MDA5LkVudGl0eVR5cGUuRW50aXR5IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZW50aXR5VHlwZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIFZhbGlkYXRlRW1iZWRkZWRSZWdleFJlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVxdWVzdC5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudGl0eVR5cGU6IHRoaXMuZW50aXR5VHlwZSA/IHRoaXMuZW50aXR5VHlwZS50b09iamVjdCgpIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudGl0eVR5cGU6IHRoaXMuZW50aXR5VHlwZVxuICAgICAgICA/IHRoaXMuZW50aXR5VHlwZS50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgICA6IG51bGxcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIFZhbGlkYXRlRW1iZWRkZWRSZWdleFJlcXVlc3Qge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIFZhbGlkYXRlRW1iZWRkZWRSZWdleFJlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIGVudGl0eVR5cGU/OiBvbmRld29ObHUwMDkuRW50aXR5VHlwZS5FbnRpdHkuQXNPYmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgZW50aXR5VHlwZTogb25kZXdvTmx1MDA5LkVudGl0eVR5cGUuRW50aXR5LkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGNsYXNzIFZhbGlkYXRlRW1iZWRkZWRSZWdleFJlc3BvbnNlIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5WYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXNwb25zZSc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFZhbGlkYXRlRW1iZWRkZWRSZWdleFJlc3BvbnNlKCk7XG4gICAgVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVzcG9uc2UuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXNwb25zZSkge1xuICAgIF9pbnN0YW5jZS5lcnJvck1lc3NhZ2VzID0gX2luc3RhbmNlLmVycm9yTWVzc2FnZXMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXNwb25zZSxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAoX2luc3RhbmNlLmVycm9yTWVzc2FnZXMgPSBfaW5zdGFuY2UuZXJyb3JNZXNzYWdlcyB8fCBbXSkucHVzaChcbiAgICAgICAgICAgIF9yZWFkZXIucmVhZFN0cmluZygpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIFZhbGlkYXRlRW1iZWRkZWRSZWdleFJlc3BvbnNlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVzcG9uc2UsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UuZXJyb3JNZXNzYWdlcyAmJiBfaW5zdGFuY2UuZXJyb3JNZXNzYWdlcy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZFN0cmluZygxLCBfaW5zdGFuY2UuZXJyb3JNZXNzYWdlcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZXJyb3JNZXNzYWdlczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXNwb25zZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXNwb25zZS5Bc09iamVjdD5cbiAgKSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlcyA9IChfdmFsdWUuZXJyb3JNZXNzYWdlcyB8fCBbXSkuc2xpY2UoKTtcbiAgICBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXNwb25zZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGVycm9yTWVzc2FnZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9lcnJvck1lc3NhZ2VzO1xuICB9XG4gIHNldCBlcnJvck1lc3NhZ2VzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2Vycm9yTWVzc2FnZXMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXNwb25zZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXNwb25zZS5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yTWVzc2FnZXM6ICh0aGlzLmVycm9yTWVzc2FnZXMgfHwgW10pLnNsaWNlKClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXNwb25zZS5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yTWVzc2FnZXM6ICh0aGlzLmVycm9yTWVzc2FnZXMgfHwgW10pLnNsaWNlKClcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIFZhbGlkYXRlRW1iZWRkZWRSZWdleFJlc3BvbnNlIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBWYWxpZGF0ZUVtYmVkZGVkUmVnZXhSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgZXJyb3JNZXNzYWdlczogc3RyaW5nW107XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgVmFsaWRhdGVFbWJlZGRlZFJlZ2V4UmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5DbGVhbkFsbEludGVudHNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBDbGVhbkFsbEludGVudHNSZXF1ZXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5DbGVhbkFsbEludGVudHNSZXF1ZXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQ2xlYW5BbGxJbnRlbnRzUmVxdWVzdCgpO1xuICAgIENsZWFuQWxsSW50ZW50c1JlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBDbGVhbkFsbEludGVudHNSZXF1ZXN0KSB7XG4gICAgX2luc3RhbmNlLnBhcmVudCA9IF9pbnN0YW5jZS5wYXJlbnQgfHwgJyc7XG4gICAgX2luc3RhbmNlLmxhbmd1YWdlQ29kZSA9IF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUgfHwgJyc7XG4gICAgX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzID0gX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzIHx8ICcnO1xuICAgIF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QgPSBfaW5zdGFuY2Uuc3Vic3RyaW5nV2hpdGVMaXN0IHx8IFtdO1xuICAgIF9pbnN0YW5jZS5kcnlSdW4gPSBfaW5zdGFuY2UuZHJ5UnVuIHx8IGZhbHNlO1xuICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zID1cbiAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zIHx8IHVuZGVmaW5lZDtcbiAgICBfaW5zdGFuY2UucmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyA9XG4gICAgICBfaW5zdGFuY2UucmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyB8fCAwO1xuICAgIF9pbnN0YW5jZS5udW1iZXJPZldvcmtlcnMgPSBfaW5zdGFuY2UubnVtYmVyT2ZXb3JrZXJzIHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBDbGVhbkFsbEludGVudHNSZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5wYXJlbnQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIF9pbnN0YW5jZS5zcGVjaWFsQ2hhcmFjdGVycyA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgKF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QgPVxuICAgICAgICAgICAgX2luc3RhbmNlLnN1YnN0cmluZ1doaXRlTGlzdCB8fCBbXSkucHVzaChfcmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBfaW5zdGFuY2UuZHJ5UnVuID0gX3JlYWRlci5yZWFkQm9vbCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgPSBuZXcgVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucygpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyxcbiAgICAgICAgICAgIFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIF9pbnN0YW5jZS5yZWFubm90YXRlRW50aXRpZXNPcHRpb25zID0gX3JlYWRlci5yZWFkRW51bSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgX2luc3RhbmNlLm51bWJlck9mV29ya2VycyA9IF9yZWFkZXIucmVhZEludDMyKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDbGVhbkFsbEludGVudHNSZXF1ZXN0LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogQ2xlYW5BbGxJbnRlbnRzUmVxdWVzdCxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5wYXJlbnQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLnBhcmVudCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDIsIF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDMsIF9pbnN0YW5jZS5zcGVjaWFsQ2hhcmFjdGVycyk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2Uuc3Vic3RyaW5nV2hpdGVMaXN0ICYmIF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRTdHJpbmcoNCwgX2luc3RhbmNlLnN1YnN0cmluZ1doaXRlTGlzdCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuZHJ5UnVuKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQm9vbCg1LCBfaW5zdGFuY2UuZHJ5UnVuKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zKSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgNixcbiAgICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgYXMgYW55LFxuICAgICAgICBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVFbnVtKDcsIF9pbnN0YW5jZS5yZWFubm90YXRlRW50aXRpZXNPcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5udW1iZXJPZldvcmtlcnMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVJbnQzMig4LCBfaW5zdGFuY2UubnVtYmVyT2ZXb3JrZXJzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXJlbnQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2VDb2RlOiBzdHJpbmc7XG4gIHByaXZhdGUgX3NwZWNpYWxDaGFyYWN0ZXJzOiBzdHJpbmc7XG4gIHByaXZhdGUgX3N1YnN0cmluZ1doaXRlTGlzdDogc3RyaW5nW107XG4gIHByaXZhdGUgX2RyeVJ1bjogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucz86IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnM7XG4gIHByaXZhdGUgX3JlYW5ub3RhdGVFbnRpdGllc09wdGlvbnM6IFJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnM7XG4gIHByaXZhdGUgX251bWJlck9mV29ya2VyczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgQ2xlYW5BbGxJbnRlbnRzUmVxdWVzdCB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxDbGVhbkFsbEludGVudHNSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnBhcmVudCA9IF92YWx1ZS5wYXJlbnQ7XG4gICAgdGhpcy5sYW5ndWFnZUNvZGUgPSBfdmFsdWUubGFuZ3VhZ2VDb2RlO1xuICAgIHRoaXMuc3BlY2lhbENoYXJhY3RlcnMgPSBfdmFsdWUuc3BlY2lhbENoYXJhY3RlcnM7XG4gICAgdGhpcy5zdWJzdHJpbmdXaGl0ZUxpc3QgPSAoX3ZhbHVlLnN1YnN0cmluZ1doaXRlTGlzdCB8fCBbXSkuc2xpY2UoKTtcbiAgICB0aGlzLmRyeVJ1biA9IF92YWx1ZS5kcnlSdW47XG4gICAgdGhpcy50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zID0gX3ZhbHVlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnNcbiAgICAgID8gbmV3IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMoX3ZhbHVlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnMgPSBfdmFsdWUucmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucztcbiAgICB0aGlzLm51bWJlck9mV29ya2VycyA9IF92YWx1ZS5udW1iZXJPZldvcmtlcnM7XG4gICAgQ2xlYW5BbGxJbnRlbnRzUmVxdWVzdC5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IHBhcmVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnQ7XG4gIH1cbiAgc2V0IHBhcmVudCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcGFyZW50ID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGxhbmd1YWdlQ29kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZUNvZGU7XG4gIH1cbiAgc2V0IGxhbmd1YWdlQ29kZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbGFuZ3VhZ2VDb2RlID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHNwZWNpYWxDaGFyYWN0ZXJzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NwZWNpYWxDaGFyYWN0ZXJzO1xuICB9XG4gIHNldCBzcGVjaWFsQ2hhcmFjdGVycyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fc3BlY2lhbENoYXJhY3RlcnMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgc3Vic3RyaW5nV2hpdGVMaXN0KCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fc3Vic3RyaW5nV2hpdGVMaXN0O1xuICB9XG4gIHNldCBzdWJzdHJpbmdXaGl0ZUxpc3QodmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fc3Vic3RyaW5nV2hpdGVMaXN0ID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGRyeVJ1bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZHJ5UnVuO1xuICB9XG4gIHNldCBkcnlSdW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kcnlSdW4gPSB2YWx1ZTtcbiAgfVxuICBnZXQgdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucygpOiBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucztcbiAgfVxuICBzZXQgdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyhcbiAgICB2YWx1ZTogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyB8IHVuZGVmaW5lZFxuICApIHtcbiAgICB0aGlzLl90cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnMoKTogUmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYW5ub3RhdGVFbnRpdGllc09wdGlvbnM7XG4gIH1cbiAgc2V0IHJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnModmFsdWU6IFJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnMpIHtcbiAgICB0aGlzLl9yZWFubm90YXRlRW50aXRpZXNPcHRpb25zID0gdmFsdWU7XG4gIH1cbiAgZ2V0IG51bWJlck9mV29ya2VycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9udW1iZXJPZldvcmtlcnM7XG4gIH1cbiAgc2V0IG51bWJlck9mV29ya2Vycyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbnVtYmVyT2ZXb3JrZXJzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgQ2xlYW5BbGxJbnRlbnRzUmVxdWVzdC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBDbGVhbkFsbEludGVudHNSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyZW50OiB0aGlzLnBhcmVudCxcbiAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUsXG4gICAgICBzcGVjaWFsQ2hhcmFjdGVyczogdGhpcy5zcGVjaWFsQ2hhcmFjdGVycyxcbiAgICAgIHN1YnN0cmluZ1doaXRlTGlzdDogKHRoaXMuc3Vic3RyaW5nV2hpdGVMaXN0IHx8IFtdKS5zbGljZSgpLFxuICAgICAgZHJ5UnVuOiB0aGlzLmRyeVJ1bixcbiAgICAgIHRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnM6IHRoaXMudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uc1xuICAgICAgICA/IHRoaXMudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucy50b09iamVjdCgpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgcmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9uczogdGhpcy5yZWFubm90YXRlRW50aXRpZXNPcHRpb25zLFxuICAgICAgbnVtYmVyT2ZXb3JrZXJzOiB0aGlzLm51bWJlck9mV29ya2Vyc1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IENsZWFuQWxsSW50ZW50c1JlcXVlc3QuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgbGFuZ3VhZ2VDb2RlOiB0aGlzLmxhbmd1YWdlQ29kZSxcbiAgICAgIHNwZWNpYWxDaGFyYWN0ZXJzOiB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLFxuICAgICAgc3Vic3RyaW5nV2hpdGVMaXN0OiAodGhpcy5zdWJzdHJpbmdXaGl0ZUxpc3QgfHwgW10pLnNsaWNlKCksXG4gICAgICBkcnlSdW46IHRoaXMuZHJ5UnVuLFxuICAgICAgdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uczogdGhpcy50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zXG4gICAgICAgID8gdGhpcy50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICAgIDogbnVsbCxcbiAgICAgIHJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnM6XG4gICAgICAgIFJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnNbXG4gICAgICAgICAgdGhpcy5yZWFubm90YXRlRW50aXRpZXNPcHRpb25zID09PSBudWxsIHx8XG4gICAgICAgICAgdGhpcy5yZWFubm90YXRlRW50aXRpZXNPcHRpb25zID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiB0aGlzLnJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnNcbiAgICAgICAgXSxcbiAgICAgIG51bWJlck9mV29ya2VyczogdGhpcy5udW1iZXJPZldvcmtlcnNcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIENsZWFuQWxsSW50ZW50c1JlcXVlc3Qge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIENsZWFuQWxsSW50ZW50c1JlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIHBhcmVudDogc3RyaW5nO1xuICAgIGxhbmd1YWdlQ29kZTogc3RyaW5nO1xuICAgIHNwZWNpYWxDaGFyYWN0ZXJzOiBzdHJpbmc7XG4gICAgc3Vic3RyaW5nV2hpdGVMaXN0OiBzdHJpbmdbXTtcbiAgICBkcnlSdW46IGJvb2xlYW47XG4gICAgdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucz86IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMuQXNPYmplY3Q7XG4gICAgcmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9uczogUmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucztcbiAgICBudW1iZXJPZldvcmtlcnM6IG51bWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBDbGVhbkFsbEludGVudHNSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBwYXJlbnQ6IHN0cmluZztcbiAgICBsYW5ndWFnZUNvZGU6IHN0cmluZztcbiAgICBzcGVjaWFsQ2hhcmFjdGVyczogc3RyaW5nO1xuICAgIHN1YnN0cmluZ1doaXRlTGlzdDogc3RyaW5nW107XG4gICAgZHJ5UnVuOiBib29sZWFuO1xuICAgIHRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnM6IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMuQXNQcm90b2J1ZkpTT04gfCBudWxsO1xuICAgIHJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnM6IHN0cmluZztcbiAgICBudW1iZXJPZldvcmtlcnM6IG51bWJlcjtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuQ2xlYW5BbGxJbnRlbnRzUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGNsYXNzIENsZWFuQWxsSW50ZW50c1Jlc3BvbnNlIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5DbGVhbkFsbEludGVudHNSZXNwb25zZSc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IENsZWFuQWxsSW50ZW50c1Jlc3BvbnNlKCk7XG4gICAgQ2xlYW5BbGxJbnRlbnRzUmVzcG9uc2UuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBDbGVhbkFsbEludGVudHNSZXNwb25zZSkge1xuICAgIF9pbnN0YW5jZS5jbGVhbmVkSW50ZW50cyA9IF9pbnN0YW5jZS5jbGVhbmVkSW50ZW50cyB8fCBbXTtcbiAgICBfaW5zdGFuY2UuaW50ZW50VXBkYXRlTGlzdCA9IF9pbnN0YW5jZS5pbnRlbnRVcGRhdGVMaXN0IHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogQ2xlYW5BbGxJbnRlbnRzUmVzcG9uc2UsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUluaXRpYWxpemVyMSA9IG5ldyBvbmRld29ObHUwMDguSW50ZW50KCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjEsXG4gICAgICAgICAgICBvbmRld29ObHUwMDguSW50ZW50LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgKF9pbnN0YW5jZS5jbGVhbmVkSW50ZW50cyA9IF9pbnN0YW5jZS5jbGVhbmVkSW50ZW50cyB8fCBbXSkucHVzaChcbiAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjFcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUluaXRpYWxpemVyMiA9IG5ldyBJbnRlbnRVcGRhdGUoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMixcbiAgICAgICAgICAgIEludGVudFVwZGF0ZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIChfaW5zdGFuY2UuaW50ZW50VXBkYXRlTGlzdCA9IF9pbnN0YW5jZS5pbnRlbnRVcGRhdGVMaXN0IHx8IFtdKS5wdXNoKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDbGVhbkFsbEludGVudHNSZXNwb25zZS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IENsZWFuQWxsSW50ZW50c1Jlc3BvbnNlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmNsZWFuZWRJbnRlbnRzICYmIF9pbnN0YW5jZS5jbGVhbmVkSW50ZW50cy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDEsXG4gICAgICAgIF9pbnN0YW5jZS5jbGVhbmVkSW50ZW50cyBhcyBhbnksXG4gICAgICAgIG9uZGV3b05sdTAwOC5JbnRlbnQuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuaW50ZW50VXBkYXRlTGlzdCAmJiBfaW5zdGFuY2UuaW50ZW50VXBkYXRlTGlzdC5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDIsXG4gICAgICAgIF9pbnN0YW5jZS5pbnRlbnRVcGRhdGVMaXN0IGFzIGFueSxcbiAgICAgICAgSW50ZW50VXBkYXRlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NsZWFuZWRJbnRlbnRzPzogb25kZXdvTmx1MDA4LkludGVudFtdO1xuICBwcml2YXRlIF9pbnRlbnRVcGRhdGVMaXN0PzogSW50ZW50VXBkYXRlW107XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBDbGVhbkFsbEludGVudHNSZXNwb25zZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxDbGVhbkFsbEludGVudHNSZXNwb25zZS5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5jbGVhbmVkSW50ZW50cyA9IChfdmFsdWUuY2xlYW5lZEludGVudHMgfHwgW10pLm1hcChcbiAgICAgIG0gPT4gbmV3IG9uZGV3b05sdTAwOC5JbnRlbnQobSlcbiAgICApO1xuICAgIHRoaXMuaW50ZW50VXBkYXRlTGlzdCA9IChfdmFsdWUuaW50ZW50VXBkYXRlTGlzdCB8fCBbXSkubWFwKFxuICAgICAgbSA9PiBuZXcgSW50ZW50VXBkYXRlKG0pXG4gICAgKTtcbiAgICBDbGVhbkFsbEludGVudHNSZXNwb25zZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGNsZWFuZWRJbnRlbnRzKCk6IG9uZGV3b05sdTAwOC5JbnRlbnRbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NsZWFuZWRJbnRlbnRzO1xuICB9XG4gIHNldCBjbGVhbmVkSW50ZW50cyh2YWx1ZTogb25kZXdvTmx1MDA4LkludGVudFtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fY2xlYW5lZEludGVudHMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgaW50ZW50VXBkYXRlTGlzdCgpOiBJbnRlbnRVcGRhdGVbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVudFVwZGF0ZUxpc3Q7XG4gIH1cbiAgc2V0IGludGVudFVwZGF0ZUxpc3QodmFsdWU6IEludGVudFVwZGF0ZVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5faW50ZW50VXBkYXRlTGlzdCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIENsZWFuQWxsSW50ZW50c1Jlc3BvbnNlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IENsZWFuQWxsSW50ZW50c1Jlc3BvbnNlLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xlYW5lZEludGVudHM6ICh0aGlzLmNsZWFuZWRJbnRlbnRzIHx8IFtdKS5tYXAobSA9PiBtLnRvT2JqZWN0KCkpLFxuICAgICAgaW50ZW50VXBkYXRlTGlzdDogKHRoaXMuaW50ZW50VXBkYXRlTGlzdCB8fCBbXSkubWFwKG0gPT4gbS50b09iamVjdCgpKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IENsZWFuQWxsSW50ZW50c1Jlc3BvbnNlLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xlYW5lZEludGVudHM6ICh0aGlzLmNsZWFuZWRJbnRlbnRzIHx8IFtdKS5tYXAobSA9PlxuICAgICAgICBtLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICApLFxuICAgICAgaW50ZW50VXBkYXRlTGlzdDogKHRoaXMuaW50ZW50VXBkYXRlTGlzdCB8fCBbXSkubWFwKG0gPT5cbiAgICAgICAgbS50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgKVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgQ2xlYW5BbGxJbnRlbnRzUmVzcG9uc2Uge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIENsZWFuQWxsSW50ZW50c1Jlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBjbGVhbmVkSW50ZW50cz86IG9uZGV3b05sdTAwOC5JbnRlbnQuQXNPYmplY3RbXTtcbiAgICBpbnRlbnRVcGRhdGVMaXN0PzogSW50ZW50VXBkYXRlLkFzT2JqZWN0W107XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgQ2xlYW5BbGxJbnRlbnRzUmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIGNsZWFuZWRJbnRlbnRzOiBvbmRld29ObHUwMDguSW50ZW50LkFzUHJvdG9idWZKU09OW10gfCBudWxsO1xuICAgIGludGVudFVwZGF0ZUxpc3Q6IEludGVudFVwZGF0ZS5Bc1Byb3RvYnVmSlNPTltdIHwgbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuQ2xlYW5JbnRlbnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBDbGVhbkludGVudFJlcXVlc3QgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LkNsZWFuSW50ZW50UmVxdWVzdCc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IENsZWFuSW50ZW50UmVxdWVzdCgpO1xuICAgIENsZWFuSW50ZW50UmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IENsZWFuSW50ZW50UmVxdWVzdCkge1xuICAgIF9pbnN0YW5jZS5wYXJlbnQgPSBfaW5zdGFuY2UucGFyZW50IHx8ICcnO1xuICAgIF9pbnN0YW5jZS5pbnRlbnROYW1lID0gX2luc3RhbmNlLmludGVudE5hbWUgfHwgJyc7XG4gICAgX2luc3RhbmNlLmxhbmd1YWdlQ29kZSA9IF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUgfHwgJyc7XG4gICAgX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzID0gX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzIHx8ICcnO1xuICAgIF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QgPSBfaW5zdGFuY2Uuc3Vic3RyaW5nV2hpdGVMaXN0IHx8IFtdO1xuICAgIF9pbnN0YW5jZS5kcnlSdW4gPSBfaW5zdGFuY2UuZHJ5UnVuIHx8IGZhbHNlO1xuICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zID1cbiAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zIHx8IHVuZGVmaW5lZDtcbiAgICBfaW5zdGFuY2UucmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyA9XG4gICAgICBfaW5zdGFuY2UucmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogQ2xlYW5JbnRlbnRSZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5wYXJlbnQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIF9pbnN0YW5jZS5pbnRlbnROYW1lID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIChfaW5zdGFuY2Uuc3Vic3RyaW5nV2hpdGVMaXN0ID1cbiAgICAgICAgICAgIF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QgfHwgW10pLnB1c2goX3JlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgX2luc3RhbmNlLmRyeVJ1biA9IF9yZWFkZXIucmVhZEJvb2woKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zID0gbmV3IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMsXG4gICAgICAgICAgICBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBfaW5zdGFuY2UucmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyA9IF9yZWFkZXIucmVhZEVudW0oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIENsZWFuSW50ZW50UmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IENsZWFuSW50ZW50UmVxdWVzdCxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5wYXJlbnQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLnBhcmVudCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuaW50ZW50TmFtZSkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygyLCBfaW5zdGFuY2UuaW50ZW50TmFtZSk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDMsIF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDQsIF9pbnN0YW5jZS5zcGVjaWFsQ2hhcmFjdGVycyk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2Uuc3Vic3RyaW5nV2hpdGVMaXN0ICYmIF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRTdHJpbmcoNSwgX2luc3RhbmNlLnN1YnN0cmluZ1doaXRlTGlzdCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuZHJ5UnVuKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQm9vbCg2LCBfaW5zdGFuY2UuZHJ5UnVuKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zKSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgNyxcbiAgICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgYXMgYW55LFxuICAgICAgICBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVFbnVtKDgsIF9pbnN0YW5jZS5yZWFubm90YXRlRW50aXRpZXNPcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXJlbnQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfaW50ZW50TmFtZTogc3RyaW5nO1xuICBwcml2YXRlIF9sYW5ndWFnZUNvZGU6IHN0cmluZztcbiAgcHJpdmF0ZSBfc3BlY2lhbENoYXJhY3RlcnM6IHN0cmluZztcbiAgcHJpdmF0ZSBfc3Vic3RyaW5nV2hpdGVMaXN0OiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSBfZHJ5UnVuOiBib29sZWFuO1xuICBwcml2YXRlIF90cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zPzogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucztcbiAgcHJpdmF0ZSBfcmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9uczogUmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucztcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIENsZWFuSW50ZW50UmVxdWVzdCB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxDbGVhbkludGVudFJlcXVlc3QuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMucGFyZW50ID0gX3ZhbHVlLnBhcmVudDtcbiAgICB0aGlzLmludGVudE5hbWUgPSBfdmFsdWUuaW50ZW50TmFtZTtcbiAgICB0aGlzLmxhbmd1YWdlQ29kZSA9IF92YWx1ZS5sYW5ndWFnZUNvZGU7XG4gICAgdGhpcy5zcGVjaWFsQ2hhcmFjdGVycyA9IF92YWx1ZS5zcGVjaWFsQ2hhcmFjdGVycztcbiAgICB0aGlzLnN1YnN0cmluZ1doaXRlTGlzdCA9IChfdmFsdWUuc3Vic3RyaW5nV2hpdGVMaXN0IHx8IFtdKS5zbGljZSgpO1xuICAgIHRoaXMuZHJ5UnVuID0gX3ZhbHVlLmRyeVJ1bjtcbiAgICB0aGlzLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgPSBfdmFsdWUudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uc1xuICAgICAgPyBuZXcgVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyhfdmFsdWUudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucylcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyA9IF92YWx1ZS5yZWFubm90YXRlRW50aXRpZXNPcHRpb25zO1xuICAgIENsZWFuSW50ZW50UmVxdWVzdC5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IHBhcmVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnQ7XG4gIH1cbiAgc2V0IHBhcmVudCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcGFyZW50ID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGludGVudE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faW50ZW50TmFtZTtcbiAgfVxuICBzZXQgaW50ZW50TmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5faW50ZW50TmFtZSA9IHZhbHVlO1xuICB9XG4gIGdldCBsYW5ndWFnZUNvZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VDb2RlO1xuICB9XG4gIHNldCBsYW5ndWFnZUNvZGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2xhbmd1YWdlQ29kZSA9IHZhbHVlO1xuICB9XG4gIGdldCBzcGVjaWFsQ2hhcmFjdGVycygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zcGVjaWFsQ2hhcmFjdGVycztcbiAgfVxuICBzZXQgc3BlY2lhbENoYXJhY3RlcnModmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3NwZWNpYWxDaGFyYWN0ZXJzID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHN1YnN0cmluZ1doaXRlTGlzdCgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3N1YnN0cmluZ1doaXRlTGlzdDtcbiAgfVxuICBzZXQgc3Vic3RyaW5nV2hpdGVMaXN0KHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX3N1YnN0cmluZ1doaXRlTGlzdCA9IHZhbHVlO1xuICB9XG4gIGdldCBkcnlSdW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2RyeVJ1bjtcbiAgfVxuICBzZXQgZHJ5UnVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZHJ5UnVuID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMoKTogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnM7XG4gIH1cbiAgc2V0IHRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMoXG4gICAgdmFsdWU6IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgdGhpcy5fdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyA9IHZhbHVlO1xuICB9XG4gIGdldCByZWFubm90YXRlRW50aXRpZXNPcHRpb25zKCk6IFJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLl9yZWFubm90YXRlRW50aXRpZXNPcHRpb25zO1xuICB9XG4gIHNldCByZWFubm90YXRlRW50aXRpZXNPcHRpb25zKHZhbHVlOiBSZWFubm90YXRlRW50aXRpZXNPcHRpb25zKSB7XG4gICAgdGhpcy5fcmVhbm5vdGF0ZUVudGl0aWVzT3B0aW9ucyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIENsZWFuSW50ZW50UmVxdWVzdC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBDbGVhbkludGVudFJlcXVlc3QuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgaW50ZW50TmFtZTogdGhpcy5pbnRlbnROYW1lLFxuICAgICAgbGFuZ3VhZ2VDb2RlOiB0aGlzLmxhbmd1YWdlQ29kZSxcbiAgICAgIHNwZWNpYWxDaGFyYWN0ZXJzOiB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLFxuICAgICAgc3Vic3RyaW5nV2hpdGVMaXN0OiAodGhpcy5zdWJzdHJpbmdXaGl0ZUxpc3QgfHwgW10pLnNsaWNlKCksXG4gICAgICBkcnlSdW46IHRoaXMuZHJ5UnVuLFxuICAgICAgdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uczogdGhpcy50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zXG4gICAgICAgID8gdGhpcy50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLnRvT2JqZWN0KClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICByZWFubm90YXRlRW50aXRpZXNPcHRpb25zOiB0aGlzLnJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBDbGVhbkludGVudFJlcXVlc3QuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgaW50ZW50TmFtZTogdGhpcy5pbnRlbnROYW1lLFxuICAgICAgbGFuZ3VhZ2VDb2RlOiB0aGlzLmxhbmd1YWdlQ29kZSxcbiAgICAgIHNwZWNpYWxDaGFyYWN0ZXJzOiB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLFxuICAgICAgc3Vic3RyaW5nV2hpdGVMaXN0OiAodGhpcy5zdWJzdHJpbmdXaGl0ZUxpc3QgfHwgW10pLnNsaWNlKCksXG4gICAgICBkcnlSdW46IHRoaXMuZHJ5UnVuLFxuICAgICAgdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uczogdGhpcy50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zXG4gICAgICAgID8gdGhpcy50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICAgIDogbnVsbCxcbiAgICAgIHJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnM6XG4gICAgICAgIFJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnNbXG4gICAgICAgICAgdGhpcy5yZWFubm90YXRlRW50aXRpZXNPcHRpb25zID09PSBudWxsIHx8XG4gICAgICAgICAgdGhpcy5yZWFubm90YXRlRW50aXRpZXNPcHRpb25zID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiB0aGlzLnJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnNcbiAgICAgICAgXVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgQ2xlYW5JbnRlbnRSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBDbGVhbkludGVudFJlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIHBhcmVudDogc3RyaW5nO1xuICAgIGludGVudE5hbWU6IHN0cmluZztcbiAgICBsYW5ndWFnZUNvZGU6IHN0cmluZztcbiAgICBzcGVjaWFsQ2hhcmFjdGVyczogc3RyaW5nO1xuICAgIHN1YnN0cmluZ1doaXRlTGlzdDogc3RyaW5nW107XG4gICAgZHJ5UnVuOiBib29sZWFuO1xuICAgIHRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnM/OiBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLkFzT2JqZWN0O1xuICAgIHJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnM6IFJlYW5ub3RhdGVFbnRpdGllc09wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgQ2xlYW5JbnRlbnRSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBwYXJlbnQ6IHN0cmluZztcbiAgICBpbnRlbnROYW1lOiBzdHJpbmc7XG4gICAgbGFuZ3VhZ2VDb2RlOiBzdHJpbmc7XG4gICAgc3BlY2lhbENoYXJhY3RlcnM6IHN0cmluZztcbiAgICBzdWJzdHJpbmdXaGl0ZUxpc3Q6IHN0cmluZ1tdO1xuICAgIGRyeVJ1bjogYm9vbGVhbjtcbiAgICB0cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zOiBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgICByZWFubm90YXRlRW50aXRpZXNPcHRpb25zOiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1LkNsZWFuSW50ZW50UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGNsYXNzIENsZWFuSW50ZW50UmVzcG9uc2UgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LkNsZWFuSW50ZW50UmVzcG9uc2UnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBDbGVhbkludGVudFJlc3BvbnNlKCk7XG4gICAgQ2xlYW5JbnRlbnRSZXNwb25zZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IENsZWFuSW50ZW50UmVzcG9uc2UpIHtcbiAgICBfaW5zdGFuY2UuY2xlYW5lZEludGVudCA9IF9pbnN0YW5jZS5jbGVhbmVkSW50ZW50IHx8IHVuZGVmaW5lZDtcbiAgICBfaW5zdGFuY2UuaW50ZW50VXBkYXRlID0gX2luc3RhbmNlLmludGVudFVwZGF0ZSB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBDbGVhbkludGVudFJlc3BvbnNlLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5jbGVhbmVkSW50ZW50ID0gbmV3IG9uZGV3b05sdTAwOC5JbnRlbnQoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLmNsZWFuZWRJbnRlbnQsXG4gICAgICAgICAgICBvbmRld29ObHUwMDguSW50ZW50LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UuaW50ZW50VXBkYXRlID0gbmV3IEludGVudFVwZGF0ZSgpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UuaW50ZW50VXBkYXRlLFxuICAgICAgICAgICAgSW50ZW50VXBkYXRlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDbGVhbkludGVudFJlc3BvbnNlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogQ2xlYW5JbnRlbnRSZXNwb25zZSxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5jbGVhbmVkSW50ZW50KSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgMSxcbiAgICAgICAgX2luc3RhbmNlLmNsZWFuZWRJbnRlbnQgYXMgYW55LFxuICAgICAgICBvbmRld29ObHUwMDguSW50ZW50LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmludGVudFVwZGF0ZSkge1xuICAgICAgX3dyaXRlci53cml0ZU1lc3NhZ2UoXG4gICAgICAgIDIsXG4gICAgICAgIF9pbnN0YW5jZS5pbnRlbnRVcGRhdGUgYXMgYW55LFxuICAgICAgICBJbnRlbnRVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2xlYW5lZEludGVudD86IG9uZGV3b05sdTAwOC5JbnRlbnQ7XG4gIHByaXZhdGUgX2ludGVudFVwZGF0ZT86IEludGVudFVwZGF0ZTtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIENsZWFuSW50ZW50UmVzcG9uc2UgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8Q2xlYW5JbnRlbnRSZXNwb25zZS5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5jbGVhbmVkSW50ZW50ID0gX3ZhbHVlLmNsZWFuZWRJbnRlbnRcbiAgICAgID8gbmV3IG9uZGV3b05sdTAwOC5JbnRlbnQoX3ZhbHVlLmNsZWFuZWRJbnRlbnQpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmludGVudFVwZGF0ZSA9IF92YWx1ZS5pbnRlbnRVcGRhdGVcbiAgICAgID8gbmV3IEludGVudFVwZGF0ZShfdmFsdWUuaW50ZW50VXBkYXRlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgQ2xlYW5JbnRlbnRSZXNwb25zZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGNsZWFuZWRJbnRlbnQoKTogb25kZXdvTmx1MDA4LkludGVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NsZWFuZWRJbnRlbnQ7XG4gIH1cbiAgc2V0IGNsZWFuZWRJbnRlbnQodmFsdWU6IG9uZGV3b05sdTAwOC5JbnRlbnQgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9jbGVhbmVkSW50ZW50ID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGludGVudFVwZGF0ZSgpOiBJbnRlbnRVcGRhdGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pbnRlbnRVcGRhdGU7XG4gIH1cbiAgc2V0IGludGVudFVwZGF0ZSh2YWx1ZTogSW50ZW50VXBkYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5faW50ZW50VXBkYXRlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgQ2xlYW5JbnRlbnRSZXNwb25zZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBDbGVhbkludGVudFJlc3BvbnNlLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xlYW5lZEludGVudDogdGhpcy5jbGVhbmVkSW50ZW50XG4gICAgICAgID8gdGhpcy5jbGVhbmVkSW50ZW50LnRvT2JqZWN0KClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBpbnRlbnRVcGRhdGU6IHRoaXMuaW50ZW50VXBkYXRlID8gdGhpcy5pbnRlbnRVcGRhdGUudG9PYmplY3QoKSA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IENsZWFuSW50ZW50UmVzcG9uc2UuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBjbGVhbmVkSW50ZW50OiB0aGlzLmNsZWFuZWRJbnRlbnRcbiAgICAgICAgPyB0aGlzLmNsZWFuZWRJbnRlbnQudG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgICAgOiBudWxsLFxuICAgICAgaW50ZW50VXBkYXRlOiB0aGlzLmludGVudFVwZGF0ZVxuICAgICAgICA/IHRoaXMuaW50ZW50VXBkYXRlLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICAgIDogbnVsbFxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgQ2xlYW5JbnRlbnRSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgQ2xlYW5JbnRlbnRSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgY2xlYW5lZEludGVudD86IG9uZGV3b05sdTAwOC5JbnRlbnQuQXNPYmplY3Q7XG4gICAgaW50ZW50VXBkYXRlPzogSW50ZW50VXBkYXRlLkFzT2JqZWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIENsZWFuSW50ZW50UmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIGNsZWFuZWRJbnRlbnQ6IG9uZGV3b05sdTAwOC5JbnRlbnQuQXNQcm90b2J1ZkpTT04gfCBudWxsO1xuICAgIGludGVudFVwZGF0ZTogSW50ZW50VXBkYXRlLkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMoKTtcbiAgICBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucykge1xuICAgIF9pbnN0YW5jZS5kZWxldGVSZXBlYXRlZFdoaXRlc3BhY2VzID1cbiAgICAgIF9pbnN0YW5jZS5kZWxldGVSZXBlYXRlZFdoaXRlc3BhY2VzIHx8IGZhbHNlO1xuICAgIF9pbnN0YW5jZS5kZWxldGVMZWFkaW5nU3BlY2lhbENoYXJhY3RlcnMgPVxuICAgICAgX2luc3RhbmNlLmRlbGV0ZUxlYWRpbmdTcGVjaWFsQ2hhcmFjdGVycyB8fCBmYWxzZTtcbiAgICBfaW5zdGFuY2UuZGVsZXRlVHJhaWxpbmdTcGVjaWFsQ2hhcmFjdGVycyA9XG4gICAgICBfaW5zdGFuY2UuZGVsZXRlVHJhaWxpbmdTcGVjaWFsQ2hhcmFjdGVycyB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLmRlbGV0ZVJlcGVhdGVkV2hpdGVzcGFjZXMgPSBfcmVhZGVyLnJlYWRCb29sKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UuZGVsZXRlTGVhZGluZ1NwZWNpYWxDaGFyYWN0ZXJzID0gX3JlYWRlci5yZWFkQm9vbCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgX2luc3RhbmNlLmRlbGV0ZVRyYWlsaW5nU3BlY2lhbENoYXJhY3RlcnMgPSBfcmVhZGVyLnJlYWRCb29sKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5kZWxldGVSZXBlYXRlZFdoaXRlc3BhY2VzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQm9vbCgxLCBfaW5zdGFuY2UuZGVsZXRlUmVwZWF0ZWRXaGl0ZXNwYWNlcyk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuZGVsZXRlTGVhZGluZ1NwZWNpYWxDaGFyYWN0ZXJzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQm9vbCgyLCBfaW5zdGFuY2UuZGVsZXRlTGVhZGluZ1NwZWNpYWxDaGFyYWN0ZXJzKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5kZWxldGVUcmFpbGluZ1NwZWNpYWxDaGFyYWN0ZXJzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQm9vbCgzLCBfaW5zdGFuY2UuZGVsZXRlVHJhaWxpbmdTcGVjaWFsQ2hhcmFjdGVycyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGVsZXRlUmVwZWF0ZWRXaGl0ZXNwYWNlczogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfZGVsZXRlTGVhZGluZ1NwZWNpYWxDaGFyYWN0ZXJzOiBib29sZWFuO1xuICBwcml2YXRlIF9kZWxldGVUcmFpbGluZ1NwZWNpYWxDaGFyYWN0ZXJzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLkFzT2JqZWN0PlxuICApIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5kZWxldGVSZXBlYXRlZFdoaXRlc3BhY2VzID0gX3ZhbHVlLmRlbGV0ZVJlcGVhdGVkV2hpdGVzcGFjZXM7XG4gICAgdGhpcy5kZWxldGVMZWFkaW5nU3BlY2lhbENoYXJhY3RlcnMgPSBfdmFsdWUuZGVsZXRlTGVhZGluZ1NwZWNpYWxDaGFyYWN0ZXJzO1xuICAgIHRoaXMuZGVsZXRlVHJhaWxpbmdTcGVjaWFsQ2hhcmFjdGVycyA9XG4gICAgICBfdmFsdWUuZGVsZXRlVHJhaWxpbmdTcGVjaWFsQ2hhcmFjdGVycztcbiAgICBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgZGVsZXRlUmVwZWF0ZWRXaGl0ZXNwYWNlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGVsZXRlUmVwZWF0ZWRXaGl0ZXNwYWNlcztcbiAgfVxuICBzZXQgZGVsZXRlUmVwZWF0ZWRXaGl0ZXNwYWNlcyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2RlbGV0ZVJlcGVhdGVkV2hpdGVzcGFjZXMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgZGVsZXRlTGVhZGluZ1NwZWNpYWxDaGFyYWN0ZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kZWxldGVMZWFkaW5nU3BlY2lhbENoYXJhY3RlcnM7XG4gIH1cbiAgc2V0IGRlbGV0ZUxlYWRpbmdTcGVjaWFsQ2hhcmFjdGVycyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2RlbGV0ZUxlYWRpbmdTcGVjaWFsQ2hhcmFjdGVycyA9IHZhbHVlO1xuICB9XG4gIGdldCBkZWxldGVUcmFpbGluZ1NwZWNpYWxDaGFyYWN0ZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kZWxldGVUcmFpbGluZ1NwZWNpYWxDaGFyYWN0ZXJzO1xuICB9XG4gIHNldCBkZWxldGVUcmFpbGluZ1NwZWNpYWxDaGFyYWN0ZXJzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGVsZXRlVHJhaWxpbmdTcGVjaWFsQ2hhcmFjdGVycyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucy5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlbGV0ZVJlcGVhdGVkV2hpdGVzcGFjZXM6IHRoaXMuZGVsZXRlUmVwZWF0ZWRXaGl0ZXNwYWNlcyxcbiAgICAgIGRlbGV0ZUxlYWRpbmdTcGVjaWFsQ2hhcmFjdGVyczogdGhpcy5kZWxldGVMZWFkaW5nU3BlY2lhbENoYXJhY3RlcnMsXG4gICAgICBkZWxldGVUcmFpbGluZ1NwZWNpYWxDaGFyYWN0ZXJzOiB0aGlzLmRlbGV0ZVRyYWlsaW5nU3BlY2lhbENoYXJhY3RlcnNcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVsZXRlUmVwZWF0ZWRXaGl0ZXNwYWNlczogdGhpcy5kZWxldGVSZXBlYXRlZFdoaXRlc3BhY2VzLFxuICAgICAgZGVsZXRlTGVhZGluZ1NwZWNpYWxDaGFyYWN0ZXJzOiB0aGlzLmRlbGV0ZUxlYWRpbmdTcGVjaWFsQ2hhcmFjdGVycyxcbiAgICAgIGRlbGV0ZVRyYWlsaW5nU3BlY2lhbENoYXJhY3RlcnM6IHRoaXMuZGVsZXRlVHJhaWxpbmdTcGVjaWFsQ2hhcmFjdGVyc1xuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uc1xuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgZGVsZXRlUmVwZWF0ZWRXaGl0ZXNwYWNlczogYm9vbGVhbjtcbiAgICBkZWxldGVMZWFkaW5nU3BlY2lhbENoYXJhY3RlcnM6IGJvb2xlYW47XG4gICAgZGVsZXRlVHJhaWxpbmdTcGVjaWFsQ2hhcmFjdGVyczogYm9vbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBkZWxldGVSZXBlYXRlZFdoaXRlc3BhY2VzOiBib29sZWFuO1xuICAgIGRlbGV0ZUxlYWRpbmdTcGVjaWFsQ2hhcmFjdGVyczogYm9vbGVhbjtcbiAgICBkZWxldGVUcmFpbGluZ1NwZWNpYWxDaGFyYWN0ZXJzOiBib29sZWFuO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5TdHJpbmdVcGRhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmluZ1VwZGF0ZSBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuU3RyaW5nVXBkYXRlJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgU3RyaW5nVXBkYXRlKCk7XG4gICAgU3RyaW5nVXBkYXRlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihpbnN0YW5jZSwgbmV3IEJpbmFyeVJlYWRlcihieXRlcykpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogU3RyaW5nVXBkYXRlKSB7XG4gICAgX2luc3RhbmNlLm5ldyA9IF9pbnN0YW5jZS5uZXcgfHwgJyc7XG4gICAgX2luc3RhbmNlLm9sZCA9IF9pbnN0YW5jZS5vbGQgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBTdHJpbmdVcGRhdGUsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLm5ldyA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgX2luc3RhbmNlLm9sZCA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgU3RyaW5nVXBkYXRlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogU3RyaW5nVXBkYXRlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLm5ldykge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygxLCBfaW5zdGFuY2UubmV3KTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5vbGQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMiwgX2luc3RhbmNlLm9sZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbmV3OiBzdHJpbmc7XG4gIHByaXZhdGUgX29sZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgU3RyaW5nVXBkYXRlIHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPFN0cmluZ1VwZGF0ZS5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5uZXcgPSBfdmFsdWUubmV3O1xuICAgIHRoaXMub2xkID0gX3ZhbHVlLm9sZDtcbiAgICBTdHJpbmdVcGRhdGUucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBuZXcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmV3O1xuICB9XG4gIHNldCBuZXcodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX25ldyA9IHZhbHVlO1xuICB9XG4gIGdldCBvbGQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fb2xkO1xuICB9XG4gIHNldCBvbGQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX29sZCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIFN0cmluZ1VwZGF0ZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBTdHJpbmdVcGRhdGUuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBuZXc6IHRoaXMubmV3LFxuICAgICAgb2xkOiB0aGlzLm9sZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IFN0cmluZ1VwZGF0ZS5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5ldzogdGhpcy5uZXcsXG4gICAgICBvbGQ6IHRoaXMub2xkXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBTdHJpbmdVcGRhdGUge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIFN0cmluZ1VwZGF0ZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgbmV3OiBzdHJpbmc7XG4gICAgb2xkOiBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgU3RyaW5nVXBkYXRlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBuZXc6IHN0cmluZztcbiAgICBvbGQ6IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuSW50ZW50VXBkYXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlbnRVcGRhdGUgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LkludGVudFVwZGF0ZSc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEludGVudFVwZGF0ZSgpO1xuICAgIEludGVudFVwZGF0ZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoaW5zdGFuY2UsIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IEludGVudFVwZGF0ZSkge1xuICAgIF9pbnN0YW5jZS5pbnRlbnREaXNwbGF5TmFtZSA9IF9pbnN0YW5jZS5pbnRlbnREaXNwbGF5TmFtZSB8fCAnJztcbiAgICBfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2VVcGRhdGVMaXN0ID1cbiAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZVVwZGF0ZUxpc3QgfHwgW107XG4gICAgX2luc3RhbmNlLmRlbGV0ZWRQYXJhbWV0ZXJzID0gX2luc3RhbmNlLmRlbGV0ZWRQYXJhbWV0ZXJzIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogSW50ZW50VXBkYXRlLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5pbnRlbnREaXNwbGF5TmFtZSA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUluaXRpYWxpemVyMiA9IG5ldyBJbnRlbnRVcGRhdGUuVHJhaW5pbmdQaHJhc2VVcGRhdGUoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMixcbiAgICAgICAgICAgIEludGVudFVwZGF0ZS5UcmFpbmluZ1BocmFzZVVwZGF0ZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIChfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2VVcGRhdGVMaXN0ID1cbiAgICAgICAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZVVwZGF0ZUxpc3QgfHwgW10pLnB1c2gobWVzc2FnZUluaXRpYWxpemVyMik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAoX2luc3RhbmNlLmRlbGV0ZWRQYXJhbWV0ZXJzID1cbiAgICAgICAgICAgIF9pbnN0YW5jZS5kZWxldGVkUGFyYW1ldGVycyB8fCBbXSkucHVzaChfcmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBJbnRlbnRVcGRhdGUucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBJbnRlbnRVcGRhdGUsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UuaW50ZW50RGlzcGxheU5hbWUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLmludGVudERpc3BsYXlOYW1lKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlVXBkYXRlTGlzdCAmJlxuICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlVXBkYXRlTGlzdC5sZW5ndGhcbiAgICApIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDIsXG4gICAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZVVwZGF0ZUxpc3QgYXMgYW55LFxuICAgICAgICBJbnRlbnRVcGRhdGUuVHJhaW5pbmdQaHJhc2VVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuZGVsZXRlZFBhcmFtZXRlcnMgJiYgX2luc3RhbmNlLmRlbGV0ZWRQYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkU3RyaW5nKDMsIF9pbnN0YW5jZS5kZWxldGVkUGFyYW1ldGVycyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaW50ZW50RGlzcGxheU5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfdHJhaW5pbmdQaHJhc2VVcGRhdGVMaXN0PzogSW50ZW50VXBkYXRlLlRyYWluaW5nUGhyYXNlVXBkYXRlW107XG4gIHByaXZhdGUgX2RlbGV0ZWRQYXJhbWV0ZXJzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIEludGVudFVwZGF0ZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxJbnRlbnRVcGRhdGUuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuaW50ZW50RGlzcGxheU5hbWUgPSBfdmFsdWUuaW50ZW50RGlzcGxheU5hbWU7XG4gICAgdGhpcy50cmFpbmluZ1BocmFzZVVwZGF0ZUxpc3QgPSAoX3ZhbHVlLnRyYWluaW5nUGhyYXNlVXBkYXRlTGlzdCB8fCBbXSkubWFwKFxuICAgICAgbSA9PiBuZXcgSW50ZW50VXBkYXRlLlRyYWluaW5nUGhyYXNlVXBkYXRlKG0pXG4gICAgKTtcbiAgICB0aGlzLmRlbGV0ZWRQYXJhbWV0ZXJzID0gKF92YWx1ZS5kZWxldGVkUGFyYW1ldGVycyB8fCBbXSkuc2xpY2UoKTtcbiAgICBJbnRlbnRVcGRhdGUucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBpbnRlbnREaXNwbGF5TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pbnRlbnREaXNwbGF5TmFtZTtcbiAgfVxuICBzZXQgaW50ZW50RGlzcGxheU5hbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2ludGVudERpc3BsYXlOYW1lID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHRyYWluaW5nUGhyYXNlVXBkYXRlTGlzdCgpOlxuICAgIHwgSW50ZW50VXBkYXRlLlRyYWluaW5nUGhyYXNlVXBkYXRlW11cbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYWluaW5nUGhyYXNlVXBkYXRlTGlzdDtcbiAgfVxuICBzZXQgdHJhaW5pbmdQaHJhc2VVcGRhdGVMaXN0KFxuICAgIHZhbHVlOiBJbnRlbnRVcGRhdGUuVHJhaW5pbmdQaHJhc2VVcGRhdGVbXSB8IHVuZGVmaW5lZFxuICApIHtcbiAgICB0aGlzLl90cmFpbmluZ1BocmFzZVVwZGF0ZUxpc3QgPSB2YWx1ZTtcbiAgfVxuICBnZXQgZGVsZXRlZFBhcmFtZXRlcnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9kZWxldGVkUGFyYW1ldGVycztcbiAgfVxuICBzZXQgZGVsZXRlZFBhcmFtZXRlcnModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fZGVsZXRlZFBhcmFtZXRlcnMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBJbnRlbnRVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogSW50ZW50VXBkYXRlLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaW50ZW50RGlzcGxheU5hbWU6IHRoaXMuaW50ZW50RGlzcGxheU5hbWUsXG4gICAgICB0cmFpbmluZ1BocmFzZVVwZGF0ZUxpc3Q6ICh0aGlzLnRyYWluaW5nUGhyYXNlVXBkYXRlTGlzdCB8fCBbXSkubWFwKG0gPT5cbiAgICAgICAgbS50b09iamVjdCgpXG4gICAgICApLFxuICAgICAgZGVsZXRlZFBhcmFtZXRlcnM6ICh0aGlzLmRlbGV0ZWRQYXJhbWV0ZXJzIHx8IFtdKS5zbGljZSgpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogSW50ZW50VXBkYXRlLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW50ZW50RGlzcGxheU5hbWU6IHRoaXMuaW50ZW50RGlzcGxheU5hbWUsXG4gICAgICB0cmFpbmluZ1BocmFzZVVwZGF0ZUxpc3Q6ICh0aGlzLnRyYWluaW5nUGhyYXNlVXBkYXRlTGlzdCB8fCBbXSkubWFwKG0gPT5cbiAgICAgICAgbS50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgKSxcbiAgICAgIGRlbGV0ZWRQYXJhbWV0ZXJzOiAodGhpcy5kZWxldGVkUGFyYW1ldGVycyB8fCBbXSkuc2xpY2UoKVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgSW50ZW50VXBkYXRlIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBJbnRlbnRVcGRhdGVcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIGludGVudERpc3BsYXlOYW1lOiBzdHJpbmc7XG4gICAgdHJhaW5pbmdQaHJhc2VVcGRhdGVMaXN0PzogSW50ZW50VXBkYXRlLlRyYWluaW5nUGhyYXNlVXBkYXRlLkFzT2JqZWN0W107XG4gICAgZGVsZXRlZFBhcmFtZXRlcnM6IHN0cmluZ1tdO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEludGVudFVwZGF0ZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgaW50ZW50RGlzcGxheU5hbWU6IHN0cmluZztcbiAgICB0cmFpbmluZ1BocmFzZVVwZGF0ZUxpc3Q6XG4gICAgICB8IEludGVudFVwZGF0ZS5UcmFpbmluZ1BocmFzZVVwZGF0ZS5Bc1Byb3RvYnVmSlNPTltdXG4gICAgICB8IG51bGw7XG4gICAgZGVsZXRlZFBhcmFtZXRlcnM6IHN0cmluZ1tdO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuSW50ZW50VXBkYXRlLlRyYWluaW5nUGhyYXNlVXBkYXRlXG4gICAqL1xuICBleHBvcnQgY2xhc3MgVHJhaW5pbmdQaHJhc2VVcGRhdGUgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gICAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuSW50ZW50VXBkYXRlLlRyYWluaW5nUGhyYXNlVXBkYXRlJztcblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgVHJhaW5pbmdQaHJhc2VVcGRhdGUoKTtcbiAgICAgIFRyYWluaW5nUGhyYXNlVXBkYXRlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgICApO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBUcmFpbmluZ1BocmFzZVVwZGF0ZSkge1xuICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlVXBkYXRlID1cbiAgICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlVXBkYXRlIHx8IHVuZGVmaW5lZDtcbiAgICAgIF9pbnN0YW5jZS5lbnRpdHlVcGRhdGVzID0gX2luc3RhbmNlLmVudGl0eVVwZGF0ZXMgfHwgW107XG4gICAgICBfaW5zdGFuY2UuZW50aXRpZXNSZWFubm90YXRlZCA9IF9pbnN0YW5jZS5lbnRpdGllc1JlYW5ub3RhdGVkIHx8IFtdO1xuICAgICAgX2luc3RhbmNlLmNvbnRhaW5zVXBkYXRlVmFyaWFibGUgPVxuICAgICAgICBfaW5zdGFuY2UuY29udGFpbnNVcGRhdGVWYXJpYWJsZSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgX2luc3RhbmNlOiBUcmFpbmluZ1BocmFzZVVwZGF0ZSxcbiAgICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICAgICkge1xuICAgICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZVVwZGF0ZSA9IG5ldyBTdHJpbmdVcGRhdGUoKTtcbiAgICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZVVwZGF0ZSxcbiAgICAgICAgICAgICAgU3RyaW5nVXBkYXRlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJbml0aWFsaXplcjIgPSBuZXcgU3RyaW5nVXBkYXRlKCk7XG4gICAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgICBtZXNzYWdlSW5pdGlhbGl6ZXIyLFxuICAgICAgICAgICAgICBTdHJpbmdVcGRhdGUuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgKF9pbnN0YW5jZS5lbnRpdHlVcGRhdGVzID0gX2luc3RhbmNlLmVudGl0eVVwZGF0ZXMgfHwgW10pLnB1c2goXG4gICAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAoX2luc3RhbmNlLmVudGl0aWVzUmVhbm5vdGF0ZWQgPVxuICAgICAgICAgICAgICBfaW5zdGFuY2UuZW50aXRpZXNSZWFubm90YXRlZCB8fCBbXSkucHVzaChfcmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBfaW5zdGFuY2UuY29udGFpbnNVcGRhdGVWYXJpYWJsZSA9IF9yZWFkZXIucmVhZEJvb2woKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIFRyYWluaW5nUGhyYXNlVXBkYXRlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgICBfaW5zdGFuY2U6IFRyYWluaW5nUGhyYXNlVXBkYXRlLFxuICAgICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICAgKSB7XG4gICAgICBpZiAoX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlVXBkYXRlKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAgIDEsXG4gICAgICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlVXBkYXRlIGFzIGFueSxcbiAgICAgICAgICBTdHJpbmdVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChfaW5zdGFuY2UuZW50aXR5VXBkYXRlcyAmJiBfaW5zdGFuY2UuZW50aXR5VXBkYXRlcy5sZW5ndGgpIHtcbiAgICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkTWVzc2FnZShcbiAgICAgICAgICAyLFxuICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdHlVcGRhdGVzIGFzIGFueSxcbiAgICAgICAgICBTdHJpbmdVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgX2luc3RhbmNlLmVudGl0aWVzUmVhbm5vdGF0ZWQgJiZcbiAgICAgICAgX2luc3RhbmNlLmVudGl0aWVzUmVhbm5vdGF0ZWQubGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkU3RyaW5nKDMsIF9pbnN0YW5jZS5lbnRpdGllc1JlYW5ub3RhdGVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChfaW5zdGFuY2UuY29udGFpbnNVcGRhdGVWYXJpYWJsZSkge1xuICAgICAgICBfd3JpdGVyLndyaXRlQm9vbCg0LCBfaW5zdGFuY2UuY29udGFpbnNVcGRhdGVWYXJpYWJsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdHJhaW5pbmdQaHJhc2VVcGRhdGU/OiBTdHJpbmdVcGRhdGU7XG4gICAgcHJpdmF0ZSBfZW50aXR5VXBkYXRlcz86IFN0cmluZ1VwZGF0ZVtdO1xuICAgIHByaXZhdGUgX2VudGl0aWVzUmVhbm5vdGF0ZWQ6IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgX2NvbnRhaW5zVXBkYXRlVmFyaWFibGU6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBUcmFpbmluZ1BocmFzZVVwZGF0ZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8VHJhaW5pbmdQaHJhc2VVcGRhdGUuQXNPYmplY3Q+KSB7XG4gICAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgICB0aGlzLnRyYWluaW5nUGhyYXNlVXBkYXRlID0gX3ZhbHVlLnRyYWluaW5nUGhyYXNlVXBkYXRlXG4gICAgICAgID8gbmV3IFN0cmluZ1VwZGF0ZShfdmFsdWUudHJhaW5pbmdQaHJhc2VVcGRhdGUpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5lbnRpdHlVcGRhdGVzID0gKF92YWx1ZS5lbnRpdHlVcGRhdGVzIHx8IFtdKS5tYXAoXG4gICAgICAgIG0gPT4gbmV3IFN0cmluZ1VwZGF0ZShtKVxuICAgICAgKTtcbiAgICAgIHRoaXMuZW50aXRpZXNSZWFubm90YXRlZCA9IChfdmFsdWUuZW50aXRpZXNSZWFubm90YXRlZCB8fCBbXSkuc2xpY2UoKTtcbiAgICAgIHRoaXMuY29udGFpbnNVcGRhdGVWYXJpYWJsZSA9IF92YWx1ZS5jb250YWluc1VwZGF0ZVZhcmlhYmxlO1xuICAgICAgVHJhaW5pbmdQaHJhc2VVcGRhdGUucmVmaW5lVmFsdWVzKHRoaXMpO1xuICAgIH1cbiAgICBnZXQgdHJhaW5pbmdQaHJhc2VVcGRhdGUoKTogU3RyaW5nVXBkYXRlIHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFpbmluZ1BocmFzZVVwZGF0ZTtcbiAgICB9XG4gICAgc2V0IHRyYWluaW5nUGhyYXNlVXBkYXRlKHZhbHVlOiBTdHJpbmdVcGRhdGUgfCB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3RyYWluaW5nUGhyYXNlVXBkYXRlID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCBlbnRpdHlVcGRhdGVzKCk6IFN0cmluZ1VwZGF0ZVtdIHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbnRpdHlVcGRhdGVzO1xuICAgIH1cbiAgICBzZXQgZW50aXR5VXBkYXRlcyh2YWx1ZTogU3RyaW5nVXBkYXRlW10gfCB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2VudGl0eVVwZGF0ZXMgPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IGVudGl0aWVzUmVhbm5vdGF0ZWQoKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMuX2VudGl0aWVzUmVhbm5vdGF0ZWQ7XG4gICAgfVxuICAgIHNldCBlbnRpdGllc1JlYW5ub3RhdGVkKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgICAgdGhpcy5fZW50aXRpZXNSZWFubm90YXRlZCA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgY29udGFpbnNVcGRhdGVWYXJpYWJsZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb250YWluc1VwZGF0ZVZhcmlhYmxlO1xuICAgIH1cbiAgICBzZXQgY29udGFpbnNVcGRhdGVWYXJpYWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgdGhpcy5fY29udGFpbnNVcGRhdGVWYXJpYWJsZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgICBUcmFpbmluZ1BocmFzZVVwZGF0ZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICAgKi9cbiAgICB0b09iamVjdCgpOiBUcmFpbmluZ1BocmFzZVVwZGF0ZS5Bc09iamVjdCB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0cmFpbmluZ1BocmFzZVVwZGF0ZTogdGhpcy50cmFpbmluZ1BocmFzZVVwZGF0ZVxuICAgICAgICAgID8gdGhpcy50cmFpbmluZ1BocmFzZVVwZGF0ZS50b09iamVjdCgpXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGVudGl0eVVwZGF0ZXM6ICh0aGlzLmVudGl0eVVwZGF0ZXMgfHwgW10pLm1hcChtID0+IG0udG9PYmplY3QoKSksXG4gICAgICAgIGVudGl0aWVzUmVhbm5vdGF0ZWQ6ICh0aGlzLmVudGl0aWVzUmVhbm5vdGF0ZWQgfHwgW10pLnNsaWNlKCksXG4gICAgICAgIGNvbnRhaW5zVXBkYXRlVmFyaWFibGU6IHRoaXMuY29udGFpbnNVcGRhdGVWYXJpYWJsZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICAgKi9cbiAgICB0b1Byb3RvYnVmSlNPTihcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgICApOiBUcmFpbmluZ1BocmFzZVVwZGF0ZS5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0cmFpbmluZ1BocmFzZVVwZGF0ZTogdGhpcy50cmFpbmluZ1BocmFzZVVwZGF0ZVxuICAgICAgICAgID8gdGhpcy50cmFpbmluZ1BocmFzZVVwZGF0ZS50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgZW50aXR5VXBkYXRlczogKHRoaXMuZW50aXR5VXBkYXRlcyB8fCBbXSkubWFwKG0gPT5cbiAgICAgICAgICBtLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICAgICksXG4gICAgICAgIGVudGl0aWVzUmVhbm5vdGF0ZWQ6ICh0aGlzLmVudGl0aWVzUmVhbm5vdGF0ZWQgfHwgW10pLnNsaWNlKCksXG4gICAgICAgIGNvbnRhaW5zVXBkYXRlVmFyaWFibGU6IHRoaXMuY29udGFpbnNVcGRhdGVWYXJpYWJsZVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IG1vZHVsZSBUcmFpbmluZ1BocmFzZVVwZGF0ZSB7XG4gICAgLyoqXG4gICAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIFRyYWluaW5nUGhyYXNlVXBkYXRlXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgICB0cmFpbmluZ1BocmFzZVVwZGF0ZT86IFN0cmluZ1VwZGF0ZS5Bc09iamVjdDtcbiAgICAgIGVudGl0eVVwZGF0ZXM/OiBTdHJpbmdVcGRhdGUuQXNPYmplY3RbXTtcbiAgICAgIGVudGl0aWVzUmVhbm5vdGF0ZWQ6IHN0cmluZ1tdO1xuICAgICAgY29udGFpbnNVcGRhdGVWYXJpYWJsZTogYm9vbGVhbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBUcmFpbmluZ1BocmFzZVVwZGF0ZVxuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgICAgdHJhaW5pbmdQaHJhc2VVcGRhdGU6IFN0cmluZ1VwZGF0ZS5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gICAgICBlbnRpdHlVcGRhdGVzOiBTdHJpbmdVcGRhdGUuQXNQcm90b2J1ZkpTT05bXSB8IG51bGw7XG4gICAgICBlbnRpdGllc1JlYW5ub3RhdGVkOiBzdHJpbmdbXTtcbiAgICAgIGNvbnRhaW5zVXBkYXRlVmFyaWFibGU6IGJvb2xlYW47XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5FbnRpdHlUeXBlVXBkYXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnRpdHlUeXBlVXBkYXRlIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5FbnRpdHlUeXBlVXBkYXRlJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRW50aXR5VHlwZVVwZGF0ZSgpO1xuICAgIEVudGl0eVR5cGVVcGRhdGUuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBFbnRpdHlUeXBlVXBkYXRlKSB7XG4gICAgX2luc3RhbmNlLmVudGl0eVR5cGVOYW1lID0gX2luc3RhbmNlLmVudGl0eVR5cGVOYW1lIHx8ICcnO1xuICAgIF9pbnN0YW5jZS52YWx1ZXNVcGRhdGVMaXN0ID0gX2luc3RhbmNlLnZhbHVlc1VwZGF0ZUxpc3QgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBFbnRpdHlUeXBlVXBkYXRlLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlTmFtZSA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUluaXRpYWxpemVyMiA9IG5ldyBFbnRpdHlUeXBlVXBkYXRlLkVudGl0eVVwZGF0ZSgpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBtZXNzYWdlSW5pdGlhbGl6ZXIyLFxuICAgICAgICAgICAgRW50aXR5VHlwZVVwZGF0ZS5FbnRpdHlVcGRhdGUuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICAoX2luc3RhbmNlLnZhbHVlc1VwZGF0ZUxpc3QgPSBfaW5zdGFuY2UudmFsdWVzVXBkYXRlTGlzdCB8fCBbXSkucHVzaChcbiAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgRW50aXR5VHlwZVVwZGF0ZS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IEVudGl0eVR5cGVVcGRhdGUsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UuZW50aXR5VHlwZU5hbWUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLmVudGl0eVR5cGVOYW1lKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS52YWx1ZXNVcGRhdGVMaXN0ICYmIF9pbnN0YW5jZS52YWx1ZXNVcGRhdGVMaXN0Lmxlbmd0aCkge1xuICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkTWVzc2FnZShcbiAgICAgICAgMixcbiAgICAgICAgX2luc3RhbmNlLnZhbHVlc1VwZGF0ZUxpc3QgYXMgYW55LFxuICAgICAgICBFbnRpdHlUeXBlVXBkYXRlLkVudGl0eVVwZGF0ZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9lbnRpdHlUeXBlTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIF92YWx1ZXNVcGRhdGVMaXN0PzogRW50aXR5VHlwZVVwZGF0ZS5FbnRpdHlVcGRhdGVbXTtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIEVudGl0eVR5cGVVcGRhdGUgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8RW50aXR5VHlwZVVwZGF0ZS5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5lbnRpdHlUeXBlTmFtZSA9IF92YWx1ZS5lbnRpdHlUeXBlTmFtZTtcbiAgICB0aGlzLnZhbHVlc1VwZGF0ZUxpc3QgPSAoX3ZhbHVlLnZhbHVlc1VwZGF0ZUxpc3QgfHwgW10pLm1hcChcbiAgICAgIG0gPT4gbmV3IEVudGl0eVR5cGVVcGRhdGUuRW50aXR5VXBkYXRlKG0pXG4gICAgKTtcbiAgICBFbnRpdHlUeXBlVXBkYXRlLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgZW50aXR5VHlwZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZW50aXR5VHlwZU5hbWU7XG4gIH1cbiAgc2V0IGVudGl0eVR5cGVOYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9lbnRpdHlUeXBlTmFtZSA9IHZhbHVlO1xuICB9XG4gIGdldCB2YWx1ZXNVcGRhdGVMaXN0KCk6IEVudGl0eVR5cGVVcGRhdGUuRW50aXR5VXBkYXRlW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZXNVcGRhdGVMaXN0O1xuICB9XG4gIHNldCB2YWx1ZXNVcGRhdGVMaXN0KHZhbHVlOiBFbnRpdHlUeXBlVXBkYXRlLkVudGl0eVVwZGF0ZVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdmFsdWVzVXBkYXRlTGlzdCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIEVudGl0eVR5cGVVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogRW50aXR5VHlwZVVwZGF0ZS5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudGl0eVR5cGVOYW1lOiB0aGlzLmVudGl0eVR5cGVOYW1lLFxuICAgICAgdmFsdWVzVXBkYXRlTGlzdDogKHRoaXMudmFsdWVzVXBkYXRlTGlzdCB8fCBbXSkubWFwKG0gPT4gbS50b09iamVjdCgpKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IEVudGl0eVR5cGVVcGRhdGUuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBlbnRpdHlUeXBlTmFtZTogdGhpcy5lbnRpdHlUeXBlTmFtZSxcbiAgICAgIHZhbHVlc1VwZGF0ZUxpc3Q6ICh0aGlzLnZhbHVlc1VwZGF0ZUxpc3QgfHwgW10pLm1hcChtID0+XG4gICAgICAgIG0udG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgIClcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIEVudGl0eVR5cGVVcGRhdGUge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIEVudGl0eVR5cGVVcGRhdGVcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIGVudGl0eVR5cGVOYW1lOiBzdHJpbmc7XG4gICAgdmFsdWVzVXBkYXRlTGlzdD86IEVudGl0eVR5cGVVcGRhdGUuRW50aXR5VXBkYXRlLkFzT2JqZWN0W107XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgRW50aXR5VHlwZVVwZGF0ZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgZW50aXR5VHlwZU5hbWU6IHN0cmluZztcbiAgICB2YWx1ZXNVcGRhdGVMaXN0OiBFbnRpdHlUeXBlVXBkYXRlLkVudGl0eVVwZGF0ZS5Bc1Byb3RvYnVmSlNPTltdIHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1LkVudGl0eVR5cGVVcGRhdGUuRW50aXR5VXBkYXRlXG4gICAqL1xuICBleHBvcnQgY2xhc3MgRW50aXR5VXBkYXRlIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICAgIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LkVudGl0eVR5cGVVcGRhdGUuRW50aXR5VXBkYXRlJztcblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRW50aXR5VXBkYXRlKCk7XG4gICAgICBFbnRpdHlVcGRhdGUuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICAgICk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IEVudGl0eVVwZGF0ZSkge1xuICAgICAgX2luc3RhbmNlLmVudGl0eVZhbHVlVXBkYXRlID0gX2luc3RhbmNlLmVudGl0eVZhbHVlVXBkYXRlIHx8IHVuZGVmaW5lZDtcbiAgICAgIF9pbnN0YW5jZS5lbnRpdHlTeW5vbnltVXBkYXRlcyA9IF9pbnN0YW5jZS5lbnRpdHlTeW5vbnltVXBkYXRlcyB8fCBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgX2luc3RhbmNlOiBFbnRpdHlVcGRhdGUsXG4gICAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgICApIHtcbiAgICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBfaW5zdGFuY2UuZW50aXR5VmFsdWVVcGRhdGUgPSBuZXcgU3RyaW5nVXBkYXRlKCk7XG4gICAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgICBfaW5zdGFuY2UuZW50aXR5VmFsdWVVcGRhdGUsXG4gICAgICAgICAgICAgIFN0cmluZ1VwZGF0ZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlSW5pdGlhbGl6ZXIyID0gbmV3IFN0cmluZ1VwZGF0ZSgpO1xuICAgICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMixcbiAgICAgICAgICAgICAgU3RyaW5nVXBkYXRlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIChfaW5zdGFuY2UuZW50aXR5U3lub255bVVwZGF0ZXMgPVxuICAgICAgICAgICAgICBfaW5zdGFuY2UuZW50aXR5U3lub255bVVwZGF0ZXMgfHwgW10pLnB1c2gobWVzc2FnZUluaXRpYWxpemVyMik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBFbnRpdHlVcGRhdGUucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICAgIF9pbnN0YW5jZTogRW50aXR5VXBkYXRlLFxuICAgICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICAgKSB7XG4gICAgICBpZiAoX2luc3RhbmNlLmVudGl0eVZhbHVlVXBkYXRlKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAgIDEsXG4gICAgICAgICAgX2luc3RhbmNlLmVudGl0eVZhbHVlVXBkYXRlIGFzIGFueSxcbiAgICAgICAgICBTdHJpbmdVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgX2luc3RhbmNlLmVudGl0eVN5bm9ueW1VcGRhdGVzICYmXG4gICAgICAgIF9pbnN0YW5jZS5lbnRpdHlTeW5vbnltVXBkYXRlcy5sZW5ndGhcbiAgICAgICkge1xuICAgICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRNZXNzYWdlKFxuICAgICAgICAgIDIsXG4gICAgICAgICAgX2luc3RhbmNlLmVudGl0eVN5bm9ueW1VcGRhdGVzIGFzIGFueSxcbiAgICAgICAgICBTdHJpbmdVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9lbnRpdHlWYWx1ZVVwZGF0ZT86IFN0cmluZ1VwZGF0ZTtcbiAgICBwcml2YXRlIF9lbnRpdHlTeW5vbnltVXBkYXRlcz86IFN0cmluZ1VwZGF0ZVtdO1xuXG4gICAgLyoqXG4gICAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgRW50aXR5VXBkYXRlIHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxFbnRpdHlVcGRhdGUuQXNPYmplY3Q+KSB7XG4gICAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgICB0aGlzLmVudGl0eVZhbHVlVXBkYXRlID0gX3ZhbHVlLmVudGl0eVZhbHVlVXBkYXRlXG4gICAgICAgID8gbmV3IFN0cmluZ1VwZGF0ZShfdmFsdWUuZW50aXR5VmFsdWVVcGRhdGUpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5lbnRpdHlTeW5vbnltVXBkYXRlcyA9IChfdmFsdWUuZW50aXR5U3lub255bVVwZGF0ZXMgfHwgW10pLm1hcChcbiAgICAgICAgbSA9PiBuZXcgU3RyaW5nVXBkYXRlKG0pXG4gICAgICApO1xuICAgICAgRW50aXR5VXBkYXRlLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgICB9XG4gICAgZ2V0IGVudGl0eVZhbHVlVXBkYXRlKCk6IFN0cmluZ1VwZGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gdGhpcy5fZW50aXR5VmFsdWVVcGRhdGU7XG4gICAgfVxuICAgIHNldCBlbnRpdHlWYWx1ZVVwZGF0ZSh2YWx1ZTogU3RyaW5nVXBkYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9lbnRpdHlWYWx1ZVVwZGF0ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgZW50aXR5U3lub255bVVwZGF0ZXMoKTogU3RyaW5nVXBkYXRlW10gfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIHRoaXMuX2VudGl0eVN5bm9ueW1VcGRhdGVzO1xuICAgIH1cbiAgICBzZXQgZW50aXR5U3lub255bVVwZGF0ZXModmFsdWU6IFN0cmluZ1VwZGF0ZVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9lbnRpdHlTeW5vbnltVXBkYXRlcyA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgICBFbnRpdHlVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAgICovXG4gICAgdG9PYmplY3QoKTogRW50aXR5VXBkYXRlLkFzT2JqZWN0IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVudGl0eVZhbHVlVXBkYXRlOiB0aGlzLmVudGl0eVZhbHVlVXBkYXRlXG4gICAgICAgICAgPyB0aGlzLmVudGl0eVZhbHVlVXBkYXRlLnRvT2JqZWN0KClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgZW50aXR5U3lub255bVVwZGF0ZXM6ICh0aGlzLmVudGl0eVN5bm9ueW1VcGRhdGVzIHx8IFtdKS5tYXAobSA9PlxuICAgICAgICAgIG0udG9PYmplY3QoKVxuICAgICAgICApXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgICAqL1xuICAgIHRvUHJvdG9idWZKU09OKFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICAgICk6IEVudGl0eVVwZGF0ZS5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbnRpdHlWYWx1ZVVwZGF0ZTogdGhpcy5lbnRpdHlWYWx1ZVVwZGF0ZVxuICAgICAgICAgID8gdGhpcy5lbnRpdHlWYWx1ZVVwZGF0ZS50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgZW50aXR5U3lub255bVVwZGF0ZXM6ICh0aGlzLmVudGl0eVN5bm9ueW1VcGRhdGVzIHx8IFtdKS5tYXAobSA9PlxuICAgICAgICAgIG0udG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgICAgKVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IG1vZHVsZSBFbnRpdHlVcGRhdGUge1xuICAgIC8qKlxuICAgICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBFbnRpdHlVcGRhdGVcbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICAgIGVudGl0eVZhbHVlVXBkYXRlPzogU3RyaW5nVXBkYXRlLkFzT2JqZWN0O1xuICAgICAgZW50aXR5U3lub255bVVwZGF0ZXM/OiBTdHJpbmdVcGRhdGUuQXNPYmplY3RbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBFbnRpdHlVcGRhdGVcbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICAgIGVudGl0eVZhbHVlVXBkYXRlOiBTdHJpbmdVcGRhdGUuQXNQcm90b2J1ZkpTT04gfCBudWxsO1xuICAgICAgZW50aXR5U3lub255bVVwZGF0ZXM6IFN0cmluZ1VwZGF0ZS5Bc1Byb3RvYnVmSlNPTltdIHwgbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1LkNsZWFuQWxsRW50aXR5VHlwZXNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBDbGVhbkFsbEVudGl0eVR5cGVzUmVxdWVzdCBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuQ2xlYW5BbGxFbnRpdHlUeXBlc1JlcXVlc3QnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBDbGVhbkFsbEVudGl0eVR5cGVzUmVxdWVzdCgpO1xuICAgIENsZWFuQWxsRW50aXR5VHlwZXNSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogQ2xlYW5BbGxFbnRpdHlUeXBlc1JlcXVlc3QpIHtcbiAgICBfaW5zdGFuY2UucGFyZW50ID0gX2luc3RhbmNlLnBhcmVudCB8fCAnJztcbiAgICBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlID0gX2luc3RhbmNlLmxhbmd1YWdlQ29kZSB8fCAnJztcbiAgICBfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMgPSBfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMgfHwgJyc7XG4gICAgX2luc3RhbmNlLnN1YnN0cmluZ1doaXRlTGlzdCA9IF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QgfHwgW107XG4gICAgX2luc3RhbmNlLm1heEVudGl0eUNvdW50VXBkYXRlID0gX2luc3RhbmNlLm1heEVudGl0eUNvdW50VXBkYXRlIHx8IDA7XG4gICAgX2luc3RhbmNlLmZvcmJpZGRlbkVudGl0eVR5cGVQYXR0ZXJucyA9XG4gICAgICBfaW5zdGFuY2UuZm9yYmlkZGVuRW50aXR5VHlwZVBhdHRlcm5zIHx8IFtdO1xuICAgIF9pbnN0YW5jZS5kcnlSdW4gPSBfaW5zdGFuY2UuZHJ5UnVuIHx8IGZhbHNlO1xuICAgIF9pbnN0YW5jZS5udW1iZXJPZldvcmtlcnMgPSBfaW5zdGFuY2UubnVtYmVyT2ZXb3JrZXJzIHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBDbGVhbkFsbEVudGl0eVR5cGVzUmVxdWVzdCxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UucGFyZW50ID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIChfaW5zdGFuY2Uuc3Vic3RyaW5nV2hpdGVMaXN0ID1cbiAgICAgICAgICAgIF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QgfHwgW10pLnB1c2goX3JlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgX2luc3RhbmNlLm1heEVudGl0eUNvdW50VXBkYXRlID0gX3JlYWRlci5yZWFkSW50MzIoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIChfaW5zdGFuY2UuZm9yYmlkZGVuRW50aXR5VHlwZVBhdHRlcm5zID1cbiAgICAgICAgICAgIF9pbnN0YW5jZS5mb3JiaWRkZW5FbnRpdHlUeXBlUGF0dGVybnMgfHwgW10pLnB1c2goXG4gICAgICAgICAgICBfcmVhZGVyLnJlYWRTdHJpbmcoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBfaW5zdGFuY2UuZHJ5UnVuID0gX3JlYWRlci5yZWFkQm9vbCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgX2luc3RhbmNlLm51bWJlck9mV29ya2VycyA9IF9yZWFkZXIucmVhZEludDMyKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDbGVhbkFsbEVudGl0eVR5cGVzUmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IENsZWFuQWxsRW50aXR5VHlwZXNSZXF1ZXN0LFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLnBhcmVudCkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygxLCBfaW5zdGFuY2UucGFyZW50KTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMiwgX2luc3RhbmNlLmxhbmd1YWdlQ29kZSk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMywgX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QgJiYgX2luc3RhbmNlLnN1YnN0cmluZ1doaXRlTGlzdC5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZFN0cmluZyg0LCBfaW5zdGFuY2Uuc3Vic3RyaW5nV2hpdGVMaXN0KTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5tYXhFbnRpdHlDb3VudFVwZGF0ZSkge1xuICAgICAgX3dyaXRlci53cml0ZUludDMyKDUsIF9pbnN0YW5jZS5tYXhFbnRpdHlDb3VudFVwZGF0ZSk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIF9pbnN0YW5jZS5mb3JiaWRkZW5FbnRpdHlUeXBlUGF0dGVybnMgJiZcbiAgICAgIF9pbnN0YW5jZS5mb3JiaWRkZW5FbnRpdHlUeXBlUGF0dGVybnMubGVuZ3RoXG4gICAgKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRTdHJpbmcoNiwgX2luc3RhbmNlLmZvcmJpZGRlbkVudGl0eVR5cGVQYXR0ZXJucyk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuZHJ5UnVuKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQm9vbCg3LCBfaW5zdGFuY2UuZHJ5UnVuKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5udW1iZXJPZldvcmtlcnMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVJbnQzMig4LCBfaW5zdGFuY2UubnVtYmVyT2ZXb3JrZXJzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXJlbnQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2VDb2RlOiBzdHJpbmc7XG4gIHByaXZhdGUgX3NwZWNpYWxDaGFyYWN0ZXJzOiBzdHJpbmc7XG4gIHByaXZhdGUgX3N1YnN0cmluZ1doaXRlTGlzdDogc3RyaW5nW107XG4gIHByaXZhdGUgX21heEVudGl0eUNvdW50VXBkYXRlOiBudW1iZXI7XG4gIHByaXZhdGUgX2ZvcmJpZGRlbkVudGl0eVR5cGVQYXR0ZXJuczogc3RyaW5nW107XG4gIHByaXZhdGUgX2RyeVJ1bjogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfbnVtYmVyT2ZXb3JrZXJzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBDbGVhbkFsbEVudGl0eVR5cGVzUmVxdWVzdCB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxDbGVhbkFsbEVudGl0eVR5cGVzUmVxdWVzdC5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5wYXJlbnQgPSBfdmFsdWUucGFyZW50O1xuICAgIHRoaXMubGFuZ3VhZ2VDb2RlID0gX3ZhbHVlLmxhbmd1YWdlQ29kZTtcbiAgICB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzID0gX3ZhbHVlLnNwZWNpYWxDaGFyYWN0ZXJzO1xuICAgIHRoaXMuc3Vic3RyaW5nV2hpdGVMaXN0ID0gKF92YWx1ZS5zdWJzdHJpbmdXaGl0ZUxpc3QgfHwgW10pLnNsaWNlKCk7XG4gICAgdGhpcy5tYXhFbnRpdHlDb3VudFVwZGF0ZSA9IF92YWx1ZS5tYXhFbnRpdHlDb3VudFVwZGF0ZTtcbiAgICB0aGlzLmZvcmJpZGRlbkVudGl0eVR5cGVQYXR0ZXJucyA9IChcbiAgICAgIF92YWx1ZS5mb3JiaWRkZW5FbnRpdHlUeXBlUGF0dGVybnMgfHwgW11cbiAgICApLnNsaWNlKCk7XG4gICAgdGhpcy5kcnlSdW4gPSBfdmFsdWUuZHJ5UnVuO1xuICAgIHRoaXMubnVtYmVyT2ZXb3JrZXJzID0gX3ZhbHVlLm51bWJlck9mV29ya2VycztcbiAgICBDbGVhbkFsbEVudGl0eVR5cGVzUmVxdWVzdC5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IHBhcmVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnQ7XG4gIH1cbiAgc2V0IHBhcmVudCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcGFyZW50ID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGxhbmd1YWdlQ29kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZUNvZGU7XG4gIH1cbiAgc2V0IGxhbmd1YWdlQ29kZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbGFuZ3VhZ2VDb2RlID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHNwZWNpYWxDaGFyYWN0ZXJzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NwZWNpYWxDaGFyYWN0ZXJzO1xuICB9XG4gIHNldCBzcGVjaWFsQ2hhcmFjdGVycyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fc3BlY2lhbENoYXJhY3RlcnMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgc3Vic3RyaW5nV2hpdGVMaXN0KCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fc3Vic3RyaW5nV2hpdGVMaXN0O1xuICB9XG4gIHNldCBzdWJzdHJpbmdXaGl0ZUxpc3QodmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fc3Vic3RyaW5nV2hpdGVMaXN0ID0gdmFsdWU7XG4gIH1cbiAgZ2V0IG1heEVudGl0eUNvdW50VXBkYXRlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21heEVudGl0eUNvdW50VXBkYXRlO1xuICB9XG4gIHNldCBtYXhFbnRpdHlDb3VudFVwZGF0ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4RW50aXR5Q291bnRVcGRhdGUgPSB2YWx1ZTtcbiAgfVxuICBnZXQgZm9yYmlkZGVuRW50aXR5VHlwZVBhdHRlcm5zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZm9yYmlkZGVuRW50aXR5VHlwZVBhdHRlcm5zO1xuICB9XG4gIHNldCBmb3JiaWRkZW5FbnRpdHlUeXBlUGF0dGVybnModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fZm9yYmlkZGVuRW50aXR5VHlwZVBhdHRlcm5zID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGRyeVJ1bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZHJ5UnVuO1xuICB9XG4gIHNldCBkcnlSdW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kcnlSdW4gPSB2YWx1ZTtcbiAgfVxuICBnZXQgbnVtYmVyT2ZXb3JrZXJzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX251bWJlck9mV29ya2VycztcbiAgfVxuICBzZXQgbnVtYmVyT2ZXb3JrZXJzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9udW1iZXJPZldvcmtlcnMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBDbGVhbkFsbEVudGl0eVR5cGVzUmVxdWVzdC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBDbGVhbkFsbEVudGl0eVR5cGVzUmVxdWVzdC5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmVudDogdGhpcy5wYXJlbnQsXG4gICAgICBsYW5ndWFnZUNvZGU6IHRoaXMubGFuZ3VhZ2VDb2RlLFxuICAgICAgc3BlY2lhbENoYXJhY3RlcnM6IHRoaXMuc3BlY2lhbENoYXJhY3RlcnMsXG4gICAgICBzdWJzdHJpbmdXaGl0ZUxpc3Q6ICh0aGlzLnN1YnN0cmluZ1doaXRlTGlzdCB8fCBbXSkuc2xpY2UoKSxcbiAgICAgIG1heEVudGl0eUNvdW50VXBkYXRlOiB0aGlzLm1heEVudGl0eUNvdW50VXBkYXRlLFxuICAgICAgZm9yYmlkZGVuRW50aXR5VHlwZVBhdHRlcm5zOiAoXG4gICAgICAgIHRoaXMuZm9yYmlkZGVuRW50aXR5VHlwZVBhdHRlcm5zIHx8IFtdXG4gICAgICApLnNsaWNlKCksXG4gICAgICBkcnlSdW46IHRoaXMuZHJ5UnVuLFxuICAgICAgbnVtYmVyT2ZXb3JrZXJzOiB0aGlzLm51bWJlck9mV29ya2Vyc1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IENsZWFuQWxsRW50aXR5VHlwZXNSZXF1ZXN0LkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyZW50OiB0aGlzLnBhcmVudCxcbiAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUsXG4gICAgICBzcGVjaWFsQ2hhcmFjdGVyczogdGhpcy5zcGVjaWFsQ2hhcmFjdGVycyxcbiAgICAgIHN1YnN0cmluZ1doaXRlTGlzdDogKHRoaXMuc3Vic3RyaW5nV2hpdGVMaXN0IHx8IFtdKS5zbGljZSgpLFxuICAgICAgbWF4RW50aXR5Q291bnRVcGRhdGU6IHRoaXMubWF4RW50aXR5Q291bnRVcGRhdGUsXG4gICAgICBmb3JiaWRkZW5FbnRpdHlUeXBlUGF0dGVybnM6IChcbiAgICAgICAgdGhpcy5mb3JiaWRkZW5FbnRpdHlUeXBlUGF0dGVybnMgfHwgW11cbiAgICAgICkuc2xpY2UoKSxcbiAgICAgIGRyeVJ1bjogdGhpcy5kcnlSdW4sXG4gICAgICBudW1iZXJPZldvcmtlcnM6IHRoaXMubnVtYmVyT2ZXb3JrZXJzXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBDbGVhbkFsbEVudGl0eVR5cGVzUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgQ2xlYW5BbGxFbnRpdHlUeXBlc1JlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIHBhcmVudDogc3RyaW5nO1xuICAgIGxhbmd1YWdlQ29kZTogc3RyaW5nO1xuICAgIHNwZWNpYWxDaGFyYWN0ZXJzOiBzdHJpbmc7XG4gICAgc3Vic3RyaW5nV2hpdGVMaXN0OiBzdHJpbmdbXTtcbiAgICBtYXhFbnRpdHlDb3VudFVwZGF0ZTogbnVtYmVyO1xuICAgIGZvcmJpZGRlbkVudGl0eVR5cGVQYXR0ZXJuczogc3RyaW5nW107XG4gICAgZHJ5UnVuOiBib29sZWFuO1xuICAgIG51bWJlck9mV29ya2VyczogbnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIENsZWFuQWxsRW50aXR5VHlwZXNSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBwYXJlbnQ6IHN0cmluZztcbiAgICBsYW5ndWFnZUNvZGU6IHN0cmluZztcbiAgICBzcGVjaWFsQ2hhcmFjdGVyczogc3RyaW5nO1xuICAgIHN1YnN0cmluZ1doaXRlTGlzdDogc3RyaW5nW107XG4gICAgbWF4RW50aXR5Q291bnRVcGRhdGU6IG51bWJlcjtcbiAgICBmb3JiaWRkZW5FbnRpdHlUeXBlUGF0dGVybnM6IHN0cmluZ1tdO1xuICAgIGRyeVJ1bjogYm9vbGVhbjtcbiAgICBudW1iZXJPZldvcmtlcnM6IG51bWJlcjtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuQ2xlYW5BbGxFbnRpdHlUeXBlc1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBjbGFzcyBDbGVhbkFsbEVudGl0eVR5cGVzUmVzcG9uc2UgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LkNsZWFuQWxsRW50aXR5VHlwZXNSZXNwb25zZSc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IENsZWFuQWxsRW50aXR5VHlwZXNSZXNwb25zZSgpO1xuICAgIENsZWFuQWxsRW50aXR5VHlwZXNSZXNwb25zZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IENsZWFuQWxsRW50aXR5VHlwZXNSZXNwb25zZSkge1xuICAgIF9pbnN0YW5jZS5jbGVhbmVkRW50aXR5VHlwZXMgPSBfaW5zdGFuY2UuY2xlYW5lZEVudGl0eVR5cGVzIHx8IFtdO1xuICAgIF9pbnN0YW5jZS5kZWxldGVkRW50aXR5VHlwZXMgPSBfaW5zdGFuY2UuZGVsZXRlZEVudGl0eVR5cGVzIHx8IFtdO1xuICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlVXBkYXRlcyA9IF9pbnN0YW5jZS5lbnRpdHlUeXBlVXBkYXRlcyB8fCBbXTtcbiAgICBfaW5zdGFuY2UuZW50aXR5VHlwZURlbGV0aW9ucyA9IF9pbnN0YW5jZS5lbnRpdHlUeXBlRGVsZXRpb25zIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogQ2xlYW5BbGxFbnRpdHlUeXBlc1Jlc3BvbnNlLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJbml0aWFsaXplcjEgPSBuZXcgb25kZXdvTmx1MDA5LkVudGl0eVR5cGUoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMSxcbiAgICAgICAgICAgIG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgKF9pbnN0YW5jZS5jbGVhbmVkRW50aXR5VHlwZXMgPVxuICAgICAgICAgICAgX2luc3RhbmNlLmNsZWFuZWRFbnRpdHlUeXBlcyB8fCBbXSkucHVzaChtZXNzYWdlSW5pdGlhbGl6ZXIxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJbml0aWFsaXplcjIgPSBuZXcgb25kZXdvTmx1MDA5LkVudGl0eVR5cGUoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMixcbiAgICAgICAgICAgIG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgKF9pbnN0YW5jZS5kZWxldGVkRW50aXR5VHlwZXMgPVxuICAgICAgICAgICAgX2luc3RhbmNlLmRlbGV0ZWRFbnRpdHlUeXBlcyB8fCBbXSkucHVzaChtZXNzYWdlSW5pdGlhbGl6ZXIyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJbml0aWFsaXplcjMgPSBuZXcgRW50aXR5VHlwZVVwZGF0ZSgpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBtZXNzYWdlSW5pdGlhbGl6ZXIzLFxuICAgICAgICAgICAgRW50aXR5VHlwZVVwZGF0ZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIChfaW5zdGFuY2UuZW50aXR5VHlwZVVwZGF0ZXMgPVxuICAgICAgICAgICAgX2luc3RhbmNlLmVudGl0eVR5cGVVcGRhdGVzIHx8IFtdKS5wdXNoKG1lc3NhZ2VJbml0aWFsaXplcjMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUluaXRpYWxpemVyNCA9IG5ldyBFbnRpdHlUeXBlVXBkYXRlKCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjQsXG4gICAgICAgICAgICBFbnRpdHlUeXBlVXBkYXRlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgKF9pbnN0YW5jZS5lbnRpdHlUeXBlRGVsZXRpb25zID1cbiAgICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlRGVsZXRpb25zIHx8IFtdKS5wdXNoKG1lc3NhZ2VJbml0aWFsaXplcjQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQ2xlYW5BbGxFbnRpdHlUeXBlc1Jlc3BvbnNlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogQ2xlYW5BbGxFbnRpdHlUeXBlc1Jlc3BvbnNlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmNsZWFuZWRFbnRpdHlUeXBlcyAmJiBfaW5zdGFuY2UuY2xlYW5lZEVudGl0eVR5cGVzLmxlbmd0aCkge1xuICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkTWVzc2FnZShcbiAgICAgICAgMSxcbiAgICAgICAgX2luc3RhbmNlLmNsZWFuZWRFbnRpdHlUeXBlcyBhcyBhbnksXG4gICAgICAgIG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmRlbGV0ZWRFbnRpdHlUeXBlcyAmJiBfaW5zdGFuY2UuZGVsZXRlZEVudGl0eVR5cGVzLmxlbmd0aCkge1xuICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkTWVzc2FnZShcbiAgICAgICAgMixcbiAgICAgICAgX2luc3RhbmNlLmRlbGV0ZWRFbnRpdHlUeXBlcyBhcyBhbnksXG4gICAgICAgIG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmVudGl0eVR5cGVVcGRhdGVzICYmIF9pbnN0YW5jZS5lbnRpdHlUeXBlVXBkYXRlcy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDMsXG4gICAgICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlVXBkYXRlcyBhcyBhbnksXG4gICAgICAgIEVudGl0eVR5cGVVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuZW50aXR5VHlwZURlbGV0aW9ucyAmJiBfaW5zdGFuY2UuZW50aXR5VHlwZURlbGV0aW9ucy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDQsXG4gICAgICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlRGVsZXRpb25zIGFzIGFueSxcbiAgICAgICAgRW50aXR5VHlwZVVwZGF0ZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jbGVhbmVkRW50aXR5VHlwZXM/OiBvbmRld29ObHUwMDkuRW50aXR5VHlwZVtdO1xuICBwcml2YXRlIF9kZWxldGVkRW50aXR5VHlwZXM/OiBvbmRld29ObHUwMDkuRW50aXR5VHlwZVtdO1xuICBwcml2YXRlIF9lbnRpdHlUeXBlVXBkYXRlcz86IEVudGl0eVR5cGVVcGRhdGVbXTtcbiAgcHJpdmF0ZSBfZW50aXR5VHlwZURlbGV0aW9ucz86IEVudGl0eVR5cGVVcGRhdGVbXTtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIENsZWFuQWxsRW50aXR5VHlwZXNSZXNwb25zZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxDbGVhbkFsbEVudGl0eVR5cGVzUmVzcG9uc2UuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuY2xlYW5lZEVudGl0eVR5cGVzID0gKF92YWx1ZS5jbGVhbmVkRW50aXR5VHlwZXMgfHwgW10pLm1hcChcbiAgICAgIG0gPT4gbmV3IG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlKG0pXG4gICAgKTtcbiAgICB0aGlzLmRlbGV0ZWRFbnRpdHlUeXBlcyA9IChfdmFsdWUuZGVsZXRlZEVudGl0eVR5cGVzIHx8IFtdKS5tYXAoXG4gICAgICBtID0+IG5ldyBvbmRld29ObHUwMDkuRW50aXR5VHlwZShtKVxuICAgICk7XG4gICAgdGhpcy5lbnRpdHlUeXBlVXBkYXRlcyA9IChfdmFsdWUuZW50aXR5VHlwZVVwZGF0ZXMgfHwgW10pLm1hcChcbiAgICAgIG0gPT4gbmV3IEVudGl0eVR5cGVVcGRhdGUobSlcbiAgICApO1xuICAgIHRoaXMuZW50aXR5VHlwZURlbGV0aW9ucyA9IChfdmFsdWUuZW50aXR5VHlwZURlbGV0aW9ucyB8fCBbXSkubWFwKFxuICAgICAgbSA9PiBuZXcgRW50aXR5VHlwZVVwZGF0ZShtKVxuICAgICk7XG4gICAgQ2xlYW5BbGxFbnRpdHlUeXBlc1Jlc3BvbnNlLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgY2xlYW5lZEVudGl0eVR5cGVzKCk6IG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jbGVhbmVkRW50aXR5VHlwZXM7XG4gIH1cbiAgc2V0IGNsZWFuZWRFbnRpdHlUeXBlcyh2YWx1ZTogb25kZXdvTmx1MDA5LkVudGl0eVR5cGVbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2NsZWFuZWRFbnRpdHlUeXBlcyA9IHZhbHVlO1xuICB9XG4gIGdldCBkZWxldGVkRW50aXR5VHlwZXMoKTogb25kZXdvTmx1MDA5LkVudGl0eVR5cGVbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RlbGV0ZWRFbnRpdHlUeXBlcztcbiAgfVxuICBzZXQgZGVsZXRlZEVudGl0eVR5cGVzKHZhbHVlOiBvbmRld29ObHUwMDkuRW50aXR5VHlwZVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZGVsZXRlZEVudGl0eVR5cGVzID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGVudGl0eVR5cGVVcGRhdGVzKCk6IEVudGl0eVR5cGVVcGRhdGVbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eVR5cGVVcGRhdGVzO1xuICB9XG4gIHNldCBlbnRpdHlUeXBlVXBkYXRlcyh2YWx1ZTogRW50aXR5VHlwZVVwZGF0ZVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZW50aXR5VHlwZVVwZGF0ZXMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgZW50aXR5VHlwZURlbGV0aW9ucygpOiBFbnRpdHlUeXBlVXBkYXRlW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9lbnRpdHlUeXBlRGVsZXRpb25zO1xuICB9XG4gIHNldCBlbnRpdHlUeXBlRGVsZXRpb25zKHZhbHVlOiBFbnRpdHlUeXBlVXBkYXRlW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9lbnRpdHlUeXBlRGVsZXRpb25zID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgQ2xlYW5BbGxFbnRpdHlUeXBlc1Jlc3BvbnNlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IENsZWFuQWxsRW50aXR5VHlwZXNSZXNwb25zZS5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsZWFuZWRFbnRpdHlUeXBlczogKHRoaXMuY2xlYW5lZEVudGl0eVR5cGVzIHx8IFtdKS5tYXAobSA9PlxuICAgICAgICBtLnRvT2JqZWN0KClcbiAgICAgICksXG4gICAgICBkZWxldGVkRW50aXR5VHlwZXM6ICh0aGlzLmRlbGV0ZWRFbnRpdHlUeXBlcyB8fCBbXSkubWFwKG0gPT5cbiAgICAgICAgbS50b09iamVjdCgpXG4gICAgICApLFxuICAgICAgZW50aXR5VHlwZVVwZGF0ZXM6ICh0aGlzLmVudGl0eVR5cGVVcGRhdGVzIHx8IFtdKS5tYXAobSA9PiBtLnRvT2JqZWN0KCkpLFxuICAgICAgZW50aXR5VHlwZURlbGV0aW9uczogKHRoaXMuZW50aXR5VHlwZURlbGV0aW9ucyB8fCBbXSkubWFwKG0gPT5cbiAgICAgICAgbS50b09iamVjdCgpXG4gICAgICApXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQ2xlYW5BbGxFbnRpdHlUeXBlc1Jlc3BvbnNlLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xlYW5lZEVudGl0eVR5cGVzOiAodGhpcy5jbGVhbmVkRW50aXR5VHlwZXMgfHwgW10pLm1hcChtID0+XG4gICAgICAgIG0udG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgICksXG4gICAgICBkZWxldGVkRW50aXR5VHlwZXM6ICh0aGlzLmRlbGV0ZWRFbnRpdHlUeXBlcyB8fCBbXSkubWFwKG0gPT5cbiAgICAgICAgbS50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgKSxcbiAgICAgIGVudGl0eVR5cGVVcGRhdGVzOiAodGhpcy5lbnRpdHlUeXBlVXBkYXRlcyB8fCBbXSkubWFwKG0gPT5cbiAgICAgICAgbS50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgKSxcbiAgICAgIGVudGl0eVR5cGVEZWxldGlvbnM6ICh0aGlzLmVudGl0eVR5cGVEZWxldGlvbnMgfHwgW10pLm1hcChtID0+XG4gICAgICAgIG0udG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgIClcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIENsZWFuQWxsRW50aXR5VHlwZXNSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgQ2xlYW5BbGxFbnRpdHlUeXBlc1Jlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBjbGVhbmVkRW50aXR5VHlwZXM/OiBvbmRld29ObHUwMDkuRW50aXR5VHlwZS5Bc09iamVjdFtdO1xuICAgIGRlbGV0ZWRFbnRpdHlUeXBlcz86IG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlLkFzT2JqZWN0W107XG4gICAgZW50aXR5VHlwZVVwZGF0ZXM/OiBFbnRpdHlUeXBlVXBkYXRlLkFzT2JqZWN0W107XG4gICAgZW50aXR5VHlwZURlbGV0aW9ucz86IEVudGl0eVR5cGVVcGRhdGUuQXNPYmplY3RbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBDbGVhbkFsbEVudGl0eVR5cGVzUmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIGNsZWFuZWRFbnRpdHlUeXBlczogb25kZXdvTmx1MDA5LkVudGl0eVR5cGUuQXNQcm90b2J1ZkpTT05bXSB8IG51bGw7XG4gICAgZGVsZXRlZEVudGl0eVR5cGVzOiBvbmRld29ObHUwMDkuRW50aXR5VHlwZS5Bc1Byb3RvYnVmSlNPTltdIHwgbnVsbDtcbiAgICBlbnRpdHlUeXBlVXBkYXRlczogRW50aXR5VHlwZVVwZGF0ZS5Bc1Byb3RvYnVmSlNPTltdIHwgbnVsbDtcbiAgICBlbnRpdHlUeXBlRGVsZXRpb25zOiBFbnRpdHlUeXBlVXBkYXRlLkFzUHJvdG9idWZKU09OW10gfCBudWxsO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5DbGVhbkVudGl0eVR5cGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBDbGVhbkVudGl0eVR5cGVSZXF1ZXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5DbGVhbkVudGl0eVR5cGVSZXF1ZXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQ2xlYW5FbnRpdHlUeXBlUmVxdWVzdCgpO1xuICAgIENsZWFuRW50aXR5VHlwZVJlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBDbGVhbkVudGl0eVR5cGVSZXF1ZXN0KSB7XG4gICAgX2luc3RhbmNlLnBhcmVudCA9IF9pbnN0YW5jZS5wYXJlbnQgfHwgJyc7XG4gICAgX2luc3RhbmNlLmVudGl0eVR5cGVOYW1lID0gX2luc3RhbmNlLmVudGl0eVR5cGVOYW1lIHx8ICcnO1xuICAgIF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUgPSBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlIHx8ICcnO1xuICAgIF9pbnN0YW5jZS5zcGVjaWFsQ2hhcmFjdGVycyA9IF9pbnN0YW5jZS5zcGVjaWFsQ2hhcmFjdGVycyB8fCAnJztcbiAgICBfaW5zdGFuY2Uuc3Vic3RyaW5nV2hpdGVMaXN0ID0gX2luc3RhbmNlLnN1YnN0cmluZ1doaXRlTGlzdCB8fCBbXTtcbiAgICBfaW5zdGFuY2UubWF4RW50aXR5Q291bnRVcGRhdGUgPSBfaW5zdGFuY2UubWF4RW50aXR5Q291bnRVcGRhdGUgfHwgMDtcbiAgICBfaW5zdGFuY2UuZHJ5UnVuID0gX2luc3RhbmNlLmRyeVJ1biB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IENsZWFuRW50aXR5VHlwZVJlcXVlc3QsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLnBhcmVudCA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgX2luc3RhbmNlLmVudGl0eVR5cGVOYW1lID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIChfaW5zdGFuY2Uuc3Vic3RyaW5nV2hpdGVMaXN0ID1cbiAgICAgICAgICAgIF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QgfHwgW10pLnB1c2goX3JlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgX2luc3RhbmNlLm1heEVudGl0eUNvdW50VXBkYXRlID0gX3JlYWRlci5yZWFkSW50MzIoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIF9pbnN0YW5jZS5kcnlSdW4gPSBfcmVhZGVyLnJlYWRCb29sKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDbGVhbkVudGl0eVR5cGVSZXF1ZXN0LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogQ2xlYW5FbnRpdHlUeXBlUmVxdWVzdCxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5wYXJlbnQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLnBhcmVudCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuZW50aXR5VHlwZU5hbWUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMiwgX2luc3RhbmNlLmVudGl0eVR5cGVOYW1lKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMywgX2luc3RhbmNlLmxhbmd1YWdlQ29kZSk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoNCwgX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5zdWJzdHJpbmdXaGl0ZUxpc3QgJiYgX2luc3RhbmNlLnN1YnN0cmluZ1doaXRlTGlzdC5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZFN0cmluZyg1LCBfaW5zdGFuY2Uuc3Vic3RyaW5nV2hpdGVMaXN0KTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5tYXhFbnRpdHlDb3VudFVwZGF0ZSkge1xuICAgICAgX3dyaXRlci53cml0ZUludDMyKDYsIF9pbnN0YW5jZS5tYXhFbnRpdHlDb3VudFVwZGF0ZSk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuZHJ5UnVuKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQm9vbCg3LCBfaW5zdGFuY2UuZHJ5UnVuKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXJlbnQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfZW50aXR5VHlwZU5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2VDb2RlOiBzdHJpbmc7XG4gIHByaXZhdGUgX3NwZWNpYWxDaGFyYWN0ZXJzOiBzdHJpbmc7XG4gIHByaXZhdGUgX3N1YnN0cmluZ1doaXRlTGlzdDogc3RyaW5nW107XG4gIHByaXZhdGUgX21heEVudGl0eUNvdW50VXBkYXRlOiBudW1iZXI7XG4gIHByaXZhdGUgX2RyeVJ1bjogYm9vbGVhbjtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIENsZWFuRW50aXR5VHlwZVJlcXVlc3QgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8Q2xlYW5FbnRpdHlUeXBlUmVxdWVzdC5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5wYXJlbnQgPSBfdmFsdWUucGFyZW50O1xuICAgIHRoaXMuZW50aXR5VHlwZU5hbWUgPSBfdmFsdWUuZW50aXR5VHlwZU5hbWU7XG4gICAgdGhpcy5sYW5ndWFnZUNvZGUgPSBfdmFsdWUubGFuZ3VhZ2VDb2RlO1xuICAgIHRoaXMuc3BlY2lhbENoYXJhY3RlcnMgPSBfdmFsdWUuc3BlY2lhbENoYXJhY3RlcnM7XG4gICAgdGhpcy5zdWJzdHJpbmdXaGl0ZUxpc3QgPSAoX3ZhbHVlLnN1YnN0cmluZ1doaXRlTGlzdCB8fCBbXSkuc2xpY2UoKTtcbiAgICB0aGlzLm1heEVudGl0eUNvdW50VXBkYXRlID0gX3ZhbHVlLm1heEVudGl0eUNvdW50VXBkYXRlO1xuICAgIHRoaXMuZHJ5UnVuID0gX3ZhbHVlLmRyeVJ1bjtcbiAgICBDbGVhbkVudGl0eVR5cGVSZXF1ZXN0LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgcGFyZW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcbiAgfVxuICBzZXQgcGFyZW50KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9wYXJlbnQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgZW50aXR5VHlwZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZW50aXR5VHlwZU5hbWU7XG4gIH1cbiAgc2V0IGVudGl0eVR5cGVOYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9lbnRpdHlUeXBlTmFtZSA9IHZhbHVlO1xuICB9XG4gIGdldCBsYW5ndWFnZUNvZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VDb2RlO1xuICB9XG4gIHNldCBsYW5ndWFnZUNvZGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2xhbmd1YWdlQ29kZSA9IHZhbHVlO1xuICB9XG4gIGdldCBzcGVjaWFsQ2hhcmFjdGVycygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zcGVjaWFsQ2hhcmFjdGVycztcbiAgfVxuICBzZXQgc3BlY2lhbENoYXJhY3RlcnModmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3NwZWNpYWxDaGFyYWN0ZXJzID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHN1YnN0cmluZ1doaXRlTGlzdCgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3N1YnN0cmluZ1doaXRlTGlzdDtcbiAgfVxuICBzZXQgc3Vic3RyaW5nV2hpdGVMaXN0KHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX3N1YnN0cmluZ1doaXRlTGlzdCA9IHZhbHVlO1xuICB9XG4gIGdldCBtYXhFbnRpdHlDb3VudFVwZGF0ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9tYXhFbnRpdHlDb3VudFVwZGF0ZTtcbiAgfVxuICBzZXQgbWF4RW50aXR5Q291bnRVcGRhdGUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heEVudGl0eUNvdW50VXBkYXRlID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGRyeVJ1bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZHJ5UnVuO1xuICB9XG4gIHNldCBkcnlSdW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kcnlSdW4gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBDbGVhbkVudGl0eVR5cGVSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IENsZWFuRW50aXR5VHlwZVJlcXVlc3QuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgZW50aXR5VHlwZU5hbWU6IHRoaXMuZW50aXR5VHlwZU5hbWUsXG4gICAgICBsYW5ndWFnZUNvZGU6IHRoaXMubGFuZ3VhZ2VDb2RlLFxuICAgICAgc3BlY2lhbENoYXJhY3RlcnM6IHRoaXMuc3BlY2lhbENoYXJhY3RlcnMsXG4gICAgICBzdWJzdHJpbmdXaGl0ZUxpc3Q6ICh0aGlzLnN1YnN0cmluZ1doaXRlTGlzdCB8fCBbXSkuc2xpY2UoKSxcbiAgICAgIG1heEVudGl0eUNvdW50VXBkYXRlOiB0aGlzLm1heEVudGl0eUNvdW50VXBkYXRlLFxuICAgICAgZHJ5UnVuOiB0aGlzLmRyeVJ1blxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IENsZWFuRW50aXR5VHlwZVJlcXVlc3QuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgZW50aXR5VHlwZU5hbWU6IHRoaXMuZW50aXR5VHlwZU5hbWUsXG4gICAgICBsYW5ndWFnZUNvZGU6IHRoaXMubGFuZ3VhZ2VDb2RlLFxuICAgICAgc3BlY2lhbENoYXJhY3RlcnM6IHRoaXMuc3BlY2lhbENoYXJhY3RlcnMsXG4gICAgICBzdWJzdHJpbmdXaGl0ZUxpc3Q6ICh0aGlzLnN1YnN0cmluZ1doaXRlTGlzdCB8fCBbXSkuc2xpY2UoKSxcbiAgICAgIG1heEVudGl0eUNvdW50VXBkYXRlOiB0aGlzLm1heEVudGl0eUNvdW50VXBkYXRlLFxuICAgICAgZHJ5UnVuOiB0aGlzLmRyeVJ1blxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgQ2xlYW5FbnRpdHlUeXBlUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgQ2xlYW5FbnRpdHlUeXBlUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgcGFyZW50OiBzdHJpbmc7XG4gICAgZW50aXR5VHlwZU5hbWU6IHN0cmluZztcbiAgICBsYW5ndWFnZUNvZGU6IHN0cmluZztcbiAgICBzcGVjaWFsQ2hhcmFjdGVyczogc3RyaW5nO1xuICAgIHN1YnN0cmluZ1doaXRlTGlzdDogc3RyaW5nW107XG4gICAgbWF4RW50aXR5Q291bnRVcGRhdGU6IG51bWJlcjtcbiAgICBkcnlSdW46IGJvb2xlYW47XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgQ2xlYW5FbnRpdHlUeXBlUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgcGFyZW50OiBzdHJpbmc7XG4gICAgZW50aXR5VHlwZU5hbWU6IHN0cmluZztcbiAgICBsYW5ndWFnZUNvZGU6IHN0cmluZztcbiAgICBzcGVjaWFsQ2hhcmFjdGVyczogc3RyaW5nO1xuICAgIHN1YnN0cmluZ1doaXRlTGlzdDogc3RyaW5nW107XG4gICAgbWF4RW50aXR5Q291bnRVcGRhdGU6IG51bWJlcjtcbiAgICBkcnlSdW46IGJvb2xlYW47XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1LkNsZWFuRW50aXR5VHlwZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBjbGFzcyBDbGVhbkVudGl0eVR5cGVSZXNwb25zZSBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuQ2xlYW5FbnRpdHlUeXBlUmVzcG9uc2UnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBDbGVhbkVudGl0eVR5cGVSZXNwb25zZSgpO1xuICAgIENsZWFuRW50aXR5VHlwZVJlc3BvbnNlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogQ2xlYW5FbnRpdHlUeXBlUmVzcG9uc2UpIHtcbiAgICBfaW5zdGFuY2UuY2xlYW5lZEVudGl0eVR5cGUgPSBfaW5zdGFuY2UuY2xlYW5lZEVudGl0eVR5cGUgfHwgdW5kZWZpbmVkO1xuICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlVXBkYXRlID0gX2luc3RhbmNlLmVudGl0eVR5cGVVcGRhdGUgfHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogQ2xlYW5FbnRpdHlUeXBlUmVzcG9uc2UsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLmNsZWFuZWRFbnRpdHlUeXBlID0gbmV3IG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlKCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIF9pbnN0YW5jZS5jbGVhbmVkRW50aXR5VHlwZSxcbiAgICAgICAgICAgIG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UuZW50aXR5VHlwZVVwZGF0ZSA9IG5ldyBFbnRpdHlUeXBlVXBkYXRlKCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlVXBkYXRlLFxuICAgICAgICAgICAgRW50aXR5VHlwZVVwZGF0ZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQ2xlYW5FbnRpdHlUeXBlUmVzcG9uc2UucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBDbGVhbkVudGl0eVR5cGVSZXNwb25zZSxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5jbGVhbmVkRW50aXR5VHlwZSkge1xuICAgICAgX3dyaXRlci53cml0ZU1lc3NhZ2UoXG4gICAgICAgIDEsXG4gICAgICAgIF9pbnN0YW5jZS5jbGVhbmVkRW50aXR5VHlwZSBhcyBhbnksXG4gICAgICAgIG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmVudGl0eVR5cGVVcGRhdGUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAyLFxuICAgICAgICBfaW5zdGFuY2UuZW50aXR5VHlwZVVwZGF0ZSBhcyBhbnksXG4gICAgICAgIEVudGl0eVR5cGVVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2xlYW5lZEVudGl0eVR5cGU/OiBvbmRld29ObHUwMDkuRW50aXR5VHlwZTtcbiAgcHJpdmF0ZSBfZW50aXR5VHlwZVVwZGF0ZT86IEVudGl0eVR5cGVVcGRhdGU7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBDbGVhbkVudGl0eVR5cGVSZXNwb25zZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxDbGVhbkVudGl0eVR5cGVSZXNwb25zZS5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5jbGVhbmVkRW50aXR5VHlwZSA9IF92YWx1ZS5jbGVhbmVkRW50aXR5VHlwZVxuICAgICAgPyBuZXcgb25kZXdvTmx1MDA5LkVudGl0eVR5cGUoX3ZhbHVlLmNsZWFuZWRFbnRpdHlUeXBlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbnRpdHlUeXBlVXBkYXRlID0gX3ZhbHVlLmVudGl0eVR5cGVVcGRhdGVcbiAgICAgID8gbmV3IEVudGl0eVR5cGVVcGRhdGUoX3ZhbHVlLmVudGl0eVR5cGVVcGRhdGUpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBDbGVhbkVudGl0eVR5cGVSZXNwb25zZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGNsZWFuZWRFbnRpdHlUeXBlKCk6IG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY2xlYW5lZEVudGl0eVR5cGU7XG4gIH1cbiAgc2V0IGNsZWFuZWRFbnRpdHlUeXBlKHZhbHVlOiBvbmRld29ObHUwMDkuRW50aXR5VHlwZSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2NsZWFuZWRFbnRpdHlUeXBlID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGVudGl0eVR5cGVVcGRhdGUoKTogRW50aXR5VHlwZVVwZGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eVR5cGVVcGRhdGU7XG4gIH1cbiAgc2V0IGVudGl0eVR5cGVVcGRhdGUodmFsdWU6IEVudGl0eVR5cGVVcGRhdGUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9lbnRpdHlUeXBlVXBkYXRlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgQ2xlYW5FbnRpdHlUeXBlUmVzcG9uc2Uuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogQ2xlYW5FbnRpdHlUeXBlUmVzcG9uc2UuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBjbGVhbmVkRW50aXR5VHlwZTogdGhpcy5jbGVhbmVkRW50aXR5VHlwZVxuICAgICAgICA/IHRoaXMuY2xlYW5lZEVudGl0eVR5cGUudG9PYmplY3QoKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGVudGl0eVR5cGVVcGRhdGU6IHRoaXMuZW50aXR5VHlwZVVwZGF0ZVxuICAgICAgICA/IHRoaXMuZW50aXR5VHlwZVVwZGF0ZS50b09iamVjdCgpXG4gICAgICAgIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQ2xlYW5FbnRpdHlUeXBlUmVzcG9uc2UuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBjbGVhbmVkRW50aXR5VHlwZTogdGhpcy5jbGVhbmVkRW50aXR5VHlwZVxuICAgICAgICA/IHRoaXMuY2xlYW5lZEVudGl0eVR5cGUudG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgICAgOiBudWxsLFxuICAgICAgZW50aXR5VHlwZVVwZGF0ZTogdGhpcy5lbnRpdHlUeXBlVXBkYXRlXG4gICAgICAgID8gdGhpcy5lbnRpdHlUeXBlVXBkYXRlLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICAgIDogbnVsbFxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgQ2xlYW5FbnRpdHlUeXBlUmVzcG9uc2Uge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIENsZWFuRW50aXR5VHlwZVJlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBjbGVhbmVkRW50aXR5VHlwZT86IG9uZGV3b05sdTAwOS5FbnRpdHlUeXBlLkFzT2JqZWN0O1xuICAgIGVudGl0eVR5cGVVcGRhdGU/OiBFbnRpdHlUeXBlVXBkYXRlLkFzT2JqZWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIENsZWFuRW50aXR5VHlwZVJlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBjbGVhbmVkRW50aXR5VHlwZTogb25kZXdvTmx1MDA5LkVudGl0eVR5cGUuQXNQcm90b2J1ZkpTT04gfCBudWxsO1xuICAgIGVudGl0eVR5cGVVcGRhdGU6IEVudGl0eVR5cGVVcGRhdGUuQXNQcm90b2J1ZkpTT04gfCBudWxsO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5BZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBBZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5BZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQWRkVHJhaW5pbmdQaHJhc2VzUmVxdWVzdCgpO1xuICAgIEFkZFRyYWluaW5nUGhyYXNlc1JlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBBZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0KSB7XG4gICAgX2luc3RhbmNlLnBhcmVudCA9IF9pbnN0YW5jZS5wYXJlbnQgfHwgJyc7XG4gICAgX2luc3RhbmNlLmxhbmd1YWdlQ29kZSA9IF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUgfHwgJyc7XG4gICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlTGlzdCA9IF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUxpc3QgfHwgW107XG4gICAgX2luc3RhbmNlLmV4dHJhY3RFbnRpdGllcyA9IF9pbnN0YW5jZS5leHRyYWN0RW50aXRpZXMgfHwgZmFsc2U7XG4gICAgX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzID0gX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzIHx8ICcnO1xuICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zID1cbiAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zIHx8IHVuZGVmaW5lZDtcbiAgICBfaW5zdGFuY2UubnVtYmVyT2ZXb3JrZXJzID0gX2luc3RhbmNlLm51bWJlck9mV29ya2VycyB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogQWRkVHJhaW5pbmdQaHJhc2VzUmVxdWVzdCxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UucGFyZW50ID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSW5pdGlhbGl6ZXIzID0gbmV3IEFkZFRyYWluaW5nUGhyYXNlc1JlcXVlc3QuVHJhaW5pbmdQaHJhc2VGb3JJbnRlbnQoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMyxcbiAgICAgICAgICAgIEFkZFRyYWluaW5nUGhyYXNlc1JlcXVlc3QuVHJhaW5pbmdQaHJhc2VGb3JJbnRlbnRcbiAgICAgICAgICAgICAgLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgKF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUxpc3QgPVxuICAgICAgICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlTGlzdCB8fCBbXSkucHVzaChtZXNzYWdlSW5pdGlhbGl6ZXIzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIF9pbnN0YW5jZS5leHRyYWN0RW50aXRpZXMgPSBfcmVhZGVyLnJlYWRCb29sKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zID0gbmV3IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMsXG4gICAgICAgICAgICBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBfaW5zdGFuY2UubnVtYmVyT2ZXb3JrZXJzID0gX3JlYWRlci5yZWFkSW50MzIoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIEFkZFRyYWluaW5nUGhyYXNlc1JlcXVlc3QucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBBZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0LFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLnBhcmVudCkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygxLCBfaW5zdGFuY2UucGFyZW50KTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMiwgX2luc3RhbmNlLmxhbmd1YWdlQ29kZSk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2VMaXN0ICYmIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUxpc3QubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRNZXNzYWdlKFxuICAgICAgICAzLFxuICAgICAgICBfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2VMaXN0IGFzIGFueSxcbiAgICAgICAgQWRkVHJhaW5pbmdQaHJhc2VzUmVxdWVzdC5UcmFpbmluZ1BocmFzZUZvckludGVudFxuICAgICAgICAgIC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5leHRyYWN0RW50aXRpZXMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVCb29sKDQsIF9pbnN0YW5jZS5leHRyYWN0RW50aXRpZXMpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDUsIF9pbnN0YW5jZS5zcGVjaWFsQ2hhcmFjdGVycyk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucykge1xuICAgICAgX3dyaXRlci53cml0ZU1lc3NhZ2UoXG4gICAgICAgIDYsXG4gICAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zIGFzIGFueSxcbiAgICAgICAgVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5udW1iZXJPZldvcmtlcnMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVJbnQzMig3LCBfaW5zdGFuY2UubnVtYmVyT2ZXb3JrZXJzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXJlbnQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2VDb2RlOiBzdHJpbmc7XG4gIHByaXZhdGUgX3RyYWluaW5nUGhyYXNlTGlzdD86IEFkZFRyYWluaW5nUGhyYXNlc1JlcXVlc3QuVHJhaW5pbmdQaHJhc2VGb3JJbnRlbnRbXTtcbiAgcHJpdmF0ZSBfZXh0cmFjdEVudGl0aWVzOiBib29sZWFuO1xuICBwcml2YXRlIF9zcGVjaWFsQ2hhcmFjdGVyczogc3RyaW5nO1xuICBwcml2YXRlIF90cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zPzogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucztcbiAgcHJpdmF0ZSBfbnVtYmVyT2ZXb3JrZXJzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBBZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPEFkZFRyYWluaW5nUGhyYXNlc1JlcXVlc3QuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMucGFyZW50ID0gX3ZhbHVlLnBhcmVudDtcbiAgICB0aGlzLmxhbmd1YWdlQ29kZSA9IF92YWx1ZS5sYW5ndWFnZUNvZGU7XG4gICAgdGhpcy50cmFpbmluZ1BocmFzZUxpc3QgPSAoX3ZhbHVlLnRyYWluaW5nUGhyYXNlTGlzdCB8fCBbXSkubWFwKFxuICAgICAgbSA9PiBuZXcgQWRkVHJhaW5pbmdQaHJhc2VzUmVxdWVzdC5UcmFpbmluZ1BocmFzZUZvckludGVudChtKVxuICAgICk7XG4gICAgdGhpcy5leHRyYWN0RW50aXRpZXMgPSBfdmFsdWUuZXh0cmFjdEVudGl0aWVzO1xuICAgIHRoaXMuc3BlY2lhbENoYXJhY3RlcnMgPSBfdmFsdWUuc3BlY2lhbENoYXJhY3RlcnM7XG4gICAgdGhpcy50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zID0gX3ZhbHVlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnNcbiAgICAgID8gbmV3IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMoX3ZhbHVlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLm51bWJlck9mV29ya2VycyA9IF92YWx1ZS5udW1iZXJPZldvcmtlcnM7XG4gICAgQWRkVHJhaW5pbmdQaHJhc2VzUmVxdWVzdC5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IHBhcmVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnQ7XG4gIH1cbiAgc2V0IHBhcmVudCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcGFyZW50ID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGxhbmd1YWdlQ29kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZUNvZGU7XG4gIH1cbiAgc2V0IGxhbmd1YWdlQ29kZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbGFuZ3VhZ2VDb2RlID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHRyYWluaW5nUGhyYXNlTGlzdCgpOlxuICAgIHwgQWRkVHJhaW5pbmdQaHJhc2VzUmVxdWVzdC5UcmFpbmluZ1BocmFzZUZvckludGVudFtdXG4gICAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90cmFpbmluZ1BocmFzZUxpc3Q7XG4gIH1cbiAgc2V0IHRyYWluaW5nUGhyYXNlTGlzdChcbiAgICB2YWx1ZTogQWRkVHJhaW5pbmdQaHJhc2VzUmVxdWVzdC5UcmFpbmluZ1BocmFzZUZvckludGVudFtdIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuX3RyYWluaW5nUGhyYXNlTGlzdCA9IHZhbHVlO1xuICB9XG4gIGdldCBleHRyYWN0RW50aXRpZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2V4dHJhY3RFbnRpdGllcztcbiAgfVxuICBzZXQgZXh0cmFjdEVudGl0aWVzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZXh0cmFjdEVudGl0aWVzID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHNwZWNpYWxDaGFyYWN0ZXJzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NwZWNpYWxDaGFyYWN0ZXJzO1xuICB9XG4gIHNldCBzcGVjaWFsQ2hhcmFjdGVycyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fc3BlY2lhbENoYXJhY3RlcnMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucygpOiBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucztcbiAgfVxuICBzZXQgdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyhcbiAgICB2YWx1ZTogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyB8IHVuZGVmaW5lZFxuICApIHtcbiAgICB0aGlzLl90cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zID0gdmFsdWU7XG4gIH1cbiAgZ2V0IG51bWJlck9mV29ya2VycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9udW1iZXJPZldvcmtlcnM7XG4gIH1cbiAgc2V0IG51bWJlck9mV29ya2Vycyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbnVtYmVyT2ZXb3JrZXJzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgQWRkVHJhaW5pbmdQaHJhc2VzUmVxdWVzdC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBBZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyZW50OiB0aGlzLnBhcmVudCxcbiAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUsXG4gICAgICB0cmFpbmluZ1BocmFzZUxpc3Q6ICh0aGlzLnRyYWluaW5nUGhyYXNlTGlzdCB8fCBbXSkubWFwKG0gPT5cbiAgICAgICAgbS50b09iamVjdCgpXG4gICAgICApLFxuICAgICAgZXh0cmFjdEVudGl0aWVzOiB0aGlzLmV4dHJhY3RFbnRpdGllcyxcbiAgICAgIHNwZWNpYWxDaGFyYWN0ZXJzOiB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLFxuICAgICAgdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uczogdGhpcy50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zXG4gICAgICAgID8gdGhpcy50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLnRvT2JqZWN0KClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBudW1iZXJPZldvcmtlcnM6IHRoaXMubnVtYmVyT2ZXb3JrZXJzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQWRkVHJhaW5pbmdQaHJhc2VzUmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmVudDogdGhpcy5wYXJlbnQsXG4gICAgICBsYW5ndWFnZUNvZGU6IHRoaXMubGFuZ3VhZ2VDb2RlLFxuICAgICAgdHJhaW5pbmdQaHJhc2VMaXN0OiAodGhpcy50cmFpbmluZ1BocmFzZUxpc3QgfHwgW10pLm1hcChtID0+XG4gICAgICAgIG0udG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgICksXG4gICAgICBleHRyYWN0RW50aXRpZXM6IHRoaXMuZXh0cmFjdEVudGl0aWVzLFxuICAgICAgc3BlY2lhbENoYXJhY3RlcnM6IHRoaXMuc3BlY2lhbENoYXJhY3RlcnMsXG4gICAgICB0cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zOiB0aGlzLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnNcbiAgICAgICAgPyB0aGlzLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMudG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgICAgOiBudWxsLFxuICAgICAgbnVtYmVyT2ZXb3JrZXJzOiB0aGlzLm51bWJlck9mV29ya2Vyc1xuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgQWRkVHJhaW5pbmdQaHJhc2VzUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgQWRkVHJhaW5pbmdQaHJhc2VzUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgcGFyZW50OiBzdHJpbmc7XG4gICAgbGFuZ3VhZ2VDb2RlOiBzdHJpbmc7XG4gICAgdHJhaW5pbmdQaHJhc2VMaXN0PzogQWRkVHJhaW5pbmdQaHJhc2VzUmVxdWVzdC5UcmFpbmluZ1BocmFzZUZvckludGVudC5Bc09iamVjdFtdO1xuICAgIGV4dHJhY3RFbnRpdGllczogYm9vbGVhbjtcbiAgICBzcGVjaWFsQ2hhcmFjdGVyczogc3RyaW5nO1xuICAgIHRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnM/OiBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLkFzT2JqZWN0O1xuICAgIG51bWJlck9mV29ya2VyczogbnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEFkZFRyYWluaW5nUGhyYXNlc1JlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIHBhcmVudDogc3RyaW5nO1xuICAgIGxhbmd1YWdlQ29kZTogc3RyaW5nO1xuICAgIHRyYWluaW5nUGhyYXNlTGlzdDpcbiAgICAgIHwgQWRkVHJhaW5pbmdQaHJhc2VzUmVxdWVzdC5UcmFpbmluZ1BocmFzZUZvckludGVudC5Bc1Byb3RvYnVmSlNPTltdXG4gICAgICB8IG51bGw7XG4gICAgZXh0cmFjdEVudGl0aWVzOiBib29sZWFuO1xuICAgIHNwZWNpYWxDaGFyYWN0ZXJzOiBzdHJpbmc7XG4gICAgdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uczogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucy5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gICAgbnVtYmVyT2ZXb3JrZXJzOiBudW1iZXI7XG4gIH1cblxuICAvKipcbiAgICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5BZGRUcmFpbmluZ1BocmFzZXNSZXF1ZXN0LlRyYWluaW5nUGhyYXNlRm9ySW50ZW50XG4gICAqL1xuICBleHBvcnQgY2xhc3MgVHJhaW5pbmdQaHJhc2VGb3JJbnRlbnQgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gICAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuQWRkVHJhaW5pbmdQaHJhc2VzUmVxdWVzdC5UcmFpbmluZ1BocmFzZUZvckludGVudCc7XG5cbiAgICAvKipcbiAgICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFRyYWluaW5nUGhyYXNlRm9ySW50ZW50KCk7XG4gICAgICBUcmFpbmluZ1BocmFzZUZvckludGVudC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogVHJhaW5pbmdQaHJhc2VGb3JJbnRlbnQpIHtcbiAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZSA9IF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZSB8fCAnJztcbiAgICAgIF9pbnN0YW5jZS5pbnRlbnREaXNwbGF5TmFtZSA9IF9pbnN0YW5jZS5pbnRlbnREaXNwbGF5TmFtZSB8fCAnJztcbiAgICAgIF9pbnN0YW5jZS5lbnRpdGllcyA9IF9pbnN0YW5jZS5lbnRpdGllcyB8fCBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgX2luc3RhbmNlOiBUcmFpbmluZ1BocmFzZUZvckludGVudCxcbiAgICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICAgICkge1xuICAgICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZSA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgX2luc3RhbmNlLmludGVudERpc3BsYXlOYW1lID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlSW5pdGlhbGl6ZXIzID0gbmV3IG9uZGV3b05sdTAwOC5JbnRlbnQuVHJhaW5pbmdQaHJhc2UuRW50aXR5KCk7XG4gICAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgICBtZXNzYWdlSW5pdGlhbGl6ZXIzLFxuICAgICAgICAgICAgICBvbmRld29ObHUwMDguSW50ZW50LlRyYWluaW5nUGhyYXNlLkVudGl0eVxuICAgICAgICAgICAgICAgIC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAoX2luc3RhbmNlLmVudGl0aWVzID0gX2luc3RhbmNlLmVudGl0aWVzIHx8IFtdKS5wdXNoKFxuICAgICAgICAgICAgICBtZXNzYWdlSW5pdGlhbGl6ZXIzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgVHJhaW5pbmdQaHJhc2VGb3JJbnRlbnQucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICAgIF9pbnN0YW5jZTogVHJhaW5pbmdQaHJhc2VGb3JJbnRlbnQsXG4gICAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgICApIHtcbiAgICAgIGlmIChfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2UpIHtcbiAgICAgICAgX3dyaXRlci53cml0ZVN0cmluZygxLCBfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2UpO1xuICAgICAgfVxuICAgICAgaWYgKF9pbnN0YW5jZS5pbnRlbnREaXNwbGF5TmFtZSkge1xuICAgICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDIsIF9pbnN0YW5jZS5pbnRlbnREaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAoX2luc3RhbmNlLmVudGl0aWVzICYmIF9pbnN0YW5jZS5lbnRpdGllcy5sZW5ndGgpIHtcbiAgICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkTWVzc2FnZShcbiAgICAgICAgICAzLFxuICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdGllcyBhcyBhbnksXG4gICAgICAgICAgb25kZXdvTmx1MDA4LkludGVudC5UcmFpbmluZ1BocmFzZS5FbnRpdHkuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF90cmFpbmluZ1BocmFzZTogc3RyaW5nO1xuICAgIHByaXZhdGUgX2ludGVudERpc3BsYXlOYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfZW50aXRpZXM/OiBvbmRld29ObHUwMDguSW50ZW50LlRyYWluaW5nUGhyYXNlLkVudGl0eVtdO1xuXG4gICAgLyoqXG4gICAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgVHJhaW5pbmdQaHJhc2VGb3JJbnRlbnQgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPFRyYWluaW5nUGhyYXNlRm9ySW50ZW50LkFzT2JqZWN0Pikge1xuICAgICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgICAgdGhpcy50cmFpbmluZ1BocmFzZSA9IF92YWx1ZS50cmFpbmluZ1BocmFzZTtcbiAgICAgIHRoaXMuaW50ZW50RGlzcGxheU5hbWUgPSBfdmFsdWUuaW50ZW50RGlzcGxheU5hbWU7XG4gICAgICB0aGlzLmVudGl0aWVzID0gKF92YWx1ZS5lbnRpdGllcyB8fCBbXSkubWFwKFxuICAgICAgICBtID0+IG5ldyBvbmRld29ObHUwMDguSW50ZW50LlRyYWluaW5nUGhyYXNlLkVudGl0eShtKVxuICAgICAgKTtcbiAgICAgIFRyYWluaW5nUGhyYXNlRm9ySW50ZW50LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgICB9XG4gICAgZ2V0IHRyYWluaW5nUGhyYXNlKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhaW5pbmdQaHJhc2U7XG4gICAgfVxuICAgIHNldCB0cmFpbmluZ1BocmFzZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICB0aGlzLl90cmFpbmluZ1BocmFzZSA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgaW50ZW50RGlzcGxheU5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbnRlbnREaXNwbGF5TmFtZTtcbiAgICB9XG4gICAgc2V0IGludGVudERpc3BsYXlOYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuX2ludGVudERpc3BsYXlOYW1lID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCBlbnRpdGllcygpOiBvbmRld29ObHUwMDguSW50ZW50LlRyYWluaW5nUGhyYXNlLkVudGl0eVtdIHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbnRpdGllcztcbiAgICB9XG4gICAgc2V0IGVudGl0aWVzKFxuICAgICAgdmFsdWU6IG9uZGV3b05sdTAwOC5JbnRlbnQuVHJhaW5pbmdQaHJhc2UuRW50aXR5W10gfCB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRoaXMuX2VudGl0aWVzID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICAgIFRyYWluaW5nUGhyYXNlRm9ySW50ZW50LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgICAqL1xuICAgIHRvT2JqZWN0KCk6IFRyYWluaW5nUGhyYXNlRm9ySW50ZW50LkFzT2JqZWN0IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYWluaW5nUGhyYXNlOiB0aGlzLnRyYWluaW5nUGhyYXNlLFxuICAgICAgICBpbnRlbnREaXNwbGF5TmFtZTogdGhpcy5pbnRlbnREaXNwbGF5TmFtZSxcbiAgICAgICAgZW50aXRpZXM6ICh0aGlzLmVudGl0aWVzIHx8IFtdKS5tYXAobSA9PiBtLnRvT2JqZWN0KCkpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgICAqL1xuICAgIHRvUHJvdG9idWZKU09OKFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICAgICk6IFRyYWluaW5nUGhyYXNlRm9ySW50ZW50LkFzUHJvdG9idWZKU09OIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYWluaW5nUGhyYXNlOiB0aGlzLnRyYWluaW5nUGhyYXNlLFxuICAgICAgICBpbnRlbnREaXNwbGF5TmFtZTogdGhpcy5pbnRlbnREaXNwbGF5TmFtZSxcbiAgICAgICAgZW50aXRpZXM6ICh0aGlzLmVudGl0aWVzIHx8IFtdKS5tYXAobSA9PiBtLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpKVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IG1vZHVsZSBUcmFpbmluZ1BocmFzZUZvckludGVudCB7XG4gICAgLyoqXG4gICAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIFRyYWluaW5nUGhyYXNlRm9ySW50ZW50XG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgICB0cmFpbmluZ1BocmFzZTogc3RyaW5nO1xuICAgICAgaW50ZW50RGlzcGxheU5hbWU6IHN0cmluZztcbiAgICAgIGVudGl0aWVzPzogb25kZXdvTmx1MDA4LkludGVudC5UcmFpbmluZ1BocmFzZS5FbnRpdHkuQXNPYmplY3RbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBUcmFpbmluZ1BocmFzZUZvckludGVudFxuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgICAgdHJhaW5pbmdQaHJhc2U6IHN0cmluZztcbiAgICAgIGludGVudERpc3BsYXlOYW1lOiBzdHJpbmc7XG4gICAgICBlbnRpdGllczpcbiAgICAgICAgfCBvbmRld29ObHUwMDguSW50ZW50LlRyYWluaW5nUGhyYXNlLkVudGl0eS5Bc1Byb3RvYnVmSlNPTltdXG4gICAgICAgIHwgbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1LkFkZFRyYWluaW5nUGhyYXNlc1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBjbGFzcyBBZGRUcmFpbmluZ1BocmFzZXNSZXNwb25zZSBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuQWRkVHJhaW5pbmdQaHJhc2VzUmVzcG9uc2UnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBBZGRUcmFpbmluZ1BocmFzZXNSZXNwb25zZSgpO1xuICAgIEFkZFRyYWluaW5nUGhyYXNlc1Jlc3BvbnNlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogQWRkVHJhaW5pbmdQaHJhc2VzUmVzcG9uc2UpIHtcbiAgICBfaW5zdGFuY2UuZXJyb3JNZXNzYWdlcyA9IF9pbnN0YW5jZS5lcnJvck1lc3NhZ2VzIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogQWRkVHJhaW5pbmdQaHJhc2VzUmVzcG9uc2UsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgKF9pbnN0YW5jZS5lcnJvck1lc3NhZ2VzID0gX2luc3RhbmNlLmVycm9yTWVzc2FnZXMgfHwgW10pLnB1c2goXG4gICAgICAgICAgICBfcmVhZGVyLnJlYWRTdHJpbmcoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBBZGRUcmFpbmluZ1BocmFzZXNSZXNwb25zZS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IEFkZFRyYWluaW5nUGhyYXNlc1Jlc3BvbnNlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmVycm9yTWVzc2FnZXMgJiYgX2luc3RhbmNlLmVycm9yTWVzc2FnZXMubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRTdHJpbmcoMSwgX2luc3RhbmNlLmVycm9yTWVzc2FnZXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2Vycm9yTWVzc2FnZXM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgQWRkVHJhaW5pbmdQaHJhc2VzUmVzcG9uc2UgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8QWRkVHJhaW5pbmdQaHJhc2VzUmVzcG9uc2UuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlcyA9IChfdmFsdWUuZXJyb3JNZXNzYWdlcyB8fCBbXSkuc2xpY2UoKTtcbiAgICBBZGRUcmFpbmluZ1BocmFzZXNSZXNwb25zZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGVycm9yTWVzc2FnZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9lcnJvck1lc3NhZ2VzO1xuICB9XG4gIHNldCBlcnJvck1lc3NhZ2VzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2Vycm9yTWVzc2FnZXMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBBZGRUcmFpbmluZ1BocmFzZXNSZXNwb25zZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBBZGRUcmFpbmluZ1BocmFzZXNSZXNwb25zZS5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yTWVzc2FnZXM6ICh0aGlzLmVycm9yTWVzc2FnZXMgfHwgW10pLnNsaWNlKClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBBZGRUcmFpbmluZ1BocmFzZXNSZXNwb25zZS5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yTWVzc2FnZXM6ICh0aGlzLmVycm9yTWVzc2FnZXMgfHwgW10pLnNsaWNlKClcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIEFkZFRyYWluaW5nUGhyYXNlc1Jlc3BvbnNlIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBBZGRUcmFpbmluZ1BocmFzZXNSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgZXJyb3JNZXNzYWdlczogc3RyaW5nW107XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgQWRkVHJhaW5pbmdQaHJhc2VzUmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5BZGRUcmFpbmluZ1BocmFzZXNGcm9tQ1NWUmVxdWVzdFxuICovXG5leHBvcnQgY2xhc3MgQWRkVHJhaW5pbmdQaHJhc2VzRnJvbUNTVlJlcXVlc3QgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LkFkZFRyYWluaW5nUGhyYXNlc0Zyb21DU1ZSZXF1ZXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQWRkVHJhaW5pbmdQaHJhc2VzRnJvbUNTVlJlcXVlc3QoKTtcbiAgICBBZGRUcmFpbmluZ1BocmFzZXNGcm9tQ1NWUmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IEFkZFRyYWluaW5nUGhyYXNlc0Zyb21DU1ZSZXF1ZXN0KSB7XG4gICAgX2luc3RhbmNlLnBhcmVudCA9IF9pbnN0YW5jZS5wYXJlbnQgfHwgJyc7XG4gICAgX2luc3RhbmNlLmxhbmd1YWdlQ29kZSA9IF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUgfHwgJyc7XG4gICAgX2luc3RhbmNlLmNzdkNvbnRlbnRzID0gX2luc3RhbmNlLmNzdkNvbnRlbnRzIHx8IG5ldyBVaW50OEFycmF5KCk7XG4gICAgX2luc3RhbmNlLmV4dHJhY3RFbnRpdGllcyA9IF9pbnN0YW5jZS5leHRyYWN0RW50aXRpZXMgfHwgZmFsc2U7XG4gICAgX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzID0gX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzIHx8ICcnO1xuICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zID1cbiAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zIHx8IHVuZGVmaW5lZDtcbiAgICBfaW5zdGFuY2UubnVtYmVyT2ZXb3JrZXJzID0gX2luc3RhbmNlLm51bWJlck9mV29ya2VycyB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogQWRkVHJhaW5pbmdQaHJhc2VzRnJvbUNTVlJlcXVlc3QsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLnBhcmVudCA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgX2luc3RhbmNlLmxhbmd1YWdlQ29kZSA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgX2luc3RhbmNlLmNzdkNvbnRlbnRzID0gX3JlYWRlci5yZWFkQnl0ZXMoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIF9pbnN0YW5jZS5leHRyYWN0RW50aXRpZXMgPSBfcmVhZGVyLnJlYWRCb29sKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBfaW5zdGFuY2Uuc3BlY2lhbENoYXJhY3RlcnMgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zID0gbmV3IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLnRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMsXG4gICAgICAgICAgICBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBfaW5zdGFuY2UubnVtYmVyT2ZXb3JrZXJzID0gX3JlYWRlci5yZWFkSW50MzIoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIEFkZFRyYWluaW5nUGhyYXNlc0Zyb21DU1ZSZXF1ZXN0LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogQWRkVHJhaW5pbmdQaHJhc2VzRnJvbUNTVlJlcXVlc3QsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UucGFyZW50KSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDEsIF9pbnN0YW5jZS5wYXJlbnQpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmxhbmd1YWdlQ29kZSkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygyLCBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5jc3ZDb250ZW50cyAmJiBfaW5zdGFuY2UuY3N2Q29udGVudHMubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQnl0ZXMoMywgX2luc3RhbmNlLmNzdkNvbnRlbnRzKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5leHRyYWN0RW50aXRpZXMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVCb29sKDQsIF9pbnN0YW5jZS5leHRyYWN0RW50aXRpZXMpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnNwZWNpYWxDaGFyYWN0ZXJzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDUsIF9pbnN0YW5jZS5zcGVjaWFsQ2hhcmFjdGVycyk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucykge1xuICAgICAgX3dyaXRlci53cml0ZU1lc3NhZ2UoXG4gICAgICAgIDYsXG4gICAgICAgIF9pbnN0YW5jZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zIGFzIGFueSxcbiAgICAgICAgVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5udW1iZXJPZldvcmtlcnMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVJbnQzMig3LCBfaW5zdGFuY2UubnVtYmVyT2ZXb3JrZXJzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXJlbnQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2VDb2RlOiBzdHJpbmc7XG4gIHByaXZhdGUgX2NzdkNvbnRlbnRzOiBVaW50OEFycmF5O1xuICBwcml2YXRlIF9leHRyYWN0RW50aXRpZXM6IGJvb2xlYW47XG4gIHByaXZhdGUgX3NwZWNpYWxDaGFyYWN0ZXJzOiBzdHJpbmc7XG4gIHByaXZhdGUgX3RyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnM/OiBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zO1xuICBwcml2YXRlIF9udW1iZXJPZldvcmtlcnM6IG51bWJlcjtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIEFkZFRyYWluaW5nUGhyYXNlc0Zyb21DU1ZSZXF1ZXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPEFkZFRyYWluaW5nUGhyYXNlc0Zyb21DU1ZSZXF1ZXN0LkFzT2JqZWN0PlxuICApIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5wYXJlbnQgPSBfdmFsdWUucGFyZW50O1xuICAgIHRoaXMubGFuZ3VhZ2VDb2RlID0gX3ZhbHVlLmxhbmd1YWdlQ29kZTtcbiAgICB0aGlzLmNzdkNvbnRlbnRzID0gX3ZhbHVlLmNzdkNvbnRlbnRzO1xuICAgIHRoaXMuZXh0cmFjdEVudGl0aWVzID0gX3ZhbHVlLmV4dHJhY3RFbnRpdGllcztcbiAgICB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzID0gX3ZhbHVlLnNwZWNpYWxDaGFyYWN0ZXJzO1xuICAgIHRoaXMudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucyA9IF92YWx1ZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zXG4gICAgICA/IG5ldyBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zKF92YWx1ZS50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5udW1iZXJPZldvcmtlcnMgPSBfdmFsdWUubnVtYmVyT2ZXb3JrZXJzO1xuICAgIEFkZFRyYWluaW5nUGhyYXNlc0Zyb21DU1ZSZXF1ZXN0LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgcGFyZW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcbiAgfVxuICBzZXQgcGFyZW50KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9wYXJlbnQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgbGFuZ3VhZ2VDb2RlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlQ29kZTtcbiAgfVxuICBzZXQgbGFuZ3VhZ2VDb2RlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sYW5ndWFnZUNvZGUgPSB2YWx1ZTtcbiAgfVxuICBnZXQgY3N2Q29udGVudHMoKTogVWludDhBcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuX2NzdkNvbnRlbnRzO1xuICB9XG4gIHNldCBjc3ZDb250ZW50cyh2YWx1ZTogVWludDhBcnJheSkge1xuICAgIHRoaXMuX2NzdkNvbnRlbnRzID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGV4dHJhY3RFbnRpdGllcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZXh0cmFjdEVudGl0aWVzO1xuICB9XG4gIHNldCBleHRyYWN0RW50aXRpZXModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9leHRyYWN0RW50aXRpZXMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgc3BlY2lhbENoYXJhY3RlcnMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3BlY2lhbENoYXJhY3RlcnM7XG4gIH1cbiAgc2V0IHNwZWNpYWxDaGFyYWN0ZXJzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zcGVjaWFsQ2hhcmFjdGVycyA9IHZhbHVlO1xuICB9XG4gIGdldCB0cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zKCk6IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zO1xuICB9XG4gIHNldCB0cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zKFxuICAgIHZhbHVlOiBUcmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuX3RyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgbnVtYmVyT2ZXb3JrZXJzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX251bWJlck9mV29ya2VycztcbiAgfVxuICBzZXQgbnVtYmVyT2ZXb3JrZXJzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9udW1iZXJPZldvcmtlcnMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBBZGRUcmFpbmluZ1BocmFzZXNGcm9tQ1NWUmVxdWVzdC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBBZGRUcmFpbmluZ1BocmFzZXNGcm9tQ1NWUmVxdWVzdC5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmVudDogdGhpcy5wYXJlbnQsXG4gICAgICBsYW5ndWFnZUNvZGU6IHRoaXMubGFuZ3VhZ2VDb2RlLFxuICAgICAgY3N2Q29udGVudHM6IHRoaXMuY3N2Q29udGVudHNcbiAgICAgICAgPyB0aGlzLmNzdkNvbnRlbnRzLnN1YmFycmF5KDApXG4gICAgICAgIDogbmV3IFVpbnQ4QXJyYXkoKSxcbiAgICAgIGV4dHJhY3RFbnRpdGllczogdGhpcy5leHRyYWN0RW50aXRpZXMsXG4gICAgICBzcGVjaWFsQ2hhcmFjdGVyczogdGhpcy5zcGVjaWFsQ2hhcmFjdGVycyxcbiAgICAgIHRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnM6IHRoaXMudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uc1xuICAgICAgICA/IHRoaXMudHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucy50b09iamVjdCgpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgbnVtYmVyT2ZXb3JrZXJzOiB0aGlzLm51bWJlck9mV29ya2Vyc1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IEFkZFRyYWluaW5nUGhyYXNlc0Zyb21DU1ZSZXF1ZXN0LkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyZW50OiB0aGlzLnBhcmVudCxcbiAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUsXG4gICAgICBjc3ZDb250ZW50czogdGhpcy5jc3ZDb250ZW50cyA/IHVpbnQ4QXJyYXlUb0Jhc2U2NCh0aGlzLmNzdkNvbnRlbnRzKSA6ICcnLFxuICAgICAgZXh0cmFjdEVudGl0aWVzOiB0aGlzLmV4dHJhY3RFbnRpdGllcyxcbiAgICAgIHNwZWNpYWxDaGFyYWN0ZXJzOiB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLFxuICAgICAgdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uczogdGhpcy50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zXG4gICAgICAgID8gdGhpcy50cmFpbmluZ1BocmFzZUNsZWFuZXJPcHRpb25zLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICAgIDogbnVsbCxcbiAgICAgIG51bWJlck9mV29ya2VyczogdGhpcy5udW1iZXJPZldvcmtlcnNcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIEFkZFRyYWluaW5nUGhyYXNlc0Zyb21DU1ZSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBBZGRUcmFpbmluZ1BocmFzZXNGcm9tQ1NWUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgcGFyZW50OiBzdHJpbmc7XG4gICAgbGFuZ3VhZ2VDb2RlOiBzdHJpbmc7XG4gICAgY3N2Q29udGVudHM6IFVpbnQ4QXJyYXk7XG4gICAgZXh0cmFjdEVudGl0aWVzOiBib29sZWFuO1xuICAgIHNwZWNpYWxDaGFyYWN0ZXJzOiBzdHJpbmc7XG4gICAgdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucz86IFRyYWluaW5nUGhyYXNlQ2xlYW5lck9wdGlvbnMuQXNPYmplY3Q7XG4gICAgbnVtYmVyT2ZXb3JrZXJzOiBudW1iZXI7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgQWRkVHJhaW5pbmdQaHJhc2VzRnJvbUNTVlJlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIHBhcmVudDogc3RyaW5nO1xuICAgIGxhbmd1YWdlQ29kZTogc3RyaW5nO1xuICAgIGNzdkNvbnRlbnRzOiBzdHJpbmc7XG4gICAgZXh0cmFjdEVudGl0aWVzOiBib29sZWFuO1xuICAgIHNwZWNpYWxDaGFyYWN0ZXJzOiBzdHJpbmc7XG4gICAgdHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9uczogVHJhaW5pbmdQaHJhc2VDbGVhbmVyT3B0aW9ucy5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gICAgbnVtYmVyT2ZXb3JrZXJzOiBudW1iZXI7XG4gIH1cbn1cbiJdfQ==