@aws-cdk/aws-medialive-alpha 2.268.0-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 (70) hide show
  1. package/.jsii +60888 -0
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/.warnings.jsii.js +524 -0
  4. package/LICENSE +201 -0
  5. package/NOTICE +2 -0
  6. package/README.md +1297 -0
  7. package/grants.json +27 -0
  8. package/lib/audio-codec-settings.d.ts +901 -0
  9. package/lib/audio-codec-settings.js +1098 -0
  10. package/lib/audio-selector.d.ts +170 -0
  11. package/lib/audio-selector.js +306 -0
  12. package/lib/avail-settings.d.ts +231 -0
  13. package/lib/avail-settings.js +226 -0
  14. package/lib/caption-selector.d.ts +234 -0
  15. package/lib/caption-selector.js +413 -0
  16. package/lib/caption-settings.d.ts +349 -0
  17. package/lib/caption-settings.js +482 -0
  18. package/lib/channel-features.d.ts +106 -0
  19. package/lib/channel-features.js +85 -0
  20. package/lib/channel-placement-group.d.ts +73 -0
  21. package/lib/channel-placement-group.js +132 -0
  22. package/lib/channel.d.ts +687 -0
  23. package/lib/channel.js +1096 -0
  24. package/lib/cluster.d.ts +129 -0
  25. package/lib/cluster.js +158 -0
  26. package/lib/color-correction.d.ts +39 -0
  27. package/lib/color-correction.js +29 -0
  28. package/lib/destinations.d.ts +242 -0
  29. package/lib/destinations.js +455 -0
  30. package/lib/encode-configuration.d.ts +615 -0
  31. package/lib/encode-configuration.js +629 -0
  32. package/lib/enums.d.ts +698 -0
  33. package/lib/enums.js +1045 -0
  34. package/lib/file-location.d.ts +65 -0
  35. package/lib/file-location.js +150 -0
  36. package/lib/framerate.d.ts +31 -0
  37. package/lib/framerate.js +71 -0
  38. package/lib/index.d.ts +26 -0
  39. package/lib/index.js +43 -0
  40. package/lib/input-attachment.d.ts +319 -0
  41. package/lib/input-attachment.js +228 -0
  42. package/lib/input-security-group.d.ts +51 -0
  43. package/lib/input-security-group.js +123 -0
  44. package/lib/input-specification.d.ts +111 -0
  45. package/lib/input-specification.js +181 -0
  46. package/lib/input.d.ts +505 -0
  47. package/lib/input.js +803 -0
  48. package/lib/m2ts-settings.d.ts +421 -0
  49. package/lib/m2ts-settings.js +469 -0
  50. package/lib/m3u8-settings.d.ts +272 -0
  51. package/lib/m3u8-settings.js +304 -0
  52. package/lib/medialive-grants.generated.d.ts +30 -0
  53. package/lib/medialive-grants.generated.js +92 -0
  54. package/lib/network.d.ts +83 -0
  55. package/lib/network.js +132 -0
  56. package/lib/output-group.d.ts +924 -0
  57. package/lib/output-group.js +941 -0
  58. package/lib/outputs.d.ts +304 -0
  59. package/lib/outputs.js +598 -0
  60. package/lib/sdi-source.d.ts +124 -0
  61. package/lib/sdi-source.js +180 -0
  62. package/lib/shared.d.ts +44 -0
  63. package/lib/shared.js +146 -0
  64. package/lib/video-codec-settings.d.ts +1500 -0
  65. package/lib/video-codec-settings.js +1722 -0
  66. package/lib/video-selection.d.ts +92 -0
  67. package/lib/video-selection.js +95 -0
  68. package/package.json +135 -0
  69. package/rosetta/_generated.ts-fixture +6 -0
  70. package/rosetta/default.ts-fixture +21 -0
@@ -0,0 +1,413 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CaptionSelector = exports.CaptionSynchronizationMode = exports.Scte20Detection = exports.Convert608To708 = exports.OcrLanguage = void 0;
4
+ const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
7
+ const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
8
+ /**
9
+ * The OCR language to use when converting an image-based caption source to text.
10
+ */
11
+ class OcrLanguage {
12
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.OcrLanguage", version: "2.268.0-alpha.0" };
13
+ /** German */
14
+ static DEU = new OcrLanguage('DEU');
15
+ /** English */
16
+ static ENG = new OcrLanguage('ENG');
17
+ /** French */
18
+ static FRA = new OcrLanguage('FRA');
19
+ /** Dutch */
20
+ static NLD = new OcrLanguage('NLD');
21
+ /** Portuguese */
22
+ static POR = new OcrLanguage('POR');
23
+ /** Spanish */
24
+ static SPA = new OcrLanguage('SPA');
25
+ /** A value not yet modelled by AWS CDK. */
26
+ static of(value) {
27
+ return new OcrLanguage(value);
28
+ }
29
+ /** The underlying string value passed to CloudFormation. */
30
+ value;
31
+ constructor(value) {
32
+ this.value = value;
33
+ }
34
+ }
35
+ exports.OcrLanguage = OcrLanguage;
36
+ /**
37
+ * Whether to upconvert 608 captions to 708.
38
+ */
39
+ class Convert608To708 {
40
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.Convert608To708", version: "2.268.0-alpha.0" };
41
+ /** Pass through 608 captions without upconverting. */
42
+ static DISABLED = new Convert608To708('DISABLED');
43
+ /** Upconvert 608 captions to 708 (608 data is also passed through). */
44
+ static UPCONVERT = new Convert608To708('UPCONVERT');
45
+ /** A value not yet modelled by AWS CDK. */
46
+ static of(value) {
47
+ return new Convert608To708(value);
48
+ }
49
+ /** The underlying string value passed to CloudFormation. */
50
+ value;
51
+ constructor(value) {
52
+ this.value = value;
53
+ }
54
+ }
55
+ exports.Convert608To708 = Convert608To708;
56
+ /**
57
+ * SCTE-20 detection mode for an embedded caption source.
58
+ */
59
+ class Scte20Detection {
60
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.Scte20Detection", version: "2.268.0-alpha.0" };
61
+ /** Handle streams with intermittent or non-aligned SCTE-20 and embedded captions. */
62
+ static AUTO = new Scte20Detection('AUTO');
63
+ /** Do not detect SCTE-20 captions. */
64
+ static OFF = new Scte20Detection('OFF');
65
+ /** A value not yet modelled by AWS CDK. */
66
+ static of(value) {
67
+ return new Scte20Detection(value);
68
+ }
69
+ /** The underlying string value passed to CloudFormation. */
70
+ value;
71
+ constructor(value) {
72
+ this.value = value;
73
+ }
74
+ }
75
+ exports.Scte20Detection = Scte20Detection;
76
+ /**
77
+ * Controls whether MediaLive delays video to synchronize captions with audio and video output.
78
+ */
79
+ class CaptionSynchronizationMode {
80
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.CaptionSynchronizationMode", version: "2.268.0-alpha.0" };
81
+ /** MediaLive does not delay video for caption alignment. */
82
+ static NO_VIDEO_DELAY = new CaptionSynchronizationMode('NO_VIDEO_DELAY');
83
+ /** MediaLive delays video to ensure captions are synchronized with audio and video. */
84
+ static VIDEO_ALIGNED_CAPTIONS = new CaptionSynchronizationMode('VIDEO_ALIGNED_CAPTIONS');
85
+ /** A value not yet modelled by AWS CDK. */
86
+ static of(value) {
87
+ return new CaptionSynchronizationMode(value);
88
+ }
89
+ /** The underlying string value passed to CloudFormation. */
90
+ value;
91
+ constructor(value) {
92
+ this.value = value;
93
+ }
94
+ }
95
+ exports.CaptionSynchronizationMode = CaptionSynchronizationMode;
96
+ /**
97
+ * A caption selector that identifies which captions to extract from the input. Create with
98
+ * the static factory methods — one per caption source format.
99
+ */
100
+ class CaptionSelector {
101
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.CaptionSelector", version: "2.268.0-alpha.0" };
102
+ /**
103
+ * Select captions by language code (no specific source format).
104
+ */
105
+ static byLanguage(name, languageCode) {
106
+ return new LanguageCaptionSelector(name, languageCode);
107
+ }
108
+ /**
109
+ * Select embedded (CEA-608/708) captions.
110
+ */
111
+ static embedded(name, options = {}) {
112
+ try {
113
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_EmbeddedCaptionSourceOptions(options);
114
+ }
115
+ catch (error) {
116
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
117
+ Error.captureStackTrace(error, this.embedded);
118
+ }
119
+ throw error;
120
+ }
121
+ return new EmbeddedCaptionSelector(name, options);
122
+ }
123
+ /**
124
+ * Select ancillary captions.
125
+ */
126
+ static ancillary(name, options = {}) {
127
+ try {
128
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_AncillaryCaptionSourceOptions(options);
129
+ }
130
+ catch (error) {
131
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
132
+ Error.captureStackTrace(error, this.ancillary);
133
+ }
134
+ throw error;
135
+ }
136
+ return new AncillaryCaptionSelector(name, options);
137
+ }
138
+ /**
139
+ * Select ARIB captions.
140
+ */
141
+ static arib(name) {
142
+ return new AribCaptionSelector(name);
143
+ }
144
+ /**
145
+ * Select DVB-Sub (image-based) captions.
146
+ */
147
+ static dvbSub(name, options = {}) {
148
+ try {
149
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_DvbSubCaptionSourceOptions(options);
150
+ }
151
+ catch (error) {
152
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
153
+ Error.captureStackTrace(error, this.dvbSub);
154
+ }
155
+ throw error;
156
+ }
157
+ return new DvbSubCaptionSelector(name, options);
158
+ }
159
+ /**
160
+ * Select SCTE-20 captions.
161
+ */
162
+ static scte20(name, options = {}) {
163
+ try {
164
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_Scte20CaptionSourceOptions(options);
165
+ }
166
+ catch (error) {
167
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
168
+ Error.captureStackTrace(error, this.scte20);
169
+ }
170
+ throw error;
171
+ }
172
+ return new Scte20CaptionSelector(name, options);
173
+ }
174
+ /**
175
+ * Select SCTE-27 (image-based) captions.
176
+ */
177
+ static scte27(name, options = {}) {
178
+ try {
179
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_Scte27CaptionSourceOptions(options);
180
+ }
181
+ catch (error) {
182
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
183
+ Error.captureStackTrace(error, this.scte27);
184
+ }
185
+ throw error;
186
+ }
187
+ return new Scte27CaptionSelector(name, options);
188
+ }
189
+ /**
190
+ * Select Teletext captions.
191
+ */
192
+ static teletext(name, options = {}) {
193
+ try {
194
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_TeletextCaptionSourceOptions(options);
195
+ }
196
+ catch (error) {
197
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
198
+ Error.captureStackTrace(error, this.teletext);
199
+ }
200
+ throw error;
201
+ }
202
+ return new TeletextCaptionSelector(name, options);
203
+ }
204
+ /**
205
+ * Select smart subtitles generated by Elemental Inference.
206
+ */
207
+ static smartSubtitle(name, options = {}) {
208
+ try {
209
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_SmartSubtitleSourceOptions(options);
210
+ }
211
+ catch (error) {
212
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
213
+ Error.captureStackTrace(error, this.smartSubtitle);
214
+ }
215
+ throw error;
216
+ }
217
+ return new SmartSubtitleCaptionSelector(name, options);
218
+ }
219
+ /**
220
+ * The name of this caption selector, used to associate it with caption outputs. Unique
221
+ * within a channel.
222
+ */
223
+ name;
224
+ constructor(name) {
225
+ this.name = name;
226
+ }
227
+ }
228
+ exports.CaptionSelector = CaptionSelector;
229
+ /** @internal */
230
+ class LanguageCaptionSelector extends CaptionSelector {
231
+ languageCode;
232
+ constructor(name, languageCode) {
233
+ super(name);
234
+ this.languageCode = languageCode;
235
+ }
236
+ _bind() {
237
+ return { name: this.name, languageCode: this.languageCode };
238
+ }
239
+ }
240
+ /** @internal */
241
+ class EmbeddedCaptionSelector extends CaptionSelector {
242
+ options;
243
+ constructor(name, options) {
244
+ super(name);
245
+ this.options = options;
246
+ if (options.source608ChannelNumber !== undefined && !aws_cdk_lib_1.Token.isUnresolved(options.source608ChannelNumber)
247
+ && (options.source608ChannelNumber < 1 || options.source608ChannelNumber > 4)) {
248
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `Source608ChannelNumberRange`, `source608ChannelNumber must be between 1 and 4, got ${options.source608ChannelNumber}`);
249
+ }
250
+ }
251
+ _bind() {
252
+ const hasSettings = this.options.convert608To708 !== undefined
253
+ || this.options.scte20Detection !== undefined
254
+ || this.options.source608ChannelNumber !== undefined;
255
+ return {
256
+ name: this.name,
257
+ selectorSettings: hasSettings ? {
258
+ embeddedSourceSettings: {
259
+ convert608To708: (this.options.convert608To708 ?? Convert608To708.DISABLED).value,
260
+ scte20Detection: (this.options.scte20Detection ?? Scte20Detection.OFF).value,
261
+ source608ChannelNumber: this.options.source608ChannelNumber,
262
+ },
263
+ } : undefined,
264
+ };
265
+ }
266
+ }
267
+ /** @internal */
268
+ class AncillaryCaptionSelector extends CaptionSelector {
269
+ options;
270
+ constructor(name, options) {
271
+ super(name);
272
+ this.options = options;
273
+ if (options.sourceChannelNumber !== undefined && !aws_cdk_lib_1.Token.isUnresolved(options.sourceChannelNumber)
274
+ && (options.sourceChannelNumber < 1 || options.sourceChannelNumber > 4)) {
275
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `AncillaryChannelNumberRange`, `sourceChannelNumber must be between 1 and 4, got ${options.sourceChannelNumber}`);
276
+ }
277
+ }
278
+ _bind() {
279
+ return {
280
+ name: this.name,
281
+ selectorSettings: {
282
+ ancillarySourceSettings: { sourceAncillaryChannelNumber: this.options.sourceChannelNumber },
283
+ },
284
+ };
285
+ }
286
+ }
287
+ /** @internal */
288
+ class AribCaptionSelector extends CaptionSelector {
289
+ constructor(name) { super(name); }
290
+ _bind() {
291
+ return { name: this.name, selectorSettings: { aribSourceSettings: {} } };
292
+ }
293
+ }
294
+ /** @internal */
295
+ class DvbSubCaptionSelector extends CaptionSelector {
296
+ options;
297
+ constructor(name, options) {
298
+ super(name);
299
+ this.options = options;
300
+ }
301
+ _bind() {
302
+ return {
303
+ name: this.name,
304
+ selectorSettings: {
305
+ dvbSubSourceSettings: { pid: this.options.pid, ocrLanguage: this.options.ocrLanguage?.value },
306
+ },
307
+ };
308
+ }
309
+ }
310
+ /** @internal */
311
+ class Scte20CaptionSelector extends CaptionSelector {
312
+ options;
313
+ constructor(name, options) {
314
+ super(name);
315
+ this.options = options;
316
+ if (options.source608ChannelNumber !== undefined && !aws_cdk_lib_1.Token.isUnresolved(options.source608ChannelNumber)
317
+ && (options.source608ChannelNumber < 1 || options.source608ChannelNumber > 4)) {
318
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `Source608ChannelNumberRange`, `source608ChannelNumber must be between 1 and 4, got ${options.source608ChannelNumber}`);
319
+ }
320
+ }
321
+ _bind() {
322
+ return {
323
+ name: this.name,
324
+ selectorSettings: {
325
+ scte20SourceSettings: {
326
+ convert608To708: (this.options.convert608To708 ?? Convert608To708.DISABLED).value,
327
+ source608ChannelNumber: this.options.source608ChannelNumber,
328
+ },
329
+ },
330
+ };
331
+ }
332
+ }
333
+ /** @internal */
334
+ class Scte27CaptionSelector extends CaptionSelector {
335
+ options;
336
+ constructor(name, options) {
337
+ super(name);
338
+ this.options = options;
339
+ }
340
+ _bind() {
341
+ return {
342
+ name: this.name,
343
+ selectorSettings: {
344
+ scte27SourceSettings: { pid: this.options.pid, ocrLanguage: this.options.ocrLanguage?.value },
345
+ },
346
+ };
347
+ }
348
+ }
349
+ /** @internal */
350
+ class TeletextCaptionSelector extends CaptionSelector {
351
+ options;
352
+ constructor(name, options) {
353
+ super(name);
354
+ this.options = options;
355
+ if (options.outputRectangle) {
356
+ const r = options.outputRectangle;
357
+ if (!aws_cdk_lib_1.Token.isUnresolved(r.height) && (r.height < 0 || r.height > 100)) {
358
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `CaptionRectangleRange`, `outputRectangle.height must be between 0 and 100, got ${r.height}`);
359
+ }
360
+ if (!aws_cdk_lib_1.Token.isUnresolved(r.width) && (r.width < 0 || r.width > 100)) {
361
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `CaptionRectangleRange`, `outputRectangle.width must be between 0 and 100, got ${r.width}`);
362
+ }
363
+ if (!aws_cdk_lib_1.Token.isUnresolved(r.leftOffset) && (r.leftOffset < 0 || r.leftOffset > 100)) {
364
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `CaptionRectangleRange`, `outputRectangle.leftOffset must be between 0 and 100, got ${r.leftOffset}`);
365
+ }
366
+ if (!aws_cdk_lib_1.Token.isUnresolved(r.topOffset) && (r.topOffset < 0 || r.topOffset > 100)) {
367
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `CaptionRectangleRange`, `outputRectangle.topOffset must be between 0 and 100, got ${r.topOffset}`);
368
+ }
369
+ if (!aws_cdk_lib_1.Token.isUnresolved(r.leftOffset) && !aws_cdk_lib_1.Token.isUnresolved(r.width) && r.leftOffset + r.width > 100) {
370
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `CaptionRectangleOverflow`, `outputRectangle leftOffset (${r.leftOffset}) + width (${r.width}) must not exceed 100`);
371
+ }
372
+ if (!aws_cdk_lib_1.Token.isUnresolved(r.topOffset) && !aws_cdk_lib_1.Token.isUnresolved(r.height) && r.topOffset + r.height > 100) {
373
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `CaptionRectangleOverflow`, `outputRectangle topOffset (${r.topOffset}) + height (${r.height}) must not exceed 100`);
374
+ }
375
+ }
376
+ }
377
+ _bind() {
378
+ return {
379
+ name: this.name,
380
+ selectorSettings: {
381
+ teletextSourceSettings: {
382
+ pageNumber: this.options.pageNumber,
383
+ outputRectangle: this.options.outputRectangle ? {
384
+ height: this.options.outputRectangle.height,
385
+ width: this.options.outputRectangle.width,
386
+ leftOffset: this.options.outputRectangle.leftOffset,
387
+ topOffset: this.options.outputRectangle.topOffset,
388
+ } : undefined,
389
+ },
390
+ },
391
+ };
392
+ }
393
+ }
394
+ /** @internal */
395
+ class SmartSubtitleCaptionSelector extends CaptionSelector {
396
+ options;
397
+ constructor(name, options) {
398
+ super(name);
399
+ this.options = options;
400
+ }
401
+ _bind() {
402
+ return {
403
+ name: this.name,
404
+ selectorSettings: {
405
+ smartSubtitleSourceSettings: {
406
+ inferenceFeedOutput: this.options.inferenceFeedOutput,
407
+ captionSynchronizationMode: this.options.captionSynchronizationMode?.value,
408
+ },
409
+ },
410
+ };
411
+ }
412
+ }
413
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwdGlvbi1zZWxlY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNhcHRpb24tc2VsZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBNkQ7QUFFN0QsNEVBQTREO0FBRTVEOztHQUVHO0FBQ0gsTUFBYSxXQUFXOztJQUN0QixhQUFhO0lBQ04sTUFBTSxDQUFVLEdBQUcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxjQUFjO0lBQ1AsTUFBTSxDQUFVLEdBQUcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxhQUFhO0lBQ04sTUFBTSxDQUFVLEdBQUcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxZQUFZO0lBQ0wsTUFBTSxDQUFVLEdBQUcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxpQkFBaUI7SUFDVixNQUFNLENBQVUsR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELGNBQWM7SUFDUCxNQUFNLENBQVUsR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXBELDJDQUEyQztJQUNwQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQWE7UUFDNUIsT0FBTyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUMvQjtJQUVELDREQUE0RDtJQUM1QyxLQUFLLENBQVM7SUFFOUIsWUFBb0IsS0FBYTtRQUMvQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztLQUNwQjs7QUF4Qkgsa0NBeUJDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLGVBQWU7O0lBQzFCLHNEQUFzRDtJQUMvQyxNQUFNLENBQVUsUUFBUSxHQUFHLElBQUksZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2xFLHVFQUF1RTtJQUNoRSxNQUFNLENBQVUsU0FBUyxHQUFHLElB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bkVycm9yIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHR5cGUgeyBDZm5DaGFubmVsIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLW1lZGlhbGl2ZSc7XG5pbXBvcnQgeyBsaXQgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcblxuLyoqXG4gKiBUaGUgT0NSIGxhbmd1YWdlIHRvIHVzZSB3aGVuIGNvbnZlcnRpbmcgYW4gaW1hZ2UtYmFzZWQgY2FwdGlvbiBzb3VyY2UgdG8gdGV4dC5cbiAqL1xuZXhwb3J0IGNsYXNzIE9jckxhbmd1YWdlIHtcbiAgLyoqIEdlcm1hbiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFVSA9IG5ldyBPY3JMYW5ndWFnZSgnREVVJyk7XG4gIC8qKiBFbmdsaXNoICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRU5HID0gbmV3IE9jckxhbmd1YWdlKCdFTkcnKTtcbiAgLyoqIEZyZW5jaCAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEZSQSA9IG5ldyBPY3JMYW5ndWFnZSgnRlJBJyk7XG4gIC8qKiBEdXRjaCAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE5MRCA9IG5ldyBPY3JMYW5ndWFnZSgnTkxEJyk7XG4gIC8qKiBQb3J0dWd1ZXNlICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUE9SID0gbmV3IE9jckxhbmd1YWdlKCdQT1InKTtcbiAgLyoqIFNwYW5pc2ggKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTUEEgPSBuZXcgT2NyTGFuZ3VhZ2UoJ1NQQScpO1xuXG4gIC8qKiBBIHZhbHVlIG5vdCB5ZXQgbW9kZWxsZWQgYnkgQVdTIENESy4gKi9cbiAgcHVibGljIHN0YXRpYyBvZih2YWx1ZTogc3RyaW5nKTogT2NyTGFuZ3VhZ2Uge1xuICAgIHJldHVybiBuZXcgT2NyTGFuZ3VhZ2UodmFsdWUpO1xuICB9XG5cbiAgLyoqIFRoZSB1bmRlcmx5aW5nIHN0cmluZyB2YWx1ZSBwYXNzZWQgdG8gQ2xvdWRGb3JtYXRpb24uICovXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgdG8gdXBjb252ZXJ0IDYwOCBjYXB0aW9ucyB0byA3MDguXG4gKi9cbmV4cG9ydCBjbGFzcyBDb252ZXJ0NjA4VG83MDgge1xuICAvKiogUGFzcyB0aHJvdWdoIDYwOCBjYXB0aW9ucyB3aXRob3V0IHVwY29udmVydGluZy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBESVNBQkxFRCA9IG5ldyBDb252ZXJ0NjA4VG83MDgoJ0RJU0FCTEVEJyk7XG4gIC8qKiBVcGNvbnZlcnQgNjA4IGNhcHRpb25zIHRvIDcwOCAoNjA4IGRhdGEgaXMgYWxzbyBwYXNzZWQgdGhyb3VnaCkuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVVBDT05WRVJUID0gbmV3IENvbnZlcnQ2MDhUbzcwOCgnVVBDT05WRVJUJyk7XG5cbiAgLyoqIEEgdmFsdWUgbm90IHlldCBtb2RlbGxlZCBieSBBV1MgQ0RLLiAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJ0NjA4VG83MDgge1xuICAgIHJldHVybiBuZXcgQ29udmVydDYwOFRvNzA4KHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBUaGUgdW5kZXJseWluZyBzdHJpbmcgdmFsdWUgcGFzc2VkIHRvIENsb3VkRm9ybWF0aW9uLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBTQ1RFLTIwIGRldGVjdGlvbiBtb2RlIGZvciBhbiBlbWJlZGRlZCBjYXB0aW9uIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjdGUyMERldGVjdGlvbiB7XG4gIC8qKiBIYW5kbGUgc3RyZWFtcyB3aXRoIGludGVybWl0dGVudCBvciBub24tYWxpZ25lZCBTQ1RFLTIwIGFuZCBlbWJlZGRlZCBjYXB0aW9ucy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBBVVRPID0gbmV3IFNjdGUyMERldGVjdGlvbignQVVUTycpO1xuICAvKiogRG8gbm90IGRldGVjdCBTQ1RFLTIwIGNhcHRpb25zLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE9GRiA9IG5ldyBTY3RlMjBEZXRlY3Rpb24oJ09GRicpO1xuXG4gIC8qKiBBIHZhbHVlIG5vdCB5ZXQgbW9kZWxsZWQgYnkgQVdTIENESy4gKi9cbiAgcHVibGljIHN0YXRpYyBvZih2YWx1ZTogc3RyaW5nKTogU2N0ZTIwRGV0ZWN0aW9uIHtcbiAgICByZXR1cm4gbmV3IFNjdGUyMERldGVjdGlvbih2YWx1ZSk7XG4gIH1cblxuICAvKiogVGhlIHVuZGVybHlpbmcgc3RyaW5nIHZhbHVlIHBhc3NlZCB0byBDbG91ZEZvcm1hdGlvbi4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYW4gZW1iZWRkZWQgKENFQS02MDgvNzA4KSBjYXB0aW9uIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRlZENhcHRpb25Tb3VyY2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBjb252ZXJ0IDYwOCBjYXB0aW9ucyB0byA3MDguXG4gICAqIEBkZWZhdWx0IENvbnZlcnQ2MDhUbzcwOC5ESVNBQkxFRFxuICAgKi9cbiAgcmVhZG9ubHkgY29udmVydDYwOFRvNzA4PzogQ29udmVydDYwOFRvNzA4O1xuICAvKipcbiAgICogU0NURS0yMCBkZXRlY3Rpb24gbW9kZS5cbiAgICogQGRlZmF1bHQgU2N0ZTIwRGV0ZWN0aW9uLk9GRlxuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZTIwRGV0ZWN0aW9uPzogU2N0ZTIwRGV0ZWN0aW9uO1xuICAvKipcbiAgICogVGhlIDYwOC83MDggY2hhbm5lbCBudW1iZXIgd2l0aGluIHRoZSB2aWRlbyB0cmFjayB0byBleHRyYWN0IGNhcHRpb25zIGZyb20uXG4gICAqIEBkZWZhdWx0IC0gTWVkaWFMaXZlIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlNjA4Q2hhbm5lbE51bWJlcj86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhbiBhbmNpbGxhcnkgY2FwdGlvbiBzb3VyY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5jaWxsYXJ5Q2FwdGlvblNvdXJjZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGNhcHRpb25zIGNoYW5uZWwgKDEtNCkgdG8gZXh0cmFjdCBmcm9tIHRoZSBhbmNpbGxhcnkgY2FwdGlvbnMuIFJlcXVpcmVkIHdoZW5cbiAgICogY29udmVydGluZyB0byBhbm90aGVyIGNhcHRpb24gZm9ybWF0OyBpZ25vcmVkIHdoZW4gcGFzc2luZyB0aHJvdWdoIGFzIGVtYmVkZGVkLlxuICAgKiBAZGVmYXVsdCAtIE1lZGlhTGl2ZSBpZ25vcmVzIHRoZSBjaGFubmVsIChwYXNzdGhyb3VnaClcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUNoYW5uZWxOdW1iZXI/OiBudW1iZXI7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYSBEVkItU3ViIGNhcHRpb24gc291cmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIER2YlN1YkNhcHRpb25Tb3VyY2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBQSUQgb2YgdGhlIHNvdXJjZSBjb250ZW50LiBVbnVzZWQgZm9yIERWQi1TdWIgcGFzc3Rocm91Z2guXG4gICAqIEBkZWZhdWx0IC0gTWVkaWFMaXZlIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgcGlkPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIE9DUiBsYW5ndWFnZSB0byB1c2Ugd2hlbiBjb252ZXJ0aW5nIHRoaXMgaW1hZ2UtYmFzZWQgc291cmNlIHRvIHRleHQuXG4gICAqIEBkZWZhdWx0IC0gTWVkaWFMaXZlIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgb2NyTGFuZ3VhZ2U/OiBPY3JMYW5ndWFnZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhbiBTQ1RFLTIwIGNhcHRpb24gc291cmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjdGUyMENhcHRpb25Tb3VyY2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBjb252ZXJ0IDYwOCBjYXB0aW9ucyB0byA3MDguXG4gICAqIEBkZWZhdWx0IENvbnZlcnQ2MDhUbzcwOC5ESVNBQkxFRFxuICAgKi9cbiAgcmVhZG9ubHkgY29udmVydDYwOFRvNzA4PzogQ29udmVydDYwOFRvNzA4O1xuICAvKipcbiAgICogVGhlIDYwOC83MDggY2hhbm5lbCBudW1iZXIgd2l0aGluIHRoZSB2aWRlbyB0cmFjayB0byBleHRyYWN0IGNhcHRpb25zIGZyb20uXG4gICAqIEBkZWZhdWx0IC0gTWVkaWFMaXZlIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlNjA4Q2hhbm5lbE51bWJlcj86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhbiBTQ1RFLTI3IGNhcHRpb24gc291cmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjdGUyN0NhcHRpb25Tb3VyY2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBQSUQgdG8gZXh0cmFjdCBjYXB0aW9ucyBmcm9tLiBTZWUgdGhlIE1lZGlhTGl2ZSBkb2NzIGZvciBob3cgUElEIGFuZCBgbGFuZ3VhZ2VDb2RlYFxuICAgKiBpbnRlcmFjdC5cbiAgICogQGRlZmF1bHQgLSBNZWRpYUxpdmUgc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBwaWQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgT0NSIGxhbmd1YWdlIHRvIHVzZSB3aGVuIGNvbnZlcnRpbmcgdGhpcyBpbWFnZS1iYXNlZCBzb3VyY2UgdG8gdGV4dC5cbiAgICogQGRlZmF1bHQgLSBNZWRpYUxpdmUgc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBvY3JMYW5ndWFnZT86IE9jckxhbmd1YWdlO1xufVxuXG4vKipcbiAqIEEgZGlzcGxheSByZWN0YW5nbGUsIGV4cHJlc3NlZCBhcyBwZXJjZW50YWdlcyBvZiB0aGUgdW5kZXJseWluZyB2aWRlbyBmcmFtZSwgZm9yIGNhcHRpb25zXG4gKiBjb252ZXJ0ZWQgdG8gRUJVLVRULUQgb3IgVFRNTC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXB0aW9uUmVjdGFuZ2xlIHtcbiAgLyoqIEhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGZyYW1lIGhlaWdodCAoMOKAkzEwMCkuICovXG4gIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyO1xuICAvKiogV2lkdGggb2YgdGhlIHJlY3RhbmdsZSwgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBmcmFtZSB3aWR0aCAoMOKAkzEwMCkuICovXG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXI7XG4gIC8qKiBMZWZ0IGVkZ2UgcG9zaXRpb24sIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgZnJhbWUgd2lkdGggKDDigJMxMDApLiAqL1xuICByZWFkb25seSBsZWZ0T2Zmc2V0OiBudW1iZXI7XG4gIC8qKiBUb3AgZWRnZSBwb3NpdGlvbiwgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBmcmFtZSBoZWlnaHQgKDDigJMxMDApLiAqL1xuICByZWFkb25seSB0b3BPZmZzZXQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhIFRlbGV0ZXh0IGNhcHRpb24gc291cmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbGV0ZXh0Q2FwdGlvblNvdXJjZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIFRlbGV0ZXh0IHBhZ2UgbnVtYmVyIHRvIGV4dHJhY3QgY2FwdGlvbnMgZnJvbSwgYXMgYSBoZXhhZGVjaW1hbCBzdHJpbmcgd2l0aCBub1xuICAgKiBgMHhgIHByZWZpeCAocmFuZ2UgYDEwMGDigJNgOEZGYCkuIFVudXNlZCBmb3IgcGFzc3Rocm91Z2guXG4gICAqIEBkZWZhdWx0IC0gTWVkaWFMaXZlIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgcGFnZU51bWJlcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBjYXB0aW9uIHJlY3RhbmdsZSB0byB1c2Ugd2hlbiBjb252ZXJ0aW5nIHRoaXMgc291cmNlIHRvIEVCVS1UVC1EIG9yIFRUTUwuXG4gICAqIEBkZWZhdWx0IC0gbm8gcmVjdGFuZ2xlIChzZXJ2aWNlIGRlZmF1bHQpXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRSZWN0YW5nbGU/OiBDYXB0aW9uUmVjdGFuZ2xlO1xufVxuXG4vKipcbiAqIENvbnRyb2xzIHdoZXRoZXIgTWVkaWFMaXZlIGRlbGF5cyB2aWRlbyB0byBzeW5jaHJvbml6ZSBjYXB0aW9ucyB3aXRoIGF1ZGlvIGFuZCB2aWRlbyBvdXRwdXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYXB0aW9uU3luY2hyb25pemF0aW9uTW9kZSB7XG4gIC8qKiBNZWRpYUxpdmUgZG9lcyBub3QgZGVsYXkgdmlkZW8gZm9yIGNhcHRpb24gYWxpZ25tZW50LiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE5PX1ZJREVPX0RFTEFZID0gbmV3IENhcHRpb25TeW5jaHJvbml6YXRpb25Nb2RlKCdOT19WSURFT19ERUxBWScpO1xuICAvKiogTWVkaWFMaXZlIGRlbGF5cyB2aWRlbyB0byBlbnN1cmUgY2FwdGlvbnMgYXJlIHN5bmNocm9uaXplZCB3aXRoIGF1ZGlvIGFuZCB2aWRlby4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWSURFT19BTElHTkVEX0NBUFRJT05TID0gbmV3IENhcHRpb25TeW5jaHJvbml6YXRpb25Nb2RlKCdWSURFT19BTElHTkVEX0NBUFRJT05TJyk7XG5cbiAgLyoqIEEgdmFsdWUgbm90IHlldCBtb2RlbGxlZCBieSBBV1MgQ0RLLiAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBDYXB0aW9uU3luY2hyb25pemF0aW9uTW9kZSB7XG4gICAgcmV0dXJuIG5ldyBDYXB0aW9uU3luY2hyb25pemF0aW9uTW9kZSh2YWx1ZSk7XG4gIH1cblxuICAvKiogVGhlIHVuZGVybHlpbmcgc3RyaW5nIHZhbHVlIHBhc3NlZCB0byBDbG91ZEZvcm1hdGlvbi4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYSBzbWFydCBzdWJ0aXRsZSBjYXB0aW9uIHNvdXJjZSAoQUktZ2VuZXJhdGVkIHN1YnRpdGxlcyB2aWEgRWxlbWVudGFsIEluZmVyZW5jZSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU21hcnRTdWJ0aXRsZVNvdXJjZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIEVsZW1lbnRhbCBJbmZlcmVuY2UgZmVlZCBvdXRwdXQgdGhhdCBwcm92aWRlcyB0aGUgc3VidGl0bGVzLlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgaW5mZXJlbmNlRmVlZE91dHB1dD86IHN0cmluZztcbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgTWVkaWFMaXZlIGRlbGF5cyB2aWRlbyB0byBzeW5jaHJvbml6ZSBjYXB0aW9ucyB3aXRoIGF1ZGlvIGFuZCB2aWRlbyBvdXRwdXQuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBjYXB0aW9uU3luY2hyb25pemF0aW9uTW9kZT86IENhcHRpb25TeW5jaHJvbml6YXRpb25Nb2RlO1xufVxuXG4vKipcbiAqIEEgY2FwdGlvbiBzZWxlY3RvciB0aGF0IGlkZW50aWZpZXMgd2hpY2ggY2FwdGlvbnMgdG8gZXh0cmFjdCBmcm9tIHRoZSBpbnB1dC4gQ3JlYXRlIHdpdGhcbiAqIHRoZSBzdGF0aWMgZmFjdG9yeSBtZXRob2RzIOKAlCBvbmUgcGVyIGNhcHRpb24gc291cmNlIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENhcHRpb25TZWxlY3RvciB7XG4gIC8qKlxuICAgKiBTZWxlY3QgY2FwdGlvbnMgYnkgbGFuZ3VhZ2UgY29kZSAobm8gc3BlY2lmaWMgc291cmNlIGZvcm1hdCkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGJ5TGFuZ3VhZ2UobmFtZTogc3RyaW5nLCBsYW5ndWFnZUNvZGU6IHN0cmluZyk6IENhcHRpb25TZWxlY3RvciB7XG4gICAgcmV0dXJuIG5ldyBMYW5ndWFnZUNhcHRpb25TZWxlY3RvcihuYW1lLCBsYW5ndWFnZUNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBlbWJlZGRlZCAoQ0VBLTYwOC83MDgpIGNhcHRpb25zLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBlbWJlZGRlZChuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IEVtYmVkZGVkQ2FwdGlvblNvdXJjZU9wdGlvbnMgPSB7fSk6IENhcHRpb25TZWxlY3RvciB7XG4gICAgcmV0dXJuIG5ldyBFbWJlZGRlZENhcHRpb25TZWxlY3RvcihuYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgYW5jaWxsYXJ5IGNhcHRpb25zLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhbmNpbGxhcnkobmFtZTogc3RyaW5nLCBvcHRpb25zOiBBbmNpbGxhcnlDYXB0aW9uU291cmNlT3B0aW9ucyA9IHt9KTogQ2FwdGlvblNlbGVjdG9yIHtcbiAgICByZXR1cm4gbmV3IEFuY2lsbGFyeUNhcHRpb25TZWxlY3RvcihuYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgQVJJQiBjYXB0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXJpYihuYW1lOiBzdHJpbmcpOiBDYXB0aW9uU2VsZWN0b3Ige1xuICAgIHJldHVybiBuZXcgQXJpYkNhcHRpb25TZWxlY3RvcihuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgRFZCLVN1YiAoaW1hZ2UtYmFzZWQpIGNhcHRpb25zLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkdmJTdWIobmFtZTogc3RyaW5nLCBvcHRpb25zOiBEdmJTdWJDYXB0aW9uU291cmNlT3B0aW9ucyA9IHt9KTogQ2FwdGlvblNlbGVjdG9yIHtcbiAgICByZXR1cm4gbmV3IER2YlN1YkNhcHRpb25TZWxlY3RvcihuYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgU0NURS0yMCBjYXB0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2N0ZTIwKG5hbWU6IHN0cmluZywgb3B0aW9uczogU2N0ZTIwQ2FwdGlvblNvdXJjZU9wdGlvbnMgPSB7fSk6IENhcHRpb25TZWxlY3RvciB7XG4gICAgcmV0dXJuIG5ldyBTY3RlMjBDYXB0aW9uU2VsZWN0b3IobmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IFNDVEUtMjcgKGltYWdlLWJhc2VkKSBjYXB0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2N0ZTI3KG5hbWU6IHN0cmluZywgb3B0aW9uczogU2N0ZTI3Q2FwdGlvblNvdXJjZU9wdGlvbnMgPSB7fSk6IENhcHRpb25TZWxlY3RvciB7XG4gICAgcmV0dXJuIG5ldyBTY3RlMjdDYXB0aW9uU2VsZWN0b3IobmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IFRlbGV0ZXh0IGNhcHRpb25zLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB0ZWxldGV4dChuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IFRlbGV0ZXh0Q2FwdGlvblNvdXJjZU9wdGlvbnMgPSB7fSk6IENhcHRpb25TZWxlY3RvciB7XG4gICAgcmV0dXJuIG5ldyBUZWxldGV4dENhcHRpb25TZWxlY3RvcihuYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3Qgc21hcnQgc3VidGl0bGVzIGdlbmVyYXRlZCBieSBFbGVtZW50YWwgSW5mZXJlbmNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzbWFydFN1YnRpdGxlKG5hbWU6IHN0cmluZywgb3B0aW9uczogU21hcnRTdWJ0aXRsZVNvdXJjZU9wdGlvbnMgPSB7fSk6IENhcHRpb25TZWxlY3RvciB7XG4gICAgcmV0dXJuIG5ldyBTbWFydFN1YnRpdGxlQ2FwdGlvblNlbGVjdG9yKG5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoaXMgY2FwdGlvbiBzZWxlY3RvciwgdXNlZCB0byBhc3NvY2lhdGUgaXQgd2l0aCBjYXB0aW9uIG91dHB1dHMuIFVuaXF1ZVxuICAgKiB3aXRoaW4gYSBjaGFubmVsLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIGFic3RyYWN0IF9iaW5kKCk6IENmbkNoYW5uZWwuQ2FwdGlvblNlbGVjdG9yUHJvcGVydHk7XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIExhbmd1YWdlQ2FwdGlvblNlbGVjdG9yIGV4dGVuZHMgQ2FwdGlvblNlbGVjdG9yIHtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBwcml2YXRlIHJlYWRvbmx5IGxhbmd1YWdlQ29kZTogc3RyaW5nKSB7IHN1cGVyKG5hbWUpOyB9XG4gIHB1YmxpYyBfYmluZCgpOiBDZm5DaGFubmVsLkNhcHRpb25TZWxlY3RvclByb3BlcnR5IHtcbiAgICByZXR1cm4geyBuYW1lOiB0aGlzLm5hbWUsIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUgfTtcbiAgfVxufVxuXG4vKiogQGludGVybmFsICovXG5jbGFzcyBFbWJlZGRlZENhcHRpb25TZWxlY3RvciBleHRlbmRzIENhcHRpb25TZWxlY3RvciB7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBFbWJlZGRlZENhcHRpb25Tb3VyY2VPcHRpb25zKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgaWYgKG9wdGlvbnMuc291cmNlNjA4Q2hhbm5lbE51bWJlciAhPT0gdW5kZWZpbmVkICYmICFUb2tlbi5pc1VucmVzb2x2ZWQob3B0aW9ucy5zb3VyY2U2MDhDaGFubmVsTnVtYmVyKVxuICAgICAgJiYgKG9wdGlvbnMuc291cmNlNjA4Q2hhbm5lbE51bWJlciA8IDEgfHwgb3B0aW9ucy5zb3VyY2U2MDhDaGFubmVsTnVtYmVyID4gNCkpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgU291cmNlNjA4Q2hhbm5lbE51bWJlclJhbmdlYCwgYHNvdXJjZTYwOENoYW5uZWxOdW1iZXIgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDQsIGdvdCAke29wdGlvbnMuc291cmNlNjA4Q2hhbm5lbE51bWJlcn1gKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIF9iaW5kKCk6IENmbkNoYW5uZWwuQ2FwdGlvblNlbGVjdG9yUHJvcGVydHkge1xuICAgIGNvbnN0IGhhc1NldHRpbmdzID0gdGhpcy5vcHRpb25zLmNvbnZlcnQ2MDhUbzcwOCAhPT0gdW5kZWZpbmVkXG4gICAgICB8fCB0aGlzLm9wdGlvbnMuc2N0ZTIwRGV0ZWN0aW9uICE9PSB1bmRlZmluZWRcbiAgICAgIHx8IHRoaXMub3B0aW9ucy5zb3VyY2U2MDhDaGFubmVsTnVtYmVyICE9PSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHNlbGVjdG9yU2V0dGluZ3M6IGhhc1NldHRpbmdzID8ge1xuICAgICAgICBlbWJlZGRlZFNvdXJjZVNldHRpbmdzOiB7XG4gICAgICAgICAgY29udmVydDYwOFRvNzA4OiAodGhpcy5vcHRpb25zLmNvbnZlcnQ2MDhUbzcwOCA/PyBDb252ZXJ0NjA4VG83MDguRElTQUJMRUQpLnZhbHVlLFxuICAgICAgICAgIHNjdGUyMERldGVjdGlvbjogKHRoaXMub3B0aW9ucy5zY3RlMjBEZXRlY3Rpb24gPz8gU2N0ZTIwRGV0ZWN0aW9uLk9GRikudmFsdWUsXG4gICAgICAgICAgc291cmNlNjA4Q2hhbm5lbE51bWJlcjogdGhpcy5vcHRpb25zLnNvdXJjZTYwOENoYW5uZWxOdW1iZXIsXG4gICAgICAgIH0sXG4gICAgICB9IDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuY2xhc3MgQW5jaWxsYXJ5Q2FwdGlvblNlbGVjdG9yIGV4dGVuZHMgQ2FwdGlvblNlbGVjdG9yIHtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IEFuY2lsbGFyeUNhcHRpb25Tb3VyY2VPcHRpb25zKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgaWYgKG9wdGlvbnMuc291cmNlQ2hhbm5lbE51bWJlciAhPT0gdW5kZWZpbmVkICYmICFUb2tlbi5pc1VucmVzb2x2ZWQob3B0aW9ucy5zb3VyY2VDaGFubmVsTnVtYmVyKVxuICAgICAgJiYgKG9wdGlvbnMuc291cmNlQ2hhbm5lbE51bWJlciA8IDEgfHwgb3B0aW9ucy5zb3VyY2VDaGFubmVsTnVtYmVyID4gNCkpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgQW5jaWxsYXJ5Q2hhbm5lbE51bWJlclJhbmdlYCwgYHNvdXJjZUNoYW5uZWxOdW1iZXIgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDQsIGdvdCAke29wdGlvbnMuc291cmNlQ2hhbm5lbE51bWJlcn1gKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIF9iaW5kKCk6IENmbkNoYW5uZWwuQ2FwdGlvblNlbGVjdG9yUHJvcGVydHkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBzZWxlY3RvclNldHRpbmdzOiB7XG4gICAgICAgIGFuY2lsbGFyeVNvdXJjZVNldHRpbmdzOiB7IHNvdXJjZUFuY2lsbGFyeUNoYW5uZWxOdW1iZXI6IHRoaXMub3B0aW9ucy5zb3VyY2VDaGFubmVsTnVtYmVyIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuY2xhc3MgQXJpYkNhcHRpb25TZWxlY3RvciBleHRlbmRzIENhcHRpb25TZWxlY3RvciB7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykgeyBzdXBlcihuYW1lKTsgfVxuICBwdWJsaWMgX2JpbmQoKTogQ2ZuQ2hhbm5lbC5DYXB0aW9uU2VsZWN0b3JQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHsgbmFtZTogdGhpcy5uYW1lLCBzZWxlY3RvclNldHRpbmdzOiB7IGFyaWJTb3VyY2VTZXR0aW5nczoge30gfSB9O1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIER2YlN1YkNhcHRpb25TZWxlY3RvciBleHRlbmRzIENhcHRpb25TZWxlY3RvciB7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBEdmJTdWJDYXB0aW9uU291cmNlT3B0aW9ucykgeyBzdXBlcihuYW1lKTsgfVxuICBwdWJsaWMgX2JpbmQoKTogQ2ZuQ2hhbm5lbC5DYXB0aW9uU2VsZWN0b3JQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHNlbGVjdG9yU2V0dGluZ3M6IHtcbiAgICAgICAgZHZiU3ViU291cmNlU2V0dGluZ3M6IHsgcGlkOiB0aGlzLm9wdGlvbnMucGlkLCBvY3JMYW5ndWFnZTogdGhpcy5vcHRpb25zLm9jckxhbmd1YWdlPy52YWx1ZSB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIFNjdGUyMENhcHRpb25TZWxlY3RvciBleHRlbmRzIENhcHRpb25TZWxlY3RvciB7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBTY3RlMjBDYXB0aW9uU291cmNlT3B0aW9ucykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIGlmIChvcHRpb25zLnNvdXJjZTYwOENoYW5uZWxOdW1iZXIgIT09IHVuZGVmaW5lZCAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKG9wdGlvbnMuc291cmNlNjA4Q2hhbm5lbE51bWJlcilcbiAgICAgICYmIChvcHRpb25zLnNvdXJjZTYwOENoYW5uZWxOdW1iZXIgPCAxIHx8IG9wdGlvbnMuc291cmNlNjA4Q2hhbm5lbE51bWJlciA+IDQpKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YFNvdXJjZTYwOENoYW5uZWxOdW1iZXJSYW5nZWAsIGBzb3VyY2U2MDhDaGFubmVsTnVtYmVyIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA0LCBnb3QgJHtvcHRpb25zLnNvdXJjZTYwOENoYW5uZWxOdW1iZXJ9YCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBfYmluZCgpOiBDZm5DaGFubmVsLkNhcHRpb25TZWxlY3RvclByb3BlcnR5IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgc2VsZWN0b3JTZXR0aW5nczoge1xuICAgICAgICBzY3RlMjBTb3VyY2VTZXR0aW5nczoge1xuICAgICAgICAgIGNvbnZlcnQ2MDhUbzcwODogKHRoaXMub3B0aW9ucy5jb252ZXJ0NjA4VG83MDggPz8gQ29udmVydDYwOFRvNzA4LkRJU0FCTEVEKS52YWx1ZSxcbiAgICAgICAgICBzb3VyY2U2MDhDaGFubmVsTnVtYmVyOiB0aGlzLm9wdGlvbnMuc291cmNlNjA4Q2hhbm5lbE51bWJlcixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuXG4vKiogQGludGVybmFsICovXG5jbGFzcyBTY3RlMjdDYXB0aW9uU2VsZWN0b3IgZXh0ZW5kcyBDYXB0aW9uU2VsZWN0b3Ige1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogU2N0ZTI3Q2FwdGlvblNvdXJjZU9wdGlvbnMpIHsgc3VwZXIobmFtZSk7IH1cbiAgcHVibGljIF9iaW5kKCk6IENmbkNoYW5uZWwuQ2FwdGlvblNlbGVjdG9yUHJvcGVydHkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBzZWxlY3RvclNldHRpbmdzOiB7XG4gICAgICAgIHNjdGUyN1NvdXJjZVNldHRpbmdzOiB7IHBpZDogdGhpcy5vcHRpb25zLnBpZCwgb2NyTGFuZ3VhZ2U6IHRoaXMub3B0aW9ucy5vY3JMYW5ndWFnZT8udmFsdWUgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuXG4vKiogQGludGVybmFsICovXG5jbGFzcyBUZWxldGV4dENhcHRpb25TZWxlY3RvciBleHRlbmRzIENhcHRpb25TZWxlY3RvciB7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBUZWxldGV4dENhcHRpb25Tb3VyY2VPcHRpb25zKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgaWYgKG9wdGlvbnMub3V0cHV0UmVjdGFuZ2xlKSB7XG4gICAgICBjb25zdCByID0gb3B0aW9ucy5vdXRwdXRSZWN0YW5nbGU7XG4gICAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChyLmhlaWdodCkgJiYgKHIuaGVpZ2h0IDwgMCB8fCByLmhlaWdodCA+IDEwMCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBDYXB0aW9uUmVjdGFuZ2xlUmFuZ2VgLCBgb3V0cHV0UmVjdGFuZ2xlLmhlaWdodCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwLCBnb3QgJHtyLmhlaWdodH1gKTtcbiAgICAgIH1cbiAgICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHIud2lkdGgpICYmIChyLndpZHRoIDwgMCB8fCByLndpZHRoID4gMTAwKSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YENhcHRpb25SZWN0YW5nbGVSYW5nZWAsIGBvdXRwdXRSZWN0YW5nbGUud2lkdGggbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMCwgZ290ICR7ci53aWR0aH1gKTtcbiAgICAgIH1cbiAgICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHIubGVmdE9mZnNldCkgJiYgKHIubGVmdE9mZnNldCA8IDAgfHwgci5sZWZ0T2Zmc2V0ID4gMTAwKSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YENhcHRpb25SZWN0YW5nbGVSYW5nZWAsIGBvdXRwdXRSZWN0YW5nbGUubGVmdE9mZnNldCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwLCBnb3QgJHtyLmxlZnRPZmZzZXR9YCk7XG4gICAgICB9XG4gICAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChyLnRvcE9mZnNldCkgJiYgKHIudG9wT2Zmc2V0IDwgMCB8fCByLnRvcE9mZnNldCA+IDEwMCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBDYXB0aW9uUmVjdGFuZ2xlUmFuZ2VgLCBgb3V0cHV0UmVjdGFuZ2xlLnRvcE9mZnNldCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwLCBnb3QgJHtyLnRvcE9mZnNldH1gKTtcbiAgICAgIH1cbiAgICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHIubGVmdE9mZnNldCkgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChyLndpZHRoKSAmJiByLmxlZnRPZmZzZXQgKyByLndpZHRoID4gMTAwKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgQ2FwdGlvblJlY3RhbmdsZU92ZXJmbG93YCwgYG91dHB1dFJlY3RhbmdsZSBsZWZ0T2Zmc2V0ICgke3IubGVmdE9mZnNldH0pICsgd2lkdGggKCR7ci53aWR0aH0pIG11c3Qgbm90IGV4Y2VlZCAxMDBgKTtcbiAgICAgIH1cbiAgICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHIudG9wT2Zmc2V0KSAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKHIuaGVpZ2h0KSAmJiByLnRvcE9mZnNldCArIHIuaGVpZ2h0ID4gMTAwKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgQ2FwdGlvblJlY3RhbmdsZU92ZXJmbG93YCwgYG91dHB1dFJlY3RhbmdsZSB0b3BPZmZzZXQgKCR7ci50b3BPZmZzZXR9KSArIGhlaWdodCAoJHtyLmhlaWdodH0pIG11c3Qgbm90IGV4Y2VlZCAxMDBgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIF9iaW5kKCk6IENmbkNoYW5uZWwuQ2FwdGlvblNlbGVjdG9yUHJvcGVydHkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBzZWxlY3RvclNldHRpbmdzOiB7XG4gICAgICAgIHRlbGV0ZXh0U291cmNlU2V0dGluZ3M6IHtcbiAgICAgICAgICBwYWdlTnVtYmVyOiB0aGlzLm9wdGlvbnMucGFnZU51bWJlcixcbiAgICAgICAgICBvdXRwdXRSZWN0YW5nbGU6IHRoaXMub3B0aW9ucy5vdXRwdXRSZWN0YW5nbGUgPyB7XG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMub3B0aW9ucy5vdXRwdXRSZWN0YW5nbGUuaGVpZ2h0LFxuICAgICAgICAgICAgd2lkdGg6IHRoaXMub3B0aW9ucy5vdXRwdXRSZWN0YW5nbGUud2lkdGgsXG4gICAgICAgICAgICBsZWZ0T2Zmc2V0OiB0aGlzLm9wdGlvbnMub3V0cHV0UmVjdGFuZ2xlLmxlZnRPZmZzZXQsXG4gICAgICAgICAgICB0b3BPZmZzZXQ6IHRoaXMub3B0aW9ucy5vdXRwdXRSZWN0YW5nbGUudG9wT2Zmc2V0LFxuICAgICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuY2xhc3MgU21hcnRTdWJ0aXRsZUNhcHRpb25TZWxlY3RvciBleHRlbmRzIENhcHRpb25TZWxlY3RvciB7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBTbWFydFN1YnRpdGxlU291cmNlT3B0aW9ucykgeyBzdXBlcihuYW1lKTsgfVxuICBwdWJsaWMgX2JpbmQoKTogQ2ZuQ2hhbm5lbC5DYXB0aW9uU2VsZWN0b3JQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHNlbGVjdG9yU2V0dGluZ3M6IHtcbiAgICAgICAgc21hcnRTdWJ0aXRsZVNvdXJjZVNldHRpbmdzOiB7XG4gICAgICAgICAgaW5mZXJlbmNlRmVlZE91dHB1dDogdGhpcy5vcHRpb25zLmluZmVyZW5jZUZlZWRPdXRwdXQsXG4gICAgICAgICAgY2FwdGlvblN5bmNocm9uaXphdGlvbk1vZGU6IHRoaXMub3B0aW9ucy5jYXB0aW9uU3luY2hyb25pemF0aW9uTW9kZT8udmFsdWUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiJdfQ==