jsii-diff 1.35.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.
@@ -0,0 +1,487 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateExistingMembers = exports.memberPairs = exports.validateNotMadeImmutable = exports.subclassableType = exports.validateMethodCompatible = exports.validateNoNewRequiredParams = exports.validateExistingParams = exports.validateParameterTypeSame = exports.validateParameterTypeWeakened = exports.validatePropertyTypeSame = exports.validatePropertyTypeNotWeakened = exports.validateReturnTypeSame = exports.validateReturnTypeNotWeakened = exports.validateNoNewAbstractMembers = exports.validateNotMadeNonVariadic = exports.validateAsyncSame = exports.validateStaticSame = exports.validateSubclassableNotRemoved = exports.validateNotMadeAbstract = exports.validateBaseTypeAssignability = void 0;
4
+ const reflect = require("jsii-reflect");
5
+ const log4js = require("log4js");
6
+ const stability_1 = require("./stability");
7
+ const type_analysis_1 = require("./type-analysis");
8
+ const LOG = log4js.getLogger('jsii-diff');
9
+ /**
10
+ * The updated type is still nominally assignable to all original base types
11
+ *
12
+ * Make sure the following remains compilable:
13
+ *
14
+ * ```
15
+ * BASE instance = new CLASS();
16
+ * ```
17
+ *
18
+ * Where CLASS ≤: BASE.
19
+ */
20
+ function validateBaseTypeAssignability(original, updated, mismatches) {
21
+ const ana = assignableToAllBaseTypes(original, updated);
22
+ if (!ana.success) {
23
+ mismatches.report({
24
+ ruleKey: 'base-types',
25
+ message: `not assignable to all base types anymore: ${ana.reasons.join(', ')}`,
26
+ violator: original,
27
+ });
28
+ }
29
+ }
30
+ exports.validateBaseTypeAssignability = validateBaseTypeAssignability;
31
+ /**
32
+ * The updated type has not been newly made abstract
33
+ *
34
+ * Make sure the following remains compilable:
35
+ *
36
+ * ```
37
+ * new CLASS();
38
+ * ```
39
+ */
40
+ function validateNotMadeAbstract(original, updated, mismatches) {
41
+ if (updated.abstract && !original.abstract) {
42
+ mismatches.report({
43
+ ruleKey: 'made-abstract',
44
+ message: 'has gone from non-abstract to abstract',
45
+ violator: original,
46
+ });
47
+ }
48
+ }
49
+ exports.validateNotMadeAbstract = validateNotMadeAbstract;
50
+ /**
51
+ * The updated type has not had its @subclassable attribute removed
52
+ *
53
+ * This would lift a restriction we can't afford.
54
+ */
55
+ function validateSubclassableNotRemoved(original, updated, mismatches) {
56
+ if (original.docs.subclassable && !updated.docs.subclassable) {
57
+ mismatches.report({
58
+ ruleKey: 'remove-subclassable',
59
+ message: 'has gone from @subclassable to non-@subclassable',
60
+ violator: original,
61
+ });
62
+ }
63
+ }
64
+ exports.validateSubclassableNotRemoved = validateSubclassableNotRemoved;
65
+ /**
66
+ * Check that the `static`-ness of a member hasn't changed
67
+ */
68
+ function validateStaticSame(original, updated, mismatches) {
69
+ if (original.static !== updated.static) {
70
+ mismatches.report({
71
+ ruleKey: 'changed-static',
72
+ violator: original,
73
+ message: `used to be ${original.static ? 'static' : 'not static'}, is now ${updated.static ? 'static' : 'not static'}`,
74
+ });
75
+ }
76
+ }
77
+ exports.validateStaticSame = validateStaticSame;
78
+ /**
79
+ * Check that the `async`-ness of a method hasn't changed
80
+ */
81
+ function validateAsyncSame(original, updated, mismatches) {
82
+ if (original.async !== updated.async) {
83
+ const origQual = original.async ? 'asynchronous' : 'synchronous';
84
+ const updQual = updated.async ? 'asynchronous' : 'synchronous';
85
+ mismatches.report({
86
+ ruleKey: 'changed-async',
87
+ violator: original,
88
+ message: `was ${origQual}, is now ${updQual}`,
89
+ });
90
+ }
91
+ }
92
+ exports.validateAsyncSame = validateAsyncSame;
93
+ /**
94
+ * Once variadic, can never be made non-variadic anymore (because I could always have been passing N+1 arguments)
95
+ */
96
+ function validateNotMadeNonVariadic(original, updated, mismatches) {
97
+ if (original.variadic && !updated.variadic) {
98
+ mismatches.report({
99
+ ruleKey: 'changed-variadic',
100
+ violator: original,
101
+ message: 'used to be variadic, not variadic anymore.',
102
+ });
103
+ }
104
+ }
105
+ exports.validateNotMadeNonVariadic = validateNotMadeNonVariadic;
106
+ /**
107
+ * Check that no new abstract members were added to a subclassable type
108
+ *
109
+ * You cannot have added abstract members to the class/interface, as they are
110
+ * an added burden on potential implementors.
111
+ */
112
+ function validateNoNewAbstractMembers(original, updated, mismatches) {
113
+ const absMemberNames = new Set(updated.allMembers.filter((m) => m.abstract).map((m) => m.name));
114
+ const originalMemberNames = new Set(original.allMembers.map((m) => m.name));
115
+ for (const name of absMemberNames) {
116
+ if (!originalMemberNames.has(name)) {
117
+ mismatches.report({
118
+ ruleKey: 'new-abstract-member',
119
+ message: `adds requirement for subclasses to implement '${name}'.`,
120
+ violator: updated.getMembers(true)[name],
121
+ });
122
+ }
123
+ }
124
+ }
125
+ exports.validateNoNewAbstractMembers = validateNoNewAbstractMembers;
126
+ /**
127
+ * Validate that a method return type is the same or strengthened
128
+ *
129
+ * Make sure the following remains compilable:
130
+ *
131
+ * ```
132
+ * T value = object.method();
133
+ * ```
134
+ *
135
+ * Where RETURN_TYPE(method) ≤: T.
136
+ */
137
+ function validateReturnTypeNotWeakened(original, updated, mismatches) {
138
+ const retAna = isCompatibleReturnType(original.returns, updated.returns);
139
+ if (!retAna.success) {
140
+ mismatches.report({
141
+ ruleKey: 'change-return-type',
142
+ violator: original,
143
+ message: `returns ${describeOptionalValueMatchingFailure(original.returns, updated.returns, retAna)}`,
144
+ });
145
+ }
146
+ }
147
+ exports.validateReturnTypeNotWeakened = validateReturnTypeNotWeakened;
148
+ /**
149
+ * Validate that a method return type is the exact same
150
+ *
151
+ * Necessary for subclassable types in C#.
152
+ */
153
+ function validateReturnTypeSame(original, updated, mismatches) {
154
+ const origDescr = reflect.OptionalValue.describe(original.returns);
155
+ const updaDescr = reflect.OptionalValue.describe(updated.returns);
156
+ if (origDescr !== updaDescr) {
157
+ mismatches.report({
158
+ ruleKey: 'change-return-type',
159
+ violator: original,
160
+ message: `returns ${updaDescr} (formerly ${origDescr})`,
161
+ });
162
+ }
163
+ }
164
+ exports.validateReturnTypeSame = validateReturnTypeSame;
165
+ /**
166
+ * Validate that a property type is the same or strengthened
167
+ *
168
+ * Make sure the following remains compilable:
169
+ *
170
+ * ```
171
+ * T value = object.prop;
172
+ * ```
173
+ *
174
+ * Where RETURN_TYPE(prop) ≤: T.
175
+ */
176
+ function validatePropertyTypeNotWeakened(original, updated, mismatches) {
177
+ const ana = isCompatibleReturnType(original, updated);
178
+ if (!ana.success) {
179
+ mismatches.report({
180
+ ruleKey: 'changed-type',
181
+ violator: original,
182
+ message: `type ${describeOptionalValueMatchingFailure(original, updated, ana)}`,
183
+ });
184
+ }
185
+ }
186
+ exports.validatePropertyTypeNotWeakened = validatePropertyTypeNotWeakened;
187
+ /**
188
+ * Validate that a property type is the exact same
189
+ *
190
+ * Necessary for subclassable types in C#.
191
+ */
192
+ function validatePropertyTypeSame(original, updated, mismatches) {
193
+ const oldDesc = reflect.OptionalValue.describe(original);
194
+ const newDesc = reflect.OptionalValue.describe(updated);
195
+ if (oldDesc !== newDesc) {
196
+ mismatches.report({
197
+ ruleKey: 'changed-type',
198
+ violator: original,
199
+ message: `changed to ${newDesc} (formerly ${oldDesc})`,
200
+ });
201
+ }
202
+ }
203
+ exports.validatePropertyTypeSame = validatePropertyTypeSame;
204
+ /**
205
+ * Validate that a method return type is the same or weakened
206
+ *
207
+ * Make sure the following remains compilable if U is changed:
208
+ *
209
+ * ```
210
+ * function method(arg: U) { ... }
211
+ *
212
+ * object.method(<T>value);
213
+ * ```
214
+ *
215
+ * Where T ≤: U.
216
+ */
217
+ function validateParameterTypeWeakened(method, original, updated, mismatches) {
218
+ const argAna = isCompatibleArgumentType(original.type, updated.type);
219
+ if (!argAna.success) {
220
+ mismatches.report({
221
+ ruleKey: 'incompatible-argument',
222
+ violator: method,
223
+ message: `argument ${original.name}, takes ${describeOptionalValueMatchingFailure(original, updated, argAna)}`,
224
+ });
225
+ return;
226
+ }
227
+ }
228
+ exports.validateParameterTypeWeakened = validateParameterTypeWeakened;
229
+ /**
230
+ * Validate that a method parameter type is the exact same
231
+ *
232
+ * Necessary for subclassable types in C#.
233
+ */
234
+ function validateParameterTypeSame(method, original, updated, mismatches) {
235
+ if (original.type.toString() !== updated.type.toString()) {
236
+ mismatches.report({
237
+ ruleKey: 'incompatible-argument',
238
+ violator: method,
239
+ message: `argument ${original.name}, takes ${updated.type.toString()} (formerly ${original.type.toString()}): type is @subclassable`,
240
+ });
241
+ }
242
+ }
243
+ exports.validateParameterTypeSame = validateParameterTypeSame;
244
+ function describeOptionalValueMatchingFailure(origType, updatedType, analysis) {
245
+ const origDescr = reflect.OptionalValue.describe(origType);
246
+ const updaDescr = reflect.OptionalValue.describe(updatedType);
247
+ if (origDescr !== updaDescr) {
248
+ return `${updaDescr} (formerly ${origDescr}): ${analysis.reasons.join(', ')}`;
249
+ }
250
+ return `${updaDescr}: ${analysis.reasons.join(', ')}`;
251
+ }
252
+ /**
253
+ * Validate that each param in the old callable is still available in the new callable, and apply custom validation to the pairs
254
+ *
255
+ * Make sure the following remains compilable:
256
+ *
257
+ * ```
258
+ * object.method(a1, a2, ..., aN);
259
+ * ```
260
+ *
261
+ * (All types still assignable)
262
+ */
263
+ function validateExistingParams(original, updated, mismatches, validateParam) {
264
+ original.parameters.forEach((param, i) => {
265
+ const updatedParam = findParam(updated.parameters, i);
266
+ if (updatedParam === undefined) {
267
+ mismatches.report({
268
+ ruleKey: 'removed-argument',
269
+ violator: original,
270
+ message: `argument ${param.name}, not accepted anymore.`,
271
+ });
272
+ return;
273
+ }
274
+ validateParam(param, updatedParam);
275
+ });
276
+ }
277
+ exports.validateExistingParams = validateExistingParams;
278
+ /**
279
+ * Validate that no new required params got added to the end of the method
280
+ *
281
+ * Make sure the following remains compilable:
282
+ *
283
+ * ```
284
+ * object.method(a1, a2, ..., aN);
285
+ * ```
286
+ *
287
+ * (Not too few arguments)
288
+ */
289
+ function validateNoNewRequiredParams(original, updated, mismatches) {
290
+ updated.parameters.forEach((param, i) => {
291
+ if (param.optional) {
292
+ return;
293
+ }
294
+ const origParam = findParam(original.parameters, i);
295
+ if (!origParam || origParam.optional) {
296
+ mismatches.report({
297
+ ruleKey: 'new-argument',
298
+ violator: original,
299
+ message: `argument ${param.name}, newly required argument.`,
300
+ });
301
+ }
302
+ });
303
+ }
304
+ exports.validateNoNewRequiredParams = validateNoNewRequiredParams;
305
+ function validateMethodCompatible(original, updated, mismatches) {
306
+ stability_1.validateStabilities(original, updated, mismatches);
307
+ // Type guards on original are duplicated on updated to help tsc... They are required to be the same type by the declaration.
308
+ if (reflect.isMethod(original) && reflect.isMethod(updated)) {
309
+ validateStaticSame(original, updated, mismatches);
310
+ validateAsyncSame(original, updated, mismatches);
311
+ validateReturnTypeNotWeakened(original, updated, mismatches);
312
+ }
313
+ validateNotMadeNonVariadic(original, updated, mismatches);
314
+ // Check that every original parameter can still be mapped to a parameter in the updated method
315
+ validateExistingParams(original, updated, mismatches, (oldParam, newParam) => {
316
+ validateParameterTypeWeakened(original, oldParam, newParam, mismatches);
317
+ });
318
+ validateNoNewRequiredParams(original, updated, mismatches);
319
+ }
320
+ exports.validateMethodCompatible = validateMethodCompatible;
321
+ /**
322
+ * Check if a class/interface has been marked as @subclassable
323
+ */
324
+ function subclassableType(x) {
325
+ return x.docs.subclassable;
326
+ }
327
+ exports.subclassableType = subclassableType;
328
+ /**
329
+ * Find the indicated parameter with the given index
330
+ *
331
+ * May return the last parameter if it's variadic
332
+ */
333
+ function findParam(parameters, i) {
334
+ if (i < parameters.length) {
335
+ return parameters[i];
336
+ }
337
+ const lastParam = parameters.length > 0 ? parameters[parameters.length - 1] : undefined;
338
+ if (lastParam && lastParam.variadic) {
339
+ return lastParam;
340
+ }
341
+ return undefined;
342
+ }
343
+ /**
344
+ * Validate that a previously mutable property is not made immutable
345
+ *
346
+ * Make sure the following remains compilable:
347
+ *
348
+ * ```
349
+ * object.prop = value;
350
+ * ```
351
+ */
352
+ function validateNotMadeImmutable(original, updated, mismatches) {
353
+ if (updated.immutable && !original.immutable) {
354
+ mismatches.report({
355
+ ruleKey: 'removed-mutability',
356
+ violator: original,
357
+ message: 'used to be mutable, is now immutable',
358
+ });
359
+ }
360
+ }
361
+ exports.validateNotMadeImmutable = validateNotMadeImmutable;
362
+ function* memberPairs(origClass, xs, updatedClass, mismatches) {
363
+ for (const origMember of xs) {
364
+ LOG.trace(`${origClass.fqn}#${origMember.name}`);
365
+ const updatedMember = updatedClass.allMembers.find((m) => m.name === origMember.name);
366
+ if (!updatedMember) {
367
+ mismatches.report({
368
+ ruleKey: 'removed',
369
+ violator: origMember,
370
+ message: 'has been removed',
371
+ });
372
+ continue;
373
+ }
374
+ if (origMember.kind !== updatedMember.kind) {
375
+ mismatches.report({
376
+ ruleKey: 'changed-kind',
377
+ violator: origMember,
378
+ message: `changed from ${origMember.kind} to ${updatedMember.kind}`,
379
+ });
380
+ }
381
+ if (!origMember.protected && updatedMember.protected) {
382
+ mismatches.report({
383
+ ruleKey: 'hidden',
384
+ violator: origMember,
385
+ message: "changed from 'public' to 'protected'",
386
+ });
387
+ }
388
+ yield [origMember, updatedMember];
389
+ }
390
+ }
391
+ exports.memberPairs = memberPairs;
392
+ /**
393
+ * Whether we are strengthening the postcondition (output type of a method or property)
394
+ *
395
+ * Strengthening output values is allowed!
396
+ */
397
+ function isCompatibleReturnType(original, updated) {
398
+ if (original.type.void) {
399
+ return { success: true };
400
+ } // If we didn't use to return anything, returning something now is fine
401
+ if (updated.type.void) {
402
+ return { success: false, reasons: ["now returning 'void'"] };
403
+ } // If we used to return something, we can't stop doing that
404
+ if (!original.optional && updated.optional) {
405
+ return { success: false, reasons: ['output type is now optional'] };
406
+ }
407
+ return type_analysis_1.isSuperType(original.type, updated.type, updated.system);
408
+ }
409
+ /**
410
+ * Whether we are weakening the pre (input type of a method)
411
+ *
412
+ * Weakening preconditions is allowed!
413
+ */
414
+ function isCompatibleArgumentType(original, updated) {
415
+ // Input can never be void, so no need to check
416
+ return type_analysis_1.isSuperType(updated, original, updated.system);
417
+ }
418
+ /**
419
+ * Verify assignability to supertypes
420
+ *
421
+ * For every base type B of type T, someone could have written:
422
+ *
423
+ * ```
424
+ * const variable: B = new T();
425
+ * ```
426
+ *
427
+ * This code needs to be valid in the updated assembly, so for each
428
+ * B an updated type B' needs to exist in the new assembly which is
429
+ * still a supertype of T'.
430
+ */
431
+ function assignableToAllBaseTypes(original, updated) {
432
+ for (const B of baseTypes(original)) {
433
+ const result = type_analysis_1.isNominalSuperType(B.reference, updated.reference, updated.system);
434
+ if (!result.success) {
435
+ return result;
436
+ }
437
+ }
438
+ return { success: true };
439
+ }
440
+ /**
441
+ * Return all base types of the given reference type
442
+ */
443
+ function baseTypes(type) {
444
+ const ret = new Array();
445
+ const todo = [type];
446
+ const seen = new Set();
447
+ while (todo.length > 0) {
448
+ const next = todo.pop();
449
+ if (seen.has(next.fqn)) {
450
+ continue;
451
+ }
452
+ ret.push(next);
453
+ seen.add(next.fqn);
454
+ todo.push(...next.interfaces);
455
+ if (next.isClassType() && next.base) {
456
+ todo.push(next.base);
457
+ }
458
+ }
459
+ return ret;
460
+ }
461
+ /**
462
+ * Validate that each enum member in the old enum enum, and apply custom validation to the enums
463
+ *
464
+ * Make sure the following remains compilable:
465
+ *
466
+ * ```
467
+ * T x = ENUM.member;
468
+ * ```
469
+ *
470
+ * (For every member of enum)
471
+ */
472
+ function validateExistingMembers(original, updated, mismatches, validateMember) {
473
+ for (const origMember of original.members) {
474
+ const updatedMember = updated.members.find((m) => m.name === origMember.name);
475
+ if (!updatedMember) {
476
+ mismatches.report({
477
+ ruleKey: 'removed',
478
+ violator: origMember,
479
+ message: `member ${origMember.name} has been removed`,
480
+ });
481
+ continue;
482
+ }
483
+ validateMember(origMember, updatedMember);
484
+ }
485
+ }
486
+ exports.validateExistingMembers = validateExistingMembers;
487
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2YWxpZGF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx3Q0FBd0M7QUFDeEMsaUNBQWlDO0FBRWpDLDJDQUFrRDtBQUNsRCxtREFLeUI7QUFHekIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUUxQzs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IsNkJBQTZCLENBQzNDLFFBQVcsRUFDWCxPQUFVLEVBQ1YsVUFBbUI7SUFFbkIsTUFBTSxHQUFHLEdBQUcsd0JBQXdCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hELElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFO1FBQ2hCLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDaEIsT0FBTyxFQUFFLFlBQVk7WUFDckIsT0FBTyxFQUFFLDZDQUE2QyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDcEUsSUFBSSxDQUNMLEVBQUU7WUFDSCxRQUFRLEVBQUUsUUFBUTtTQUNuQixDQUFDLENBQUM7S0FDSjtBQUNILENBQUM7QUFmRCxzRUFlQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQ3JDLFFBQTJCLEVBQzNCLE9BQTBCLEVBQzFCLFVBQW1CO0lBRW5CLElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUU7UUFDMUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUNoQixPQUFPLEVBQUUsZUFBZTtZQUN4QixPQUFPLEVBQUUsd0NBQXdDO1lBQ2pELFFBQVEsRUFBRSxRQUFRO1NBQ25CLENBQUMsQ0FBQztLQUNKO0FBQ0gsQ0FBQztBQVpELDBEQVlDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLDhCQUE4QixDQUM1QyxRQUFXLEVBQ1gsT0FBVSxFQUNWLFVBQW1CO0lBRW5CLElBQUksUUFBUSxDQUFD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QyxDQUFDO0tBQzNDO0FBQ0gsQ0FBQztBQXhCRCwwREF3QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyByZWZsZWN0IGZyb20gJ2pzaWktcmVmbGVjdCc7XG5pbXBvcnQgKiBhcyBsb2c0anMgZnJvbSAnbG9nNGpzJztcblxuaW1wb3J0IHsgdmFsaWRhdGVTdGFiaWxpdGllcyB9IGZyb20gJy4vc3RhYmlsaXR5JztcbmltcG9ydCB7XG4gIEFuYWx5c2lzLFxuICBGYWlsZWRBbmFseXNpcyxcbiAgaXNTdXBlclR5cGUsXG4gIGlzTm9taW5hbFN1cGVyVHlwZSxcbn0gZnJvbSAnLi90eXBlLWFuYWx5c2lzJztcbmltcG9ydCB7IElSZXBvcnQgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgTE9HID0gbG9nNGpzLmdldExvZ2dlcignanNpaS1kaWZmJyk7XG5cbi8qKlxuICogVGhlIHVwZGF0ZWQgdHlwZSBpcyBzdGlsbCBub21pbmFsbHkgYXNzaWduYWJsZSB0byBhbGwgb3JpZ2luYWwgYmFzZSB0eXBlc1xuICpcbiAqIE1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIHJlbWFpbnMgY29tcGlsYWJsZTpcbiAqXG4gKiBgYGBcbiAqIEJBU0UgaW5zdGFuY2UgPSBuZXcgQ0xBU1MoKTtcbiAqIGBgYFxuICpcbiAqIFdoZXJlIENMQVNTIOKJpDogQkFTRS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQmFzZVR5cGVBc3NpZ25hYmlsaXR5PFQgZXh0ZW5kcyByZWZsZWN0LlJlZmVyZW5jZVR5cGU+KFxuICBvcmlnaW5hbDogVCxcbiAgdXBkYXRlZDogVCxcbiAgbWlzbWF0Y2hlczogSVJlcG9ydCxcbikge1xuICBjb25zdCBhbmEgPSBhc3NpZ25hYmxlVG9BbGxCYXNlVHlwZXMob3JpZ2luYWwsIHVwZGF0ZWQpO1xuICBpZiAoIWFuYS5zdWNjZXNzKSB7XG4gICAgbWlzbWF0Y2hlcy5yZXBvcnQoe1xuICAgICAgcnVsZUtleTogJ2Jhc2UtdHlwZXMnLFxuICAgICAgbWVzc2FnZTogYG5vdCBhc3NpZ25hYmxlIHRvIGFsbCBiYXNlIHR5cGVzIGFueW1vcmU6ICR7YW5hLnJlYXNvbnMuam9pbihcbiAgICAgICAgJywgJyxcbiAgICAgICl9YCxcbiAgICAgIHZpb2xhdG9yOiBvcmlnaW5hbCxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSB1cGRhdGVkIHR5cGUgaGFzIG5vdCBiZWVuIG5ld2x5IG1hZGUgYWJzdHJhY3RcbiAqXG4gKiBNYWtlIHN1cmUgdGhlIGZvbGxvd2luZyByZW1haW5zIGNvbXBpbGFibGU6XG4gKlxuICogYGBgXG4gKiBuZXcgQ0xBU1MoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVOb3RNYWRlQWJzdHJhY3QoXG4gIG9yaWdpbmFsOiByZWZsZWN0LkNsYXNzVHlwZSxcbiAgdXBkYXRlZDogcmVmbGVjdC5DbGFzc1R5cGUsXG4gIG1pc21hdGNoZXM6IElSZXBvcnQsXG4pIHtcbiAgaWYgKHVwZGF0ZWQuYWJzdHJhY3QgJiYgIW9yaWdpbmFsLmFic3RyYWN0KSB7XG4gICAgbWlzbWF0Y2hlcy5yZXBvcnQoe1xuICAgICAgcnVsZUtleTogJ21hZGUtYWJzdHJhY3QnLFxuICAgICAgbWVzc2FnZTogJ2hhcyBnb25lIGZyb20gbm9uLWFic3RyYWN0IHRvIGFic3RyYWN0JyxcbiAgICAgIHZpb2xhdG9yOiBvcmlnaW5hbCxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSB1cGRhdGVkIHR5cGUgaGFzIG5vdCBoYWQgaXRzIEBzdWJjbGFzc2FibGUgYXR0cmlidXRlIHJlbW92ZWRcbiAqXG4gKiBUaGlzIHdvdWxkIGxpZnQgYSByZXN0cmljdGlvbiB3ZSBjYW4ndCBhZmZvcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVN1YmNsYXNzYWJsZU5vdFJlbW92ZWQ8VCBleHRlbmRzIHJlZmxlY3QuUmVmZXJlbmNlVHlwZT4oXG4gIG9yaWdpbmFsOiBULFxuICB1cGRhdGVkOiBULFxuICBtaXNtYXRjaGVzOiBJUmVwb3J0LFxuKSB7XG4gIGlmIChvcmlnaW5hbC5kb2NzLnN1YmNsYXNzYWJsZSAmJiAhdXBkYXRlZC5kb2NzLnN1YmNsYXNzYWJsZSkge1xuICAgIG1pc21hdGNoZXMucmVwb3J0KHtcbiAgICAgIHJ1bGVLZXk6ICdyZW1vdmUtc3ViY2xhc3NhYmxlJyxcbiAgICAgIG1lc3NhZ2U6ICdoYXMgZ29uZSBmcm9tIEBzdWJjbGFzc2FibGUgdG8gbm9uLUBzdWJjbGFzc2FibGUnLFxuICAgICAgdmlvbGF0b3I6IG9yaWdpbmFsLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgdGhhdCB0aGUgYHN0YXRpY2AtbmVzcyBvZiBhIG1lbWJlciBoYXNuJ3QgY2hhbmdlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTdGF0aWNTYW1lPFQgZXh0ZW5kcyByZWZsZWN0Lk1ldGhvZCB8IHJlZmxlY3QuUHJvcGVydHk+KFxuICBvcmlnaW5hbDogVCxcbiAgdXBkYXRlZDogVCxcbiAgbWlzbWF0Y2hlczogSVJlcG9ydCxcbikge1xuICBpZiAob3JpZ2luYWwuc3RhdGljICE9PSB1cGRhdGVkLnN0YXRpYykge1xuICAgIG1pc21hdGNoZXMucmVwb3J0KHtcbiAgICAgIHJ1bGVLZXk6ICdjaGFuZ2VkLXN0YXRpYycsXG4gICAgICB2aW9sYXRvcjogb3JpZ2luYWwsXG4gICAgICBtZXNzYWdlOiBgdXNlZCB0byBiZSAke1xuICAgICAgICBvcmlnaW5hbC5zdGF0aWMgPyAnc3RhdGljJyA6ICdub3Qgc3RhdGljJ1xuICAgICAgfSwgaXMgbm93ICR7dXBkYXRlZC5zdGF0aWMgPyAnc3RhdGljJyA6ICdub3Qgc3RhdGljJ31gLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgdGhhdCB0aGUgYGFzeW5jYC1uZXNzIG9mIGEgbWV0aG9kIGhhc24ndCBjaGFuZ2VkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUFzeW5jU2FtZShcbiAgb3JpZ2luYWw6IHJlZmxlY3QuTWV0aG9kLFxuICB1cGRhdGVkOiByZWZsZWN0Lk1ldGhvZCxcbiAgbWlzbWF0Y2hlczogSVJlcG9ydCxcbikge1xuICBpZiAob3JpZ2luYWwuYXN5bmMgIT09IHVwZGF0ZWQuYXN5bmMpIHtcbiAgICBjb25zdCBvcmlnUXVhbCA9IG9yaWdpbmFsLmFzeW5jID8gJ2FzeW5jaHJvbm91cycgOiAnc3luY2hyb25vdXMnO1xuICAgIGNvbnN0IHVwZFF1YWwgPSB1cGRhdGVkLmFzeW5jID8gJ2FzeW5jaHJvbm91cycgOiAnc3luY2hyb25vdXMnO1xuICAgIG1pc21hdGNoZXMucmVwb3J0KHtcbiAgICAgIHJ1bGVLZXk6ICdjaGFuZ2VkLWFzeW5jJyxcbiAgICAgIHZpb2xhdG9yOiBvcmlnaW5hbCxcbiAgICAgIG1lc3NhZ2U6IGB3YXMgJHtvcmlnUXVhbH0sIGlzIG5vdyAke3VwZFF1YWx9YCxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIE9uY2UgdmFyaWFkaWMsIGNhbiBuZXZlciBiZSBtYWRlIG5vbi12YXJpYWRpYyBhbnltb3JlIChiZWNhdXNlIEkgY291bGQgYWx3YXlzIGhhdmUgYmVlbiBwYXNzaW5nIE4rMSBhcmd1bWVudHMpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU5vdE1hZGVOb25WYXJpYWRpYzxcbiAgVCBleHRlbmRzIHJlZmxlY3QuTWV0aG9kIHwgcmVmbGVjdC5Jbml0aWFsaXplcixcbj4ob3JpZ2luYWw6IFQsIHVwZGF0ZWQ6IFQsIG1pc21hdGNoZXM6IElSZXBvcnQpIHtcbiAgaWYgKG9yaWdpbmFsLnZhcmlhZGljICYmICF1cGRhdGVkLnZhcmlhZGljKSB7XG4gICAgbWlzbWF0Y2hlcy5yZXBvcnQoe1xuICAgICAgcnVsZUtleTogJ2NoYW5nZWQtdmFyaWFkaWMnLFxuICAgICAgdmlvbGF0b3I6IG9yaWdpbmFsLFxuICAgICAgbWVzc2FnZTogJ3VzZWQgdG8gYmUgdmFyaWFkaWMsIG5vdCB2YXJpYWRpYyBhbnltb3JlLicsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVjayB0aGF0IG5vIG5ldyBhYnN0cmFjdCBtZW1iZXJzIHdlcmUgYWRkZWQgdG8gYSBzdWJjbGFzc2FibGUgdHlwZVxuICpcbiAqIFlvdSBjYW5ub3QgaGF2ZSBhZGRlZCBhYnN0cmFjdCBtZW1iZXJzIHRvIHRoZSBjbGFzcy9pbnRlcmZhY2UsIGFzIHRoZXkgYXJlXG4gKiBhbiBhZGRlZCBidXJkZW4gb24gcG90ZW50aWFsIGltcGxlbWVudG9ycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTm9OZXdBYnN0cmFjdE1lbWJlcnM8VCBleHRlbmRzIHJlZmxlY3QuUmVmZXJlbmNlVHlwZT4oXG4gIG9yaWdpbmFsOiBULFxuICB1cGRhdGVkOiBULFxuICBtaXNtYXRjaGVzOiBJUmVwb3J0LFxuKSB7XG4gIGNvbnN0IGFic01lbWJlck5hbWVzID0gbmV3IFNldChcbiAgICB1cGRhdGVkLmFsbE1lbWJlcnMuZmlsdGVyKChtKSA9PiBtLmFic3RyYWN0KS5tYXAoKG0pID0+IG0ubmFtZSksXG4gICk7XG4gIGNvbnN0IG9yaWdpbmFsTWVtYmVyTmFtZXMgPSBuZXcgU2V0KG9yaWdpbmFsLmFsbE1lbWJlcnMubWFwKChtKSA9PiBtLm5hbWUpKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIGFic01lbWJlck5hbWVzKSB7XG4gICAgaWYgKCFvcmlnaW5hbE1lbWJlck5hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgbWlzbWF0Y2hlcy5yZXBvcnQoe1xuICAgICAgICBydWxlS2V5OiAnbmV3LWFic3RyYWN0LW1lbWJlcicsXG4gICAgICAgIG1lc3NhZ2U6IGBhZGRzIHJlcXVpcmVtZW50IGZvciBzdWJjbGFzc2VzIHRvIGltcGxlbWVudCAnJHtuYW1lfScuYCxcbiAgICAgICAgdmlvbGF0b3I6IHVwZGF0ZWQuZ2V0TWVtYmVycyh0cnVlKVtuYW1lXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSBtZXRob2QgcmV0dXJuIHR5cGUgaXMgdGhlIHNhbWUgb3Igc3RyZW5ndGhlbmVkXG4gKlxuICogTWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgcmVtYWlucyBjb21waWxhYmxlOlxuICpcbiAqIGBgYFxuICogVCB2YWx1ZSA9IG9iamVjdC5tZXRob2QoKTtcbiAqIGBgYFxuICpcbiAqIFdoZXJlIFJFVFVSTl9UWVBFKG1ldGhvZCkg4omkOiBULlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSZXR1cm5UeXBlTm90V2Vha2VuZWQoXG4gIG9yaWdpbmFsOiByZWZsZWN0Lk1ldGhvZCxcbiAgdXBkYXRlZDogcmVmbGVjdC5NZXRob2QsXG4gIG1pc21hdGNoZXM6IElSZXBvcnQsXG4pIHtcbiAgY29uc3QgcmV0QW5hID0gaXNDb21wYXRpYmxlUmV0dXJuVHlwZShvcmlnaW5hbC5yZXR1cm5zLCB1cGRhdGVkLnJldHVybnMpO1xuICBpZiAoIXJldEFuYS5zdWNjZXNzKSB7XG4gICAgbWlzbWF0Y2hlcy5yZXBvcnQoe1xuICAgICAgcnVsZUtleTogJ2NoYW5nZS1yZXR1cm4tdHlwZScsXG4gICAgICB2aW9sYXRvcjogb3JpZ2luYWwsXG4gICAgICBtZXNzYWdlOiBgcmV0dXJucyAke2Rlc2NyaWJlT3B0aW9uYWxWYWx1ZU1hdGNoaW5nRmFpbHVyZShcbiAgICAgICAgb3JpZ2luYWwucmV0dXJucyxcbiAgICAgICAgdXBkYXRlZC5yZXR1cm5zLFxuICAgICAgICByZXRBbmEsXG4gICAgICApfWAsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGEgbWV0aG9kIHJldHVybiB0eXBlIGlzIHRoZSBleGFjdCBzYW1lXG4gKlxuICogTmVjZXNzYXJ5IGZvciBzdWJjbGFzc2FibGUgdHlwZXMgaW4gQyMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJldHVyblR5cGVTYW1lKFxuICBvcmlnaW5hbDogcmVmbGVjdC5NZXRob2QsXG4gIHVwZGF0ZWQ6IHJlZmxlY3QuTWV0aG9kLFxuICBtaXNtYXRjaGVzOiBJUmVwb3J0LFxuKSB7XG4gIGNvbnN0IG9yaWdEZXNjciA9IHJlZmxlY3QuT3B0aW9uYWxWYWx1ZS5kZXNjcmliZShvcmlnaW5hbC5yZXR1cm5zKTtcbiAgY29uc3QgdXBkYURlc2NyID0gcmVmbGVjdC5PcHRpb25hbFZhbHVlLmRlc2NyaWJlKHVwZGF0ZWQucmV0dXJucyk7XG4gIGlmIChvcmlnRGVzY3IgIT09IHVwZGFEZXNjcikge1xuICAgIG1pc21hdGNoZXMucmVwb3J0KHtcbiAgICAgIHJ1bGVLZXk6ICdjaGFuZ2UtcmV0dXJuLXR5cGUnLFxuICAgICAgdmlvbGF0b3I6IG9yaWdpbmFsLFxuICAgICAgbWVzc2FnZTogYHJldHVybnMgJHt1cGRhRGVzY3J9IChmb3JtZXJseSAke29yaWdEZXNjcn0pYCxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSBwcm9wZXJ0eSB0eXBlIGlzIHRoZSBzYW1lIG9yIHN0cmVuZ3RoZW5lZFxuICpcbiAqIE1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIHJlbWFpbnMgY29tcGlsYWJsZTpcbiAqXG4gKiBgYGBcbiAqIFQgdmFsdWUgPSBvYmplY3QucHJvcDtcbiAqIGBgYFxuICpcbiAqIFdoZXJlIFJFVFVSTl9UWVBFKHByb3ApIOKJpDogVC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHlUeXBlTm90V2Vha2VuZWQoXG4gIG9yaWdpbmFsOiByZWZsZWN0LlByb3BlcnR5LFxuICB1cGRhdGVkOiByZWZsZWN0LlByb3BlcnR5LFxuICBtaXNtYXRjaGVzOiBJUmVwb3J0LFxuKSB7XG4gIGNvbnN0IGFuYSA9IGlzQ29tcGF0aWJsZVJldHVyblR5cGUob3JpZ2luYWwsIHVwZGF0ZWQpO1xuICBpZiAoIWFuYS5zdWNjZXNzKSB7XG4gICAgbWlzbWF0Y2hlcy5yZXBvcnQoe1xuICAgICAgcnVsZUtleTogJ2NoYW5nZWQtdHlwZScsXG4gICAgICB2aW9sYXRvcjogb3JpZ2luYWwsXG4gICAgICBtZXNzYWdlOiBgdHlwZSAke2Rlc2NyaWJlT3B0aW9uYWxWYWx1ZU1hdGNoaW5nRmFpbHVyZShcbiAgICAgICAgb3JpZ2luYWwsXG4gICAgICAgIHVwZGF0ZWQsXG4gICAgICAgIGFuYSxcbiAgICAgICl9YCxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSBwcm9wZXJ0eSB0eXBlIGlzIHRoZSBleGFjdCBzYW1lXG4gKlxuICogTmVjZXNzYXJ5IGZvciBzdWJjbGFzc2FibGUgdHlwZXMgaW4gQyMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5VHlwZVNhbWUoXG4gIG9yaWdpbmFsOiByZWZsZWN0LlByb3BlcnR5LFxuICB1cGRhdGVkOiByZWZsZWN0LlByb3BlcnR5LFxuICBtaXNtYXRjaGVzOiBJUmVwb3J0LFxuKSB7XG4gIGNvbnN0IG9sZERlc2MgPSByZWZsZWN0Lk9wdGlvbmFsVmFsdWUuZGVzY3JpYmUob3JpZ2luYWwpO1xuICBjb25zdCBuZXdEZXNjID0gcmVmbGVjdC5PcHRpb25hbFZhbHVlLmRlc2NyaWJlKHVwZGF0ZWQpO1xuICBpZiAob2xkRGVzYyAhPT0gbmV3RGVzYykge1xuICAgIG1pc21hdGNoZXMucmVwb3J0KHtcbiAgICAgIHJ1bGVLZXk6ICdjaGFuZ2VkLXR5cGUnLFxuICAgICAgdmlvbGF0b3I6IG9yaWdpbmFsLFxuICAgICAgbWVzc2FnZTogYGNoYW5nZWQgdG8gJHtuZXdEZXNjfSAoZm9ybWVybHkgJHtvbGREZXNjfSlgLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgdGhhdCBhIG1ldGhvZCByZXR1cm4gdHlwZSBpcyB0aGUgc2FtZSBvciB3ZWFrZW5lZFxuICpcbiAqIE1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIHJlbWFpbnMgY29tcGlsYWJsZSBpZiBVIGlzIGNoYW5nZWQ6XG4gKlxuICogYGBgXG4gKiBmdW5jdGlvbiBtZXRob2QoYXJnOiBVKSB7IC4uLiB9XG4gKlxuICogb2JqZWN0Lm1ldGhvZCg8VD52YWx1ZSk7XG4gKiBgYGBcbiAqXG4gKiBXaGVyZSBUIOKJpDogVS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUGFyYW1ldGVyVHlwZVdlYWtlbmVkKFxuICBtZXRob2Q6IHJlZmxlY3QuTWV0aG9kIHwgcmVmbGVjdC5Jbml0aWFsaXplcixcbiAgb3JpZ2luYWw6IHJlZmxlY3QuUGFyYW1ldGVyLFxuICB1cGRhdGVkOiByZWZsZWN0LlBhcmFtZXRlcixcbiAgbWlzbWF0Y2hlczogSVJlcG9ydCxcbikge1xuICBjb25zdCBhcmdBbmEgPSBpc0NvbXBhdGlibGVBcmd1bWVudFR5cGUob3JpZ2luYWwudHlwZSwgdXBkYXRlZC50eXBlKTtcbiAgaWYgKCFhcmdBbmEuc3VjY2Vzcykge1xuICAgIG1pc21hdGNoZXMucmVwb3J0KHtcbiAgICAgIHJ1bGVLZXk6ICdpbmNvbXBhdGlibGUtYXJndW1lbnQnLFxuICAgICAgdmlvbGF0b3I6IG1ldGhvZCxcbiAgICAgIG1lc3NhZ2U6IGBhcmd1bWVudCAke1xuICAgICAgICBvcmlnaW5hbC5uYW1lXG4gICAgICB9LCB0YWtlcyAke2Rlc2NyaWJlT3B0aW9uYWxWYWx1ZU1hdGNoaW5nRmFpbHVyZShcbiAgICAgICAgb3JpZ2luYWwsXG4gICAgICAgIHVwZGF0ZWQsXG4gICAgICAgIGFyZ0FuYSxcbiAgICAgICl9YCxcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGEgbWV0aG9kIHBhcmFtZXRlciB0eXBlIGlzIHRoZSBleGFjdCBzYW1lXG4gKlxuICogTmVjZXNzYXJ5IGZvciBzdWJjbGFzc2FibGUgdHlwZXMgaW4gQyMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVBhcmFtZXRlclR5cGVTYW1lKFxuICBtZXRob2Q6IHJlZmxlY3QuTWV0aG9kIHwgcmVmbGVjdC5Jbml0aWFsaXplcixcbiAgb3JpZ2luYWw6IHJlZmxlY3QuUGFyYW1ldGVyLFxuICB1cGRhdGVkOiByZWZsZWN0LlBhcmFtZXRlcixcbiAgbWlzbWF0Y2hlczogSVJlcG9ydCxcbikge1xuICBpZiAob3JpZ2luYWwudHlwZS50b1N0cmluZygpICE9PSB1cGRhdGVkLnR5cGUudG9TdHJpbmcoKSkge1xuICAgIG1pc21hdGNoZXMucmVwb3J0KHtcbiAgICAgIHJ1bGVLZXk6ICdpbmNvbXBhdGlibGUtYXJndW1lbnQnLFxuICAgICAgdmlvbGF0b3I6IG1ldGhvZCxcbiAgICAgIG1lc3NhZ2U6IGBhcmd1bWVudCAke1xuICAgICAgICBvcmlnaW5hbC5uYW1lXG4gICAgICB9LCB0YWtlcyAke3VwZGF0ZWQudHlwZS50b1N0cmluZygpfSAoZm9ybWVybHkgJHtvcmlnaW5hbC50eXBlLnRvU3RyaW5nKCl9KTogdHlwZSBpcyBAc3ViY2xhc3NhYmxlYCxcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXNjcmliZU9wdGlvbmFsVmFsdWVNYXRjaGluZ0ZhaWx1cmUoXG4gIG9yaWdUeXBlOiByZWZsZWN0Lk9wdGlvbmFsVmFsdWUsXG4gIHVwZGF0ZWRUeXBlOiByZWZsZWN0Lk9wdGlvbmFsVmFsdWUsXG4gIGFuYWx5c2lzOiBGYWlsZWRBbmFseXNpcyxcbikge1xuICBjb25zdCBvcmlnRGVzY3IgPSByZWZsZWN0Lk9wdGlvbmFsVmFsdWUuZGVzY3JpYmUob3JpZ1R5cGUpO1xuICBjb25zdCB1cGRhRGVzY3IgPSByZWZsZWN0Lk9wdGlvbmFsVmFsdWUuZGVzY3JpYmUodXBkYXRlZFR5cGUpO1xuICBpZiAob3JpZ0Rlc2NyICE9PSB1cGRhRGVzY3IpIHtcbiAgICByZXR1cm4gYCR7dXBkYURlc2NyfSAoZm9ybWVybHkgJHtvcmlnRGVzY3J9KTogJHthbmFseXNpcy5yZWFzb25zLmpvaW4oXG4gICAgICAnLCAnLFxuICAgICl9YDtcbiAgfVxuICByZXR1cm4gYCR7dXBkYURlc2NyfTogJHthbmFseXNpcy5yZWFzb25zLmpvaW4oJywgJyl9YDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGVhY2ggcGFyYW0gaW4gdGhlIG9sZCBjYWxsYWJsZSBpcyBzdGlsbCBhdmFpbGFibGUgaW4gdGhlIG5ldyBjYWxsYWJsZSwgYW5kIGFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIHRvIHRoZSBwYWlyc1xuICpcbiAqIE1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIHJlbWFpbnMgY29tcGlsYWJsZTpcbiAqXG4gKiBgYGBcbiAqIG9iamVjdC5tZXRob2QoYTEsIGEyLCAuLi4sIGFOKTtcbiAqIGBgYFxuICpcbiAqIChBbGwgdHlwZXMgc3RpbGwgYXNzaWduYWJsZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRXhpc3RpbmdQYXJhbXM8XG4gIFQgZXh0ZW5kcyByZWZsZWN0LkluaXRpYWxpemVyIHwgcmVmbGVjdC5NZXRob2QsXG4+KFxuICBvcmlnaW5hbDogVCxcbiAgdXBkYXRlZDogVCxcbiAgbWlzbWF0Y2hlczogSVJlcG9ydCxcbiAgdmFsaWRhdGVQYXJhbTogKFxuICAgIG9sZFBhcmFtOiByZWZsZWN0LlBhcmFtZXRlcixcbiAgICBuZXdQYXJhbTogcmVmbGVjdC5QYXJhbWV0ZXIsXG4gICkgPT4gdm9pZCxcbikge1xuICBvcmlnaW5hbC5wYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtLCBpKSA9PiB7XG4gICAgY29uc3QgdXBkYXRlZFBhcmFtID0gZmluZFBhcmFtKHVwZGF0ZWQucGFyYW1ldGVycywgaSk7XG4gICAgaWYgKHVwZGF0ZWRQYXJhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtaXNtYXRjaGVzLnJlcG9ydCh7XG4gICAgICAgIHJ1bGVLZXk6ICdyZW1vdmVkLWFyZ3VtZW50JyxcbiAgICAgICAgdmlvbGF0b3I6IG9yaWdpbmFsLFxuICAgICAgICBtZXNzYWdlOiBgYXJndW1lbnQgJHtwYXJhbS5uYW1lfSwgbm90IGFjY2VwdGVkIGFueW1vcmUuYCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhbGlkYXRlUGFyYW0ocGFyYW0sIHVwZGF0ZWRQYXJhbSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgbm8gbmV3IHJlcXVpcmVkIHBhcmFtcyBnb3QgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgbWV0aG9kXG4gKlxuICogTWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgcmVtYWlucyBjb21waWxhYmxlOlxuICpcbiAqIGBgYFxuICogb2JqZWN0Lm1ldGhvZChhMSwgYTIsIC4uLiwgYU4pO1xuICogYGBgXG4gKlxuICogKE5vdCB0b28gZmV3IGFyZ3VtZW50cylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTm9OZXdSZXF1aXJlZFBhcmFtczxcbiAgVCBleHRlbmRzIHJlZmxlY3QuSW5pdGlhbGl6ZXIgfCByZWZsZWN0Lk1ldGhvZCxcbj4ob3JpZ2luYWw6IFQsIHVwZGF0ZWQ6IFQsIG1pc21hdGNoZXM6IElSZXBvcnQpIHtcbiAgdXBkYXRlZC5wYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtLCBpKSA9PiB7XG4gICAgaWYgKHBhcmFtLm9wdGlvbmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ1BhcmFtID0gZmluZFBhcmFtKG9yaWdpbmFsLnBhcmFtZXRlcnMsIGkpO1xuICAgIGlmICghb3JpZ1BhcmFtIHx8IG9yaWdQYXJhbS5vcHRpb25hbCkge1xuICAgICAgbWlzbWF0Y2hlcy5yZXBvcnQoe1xuICAgICAgICBydWxlS2V5OiAnbmV3LWFyZ3VtZW50JyxcbiAgICAgICAgdmlvbGF0b3I6IG9yaWdpbmFsLFxuICAgICAgICBtZXNzYWdlOiBgYXJndW1lbnQgJHtwYXJhbS5uYW1lfSwgbmV3bHkgcmVxdWlyZWQgYXJndW1lbnQuYCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU1ldGhvZENvbXBhdGlibGU8XG4gIFQgZXh0ZW5kcyByZWZsZWN0Lk1ldGhvZCB8IHJlZmxlY3QuSW5pdGlhbGl6ZXIsXG4+KG9yaWdpbmFsOiBULCB1cGRhdGVkOiBULCBtaXNtYXRjaGVzOiBJUmVwb3J0KSB7XG4gIHZhbGlkYXRlU3RhYmlsaXRpZXMob3JpZ2luYWwsIHVwZGF0ZWQsIG1pc21hdGNoZXMpO1xuXG4gIC8vIFR5cGUgZ3VhcmRzIG9uIG9yaWdpbmFsIGFyZSBkdXBsaWNhdGVkIG9uIHVwZGF0ZWQgdG8gaGVscCB0c2MuLi4gVGhleSBhcmUgcmVxdWlyZWQgdG8gYmUgdGhlIHNhbWUgdHlwZSBieSB0aGUgZGVjbGFyYXRpb24uXG4gIGlmIChyZWZsZWN0LmlzTWV0aG9kKG9yaWdpbmFsKSAmJiByZWZsZWN0LmlzTWV0aG9kKHVwZGF0ZWQpKSB7XG4gICAgdmFsaWRhdGVTdGF0aWNTYW1lKG9yaWdpbmFsLCB1cGRhdGVkLCBtaXNtYXRjaGVzKTtcbiAgICB2YWxpZGF0ZUFzeW5jU2FtZShvcmlnaW5hbCwgdXBkYXRlZCwgbWlzbWF0Y2hlcyk7XG4gICAgdmFsaWRhdGVSZXR1cm5UeXBlTm90V2Vha2VuZWQob3JpZ2luYWwsIHVwZGF0ZWQsIG1pc21hdGNoZXMpO1xuICB9XG5cbiAgdmFsaWRhdGVOb3RNYWRlTm9uVmFyaWFkaWMob3JpZ2luYWwsIHVwZGF0ZWQsIG1pc21hdGNoZXMpO1xuXG4gIC8vIENoZWNrIHRoYXQgZXZlcnkgb3JpZ2luYWwgcGFyYW1ldGVyIGNhbiBzdGlsbCBiZSBtYXBwZWQgdG8gYSBwYXJhbWV0ZXIgaW4gdGhlIHVwZGF0ZWQgbWV0aG9kXG4gIHZhbGlkYXRlRXhpc3RpbmdQYXJhbXMoXG4gICAgb3JpZ2luYWwsXG4gICAgdXBkYXRlZCxcbiAgICBtaXNtYXRjaGVzLFxuICAgIChvbGRQYXJhbSwgbmV3UGFyYW0pID0+IHtcbiAgICAgIHZhbGlkYXRlUGFyYW1ldGVyVHlwZVdlYWtlbmVkKG9yaWdpbmFsLCBvbGRQYXJhbSwgbmV3UGFyYW0sIG1pc21hdGNoZXMpO1xuICAgIH0sXG4gICk7XG5cbiAgdmFsaWRhdGVOb05ld1JlcXVpcmVkUGFyYW1zKG9yaWdpbmFsLCB1cGRhdGVkLCBtaXNtYXRjaGVzKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIGNsYXNzL2ludGVyZmFjZSBoYXMgYmVlbiBtYXJrZWQgYXMgQHN1YmNsYXNzYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3ViY2xhc3NhYmxlVHlwZSh4OiByZWZsZWN0LkRvY3VtZW50YWJsZSkge1xuICByZXR1cm4geC5kb2NzLnN1YmNsYXNzYWJsZTtcbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBpbmRpY2F0ZWQgcGFyYW1ldGVyIHdpdGggdGhlIGdpdmVuIGluZGV4XG4gKlxuICogTWF5IHJldHVybiB0aGUgbGFzdCBwYXJhbWV0ZXIgaWYgaXQncyB2YXJpYWRpY1xuICovXG5mdW5jdGlvbiBmaW5kUGFyYW0oXG4gIHBhcmFtZXRlcnM6IHJlZmxlY3QuUGFyYW1ldGVyW10sXG4gIGk6IG51bWJlcixcbik6IHJlZmxlY3QuUGFyYW1ldGVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGkgPCBwYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgIHJldHVybiBwYXJhbWV0ZXJzW2ldO1xuICB9XG4gIGNvbnN0IGxhc3RQYXJhbSA9XG4gICAgcGFyYW1ldGVycy5sZW5ndGggPiAwID8gcGFyYW1ldGVyc1twYXJhbWV0ZXJzLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICBpZiAobGFzdFBhcmFtICYmIGxhc3RQYXJhbS52YXJpYWRpYykge1xuICAgIHJldHVybiBsYXN0UGFyYW07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGEgcHJldmlvdXNseSBtdXRhYmxlIHByb3BlcnR5IGlzIG5vdCBtYWRlIGltbXV0YWJsZVxuICpcbiAqIE1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIHJlbWFpbnMgY29tcGlsYWJsZTpcbiAqXG4gKiBgYGBcbiAqIG9iamVjdC5wcm9wID0gdmFsdWU7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTm90TWFkZUltbXV0YWJsZShcbiAgb3JpZ2luYWw6IHJlZmxlY3QuUHJvcGVydHksXG4gIHVwZGF0ZWQ6IHJlZmxlY3QuUHJvcGVydHksXG4gIG1pc21hdGNoZXM6IElSZXBvcnQsXG4pIHtcbiAgaWYgKHVwZGF0ZWQuaW1tdXRhYmxlICYmICFvcmlnaW5hbC5pbW11dGFibGUpIHtcbiAgICBtaXNtYXRjaGVzLnJlcG9ydCh7XG4gICAgICBydWxlS2V5OiAncmVtb3ZlZC1tdXRhYmlsaXR5JyxcbiAgICAgIHZpb2xhdG9yOiBvcmlnaW5hbCxcbiAgICAgIG1lc3NhZ2U6ICd1c2VkIHRvIGJlIG11dGFibGUsIGlzIG5vdyBpbW11dGFibGUnLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiogbWVtYmVyUGFpcnM8XG4gIFQgZXh0ZW5kcyByZWZsZWN0LlR5cGVNZW1iZXIsXG4gIFUgZXh0ZW5kcyByZWZsZWN0LlJlZmVyZW5jZVR5cGUsXG4+KFxuICBvcmlnQ2xhc3M6IFUsXG4gIHhzOiBUW10sXG4gIHVwZGF0ZWRDbGFzczogVSxcbiAgbWlzbWF0Y2hlczogSVJlcG9ydCxcbik6IEl0ZXJhYmxlSXRlcmF0b3I8W1QsIHJlZmxlY3QuVHlwZU1lbWJlcl0+IHtcbiAgZm9yIChjb25zdCBvcmlnTWVtYmVyIG9mIHhzKSB7XG4gICAgTE9HLnRyYWNlKGAke29yaWdDbGFzcy5mcW59IyR7b3JpZ01lbWJlci5uYW1lfWApO1xuXG4gICAgY29uc3QgdXBkYXRlZE1lbWJlciA9IHVwZGF0ZWRDbGFzcy5hbGxNZW1iZXJzLmZpbmQoXG4gICAgICAobSkgPT4gbS5uYW1lID09PSBvcmlnTWVtYmVyLm5hbWUsXG4gICAgKTtcbiAgICBpZiAoIXVwZGF0ZWRNZW1iZXIpIHtcbiAgICAgIG1pc21hdGNoZXMucmVwb3J0KHtcbiAgICAgICAgcnVsZUtleTogJ3JlbW92ZWQnLFxuICAgICAgICB2aW9sYXRvcjogb3JpZ01lbWJlcixcbiAgICAgICAgbWVzc2FnZTogJ2hhcyBiZWVuIHJlbW92ZWQnLFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAob3JpZ01lbWJlci5raW5kICE9PSB1cGRhdGVkTWVtYmVyLmtpbmQpIHtcbiAgICAgIG1pc21hdGNoZXMucmVwb3J0KHtcbiAgICAgICAgcnVsZUtleTogJ2NoYW5nZWQta2luZCcsXG4gICAgICAgIHZpb2xhdG9yOiBvcmlnTWVtYmVyLFxuICAgICAgICBtZXNzYWdlOiBgY2hhbmdlZCBmcm9tICR7b3JpZ01lbWJlci5raW5kfSB0byAke3VwZGF0ZWRNZW1iZXIua2luZH1gLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFvcmlnTWVtYmVyLnByb3RlY3RlZCAmJiB1cGRhdGVkTWVtYmVyLnByb3RlY3RlZCkge1xuICAgICAgbWlzbWF0Y2hlcy5yZXBvcnQoe1xuICAgICAgICBydWxlS2V5OiAnaGlkZGVuJyxcbiAgICAgICAgdmlvbGF0b3I6IG9yaWdNZW1iZXIsXG4gICAgICAgIG1lc3NhZ2U6IFwiY2hhbmdlZCBmcm9tICdwdWJsaWMnIHRvICdwcm90ZWN0ZWQnXCIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB5aWVsZCBbb3JpZ01lbWJlciwgdXBkYXRlZE1lbWJlcl07XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIHdlIGFyZSBzdHJlbmd0aGVuaW5nIHRoZSBwb3N0Y29uZGl0aW9uIChvdXRwdXQgdHlwZSBvZiBhIG1ldGhvZCBvciBwcm9wZXJ0eSlcbiAqXG4gKiBTdHJlbmd0aGVuaW5nIG91dHB1dCB2YWx1ZXMgaXMgYWxsb3dlZCFcbiAqL1xuZnVuY3Rpb24gaXNDb21wYXRpYmxlUmV0dXJuVHlwZShcbiAgb3JpZ2luYWw6IHJlZmxlY3QuT3B0aW9uYWxWYWx1ZSxcbiAgdXBkYXRlZDogcmVmbGVjdC5PcHRpb25hbFZhbHVlLFxuKTogQW5hbHlzaXMge1xuICBpZiAob3JpZ2luYWwudHlwZS52b2lkKSB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICB9IC8vIElmIHdlIGRpZG4ndCB1c2UgdG8gcmV0dXJuIGFueXRoaW5nLCByZXR1cm5pbmcgc29tZXRoaW5nIG5vdyBpcyBmaW5lXG4gIGlmICh1cGRhdGVkLnR5cGUudm9pZCkge1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCByZWFzb25zOiBbXCJub3cgcmV0dXJuaW5nICd2b2lkJ1wiXSB9O1xuICB9IC8vIElmIHdlIHVzZWQgdG8gcmV0dXJuIHNvbWV0aGluZywgd2UgY2FuJ3Qgc3RvcCBkb2luZyB0aGF0XG4gIGlmICghb3JpZ2luYWwub3B0aW9uYWwgJiYgdXBkYXRlZC5vcHRpb25hbCkge1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCByZWFzb25zOiBbJ291dHB1dCB0eXBlIGlzIG5vdyBvcHRpb25hbCddIH07XG4gIH1cbiAgcmV0dXJuIGlzU3VwZXJUeXBlKG9yaWdpbmFsLnR5cGUsIHVwZGF0ZWQudHlwZSwgdXBkYXRlZC5zeXN0ZW0pO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgd2UgYXJlIHdlYWtlbmluZyB0aGUgcHJlIChpbnB1dCB0eXBlIG9mIGEgbWV0aG9kKVxuICpcbiAqIFdlYWtlbmluZyBwcmVjb25kaXRpb25zIGlzIGFsbG93ZWQhXG4gKi9cbmZ1bmN0aW9uIGlzQ29tcGF0aWJsZUFyZ3VtZW50VHlwZShcbiAgb3JpZ2luYWw6IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSxcbiAgdXBkYXRlZDogcmVmbGVjdC5UeXBlUmVmZXJlbmNlLFxuKTogQW5hbHlzaXMge1xuICAvLyBJbnB1dCBjYW4gbmV2ZXIgYmUgdm9pZCwgc28gbm8gbmVlZCB0byBjaGVja1xuICByZXR1cm4gaXNTdXBlclR5cGUodXBkYXRlZCwgb3JpZ2luYWwsIHVwZGF0ZWQuc3lzdGVtKTtcbn1cblxuLyoqXG4gKiBWZXJpZnkgYXNzaWduYWJpbGl0eSB0byBzdXBlcnR5cGVzXG4gKlxuICogRm9yIGV2ZXJ5IGJhc2UgdHlwZSBCIG9mIHR5cGUgVCwgc29tZW9uZSBjb3VsZCBoYXZlIHdyaXR0ZW46XG4gKlxuICogYGBgXG4gKiBjb25zdCB2YXJpYWJsZTogQiA9IG5ldyBUKCk7XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGNvZGUgbmVlZHMgdG8gYmUgdmFsaWQgaW4gdGhlIHVwZGF0ZWQgYXNzZW1ibHksIHNvIGZvciBlYWNoXG4gKiBCIGFuIHVwZGF0ZWQgdHlwZSBCJyBuZWVkcyB0byBleGlzdCBpbiB0aGUgbmV3IGFzc2VtYmx5IHdoaWNoIGlzXG4gKiBzdGlsbCBhIHN1cGVydHlwZSBvZiBUJy5cbiAqL1xuZnVuY3Rpb24gYXNzaWduYWJsZVRvQWxsQmFzZVR5cGVzKFxuICBvcmlnaW5hbDogcmVmbGVjdC5SZWZlcmVuY2VUeXBlLFxuICB1cGRhdGVkOiByZWZsZWN0LlJlZmVyZW5jZVR5cGUsXG4pOiBBbmFseXNpcyB7XG4gIGZvciAoY29uc3QgQiBvZiBiYXNlVHlwZXMob3JpZ2luYWwpKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gaXNOb21pbmFsU3VwZXJUeXBlKFxuICAgICAgQi5yZWZlcmVuY2UsXG4gICAgICB1cGRhdGVkLnJlZmVyZW5jZSxcbiAgICAgIHVwZGF0ZWQuc3lzdGVtLFxuICAgICk7XG4gICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xufVxuXG4vKipcbiAqIFJldHVybiBhbGwgYmFzZSB0eXBlcyBvZiB0aGUgZ2l2ZW4gcmVmZXJlbmNlIHR5cGVcbiAqL1xuZnVuY3Rpb24gYmFzZVR5cGVzKHR5cGU6IHJlZmxlY3QuUmVmZXJlbmNlVHlwZSkge1xuICBjb25zdCByZXQgPSBuZXcgQXJyYXk8cmVmbGVjdC5SZWZlcmVuY2VUeXBlPigpO1xuICBjb25zdCB0b2RvOiByZWZsZWN0LlJlZmVyZW5jZVR5cGVbXSA9IFt0eXBlXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHdoaWxlICh0b2RvLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBuZXh0ID0gdG9kby5wb3AoKSE7XG4gICAgaWYgKHNlZW4uaGFzKG5leHQuZnFuKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJldC5wdXNoKG5leHQpO1xuICAgIHNlZW4uYWRkKG5leHQuZnFuKTtcblxuICAgIHRvZG8ucHVzaCguLi5uZXh0LmludGVyZmFjZXMpO1xuICAgIGlmIChuZXh0LmlzQ2xhc3NUeXBlKCkgJiYgbmV4dC5iYXNlKSB7XG4gICAgICB0b2RvLnB1c2gobmV4dC5iYXNlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgZWFjaCBlbnVtIG1lbWJlciBpbiB0aGUgb2xkIGVudW0gZW51bSwgYW5kIGFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIHRvIHRoZSBlbnVtc1xuICpcbiAqIE1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIHJlbWFpbnMgY29tcGlsYWJsZTpcbiAqXG4gKiBgYGBcbiAqIFQgeCA9IEVOVU0ubWVtYmVyO1xuICogYGBgXG4gKlxuICogKEZvciBldmVyeSBtZW1iZXIgb2YgZW51bSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRXhpc3RpbmdNZW1iZXJzKFxuICBvcmlnaW5hbDogcmVmbGVjdC5FbnVtVHlwZSxcbiAgdXBkYXRlZDogcmVmbGVjdC5FbnVtVHlwZSxcbiAgbWlzbWF0Y2hlczogSVJlcG9ydCxcbiAgdmFsaWRhdGVNZW1iZXI6IChcbiAgICBvbGRQYXJhbTogcmVmbGVjdC5FbnVtTWVtYmVyLFxuICAgIG5ld1BhcmFtOiByZWZsZWN0LkVudW1NZW1iZXIsXG4gICkgPT4gdm9pZCxcbikge1xuICBmb3IgKGNvbnN0IG9yaWdNZW1iZXIgb2Ygb3JpZ2luYWwubWVtYmVycykge1xuICAgIGNvbnN0IHVwZGF0ZWRNZW1iZXIgPSB1cGRhdGVkLm1lbWJlcnMuZmluZChcbiAgICAgIChtKSA9PiBtLm5hbWUgPT09IG9yaWdNZW1iZXIubmFtZSxcbiAgICApO1xuICAgIGlmICghdXBkYXRlZE1lbWJlcikge1xuICAgICAgbWlzbWF0Y2hlcy5yZXBvcnQoe1xuICAgICAgICBydWxlS2V5OiAncmVtb3ZlZCcsXG4gICAgICAgIHZpb2xhdG9yOiBvcmlnTWVtYmVyLFxuICAgICAgICBtZXNzYWdlOiBgbWVtYmVyICR7b3JpZ01lbWJlci5uYW1lfSBoYXMgYmVlbiByZW1vdmVkYCxcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVNZW1iZXIob3JpZ01lbWJlciwgdXBkYXRlZE1lbWJlcik7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ /** The qualified version number for this JSII compiler. */
2
+ export declare const VERSION = "1.35.0 (build 6ebef96)";
package/lib/version.js ADDED
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ // Generated at 2021-09-28T17:08:28Z by generate.sh
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.VERSION = void 0;
5
+ /** The qualified version number for this JSII compiler. */
6
+ exports.VERSION = '1.35.0 (build 6ebef96)';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInZlcnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG1EQUFtRDs7O0FBRW5ELDJEQUEyRDtBQUM5QyxRQUFBLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdlbmVyYXRlZCBhdCAyMDIxLTA5LTI4VDE3OjA4OjI4WiBieSBnZW5lcmF0ZS5zaFxuXG4vKiogVGhlIHF1YWxpZmllZCB2ZXJzaW9uIG51bWJlciBmb3IgdGhpcyBKU0lJIGNvbXBpbGVyLiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnMS4zNS4wIChidWlsZCA2ZWJlZjk2KSc7XG4iXX0=
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "jsii-diff",
3
+ "version": "1.35.0",
4
+ "description": "Assembly comparison for jsii",
5
+ "license": "Apache-2.0",
6
+ "author": {
7
+ "name": "Amazon Web Services",
8
+ "url": "https://aws.amazon.com"
9
+ },
10
+ "homepage": "https://github.com/aws/jsii",
11
+ "bugs": {
12
+ "url": "https://github.com/aws/jsii/issues"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://github.com/aws/jsii.git",
17
+ "directory": "packages/jsii-diff"
18
+ },
19
+ "engines": {
20
+ "node": ">= 12.7.0"
21
+ },
22
+ "main": "lib/index.js",
23
+ "bin": {
24
+ "jsii-diff": "bin/jsii-diff"
25
+ },
26
+ "scripts": {
27
+ "build": "bash ./generate.sh && tsc --build && npm run lint",
28
+ "watch": "bash ./generate.sh && tsc --build -w",
29
+ "lint": "eslint . --ext .js,.ts --ignore-path=.gitignore",
30
+ "lint:fix": "yarn lint --fix",
31
+ "test": "jest",
32
+ "test:update": "jest -u",
33
+ "package": "package-js"
34
+ },
35
+ "dependencies": {
36
+ "@jsii/check-node": "1.35.0",
37
+ "@jsii/spec": "^1.35.0",
38
+ "fs-extra": "^9.1.0",
39
+ "jsii-reflect": "^1.35.0",
40
+ "log4js": "^6.3.0",
41
+ "typescript": "~3.9.10",
42
+ "yargs": "^16.2.0"
43
+ },
44
+ "devDependencies": {
45
+ "@types/fs-extra": "^9.0.13",
46
+ "@types/jest": "^27.0.2",
47
+ "@types/jest-expect-message": "^1.0.3",
48
+ "@types/node": "^12.20.26",
49
+ "@types/tar-fs": "^2.0.1",
50
+ "eslint": "^7.32.0",
51
+ "jest": "^27.2.1",
52
+ "jest-expect-message": "^1.0.2",
53
+ "jsii": "^1.35.0",
54
+ "jsii-build-tools": "^1.35.0",
55
+ "prettier": "^2.4.1"
56
+ }
57
+ }
@@ -0,0 +1 @@
1
+ export {};