@fgv/ts-json 1.9.5 → 2.0.1-alpha.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 (125) hide show
  1. package/dist/ts-json.d.ts +1826 -0
  2. package/dist/tsdoc-metadata.json +11 -0
  3. package/lib/index.d.ts +5 -0
  4. package/lib/index.d.ts.map +1 -0
  5. package/lib/index.js +42 -0
  6. package/lib/index.js.map +1 -0
  7. package/lib/packlets/context/compositeJsonMap.d.ts +60 -0
  8. package/lib/packlets/context/compositeJsonMap.d.ts.map +1 -0
  9. package/lib/packlets/context/compositeJsonMap.js +105 -0
  10. package/lib/packlets/context/compositeJsonMap.js.map +1 -0
  11. package/lib/packlets/context/contextHelpers.d.ts +116 -0
  12. package/lib/packlets/context/contextHelpers.d.ts.map +1 -0
  13. package/lib/packlets/context/contextHelpers.js +191 -0
  14. package/lib/packlets/context/contextHelpers.js.map +1 -0
  15. package/lib/packlets/context/index.d.ts +4 -0
  16. package/lib/packlets/context/index.d.ts.map +1 -0
  17. package/lib/packlets/context/index.js +31 -0
  18. package/lib/packlets/context/index.js.map +1 -0
  19. package/lib/packlets/context/jsonContext.d.ts +84 -0
  20. package/lib/packlets/context/jsonContext.d.ts.map +1 -0
  21. package/lib/packlets/context/jsonContext.js +41 -0
  22. package/lib/packlets/context/jsonContext.js.map +1 -0
  23. package/lib/packlets/converters/converters.d.ts +54 -0
  24. package/lib/packlets/converters/converters.d.ts.map +1 -0
  25. package/lib/packlets/converters/converters.js +105 -0
  26. package/lib/packlets/converters/converters.js.map +1 -0
  27. package/lib/packlets/converters/file.d.ts +83 -0
  28. package/lib/packlets/converters/file.d.ts.map +1 -0
  29. package/lib/packlets/converters/file.js +162 -0
  30. package/lib/packlets/converters/file.js.map +1 -0
  31. package/lib/packlets/converters/index.d.ts +5 -0
  32. package/lib/packlets/converters/index.d.ts.map +1 -0
  33. package/{jsonEditor → lib/packlets/converters}/index.js +10 -10
  34. package/lib/packlets/converters/index.js.map +1 -0
  35. package/lib/packlets/converters/jsonConverter.d.ts +276 -0
  36. package/lib/packlets/converters/jsonConverter.d.ts.map +1 -0
  37. package/lib/packlets/converters/jsonConverter.js +310 -0
  38. package/lib/packlets/converters/jsonConverter.js.map +1 -0
  39. package/lib/packlets/editor/common.d.ts +67 -0
  40. package/lib/packlets/editor/common.d.ts.map +1 -0
  41. package/lib/packlets/editor/common.js +3 -0
  42. package/lib/packlets/editor/common.js.map +1 -0
  43. package/lib/packlets/editor/index.d.ts +8 -0
  44. package/lib/packlets/editor/index.d.ts.map +1 -0
  45. package/lib/packlets/editor/index.js +58 -0
  46. package/lib/packlets/editor/index.js.map +1 -0
  47. package/lib/packlets/editor/jsonEditor.d.ts +155 -0
  48. package/lib/packlets/editor/jsonEditor.d.ts.map +1 -0
  49. package/lib/packlets/editor/jsonEditor.js +333 -0
  50. package/lib/packlets/editor/jsonEditor.js.map +1 -0
  51. package/lib/packlets/editor/jsonEditorRule.d.ts +64 -0
  52. package/lib/packlets/editor/jsonEditorRule.d.ts.map +1 -0
  53. package/lib/packlets/editor/jsonEditorRule.js +54 -0
  54. package/lib/packlets/editor/jsonEditorRule.js.map +1 -0
  55. package/lib/packlets/editor/jsonEditorState.d.ts +125 -0
  56. package/lib/packlets/editor/jsonEditorState.d.ts.map +1 -0
  57. package/lib/packlets/editor/jsonEditorState.js +177 -0
  58. package/lib/packlets/editor/jsonEditorState.js.map +1 -0
  59. package/lib/packlets/editor/jsonReferenceMap.d.ts +303 -0
  60. package/lib/packlets/editor/jsonReferenceMap.d.ts.map +1 -0
  61. package/lib/packlets/editor/jsonReferenceMap.js +324 -0
  62. package/lib/packlets/editor/jsonReferenceMap.js.map +1 -0
  63. package/lib/packlets/editor/rules/conditional.d.ts +107 -0
  64. package/lib/packlets/editor/rules/conditional.d.ts.map +1 -0
  65. package/lib/packlets/editor/rules/conditional.js +167 -0
  66. package/lib/packlets/editor/rules/conditional.js.map +1 -0
  67. package/{jsonEditor → lib/packlets/editor}/rules/index.d.ts +1 -0
  68. package/lib/packlets/editor/rules/index.d.ts.map +1 -0
  69. package/lib/packlets/editor/rules/index.js +42 -0
  70. package/lib/packlets/editor/rules/index.js.map +1 -0
  71. package/lib/packlets/editor/rules/multivalue.d.ts +94 -0
  72. package/lib/packlets/editor/rules/multivalue.d.ts.map +1 -0
  73. package/lib/packlets/editor/rules/multivalue.js +141 -0
  74. package/lib/packlets/editor/rules/multivalue.js.map +1 -0
  75. package/lib/packlets/editor/rules/references.d.ts +69 -0
  76. package/lib/packlets/editor/rules/references.d.ts.map +1 -0
  77. package/lib/packlets/editor/rules/references.js +160 -0
  78. package/lib/packlets/editor/rules/references.js.map +1 -0
  79. package/lib/packlets/editor/rules/templates.d.ts +74 -0
  80. package/lib/packlets/editor/rules/templates.d.ts.map +1 -0
  81. package/lib/packlets/editor/rules/templates.js +127 -0
  82. package/lib/packlets/editor/rules/templates.js.map +1 -0
  83. package/lib/packlets/json/common.d.ts +85 -0
  84. package/lib/packlets/json/common.d.ts.map +1 -0
  85. package/lib/packlets/json/common.js +123 -0
  86. package/lib/packlets/json/common.js.map +1 -0
  87. package/lib/packlets/json/index.d.ts +2 -0
  88. package/lib/packlets/json/index.d.ts.map +1 -0
  89. package/lib/packlets/json/index.js +39 -0
  90. package/lib/packlets/json/index.js.map +1 -0
  91. package/package.json +57 -49
  92. package/common.d.ts +0 -58
  93. package/common.js +0 -116
  94. package/contextHelpers.d.ts +0 -21
  95. package/contextHelpers.js +0 -101
  96. package/converters.d.ts +0 -37
  97. package/converters.js +0 -92
  98. package/file.d.ts +0 -60
  99. package/file.js +0 -140
  100. package/index.d.ts +0 -9
  101. package/index.js +0 -61
  102. package/jsonContext.d.ts +0 -74
  103. package/jsonContext.js +0 -40
  104. package/jsonConverter.d.ts +0 -229
  105. package/jsonConverter.js +0 -292
  106. package/jsonEditor/common.d.ts +0 -36
  107. package/jsonEditor/common.js +0 -3
  108. package/jsonEditor/index.d.ts +0 -5
  109. package/jsonEditor/jsonEditor.d.ts +0 -74
  110. package/jsonEditor/jsonEditor.js +0 -259
  111. package/jsonEditor/jsonEditorRule.d.ts +0 -47
  112. package/jsonEditor/jsonEditorRule.js +0 -44
  113. package/jsonEditor/jsonEditorState.d.ts +0 -24
  114. package/jsonEditor/jsonEditorState.js +0 -86
  115. package/jsonEditor/rules/conditional.d.ts +0 -84
  116. package/jsonEditor/rules/conditional.js +0 -146
  117. package/jsonEditor/rules/index.js +0 -21
  118. package/jsonEditor/rules/multivalue.d.ts +0 -78
  119. package/jsonEditor/rules/multivalue.js +0 -129
  120. package/jsonEditor/rules/references.d.ts +0 -62
  121. package/jsonEditor/rules/references.js +0 -158
  122. package/jsonEditor/rules/templates.d.ts +0 -56
  123. package/jsonEditor/rules/templates.js +0 -115
  124. package/jsonReferenceMap.d.ts +0 -182
  125. package/jsonReferenceMap.js +0 -272
@@ -1,272 +0,0 @@
1
- "use strict";
2
- /*
3
- * Copyright (c) 2020 Erik Fortune
4
- *
5
- * Permission is hereby granted, free of charge, to any person obtaining a copy
6
- * of this software and associated documentation files (the "Software"), to deal
7
- * in the Software without restriction, including without limitation the rights
8
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- * copies of the Software, and to permit persons to whom the Software is
10
- * furnished to do so, subject to the following conditions:
11
- *
12
- * The above copyright notice and this permission notice shall be included in all
13
- * copies or substantial portions of the Software.
14
- *
15
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- * SOFTWARE.
22
- */
23
- Object.defineProperty(exports, "__esModule", { value: true });
24
- exports.CompositeJsonMap = exports.PrefixedJsonMap = exports.SimpleJsonMap = exports.SimpleJsonMapBase = exports.PrefixKeyPolicy = exports.ReferenceMapKeyPolicy = void 0;
25
- const ts_utils_1 = require("@fgv/ts-utils");
26
- const common_1 = require("./common");
27
- const jsonEditor_1 = require("./jsonEditor");
28
- /**
29
- * Policy object responsible for validating or correcting
30
- * keys in a reference map
31
- */
32
- class ReferenceMapKeyPolicy {
33
- constructor(options, isValid) {
34
- this._defaultOptions = options;
35
- this._isValid = isValid !== null && isValid !== void 0 ? isValid : ReferenceMapKeyPolicy.defaultKeyPredicate;
36
- }
37
- static defaultKeyPredicate(key) {
38
- return (key.length > 0) && (!key.includes('{{')) && (!key.startsWith('?'));
39
- }
40
- isValid(key, item) {
41
- return this._isValid(key, item);
42
- }
43
- validate(key, item, _options) {
44
- return this.isValid(key, item) ? (0, ts_utils_1.succeed)(key) : (0, ts_utils_1.fail)(`${key}: invalid key`);
45
- }
46
- validateItems(items, options) {
47
- return (0, ts_utils_1.mapResults)(items.map((item) => {
48
- return this.validate(...item, options).onSuccess((valid) => {
49
- return (0, ts_utils_1.succeed)([valid, item[1]]);
50
- });
51
- }));
52
- }
53
- validateMap(map, options) {
54
- return this.validateItems(Array.from(map.entries()), options).onSuccess((valid) => {
55
- return (0, ts_utils_1.captureResult)(() => new Map(valid));
56
- });
57
- }
58
- }
59
- exports.ReferenceMapKeyPolicy = ReferenceMapKeyPolicy;
60
- class PrefixKeyPolicy extends ReferenceMapKeyPolicy {
61
- constructor(prefix, options) {
62
- super(options);
63
- this.prefix = prefix;
64
- }
65
- isValid(key, _item) {
66
- return key.startsWith(this.prefix) && (key !== this.prefix) && ReferenceMapKeyPolicy.defaultKeyPredicate(key);
67
- }
68
- validate(key, item, options) {
69
- var _a;
70
- // istanbul ignore next
71
- const makeValid = ((_a = (options !== null && options !== void 0 ? options : this._defaultOptions)) === null || _a === void 0 ? void 0 : _a.makeValid) === true;
72
- if (this.isValid(key, item)) {
73
- return (0, ts_utils_1.succeed)(key);
74
- }
75
- else if (makeValid && ReferenceMapKeyPolicy.defaultKeyPredicate(key)) {
76
- return (0, ts_utils_1.succeed)(`${this.prefix}${key}`);
77
- }
78
- return (0, ts_utils_1.fail)(`${key}: invalid key`);
79
- }
80
- }
81
- exports.PrefixKeyPolicy = PrefixKeyPolicy;
82
- /**
83
- * A SimpleJsonMap presents a view of a simple map of @see JsonValue
84
- */
85
- class SimpleJsonMapBase {
86
- constructor(values, context, keyPolicy) {
87
- values = SimpleJsonMapBase._toMap(values).orThrow();
88
- this._keyPolicy = keyPolicy !== null && keyPolicy !== void 0 ? keyPolicy : new ReferenceMapKeyPolicy();
89
- this._values = this._keyPolicy.validateMap(values).orThrow();
90
- this._context = context;
91
- }
92
- static _toMap(values) {
93
- if (values === undefined) {
94
- return (0, ts_utils_1.captureResult)(() => new Map());
95
- }
96
- else if (!(values instanceof Map)) {
97
- return (0, ts_utils_1.recordToMap)(values, (_k, v) => (0, ts_utils_1.succeed)(v));
98
- }
99
- return (0, ts_utils_1.succeed)(values);
100
- }
101
- /**
102
- * Determine if a key might be valid for this map but does not determine if key actually
103
- * exists. Allows key range to be constrained.
104
- * @param key key to be tested
105
- * @returns true if the key is in the valid range, false otherwise.
106
- */
107
- keyIsInRange(key) {
108
- return this._keyPolicy.isValid(key);
109
- }
110
- /**
111
- * Determines if an object with the specified key actually exists in the map.
112
- * @param key key to be tested
113
- * @returns true if an object with the specified key exists, false otherwise.
114
- */
115
- has(key) {
116
- return this._values.has(key);
117
- }
118
- /**
119
- * Gets a JSON object specified by key.
120
- * @param key key of the object to be retrieved
121
- * @param context optional @see JsonContext used to format the object
122
- * @returns Success with the formatted object if successful. Failure with detail 'unknown'
123
- * if no such object exists, or failure with detail 'error' if the object was found but
124
- * could not be formatted.
125
- */
126
- getJsonObject(key, context) {
127
- return this.getJsonValue(key, context).onSuccess((jv) => {
128
- if (!(0, common_1.isJsonObject)(jv)) {
129
- return (0, ts_utils_1.failWithDetail)(`${key}: not an object`, 'error');
130
- }
131
- return (0, ts_utils_1.succeedWithDetail)(jv);
132
- });
133
- }
134
- }
135
- exports.SimpleJsonMapBase = SimpleJsonMapBase;
136
- /**
137
- * A SimpleJsonMap presents a view of a simple map of @see JsonValue
138
- */
139
- class SimpleJsonMap extends SimpleJsonMapBase {
140
- constructor(values, context, options) {
141
- super(values, context, options === null || options === void 0 ? void 0 : options.keyPolicy);
142
- this._editor = options === null || options === void 0 ? void 0 : options.editor;
143
- }
144
- /**
145
- * Creates a new @see SimpleJsonMap from the supplied objects
146
- * @param values A string-keyed Map or Record of the @see JsonObject to be returned
147
- * @param context Optional @see JsonContext used to format returned values
148
- * @param options Optional @see SimpleJsonMapOptions for initialization
149
- */
150
- static createSimple(values, context, options) {
151
- return (0, ts_utils_1.captureResult)(() => new SimpleJsonMap(values, context, options));
152
- }
153
- /**
154
- * Gets a JSON value specified by key.
155
- * @param key key of the object to be retrieved
156
- * @param context Optional @see JsonContext used to format the value
157
- * @returns Success with the formatted object if successful. Failure with detail 'unknown'
158
- * if no such object exists, or failure with detail 'error' if the object was found but
159
- * could not be formatted.
160
- */
161
- // eslint-disable-next-line no-use-before-define
162
- getJsonValue(key, context) {
163
- context = context !== null && context !== void 0 ? context : this._context;
164
- const value = this._values.get(key);
165
- if (!value) {
166
- return (0, ts_utils_1.failWithDetail)(`${key}: JSON value not found`, 'unknown');
167
- }
168
- return this._clone(value, context);
169
- }
170
- _clone(value, context) {
171
- if (!this._editor) {
172
- const result = jsonEditor_1.JsonEditor.create();
173
- // istanbul ignore next: nearly impossible to reproduce
174
- if (result.isFailure()) {
175
- return (0, ts_utils_1.failWithDetail)(result.message, 'error');
176
- }
177
- this._editor = result.value;
178
- }
179
- return this._editor.clone(value, context).withFailureDetail('error');
180
- }
181
- }
182
- exports.SimpleJsonMap = SimpleJsonMap;
183
- /**
184
- * A PrefixedJsonMap enforces a supplied prefix for all contained values, optionally
185
- * adding the prefix as necessary (default true).
186
- */
187
- class PrefixedJsonMap extends SimpleJsonMap {
188
- constructor(values, context, options) {
189
- super(values, context, options);
190
- }
191
- static createPrefixed(prefixOptions, values, context, editor) {
192
- return (0, ts_utils_1.captureResult)(() => new PrefixedJsonMap(values, context, { keyPolicy: this._toPolicy(prefixOptions), editor }));
193
- }
194
- static _toPolicy(prefixOptions) {
195
- if (typeof prefixOptions === 'string') {
196
- return new PrefixKeyPolicy(prefixOptions, { makeValid: true });
197
- }
198
- return new PrefixKeyPolicy(prefixOptions.prefix, { makeValid: (prefixOptions.addPrefix !== false) });
199
- }
200
- }
201
- exports.PrefixedJsonMap = PrefixedJsonMap;
202
- /**
203
- * A CompositeJsonMap presents a composed view of one or more other
204
- * JsonReferenceMaps.
205
- */
206
- class CompositeJsonMap {
207
- constructor(maps) {
208
- this._maps = maps;
209
- }
210
- /**
211
- * Creates a new @see CompositeJsonMap from the supplied maps
212
- * @param maps one or more object maps to be composed
213
- */
214
- static create(maps) {
215
- return (0, ts_utils_1.captureResult)(() => new CompositeJsonMap(maps));
216
- }
217
- /**
218
- * Determine if a key might be valid for this map but does not determine
219
- * if key actually exists. Allows key range to be constrained.
220
- * @param key key to be tested
221
- * @returns true if the key is in the valid range, false otherwise.
222
- */
223
- keyIsInRange(key) {
224
- return this._maps.find((map) => map.keyIsInRange(key)) !== undefined;
225
- }
226
- /**
227
- * Determines if an object with the specified key actually exists in the map.
228
- * @param key key to be tested
229
- * @returns true if an object with the specified key exists, false otherwise.
230
- */
231
- has(key) {
232
- return this._maps.find((map) => map.has(key)) !== undefined;
233
- }
234
- /**
235
- * Gets a JSON object specified by key.
236
- * @param key key of the object to be retrieved
237
- * @param context optional @see JsonContext used to format the object
238
- * @returns Success with the formatted object if successful. Failure with detail 'unknown'
239
- * if no such object exists, or failure with detail 'error' if the object was found but
240
- * could not be formatted.
241
- */
242
- getJsonObject(key, context) {
243
- return this.getJsonValue(key, context).onSuccess((jv) => {
244
- if (!(0, common_1.isJsonObject)(jv)) {
245
- return (0, ts_utils_1.failWithDetail)(`${key}: not an object`, 'error');
246
- }
247
- return (0, ts_utils_1.succeedWithDetail)(jv);
248
- });
249
- }
250
- /**
251
- * Gets a JSON value specified by key.
252
- * @param key key of the object to be retrieved
253
- * @param context Optional @see JsonContext used to format the value
254
- * @returns Success with the formatted object if successful. Failure with detail 'unknown'
255
- * if no such object exists, or failure with detail 'error' if the object was found but
256
- * could not be formatted.
257
- */
258
- // eslint-disable-next-line no-use-before-define
259
- getJsonValue(key, context) {
260
- for (const map of this._maps) {
261
- if (map.keyIsInRange(key)) {
262
- const result = map.getJsonValue(key, context);
263
- if (result.isSuccess() || (result.detail === 'error')) {
264
- return result;
265
- }
266
- }
267
- }
268
- return (0, ts_utils_1.failWithDetail)(`${key}: value not found`, 'unknown');
269
- }
270
- }
271
- exports.CompositeJsonMap = CompositeJsonMap;
272
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvblJlZmVyZW5jZU1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9qc29uUmVmZXJlbmNlTWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7OztBQUVILDRDQVV1QjtBQUd2QixxQ0FBK0Q7QUFDL0QsNkNBQTBDO0FBTTFDOzs7R0FHRztBQUNILE1BQWEscUJBQXFCO0lBSTlCLFlBQW1CLE9BQThDLEVBQUUsT0FBNEM7UUFDM0csSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUM7UUFDL0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLGFBQVAsT0FBTyxjQUFQLE9BQU8sR0FBSSxxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQztJQUN6RSxDQUFDO0lBRU0sTUFBTSxDQUFDLG1CQUFtQixDQUFDLEdBQVc7UUFDekMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFTSxPQUFPLENBQUMsR0FBVyxFQUFFLElBQVE7UUFDaEMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU0sUUFBUSxDQUFDLEdBQVcsRUFBRSxJQUFRLEVBQUUsUUFBK0M7UUFDbEYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSxrQkFBTyxFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLGVBQUksRUFBQyxHQUFHLEdBQUcsZUFBZSxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVNLGFBQWEsQ0FBQyxLQUFvQixFQUFFLE9BQThDO1FBQ3JGLE9BQU8sSUFBQSxxQkFBVSxFQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNqQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ3ZELE9BQU8sSUFBQSxrQkFBTyxFQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVNLFdBQVcsQ0FBQyxHQUFtQixFQUFFLE9BQThDO1FBQ2xGLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzlFLE9BQU8sSUFBQSx3QkFBYSxFQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUFsQ0Qsc0RBa0NDO0FBRUQsTUFBYSxlQUFtQixTQUFRLHFCQUF3QjtJQUc1RCxZQUFtQixNQUFjLEVBQUUsT0FBOEM7UUFDN0UsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDekIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxHQUFXLEVBQUUsS0FBUztRQUNqQyxPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsSCxDQUFDO0lBRU0sUUFBUSxDQUFDLEdBQVcsRUFBRSxJQUFRLEVBQUUsT0FBOEM7O1FBQ2pGLHVCQUF1QjtRQUN2QixNQUFNLFNBQVMsR0FBRyxDQUFBLE1BQUEsQ0FBQyxPQUFPLGFBQVAsT0FBTyxjQUFQLE9BQU8sR0FBSSxJQUFJLENBQUMsZUFBZSxDQUFDLDBDQUFFLFNBQVMsTUFBSyxJQUFJLENBQUM7UUFDeEUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUN6QixPQUFPLElBQUEsa0JBQU8sRUFBQyxHQUFHLENBQUMsQ0FBQztTQUN2QjthQUNJLElBQUksU0FBUyxJQUFJLHFCQUFxQixDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2xFLE9BQU8sSUFBQSxrQkFBTyxFQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQzFDO1FBQ0QsT0FBTyxJQUFBLGVBQUksRUFBQyxHQUFHLEdBQUcsZUFBZSxDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNKO0FBdkJELDBDQXVCQztBQUlEOztHQUVHO0FBQ0gsTUFBc0IsaUJBQWlCO0lBS25DLFlBQXNCLE1BQXVCLEVBQUUsT0FBcUIsRUFBRSxTQUFvQztRQUN0RyxNQUFNLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxhQUFULFNBQVMsY0FBVCxTQUFTLEdBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7SUFDNUIsQ0FBQztJQUVTLE1BQU0sQ0FBQyxNQUFNLENBQUksTUFBdUI7UUFDOUMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ3RCLE9BQU8sSUFBQSx3QkFBYSxFQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFhLENBQUMsQ0FBQztTQUNwRDthQUNJLElBQUksQ0FBQyxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsRUFBRTtZQUMvQixPQUFPLElBQUEsc0JBQVcsRUFBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFBLGtCQUFPLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNyRDtRQUNELE9BQU8sSUFBQSxrQkFBTyxFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFlBQVksQ0FBQyxHQUFXO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxHQUFHLENBQUMsR0FBVztRQUNsQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksYUFBYSxDQUFDLEdBQVcsRUFBRSxPQUFxQjtRQUNuRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ3BELElBQUksQ0FBQyxJQUFBLHFCQUFZLEVBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQ25CLE9BQU8sSUFBQSx5QkFBYyxFQUFDLEdBQUcsR0FBRyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUMzRDtZQUNELE9BQU8sSUFBQSw0QkFBaUIsRUFBQyxFQUFFLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FZSjtBQXBFRCw4Q0FvRUM7QUFVRDs7R0FFRztBQUNILE1BQWEsYUFBYyxTQUFRLGlCQUE0QjtJQUczRCxZQUFzQixNQUErQixFQUFFLE9BQXFCLEVBQUUsT0FBOEI7UUFDeEcsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE1BQU0sQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQStCLEVBQUUsT0FBcUIsRUFBRSxPQUE4QjtRQUM3RyxPQUFPLElBQUEsd0JBQWEsRUFBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxnREFBZ0Q7SUFDekMsWUFBWSxDQUFDLEdBQVcsRUFBRSxPQUFxQjtRQUNsRCxPQUFPLEdBQUcsT0FBTyxhQUFQLE9BQU8sY0FBUCxPQUFPLEdBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1IsT0FBTyxJQUFBLHlCQUFjLEVBQUMsR0FBRyxHQUFHLHdCQUF3QixFQUFFLFNBQVMsQ0FBQyxDQUFDO1NBQ3BFO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRVMsTUFBTSxDQUFDLEtBQWdCLEVBQUUsT0FBcUI7UUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDZixNQUFNLE1BQU0sR0FBRyx1QkFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25DLHVEQUF1RDtZQUN2RCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDcEIsT0FBTyxJQUFBLHlCQUFjLEVBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQzthQUNsRDtZQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztTQUMvQjtRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Q0FDSjtBQS9DRCxzQ0ErQ0M7QUFpQkQ7OztHQUdHO0FBQ0gsTUFBYSxlQUFnQixTQUFRLGFBQWE7SUFDOUMsWUFBc0IsTUFBK0IsRUFBRSxPQUFxQixFQUFFLE9BQThCO1FBQ3hHLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFvQk0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxhQUFzQyxFQUFFLE1BQStCLEVBQUUsT0FBcUIsRUFBRSxNQUFtQjtRQUM1SSxPQUFPLElBQUEsd0JBQWEsRUFBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNILENBQUM7SUFFUyxNQUFNLENBQUMsU0FBUyxDQUFDLGFBQXNDO1FBQzdELElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxFQUFFO1lBQ25DLE9BQU8sSUFBSSxlQUFlLENBQUMsYUFBYSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7U0FDbEU7UUFDRCxPQUFPLElBQUksZUFBZSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxhQUFhLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6RyxDQUFDO0NBQ0o7QUFqQ0QsMENBaUNDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBYSxnQkFBZ0I7SUFHekIsWUFBc0IsSUFBd0I7UUFDMUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBd0I7UUFDekMsT0FBTyxJQUFBLHdCQUFhLEVBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFlBQVksQ0FBQyxHQUFXO1FBQzNCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUM7SUFDekUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxHQUFHLENBQUMsR0FBVztRQUNsQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksYUFBYSxDQUFDLEdBQVcsRUFBRSxPQUFxQjtRQUNuRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ3BELElBQUksQ0FBQyxJQUFBLHFCQUFZLEVBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQ25CLE9BQU8sSUFBQSx5QkFBYyxFQUFDLEdBQUcsR0FBRyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUMzRDtZQUNELE9BQU8sSUFBQSw0QkFBaUIsRUFBQyxFQUFFLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsZ0RBQWdEO0lBQ3pDLFlBQVksQ0FBQyxHQUFXLEVBQUUsT0FBcUI7UUFDbEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQzFCLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDdkIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzlDLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxPQUFPLENBQUMsRUFBRTtvQkFDbkQsT0FBTyxNQUFNLENBQUM7aUJBQ2pCO2FBQ0o7U0FDSjtRQUNELE9BQU8sSUFBQSx5QkFBYyxFQUFDLEdBQUcsR0FBRyxtQkFBbUIsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNoRSxDQUFDO0NBQ0o7QUF2RUQsNENBdUVDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB7XG4gICAgRGV0YWlsZWRSZXN1bHQsXG4gICAgUmVzdWx0LFxuICAgIGNhcHR1cmVSZXN1bHQsXG4gICAgZmFpbCxcbiAgICBmYWlsV2l0aERldGFpbCxcbiAgICBtYXBSZXN1bHRzLFxuICAgIHJlY29yZFRvTWFwLFxuICAgIHN1Y2NlZWQsXG4gICAgc3VjY2VlZFdpdGhEZXRhaWwsXG59IGZyb20gJ0BmZ3YvdHMtdXRpbHMnO1xuXG5pbXBvcnQgeyBKc29uQ29udGV4dCwgSnNvblJlZmVyZW5jZU1hcCwgSnNvblJlZmVyZW5jZU1hcEZhaWx1cmVSZWFzb24gfSBmcm9tICcuL2pzb25Db250ZXh0JztcbmltcG9ydCB7IEpzb25PYmplY3QsIEpzb25WYWx1ZSwgaXNKc29uT2JqZWN0IH0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgSnNvbkVkaXRvciB9IGZyb20gJy4vanNvbkVkaXRvcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVmZXJlbmNlTWFwS2V5UG9saWN5VmFsaWRhdGVPcHRpb25zIHtcbiAgICBtYWtlVmFsaWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBvbGljeSBvYmplY3QgcmVzcG9uc2libGUgZm9yIHZhbGlkYXRpbmcgb3IgY29ycmVjdGluZ1xuICoga2V5cyBpbiBhIHJlZmVyZW5jZSBtYXBcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZmVyZW5jZU1hcEtleVBvbGljeTxUPiB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9kZWZhdWx0T3B0aW9ucz86IFJlZmVyZW5jZU1hcEtleVBvbGljeVZhbGlkYXRlT3B0aW9ucztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2lzVmFsaWQ6IChrZXk6IHN0cmluZywgaXRlbT86IFQpID0+IGJvb2xlYW47XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9ucz86IFJlZmVyZW5jZU1hcEtleVBvbGljeVZhbGlkYXRlT3B0aW9ucywgaXNWYWxpZD86IChrZXk6IHN0cmluZywgaXRlbT86IFQpID0+IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdE9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLl9pc1ZhbGlkID0gaXNWYWxpZCA/PyBSZWZlcmVuY2VNYXBLZXlQb2xpY3kuZGVmYXVsdEtleVByZWRpY2F0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlZmF1bHRLZXlQcmVkaWNhdGUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChrZXkubGVuZ3RoID4gMCkgJiYgKCFrZXkuaW5jbHVkZXMoJ3t7JykpICYmICgha2V5LnN0YXJ0c1dpdGgoJz8nKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzVmFsaWQoa2V5OiBzdHJpbmcsIGl0ZW0/OiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1ZhbGlkKGtleSwgaXRlbSk7XG4gICAgfVxuXG4gICAgcHVibGljIHZhbGlkYXRlKGtleTogc3RyaW5nLCBpdGVtPzogVCwgX29wdGlvbnM/OiBSZWZlcmVuY2VNYXBLZXlQb2xpY3lWYWxpZGF0ZU9wdGlvbnMpOiBSZXN1bHQ8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoa2V5LCBpdGVtKSA/IHN1Y2NlZWQoa2V5KSA6IGZhaWwoYCR7a2V5fTogaW52YWxpZCBrZXlgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGVJdGVtcyhpdGVtczogW3N0cmluZywgVF1bXSwgb3B0aW9ucz86IFJlZmVyZW5jZU1hcEtleVBvbGljeVZhbGlkYXRlT3B0aW9ucyk6IFJlc3VsdDxbc3RyaW5nLCBUXVtdPiB7XG4gICAgICAgIHJldHVybiBtYXBSZXN1bHRzKGl0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGUoLi4uaXRlbSwgb3B0aW9ucykub25TdWNjZXNzKCh2YWxpZCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKFt2YWxpZCwgaXRlbVsxXV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGVNYXAobWFwOiBNYXA8c3RyaW5nLCBUPiwgb3B0aW9ucz86IFJlZmVyZW5jZU1hcEtleVBvbGljeVZhbGlkYXRlT3B0aW9ucyk6IFJlc3VsdDxNYXA8c3RyaW5nLCBUPj4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUl0ZW1zKEFycmF5LmZyb20obWFwLmVudHJpZXMoKSksIG9wdGlvbnMpLm9uU3VjY2VzcygodmFsaWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjYXB0dXJlUmVzdWx0KCgpID0+IG5ldyBNYXAodmFsaWQpKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJlZml4S2V5UG9saWN5PFQ+IGV4dGVuZHMgUmVmZXJlbmNlTWFwS2V5UG9saWN5PFQ+IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmc7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJlZml4OiBzdHJpbmcsIG9wdGlvbnM/OiBSZWZlcmVuY2VNYXBLZXlQb2xpY3lWYWxpZGF0ZU9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4O1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1ZhbGlkKGtleTogc3RyaW5nLCBfaXRlbT86IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtleS5zdGFydHNXaXRoKHRoaXMucHJlZml4KSAmJiAoa2V5ICE9PSB0aGlzLnByZWZpeCkgJiYgUmVmZXJlbmNlTWFwS2V5UG9saWN5LmRlZmF1bHRLZXlQcmVkaWNhdGUoa2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGUoa2V5OiBzdHJpbmcsIGl0ZW0/OiBULCBvcHRpb25zPzogUmVmZXJlbmNlTWFwS2V5UG9saWN5VmFsaWRhdGVPcHRpb25zKTogUmVzdWx0PHN0cmluZz4ge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBjb25zdCBtYWtlVmFsaWQgPSAob3B0aW9ucyA/PyB0aGlzLl9kZWZhdWx0T3B0aW9ucyk/Lm1ha2VWYWxpZCA9PT0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuaXNWYWxpZChrZXksIGl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1ha2VWYWxpZCAmJiBSZWZlcmVuY2VNYXBLZXlQb2xpY3kuZGVmYXVsdEtleVByZWRpY2F0ZShrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZChgJHt0aGlzLnByZWZpeH0ke2tleX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChgJHtrZXl9OiBpbnZhbGlkIGtleWApO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgTWFwT3JSZWNvcmQ8VD4gPSBNYXA8c3RyaW5nLCBUPnxSZWNvcmQ8c3RyaW5nLCBUPjtcblxuLyoqXG4gKiBBIFNpbXBsZUpzb25NYXAgcHJlc2VudHMgYSB2aWV3IG9mIGEgc2ltcGxlIG1hcCBvZiBAc2VlIEpzb25WYWx1ZVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2ltcGxlSnNvbk1hcEJhc2U8VD4gaW1wbGVtZW50cyBKc29uUmVmZXJlbmNlTWFwIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2tleVBvbGljeTogUmVmZXJlbmNlTWFwS2V5UG9saWN5PFQ+O1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfdmFsdWVzOiBNYXA8c3RyaW5nLCBUPjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2NvbnRleHQ/OiBKc29uQ29udGV4dDtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcih2YWx1ZXM/OiBNYXBPclJlY29yZDxUPiwgY29udGV4dD86IEpzb25Db250ZXh0LCBrZXlQb2xpY3k/OiBSZWZlcmVuY2VNYXBLZXlQb2xpY3k8VD4pIHtcbiAgICAgICAgdmFsdWVzID0gU2ltcGxlSnNvbk1hcEJhc2UuX3RvTWFwKHZhbHVlcykub3JUaHJvdygpO1xuICAgICAgICB0aGlzLl9rZXlQb2xpY3kgPSBrZXlQb2xpY3kgPz8gbmV3IFJlZmVyZW5jZU1hcEtleVBvbGljeSgpO1xuICAgICAgICB0aGlzLl92YWx1ZXMgPSB0aGlzLl9rZXlQb2xpY3kudmFsaWRhdGVNYXAodmFsdWVzKS5vclRocm93KCk7XG4gICAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzdGF0aWMgX3RvTWFwPFQ+KHZhbHVlcz86IE1hcE9yUmVjb3JkPFQ+KTogUmVzdWx0PE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIGlmICh2YWx1ZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhcHR1cmVSZXN1bHQoKCkgPT4gbmV3IE1hcDxzdHJpbmcsIFQ+KCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEodmFsdWVzIGluc3RhbmNlb2YgTWFwKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlY29yZFRvTWFwKHZhbHVlcywgKF9rLCB2KSA9PiBzdWNjZWVkKHYpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2VlZCh2YWx1ZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZSBpZiBhIGtleSBtaWdodCBiZSB2YWxpZCBmb3IgdGhpcyBtYXAgYnV0IGRvZXMgbm90IGRldGVybWluZSBpZiBrZXkgYWN0dWFsbHlcbiAgICAgKiBleGlzdHMuIEFsbG93cyBrZXkgcmFuZ2UgdG8gYmUgY29uc3RyYWluZWQuXG4gICAgICogQHBhcmFtIGtleSBrZXkgdG8gYmUgdGVzdGVkXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUga2V5IGlzIGluIHRoZSB2YWxpZCByYW5nZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBrZXlJc0luUmFuZ2Uoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2tleVBvbGljeS5pc1ZhbGlkKGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhbiBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBhY3R1YWxseSBleGlzdHMgaW4gdGhlIG1hcC5cbiAgICAgKiBAcGFyYW0ga2V5IGtleSB0byBiZSB0ZXN0ZWRcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGFuIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlcy5oYXMoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgSlNPTiBvYmplY3Qgc3BlY2lmaWVkIGJ5IGtleS5cbiAgICAgKiBAcGFyYW0ga2V5IGtleSBvZiB0aGUgb2JqZWN0IHRvIGJlIHJldHJpZXZlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IG9wdGlvbmFsIEBzZWUgSnNvbkNvbnRleHQgdXNlZCB0byBmb3JtYXQgdGhlIG9iamVjdFxuICAgICAqIEByZXR1cm5zIFN1Y2Nlc3Mgd2l0aCB0aGUgZm9ybWF0dGVkIG9iamVjdCBpZiBzdWNjZXNzZnVsLiBGYWlsdXJlIHdpdGggZGV0YWlsICd1bmtub3duJ1xuICAgICAqIGlmIG5vIHN1Y2ggb2JqZWN0IGV4aXN0cywgb3IgZmFpbHVyZSB3aXRoIGRldGFpbCAnZXJyb3InIGlmIHRoZSBvYmplY3Qgd2FzIGZvdW5kIGJ1dFxuICAgICAqIGNvdWxkIG5vdCBiZSBmb3JtYXR0ZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldEpzb25PYmplY3Qoa2V5OiBzdHJpbmcsIGNvbnRleHQ/OiBKc29uQ29udGV4dCk6IERldGFpbGVkUmVzdWx0PEpzb25PYmplY3QsIEpzb25SZWZlcmVuY2VNYXBGYWlsdXJlUmVhc29uPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEpzb25WYWx1ZShrZXksIGNvbnRleHQpLm9uU3VjY2VzcygoanYpID0+IHtcbiAgICAgICAgICAgIGlmICghaXNKc29uT2JqZWN0KGp2KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWlsV2l0aERldGFpbChgJHtrZXl9OiBub3QgYW4gb2JqZWN0YCwgJ2Vycm9yJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZFdpdGhEZXRhaWwoanYpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgSlNPTiB2YWx1ZSBzcGVjaWZpZWQgYnkga2V5LlxuICAgICAqIEBwYXJhbSBrZXkga2V5IG9mIHRoZSBvYmplY3QgdG8gYmUgcmV0cmlldmVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgT3B0aW9uYWwgQHNlZSBKc29uQ29udGV4dCB1c2VkIHRvIGZvcm1hdCB0aGUgdmFsdWVcbiAgICAgKiBAcmV0dXJucyBTdWNjZXNzIHdpdGggdGhlIGZvcm1hdHRlZCBvYmplY3QgaWYgc3VjY2Vzc2Z1bC4gRmFpbHVyZSB3aXRoIGRldGFpbCAndW5rbm93bidcbiAgICAgKiBpZiBubyBzdWNoIG9iamVjdCBleGlzdHMsIG9yIGZhaWx1cmUgd2l0aCBkZXRhaWwgJ2Vycm9yJyBpZiB0aGUgb2JqZWN0IHdhcyBmb3VuZCBidXRcbiAgICAgKiBjb3VsZCBub3QgYmUgZm9ybWF0dGVkLlxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRKc29uVmFsdWUoa2V5OiBzdHJpbmcsIGNvbnRleHQ/OiBKc29uQ29udGV4dCk6IERldGFpbGVkUmVzdWx0PEpzb25WYWx1ZSwgSnNvblJlZmVyZW5jZU1hcEZhaWx1cmVSZWFzb24+O1xufVxuXG4vKipcbiAqIEluaXRpYWxpemF0aW9uIG9wdGlvbnMgZm9yIGEgQHNlZSBTaW1wbGVKc29uTWFwXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2ltcGxlSnNvbk1hcE9wdGlvbnMge1xuICAgIGtleVBvbGljeT86IFJlZmVyZW5jZU1hcEtleVBvbGljeTxKc29uVmFsdWU+LFxuICAgIGVkaXRvcj86IEpzb25FZGl0b3IsXG59XG5cbi8qKlxuICogQSBTaW1wbGVKc29uTWFwIHByZXNlbnRzIGEgdmlldyBvZiBhIHNpbXBsZSBtYXAgb2YgQHNlZSBKc29uVmFsdWVcbiAqL1xuZXhwb3J0IGNsYXNzIFNpbXBsZUpzb25NYXAgZXh0ZW5kcyBTaW1wbGVKc29uTWFwQmFzZTxKc29uVmFsdWU+IHtcbiAgICBwcm90ZWN0ZWQgX2VkaXRvcj86IEpzb25FZGl0b3I7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IodmFsdWVzPzogTWFwT3JSZWNvcmQ8SnNvblZhbHVlPiwgY29udGV4dD86IEpzb25Db250ZXh0LCBvcHRpb25zPzogU2ltcGxlSnNvbk1hcE9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIodmFsdWVzLCBjb250ZXh0LCBvcHRpb25zPy5rZXlQb2xpY3kpO1xuICAgICAgICB0aGlzLl9lZGl0b3IgPSBvcHRpb25zPy5lZGl0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBAc2VlIFNpbXBsZUpzb25NYXAgZnJvbSB0aGUgc3VwcGxpZWQgb2JqZWN0c1xuICAgICAqIEBwYXJhbSB2YWx1ZXMgQSBzdHJpbmcta2V5ZWQgTWFwIG9yIFJlY29yZCBvZiB0aGUgQHNlZSBKc29uT2JqZWN0IHRvIGJlIHJldHVybmVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgT3B0aW9uYWwgQHNlZSBKc29uQ29udGV4dCB1c2VkIHRvIGZvcm1hdCByZXR1cm5lZCB2YWx1ZXNcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBAc2VlIFNpbXBsZUpzb25NYXBPcHRpb25zIGZvciBpbml0aWFsaXphdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlU2ltcGxlKHZhbHVlcz86IE1hcE9yUmVjb3JkPEpzb25WYWx1ZT4sIGNvbnRleHQ/OiBKc29uQ29udGV4dCwgb3B0aW9ucz86IFNpbXBsZUpzb25NYXBPcHRpb25zKTogUmVzdWx0PFNpbXBsZUpzb25NYXA+IHtcbiAgICAgICAgcmV0dXJuIGNhcHR1cmVSZXN1bHQoKCkgPT4gbmV3IFNpbXBsZUpzb25NYXAodmFsdWVzLCBjb250ZXh0LCBvcHRpb25zKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIEpTT04gdmFsdWUgc3BlY2lmaWVkIGJ5IGtleS5cbiAgICAgKiBAcGFyYW0ga2V5IGtleSBvZiB0aGUgb2JqZWN0IHRvIGJlIHJldHJpZXZlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IE9wdGlvbmFsIEBzZWUgSnNvbkNvbnRleHQgdXNlZCB0byBmb3JtYXQgdGhlIHZhbHVlXG4gICAgICogQHJldHVybnMgU3VjY2VzcyB3aXRoIHRoZSBmb3JtYXR0ZWQgb2JqZWN0IGlmIHN1Y2Nlc3NmdWwuIEZhaWx1cmUgd2l0aCBkZXRhaWwgJ3Vua25vd24nXG4gICAgICogaWYgbm8gc3VjaCBvYmplY3QgZXhpc3RzLCBvciBmYWlsdXJlIHdpdGggZGV0YWlsICdlcnJvcicgaWYgdGhlIG9iamVjdCB3YXMgZm91bmQgYnV0XG4gICAgICogY291bGQgbm90IGJlIGZvcm1hdHRlZC5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICBwdWJsaWMgZ2V0SnNvblZhbHVlKGtleTogc3RyaW5nLCBjb250ZXh0PzogSnNvbkNvbnRleHQpOiBEZXRhaWxlZFJlc3VsdDxKc29uVmFsdWUsIEpzb25SZWZlcmVuY2VNYXBGYWlsdXJlUmVhc29uPiB7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0ID8/IHRoaXMuX2NvbnRleHQ7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChrZXkpO1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbFdpdGhEZXRhaWwoYCR7a2V5fTogSlNPTiB2YWx1ZSBub3QgZm91bmRgLCAndW5rbm93bicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jbG9uZSh2YWx1ZSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jbG9uZSh2YWx1ZTogSnNvblZhbHVlLCBjb250ZXh0PzogSnNvbkNvbnRleHQpOiBEZXRhaWxlZFJlc3VsdDxKc29uVmFsdWUsIEpzb25SZWZlcmVuY2VNYXBGYWlsdXJlUmVhc29uPiB7XG4gICAgICAgIGlmICghdGhpcy5fZWRpdG9yKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBKc29uRWRpdG9yLmNyZWF0ZSgpO1xuICAgICAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHQ6IG5lYXJseSBpbXBvc3NpYmxlIHRvIHJlcHJvZHVjZVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWlsV2l0aERldGFpbChyZXN1bHQubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9lZGl0b3IgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkaXRvci5jbG9uZSh2YWx1ZSwgY29udGV4dCkud2l0aEZhaWx1cmVEZXRhaWwoJ2Vycm9yJyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEluaXRpYWxpemF0aW9uIG9wdGlvbnMgZm9yIGEgUHJlZml4ZWRKc29uTWFwXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5UHJlZml4T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHByZWZpeCBzaG91bGQgYmUgYWRkZWQgYXV0b21hdGljYWxseSBhcyBuZWVkZWQgKGRlZmF1bHQgdHJ1ZSlcbiAgICAgKi9cbiAgICBhZGRQcmVmaXg/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHByZWZpeCB0byBiZSBlbmZvcmNlZFxuICAgICAqL1xuICAgIHByZWZpeDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgUHJlZml4ZWRKc29uTWFwIGVuZm9yY2VzIGEgc3VwcGxpZWQgcHJlZml4IGZvciBhbGwgY29udGFpbmVkIHZhbHVlcywgb3B0aW9uYWxseVxuICogYWRkaW5nIHRoZSBwcmVmaXggYXMgbmVjZXNzYXJ5IChkZWZhdWx0IHRydWUpLlxuICovXG5leHBvcnQgY2xhc3MgUHJlZml4ZWRKc29uTWFwIGV4dGVuZHMgU2ltcGxlSnNvbk1hcCB7XG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHZhbHVlcz86IE1hcE9yUmVjb3JkPEpzb25WYWx1ZT4sIGNvbnRleHQ/OiBKc29uQ29udGV4dCwgb3B0aW9ucz86IFNpbXBsZUpzb25NYXBPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKHZhbHVlcywgY29udGV4dCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBAc2VlIFByZWZpeGVkSnNvbk1hcCBmcm9tIHRoZSBzdXBwbGllZCB2YWx1ZXNcbiAgICAgKiBAcGFyYW0gcHJlZml4IEEgc3RyaW5nIHByZWZpeCB0byBiZSBlbmZvcmNlZCBmb3IgYW5kIGFkZGVkIHRvIGtleSBuYW1lcyBhcyBuZWNlc3NhcnlcbiAgICAgKiBAcGFyYW0gdmFsdWVzIEEgc3RyaW5nLWtleWVkIE1hcCBvciBSZWNvcmQgb2YgdGhlIEBzZWUgSnNvblZhbHVlIHRvIGJlIHJldHVybmVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgT3B0aW9uYWwgQHNlZSBKc29uQ29udGV4dCB1c2VkIHRvIGZvcm1hdCByZXR1cm5lZCB2YWx1ZXNcbiAgICAgKiBAcGFyYW0gZWRpdG9yIE9wdGlvbmFsIEBzZWUgSnNvbkVkaXRvciB1c2VkIHRvIGZvcm1hdCByZXR1cm5lZCB2YWx1ZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVByZWZpeGVkKHByZWZpeDogc3RyaW5nLCB2YWx1ZXM/OiBNYXBPclJlY29yZDxKc29uVmFsdWU+LCBjb250ZXh0PzogSnNvbkNvbnRleHQsIGVkaXRvcj86IEpzb25FZGl0b3IpOiBSZXN1bHQ8UHJlZml4ZWRKc29uTWFwPjtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQHNlZSBQcmVmaXhlZEpzb25NYXAgZnJvbSB0aGUgc3VwcGxpZWQgdmFsdWVzXG4gICAgICogQHBhcmFtIHByZWZpeE9wdGlvbnMgQSBLZXlQcmVmaXhPcHRpb25zIGluZGljYXRpbmcgdGhlIHByZWZpeCB0byBlbmZvcmNlIGFuZCB3aGV0aGVyIHRoYXQgcHJlZml4IHNob3VsZFxuICAgICAqIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkgaWYgbmVjZXNzYXJ5IChkZWZhdWx0IHRydWUpXG4gICAgICogQHBhcmFtIHZhbHVlcyBBIHN0cmluZy1rZXllZCBNYXAgb3IgcmVjb3JkIG9mIHRoZSBAc2VlIEpzb25WYWx1ZSB0byBiZSByZXR1cm5lZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IE9wdGlvbmFsIEBzZWUgSnNvbkNvbnRleHQgdXNlZCB0byBmb3JtYXQgcmV0dXJuZWQgdmFsdWVzXG4gICAgICogQHBhcmFtIGVkaXRvciBPcHRpb25hbCBAc2VlIEpzb25FZGl0b3IgdXNlZCB0byBmb3JtYXQgcmV0dXJuZWQgdmFsdWVzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVQcmVmaXhlZChwcmVmaXhPcHRpb25zOiBLZXlQcmVmaXhPcHRpb25zLCB2YWx1ZXM/OiBNYXBPclJlY29yZDxKc29uVmFsdWU+LCBjb250ZXh0PzogSnNvbkNvbnRleHQsIGVkaXRvcj86IEpzb25FZGl0b3IpOiBSZXN1bHQ8UHJlZml4ZWRKc29uTWFwPjtcbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVByZWZpeGVkKHByZWZpeE9wdGlvbnM6IHN0cmluZ3xLZXlQcmVmaXhPcHRpb25zLCB2YWx1ZXM/OiBNYXBPclJlY29yZDxKc29uVmFsdWU+LCBjb250ZXh0PzogSnNvbkNvbnRleHQsIGVkaXRvcj86IEpzb25FZGl0b3IpOiBSZXN1bHQ8UHJlZml4ZWRKc29uTWFwPiB7XG4gICAgICAgIHJldHVybiBjYXB0dXJlUmVzdWx0KCgpID0+IG5ldyBQcmVmaXhlZEpzb25NYXAodmFsdWVzLCBjb250ZXh0LCB7IGtleVBvbGljeTogdGhpcy5fdG9Qb2xpY3kocHJlZml4T3B0aW9ucyksIGVkaXRvciB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfdG9Qb2xpY3kocHJlZml4T3B0aW9uczogc3RyaW5nfEtleVByZWZpeE9wdGlvbnMpOiBSZWZlcmVuY2VNYXBLZXlQb2xpY3k8SnNvblZhbHVlPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJlZml4T3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJlZml4S2V5UG9saWN5KHByZWZpeE9wdGlvbnMsIHsgbWFrZVZhbGlkOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJlZml4S2V5UG9saWN5KHByZWZpeE9wdGlvbnMucHJlZml4LCB7IG1ha2VWYWxpZDogKHByZWZpeE9wdGlvbnMuYWRkUHJlZml4ICE9PSBmYWxzZSkgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgQ29tcG9zaXRlSnNvbk1hcCBwcmVzZW50cyBhIGNvbXBvc2VkIHZpZXcgb2Ygb25lIG9yIG1vcmUgb3RoZXJcbiAqIEpzb25SZWZlcmVuY2VNYXBzLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRlSnNvbk1hcCBpbXBsZW1lbnRzIEpzb25SZWZlcmVuY2VNYXAge1xuICAgIHByb3RlY3RlZCBfbWFwczogSnNvblJlZmVyZW5jZU1hcFtdO1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKG1hcHM6IEpzb25SZWZlcmVuY2VNYXBbXSkge1xuICAgICAgICB0aGlzLl9tYXBzID0gbWFwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEBzZWUgQ29tcG9zaXRlSnNvbk1hcCBmcm9tIHRoZSBzdXBwbGllZCBtYXBzXG4gICAgICogQHBhcmFtIG1hcHMgb25lIG9yIG1vcmUgb2JqZWN0IG1hcHMgdG8gYmUgY29tcG9zZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShtYXBzOiBKc29uUmVmZXJlbmNlTWFwW10pOiBSZXN1bHQ8Q29tcG9zaXRlSnNvbk1hcD4ge1xuICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBuZXcgQ29tcG9zaXRlSnNvbk1hcChtYXBzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIGlmIGEga2V5IG1pZ2h0IGJlIHZhbGlkIGZvciB0aGlzIG1hcCBidXQgZG9lcyBub3QgZGV0ZXJtaW5lXG4gICAgICogaWYga2V5IGFjdHVhbGx5IGV4aXN0cy4gQWxsb3dzIGtleSByYW5nZSB0byBiZSBjb25zdHJhaW5lZC5cbiAgICAgKiBAcGFyYW0ga2V5IGtleSB0byBiZSB0ZXN0ZWRcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBrZXkgaXMgaW4gdGhlIHZhbGlkIHJhbmdlLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIGtleUlzSW5SYW5nZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFwcy5maW5kKChtYXApID0+IG1hcC5rZXlJc0luUmFuZ2Uoa2V5KSkgIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIGFuIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGFjdHVhbGx5IGV4aXN0cyBpbiB0aGUgbWFwLlxuICAgICAqIEBwYXJhbSBrZXkga2V5IHRvIGJlIHRlc3RlZFxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgYW4gb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBrZXkgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFwcy5maW5kKChtYXApID0+IG1hcC5oYXMoa2V5KSkgIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgSlNPTiBvYmplY3Qgc3BlY2lmaWVkIGJ5IGtleS5cbiAgICAgKiBAcGFyYW0ga2V5IGtleSBvZiB0aGUgb2JqZWN0IHRvIGJlIHJldHJpZXZlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IG9wdGlvbmFsIEBzZWUgSnNvbkNvbnRleHQgdXNlZCB0byBmb3JtYXQgdGhlIG9iamVjdFxuICAgICAqIEByZXR1cm5zIFN1Y2Nlc3Mgd2l0aCB0aGUgZm9ybWF0dGVkIG9iamVjdCBpZiBzdWNjZXNzZnVsLiBGYWlsdXJlIHdpdGggZGV0YWlsICd1bmtub3duJ1xuICAgICAqIGlmIG5vIHN1Y2ggb2JqZWN0IGV4aXN0cywgb3IgZmFpbHVyZSB3aXRoIGRldGFpbCAnZXJyb3InIGlmIHRoZSBvYmplY3Qgd2FzIGZvdW5kIGJ1dFxuICAgICAqIGNvdWxkIG5vdCBiZSBmb3JtYXR0ZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldEpzb25PYmplY3Qoa2V5OiBzdHJpbmcsIGNvbnRleHQ/OiBKc29uQ29udGV4dCk6IERldGFpbGVkUmVzdWx0PEpzb25PYmplY3QsIEpzb25SZWZlcmVuY2VNYXBGYWlsdXJlUmVhc29uPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEpzb25WYWx1ZShrZXksIGNvbnRleHQpLm9uU3VjY2VzcygoanYpID0+IHtcbiAgICAgICAgICAgIGlmICghaXNKc29uT2JqZWN0KGp2KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWlsV2l0aERldGFpbChgJHtrZXl9OiBub3QgYW4gb2JqZWN0YCwgJ2Vycm9yJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZFdpdGhEZXRhaWwoanYpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgSlNPTiB2YWx1ZSBzcGVjaWZpZWQgYnkga2V5LlxuICAgICAqIEBwYXJhbSBrZXkga2V5IG9mIHRoZSBvYmplY3QgdG8gYmUgcmV0cmlldmVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgT3B0aW9uYWwgQHNlZSBKc29uQ29udGV4dCB1c2VkIHRvIGZvcm1hdCB0aGUgdmFsdWVcbiAgICAgKiBAcmV0dXJucyBTdWNjZXNzIHdpdGggdGhlIGZvcm1hdHRlZCBvYmplY3QgaWYgc3VjY2Vzc2Z1bC4gRmFpbHVyZSB3aXRoIGRldGFpbCAndW5rbm93bidcbiAgICAgKiBpZiBubyBzdWNoIG9iamVjdCBleGlzdHMsIG9yIGZhaWx1cmUgd2l0aCBkZXRhaWwgJ2Vycm9yJyBpZiB0aGUgb2JqZWN0IHdhcyBmb3VuZCBidXRcbiAgICAgKiBjb3VsZCBub3QgYmUgZm9ybWF0dGVkLlxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIHB1YmxpYyBnZXRKc29uVmFsdWUoa2V5OiBzdHJpbmcsIGNvbnRleHQ/OiBKc29uQ29udGV4dCk6IERldGFpbGVkUmVzdWx0PEpzb25WYWx1ZSwgSnNvblJlZmVyZW5jZU1hcEZhaWx1cmVSZWFzb24+IHtcbiAgICAgICAgZm9yIChjb25zdCBtYXAgb2YgdGhpcy5fbWFwcykge1xuICAgICAgICAgICAgaWYgKG1hcC5rZXlJc0luUmFuZ2Uoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG1hcC5nZXRKc29uVmFsdWUoa2V5LCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpIHx8IChyZXN1bHQuZGV0YWlsID09PSAnZXJyb3InKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbFdpdGhEZXRhaWwoYCR7a2V5fTogdmFsdWUgbm90IGZvdW5kYCwgJ3Vua25vd24nKTtcbiAgICB9XG59XG4iXX0=