@aws-cdk/aws-mediapackagev2-alpha 2.247.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.
- package/.jsii +18480 -0
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +561 -0
- package/LICENSE +201 -0
- package/NOTICE +2 -0
- package/README.md +663 -0
- package/awslint.json +25 -0
- package/eslint-suppressions.json +2 -0
- package/grants.json +15 -0
- package/lib/channel-policy.d.ts +48 -0
- package/lib/channel-policy.js +113 -0
- package/lib/channel.d.ts +420 -0
- package/lib/channel.js +426 -0
- package/lib/endpoint.d.ts +1968 -0
- package/lib/endpoint.js +2010 -0
- package/lib/group.d.ts +253 -0
- package/lib/group.js +281 -0
- package/lib/index.d.ts +6 -0
- package/lib/index.js +23 -0
- package/lib/mediapackagev2-grants.generated.d.ts +23 -0
- package/lib/mediapackagev2-grants.generated.js +53 -0
- package/lib/origin-endpoint-policy.d.ts +76 -0
- package/lib/origin-endpoint-policy.js +148 -0
- package/lib/shared-helpers.d.ts +1 -0
- package/lib/shared-helpers.js +25 -0
- package/package.json +119 -0
- package/rosetta/_generated.ts-fixture +6 -0
- package/rosetta/default.ts-fixture +27 -0
package/lib/endpoint.js
ADDED
|
@@ -0,0 +1,2010 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
3
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
4
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
5
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
6
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
7
|
+
var _, done = false;
|
|
8
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
9
|
+
var context = {};
|
|
10
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
11
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
12
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
13
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
14
|
+
if (kind === "accessor") {
|
|
15
|
+
if (result === void 0) continue;
|
|
16
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
17
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
18
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
19
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
20
|
+
}
|
|
21
|
+
else if (_ = accept(result)) {
|
|
22
|
+
if (kind === "field") initializers.unshift(_);
|
|
23
|
+
else descriptor[key] = _;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
27
|
+
done = true;
|
|
28
|
+
};
|
|
29
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
30
|
+
var useValue = arguments.length > 2;
|
|
31
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
32
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
33
|
+
}
|
|
34
|
+
return useValue ? value : void 0;
|
|
35
|
+
};
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.OriginEndpoint = exports.Segment = exports.IsmEncryption = exports.TsEncryption = exports.CmafEncryption = exports.EncryptionConfiguration = exports.IsmDrmSystem = exports.TsDrmSystem = exports.CmafDrmSystem = exports.MssManifestLayout = exports.TtmlProfile = exports.DashManifestCompactness = exports.DrmSignalling = exports.DashPeriodTriggers = exports.DashUtcTimingMode = exports.SegmentTemplateFormat = exports.AdMarkerHls = exports.AdMarkerDash = exports.StartTag = exports.DrmSettingsKey = exports.ScteInSegments = exports.ScteMessageType = exports.EndpointErrorConfiguration = exports.PresetSpeke20Video = exports.PresetSpeke20Audio = exports.TsEncryptionMethod = exports.CmafEncryptionMethod = exports.ContainerType = exports.Manifest = exports.ManifestFilter = exports.BitrateExpression = exports.NumericExpression = exports.BitrateFilterKey = exports.TextFilterKey = exports.NumericFilterKey = exports.TrickplayType = exports.VideoDynamicRange = exports.VideoCodec = exports.AudioCodec = void 0;
|
|
38
|
+
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
39
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
40
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
41
|
+
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
|
|
42
|
+
const aws_mediapackagev2_1 = require("aws-cdk-lib/aws-mediapackagev2");
|
|
43
|
+
const core_1 = require("aws-cdk-lib/core");
|
|
44
|
+
const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
|
|
45
|
+
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
|
|
46
|
+
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
|
|
47
|
+
const origin_endpoint_policy_1 = require("./origin-endpoint-policy");
|
|
48
|
+
const shared_helpers_1 = require("./shared-helpers");
|
|
49
|
+
/**
|
|
50
|
+
* Accepted audio codec values for manifest filtering.
|
|
51
|
+
*
|
|
52
|
+
* @see https://docs.aws.amazon.com/mediapackage/latest/userguide/manifest-filter-query-parameters.html
|
|
53
|
+
*/
|
|
54
|
+
var AudioCodec;
|
|
55
|
+
(function (AudioCodec) {
|
|
56
|
+
/** AAC-LC audio codec */
|
|
57
|
+
AudioCodec["AACL"] = "AACL";
|
|
58
|
+
/** HE-AAC audio codec */
|
|
59
|
+
AudioCodec["AACH"] = "AACH";
|
|
60
|
+
/** Dolby Digital audio codec (include the hyphen) */
|
|
61
|
+
AudioCodec["AC_3"] = "AC-3";
|
|
62
|
+
/** Dolby Digital Plus audio codec (include the hyphen) */
|
|
63
|
+
AudioCodec["EC_3"] = "EC-3";
|
|
64
|
+
})(AudioCodec || (exports.AudioCodec = AudioCodec = {}));
|
|
65
|
+
/**
|
|
66
|
+
* Accepted video codec values for manifest filtering.
|
|
67
|
+
*
|
|
68
|
+
* @see https://docs.aws.amazon.com/mediapackage/latest/userguide/manifest-filter-query-parameters.html
|
|
69
|
+
*/
|
|
70
|
+
var VideoCodec;
|
|
71
|
+
(function (VideoCodec) {
|
|
72
|
+
/** H.264/AVC */
|
|
73
|
+
VideoCodec["H264"] = "H264";
|
|
74
|
+
/** H.265/HEVC */
|
|
75
|
+
VideoCodec["H265"] = "H265";
|
|
76
|
+
/** AV1 */
|
|
77
|
+
VideoCodec["AV1"] = "AV1";
|
|
78
|
+
})(VideoCodec || (exports.VideoCodec = VideoCodec = {}));
|
|
79
|
+
/**
|
|
80
|
+
* Accepted video dynamic range values for manifest filtering.
|
|
81
|
+
*
|
|
82
|
+
* @see https://docs.aws.amazon.com/mediapackage/latest/userguide/manifest-filter-query-parameters.html
|
|
83
|
+
*/
|
|
84
|
+
var VideoDynamicRange;
|
|
85
|
+
(function (VideoDynamicRange) {
|
|
86
|
+
/** Dolby Vision */
|
|
87
|
+
VideoDynamicRange["DV"] = "dv";
|
|
88
|
+
/** HDR10 */
|
|
89
|
+
VideoDynamicRange["HDR10"] = "hdr10";
|
|
90
|
+
/** Hybrid Log-Gamma */
|
|
91
|
+
VideoDynamicRange["HLG"] = "hlg";
|
|
92
|
+
/** Standard Dynamic Range */
|
|
93
|
+
VideoDynamicRange["SDR"] = "sdr";
|
|
94
|
+
})(VideoDynamicRange || (exports.VideoDynamicRange = VideoDynamicRange = {}));
|
|
95
|
+
/**
|
|
96
|
+
* Accepted trickplay type values for manifest filtering.
|
|
97
|
+
*
|
|
98
|
+
* @see https://docs.aws.amazon.com/mediapackage/latest/userguide/manifest-filter-query-parameters.html
|
|
99
|
+
*/
|
|
100
|
+
var TrickplayType;
|
|
101
|
+
(function (TrickplayType) {
|
|
102
|
+
/** I-frame only trick-play */
|
|
103
|
+
TrickplayType["IFRAME"] = "iframe";
|
|
104
|
+
/** Image-based trick-play */
|
|
105
|
+
TrickplayType["IMAGE"] = "image";
|
|
106
|
+
/** No trick-play */
|
|
107
|
+
TrickplayType["NONE"] = "none";
|
|
108
|
+
})(TrickplayType || (exports.TrickplayType = TrickplayType = {}));
|
|
109
|
+
/**
|
|
110
|
+
* Numeric manifest filter keys.
|
|
111
|
+
*
|
|
112
|
+
* Use with `ManifestFilter.numeric()`, `ManifestFilter.numericList()`, and `ManifestFilter.numericRange()`.
|
|
113
|
+
*
|
|
114
|
+
* Audio and video bitrate filters are not included here because they use the
|
|
115
|
+
* `Bitrate` class directly via dedicated methods on `ManifestFilter`.
|
|
116
|
+
*
|
|
117
|
+
* @see https://docs.aws.amazon.com/mediapackage/latest/userguide/manifest-filter-query-parameters.html
|
|
118
|
+
*/
|
|
119
|
+
var NumericFilterKey;
|
|
120
|
+
(function (NumericFilterKey) {
|
|
121
|
+
/**
|
|
122
|
+
* The number of audio channels.
|
|
123
|
+
*
|
|
124
|
+
* Accepted values: range 1–32767, or individual integers.
|
|
125
|
+
*/
|
|
126
|
+
NumericFilterKey["AUDIO_CHANNELS"] = "audio_channels";
|
|
127
|
+
/**
|
|
128
|
+
* The audio sample rate in Hz.
|
|
129
|
+
*
|
|
130
|
+
* Accepted values: range 0–2147483647, or individual integers.
|
|
131
|
+
*/
|
|
132
|
+
NumericFilterKey["AUDIO_SAMPLE_RATE"] = "audio_sample_rate";
|
|
133
|
+
/**
|
|
134
|
+
* The height of the trick-play image in pixels (I-frame and image-based trick-play).
|
|
135
|
+
*
|
|
136
|
+
* If using with I-frame only trick-play, `TRICKPLAY_HEIGHT` and `VIDEO_HEIGHT`
|
|
137
|
+
* should have similar values. If they differ, I-frame only tracks might be
|
|
138
|
+
* removed from the manifest.
|
|
139
|
+
*
|
|
140
|
+
* Accepted values: range 1–2147483647, or individual integers.
|
|
141
|
+
*/
|
|
142
|
+
NumericFilterKey["TRICKPLAY_HEIGHT"] = "trickplay_height";
|
|
143
|
+
/**
|
|
144
|
+
* The video frame rate range in NTSC format.
|
|
145
|
+
*
|
|
146
|
+
* When filtering for a single value, MediaPackage uses an approximate equals
|
|
147
|
+
* comparison with an epsilon tolerance of 0.0005.
|
|
148
|
+
*
|
|
149
|
+
* Accepted values: range 1–999.999 (up to three decimal places), or individual values.
|
|
150
|
+
*/
|
|
151
|
+
NumericFilterKey["VIDEO_FRAMERATE"] = "video_framerate";
|
|
152
|
+
/**
|
|
153
|
+
* The height of the video in pixels.
|
|
154
|
+
*
|
|
155
|
+
* If using with I-frame only trick-play, `TRICKPLAY_HEIGHT` and `VIDEO_HEIGHT`
|
|
156
|
+
* should have similar values. If they differ, I-frame only tracks might be
|
|
157
|
+
* removed from the manifest.
|
|
158
|
+
*
|
|
159
|
+
* Accepted values: range 1–32767, or individual integers.
|
|
160
|
+
*/
|
|
161
|
+
NumericFilterKey["VIDEO_HEIGHT"] = "video_height";
|
|
162
|
+
})(NumericFilterKey || (exports.NumericFilterKey = NumericFilterKey = {}));
|
|
163
|
+
/**
|
|
164
|
+
* Text manifest filter keys for free-form string values.
|
|
165
|
+
*
|
|
166
|
+
* Use with `ManifestFilter.text()` and `ManifestFilter.textList()`.
|
|
167
|
+
*
|
|
168
|
+
* For keys with fixed accepted values, use the dedicated methods on `ManifestFilter` instead:
|
|
169
|
+
* - Audio codec: `ManifestFilter.audioCodec()` / `ManifestFilter.audioCodecList()`
|
|
170
|
+
* - Video codec: `ManifestFilter.videoCodec()` / `ManifestFilter.videoCodecList()`
|
|
171
|
+
* - Video dynamic range: `ManifestFilter.videoDynamicRange()` / `ManifestFilter.videoDynamicRangeList()`
|
|
172
|
+
* - Trickplay type: `ManifestFilter.trickplayType()` / `ManifestFilter.trickplayTypeList()`
|
|
173
|
+
*
|
|
174
|
+
* @see https://docs.aws.amazon.com/mediapackage/latest/userguide/manifest-filter-query-parameters.html
|
|
175
|
+
*/
|
|
176
|
+
var TextFilterKey;
|
|
177
|
+
(function (TextFilterKey) {
|
|
178
|
+
/**
|
|
179
|
+
* Audio languages or functional codes derived from encoder passthrough.
|
|
180
|
+
*
|
|
181
|
+
* Accepted values: arbitrary strings such as ISO-639-1 language codes (not case-sensitive).
|
|
182
|
+
*/
|
|
183
|
+
TextFilterKey["AUDIO_LANGUAGE"] = "audio_language";
|
|
184
|
+
/**
|
|
185
|
+
* The subtitle language or functional codes derived from encoder passthrough.
|
|
186
|
+
*
|
|
187
|
+
* Accepted values: arbitrary strings such as ISO-639-1 language codes (not case-sensitive).
|
|
188
|
+
*/
|
|
189
|
+
TextFilterKey["SUBTITLE_LANGUAGE"] = "subtitle_language";
|
|
190
|
+
})(TextFilterKey || (exports.TextFilterKey = TextFilterKey = {}));
|
|
191
|
+
/**
|
|
192
|
+
* Bitrate manifest filter keys.
|
|
193
|
+
*
|
|
194
|
+
* Use with `ManifestFilter.bitrate()` and `ManifestFilter.bitrateRange()`.
|
|
195
|
+
*
|
|
196
|
+
* @see https://docs.aws.amazon.com/mediapackage/latest/userguide/manifest-filter-query-parameters.html
|
|
197
|
+
*/
|
|
198
|
+
var BitrateFilterKey;
|
|
199
|
+
(function (BitrateFilterKey) {
|
|
200
|
+
/**
|
|
201
|
+
* The audio bitrate in bits per second.
|
|
202
|
+
*
|
|
203
|
+
* Accepted values: range 0–2147483647, or individual integers.
|
|
204
|
+
*/
|
|
205
|
+
BitrateFilterKey["AUDIO_BITRATE"] = "audio_bitrate";
|
|
206
|
+
/**
|
|
207
|
+
* The video bitrate in bits per second.
|
|
208
|
+
*
|
|
209
|
+
* We recommend using only this filter parameter to set the video bitrate.
|
|
210
|
+
* Do not also set the minimum and maximum video bitrate via the MediaPackage
|
|
211
|
+
* console or AWS CLI, as your output might be skewed.
|
|
212
|
+
*
|
|
213
|
+
* This parameter cannot be used with trick-play streams.
|
|
214
|
+
*
|
|
215
|
+
* Accepted values: range 0–2147483647, or individual integers.
|
|
216
|
+
*/
|
|
217
|
+
BitrateFilterKey["VIDEO_BITRATE"] = "video_bitrate";
|
|
218
|
+
})(BitrateFilterKey || (exports.BitrateFilterKey = BitrateFilterKey = {}));
|
|
219
|
+
/**
|
|
220
|
+
* Represents a numeric filter expression segment — either a single value or a range.
|
|
221
|
+
*
|
|
222
|
+
* Use with `ManifestFilter.numericCombo()` to build filters that combine
|
|
223
|
+
* ranges and individual values (e.g. `video_height:240-360,720-1080,1440`).
|
|
224
|
+
*/
|
|
225
|
+
class NumericExpression {
|
|
226
|
+
_expression;
|
|
227
|
+
_values;
|
|
228
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.NumericExpression", version: "2.247.0-alpha.0" };
|
|
229
|
+
/**
|
|
230
|
+
* A single numeric value.
|
|
231
|
+
*/
|
|
232
|
+
static value(v) {
|
|
233
|
+
return new NumericExpression(`${v}`, [v]);
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* An inclusive numeric range.
|
|
237
|
+
*/
|
|
238
|
+
static range(start, end) {
|
|
239
|
+
return new NumericExpression(`${start}-${end}`, [start, end]);
|
|
240
|
+
}
|
|
241
|
+
constructor(
|
|
242
|
+
/** @internal */
|
|
243
|
+
_expression,
|
|
244
|
+
/** @internal */
|
|
245
|
+
_values) {
|
|
246
|
+
this._expression = _expression;
|
|
247
|
+
this._values = _values;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
exports.NumericExpression = NumericExpression;
|
|
251
|
+
/**
|
|
252
|
+
* Represents a bitrate filter expression segment — either a single value or a range.
|
|
253
|
+
*
|
|
254
|
+
* Use with `ManifestFilter.bitrateCombo()` to build filters that combine
|
|
255
|
+
* ranges and individual bitrate values.
|
|
256
|
+
*/
|
|
257
|
+
class BitrateExpression {
|
|
258
|
+
_expression;
|
|
259
|
+
_values;
|
|
260
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.BitrateExpression", version: "2.247.0-alpha.0" };
|
|
261
|
+
/**
|
|
262
|
+
* A single bitrate value.
|
|
263
|
+
*/
|
|
264
|
+
static value(v) {
|
|
265
|
+
return new BitrateExpression(`${v.toBps()}`, [v.toBps()]);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* An inclusive bitrate range.
|
|
269
|
+
*/
|
|
270
|
+
static range(start, end) {
|
|
271
|
+
return new BitrateExpression(`${start.toBps()}-${end.toBps()}`, [start.toBps(), end.toBps()]);
|
|
272
|
+
}
|
|
273
|
+
constructor(
|
|
274
|
+
/** @internal */
|
|
275
|
+
_expression,
|
|
276
|
+
/** @internal */
|
|
277
|
+
_values) {
|
|
278
|
+
this._expression = _expression;
|
|
279
|
+
this._values = _values;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
exports.BitrateExpression = BitrateExpression;
|
|
283
|
+
/**
|
|
284
|
+
* Enables you to create filters for your Origin Endpoint.
|
|
285
|
+
*
|
|
286
|
+
* @see https://docs.aws.amazon.com/mediapackage/latest/userguide/manifest-filtering.html
|
|
287
|
+
*/
|
|
288
|
+
class ManifestFilter {
|
|
289
|
+
filterString;
|
|
290
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.ManifestFilter", version: "2.247.0-alpha.0" };
|
|
291
|
+
/**
|
|
292
|
+
* Filter by a single bitrate value.
|
|
293
|
+
*/
|
|
294
|
+
static bitrate(key, value) {
|
|
295
|
+
try {
|
|
296
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_BitrateFilterKey(key);
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
300
|
+
Error.captureStackTrace(error, this.bitrate);
|
|
301
|
+
}
|
|
302
|
+
throw error;
|
|
303
|
+
}
|
|
304
|
+
const bps = value.toBps();
|
|
305
|
+
validateBitrateFilterValue(bps, key);
|
|
306
|
+
return new ManifestFilter(`${key}:${bps}`);
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Filter by a bitrate range (inclusive).
|
|
310
|
+
*/
|
|
311
|
+
static bitrateRange(key, start, end) {
|
|
312
|
+
try {
|
|
313
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_BitrateFilterKey(key);
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
317
|
+
Error.captureStackTrace(error, this.bitrateRange);
|
|
318
|
+
}
|
|
319
|
+
throw error;
|
|
320
|
+
}
|
|
321
|
+
const startBps = start.toBps();
|
|
322
|
+
const endBps = end.toBps();
|
|
323
|
+
validateBitrateFilterValue(startBps, key);
|
|
324
|
+
validateBitrateFilterValue(endBps, key);
|
|
325
|
+
return new ManifestFilter(`${key}:${startBps}-${endBps}`);
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Specify a single numeric filter value.
|
|
329
|
+
*/
|
|
330
|
+
static numeric(key, value) {
|
|
331
|
+
try {
|
|
332
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_NumericFilterKey(key);
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
336
|
+
Error.captureStackTrace(error, this.numeric);
|
|
337
|
+
}
|
|
338
|
+
throw error;
|
|
339
|
+
}
|
|
340
|
+
validateNumericFilterValue(value, key);
|
|
341
|
+
return new ManifestFilter(`${key}:${value}`);
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Specify multiple numeric filter values.
|
|
345
|
+
*/
|
|
346
|
+
static numericList(key, values) {
|
|
347
|
+
try {
|
|
348
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_NumericFilterKey(key);
|
|
349
|
+
}
|
|
350
|
+
catch (error) {
|
|
351
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
352
|
+
Error.captureStackTrace(error, this.numericList);
|
|
353
|
+
}
|
|
354
|
+
throw error;
|
|
355
|
+
}
|
|
356
|
+
values.forEach(v => validateNumericFilterValue(v, key));
|
|
357
|
+
return new ManifestFilter(`${key}:${values.join(',')}`);
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Specify a numeric filter range (inclusive).
|
|
361
|
+
*/
|
|
362
|
+
static numericRange(key, start, end) {
|
|
363
|
+
try {
|
|
364
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_NumericFilterKey(key);
|
|
365
|
+
}
|
|
366
|
+
catch (error) {
|
|
367
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
368
|
+
Error.captureStackTrace(error, this.numericRange);
|
|
369
|
+
}
|
|
370
|
+
throw error;
|
|
371
|
+
}
|
|
372
|
+
validateNumericFilterValue(start, key);
|
|
373
|
+
validateNumericFilterValue(end, key);
|
|
374
|
+
return new ManifestFilter(`${key}:${start}-${end}`);
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Specify a free-form text filter value (for language keys).
|
|
378
|
+
*/
|
|
379
|
+
static text(key, value) {
|
|
380
|
+
try {
|
|
381
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_TextFilterKey(key);
|
|
382
|
+
}
|
|
383
|
+
catch (error) {
|
|
384
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
385
|
+
Error.captureStackTrace(error, this.text);
|
|
386
|
+
}
|
|
387
|
+
throw error;
|
|
388
|
+
}
|
|
389
|
+
return new ManifestFilter(`${key}:${value}`);
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Specify multiple free-form text filter values (for language keys).
|
|
393
|
+
*/
|
|
394
|
+
static textList(key, values) {
|
|
395
|
+
try {
|
|
396
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_TextFilterKey(key);
|
|
397
|
+
}
|
|
398
|
+
catch (error) {
|
|
399
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
400
|
+
Error.captureStackTrace(error, this.textList);
|
|
401
|
+
}
|
|
402
|
+
throw error;
|
|
403
|
+
}
|
|
404
|
+
return new ManifestFilter(`${key}:${values.join(',')}`);
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Filter by a single audio codec.
|
|
408
|
+
*/
|
|
409
|
+
static audioCodec(value) {
|
|
410
|
+
try {
|
|
411
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_AudioCodec(value);
|
|
412
|
+
}
|
|
413
|
+
catch (error) {
|
|
414
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
415
|
+
Error.captureStackTrace(error, this.audioCodec);
|
|
416
|
+
}
|
|
417
|
+
throw error;
|
|
418
|
+
}
|
|
419
|
+
return new ManifestFilter(`audio_codec:${value}`);
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Filter by multiple audio codecs.
|
|
423
|
+
*/
|
|
424
|
+
static audioCodecList(values) {
|
|
425
|
+
return new ManifestFilter(`audio_codec:${values.join(',')}`);
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Filter by a single video codec.
|
|
429
|
+
*/
|
|
430
|
+
static videoCodec(value) {
|
|
431
|
+
try {
|
|
432
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_VideoCodec(value);
|
|
433
|
+
}
|
|
434
|
+
catch (error) {
|
|
435
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
436
|
+
Error.captureStackTrace(error, this.videoCodec);
|
|
437
|
+
}
|
|
438
|
+
throw error;
|
|
439
|
+
}
|
|
440
|
+
return new ManifestFilter(`video_codec:${value}`);
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Filter by multiple video codecs.
|
|
444
|
+
*/
|
|
445
|
+
static videoCodecList(values) {
|
|
446
|
+
return new ManifestFilter(`video_codec:${values.join(',')}`);
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Filter by a single video dynamic range.
|
|
450
|
+
*/
|
|
451
|
+
static videoDynamicRange(value) {
|
|
452
|
+
try {
|
|
453
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_VideoDynamicRange(value);
|
|
454
|
+
}
|
|
455
|
+
catch (error) {
|
|
456
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
457
|
+
Error.captureStackTrace(error, this.videoDynamicRange);
|
|
458
|
+
}
|
|
459
|
+
throw error;
|
|
460
|
+
}
|
|
461
|
+
return new ManifestFilter(`video_dynamic_range:${value}`);
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Filter by multiple video dynamic ranges.
|
|
465
|
+
*/
|
|
466
|
+
static videoDynamicRangeList(values) {
|
|
467
|
+
return new ManifestFilter(`video_dynamic_range:${values.join(',')}`);
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Filter by a single trickplay type.
|
|
471
|
+
*/
|
|
472
|
+
static trickplayType(value) {
|
|
473
|
+
try {
|
|
474
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_TrickplayType(value);
|
|
475
|
+
}
|
|
476
|
+
catch (error) {
|
|
477
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
478
|
+
Error.captureStackTrace(error, this.trickplayType);
|
|
479
|
+
}
|
|
480
|
+
throw error;
|
|
481
|
+
}
|
|
482
|
+
return new ManifestFilter(`trickplay_type:${value}`);
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Filter by multiple trickplay types.
|
|
486
|
+
*/
|
|
487
|
+
static trickplayTypeList(values) {
|
|
488
|
+
return new ManifestFilter(`trickplay_type:${values.join(',')}`);
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* Filter by a combination of numeric ranges and individual values.
|
|
492
|
+
*
|
|
493
|
+
* Use this for advanced patterns like `video_height:240-360,720-1080,1440`.
|
|
494
|
+
*
|
|
495
|
+
* @example
|
|
496
|
+
* ManifestFilter.numericCombo(NumericFilterKey.VIDEO_HEIGHT, [
|
|
497
|
+
* NumericExpression.range(240, 360),
|
|
498
|
+
* NumericExpression.range(720, 1080),
|
|
499
|
+
* NumericExpression.value(1440),
|
|
500
|
+
* ])
|
|
501
|
+
*/
|
|
502
|
+
static numericCombo(key, expressions) {
|
|
503
|
+
try {
|
|
504
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_NumericFilterKey(key);
|
|
505
|
+
}
|
|
506
|
+
catch (error) {
|
|
507
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
508
|
+
Error.captureStackTrace(error, this.numericCombo);
|
|
509
|
+
}
|
|
510
|
+
throw error;
|
|
511
|
+
}
|
|
512
|
+
expressions.forEach(expr => expr._values.forEach(v => validateNumericFilterValue(v, key)));
|
|
513
|
+
return new ManifestFilter(`${key}:${expressions.map(e => e._expression).join(',')}`);
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* Filter by a combination of bitrate ranges and individual values.
|
|
517
|
+
*
|
|
518
|
+
* @example
|
|
519
|
+
* ManifestFilter.bitrateCombo(BitrateFilterKey.VIDEO_BITRATE, [
|
|
520
|
+
* BitrateExpression.range(Bitrate.mbps(1), Bitrate.mbps(3)),
|
|
521
|
+
* BitrateExpression.value(Bitrate.mbps(5)),
|
|
522
|
+
* ])
|
|
523
|
+
*/
|
|
524
|
+
static bitrateCombo(key, expressions) {
|
|
525
|
+
try {
|
|
526
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_BitrateFilterKey(key);
|
|
527
|
+
}
|
|
528
|
+
catch (error) {
|
|
529
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
530
|
+
Error.captureStackTrace(error, this.bitrateCombo);
|
|
531
|
+
}
|
|
532
|
+
throw error;
|
|
533
|
+
}
|
|
534
|
+
expressions.forEach(expr => expr._values.forEach(v => validateBitrateFilterValue(v, key)));
|
|
535
|
+
return new ManifestFilter(`${key}:${expressions.map(e => e._expression).join(',')}`);
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* Specify a custom manifest filter string.
|
|
539
|
+
*/
|
|
540
|
+
static custom(custom) {
|
|
541
|
+
return new ManifestFilter(custom);
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* @param filterString Normalised manifest filter string
|
|
545
|
+
*/
|
|
546
|
+
constructor(filterString) {
|
|
547
|
+
this.filterString = filterString;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
exports.ManifestFilter = ManifestFilter;
|
|
551
|
+
/**
|
|
552
|
+
* Manifest to add to Origin Endpoint
|
|
553
|
+
*/
|
|
554
|
+
class Manifest {
|
|
555
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.Manifest", version: "2.247.0-alpha.0" };
|
|
556
|
+
/**
|
|
557
|
+
* Specify a manifest configuration for Low Latency HLS.
|
|
558
|
+
*
|
|
559
|
+
* **Note:** Low Latency HLS manifests require TS or CMAF container type.
|
|
560
|
+
* Use with `Segment.ts()` or `Segment.cmaf()`.
|
|
561
|
+
*/
|
|
562
|
+
static lowLatencyHLS(manifest) {
|
|
563
|
+
try {
|
|
564
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_LowLatencyHlsManifestConfiguration(manifest);
|
|
565
|
+
}
|
|
566
|
+
catch (error) {
|
|
567
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
568
|
+
Error.captureStackTrace(error, this.lowLatencyHLS);
|
|
569
|
+
}
|
|
570
|
+
throw error;
|
|
571
|
+
}
|
|
572
|
+
return new LowLatencyHlsManifest(manifest);
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* Specify a manifest configuration for HLS.
|
|
576
|
+
*
|
|
577
|
+
* **Note:** HLS manifests require TS or CMAF container type.
|
|
578
|
+
* Use with `Segment.ts()` or `Segment.cmaf()`.
|
|
579
|
+
*/
|
|
580
|
+
static hls(manifest) {
|
|
581
|
+
try {
|
|
582
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_HlsManifestConfiguration(manifest);
|
|
583
|
+
}
|
|
584
|
+
catch (error) {
|
|
585
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
586
|
+
Error.captureStackTrace(error, this.hls);
|
|
587
|
+
}
|
|
588
|
+
throw error;
|
|
589
|
+
}
|
|
590
|
+
return new HlsManifest(manifest);
|
|
591
|
+
}
|
|
592
|
+
/**
|
|
593
|
+
* Specify a manifest configuration for DASH.
|
|
594
|
+
*
|
|
595
|
+
* **Note:** DASH manifests require CMAF container type.
|
|
596
|
+
* Use with `Segment.cmaf()`.
|
|
597
|
+
*/
|
|
598
|
+
static dash(manifest) {
|
|
599
|
+
try {
|
|
600
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_DashManifestConfiguration(manifest);
|
|
601
|
+
}
|
|
602
|
+
catch (error) {
|
|
603
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
604
|
+
Error.captureStackTrace(error, this.dash);
|
|
605
|
+
}
|
|
606
|
+
throw error;
|
|
607
|
+
}
|
|
608
|
+
return new DashManifest(manifest);
|
|
609
|
+
}
|
|
610
|
+
/**
|
|
611
|
+
* Specify a manifest configuration for MSS.
|
|
612
|
+
*
|
|
613
|
+
* **Note:** MSS manifests require ISM container type.
|
|
614
|
+
* Use with `Segment.ism()`.
|
|
615
|
+
*/
|
|
616
|
+
static mss(manifest) {
|
|
617
|
+
try {
|
|
618
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_MssManifestConfiguration(manifest);
|
|
619
|
+
}
|
|
620
|
+
catch (error) {
|
|
621
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
622
|
+
Error.captureStackTrace(error, this.mss);
|
|
623
|
+
}
|
|
624
|
+
throw error;
|
|
625
|
+
}
|
|
626
|
+
return new MssManifest(manifest);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
exports.Manifest = Manifest;
|
|
630
|
+
/**
|
|
631
|
+
* Validate a numeric filter value is an integer within the accepted range for its key.
|
|
632
|
+
* VIDEO_FRAMERATE is excluded — it uses `validateFramerateValue` instead.
|
|
633
|
+
* @internal
|
|
634
|
+
*/
|
|
635
|
+
function validateIntegerFilterValue(value, key, min, max) {
|
|
636
|
+
if (!Number.isInteger(value)) {
|
|
637
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `NumericFilterMustBeInteger`, `Numeric filter value for '${key}' must be an integer, got ${value}`);
|
|
638
|
+
}
|
|
639
|
+
if (value < min || value > max) {
|
|
640
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `NumericFilterOutOfRange`, `Numeric filter value for '${key}' must be between ${min} and ${max}, got ${value}`);
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
/**
|
|
644
|
+
* Validate a video framerate filter value (1–999.999, up to 3 decimal places).
|
|
645
|
+
* @internal
|
|
646
|
+
*/
|
|
647
|
+
function validateFramerateValue(value) {
|
|
648
|
+
if (value < 1 || value > 999.999) {
|
|
649
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `NumericFilterOutOfRange`, `Numeric filter value for 'video_framerate' must be between 1 and 999.999, got ${value}`);
|
|
650
|
+
}
|
|
651
|
+
const decimalPart = value.toString().split('.')[1];
|
|
652
|
+
if (decimalPart && decimalPart.length > 3) {
|
|
653
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `NumericFilterMaxDecimalPlaces`, `Numeric filter value for 'video_framerate' allows up to 3 decimal places, got ${value}`);
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
/**
|
|
657
|
+
* Route numeric validation to the correct helper based on key.
|
|
658
|
+
* @internal
|
|
659
|
+
*/
|
|
660
|
+
function validateNumericFilterValue(value, key) {
|
|
661
|
+
switch (key) {
|
|
662
|
+
case NumericFilterKey.AUDIO_CHANNELS:
|
|
663
|
+
return validateIntegerFilterValue(value, key, 1, 32_767);
|
|
664
|
+
case NumericFilterKey.AUDIO_SAMPLE_RATE:
|
|
665
|
+
return validateIntegerFilterValue(value, key, 0, 2_147_483_647);
|
|
666
|
+
case NumericFilterKey.TRICKPLAY_HEIGHT:
|
|
667
|
+
return validateIntegerFilterValue(value, key, 1, 2_147_483_647);
|
|
668
|
+
case NumericFilterKey.VIDEO_FRAMERATE:
|
|
669
|
+
return validateFramerateValue(value);
|
|
670
|
+
case NumericFilterKey.VIDEO_HEIGHT:
|
|
671
|
+
return validateIntegerFilterValue(value, key, 1, 32_767);
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
/**
|
|
675
|
+
* Validate a bitrate filter value is an integer within the accepted range.
|
|
676
|
+
* @internal
|
|
677
|
+
*/
|
|
678
|
+
function validateBitrateFilterValue(bps, key) {
|
|
679
|
+
if (!Number.isInteger(bps)) {
|
|
680
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `BitrateFilterMustBeInteger`, `Bitrate filter value for '${key}' must resolve to a whole number of bits per second, got ${bps}`);
|
|
681
|
+
}
|
|
682
|
+
if (bps < 0 || bps > 2_147_483_647) {
|
|
683
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `BitrateFilterOutOfRange`, `Bitrate filter value for '${key}' must be between 0 and 2147483647, got ${bps}`);
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
/**
|
|
687
|
+
* Validates common manifest configuration properties
|
|
688
|
+
*/
|
|
689
|
+
function validateManifestConfiguration(config) {
|
|
690
|
+
if (config.manifestWindow && config.manifestWindow.toSeconds() < 30) {
|
|
691
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `ManifestWindowMinimum`, 'Manifest Window has a minimum value of 30 seconds');
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
/**
|
|
695
|
+
* Validate and modify filter configuration
|
|
696
|
+
* @internal
|
|
697
|
+
*/
|
|
698
|
+
function validateFilterConfiguration(filterConfig) {
|
|
699
|
+
if (!filterConfig)
|
|
700
|
+
return undefined;
|
|
701
|
+
if (filterConfig.clipStartTime && (filterConfig.start || filterConfig.end)) {
|
|
702
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `ClipStartTimeConflict`, 'You cannot specify both ClipStartTime with Start or End in a FilterConfiguration.');
|
|
703
|
+
}
|
|
704
|
+
if (filterConfig.timeDelay && (filterConfig.timeDelay.toSeconds() < 0 || filterConfig.timeDelay.toSeconds() > 1209600)) {
|
|
705
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `TimeDelayRange`, 'Time Delay setting should be defined between 0-1209600 seconds.');
|
|
706
|
+
}
|
|
707
|
+
if (filterConfig.start && filterConfig.end && (filterConfig.end <= filterConfig.start)) {
|
|
708
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `EndBeforeStart`, 'The End parameter needs to be after the Start parameter in a FilterConfiguration.');
|
|
709
|
+
}
|
|
710
|
+
const manifestFilter = filterConfig.manifestFilter ? filterConfig.manifestFilter.map(filter => filter.filterString).join(';') : undefined;
|
|
711
|
+
if (manifestFilter != undefined && (manifestFilter.length < 1 || manifestFilter.length > 1024)) {
|
|
712
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `ManifestFilterLength`, 'Manifest filter needs to be between 1-1024 characters in length.');
|
|
713
|
+
}
|
|
714
|
+
if (filterConfig.manifestFilter && filterConfig.manifestFilter.length > 1) {
|
|
715
|
+
const keys = filterConfig.manifestFilter.map(f => f.filterString.split(':')[0]);
|
|
716
|
+
keys.forEach((key, i) => {
|
|
717
|
+
if (keys.indexOf(key) !== i) {
|
|
718
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `DuplicateManifestFilterKey`, `Duplicate manifest filter key '${key}'. Use a single filter with comma-separated values instead (e.g. ManifestFilter.numericList() or ManifestFilter.custom()).`);
|
|
719
|
+
}
|
|
720
|
+
});
|
|
721
|
+
}
|
|
722
|
+
return {
|
|
723
|
+
manifestFilter,
|
|
724
|
+
drmSettings: filterConfig.drmSettings ? filterConfig.drmSettings.filter((v, i, a) => a.indexOf(v) === i).join(';') : undefined,
|
|
725
|
+
clipStartTime: filterConfig.clipStartTime ? (0, shared_helpers_1.convertDateToString)(filterConfig.clipStartTime) : undefined,
|
|
726
|
+
start: filterConfig.start ? (0, shared_helpers_1.convertDateToString)(filterConfig.start) : undefined,
|
|
727
|
+
end: filterConfig.end ? (0, shared_helpers_1.convertDateToString)(filterConfig.end) : undefined,
|
|
728
|
+
timeDelaySeconds: filterConfig.timeDelay?.toSeconds(),
|
|
729
|
+
};
|
|
730
|
+
}
|
|
731
|
+
/**
|
|
732
|
+
* Validate startTag configuration
|
|
733
|
+
* @internal
|
|
734
|
+
*/
|
|
735
|
+
function validateStartTag(startTag, manifestWindow, segmentDuration) {
|
|
736
|
+
const timeOffset = startTag.timeOffset;
|
|
737
|
+
// Get segment duration (default is 6 seconds if not specified)
|
|
738
|
+
const segmentDurationSec = segmentDuration?.toSeconds() ?? 6;
|
|
739
|
+
// Get manifest duration (default is 60 seconds if not specified)
|
|
740
|
+
const manifestDurationSec = manifestWindow?.toSeconds() ?? 60;
|
|
741
|
+
// Validate positive offset (from start)
|
|
742
|
+
if (timeOffset > 0) {
|
|
743
|
+
const maxPositiveOffset = manifestDurationSec - (3 * segmentDurationSec);
|
|
744
|
+
if (timeOffset >= maxPositiveOffset) {
|
|
745
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `StartTagPositiveOffsetExceeded`, `StartTag timeOffset (${timeOffset}s) must be less than manifest duration (${manifestDurationSec}s) minus 3 times segment duration (${segmentDurationSec}s). Maximum allowed: ${maxPositiveOffset}s`);
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
// Validate negative offset (from live edge)
|
|
749
|
+
if (timeOffset < 0) {
|
|
750
|
+
const absOffset = Math.abs(timeOffset);
|
|
751
|
+
const minNegativeOffset = 3 * segmentDurationSec;
|
|
752
|
+
if (absOffset <= minNegativeOffset) {
|
|
753
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `StartTagNegativeOffsetTooSmall`, `StartTag timeOffset (${timeOffset}s) absolute value must be greater than 3 times segment duration (${segmentDurationSec}s). Minimum allowed: -${minNegativeOffset + 0.01}s`);
|
|
754
|
+
}
|
|
755
|
+
if (absOffset >= manifestDurationSec) {
|
|
756
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `StartTagNegativeOffsetExceedsManifest`, `StartTag timeOffset (${timeOffset}s) absolute value must be less than manifest duration (${manifestDurationSec}s)`);
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
/**
|
|
761
|
+
* Build HLS manifest configuration
|
|
762
|
+
* @internal
|
|
763
|
+
*/
|
|
764
|
+
function buildHlsManifestConfiguration(config, segmentDuration) {
|
|
765
|
+
if (config.startTag) {
|
|
766
|
+
validateStartTag(config.startTag, config.manifestWindow, segmentDuration);
|
|
767
|
+
}
|
|
768
|
+
return {
|
|
769
|
+
manifestName: config.manifestName,
|
|
770
|
+
childManifestName: config.childManifestName,
|
|
771
|
+
manifestWindowSeconds: config.manifestWindow?.toSeconds(),
|
|
772
|
+
programDateTimeIntervalSeconds: config.programDateTimeInterval?.toSeconds(),
|
|
773
|
+
scteHls: config.scteAdMarkerHls ? { adMarkerHls: config.scteAdMarkerHls } : undefined,
|
|
774
|
+
startTag: config.startTag,
|
|
775
|
+
urlEncodeChildManifest: config.urlEncodeChildManifest,
|
|
776
|
+
filterConfiguration: validateFilterConfiguration(config.filterConfiguration),
|
|
777
|
+
};
|
|
778
|
+
}
|
|
779
|
+
/**
|
|
780
|
+
* Build DASH manifest configuration
|
|
781
|
+
* @internal
|
|
782
|
+
*/
|
|
783
|
+
function buildDashManifestConfiguration(config, segment) {
|
|
784
|
+
if (config.minBufferTime && (config.minBufferTime.toSeconds() < 1 || config.minBufferTime.toSeconds() > 3600)) {
|
|
785
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `MinBufferTimeRange`, 'Min buffer time has a range from 1 sec. to 3600 sec.');
|
|
786
|
+
}
|
|
787
|
+
if (config.minUpdatePeriod && (config.minUpdatePeriod.toSeconds() < 1 || config.minUpdatePeriod.toSeconds() > 3600)) {
|
|
788
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `MinUpdatePeriodRange`, 'Min update period option has a range from 1 sec. to 3600 sec.');
|
|
789
|
+
}
|
|
790
|
+
if (config.scteDashAdMarker && (!segment?.scteFilter || segment.scteFilter?.length === 0)) {
|
|
791
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `ScteFilterRequired`, 'SCTE Filter must be configured with DashAdMarker Configuration');
|
|
792
|
+
}
|
|
793
|
+
return {
|
|
794
|
+
manifestName: config.manifestName,
|
|
795
|
+
baseUrls: config.baseUrls,
|
|
796
|
+
compactness: config.compactness,
|
|
797
|
+
drmSignaling: config.drmSignalling,
|
|
798
|
+
dvbSettings: config.dvbSettings,
|
|
799
|
+
profiles: config.profiles,
|
|
800
|
+
programInformation: config.programInformation,
|
|
801
|
+
subtitleConfiguration: config.subtitleConfiguration,
|
|
802
|
+
manifestWindowSeconds: config.manifestWindow?.toSeconds(),
|
|
803
|
+
minBufferTimeSeconds: config.minBufferTime?.toSeconds(),
|
|
804
|
+
minUpdatePeriodSeconds: config.minUpdatePeriod?.toSeconds(),
|
|
805
|
+
suggestedPresentationDelaySeconds: config.suggestedPresentationDelay?.toSeconds(),
|
|
806
|
+
segmentTemplateFormat: config.segmentTemplateFormat,
|
|
807
|
+
periodTriggers: config.periodTriggers,
|
|
808
|
+
scteDash: segment?.scteFilter ? {
|
|
809
|
+
adMarkerDash: config.scteDashAdMarker,
|
|
810
|
+
} : undefined,
|
|
811
|
+
utcTiming: config.utcTimingMode || config.utcTimingSource ? {
|
|
812
|
+
timingMode: config.utcTimingMode,
|
|
813
|
+
timingSource: config.utcTimingSource,
|
|
814
|
+
} : undefined,
|
|
815
|
+
filterConfiguration: validateFilterConfiguration(config.filterConfiguration),
|
|
816
|
+
};
|
|
817
|
+
}
|
|
818
|
+
/**
|
|
819
|
+
* Build MSS manifest configuration
|
|
820
|
+
* @internal
|
|
821
|
+
*/
|
|
822
|
+
function buildMssManifestConfiguration(config) {
|
|
823
|
+
return {
|
|
824
|
+
manifestName: config.manifestName,
|
|
825
|
+
manifestLayout: config.manifestLayout,
|
|
826
|
+
manifestWindowSeconds: config.manifestWindow?.toSeconds(),
|
|
827
|
+
filterConfiguration: validateFilterConfiguration(config.filterConfiguration),
|
|
828
|
+
};
|
|
829
|
+
}
|
|
830
|
+
/**
|
|
831
|
+
* HLS Manifest implementation
|
|
832
|
+
*/
|
|
833
|
+
class HlsManifest extends Manifest {
|
|
834
|
+
config;
|
|
835
|
+
constructor(config) {
|
|
836
|
+
super();
|
|
837
|
+
this.config = config;
|
|
838
|
+
}
|
|
839
|
+
_bind(context) {
|
|
840
|
+
validateManifestConfiguration(this.config);
|
|
841
|
+
context.hlsManifests.push(buildHlsManifestConfiguration(this.config, context.segment?.segmentDuration));
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
/**
|
|
845
|
+
* Low Latency HLS Manifest implementation
|
|
846
|
+
*/
|
|
847
|
+
class LowLatencyHlsManifest extends Manifest {
|
|
848
|
+
config;
|
|
849
|
+
constructor(config) {
|
|
850
|
+
super();
|
|
851
|
+
this.config = config;
|
|
852
|
+
}
|
|
853
|
+
_bind(context) {
|
|
854
|
+
validateManifestConfiguration(this.config);
|
|
855
|
+
context.llHlsManifests.push(buildHlsManifestConfiguration(this.config, context.segment?.segmentDuration));
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
/**
|
|
859
|
+
* DASH Manifest implementation
|
|
860
|
+
*/
|
|
861
|
+
class DashManifest extends Manifest {
|
|
862
|
+
config;
|
|
863
|
+
constructor(config) {
|
|
864
|
+
super();
|
|
865
|
+
this.config = config;
|
|
866
|
+
}
|
|
867
|
+
_bind(context) {
|
|
868
|
+
validateManifestConfiguration(this.config);
|
|
869
|
+
if (this.config.utcTimingMode === DashUtcTimingMode.UTC_DIRECT && this.config.utcTimingSource) {
|
|
870
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `UtcDirectTimingSource`, 'UTC Direct configured with a timing source, ensure timing source is undefined to use UTC Direct.');
|
|
871
|
+
}
|
|
872
|
+
context.dashManifests.push(buildDashManifestConfiguration(this.config, context.segment));
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
/**
|
|
876
|
+
* MSS Manifest implementation
|
|
877
|
+
*/
|
|
878
|
+
class MssManifest extends Manifest {
|
|
879
|
+
config;
|
|
880
|
+
constructor(config) {
|
|
881
|
+
super();
|
|
882
|
+
this.config = config;
|
|
883
|
+
}
|
|
884
|
+
_bind(context) {
|
|
885
|
+
validateManifestConfiguration(this.config);
|
|
886
|
+
context.mssManifests.push(buildMssManifestConfiguration(this.config));
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
/**
|
|
890
|
+
* The type of container to attach to this origin endpoint.
|
|
891
|
+
* A container type is a file format that encapsulates one or more media streams, such as audio and video, into a single file. You can't change the container type after you create the endpoint.
|
|
892
|
+
*/
|
|
893
|
+
var ContainerType;
|
|
894
|
+
(function (ContainerType) {
|
|
895
|
+
/**
|
|
896
|
+
* TS Container Type
|
|
897
|
+
*/
|
|
898
|
+
ContainerType["TS"] = "TS";
|
|
899
|
+
/**
|
|
900
|
+
* CMAF Container Type
|
|
901
|
+
*/
|
|
902
|
+
ContainerType["CMAF"] = "CMAF";
|
|
903
|
+
/**
|
|
904
|
+
* ISM Container Type (Microsoft Smooth Streaming)
|
|
905
|
+
*/
|
|
906
|
+
ContainerType["ISM"] = "ISM";
|
|
907
|
+
})(ContainerType || (exports.ContainerType = ContainerType = {}));
|
|
908
|
+
/**
|
|
909
|
+
* Encryption methods for CMAF container type.
|
|
910
|
+
*/
|
|
911
|
+
var CmafEncryptionMethod;
|
|
912
|
+
(function (CmafEncryptionMethod) {
|
|
913
|
+
/**
|
|
914
|
+
* Common Encryption Scheme (CENC) - compatible with PlayReady, Widevine, and Irdeto DRM systems.
|
|
915
|
+
*/
|
|
916
|
+
CmafEncryptionMethod["CENC"] = "CENC";
|
|
917
|
+
/**
|
|
918
|
+
* Common Encryption Scheme with CBCS mode - compatible with PlayReady, Widevine, and FairPlay DRM systems.
|
|
919
|
+
*/
|
|
920
|
+
CmafEncryptionMethod["CBCS"] = "CBCS";
|
|
921
|
+
})(CmafEncryptionMethod || (exports.CmafEncryptionMethod = CmafEncryptionMethod = {}));
|
|
922
|
+
/**
|
|
923
|
+
* Encryption methods for TS container type.
|
|
924
|
+
*/
|
|
925
|
+
var TsEncryptionMethod;
|
|
926
|
+
(function (TsEncryptionMethod) {
|
|
927
|
+
/**
|
|
928
|
+
* AES-128 encryption - requires Clear Key AES 128 DRM system.
|
|
929
|
+
*/
|
|
930
|
+
TsEncryptionMethod["AES_128"] = "AES_128";
|
|
931
|
+
/**
|
|
932
|
+
* Sample-level AES encryption - requires FairPlay DRM system.
|
|
933
|
+
*/
|
|
934
|
+
TsEncryptionMethod["SAMPLE_AES"] = "SAMPLE_AES";
|
|
935
|
+
})(TsEncryptionMethod || (exports.TsEncryptionMethod = TsEncryptionMethod = {}));
|
|
936
|
+
/**
|
|
937
|
+
* A collection of audio encryption presets.
|
|
938
|
+
*/
|
|
939
|
+
var PresetSpeke20Audio;
|
|
940
|
+
(function (PresetSpeke20Audio) {
|
|
941
|
+
/**
|
|
942
|
+
* Use one content key to encrypt all of the audio tracks in your stream.
|
|
943
|
+
*/
|
|
944
|
+
PresetSpeke20Audio["PRESET_AUDIO_1"] = "PRESET_AUDIO_1";
|
|
945
|
+
/**
|
|
946
|
+
* Use one content key to encrypt all of the stereo audio tracks and one content key to encrypt all of the multichannel audio tracks.
|
|
947
|
+
*/
|
|
948
|
+
PresetSpeke20Audio["PRESET_AUDIO_2"] = "PRESET_AUDIO_2";
|
|
949
|
+
/**
|
|
950
|
+
* Use one content key to encrypt all of the stereo audio tracks, one content key to encrypt all of the multichannel audio tracks with 3 to 6 channels,
|
|
951
|
+
* and one content key to encrypt all of the multichannel audio tracks with more than 6 channels.
|
|
952
|
+
*/
|
|
953
|
+
PresetSpeke20Audio["PRESET_AUDIO_3"] = "PRESET_AUDIO_3";
|
|
954
|
+
/**
|
|
955
|
+
* Use the same content key for all of the audio and video tracks in your stream.
|
|
956
|
+
*/
|
|
957
|
+
PresetSpeke20Audio["SHARED"] = "SHARED";
|
|
958
|
+
/**
|
|
959
|
+
* Don't encrypt any of the audio tracks in your stream.
|
|
960
|
+
*/
|
|
961
|
+
PresetSpeke20Audio["UNENCRYPTED"] = "UNENCRYPTED";
|
|
962
|
+
})(PresetSpeke20Audio || (exports.PresetSpeke20Audio = PresetSpeke20Audio = {}));
|
|
963
|
+
/**
|
|
964
|
+
* The SPEKE Version 2.0 preset video associated with the encryption contract configuration of the origin endpoint.
|
|
965
|
+
*
|
|
966
|
+
* A collection of video encryption presets.
|
|
967
|
+
*/
|
|
968
|
+
var PresetSpeke20Video;
|
|
969
|
+
(function (PresetSpeke20Video) {
|
|
970
|
+
/**
|
|
971
|
+
* Use one content key to encrypt all of the video tracks in your stream.
|
|
972
|
+
*/
|
|
973
|
+
PresetSpeke20Video["PRESET_VIDEO_1"] = "PRESET_VIDEO_1";
|
|
974
|
+
/**
|
|
975
|
+
* Use one content key to encrypt all of the SD video tracks and one content key for all HD and higher resolutions video tracks.
|
|
976
|
+
*/
|
|
977
|
+
PresetSpeke20Video["PRESET_VIDEO_2"] = "PRESET_VIDEO_2";
|
|
978
|
+
/**
|
|
979
|
+
* Use one content key to encrypt all of the SD video tracks, one content key for HD video tracks and one content key for all UHD video tracks.
|
|
980
|
+
*/
|
|
981
|
+
PresetSpeke20Video["PRESET_VIDEO_3"] = "PRESET_VIDEO_3";
|
|
982
|
+
/**
|
|
983
|
+
* Use one content key to encrypt all of the SD video tracks, one content key for HD video tracks,
|
|
984
|
+
* one content key for all UHD1 video tracks and one content key for all UHD2 video tracks.
|
|
985
|
+
*/
|
|
986
|
+
PresetSpeke20Video["PRESET_VIDEO_4"] = "PRESET_VIDEO_4";
|
|
987
|
+
/**
|
|
988
|
+
* Use one content key to encrypt all of the SD video tracks, one content key for HD1 video tracks, one content key for HD2 video tracks,
|
|
989
|
+
* one content key for all UHD1 video tracks and one content key for all UHD2 video tracks.
|
|
990
|
+
*/
|
|
991
|
+
PresetSpeke20Video["PRESET_VIDEO_5"] = "PRESET_VIDEO_5";
|
|
992
|
+
/**
|
|
993
|
+
* Use one content key to encrypt all of the SD video tracks, one content key for HD1 video tracks, one content key for HD2 video tracks
|
|
994
|
+
* and one content key for all UHD video tracks.
|
|
995
|
+
*/
|
|
996
|
+
PresetSpeke20Video["PRESET_VIDEO_6"] = "PRESET_VIDEO_6";
|
|
997
|
+
/**
|
|
998
|
+
* Use one content key to encrypt all of the SD+HD1 video tracks, one content key for HD2 video tracks and one content key for all UHD video tracks.
|
|
999
|
+
*/
|
|
1000
|
+
PresetSpeke20Video["PRESET_VIDEO_7"] = "PRESET_VIDEO_7";
|
|
1001
|
+
/**
|
|
1002
|
+
* Use one content key to encrypt all of the SD+HD1 video tracks, one content key for HD2 video tracks, one content key for all UHD1
|
|
1003
|
+
* video tracks and one content key for all UHD2 video tracks.
|
|
1004
|
+
*/
|
|
1005
|
+
PresetSpeke20Video["PRESET_VIDEO_8"] = "PRESET_VIDEO_8";
|
|
1006
|
+
/**
|
|
1007
|
+
* Use the same content key for all of the video and audio tracks in your stream.
|
|
1008
|
+
*/
|
|
1009
|
+
PresetSpeke20Video["SHARED"] = "SHARED";
|
|
1010
|
+
/**
|
|
1011
|
+
* Don't encrypt any of the video tracks in your stream.
|
|
1012
|
+
*/
|
|
1013
|
+
PresetSpeke20Video["UNENCRYPTED"] = "UNENCRYPTED";
|
|
1014
|
+
})(PresetSpeke20Video || (exports.PresetSpeke20Video = PresetSpeke20Video = {}));
|
|
1015
|
+
/**
|
|
1016
|
+
* Endpoint error configuration options.
|
|
1017
|
+
*/
|
|
1018
|
+
var EndpointErrorConfiguration;
|
|
1019
|
+
(function (EndpointErrorConfiguration) {
|
|
1020
|
+
/**
|
|
1021
|
+
* The manifest stalled and there are no new segments or parts.
|
|
1022
|
+
*/
|
|
1023
|
+
EndpointErrorConfiguration["STALE_MANIFEST"] = "STALE_MANIFEST";
|
|
1024
|
+
/**
|
|
1025
|
+
* There is a gap in the manifest.
|
|
1026
|
+
*/
|
|
1027
|
+
EndpointErrorConfiguration["INCOMPLETE_MANIFEST"] = "INCOMPLETE_MANIFEST";
|
|
1028
|
+
/**
|
|
1029
|
+
* Key rotation is enabled but we're unable to fetch the key for the current key period.
|
|
1030
|
+
*/
|
|
1031
|
+
EndpointErrorConfiguration["MISSING_DRM_KEY"] = "MISSING_DRM_KEY";
|
|
1032
|
+
/**
|
|
1033
|
+
* The segments which contain slate content are considered to be missing content.
|
|
1034
|
+
*/
|
|
1035
|
+
EndpointErrorConfiguration["SLATE_INPUT"] = "SLATE_INPUT";
|
|
1036
|
+
})(EndpointErrorConfiguration || (exports.EndpointErrorConfiguration = EndpointErrorConfiguration = {}));
|
|
1037
|
+
/**
|
|
1038
|
+
* SCTE-35 message type options available.
|
|
1039
|
+
*/
|
|
1040
|
+
var ScteMessageType;
|
|
1041
|
+
(function (ScteMessageType) {
|
|
1042
|
+
/**
|
|
1043
|
+
* Option for SPLICE_INSERT.
|
|
1044
|
+
*/
|
|
1045
|
+
ScteMessageType["SPLICE_INSERT"] = "SPLICE_INSERT";
|
|
1046
|
+
/**
|
|
1047
|
+
* Option for BREAK.
|
|
1048
|
+
*/
|
|
1049
|
+
ScteMessageType["BREAK"] = "BREAK";
|
|
1050
|
+
/**
|
|
1051
|
+
* Option for PROVIDER_ADVERTISEMENT.
|
|
1052
|
+
*/
|
|
1053
|
+
ScteMessageType["PROVIDER_ADVERTISEMENT"] = "PROVIDER_ADVERTISEMENT";
|
|
1054
|
+
/**
|
|
1055
|
+
* Option for DISTRIBUTOR_ADVERTISEMENT.
|
|
1056
|
+
*/
|
|
1057
|
+
ScteMessageType["DISTRIBUTOR_ADVERTISEMENT"] = "DISTRIBUTOR_ADVERTISEMENT";
|
|
1058
|
+
/**
|
|
1059
|
+
* Option for PROVIDER_PLACEMENT_OPPORTUNITY.
|
|
1060
|
+
*/
|
|
1061
|
+
ScteMessageType["PROVIDER_PLACEMENT_OPPORTUNITY"] = "PROVIDER_PLACEMENT_OPPORTUNITY";
|
|
1062
|
+
/**
|
|
1063
|
+
* Option for DISTRIBUTOR_PLACEMENT_OPPORTUNITY.
|
|
1064
|
+
*/
|
|
1065
|
+
ScteMessageType["DISTRIBUTOR_PLACEMENT_OPPORTUNITY"] = "DISTRIBUTOR_PLACEMENT_OPPORTUNITY";
|
|
1066
|
+
/**
|
|
1067
|
+
* Option for PROVIDER_OVERLAY_PLACEMENT_OPPORTUNITY.
|
|
1068
|
+
*/
|
|
1069
|
+
ScteMessageType["PROVIDER_OVERLAY_PLACEMENT_OPPORTUNITY"] = "PROVIDER_OVERLAY_PLACEMENT_OPPORTUNITY";
|
|
1070
|
+
/**
|
|
1071
|
+
* Option for DISTRIBUTOR_OVERLAY_PLACEMENT_OPPORTUNITY.
|
|
1072
|
+
*/
|
|
1073
|
+
ScteMessageType["DISTRIBUTOR_OVERLAY_PLACEMENT_OPPORTUNITY"] = "DISTRIBUTOR_OVERLAY_PLACEMENT_OPPORTUNITY";
|
|
1074
|
+
/**
|
|
1075
|
+
* Option for PROGRAM.
|
|
1076
|
+
*/
|
|
1077
|
+
ScteMessageType["PROGRAM"] = "PROGRAM";
|
|
1078
|
+
})(ScteMessageType || (exports.ScteMessageType = ScteMessageType = {}));
|
|
1079
|
+
/**
|
|
1080
|
+
* Controls whether SCTE-35 messages are included in segment files.
|
|
1081
|
+
*/
|
|
1082
|
+
var ScteInSegments;
|
|
1083
|
+
(function (ScteInSegments) {
|
|
1084
|
+
/**
|
|
1085
|
+
* SCTE-35 messages are not included in segments.
|
|
1086
|
+
*/
|
|
1087
|
+
ScteInSegments["NONE"] = "NONE";
|
|
1088
|
+
/**
|
|
1089
|
+
* SCTE-35 messages are embedded in segment data.
|
|
1090
|
+
*
|
|
1091
|
+
* For DASH manifests, when set to ALL, an InbandEventStream tag signals
|
|
1092
|
+
* that SCTE messages are present in segments.
|
|
1093
|
+
*/
|
|
1094
|
+
ScteInSegments["ALL"] = "ALL";
|
|
1095
|
+
})(ScteInSegments || (exports.ScteInSegments = ScteInSegments = {}));
|
|
1096
|
+
/**
|
|
1097
|
+
* DRM settings keys for manifest filter configuration.
|
|
1098
|
+
*/
|
|
1099
|
+
var DrmSettingsKey;
|
|
1100
|
+
(function (DrmSettingsKey) {
|
|
1101
|
+
/**
|
|
1102
|
+
* Exclude EXT-X-SESSION-KEY tags from HLS and LL-HLS multivariant playlists.
|
|
1103
|
+
*
|
|
1104
|
+
* This can improve compatibility with legacy HLS clients that have issues
|
|
1105
|
+
* processing session keys, or provide more granular access control when
|
|
1106
|
+
* using manifest filtering.
|
|
1107
|
+
*/
|
|
1108
|
+
DrmSettingsKey["EXCLUDE_SESSION_KEYS"] = "exclude_session_keys";
|
|
1109
|
+
})(DrmSettingsKey || (exports.DrmSettingsKey = DrmSettingsKey = {}));
|
|
1110
|
+
/**
|
|
1111
|
+
* Helper class for creating EXT-X-START tags in HLS playlists.
|
|
1112
|
+
*
|
|
1113
|
+
* The EXT-X-START tag indicates a preferred point at which to start playing a playlist.
|
|
1114
|
+
*/
|
|
1115
|
+
class StartTag {
|
|
1116
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.StartTag", version: "2.247.0-alpha.0" };
|
|
1117
|
+
/**
|
|
1118
|
+
* Create a start tag with a time offset.
|
|
1119
|
+
*
|
|
1120
|
+
* @param timeOffset The time offset in seconds. Can be positive (forward from start) or negative (back from live edge).
|
|
1121
|
+
* - If positive: must be less than (manifest duration - 3 × segment duration)
|
|
1122
|
+
* - If negative: absolute value must be greater than (3 × segment duration) and less than manifest duration
|
|
1123
|
+
* @param options Additional options
|
|
1124
|
+
*/
|
|
1125
|
+
static of(timeOffset, options) {
|
|
1126
|
+
try {
|
|
1127
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_StartTagOptions(options);
|
|
1128
|
+
}
|
|
1129
|
+
catch (error) {
|
|
1130
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
1131
|
+
Error.captureStackTrace(error, this.of);
|
|
1132
|
+
}
|
|
1133
|
+
throw error;
|
|
1134
|
+
}
|
|
1135
|
+
return {
|
|
1136
|
+
timeOffset,
|
|
1137
|
+
precise: options && options.precise !== undefined ? options.precise : undefined,
|
|
1138
|
+
};
|
|
1139
|
+
}
|
|
1140
|
+
/**
|
|
1141
|
+
* Create a start tag with precise positioning enabled (PRECISE=YES).
|
|
1142
|
+
*
|
|
1143
|
+
* @param timeOffset The time offset in seconds (positive or negative)
|
|
1144
|
+
*/
|
|
1145
|
+
static withPrecise(timeOffset) {
|
|
1146
|
+
return {
|
|
1147
|
+
timeOffset,
|
|
1148
|
+
precise: true,
|
|
1149
|
+
};
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
exports.StartTag = StartTag;
|
|
1153
|
+
/**
|
|
1154
|
+
* Choose how ad markers are included in the packaged content.
|
|
1155
|
+
*/
|
|
1156
|
+
var AdMarkerDash;
|
|
1157
|
+
(function (AdMarkerDash) {
|
|
1158
|
+
/**
|
|
1159
|
+
* Option for BINARY - The SCTE-35 marker is expressed as a hex-string (Base64 string) rather than full XML.
|
|
1160
|
+
*/
|
|
1161
|
+
AdMarkerDash["BINARY"] = "BINARY";
|
|
1162
|
+
/**
|
|
1163
|
+
* Option for XML - The SCTE marker is expressed fully in XML.
|
|
1164
|
+
*/
|
|
1165
|
+
AdMarkerDash["XML"] = "XML";
|
|
1166
|
+
})(AdMarkerDash || (exports.AdMarkerDash = AdMarkerDash = {}));
|
|
1167
|
+
/**
|
|
1168
|
+
* Choose how SCTE-35 ad markers are included in HLS and LL-HLS manifests.
|
|
1169
|
+
*/
|
|
1170
|
+
var AdMarkerHls;
|
|
1171
|
+
(function (AdMarkerHls) {
|
|
1172
|
+
/**
|
|
1173
|
+
* Insert EXT-X-DATERANGE tags to signal ad content.
|
|
1174
|
+
*/
|
|
1175
|
+
AdMarkerHls["DATERANGE"] = "DATERANGE";
|
|
1176
|
+
/**
|
|
1177
|
+
* Insert enhanced SCTE-35 tags for ad content.
|
|
1178
|
+
*/
|
|
1179
|
+
AdMarkerHls["SCTE35_ENHANCED"] = "SCTE35_ENHANCED";
|
|
1180
|
+
})(AdMarkerHls || (exports.AdMarkerHls = AdMarkerHls = {}));
|
|
1181
|
+
/**
|
|
1182
|
+
* The type of variable that MediaPackage uses in the media attribute of the SegmentTemplate tag.
|
|
1183
|
+
*/
|
|
1184
|
+
var SegmentTemplateFormat;
|
|
1185
|
+
(function (SegmentTemplateFormat) {
|
|
1186
|
+
/**
|
|
1187
|
+
* Option for number with timeline.
|
|
1188
|
+
*/
|
|
1189
|
+
SegmentTemplateFormat["NUMBER_WITH_TIMELINE"] = "NUMBER_WITH_TIMELINE";
|
|
1190
|
+
})(SegmentTemplateFormat || (exports.SegmentTemplateFormat = SegmentTemplateFormat = {}));
|
|
1191
|
+
/**
|
|
1192
|
+
* The UTC timing mode for DASH.
|
|
1193
|
+
*/
|
|
1194
|
+
var DashUtcTimingMode;
|
|
1195
|
+
(function (DashUtcTimingMode) {
|
|
1196
|
+
/**
|
|
1197
|
+
* Option for HTTP_HEAD.
|
|
1198
|
+
*/
|
|
1199
|
+
DashUtcTimingMode["HTTP_HEAD"] = "HTTP_HEAD";
|
|
1200
|
+
/**
|
|
1201
|
+
* Option for HTTP_ISO.
|
|
1202
|
+
*/
|
|
1203
|
+
DashUtcTimingMode["HTTP_ISO"] = "HTTP_ISO";
|
|
1204
|
+
/**
|
|
1205
|
+
* Option for HTTP_XSDATE.
|
|
1206
|
+
*/
|
|
1207
|
+
DashUtcTimingMode["HTTP_XSDATE"] = "HTTP_XSDATE";
|
|
1208
|
+
/**
|
|
1209
|
+
* Option for UTC_DIRECT.
|
|
1210
|
+
*/
|
|
1211
|
+
DashUtcTimingMode["UTC_DIRECT"] = "UTC_DIRECT";
|
|
1212
|
+
})(DashUtcTimingMode || (exports.DashUtcTimingMode = DashUtcTimingMode = {}));
|
|
1213
|
+
/**
|
|
1214
|
+
* Options for triggers which cause AWS Elemental MediaPackage to create media presentation description (MPD) periods in the output manifest.
|
|
1215
|
+
*/
|
|
1216
|
+
var DashPeriodTriggers;
|
|
1217
|
+
(function (DashPeriodTriggers) {
|
|
1218
|
+
/**
|
|
1219
|
+
* Option for AVAILS.
|
|
1220
|
+
*/
|
|
1221
|
+
DashPeriodTriggers["AVAILS"] = "AVAILS";
|
|
1222
|
+
/**
|
|
1223
|
+
* Option for DRM_KEY_ROTATION.
|
|
1224
|
+
*/
|
|
1225
|
+
DashPeriodTriggers["DRM_KEY_ROTATION"] = "DRM_KEY_ROTATION";
|
|
1226
|
+
/**
|
|
1227
|
+
* Option for SOURCE_CHANGES.
|
|
1228
|
+
*/
|
|
1229
|
+
DashPeriodTriggers["SOURCE_CHANGES"] = "SOURCE_CHANGES";
|
|
1230
|
+
/**
|
|
1231
|
+
* Option for SOURCE_DISRUPTIONS.
|
|
1232
|
+
*/
|
|
1233
|
+
DashPeriodTriggers["SOURCE_DISRUPTIONS"] = "SOURCE_DISRUPTIONS";
|
|
1234
|
+
/**
|
|
1235
|
+
* Option for NONE.
|
|
1236
|
+
*/
|
|
1237
|
+
DashPeriodTriggers["NONE"] = "NONE";
|
|
1238
|
+
})(DashPeriodTriggers || (exports.DashPeriodTriggers = DashPeriodTriggers = {}));
|
|
1239
|
+
/**
|
|
1240
|
+
* DRM signaling determines the way DASH manifest signals the DRM content.
|
|
1241
|
+
*/
|
|
1242
|
+
var DrmSignalling;
|
|
1243
|
+
(function (DrmSignalling) {
|
|
1244
|
+
/**
|
|
1245
|
+
* Option for INDIVIDUAL.
|
|
1246
|
+
*/
|
|
1247
|
+
DrmSignalling["INDIVIDUAL"] = "INDIVIDUAL";
|
|
1248
|
+
/**
|
|
1249
|
+
* Option for REFERENCED.
|
|
1250
|
+
*/
|
|
1251
|
+
DrmSignalling["REFERENCED"] = "REFERENCED";
|
|
1252
|
+
})(DrmSignalling || (exports.DrmSignalling = DrmSignalling = {}));
|
|
1253
|
+
/**
|
|
1254
|
+
* STANDARD indicates a default manifest, which is compacted. NONE indicates a full manifest.
|
|
1255
|
+
*/
|
|
1256
|
+
var DashManifestCompactness;
|
|
1257
|
+
(function (DashManifestCompactness) {
|
|
1258
|
+
/**
|
|
1259
|
+
* STANDARD
|
|
1260
|
+
*/
|
|
1261
|
+
DashManifestCompactness["STANDARD"] = "STANDARD";
|
|
1262
|
+
/**
|
|
1263
|
+
* NONE
|
|
1264
|
+
*/
|
|
1265
|
+
DashManifestCompactness["NONE"] = "NONE";
|
|
1266
|
+
})(DashManifestCompactness || (exports.DashManifestCompactness = DashManifestCompactness = {}));
|
|
1267
|
+
/**
|
|
1268
|
+
* Options for TTML Profile
|
|
1269
|
+
*/
|
|
1270
|
+
var TtmlProfile;
|
|
1271
|
+
(function (TtmlProfile) {
|
|
1272
|
+
/**
|
|
1273
|
+
* IMSC_1
|
|
1274
|
+
*/
|
|
1275
|
+
TtmlProfile["IMSC_1"] = "IMSC_1";
|
|
1276
|
+
/**
|
|
1277
|
+
* EBU_TT_D_101
|
|
1278
|
+
*/
|
|
1279
|
+
TtmlProfile["EBU_TT_D_101"] = "EBU_TT_D_101";
|
|
1280
|
+
})(TtmlProfile || (exports.TtmlProfile = TtmlProfile = {}));
|
|
1281
|
+
/**
|
|
1282
|
+
* The layout of the MSS manifest.
|
|
1283
|
+
*/
|
|
1284
|
+
var MssManifestLayout;
|
|
1285
|
+
(function (MssManifestLayout) {
|
|
1286
|
+
/**
|
|
1287
|
+
* Full manifest layout.
|
|
1288
|
+
*/
|
|
1289
|
+
MssManifestLayout["FULL"] = "FULL";
|
|
1290
|
+
/**
|
|
1291
|
+
* Compact manifest layout.
|
|
1292
|
+
*/
|
|
1293
|
+
MssManifestLayout["COMPACT"] = "COMPACT";
|
|
1294
|
+
})(MssManifestLayout || (exports.MssManifestLayout = MssManifestLayout = {}));
|
|
1295
|
+
/**
|
|
1296
|
+
* DRM systems available for CMAF encryption.
|
|
1297
|
+
*
|
|
1298
|
+
* CENC supports PlayReady, Widevine, and Irdeto.
|
|
1299
|
+
* CBCS supports PlayReady, Widevine, and FairPlay.
|
|
1300
|
+
*/
|
|
1301
|
+
var CmafDrmSystem;
|
|
1302
|
+
(function (CmafDrmSystem) {
|
|
1303
|
+
/**
|
|
1304
|
+
* FairPlay DRM - used with CBCS encryption.
|
|
1305
|
+
*/
|
|
1306
|
+
CmafDrmSystem["FAIRPLAY"] = "FAIRPLAY";
|
|
1307
|
+
/**
|
|
1308
|
+
* PlayReady DRM - used with CENC and CBCS encryption.
|
|
1309
|
+
*/
|
|
1310
|
+
CmafDrmSystem["PLAYREADY"] = "PLAYREADY";
|
|
1311
|
+
/**
|
|
1312
|
+
* Widevine DRM - used with CENC and CBCS encryption.
|
|
1313
|
+
*/
|
|
1314
|
+
CmafDrmSystem["WIDEVINE"] = "WIDEVINE";
|
|
1315
|
+
/**
|
|
1316
|
+
* Irdeto DRM - used with CENC encryption.
|
|
1317
|
+
*/
|
|
1318
|
+
CmafDrmSystem["IRDETO"] = "IRDETO";
|
|
1319
|
+
})(CmafDrmSystem || (exports.CmafDrmSystem = CmafDrmSystem = {}));
|
|
1320
|
+
/**
|
|
1321
|
+
* DRM systems available for TS encryption.
|
|
1322
|
+
*
|
|
1323
|
+
* SAMPLE_AES uses FairPlay, AES_128 uses Clear Key AES 128.
|
|
1324
|
+
*/
|
|
1325
|
+
var TsDrmSystem;
|
|
1326
|
+
(function (TsDrmSystem) {
|
|
1327
|
+
/**
|
|
1328
|
+
* FairPlay DRM - used with SAMPLE_AES encryption.
|
|
1329
|
+
*/
|
|
1330
|
+
TsDrmSystem["FAIRPLAY"] = "FAIRPLAY";
|
|
1331
|
+
/**
|
|
1332
|
+
* Clear Key AES 128 - used with AES_128 encryption.
|
|
1333
|
+
*/
|
|
1334
|
+
TsDrmSystem["CLEAR_KEY_AES_128"] = "CLEAR_KEY_AES_128";
|
|
1335
|
+
})(TsDrmSystem || (exports.TsDrmSystem = TsDrmSystem = {}));
|
|
1336
|
+
/**
|
|
1337
|
+
* DRM systems available for ISM encryption.
|
|
1338
|
+
*
|
|
1339
|
+
* ISM only supports PlayReady with CENC.
|
|
1340
|
+
*/
|
|
1341
|
+
var IsmDrmSystem;
|
|
1342
|
+
(function (IsmDrmSystem) {
|
|
1343
|
+
/**
|
|
1344
|
+
* PlayReady DRM.
|
|
1345
|
+
*/
|
|
1346
|
+
IsmDrmSystem["PLAYREADY"] = "PLAYREADY";
|
|
1347
|
+
})(IsmDrmSystem || (exports.IsmDrmSystem = IsmDrmSystem = {}));
|
|
1348
|
+
/**
|
|
1349
|
+
* Base class for encryption configurations.
|
|
1350
|
+
*
|
|
1351
|
+
* Use `CmafEncryption.speke()`, `TsEncryption.speke()`, or `IsmEncryption.speke()` to create instances.
|
|
1352
|
+
*/
|
|
1353
|
+
class EncryptionConfiguration {
|
|
1354
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.EncryptionConfiguration", version: "2.247.0-alpha.0" };
|
|
1355
|
+
}
|
|
1356
|
+
exports.EncryptionConfiguration = EncryptionConfiguration;
|
|
1357
|
+
/**
|
|
1358
|
+
* Encryption configuration for CMAF segments.
|
|
1359
|
+
*
|
|
1360
|
+
* Use `CmafEncryption.speke()` to create an instance.
|
|
1361
|
+
*/
|
|
1362
|
+
class CmafEncryption extends EncryptionConfiguration {
|
|
1363
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.CmafEncryption", version: "2.247.0-alpha.0" };
|
|
1364
|
+
/**
|
|
1365
|
+
* Create a SPEKE-based encryption configuration for CMAF segments.
|
|
1366
|
+
*/
|
|
1367
|
+
static speke(props) {
|
|
1368
|
+
try {
|
|
1369
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_CmafSpekeEncryptionProps(props);
|
|
1370
|
+
}
|
|
1371
|
+
catch (error) {
|
|
1372
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
1373
|
+
Error.captureStackTrace(error, this.speke);
|
|
1374
|
+
}
|
|
1375
|
+
throw error;
|
|
1376
|
+
}
|
|
1377
|
+
if (!props.url.startsWith('https://')) {
|
|
1378
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `SpekeUrlHttpsRequired`, 'SPEKE key provider URL must use HTTPS.');
|
|
1379
|
+
}
|
|
1380
|
+
if (props.method === CmafEncryptionMethod.CENC && props.drmSystems.includes(CmafDrmSystem.FAIRPLAY)) {
|
|
1381
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `CencFairPlayIncompatible`, 'CENC encryption method does not support FairPlay. Use CBCS for FairPlay.');
|
|
1382
|
+
}
|
|
1383
|
+
if (props.method === CmafEncryptionMethod.CBCS && props.drmSystems.includes(CmafDrmSystem.IRDETO)) {
|
|
1384
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `CbcsIrdetoIncompatible`, 'CBCS encryption method does not support Irdeto. Use CENC for Irdeto.');
|
|
1385
|
+
}
|
|
1386
|
+
return new CmafEncryption(props);
|
|
1387
|
+
}
|
|
1388
|
+
config;
|
|
1389
|
+
constructor(props) {
|
|
1390
|
+
super();
|
|
1391
|
+
this.config = props;
|
|
1392
|
+
}
|
|
1393
|
+
/** @internal */
|
|
1394
|
+
_bind(scope) {
|
|
1395
|
+
const p = this.config;
|
|
1396
|
+
if (p.constantInitializationVector && p.constantInitializationVector.length !== 32) {
|
|
1397
|
+
throw new core_1.ValidationError((0, helpers_internal_1.lit) `ConstantInitVectorLength`, 'Constant Initialization Vector needs to be 32 characters in length.', scope);
|
|
1398
|
+
}
|
|
1399
|
+
if (p.keyRotationInterval && (p.keyRotationInterval.toSeconds() < 300 || p.keyRotationInterval.toSeconds() > 31536000)) {
|
|
1400
|
+
throw new core_1.ValidationError((0, helpers_internal_1.lit) `KeyRotationIntervalRange`, 'Key Rotation Interval needs to be between 300-31536000 seconds.', scope);
|
|
1401
|
+
}
|
|
1402
|
+
return {
|
|
1403
|
+
cmafExcludeSegmentDrmMetadata: p.excludeSegmentDrmMetadata,
|
|
1404
|
+
constantInitializationVector: p.constantInitializationVector,
|
|
1405
|
+
keyRotationIntervalSeconds: p.keyRotationInterval?.toSeconds(),
|
|
1406
|
+
encryptionMethod: { cmafEncryptionMethod: p.method },
|
|
1407
|
+
spekeKeyProvider: {
|
|
1408
|
+
certificateArn: p.certificate?.certificateArn,
|
|
1409
|
+
drmSystems: p.drmSystems,
|
|
1410
|
+
encryptionContractConfiguration: {
|
|
1411
|
+
presetSpeke20Audio: p.audioPreset ?? PresetSpeke20Audio.PRESET_AUDIO_1,
|
|
1412
|
+
presetSpeke20Video: p.videoPreset ?? PresetSpeke20Video.PRESET_VIDEO_1,
|
|
1413
|
+
},
|
|
1414
|
+
url: p.url,
|
|
1415
|
+
resourceId: p.resourceId,
|
|
1416
|
+
roleArn: p.role.roleArn,
|
|
1417
|
+
},
|
|
1418
|
+
};
|
|
1419
|
+
}
|
|
1420
|
+
/** @internal */
|
|
1421
|
+
_getRole() { return this.config.role; }
|
|
1422
|
+
/** @internal */
|
|
1423
|
+
_getCertificate() { return this.config.certificate; }
|
|
1424
|
+
}
|
|
1425
|
+
exports.CmafEncryption = CmafEncryption;
|
|
1426
|
+
/**
|
|
1427
|
+
* Encryption configuration for TS segments.
|
|
1428
|
+
*
|
|
1429
|
+
* Use `TsEncryption.speke()` to create an instance.
|
|
1430
|
+
*/
|
|
1431
|
+
class TsEncryption extends EncryptionConfiguration {
|
|
1432
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.TsEncryption", version: "2.247.0-alpha.0" };
|
|
1433
|
+
/**
|
|
1434
|
+
* Create a SPEKE-based encryption configuration for TS segments.
|
|
1435
|
+
*/
|
|
1436
|
+
static speke(props) {
|
|
1437
|
+
try {
|
|
1438
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_TsSpekeEncryptionProps(props);
|
|
1439
|
+
}
|
|
1440
|
+
catch (error) {
|
|
1441
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
1442
|
+
Error.captureStackTrace(error, this.speke);
|
|
1443
|
+
}
|
|
1444
|
+
throw error;
|
|
1445
|
+
}
|
|
1446
|
+
if (!props.url.startsWith('https://')) {
|
|
1447
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `SpekeUrlHttpsRequired`, 'SPEKE key provider URL must use HTTPS.');
|
|
1448
|
+
}
|
|
1449
|
+
return new TsEncryption(props);
|
|
1450
|
+
}
|
|
1451
|
+
config;
|
|
1452
|
+
constructor(props) {
|
|
1453
|
+
super();
|
|
1454
|
+
this.config = props;
|
|
1455
|
+
}
|
|
1456
|
+
/** @internal */
|
|
1457
|
+
_bind(scope) {
|
|
1458
|
+
const p = this.config;
|
|
1459
|
+
const defaultDrm = p.method === TsEncryptionMethod.SAMPLE_AES
|
|
1460
|
+
? [TsDrmSystem.FAIRPLAY] : [TsDrmSystem.CLEAR_KEY_AES_128];
|
|
1461
|
+
if (p.constantInitializationVector && p.constantInitializationVector.length !== 32) {
|
|
1462
|
+
throw new core_1.ValidationError((0, helpers_internal_1.lit) `ConstantInitVectorLength`, 'Constant Initialization Vector needs to be 32 characters in length.', scope);
|
|
1463
|
+
}
|
|
1464
|
+
if (p.keyRotationInterval && (p.keyRotationInterval.toSeconds() < 300 || p.keyRotationInterval.toSeconds() > 31536000)) {
|
|
1465
|
+
throw new core_1.ValidationError((0, helpers_internal_1.lit) `KeyRotationIntervalRange`, 'Key Rotation Interval needs to be between 300-31536000 seconds.', scope);
|
|
1466
|
+
}
|
|
1467
|
+
return {
|
|
1468
|
+
constantInitializationVector: p.constantInitializationVector,
|
|
1469
|
+
keyRotationIntervalSeconds: p.keyRotationInterval?.toSeconds(),
|
|
1470
|
+
encryptionMethod: { tsEncryptionMethod: p.method },
|
|
1471
|
+
spekeKeyProvider: {
|
|
1472
|
+
certificateArn: p.certificate?.certificateArn,
|
|
1473
|
+
drmSystems: (p.drmSystems ?? defaultDrm).map(d => d.toString()),
|
|
1474
|
+
encryptionContractConfiguration: {
|
|
1475
|
+
presetSpeke20Audio: p.audioPreset ?? PresetSpeke20Audio.PRESET_AUDIO_1,
|
|
1476
|
+
presetSpeke20Video: p.videoPreset ?? PresetSpeke20Video.PRESET_VIDEO_1,
|
|
1477
|
+
},
|
|
1478
|
+
url: p.url,
|
|
1479
|
+
resourceId: p.resourceId,
|
|
1480
|
+
roleArn: p.role.roleArn,
|
|
1481
|
+
},
|
|
1482
|
+
};
|
|
1483
|
+
}
|
|
1484
|
+
/** @internal */
|
|
1485
|
+
_getRole() { return this.config.role; }
|
|
1486
|
+
/** @internal */
|
|
1487
|
+
_getCertificate() { return this.config.certificate; }
|
|
1488
|
+
}
|
|
1489
|
+
exports.TsEncryption = TsEncryption;
|
|
1490
|
+
/**
|
|
1491
|
+
* Encryption configuration for ISM (Microsoft Smooth Streaming) segments.
|
|
1492
|
+
*
|
|
1493
|
+
* ISM only supports CENC encryption with PlayReady DRM.
|
|
1494
|
+
* Audio and video presets are always SHARED.
|
|
1495
|
+
*
|
|
1496
|
+
* Use `IsmEncryption.speke()` to create an instance.
|
|
1497
|
+
*/
|
|
1498
|
+
class IsmEncryption extends EncryptionConfiguration {
|
|
1499
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.IsmEncryption", version: "2.247.0-alpha.0" };
|
|
1500
|
+
/**
|
|
1501
|
+
* Create a SPEKE-based encryption configuration for ISM segments.
|
|
1502
|
+
*/
|
|
1503
|
+
static speke(props) {
|
|
1504
|
+
try {
|
|
1505
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_IsmSpekeEncryptionProps(props);
|
|
1506
|
+
}
|
|
1507
|
+
catch (error) {
|
|
1508
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
1509
|
+
Error.captureStackTrace(error, this.speke);
|
|
1510
|
+
}
|
|
1511
|
+
throw error;
|
|
1512
|
+
}
|
|
1513
|
+
if (!props.url.startsWith('https://')) {
|
|
1514
|
+
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `SpekeUrlHttpsRequired`, 'SPEKE key provider URL must use HTTPS.');
|
|
1515
|
+
}
|
|
1516
|
+
return new IsmEncryption(props);
|
|
1517
|
+
}
|
|
1518
|
+
config;
|
|
1519
|
+
constructor(props) {
|
|
1520
|
+
super();
|
|
1521
|
+
this.config = props;
|
|
1522
|
+
}
|
|
1523
|
+
/** @internal */
|
|
1524
|
+
_bind(_scope) {
|
|
1525
|
+
const p = this.config;
|
|
1526
|
+
return {
|
|
1527
|
+
encryptionMethod: { ismEncryptionMethod: 'CENC' },
|
|
1528
|
+
spekeKeyProvider: {
|
|
1529
|
+
certificateArn: p.certificate?.certificateArn,
|
|
1530
|
+
drmSystems: (p.drmSystems ?? [IsmDrmSystem.PLAYREADY]).map(d => d.toString()),
|
|
1531
|
+
encryptionContractConfiguration: {
|
|
1532
|
+
presetSpeke20Audio: PresetSpeke20Audio.SHARED,
|
|
1533
|
+
presetSpeke20Video: PresetSpeke20Video.SHARED,
|
|
1534
|
+
},
|
|
1535
|
+
url: p.url,
|
|
1536
|
+
resourceId: p.resourceId,
|
|
1537
|
+
roleArn: p.role.roleArn,
|
|
1538
|
+
},
|
|
1539
|
+
};
|
|
1540
|
+
}
|
|
1541
|
+
/** @internal */
|
|
1542
|
+
_getRole() { return this.config.role; }
|
|
1543
|
+
/** @internal */
|
|
1544
|
+
_getCertificate() { return this.config.certificate; }
|
|
1545
|
+
}
|
|
1546
|
+
exports.IsmEncryption = IsmEncryption;
|
|
1547
|
+
/**
|
|
1548
|
+
* Helper class for creating segment configurations.
|
|
1549
|
+
*/
|
|
1550
|
+
class Segment {
|
|
1551
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.Segment", version: "2.247.0-alpha.0" };
|
|
1552
|
+
/**
|
|
1553
|
+
* Create a TS (Transport Stream) segment configuration.
|
|
1554
|
+
*
|
|
1555
|
+
* Use this for endpoints with ContainerType.TS.
|
|
1556
|
+
*/
|
|
1557
|
+
static ts(props = {}) {
|
|
1558
|
+
try {
|
|
1559
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_TsSegmentProps(props);
|
|
1560
|
+
}
|
|
1561
|
+
catch (error) {
|
|
1562
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
1563
|
+
Error.captureStackTrace(error, this.ts);
|
|
1564
|
+
}
|
|
1565
|
+
throw error;
|
|
1566
|
+
}
|
|
1567
|
+
return {
|
|
1568
|
+
containerType: ContainerType.TS,
|
|
1569
|
+
includeIframeOnlyStreams: props.includeIframeOnlyStreams,
|
|
1570
|
+
scteFilter: props.scteFilter,
|
|
1571
|
+
scteInSegments: props.scteInSegments,
|
|
1572
|
+
segmentDuration: props.duration,
|
|
1573
|
+
segmentName: props.name,
|
|
1574
|
+
tsIncludeDvbSubtitles: props.includeDvbSubtitles,
|
|
1575
|
+
tsUseAudioRenditionGroup: props.useAudioRenditionGroup,
|
|
1576
|
+
encryption: props.encryption,
|
|
1577
|
+
};
|
|
1578
|
+
}
|
|
1579
|
+
/**
|
|
1580
|
+
* Create a CMAF segment configuration.
|
|
1581
|
+
*
|
|
1582
|
+
* Use this for endpoints with ContainerType.CMAF.
|
|
1583
|
+
*/
|
|
1584
|
+
static cmaf(props = {}) {
|
|
1585
|
+
try {
|
|
1586
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_CmafSegmentProps(props);
|
|
1587
|
+
}
|
|
1588
|
+
catch (error) {
|
|
1589
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
1590
|
+
Error.captureStackTrace(error, this.cmaf);
|
|
1591
|
+
}
|
|
1592
|
+
throw error;
|
|
1593
|
+
}
|
|
1594
|
+
return {
|
|
1595
|
+
containerType: ContainerType.CMAF,
|
|
1596
|
+
includeIframeOnlyStreams: props.includeIframeOnlyStreams,
|
|
1597
|
+
scteFilter: props.scteFilter,
|
|
1598
|
+
scteInSegments: props.scteInSegments,
|
|
1599
|
+
segmentDuration: props.duration,
|
|
1600
|
+
segmentName: props.name,
|
|
1601
|
+
encryption: props.encryption,
|
|
1602
|
+
};
|
|
1603
|
+
}
|
|
1604
|
+
/**
|
|
1605
|
+
* Create an ISM (Microsoft Smooth Streaming) segment configuration.
|
|
1606
|
+
*
|
|
1607
|
+
* Use this for endpoints with ContainerType.ISM.
|
|
1608
|
+
*/
|
|
1609
|
+
static ism(props = {}) {
|
|
1610
|
+
try {
|
|
1611
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_IsmSegmentProps(props);
|
|
1612
|
+
}
|
|
1613
|
+
catch (error) {
|
|
1614
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
1615
|
+
Error.captureStackTrace(error, this.ism);
|
|
1616
|
+
}
|
|
1617
|
+
throw error;
|
|
1618
|
+
}
|
|
1619
|
+
return {
|
|
1620
|
+
containerType: ContainerType.ISM,
|
|
1621
|
+
includeIframeOnlyStreams: props.includeIframeOnlyStreams,
|
|
1622
|
+
segmentDuration: props.duration,
|
|
1623
|
+
segmentName: props.name,
|
|
1624
|
+
encryption: props.encryption,
|
|
1625
|
+
};
|
|
1626
|
+
}
|
|
1627
|
+
}
|
|
1628
|
+
exports.Segment = Segment;
|
|
1629
|
+
class OriginEndpointBase extends aws_cdk_lib_1.Resource {
|
|
1630
|
+
/**
|
|
1631
|
+
* Creates an OriginEndpoint construct that represents an external (imported) Origin Endpoint.
|
|
1632
|
+
*/
|
|
1633
|
+
static fromOriginEndpointAttributes(scope, id, attrs) {
|
|
1634
|
+
class Import extends OriginEndpointBase {
|
|
1635
|
+
hlsManifests = [];
|
|
1636
|
+
llHlsManifests = [];
|
|
1637
|
+
dashManifests = [];
|
|
1638
|
+
mssManifests = [];
|
|
1639
|
+
segment;
|
|
1640
|
+
policy = undefined;
|
|
1641
|
+
channelGroupName = attrs.channelGroupName;
|
|
1642
|
+
channelName = attrs.channelName;
|
|
1643
|
+
originEndpointName = attrs.originEndpointName;
|
|
1644
|
+
createdAt = undefined;
|
|
1645
|
+
modifiedAt = undefined;
|
|
1646
|
+
hlsManifestUrls = undefined;
|
|
1647
|
+
lowLatencyHlsManifestUrls = undefined;
|
|
1648
|
+
dashManifestUrls = undefined;
|
|
1649
|
+
mssManifestUrls = undefined;
|
|
1650
|
+
autoCreatePolicy = false;
|
|
1651
|
+
originEndpointArn = aws_cdk_lib_1.Stack.of(this).formatArn({
|
|
1652
|
+
service: 'mediapackagev2',
|
|
1653
|
+
resource: `channelGroup/${attrs.channelGroupName}/channel/${this.channelName}/originEndpoint`,
|
|
1654
|
+
arnFormat: aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME,
|
|
1655
|
+
resourceName: this.originEndpointName,
|
|
1656
|
+
});
|
|
1657
|
+
}
|
|
1658
|
+
return new Import(scope, id);
|
|
1659
|
+
}
|
|
1660
|
+
/**
|
|
1661
|
+
* A reference to this Origin Endpoint resource.
|
|
1662
|
+
* Required by the auto-generated IOriginEndpointRef interface.
|
|
1663
|
+
*/
|
|
1664
|
+
get originEndpointRef() {
|
|
1665
|
+
return {
|
|
1666
|
+
originEndpointArn: this.originEndpointArn,
|
|
1667
|
+
};
|
|
1668
|
+
}
|
|
1669
|
+
/**
|
|
1670
|
+
* CDN authorization configuration to be applied when the policy is created.
|
|
1671
|
+
*/
|
|
1672
|
+
cdnAuthConfig;
|
|
1673
|
+
/**
|
|
1674
|
+
* Set CDN auth config. Used by subclass constructors.
|
|
1675
|
+
* @internal
|
|
1676
|
+
*/
|
|
1677
|
+
_setCdnAuth(cdnAuth) {
|
|
1678
|
+
if (!this.cdnAuthConfig) {
|
|
1679
|
+
this.cdnAuthConfig = cdnAuth;
|
|
1680
|
+
}
|
|
1681
|
+
}
|
|
1682
|
+
/**
|
|
1683
|
+
* Configure origin endpoint policy.
|
|
1684
|
+
*
|
|
1685
|
+
* You can only add 1 OriginEndpointPolicy to an OriginEndpoint.
|
|
1686
|
+
* If you have already defined one, it will append to the policy already created.
|
|
1687
|
+
*
|
|
1688
|
+
* @param statement - The policy statement to add
|
|
1689
|
+
* @param cdnAuth - Optional CDN authorization configuration. If provided, the policy will be
|
|
1690
|
+
* created with CDN authentication enabled using secrets from AWS Secrets Manager.
|
|
1691
|
+
* If cdnAuth is provided multiple times, only the first configuration is used.
|
|
1692
|
+
*/
|
|
1693
|
+
addToResourcePolicy(statement, cdnAuth) {
|
|
1694
|
+
// Store CDN auth config if provided (only if not already set)
|
|
1695
|
+
if (cdnAuth && !this.cdnAuthConfig) {
|
|
1696
|
+
this.cdnAuthConfig = cdnAuth;
|
|
1697
|
+
}
|
|
1698
|
+
if (!this.policy && this.autoCreatePolicy) {
|
|
1699
|
+
this.policy = new origin_endpoint_policy_1.OriginEndpointPolicy(this, 'Policy', {
|
|
1700
|
+
originEndpoint: this,
|
|
1701
|
+
cdnAuth: this.cdnAuthConfig,
|
|
1702
|
+
});
|
|
1703
|
+
}
|
|
1704
|
+
if (this.policy) {
|
|
1705
|
+
this.policy.document.addStatements(statement);
|
|
1706
|
+
return { statementAdded: true, policyDependable: this.policy };
|
|
1707
|
+
}
|
|
1708
|
+
return { statementAdded: false };
|
|
1709
|
+
}
|
|
1710
|
+
/**
|
|
1711
|
+
* Validate and modify Segment configuration for endpoint.
|
|
1712
|
+
*/
|
|
1713
|
+
segmentValidation(segmentContainerType, segment) {
|
|
1714
|
+
if (segment?.segmentDuration && (segment.segmentDuration?.toSeconds() < 1 || segment.segmentDuration?.toSeconds() > 30)) {
|
|
1715
|
+
throw new core_1.ValidationError((0, helpers_internal_1.lit) `SegmentDurationRange`, 'Segment Duration needs to be between 1-30 seconds.', this);
|
|
1716
|
+
}
|
|
1717
|
+
if (segmentContainerType != ContainerType.TS && (segment?.tsIncludeDvbSubtitles || segment?.tsUseAudioRenditionGroup)) {
|
|
1718
|
+
throw new core_1.ValidationError((0, helpers_internal_1.lit) `TsOptionsIncompatible`, 'Disable TS Segment options for DvbSubtitles and AudioRenditionGroups when using CMAF.', this);
|
|
1719
|
+
}
|
|
1720
|
+
return {
|
|
1721
|
+
includeIframeOnlyStreams: segment?.includeIframeOnlyStreams,
|
|
1722
|
+
segmentDurationSeconds: segment?.segmentDuration?.toSeconds(),
|
|
1723
|
+
segmentName: segment?.segmentName,
|
|
1724
|
+
tsIncludeDvbSubtitles: segment?.tsIncludeDvbSubtitles,
|
|
1725
|
+
tsUseAudioRenditionGroup: segment?.tsUseAudioRenditionGroup,
|
|
1726
|
+
scte: (segment?.scteFilter || segment?.scteInSegments) ? {
|
|
1727
|
+
scteFilter: segment?.scteFilter,
|
|
1728
|
+
scteInSegments: segment?.scteInSegments,
|
|
1729
|
+
} : undefined,
|
|
1730
|
+
encryption: segment?.encryption?._bind(this),
|
|
1731
|
+
};
|
|
1732
|
+
}
|
|
1733
|
+
/**
|
|
1734
|
+
* Create a CloudWatch metric.
|
|
1735
|
+
*
|
|
1736
|
+
* @param metricName name of the metric.
|
|
1737
|
+
* @param props metric options.
|
|
1738
|
+
*/
|
|
1739
|
+
metric(metricName, props) {
|
|
1740
|
+
return new aws_cloudwatch_1.Metric({
|
|
1741
|
+
metricName,
|
|
1742
|
+
namespace: 'AWS/MediaPackage',
|
|
1743
|
+
dimensionsMap: {
|
|
1744
|
+
ChannelGroup: this.channelGroupName,
|
|
1745
|
+
Channel: this.channelName,
|
|
1746
|
+
OriginEndpoint: this.originEndpointName,
|
|
1747
|
+
},
|
|
1748
|
+
...props,
|
|
1749
|
+
}).attachTo(this);
|
|
1750
|
+
}
|
|
1751
|
+
/**
|
|
1752
|
+
* Returns Metric for Ingress Bytes
|
|
1753
|
+
*
|
|
1754
|
+
* @default - sum over 60 seconds
|
|
1755
|
+
*/
|
|
1756
|
+
metricIngressBytes(props) {
|
|
1757
|
+
return this.metric('IngressBytes', {
|
|
1758
|
+
statistic: 'sum',
|
|
1759
|
+
period: aws_cdk_lib_1.Duration.seconds(60),
|
|
1760
|
+
unit: aws_cloudwatch_1.Unit.BYTES,
|
|
1761
|
+
...props,
|
|
1762
|
+
});
|
|
1763
|
+
}
|
|
1764
|
+
/**
|
|
1765
|
+
* Returns Metric for Egress Bytes
|
|
1766
|
+
*
|
|
1767
|
+
* @default - sum over 60 seconds
|
|
1768
|
+
*/
|
|
1769
|
+
metricEgressBytes(props) {
|
|
1770
|
+
return this.metric('EgressBytes', {
|
|
1771
|
+
statistic: 'sum',
|
|
1772
|
+
period: aws_cdk_lib_1.Duration.seconds(60),
|
|
1773
|
+
unit: aws_cloudwatch_1.Unit.BYTES,
|
|
1774
|
+
...props,
|
|
1775
|
+
});
|
|
1776
|
+
}
|
|
1777
|
+
/**
|
|
1778
|
+
* Returns Metric for Ingress response time
|
|
1779
|
+
*
|
|
1780
|
+
* @default - average over 60 seconds
|
|
1781
|
+
*/
|
|
1782
|
+
metricIngressResponseTime(props) {
|
|
1783
|
+
return this.metric('IngressResponseTime', {
|
|
1784
|
+
statistic: 'avg',
|
|
1785
|
+
period: aws_cdk_lib_1.Duration.seconds(60),
|
|
1786
|
+
unit: aws_cloudwatch_1.Unit.MILLISECONDS,
|
|
1787
|
+
...props,
|
|
1788
|
+
});
|
|
1789
|
+
}
|
|
1790
|
+
/**
|
|
1791
|
+
* Returns Metric for Egress Response time
|
|
1792
|
+
*
|
|
1793
|
+
* @default - average over 60 seconds
|
|
1794
|
+
*/
|
|
1795
|
+
metricEgressResponseTime(props) {
|
|
1796
|
+
return this.metric('EgressResponseTime', {
|
|
1797
|
+
statistic: 'avg',
|
|
1798
|
+
period: aws_cdk_lib_1.Duration.seconds(60),
|
|
1799
|
+
unit: aws_cloudwatch_1.Unit.MILLISECONDS,
|
|
1800
|
+
...props,
|
|
1801
|
+
});
|
|
1802
|
+
}
|
|
1803
|
+
/**
|
|
1804
|
+
* Returns Metric for Egress Request Count
|
|
1805
|
+
*
|
|
1806
|
+
* @default - sum over 60 seconds
|
|
1807
|
+
*/
|
|
1808
|
+
metricEgressRequestCount(props) {
|
|
1809
|
+
return this.metric('EgressRequestCount', {
|
|
1810
|
+
statistic: 'sum',
|
|
1811
|
+
period: aws_cdk_lib_1.Duration.seconds(60),
|
|
1812
|
+
unit: aws_cloudwatch_1.Unit.COUNT,
|
|
1813
|
+
...props,
|
|
1814
|
+
});
|
|
1815
|
+
}
|
|
1816
|
+
/**
|
|
1817
|
+
* Returns Metric for Ingress Request Count
|
|
1818
|
+
*
|
|
1819
|
+
* @default - sum over 60 seconds
|
|
1820
|
+
*/
|
|
1821
|
+
metricIngressRequestCount(props) {
|
|
1822
|
+
return this.metric('IngressRequestCount', {
|
|
1823
|
+
statistic: 'sum',
|
|
1824
|
+
period: aws_cdk_lib_1.Duration.seconds(60),
|
|
1825
|
+
unit: aws_cloudwatch_1.Unit.COUNT,
|
|
1826
|
+
...props,
|
|
1827
|
+
});
|
|
1828
|
+
}
|
|
1829
|
+
}
|
|
1830
|
+
/**
|
|
1831
|
+
* Defines an AWS Elemental MediaPackage V2 Origin Endpoint
|
|
1832
|
+
*/
|
|
1833
|
+
let OriginEndpoint = (() => {
|
|
1834
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
1835
|
+
let _classDescriptor;
|
|
1836
|
+
let _classExtraInitializers = [];
|
|
1837
|
+
let _classThis;
|
|
1838
|
+
let _classSuper = OriginEndpointBase;
|
|
1839
|
+
var OriginEndpoint = class extends _classSuper {
|
|
1840
|
+
static { _classThis = this; }
|
|
1841
|
+
static {
|
|
1842
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
1843
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
1844
|
+
OriginEndpoint = _classThis = _classDescriptor.value;
|
|
1845
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
1846
|
+
}
|
|
1847
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.OriginEndpoint", version: "2.247.0-alpha.0" };
|
|
1848
|
+
/** Uniquely identifies this class. */
|
|
1849
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-mediapackagev2-alpha.OriginEndpoint';
|
|
1850
|
+
channelGroupName;
|
|
1851
|
+
channelName;
|
|
1852
|
+
originEndpointName;
|
|
1853
|
+
originEndpointArn;
|
|
1854
|
+
/**
|
|
1855
|
+
* The timestamp of the creation of the origin endpoint.
|
|
1856
|
+
*/
|
|
1857
|
+
createdAt;
|
|
1858
|
+
/**
|
|
1859
|
+
* The timestamp of the modification of the origin endpoint.
|
|
1860
|
+
*/
|
|
1861
|
+
modifiedAt;
|
|
1862
|
+
/**
|
|
1863
|
+
* Array containing Low Latency HLS Manifests created by the OriginEndpoint.
|
|
1864
|
+
*/
|
|
1865
|
+
lowLatencyHlsManifestUrls;
|
|
1866
|
+
/**
|
|
1867
|
+
* Array containing HLS Manifests created by the OriginEndpoint.
|
|
1868
|
+
*/
|
|
1869
|
+
hlsManifestUrls;
|
|
1870
|
+
/**
|
|
1871
|
+
* Array containing DASH Manifests created by the OriginEndpoint.
|
|
1872
|
+
*/
|
|
1873
|
+
dashManifestUrls;
|
|
1874
|
+
/**
|
|
1875
|
+
* Array containing MSS Manifests created by the OriginEndpoint.
|
|
1876
|
+
*/
|
|
1877
|
+
mssManifestUrls;
|
|
1878
|
+
/**
|
|
1879
|
+
* The resource policy associated with this origin endpoint.
|
|
1880
|
+
*
|
|
1881
|
+
* If `autoCreatePolicy` is true, an `OriginEndpointPolicy` will be created upon the
|
|
1882
|
+
* first call to addToResourcePolicy(s).
|
|
1883
|
+
*/
|
|
1884
|
+
policy;
|
|
1885
|
+
autoCreatePolicy = true;
|
|
1886
|
+
hlsManifests = [];
|
|
1887
|
+
llHlsManifests = [];
|
|
1888
|
+
dashManifests = [];
|
|
1889
|
+
mssManifests = [];
|
|
1890
|
+
segment;
|
|
1891
|
+
constructor(scope, id, props) {
|
|
1892
|
+
super(scope, id, {
|
|
1893
|
+
physicalName: props?.originEndpointName ?? aws_cdk_lib_1.Lazy.string({
|
|
1894
|
+
produce: () => aws_cdk_lib_1.Names.uniqueResourceName(this, {
|
|
1895
|
+
maxLength: 256,
|
|
1896
|
+
}),
|
|
1897
|
+
}),
|
|
1898
|
+
});
|
|
1899
|
+
try {
|
|
1900
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_OriginEndpointProps(props);
|
|
1901
|
+
}
|
|
1902
|
+
catch (error) {
|
|
1903
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
1904
|
+
Error.captureStackTrace(error, OriginEndpoint);
|
|
1905
|
+
}
|
|
1906
|
+
throw error;
|
|
1907
|
+
}
|
|
1908
|
+
// Enhanced CDK Analytics Telemetry
|
|
1909
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
1910
|
+
// Validate originEndpointName if provided
|
|
1911
|
+
if (props.originEndpointName != null && !aws_cdk_lib_1.Token.isUnresolved(props.originEndpointName)) {
|
|
1912
|
+
if (props.originEndpointName.length < 1 || props.originEndpointName.length > 256) {
|
|
1913
|
+
throw new core_1.ValidationError((0, helpers_internal_1.lit) `OriginEndpointNameLength`, 'Origin endpoint name must be between 1 and 256 characters in length.', this);
|
|
1914
|
+
}
|
|
1915
|
+
if (!props.originEndpointName.match(/^[a-zA-Z0-9_-]+$/)) {
|
|
1916
|
+
throw new core_1.ValidationError((0, helpers_internal_1.lit) `OriginEndpointNamePattern`, 'Origin endpoint name must only contain alphanumeric characters, hyphens, and underscores.', this);
|
|
1917
|
+
}
|
|
1918
|
+
}
|
|
1919
|
+
// Validate description if provided
|
|
1920
|
+
if (props.description && !aws_cdk_lib_1.Token.isUnresolved(props.description) && props.description.length > 1024) {
|
|
1921
|
+
throw new core_1.ValidationError((0, helpers_internal_1.lit) `OriginEndpointDescriptionLength`, 'Origin endpoint description must not exceed 1024 characters.', this);
|
|
1922
|
+
}
|
|
1923
|
+
this.segment = props.segment;
|
|
1924
|
+
// Get container type from segment
|
|
1925
|
+
const containerType = props.segment.containerType;
|
|
1926
|
+
if (props?.startoverWindow && (props.startoverWindow.toSeconds() < 60 || props.startoverWindow.toSeconds() > 1209600)) {
|
|
1927
|
+
throw new core_1.ValidationError((0, helpers_internal_1.lit) `StartoverWindowRange`, 'Startover Window needs to be between 60-1209600 seconds.', this);
|
|
1928
|
+
}
|
|
1929
|
+
props.manifests.forEach(manifest => {
|
|
1930
|
+
manifest._bind({
|
|
1931
|
+
hlsManifests: this.hlsManifests,
|
|
1932
|
+
llHlsManifests: this.llHlsManifests,
|
|
1933
|
+
dashManifests: this.dashManifests,
|
|
1934
|
+
mssManifests: this.mssManifests,
|
|
1935
|
+
segment: props.segment,
|
|
1936
|
+
});
|
|
1937
|
+
});
|
|
1938
|
+
// Validate manifest and container type compatibility
|
|
1939
|
+
if (this.mssManifests.length > 0 && containerType !== ContainerType.ISM) {
|
|
1940
|
+
throw new core_1.ValidationError((0, helpers_internal_1.lit) `MssRequiresIsm`, 'MSS manifests require ISM container type. Use Segment.ism() for MSS manifests.', this);
|
|
1941
|
+
}
|
|
1942
|
+
if (this.dashManifests.length > 0 && containerType !== ContainerType.CMAF) {
|
|
1943
|
+
throw new core_1.ValidationError((0, helpers_internal_1.lit) `DashRequiresCmaf`, 'DASH manifests require CMAF container type. Use Segment.cmaf() for DASH manifests.', this);
|
|
1944
|
+
}
|
|
1945
|
+
if ((this.hlsManifests.length > 0 || this.llHlsManifests.length > 0) && containerType === ContainerType.ISM) {
|
|
1946
|
+
throw new core_1.ValidationError((0, helpers_internal_1.lit) `HlsIncompatibleWithIsm`, 'HLS and Low Latency HLS manifests are not supported with ISM container type. Use Segment.cmaf() or Segment.ts() for HLS manifests.', this);
|
|
1947
|
+
}
|
|
1948
|
+
// Validate DRM signalling requires encryption
|
|
1949
|
+
if (this.dashManifests.some(m => m.drmSignaling) && !props.segment.encryption) {
|
|
1950
|
+
throw new core_1.ValidationError((0, helpers_internal_1.lit) `DrmSignallingRequiresEncryption`, 'DRM signalling requires encryption to be configured on the endpoint.', this);
|
|
1951
|
+
}
|
|
1952
|
+
const origin = new aws_mediapackagev2_1.CfnOriginEndpoint(this, 'Resource', {
|
|
1953
|
+
channelName: props.channel.channelName,
|
|
1954
|
+
channelGroupName: props.channel.channelGroupName,
|
|
1955
|
+
originEndpointName: this.physicalName,
|
|
1956
|
+
description: props.description,
|
|
1957
|
+
tags: props?.tags ? (0, shared_helpers_1.renderTags)(props.tags) : undefined,
|
|
1958
|
+
hlsManifests: aws_cdk_lib_1.Lazy.any({ produce: () => this.hlsManifests }, { omitEmptyArray: true }),
|
|
1959
|
+
lowLatencyHlsManifests: aws_cdk_lib_1.Lazy.any({ produce: () => this.llHlsManifests }, { omitEmptyArray: true }),
|
|
1960
|
+
dashManifests: aws_cdk_lib_1.Lazy.any({ produce: () => this.dashManifests }, { omitEmptyArray: true }),
|
|
1961
|
+
mssManifests: aws_cdk_lib_1.Lazy.any({ produce: () => this.mssManifests }, { omitEmptyArray: true }),
|
|
1962
|
+
containerType: containerType,
|
|
1963
|
+
startoverWindowSeconds: props.startoverWindow?.toSeconds(),
|
|
1964
|
+
segment: this.segmentValidation(containerType, props.segment),
|
|
1965
|
+
forceEndpointErrorConfiguration: props.forceEndpointConfigurationConditions ? {
|
|
1966
|
+
endpointErrorConditions: props.forceEndpointConfigurationConditions,
|
|
1967
|
+
} : undefined,
|
|
1968
|
+
});
|
|
1969
|
+
// The channelName/channelGroupName are rendered as literal strings (not CFN Refs), so
|
|
1970
|
+
// CloudFormation cannot infer the dependency. We add direct CfnResource-level DependsOn
|
|
1971
|
+
// to guarantee deploy ordering without triggering CDK's subtree-level cycle detection.
|
|
1972
|
+
// For imported constructs, defaultChild is undefined (no CFN resource to order against).
|
|
1973
|
+
const encryptionRole = props.segment.encryption?._getRole();
|
|
1974
|
+
if (encryptionRole)
|
|
1975
|
+
origin.node.addDependency(encryptionRole);
|
|
1976
|
+
const encryptionCert = props.segment.encryption?._getCertificate();
|
|
1977
|
+
if (encryptionCert)
|
|
1978
|
+
origin.node.addDependency(encryptionCert);
|
|
1979
|
+
const channelCfn = props.channel.node.defaultChild;
|
|
1980
|
+
if (channelCfn && core_1.CfnResource.isCfnResource(channelCfn)) {
|
|
1981
|
+
origin.addDependency(channelCfn);
|
|
1982
|
+
}
|
|
1983
|
+
const groupCfn = props.channel.channelGroup?.node.defaultChild;
|
|
1984
|
+
if (groupCfn && core_1.CfnResource.isCfnResource(groupCfn)) {
|
|
1985
|
+
origin.addDependency(groupCfn);
|
|
1986
|
+
}
|
|
1987
|
+
this.lowLatencyHlsManifestUrls = this.llHlsManifests.map((_, i) => aws_cdk_lib_1.Fn.select(i, origin.attrLowLatencyHlsManifestUrls));
|
|
1988
|
+
this.hlsManifestUrls = this.hlsManifests.map((_, i) => aws_cdk_lib_1.Fn.select(i, origin.attrHlsManifestUrls));
|
|
1989
|
+
this.dashManifestUrls = this.dashManifests.map((_, i) => aws_cdk_lib_1.Fn.select(i, origin.attrDashManifestUrls));
|
|
1990
|
+
this.mssManifestUrls = this.mssManifests.map((_, i) => aws_cdk_lib_1.Fn.select(i, origin.attrMssManifestUrls));
|
|
1991
|
+
this.createdAt = origin.attrCreatedAt;
|
|
1992
|
+
this.modifiedAt = origin.attrModifiedAt;
|
|
1993
|
+
this.channelGroupName = origin.channelGroupName;
|
|
1994
|
+
this.channelName = origin.channelName;
|
|
1995
|
+
this.originEndpointName = origin.originEndpointName;
|
|
1996
|
+
this.originEndpointArn = origin.attrArn;
|
|
1997
|
+
origin.applyRemovalPolicy(props?.removalPolicy ?? aws_cdk_lib_1.RemovalPolicy.DESTROY);
|
|
1998
|
+
// Pre-set CDN auth config if provided in props
|
|
1999
|
+
if (props.cdnAuth) {
|
|
2000
|
+
this._setCdnAuth(props.cdnAuth);
|
|
2001
|
+
}
|
|
2002
|
+
}
|
|
2003
|
+
static {
|
|
2004
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
2005
|
+
}
|
|
2006
|
+
};
|
|
2007
|
+
return OriginEndpoint = _classThis;
|
|
2008
|
+
})();
|
|
2009
|
+
exports.OriginEndpoint = OriginEndpoint;
|
|
2010
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5kcG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJlbmRwb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSw2Q0FBMEc7QUFHMUcsK0RBQTBEO0FBRTFELHVFQUFtRTtBQUVuRSwyQ0FBeUY7QUFDekYsNEVBQTREO0FBQzVELDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFJMUUscUVBQWdFO0FBQ2hFLHFEQUFtRTtBQUVuRTs7OztHQUlHO0FBQ0gsSUFBWSxVQVNYO0FBVEQsV0FBWSxVQUFVO0lBQ3BCLHlCQUF5QjtJQUN6QiwyQkFBYSxDQUFBO0lBQ2IseUJBQXlCO0lBQ3pCLDJCQUFhLENBQUE7SUFDYixxREFBcUQ7SUFDckQsMkJBQWEsQ0FBQTtJQUNiLDBEQUEwRDtJQUMxRCwyQkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQVRXLFVBQVUsMEJBQVYsVUFBVSxRQVNyQjtBQUVEOzs7O0dBSUc7QUFDSCxJQUFZLFVBT1g7QUFQRCxXQUFZLFVBQVU7SUFDcEIsZ0JBQWdCO0lBQ2hCLDJCQUFhLENBQUE7SUFDYixpQkFBaUI7SUFDakIsMkJBQWEsQ0FBQTtJQUNiLFVBQVU7SUFDVix5QkFBVyxDQUFBO0FBQ2IsQ0FBQyxFQVBXLFVBQVUsMEJBQVYsVUFBVSxRQU9yQjtBQUVEOzs7O0dBSUc7QUFDSCxJQUFZLGlCQVNYO0FBVEQsV0FBWSxpQkFBaUI7SUFDM0IsbUJBQW1CO0lBQ25CLDhCQUFTLENBQUE7SUFDVCxZQUFZO0lBQ1osb0NBQWUsQ0FBQTtJQUNmLHVCQUF1QjtJQUN2QixnQ0FBVyxDQUFBO0lBQ1gsNkJBQTZCO0lBQzdCLGdDQUFXLENBQUE7QUFDYixDQUFDLEVBVFcsaUJBQWlCLGlDQUFqQixpQkFBaUIsUUFTNUI7QUFFRDs7OztHQUlHO0FBQ0gsSUFBWSxhQU9YO0FBUEQsV0FBWSxhQUFhO0lBQ3ZCLDhCQUE4QjtJQUM5QixrQ0FBaUIsQ0FBQTtJQUNqQiw2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Ozs7OztBQUFkLHdDQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaXRyYXRlLCBJUmVzb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBSZW1vdmFsUG9saWN5LCBBcm5Gb3JtYXQsIER1cmF0aW9uLCBGbiwgTGF6eSwgTmFtZXMsIFJlc291cmNlLCBTdGFjaywgVG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgdHlwZSB7IElDZXJ0aWZpY2F0ZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXInO1xuaW1wb3J0IHR5cGUgeyBNZXRyaWNPcHRpb25zIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0IHsgTWV0cmljLCBVbml0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0IHR5cGUgeyBJUm9sZSwgUG9saWN5U3RhdGVtZW50LCBBZGRUb1Jlc291cmNlUG9saWN5UmVzdWx0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBDZm5PcmlnaW5FbmRwb2ludCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1tZWRpYXBhY2thZ2V2Mic7XG5pbXBvcnQgdHlwZSB7IElPcmlnaW5FbmRwb2ludFJlZiwgT3JpZ2luRW5kcG9pbnRSZWZlcmVuY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbWVkaWFwYWNrYWdldjInO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yLCBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciwgQ2ZuUmVzb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IGxpdCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB0eXBlIHsgSUNoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwnO1xuaW1wb3J0IHR5cGUgeyBDZG5BdXRoQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vb3JpZ2luLWVuZHBvaW50LXBvbGljeSc7XG5pbXBvcnQgeyBPcmlnaW5FbmRwb2ludFBvbGljeSB9IGZyb20gJy4vb3JpZ2luLWVuZHBvaW50LXBvbGljeSc7XG5pbXBvcnQgeyBjb252ZXJ0RGF0ZVRvU3RyaW5nLCByZW5kZXJUYWdzIH0gZnJvbSAnLi9zaGFyZWQtaGVscGVycyc7XG5cbi8qKlxuICogQWNjZXB0ZWQgYXVkaW8gY29kZWMgdmFsdWVzIGZvciBtYW5pZmVzdCBmaWx0ZXJpbmcuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWVkaWFwYWNrYWdlL2xhdGVzdC91c2VyZ3VpZGUvbWFuaWZlc3QtZmlsdGVyLXF1ZXJ5LXBhcmFtZXRlcnMuaHRtbFxuICovXG5leHBvcnQgZW51bSBBdWRpb0NvZGVjIHtcbiAgLyoqIEFBQy1MQyBhdWRpbyBjb2RlYyAqL1xuICBBQUNMID0gJ0FBQ0wnLFxuICAvKiogSEUtQUFDIGF1ZGlvIGNvZGVjICovXG4gIEFBQ0ggPSAnQUFDSCcsXG4gIC8qKiBEb2xieSBEaWdpdGFsIGF1ZGlvIGNvZGVjIChpbmNsdWRlIHRoZSBoeXBoZW4pICovXG4gIEFDXzMgPSAnQUMtMycsXG4gIC8qKiBEb2xieSBEaWdpdGFsIFBsdXMgYXVkaW8gY29kZWMgKGluY2x1ZGUgdGhlIGh5cGhlbikgKi9cbiAgRUNfMyA9ICdFQy0zJyxcbn1cblxuLyoqXG4gKiBBY2NlcHRlZCB2aWRlbyBjb2RlYyB2YWx1ZXMgZm9yIG1hbmlmZXN0IGZpbHRlcmluZy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYXBhY2thZ2UvbGF0ZXN0L3VzZXJndWlkZS9tYW5pZmVzdC1maWx0ZXItcXVlcnktcGFyYW1ldGVycy5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIFZpZGVvQ29kZWMge1xuICAvKiogSC4yNjQvQVZDICovXG4gIEgyNjQgPSAnSDI2NCcsXG4gIC8qKiBILjI2NS9IRVZDICovXG4gIEgyNjUgPSAnSDI2NScsXG4gIC8qKiBBVjEgKi9cbiAgQVYxID0gJ0FWMScsXG59XG5cbi8qKlxuICogQWNjZXB0ZWQgdmlkZW8gZHluYW1pYyByYW5nZSB2YWx1ZXMgZm9yIG1hbmlmZXN0IGZpbHRlcmluZy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYXBhY2thZ2UvbGF0ZXN0L3VzZXJndWlkZS9tYW5pZmVzdC1maWx0ZXItcXVlcnktcGFyYW1ldGVycy5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIFZpZGVvRHluYW1pY1JhbmdlIHtcbiAgLyoqIERvbGJ5IFZpc2lvbiAqL1xuICBEViA9ICdkdicsXG4gIC8qKiBIRFIxMCAqL1xuICBIRFIxMCA9ICdoZHIxMCcsXG4gIC8qKiBIeWJyaWQgTG9nLUdhbW1hICovXG4gIEhMRyA9ICdobGcnLFxuICAvKiogU3RhbmRhcmQgRHluYW1pYyBSYW5nZSAqL1xuICBTRFIgPSAnc2RyJyxcbn1cblxuLyoqXG4gKiBBY2NlcHRlZCB0cmlja3BsYXkgdHlwZSB2YWx1ZXMgZm9yIG1hbmlmZXN0IGZpbHRlcmluZy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYXBhY2thZ2UvbGF0ZXN0L3VzZXJndWlkZS9tYW5pZmVzdC1maWx0ZXItcXVlcnktcGFyYW1ldGVycy5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIFRyaWNrcGxheVR5cGUge1xuICAvKiogSS1mcmFtZSBvbmx5IHRyaWNrLXBsYXkgKi9cbiAgSUZSQU1FID0gJ2lmcmFtZScsXG4gIC8qKiBJbWFnZS1iYXNlZCB0cmljay1wbGF5ICovXG4gIElNQUdFID0gJ2ltYWdlJyxcbiAgLyoqIE5vIHRyaWNrLXBsYXkgKi9cbiAgTk9ORSA9ICdub25lJyxcbn1cblxuLyoqXG4gKiBOdW1lcmljIG1hbmlmZXN0IGZpbHRlciBrZXlzLlxuICpcbiAqIFVzZSB3aXRoIGBNYW5pZmVzdEZpbHRlci5udW1lcmljKClgLCBgTWFuaWZlc3RGaWx0ZXIubnVtZXJpY0xpc3QoKWAsIGFuZCBgTWFuaWZlc3RGaWx0ZXIubnVtZXJpY1JhbmdlKClgLlxuICpcbiAqIEF1ZGlvIGFuZCB2aWRlbyBiaXRyYXRlIGZpbHRlcnMgYXJlIG5vdCBpbmNsdWRlZCBoZXJlIGJlY2F1c2UgdGhleSB1c2UgdGhlXG4gKiBgQml0cmF0ZWAgY2xhc3MgZGlyZWN0bHkgdmlhIGRlZGljYXRlZCBtZXRob2RzIG9uIGBNYW5pZmVzdEZpbHRlcmAuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWVkaWFwYWNrYWdlL2xhdGVzdC91c2VyZ3VpZGUvbWFuaWZlc3QtZmlsdGVyLXF1ZXJ5LXBhcmFtZXRlcnMuaHRtbFxuICovXG5leHBvcnQgZW51bSBOdW1lcmljRmlsdGVyS2V5IHtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMuXG4gICAqXG4gICAqIEFjY2VwdGVkIHZhbHVlczogcmFuZ2UgMeKAkzMyNzY3LCBvciBpbmRpdmlkdWFsIGludGVnZXJzLlxuICAgKi9cbiAgQVVESU9fQ0hBTk5FTFM9J2F1ZGlvX2NoYW5uZWxzJyxcbiAgLyoqXG4gICAqIFRoZSBhdWRpbyBzYW1wbGUgcmF0ZSBpbiBIei5cbiAgICpcbiAgICogQWNjZXB0ZWQgdmFsdWVzOiByYW5nZSAw4oCTMjE0NzQ4MzY0Nywgb3IgaW5kaXZpZHVhbCBpbnRlZ2Vycy5cbiAgICovXG4gIEFVRElPX1NBTVBMRV9SQVRFPSdhdWRpb19zYW1wbGVfcmF0ZScsXG4gIC8qKlxuICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSB0cmljay1wbGF5IGltYWdlIGluIHBpeGVscyAoSS1mcmFtZSBhbmQgaW1hZ2UtYmFzZWQgdHJpY2stcGxheSkuXG4gICAqXG4gICAqIElmIHVzaW5nIHdpdGggSS1mcmFtZSBvbmx5IHRyaWNrLXBsYXksIGBUUklDS1BMQVlfSEVJR0hUYCBhbmQgYFZJREVPX0hFSUdIVGBcbiAgICogc2hvdWxkIGhhdmUgc2ltaWxhciB2YWx1ZXMuIElmIHRoZXkgZGlmZmVyLCBJLWZyYW1lIG9ubHkgdHJhY2tzIG1pZ2h0IGJlXG4gICAqIHJlbW92ZWQgZnJvbSB0aGUgbWFuaWZlc3QuXG4gICAqXG4gICAqIEFjY2VwdGVkIHZhbHVlczogcmFuZ2UgMeKAkzIxNDc0ODM2NDcsIG9yIGluZGl2aWR1YWwgaW50ZWdlcnMuXG4gICAqL1xuICBUUklDS1BMQVlfSEVJR0hUPSd0cmlja3BsYXlfaGVpZ2h0JyxcbiAgLyoqXG4gICAqIFRoZSB2aWRlbyBmcmFtZSByYXRlIHJhbmdlIGluIE5UU0MgZm9ybWF0LlxuICAgKlxuICAgKiBXaGVuIGZpbHRlcmluZyBmb3IgYSBzaW5nbGUgdmFsdWUsIE1lZGlhUGFja2FnZSB1c2VzIGFuIGFwcHJveGltYXRlIGVxdWFsc1xuICAgKiBjb21wYXJpc29uIHdpdGggYW4gZXBzaWxvbiB0b2xlcmFuY2Ugb2YgMC4wMDA1LlxuICAgKlxuICAgKiBBY2NlcHRlZCB2YWx1ZXM6IHJhbmdlIDHigJM5OTkuOTk5ICh1cCB0byB0aHJlZSBkZWNpbWFsIHBsYWNlcyksIG9yIGluZGl2aWR1YWwgdmFsdWVzLlxuICAgKi9cbiAgVklERU9fRlJBTUVSQVRFPSd2aWRlb19mcmFtZXJhdGUnLFxuICAvKipcbiAgICogVGhlIGhlaWdodCBvZiB0aGUgdmlkZW8gaW4gcGl4ZWxzLlxuICAgKlxuICAgKiBJZiB1c2luZyB3aXRoIEktZnJhbWUgb25seSB0cmljay1wbGF5LCBgVFJJQ0tQTEFZX0hFSUdIVGAgYW5kIGBWSURFT19IRUlHSFRgXG4gICAqIHNob3VsZCBoYXZlIHNpbWlsYXIgdmFsdWVzLiBJZiB0aGV5IGRpZmZlciwgSS1mcmFtZSBvbmx5IHRyYWNrcyBtaWdodCBiZVxuICAgKiByZW1vdmVkIGZyb20gdGhlIG1hbmlmZXN0LlxuICAgKlxuICAgKiBBY2NlcHRlZCB2YWx1ZXM6IHJhbmdlIDHigJMzMjc2Nywgb3IgaW5kaXZpZHVhbCBpbnRlZ2Vycy5cbiAgICovXG4gIFZJREVPX0hFSUdIVD0ndmlkZW9faGVpZ2h0Jyxcbn1cblxuLyoqXG4gKiBUZXh0IG1hbmlmZXN0IGZpbHRlciBrZXlzIGZvciBmcmVlLWZvcm0gc3RyaW5nIHZhbHVlcy5cbiAqXG4gKiBVc2Ugd2l0aCBgTWFuaWZlc3RGaWx0ZXIudGV4dCgpYCBhbmQgYE1hbmlmZXN0RmlsdGVyLnRleHRMaXN0KClgLlxuICpcbiAqIEZvciBrZXlzIHdpdGggZml4ZWQgYWNjZXB0ZWQgdmFsdWVzLCB1c2UgdGhlIGRlZGljYXRlZCBtZXRob2RzIG9uIGBNYW5pZmVzdEZpbHRlcmAgaW5zdGVhZDpcbiAqIC0gQXVkaW8gY29kZWM6IGBNYW5pZmVzdEZpbHRlci5hdWRpb0NvZGVjKClgIC8gYE1hbmlmZXN0RmlsdGVyLmF1ZGlvQ29kZWNMaXN0KClgXG4gKiAtIFZpZGVvIGNvZGVjOiBgTWFuaWZlc3RGaWx0ZXIudmlkZW9Db2RlYygpYCAvIGBNYW5pZmVzdEZpbHRlci52aWRlb0NvZGVjTGlzdCgpYFxuICogLSBWaWRlbyBkeW5hbWljIHJhbmdlOiBgTWFuaWZlc3RGaWx0ZXIudmlkZW9EeW5hbWljUmFuZ2UoKWAgLyBgTWFuaWZlc3RGaWx0ZXIudmlkZW9EeW5hbWljUmFuZ2VMaXN0KClgXG4gKiAtIFRyaWNrcGxheSB0eXBlOiBgTWFuaWZlc3RGaWx0ZXIudHJpY2twbGF5VHlwZSgpYCAvIGBNYW5pZmVzdEZpbHRlci50cmlja3BsYXlUeXBlTGlzdCgpYFxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhcGFja2FnZS9sYXRlc3QvdXNlcmd1aWRlL21hbmlmZXN0LWZpbHRlci1xdWVyeS1wYXJhbWV0ZXJzLmh0bWxcbiAqL1xuZXhwb3J0IGVudW0gVGV4dEZpbHRlcktleSB7XG4gIC8qKlxuICAgKiBBdWRpbyBsYW5ndWFnZXMgb3IgZnVuY3Rpb25hbCBjb2RlcyBkZXJpdmVkIGZyb20gZW5jb2RlciBwYXNzdGhyb3VnaC5cbiAgICpcbiAgICogQWNjZXB0ZWQgdmFsdWVzOiBhcmJpdHJhcnkgc3RyaW5ncyBzdWNoIGFzIElTTy02MzktMSBsYW5ndWFnZSBjb2RlcyAobm90IGNhc2Utc2Vuc2l0aXZlKS5cbiAgICovXG4gIEFVRElPX0xBTkdVQUdFPSdhdWRpb19sYW5ndWFnZScsXG4gIC8qKlxuICAgKiBUaGUgc3VidGl0bGUgbGFuZ3VhZ2Ugb3IgZnVuY3Rpb25hbCBjb2RlcyBkZXJpdmVkIGZyb20gZW5jb2RlciBwYXNzdGhyb3VnaC5cbiAgICpcbiAgICogQWNjZXB0ZWQgdmFsdWVzOiBhcmJpdHJhcnkgc3RyaW5ncyBzdWNoIGFzIElTTy02MzktMSBsYW5ndWFnZSBjb2RlcyAobm90IGNhc2Utc2Vuc2l0aXZlKS5cbiAgICovXG4gIFNVQlRJVExFX0xBTkdVQUdFPSdzdWJ0aXRsZV9sYW5ndWFnZScsXG59XG5cbi8qKlxuICogQml0cmF0ZSBtYW5pZmVzdCBmaWx0ZXIga2V5cy5cbiAqXG4gKiBVc2Ugd2l0aCBgTWFuaWZlc3RGaWx0ZXIuYml0cmF0ZSgpYCBhbmQgYE1hbmlmZXN0RmlsdGVyLmJpdHJhdGVSYW5nZSgpYC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYXBhY2thZ2UvbGF0ZXN0L3VzZXJndWlkZS9tYW5pZmVzdC1maWx0ZXItcXVlcnktcGFyYW1ldGVycy5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIEJpdHJhdGVGaWx0ZXJLZXkge1xuICAvKipcbiAgICogVGhlIGF1ZGlvIGJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLlxuICAgKlxuICAgKiBBY2NlcHRlZCB2YWx1ZXM6IHJhbmdlIDDigJMyMTQ3NDgzNjQ3LCBvciBpbmRpdmlkdWFsIGludGVnZXJzLlxuICAgKi9cbiAgQVVESU9fQklUUkFURT0nYXVkaW9fYml0cmF0ZScsXG4gIC8qKlxuICAgKiBUaGUgdmlkZW8gYml0cmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQuXG4gICAqXG4gICAqIFdlIHJlY29tbWVuZCB1c2luZyBvbmx5IHRoaXMgZmlsdGVyIHBhcmFtZXRlciB0byBzZXQgdGhlIHZpZGVvIGJpdHJhdGUuXG4gICAqIERvIG5vdCBhbHNvIHNldCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2aWRlbyBiaXRyYXRlIHZpYSB0aGUgTWVkaWFQYWNrYWdlXG4gICAqIGNvbnNvbGUgb3IgQVdTIENMSSwgYXMgeW91ciBvdXRwdXQgbWlnaHQgYmUgc2tld2VkLlxuICAgKlxuICAgKiBUaGlzIHBhcmFtZXRlciBjYW5ub3QgYmUgdXNlZCB3aXRoIHRyaWNrLXBsYXkgc3RyZWFtcy5cbiAgICpcbiAgICogQWNjZXB0ZWQgdmFsdWVzOiByYW5nZSAw4oCTMjE0NzQ4MzY0Nywgb3IgaW5kaXZpZHVhbCBpbnRlZ2Vycy5cbiAgICovXG4gIFZJREVPX0JJVFJBVEU9J3ZpZGVvX2JpdHJhdGUnLFxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBudW1lcmljIGZpbHRlciBleHByZXNzaW9uIHNlZ21lbnQg4oCUIGVpdGhlciBhIHNpbmdsZSB2YWx1ZSBvciBhIHJhbmdlLlxuICpcbiAqIFVzZSB3aXRoIGBNYW5pZmVzdEZpbHRlci5udW1lcmljQ29tYm8oKWAgdG8gYnVpbGQgZmlsdGVycyB0aGF0IGNvbWJpbmVcbiAqIHJhbmdlcyBhbmQgaW5kaXZpZHVhbCB2YWx1ZXMgKGUuZy4gYHZpZGVvX2hlaWdodDoyNDAtMzYwLDcyMC0xMDgwLDE0NDBgKS5cbiAqL1xuZXhwb3J0IGNsYXNzIE51bWVyaWNFeHByZXNzaW9uIHtcbiAgLyoqXG4gICAqIEEgc2luZ2xlIG51bWVyaWMgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZhbHVlKHY6IG51bWJlcik6IE51bWVyaWNFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gbmV3IE51bWVyaWNFeHByZXNzaW9uKGAke3Z9YCwgW3ZdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBpbmNsdXNpdmUgbnVtZXJpYyByYW5nZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmFuZ2Uoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiBOdW1lcmljRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIG5ldyBOdW1lcmljRXhwcmVzc2lvbihgJHtzdGFydH0tJHtlbmR9YCwgW3N0YXJ0LCBlbmRdKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHVibGljIHJlYWRvbmx5IF9leHByZXNzaW9uOiBzdHJpbmcsXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByZWFkb25seSBfdmFsdWVzOiBudW1iZXJbXSxcbiAgKSB7fVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBiaXRyYXRlIGZpbHRlciBleHByZXNzaW9uIHNlZ21lbnQg4oCUIGVpdGhlciBhIHNpbmdsZSB2YWx1ZSBvciBhIHJhbmdlLlxuICpcbiAqIFVzZSB3aXRoIGBNYW5pZmVzdEZpbHRlci5iaXRyYXRlQ29tYm8oKWAgdG8gYnVpbGQgZmlsdGVycyB0aGF0IGNvbWJpbmVcbiAqIHJhbmdlcyBhbmQgaW5kaXZpZHVhbCBiaXRyYXRlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJpdHJhdGVFeHByZXNzaW9uIHtcbiAgLyoqXG4gICAqIEEgc2luZ2xlIGJpdHJhdGUgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZhbHVlKHY6IEJpdHJhdGUpOiBCaXRyYXRlRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIG5ldyBCaXRyYXRlRXhwcmVzc2lvbihgJHt2LnRvQnBzKCl9YCwgW3YudG9CcHMoKV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGluY2x1c2l2ZSBiaXRyYXRlIHJhbmdlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByYW5nZShzdGFydDogQml0cmF0ZSwgZW5kOiBCaXRyYXRlKTogQml0cmF0ZUV4cHJlc3Npb24ge1xuICAgIHJldHVybiBuZXcgQml0cmF0ZUV4cHJlc3Npb24oYCR7c3RhcnQudG9CcHMoKX0tJHtlbmQudG9CcHMoKX1gLCBbc3RhcnQudG9CcHMoKSwgZW5kLnRvQnBzKCldKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHVibGljIHJlYWRvbmx5IF9leHByZXNzaW9uOiBzdHJpbmcsXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByZWFkb25seSBfdmFsdWVzOiBudW1iZXJbXSxcbiAgKSB7fVxufVxuXG4vKipcbiAqIEVuYWJsZXMgeW91IHRvIGNyZWF0ZSBmaWx0ZXJzIGZvciB5b3VyIE9yaWdpbiBFbmRwb2ludC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYXBhY2thZ2UvbGF0ZXN0L3VzZXJndWlkZS9tYW5pZmVzdC1maWx0ZXJpbmcuaHRtbFxuICovXG5leHBvcnQgY2xhc3MgTWFuaWZlc3RGaWx0ZXIge1xuICAvKipcbiAgICogRmlsdGVyIGJ5IGEgc2luZ2xlIGJpdHJhdGUgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGJpdHJhdGUoa2V5OiBCaXRyYXRlRmlsdGVyS2V5LCB2YWx1ZTogQml0cmF0ZSkge1xuICAgIGNvbnN0IGJwcyA9IHZhbHVlLnRvQnBzKCk7XG4gICAgdmFsaWRhdGVCaXRyYXRlRmlsdGVyVmFsdWUoYnBzLCBrZXkpO1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3RGaWx0ZXIoYCR7a2V5fToke2Jwc31gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgYSBiaXRyYXRlIHJhbmdlIChpbmNsdXNpdmUpLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBiaXRyYXRlUmFuZ2Uoa2V5OiBCaXRyYXRlRmlsdGVyS2V5LCBzdGFydDogQml0cmF0ZSwgZW5kOiBCaXRyYXRlKSB7XG4gICAgY29uc3Qgc3RhcnRCcHMgPSBzdGFydC50b0JwcygpO1xuICAgIGNvbnN0IGVuZEJwcyA9IGVuZC50b0JwcygpO1xuICAgIHZhbGlkYXRlQml0cmF0ZUZpbHRlclZhbHVlKHN0YXJ0QnBzLCBrZXkpO1xuICAgIHZhbGlkYXRlQml0cmF0ZUZpbHRlclZhbHVlKGVuZEJwcywga2V5KTtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGAke2tleX06JHtzdGFydEJwc30tJHtlbmRCcHN9YCk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSBhIHNpbmdsZSBudW1lcmljIGZpbHRlciB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbnVtZXJpYyhrZXk6IE51bWVyaWNGaWx0ZXJLZXksIHZhbHVlOiBudW1iZXIpIHtcbiAgICB2YWxpZGF0ZU51bWVyaWNGaWx0ZXJWYWx1ZSh2YWx1ZSwga2V5KTtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGAke2tleX06JHt2YWx1ZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IG11bHRpcGxlIG51bWVyaWMgZmlsdGVyIHZhbHVlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbnVtZXJpY0xpc3Qoa2V5OiBOdW1lcmljRmlsdGVyS2V5LCB2YWx1ZXM6IG51bWJlcltdKSB7XG4gICAgdmFsdWVzLmZvckVhY2godiA9PiB2YWxpZGF0ZU51bWVyaWNGaWx0ZXJWYWx1ZSh2LCBrZXkpKTtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGAke2tleX06JHt2YWx1ZXMuam9pbignLCcpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBudW1lcmljIGZpbHRlciByYW5nZSAoaW5jbHVzaXZlKS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbnVtZXJpY1JhbmdlKGtleTogTnVtZXJpY0ZpbHRlcktleSwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpIHtcbiAgICB2YWxpZGF0ZU51bWVyaWNGaWx0ZXJWYWx1ZShzdGFydCwga2V5KTtcbiAgICB2YWxpZGF0ZU51bWVyaWNGaWx0ZXJWYWx1ZShlbmQsIGtleSk7XG4gICAgcmV0dXJuIG5ldyBNYW5pZmVzdEZpbHRlcihgJHtrZXl9OiR7c3RhcnR9LSR7ZW5kfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBmcmVlLWZvcm0gdGV4dCBmaWx0ZXIgdmFsdWUgKGZvciBsYW5ndWFnZSBrZXlzKS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdGV4dChrZXk6IFRleHRGaWx0ZXJLZXksIHZhbHVlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGAke2tleX06JHt2YWx1ZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IG11bHRpcGxlIGZyZWUtZm9ybSB0ZXh0IGZpbHRlciB2YWx1ZXMgKGZvciBsYW5ndWFnZSBrZXlzKS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdGV4dExpc3Qoa2V5OiBUZXh0RmlsdGVyS2V5LCB2YWx1ZXM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIG5ldyBNYW5pZmVzdEZpbHRlcihgJHtrZXl9OiR7dmFsdWVzLmpvaW4oJywnKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgYSBzaW5nbGUgYXVkaW8gY29kZWMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGF1ZGlvQ29kZWModmFsdWU6IEF1ZGlvQ29kZWMpIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGBhdWRpb19jb2RlYzoke3ZhbHVlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBtdWx0aXBsZSBhdWRpbyBjb2RlY3MuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGF1ZGlvQ29kZWNMaXN0KHZhbHVlczogQXVkaW9Db2RlY1tdKSB7XG4gICAgcmV0dXJuIG5ldyBNYW5pZmVzdEZpbHRlcihgYXVkaW9fY29kZWM6JHt2YWx1ZXMuam9pbignLCcpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBhIHNpbmdsZSB2aWRlbyBjb2RlYy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmlkZW9Db2RlYyh2YWx1ZTogVmlkZW9Db2RlYykge1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3RGaWx0ZXIoYHZpZGVvX2NvZGVjOiR7dmFsdWV9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGJ5IG11bHRpcGxlIHZpZGVvIGNvZGVjcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmlkZW9Db2RlY0xpc3QodmFsdWVzOiBWaWRlb0NvZGVjW10pIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGB2aWRlb19jb2RlYzoke3ZhbHVlcy5qb2luKCcsJyl9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGJ5IGEgc2luZ2xlIHZpZGVvIGR5bmFtaWMgcmFuZ2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZpZGVvRHluYW1pY1JhbmdlKHZhbHVlOiBWaWRlb0R5bmFtaWNSYW5nZSkge1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3RGaWx0ZXIoYHZpZGVvX2R5bmFtaWNfcmFuZ2U6JHt2YWx1ZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgbXVsdGlwbGUgdmlkZW8gZHluYW1pYyByYW5nZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZpZGVvRHluYW1pY1JhbmdlTGlzdCh2YWx1ZXM6IFZpZGVvRHluYW1pY1JhbmdlW10pIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGB2aWRlb19keW5hbWljX3JhbmdlOiR7dmFsdWVzLmpvaW4oJywnKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgYSBzaW5nbGUgdHJpY2twbGF5IHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRyaWNrcGxheVR5cGUodmFsdWU6IFRyaWNrcGxheVR5cGUpIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGB0cmlja3BsYXlfdHlwZToke3ZhbHVlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBtdWx0aXBsZSB0cmlja3BsYXkgdHlwZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRyaWNrcGxheVR5cGVMaXN0KHZhbHVlczogVHJpY2twbGF5VHlwZVtdKSB7XG4gICAgcmV0dXJuIG5ldyBNYW5pZmVzdEZpbHRlcihgdHJpY2twbGF5X3R5cGU6JHt2YWx1ZXMuam9pbignLCcpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBhIGNvbWJpbmF0aW9uIG9mIG51bWVyaWMgcmFuZ2VzIGFuZCBpbmRpdmlkdWFsIHZhbHVlcy5cbiAgICpcbiAgICogVXNlIHRoaXMgZm9yIGFkdmFuY2VkIHBhdHRlcm5zIGxpa2UgYHZpZGVvX2hlaWdodDoyNDAtMzYwLDcyMC0xMDgwLDE0NDBgLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBNYW5pZmVzdEZpbHRlci5udW1lcmljQ29tYm8oTnVtZXJpY0ZpbHRlcktleS5WSURFT19IRUlHSFQsIFtcbiAgICogICBOdW1lcmljRXhwcmVzc2lvbi5yYW5nZSgyNDAsIDM2MCksXG4gICAqICAgTnVtZXJpY0V4cHJlc3Npb24ucmFuZ2UoNzIwLCAxMDgwKSxcbiAgICogICBOdW1lcmljRXhwcmVzc2lvbi52YWx1ZSgxNDQwKSxcbiAgICogXSlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbnVtZXJpY0NvbWJvKGtleTogTnVtZXJpY0ZpbHRlcktleSwgZXhwcmVzc2lvbnM6IE51bWVyaWNFeHByZXNzaW9uW10pIHtcbiAgICBleHByZXNzaW9ucy5mb3JFYWNoKGV4cHIgPT4gZXhwci5fdmFsdWVzLmZvckVhY2godiA9PiB2YWxpZGF0ZU51bWVyaWNGaWx0ZXJWYWx1ZSh2LCBrZXkpKSk7XG4gICAgcmV0dXJuIG5ldyBNYW5pZmVzdEZpbHRlcihgJHtrZXl9OiR7ZXhwcmVzc2lvbnMubWFwKGUgPT4gZS5fZXhwcmVzc2lvbikuam9pbignLCcpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBhIGNvbWJpbmF0aW9uIG9mIGJpdHJhdGUgcmFuZ2VzIGFuZCBpbmRpdmlkdWFsIHZhbHVlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogTWFuaWZlc3RGaWx0ZXIuYml0cmF0ZUNvbWJvKEJpdHJhdGVGaWx0ZXJLZXkuVklERU9fQklUUkFURSwgW1xuICAgKiAgIEJpdHJhdGVFeHByZXNzaW9uLnJhbmdlKEJpdHJhdGUubWJwcygxKSwgQml0cmF0ZS5tYnBzKDMpKSxcbiAgICogICBCaXRyYXRlRXhwcmVzc2lvbi52YWx1ZShCaXRyYXRlLm1icHMoNSkpLFxuICAgKiBdKVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBiaXRyYXRlQ29tYm8oa2V5OiBCaXRyYXRlRmlsdGVyS2V5LCBleHByZXNzaW9uczogQml0cmF0ZUV4cHJlc3Npb25bXSkge1xuICAgIGV4cHJlc3Npb25zLmZvckVhY2goZXhwciA9PiBleHByLl92YWx1ZXMuZm9yRWFjaCh2ID0+IHZhbGlkYXRlQml0cmF0ZUZpbHRlclZhbHVlKHYsIGtleSkpKTtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGAke2tleX06JHtleHByZXNzaW9ucy5tYXAoZSA9PiBlLl9leHByZXNzaW9uKS5qb2luKCcsJyl9YCk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSBhIGN1c3RvbSBtYW5pZmVzdCBmaWx0ZXIgc3RyaW5nLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjdXN0b20oY3VzdG9tOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGN1c3RvbSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGZpbHRlclN0cmluZyBOb3JtYWxpc2VkIG1hbmlmZXN0IGZpbHRlciBzdHJpbmdcbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZmlsdGVyU3RyaW5nOiBzdHJpbmcpIHsgfVxufVxuXG4vKipcbiAqIENvbnRleHQgcGFzc2VkIHRvIE1hbmlmZXN0Ll9iaW5kKCkgbWV0aG9kXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYW5pZmVzdEJpbmRDb250ZXh0IHtcbiAgcmVhZG9ubHkgaGxzTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5IbHNNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdO1xuICByZWFkb25seSBsbEhsc01hbmlmZXN0czogQ2ZuT3JpZ2luRW5kcG9pbnQuTG93TGF0ZW5jeUhsc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5W107XG4gIHJlYWRvbmx5IGRhc2hNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50LkRhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdO1xuICByZWFkb25seSBtc3NNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50Lk1zc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5W107XG4gIHJlYWRvbmx5IHNlZ21lbnQ/OiBTZWdtZW50Q29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBNYW5pZmVzdCB0byBhZGQgdG8gT3JpZ2luIEVuZHBvaW50XG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgbWFuaWZlc3QgY29uZmlndXJhdGlvbiBmb3IgTG93IExhdGVuY3kgSExTLlxuICAgKlxuICAgKiAqKk5vdGU6KiogTG93IExhdGVuY3kgSExTIG1hbmlmZXN0cyByZXF1aXJlIFRTIG9yIENNQUYgY29udGFpbmVyIHR5cGUuXG4gICAqIFVzZSB3aXRoIGBTZWdtZW50LnRzKClgIG9yIGBTZWdtZW50LmNtYWYoKWAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGxvd0xhdGVuY3lITFMobWFuaWZlc3Q6IExvd0xhdGVuY3lIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb24pOiBNYW5pZmVzdCB7XG4gICAgcmV0dXJuIG5ldyBMb3dMYXRlbmN5SGxzTWFuaWZlc3QobWFuaWZlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBtYW5pZmVzdCBjb25maWd1cmF0aW9uIGZvciBITFMuXG4gICAqXG4gICAqICoqTm90ZToqKiBITFMgbWFuaWZlc3RzIHJlcXVpcmUgVFMgb3IgQ01BRiBjb250YWluZXIgdHlwZS5cbiAgICogVXNlIHdpdGggYFNlZ21lbnQudHMoKWAgb3IgYFNlZ21lbnQuY21hZigpYC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaGxzKG1hbmlmZXN0OiBIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb24pOiBNYW5pZmVzdCB7XG4gICAgcmV0dXJuIG5ldyBIbHNNYW5pZmVzdChtYW5pZmVzdCk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSBhIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gZm9yIERBU0guXG4gICAqXG4gICAqICoqTm90ZToqKiBEQVNIIG1hbmlmZXN0cyByZXF1aXJlIENNQUYgY29udGFpbmVyIHR5cGUuXG4gICAqIFVzZSB3aXRoIGBTZWdtZW50LmNtYWYoKWAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRhc2gobWFuaWZlc3Q6IERhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb24pOiBNYW5pZmVzdCB7XG4gICAgcmV0dXJuIG5ldyBEYXNoTWFuaWZlc3QobWFuaWZlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBtYW5pZmVzdCBjb25maWd1cmF0aW9uIGZvciBNU1MuXG4gICAqXG4gICAqICoqTm90ZToqKiBNU1MgbWFuaWZlc3RzIHJlcXVpcmUgSVNNIGNvbnRhaW5lciB0eXBlLlxuICAgKiBVc2Ugd2l0aCBgU2VnbWVudC5pc20oKWAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG1zcyhtYW5pZmVzdDogTXNzTWFuaWZlc3RDb25maWd1cmF0aW9uKTogTWFuaWZlc3Qge1xuICAgIHJldHVybiBuZXcgTXNzTWFuaWZlc3QobWFuaWZlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBtYW5pZmVzdCBpcyBib3VuZCB0byBhbiBPcmlnaW5FbmRwb2ludC5cbiAgICpcbiAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QgdXNlZCBieSB0aGUgY29uc3RydWN0IGxpYnJhcnkgYW5kIHNob3VsZCBub3QgYmVcbiAgICogY2FsbGVkIG9yIGltcGxlbWVudGVkIGJ5IGV4dGVybmFsIGNvbnN1bWVycy4gSXQgbWF5IGNoYW5nZSB3aXRob3V0IG5vdGljZS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgX2JpbmQoY29udGV4dDogTWFuaWZlc3RCaW5kQ29udGV4dCk6IHZvaWQ7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSBudW1lcmljIGZpbHRlciB2YWx1ZSBpcyBhbiBpbnRlZ2VyIHdpdGhpbiB0aGUgYWNjZXB0ZWQgcmFuZ2UgZm9yIGl0cyBrZXkuXG4gKiBWSURFT19GUkFNRVJBVEUgaXMgZXhjbHVkZWQg4oCUIGl0IHVzZXMgYHZhbGlkYXRlRnJhbWVyYXRlVmFsdWVgIGluc3RlYWQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVJbnRlZ2VyRmlsdGVyVmFsdWUodmFsdWU6IG51bWJlciwga2V5OiBOdW1lcmljRmlsdGVyS2V5LCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTnVtZXJpY0ZpbHRlck11c3RCZUludGVnZXJgLCBgTnVtZXJpYyBmaWx0ZXIgdmFsdWUgZm9yICcke2tleX0nIG11c3QgYmUgYW4gaW50ZWdlciwgZ290ICR7dmFsdWV9YCk7XG4gIH1cbiAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBOdW1lcmljRmlsdGVyT3V0T2ZSYW5nZWAsIGBOdW1lcmljIGZpbHRlciB2YWx1ZSBmb3IgJyR7a2V5fScgbXVzdCBiZSBiZXR3ZWVuICR7bWlufSBhbmQgJHttYXh9LCBnb3QgJHt2YWx1ZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgdmlkZW8gZnJhbWVyYXRlIGZpbHRlciB2YWx1ZSAoMeKAkzk5OS45OTksIHVwIHRvIDMgZGVjaW1hbCBwbGFjZXMpLlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhbWVyYXRlVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICBpZiAodmFsdWUgPCAxIHx8IHZhbHVlID4gOTk5Ljk5OSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTnVtZXJpY0ZpbHRlck91dE9mUmFuZ2VgLCBgTnVtZXJpYyBmaWx0ZXIgdmFsdWUgZm9yICd2aWRlb19mcmFtZXJhdGUnIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA5OTkuOTk5LCBnb3QgJHt2YWx1ZX1gKTtcbiAgfVxuICBjb25zdCBkZWNpbWFsUGFydCA9IHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJy4nKVsxXTtcbiAgaWYgKGRlY2ltYWxQYXJ0ICYmIGRlY2ltYWxQYXJ0Lmxlbmd0aCA+IDMpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YE51bWVyaWNGaWx0ZXJNYXhEZWNpbWFsUGxhY2VzYCwgYE51bWVyaWMgZmlsdGVyIHZhbHVlIGZvciAndmlkZW9fZnJhbWVyYXRlJyBhbGxvd3MgdXAgdG8gMyBkZWNpbWFsIHBsYWNlcywgZ290ICR7dmFsdWV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSb3V0ZSBudW1lcmljIHZhbGlkYXRpb24gdG8gdGhlIGNvcnJlY3QgaGVscGVyIGJhc2VkIG9uIGtleS5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZU51bWVyaWNGaWx0ZXJWYWx1ZSh2YWx1ZTogbnVtYmVyLCBrZXk6IE51bWVyaWNGaWx0ZXJLZXkpOiB2b2lkIHtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlIE51bWVyaWNGaWx0ZXJLZXkuQVVESU9fQ0hBTk5FTFM6XG4gICAgICByZXR1cm4gdmFsaWRhdGVJbnRlZ2VyRmlsdGVyVmFsdWUodmFsdWUsIGtleSwgMSwgMzJfNzY3KTtcbiAgICBjYXNlIE51bWVyaWNGaWx0ZXJLZXkuQVVESU9fU0FNUExFX1JBVEU6XG4gICAgICByZXR1cm4gdmFsaWRhdGVJbnRlZ2VyRmlsdGVyVmFsdWUodmFsdWUsIGtleSwgMCwgMl8xNDdfNDgzXzY0Nyk7XG4gICAgY2FzZSBOdW1lcmljRmlsdGVyS2V5LlRSSUNLUExBWV9IRUlHSFQ6XG4gICAgICByZXR1cm4gdmFsaWRhdGVJbnRlZ2VyRmlsdGVyVmFsdWUodmFsdWUsIGtleSwgMSwgMl8xNDdfNDgzXzY0Nyk7XG4gICAgY2FzZSBOdW1lcmljRmlsdGVyS2V5LlZJREVPX0ZSQU1FUkFURTpcbiAgICAgIHJldHVybiB2YWxpZGF0ZUZyYW1lcmF0ZVZhbHVlKHZhbHVlKTtcbiAgICBjYXNlIE51bWVyaWNGaWx0ZXJLZXkuVklERU9fSEVJR0hUOlxuICAgICAgcmV0dXJuIHZhbGlkYXRlSW50ZWdlckZpbHRlclZhbHVlKHZhbHVlLCBrZXksIDEsIDMyXzc2Nyk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIGJpdHJhdGUgZmlsdGVyIHZhbHVlIGlzIGFuIGludGVnZXIgd2l0aGluIHRoZSBhY2NlcHRlZCByYW5nZS5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUJpdHJhdGVGaWx0ZXJWYWx1ZShicHM6IG51bWJlciwga2V5OiBCaXRyYXRlRmlsdGVyS2V5KTogdm9pZCB7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihicHMpKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBCaXRyYXRlRmlsdGVyTXVzdEJlSW50ZWdlcmAsIGBCaXRyYXRlIGZpbHRlciB2YWx1ZSBmb3IgJyR7a2V5fScgbXVzdCByZXNvbHZlIHRvIGEgd2hvbGUgbnVtYmVyIG9mIGJpdHMgcGVyIHNlY29uZCwgZ290ICR7YnBzfWApO1xuICB9XG4gIGlmIChicHMgPCAwIHx8IGJwcyA+IDJfMTQ3XzQ4M182NDcpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YEJpdHJhdGVGaWx0ZXJPdXRPZlJhbmdlYCwgYEJpdHJhdGUgZmlsdGVyIHZhbHVlIGZvciAnJHtrZXl9JyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjE0NzQ4MzY0NywgZ290ICR7YnBzfWApO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGNvbW1vbiBtYW5pZmVzdCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVNYW5pZmVzdENvbmZpZ3VyYXRpb24oY29uZmlnOiBNYW5pZmVzdENvbmZpZ3VyYXRpb25CYXNlKTogdm9pZCB7XG4gIGlmIChjb25maWcubWFuaWZlc3RXaW5kb3cgJiYgY29uZmlnLm1hbmlmZXN0V2luZG93LnRvU2Vjb25kcygpIDwgMzApIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YE1hbmlmZXN0V2luZG93TWluaW11bWAsICdNYW5pZmVzdCBXaW5kb3cgaGFzIGEgbWluaW11bSB2YWx1ZSBvZiAzMCBzZWNvbmRzJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgbW9kaWZ5IGZpbHRlciBjb25maWd1cmF0aW9uXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGaWx0ZXJDb25maWd1cmF0aW9uKGZpbHRlckNvbmZpZz86IEZpbHRlckNvbmZpZ3VyYXRpb24pOiBDZm5PcmlnaW5FbmRwb2ludC5GaWx0ZXJDb25maWd1cmF0aW9uUHJvcGVydHkgfCB1bmRlZmluZWQge1xuICBpZiAoIWZpbHRlckNvbmZpZykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBpZiAoZmlsdGVyQ29uZmlnLmNsaXBTdGFydFRpbWUgJiYgKGZpbHRlckNvbmZpZy5zdGFydCB8fCBmaWx0ZXJDb25maWcuZW5kKSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgQ2xpcFN0YXJ0VGltZUNvbmZsaWN0YCwgJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIENsaXBTdGFydFRpbWUgd2l0aCBTdGFydCBvciBFbmQgaW4gYSBGaWx0ZXJDb25maWd1cmF0aW9uLicpO1xuICB9XG5cbiAgaWYgKGZpbHRlckNvbmZpZy50aW1lRGVsYXkgJiYgKGZpbHRlckNvbmZpZy50aW1lRGVsYXkudG9TZWNvbmRzKCkgPCAwIHx8IGZpbHRlckNvbmZpZy50aW1lRGVsYXkudG9TZWNvbmRzKCkgPiAxMjA5NjAwKSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgVGltZURlbGF5UmFuZ2VgLCAnVGltZSBEZWxheSBzZXR0aW5nIHNob3VsZCBiZSBkZWZpbmVkIGJldHdlZW4gMC0xMjA5NjAwIHNlY29uZHMuJyk7XG4gIH1cblxuICBpZiAoZmlsdGVyQ29uZmlnLnN0YXJ0ICYmIGZpbHRlckNvbmZpZy5lbmQgJiYgKGZpbHRlckNvbmZpZy5lbmQgPD0gZmlsdGVyQ29uZmlnLnN0YXJ0KSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgRW5kQmVmb3JlU3RhcnRgLCAnVGhlIEVuZCBwYXJhbWV0ZXIgbmVlZHMgdG8gYmUgYWZ0ZXIgdGhlIFN0YXJ0IHBhcmFtZXRlciBpbiBhIEZpbHRlckNvbmZpZ3VyYXRpb24uJyk7XG4gIH1cblxuICBjb25zdCBtYW5pZmVzdEZpbHRlciA9IGZpbHRlckNvbmZpZy5tYW5pZmVzdEZpbHRlciA/IGZpbHRlckNvbmZpZy5tYW5pZmVzdEZpbHRlci5tYXAoZmlsdGVyID0+IGZpbHRlci5maWx0ZXJTdHJpbmcpLmpvaW4oJzsnKSA6IHVuZGVmaW5lZDtcbiAgaWYgKG1hbmlmZXN0RmlsdGVyICE9IHVuZGVmaW5lZCAmJiAobWFuaWZlc3RGaWx0ZXIubGVuZ3RoIDwgMSB8fCBtYW5pZmVzdEZpbHRlci5sZW5ndGggPiAxMDI0KSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTWFuaWZlc3RGaWx0ZXJMZW5ndGhgLCAnTWFuaWZlc3QgZmlsdGVyIG5lZWRzIHRvIGJlIGJldHdlZW4gMS0xMDI0IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLicpO1xuICB9XG5cbiAgaWYgKGZpbHRlckNvbmZpZy5tYW5pZmVzdEZpbHRlciAmJiBmaWx0ZXJDb25maWcubWFuaWZlc3RGaWx0ZXIubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IGtleXMgPSBmaWx0ZXJDb25maWcubWFuaWZlc3RGaWx0ZXIubWFwKGYgPT4gZi5maWx0ZXJTdHJpbmcuc3BsaXQoJzonKVswXSk7XG4gICAga2V5cy5mb3JFYWNoKChrZXksIGkpID0+IHtcbiAgICAgIGlmIChrZXlzLmluZGV4T2Yoa2V5KSAhPT0gaSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YER1cGxpY2F0ZU1hbmlmZXN0RmlsdGVyS2V5YCwgYER1cGxpY2F0ZSBtYW5pZmVzdCBmaWx0ZXIga2V5ICcke2tleX0nLiBVc2UgYSBzaW5nbGUgZmlsdGVyIHdpdGggY29tbWEtc2VwYXJhdGVkIHZhbHVlcyBpbnN0ZWFkIChlLmcuIE1hbmlmZXN0RmlsdGVyLm51bWVyaWNMaXN0KCkgb3IgTWFuaWZlc3RGaWx0ZXIuY3VzdG9tKCkpLmApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtYW5pZmVzdEZpbHRlcixcbiAgICBkcm1TZXR0aW5nczogZmlsdGVyQ29uZmlnLmRybVNldHRpbmdzID8gZmlsdGVyQ29uZmlnLmRybVNldHRpbmdzLmZpbHRlcigodiwgaSwgYSkgPT4gYS5pbmRleE9mKHYpID09PSBpKS5qb2luKCc7JykgOiB1bmRlZmluZWQsXG4gICAgY2xpcFN0YXJ0VGltZTogZmlsdGVyQ29uZmlnLmNsaXBTdGFydFRpbWUgPyBjb252ZXJ0RGF0ZVRvU3RyaW5nKGZpbHRlckNvbmZpZy5jbGlwU3RhcnRUaW1lKSA6IHVuZGVmaW5lZCxcbiAgICBzdGFydDogZmlsdGVyQ29uZmlnLnN0YXJ0ID8gY29udmVydERhdGVUb1N0cmluZyhmaWx0ZXJDb25maWcuc3RhcnQpIDogdW5kZWZpbmVkLFxuICAgIGVuZDogZmlsdGVyQ29uZmlnLmVuZCA/IGNvbnZlcnREYXRlVG9TdHJpbmcoZmlsdGVyQ29uZmlnLmVuZCkgOiB1bmRlZmluZWQsXG4gICAgdGltZURlbGF5U2Vjb25kczogZmlsdGVyQ29uZmlnLnRpbWVEZWxheT8udG9TZWNvbmRzKCksXG4gIH07XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc3RhcnRUYWcgY29uZmlndXJhdGlvblxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhcnRUYWcoc3RhcnRUYWc6IFN0YXJ0VGFnLCBtYW5pZmVzdFdpbmRvdz86IER1cmF0aW9uLCBzZWdtZW50RHVyYXRpb24/OiBEdXJhdGlvbik6IHZvaWQge1xuICBjb25zdCB0aW1lT2Zmc2V0ID0gc3RhcnRUYWcudGltZU9mZnNldDtcblxuICAvLyBHZXQgc2VnbWVudCBkdXJhdGlvbiAoZGVmYXVsdCBpcyA2IHNlY29uZHMgaWYgbm90IHNwZWNpZmllZClcbiAgY29uc3Qgc2VnbWVudER1cmF0aW9uU2VjID0gc2VnbWVudER1cmF0aW9uPy50b1NlY29uZHMoKSA/PyA2O1xuXG4gIC8vIEdldCBtYW5pZmVzdCBkdXJhdGlvbiAoZGVmYXVsdCBpcyA2MCBzZWNvbmRzIGlmIG5vdCBzcGVjaWZpZWQpXG4gIGNvbnN0IG1hbmlmZXN0RHVyYXRpb25TZWMgPSBtYW5pZmVzdFdpbmRvdz8udG9TZWNvbmRzKCkgPz8gNjA7XG5cbiAgLy8gVmFsaWRhdGUgcG9zaXRpdmUgb2Zmc2V0IChmcm9tIHN0YXJ0KVxuICBpZiAodGltZU9mZnNldCA+IDApIHtcbiAgICBjb25zdCBtYXhQb3NpdGl2ZU9mZnNldCA9IG1hbmlmZXN0RHVyYXRpb25TZWMgLSAoMyAqIHNlZ21lbnREdXJhdGlvblNlYyk7XG4gICAgaWYgKHRpbWVPZmZzZXQgPj0gbWF4UG9zaXRpdmVPZmZzZXQpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgU3RhcnRUYWdQb3NpdGl2ZU9mZnNldEV4Y2VlZGVkYCwgYFN0YXJ0VGFnIHRpbWVPZmZzZXQgKCR7dGltZU9mZnNldH1zKSBtdXN0IGJlIGxlc3MgdGhhbiBtYW5pZmVzdCBkdXJhdGlvbiAoJHttYW5pZmVzdER1cmF0aW9uU2VjfXMpIG1pbnVzIDMgdGltZXMgc2VnbWVudCBkdXJhdGlvbiAoJHtzZWdtZW50RHVyYXRpb25TZWN9cykuIE1heGltdW0gYWxsb3dlZDogJHttYXhQb3NpdGl2ZU9mZnNldH1zYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGUgbmVnYXRpdmUgb2Zmc2V0IChmcm9tIGxpdmUgZWRnZSlcbiAgaWYgKHRpbWVPZmZzZXQgPCAwKSB7XG4gICAgY29uc3QgYWJzT2Zmc2V0ID0gTWF0aC5hYnModGltZU9mZnNldCk7XG4gICAgY29uc3QgbWluTmVnYXRpdmVPZmZzZXQgPSAzICogc2VnbWVudER1cmF0aW9uU2VjO1xuXG4gICAgaWYgKGFic09mZnNldCA8PSBtaW5OZWdhdGl2ZU9mZnNldCkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBTdGFydFRhZ05lZ2F0aXZlT2Zmc2V0VG9vU21hbGxgLCBgU3RhcnRUYWcgdGltZU9mZnNldCAoJHt0aW1lT2Zmc2V0fXMpIGFic29sdXRlIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDMgdGltZXMgc2VnbWVudCBkdXJhdGlvbiAoJHtzZWdtZW50RHVyYXRpb25TZWN9cykuIE1pbmltdW0gYWxsb3dlZDogLSR7bWluTmVnYXRpdmVPZmZzZXQgKyAwLjAxfXNgKTtcbiAgICB9XG5cbiAgICBpZiAoYWJzT2Zmc2V0ID49IG1hbmlmZXN0RHVyYXRpb25TZWMpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgU3RhcnRUYWdOZWdhdGl2ZU9mZnNldEV4Y2VlZHNNYW5pZmVzdGAsIGBTdGFydFRhZyB0aW1lT2Zmc2V0ICgke3RpbWVPZmZzZXR9cykgYWJzb2x1dGUgdmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gbWFuaWZlc3QgZHVyYXRpb24gKCR7bWFuaWZlc3REdXJhdGlvblNlY31zKWApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIEhMUyBtYW5pZmVzdCBjb25maWd1cmF0aW9uXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gYnVpbGRIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb24oXG4gIGNvbmZpZzogSGxzTWFuaWZlc3RDb25maWd1cmF0aW9uLFxuICBzZWdtZW50RHVyYXRpb24/OiBEdXJhdGlvbixcbik6IENmbk9yaWdpbkVuZHBvaW50Lkhsc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5IHtcbiAgaWYgKGNvbmZpZy5zdGFydFRhZykge1xuICAgIHZhbGlkYXRlU3RhcnRUYWcoY29uZmlnLnN0YXJ0VGFnLCBjb25maWcubWFuaWZlc3RXaW5kb3csIHNlZ21lbnREdXJhdGlvbik7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1hbmlmZXN0TmFtZTogY29uZmlnLm1hbmlmZXN0TmFtZSxcbiAgICBjaGlsZE1hbmlmZXN0TmFtZTogY29uZmlnLmNoaWxkTWFuaWZlc3ROYW1lLFxuICAgIG1hbmlmZXN0V2luZG93U2Vjb25kczogY29uZmlnLm1hbmlmZXN0V2luZG93Py50b1NlY29uZHMoKSxcbiAgICBwcm9ncmFtRGF0ZVRpbWVJbnRlcnZhbFNlY29uZHM6IGNvbmZpZy5wcm9ncmFtRGF0ZVRpbWVJbnRlcnZhbD8udG9TZWNvbmRzKCksXG4gICAgc2N0ZUhsczogY29uZmlnLnNjdGVBZE1hcmtlckhscyA/IHsgYWRNYXJrZXJIbHM6IGNvbmZpZy5zY3RlQWRNYXJrZXJIbHMgfSA6IHVuZGVmaW5lZCxcbiAgICBzdGFydFRhZzogY29uZmlnLnN0YXJ0VGFnLFxuICAgIHVybEVuY29kZUNoaWxkTWFuaWZlc3Q6IGNvbmZpZy51cmxFbmNvZGVDaGlsZE1hbmlmZXN0LFxuICAgIGZpbHRlckNvbmZpZ3VyYXRpb246IHZhbGlkYXRlRmlsdGVyQ29uZmlndXJhdGlvbihjb25maWcuZmlsdGVyQ29uZmlndXJhdGlvbiksXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgREFTSCBtYW5pZmVzdCBjb25maWd1cmF0aW9uXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gYnVpbGREYXNoTWFuaWZlc3RDb25maWd1cmF0aW9uKFxuICBjb25maWc6IERhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG4gIHNlZ21lbnQ/OiBTZWdtZW50Q29uZmlndXJhdGlvbixcbik6IENmbk9yaWdpbkVuZHBvaW50LkRhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eSB7XG4gIGlmIChjb25maWcubWluQnVmZmVyVGltZSAmJiAoY29uZmlnLm1pbkJ1ZmZlclRpbWUudG9TZWNvbmRzKCkgPCAxIHx8IGNvbmZpZy5taW5CdWZmZXJUaW1lLnRvU2Vjb25kcygpID4gMzYwMCkpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YE1pbkJ1ZmZlclRpbWVSYW5nZWAsICdNaW4gYnVmZmVyIHRpbWUgaGFzIGEgcmFuZ2UgZnJvbSAxIHNlYy4gdG8gMzYwMCBzZWMuJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5taW5VcGRhdGVQZXJpb2QgJiYgKGNvbmZpZy5taW5VcGRhdGVQZXJpb2QudG9TZWNvbmRzKCkgPCAxIHx8IGNvbmZpZy5taW5VcGRhdGVQZXJpb2QudG9TZWNvbmRzKCkgPiAzNjAwKSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTWluVXBkYXRlUGVyaW9kUmFuZ2VgLCAnTWluIHVwZGF0ZSBwZXJpb2Qgb3B0aW9uIGhhcyBhIHJhbmdlIGZyb20gMSBzZWMuIHRvIDM2MDAgc2VjLicpO1xuICB9XG4gIGlmIChjb25maWcuc2N0ZURhc2hBZE1hcmtlciAmJiAoIXNlZ21lbnQ/LnNjdGVGaWx0ZXIgfHwgc2VnbWVudC5zY3RlRmlsdGVyPy5sZW5ndGggPT09IDApKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBTY3RlRmlsdGVyUmVxdWlyZWRgLCAnU0NURSBGaWx0ZXIgbXVzdCBiZSBjb25maWd1cmVkIHdpdGggRGFzaEFkTWFya2VyIENvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWFuaWZlc3ROYW1lOiBjb25maWcubWFuaWZlc3ROYW1lLFxuICAgIGJhc2VVcmxzOiBjb25maWcuYmFzZVVybHMsXG4gICAgY29tcGFjdG5lc3M6IGNvbmZpZy5jb21wYWN0bmVzcyxcbiAgICBkcm1TaWduYWxpbmc6IGNvbmZpZy5kcm1TaWduYWxsaW5nLFxuICAgIGR2YlNldHRpbmdzOiBjb25maWcuZHZiU2V0dGluZ3MsXG4gICAgcHJvZmlsZXM6IGNvbmZpZy5wcm9maWxlcyxcbiAgICBwcm9ncmFtSW5mb3JtYXRpb246IGNvbmZpZy5wcm9ncmFtSW5mb3JtYXRpb24sXG4gICAgc3VidGl0bGVDb25maWd1cmF0aW9uOiBjb25maWcuc3VidGl0bGVDb25maWd1cmF0aW9uLFxuICAgIG1hbmlmZXN0V2luZG93U2Vjb25kczogY29uZmlnLm1hbmlmZXN0V2luZG93Py50b1NlY29uZHMoKSxcbiAgICBtaW5CdWZmZXJUaW1lU2Vjb25kczogY29uZmlnLm1pbkJ1ZmZlclRpbWU/LnRvU2Vjb25kcygpLFxuICAgIG1pblVwZGF0ZVBlcmlvZFNlY29uZHM6IGNvbmZpZy5taW5VcGRhdGVQZXJpb2Q/LnRvU2Vjb25kcygpLFxuICAgIHN1Z2dlc3RlZFByZXNlbnRhdGlvbkRlbGF5U2Vjb25kczogY29uZmlnLnN1Z2dlc3RlZFByZXNlbnRhdGlvbkRlbGF5Py50b1NlY29uZHMoKSxcbiAgICBzZWdtZW50VGVtcGxhdGVGb3JtYXQ6IGNvbmZpZy5zZWdtZW50VGVtcGxhdGVGb3JtYXQsXG4gICAgcGVyaW9kVHJpZ2dlcnM6IGNvbmZpZy5wZXJpb2RUcmlnZ2VycyxcbiAgICBzY3RlRGFzaDogc2VnbWVudD8uc2N0ZUZpbHRlciA/IHtcbiAgICAgIGFkTWFya2VyRGFzaDogY29uZmlnLnNjdGVEYXNoQWRNYXJrZXIsXG4gICAgfSA6IHVuZGVmaW5lZCxcbiAgICB1dGNUaW1pbmc6IGNvbmZpZy51dGNUaW1pbmdNb2RlIHx8IGNvbmZpZy51dGNUaW1pbmdTb3VyY2UgPyB7XG4gICAgICB0aW1pbmdNb2RlOiBjb25maWcudXRjVGltaW5nTW9kZSxcbiAgICAgIHRpbWluZ1NvdXJjZTogY29uZmlnLnV0Y1RpbWluZ1NvdXJjZSxcbiAgICB9IDogdW5kZWZpbmVkLFxuICAgIGZpbHRlckNvbmZpZ3VyYXRpb246IHZhbGlkYXRlRmlsdGVyQ29uZmlndXJhdGlvbihjb25maWcuZmlsdGVyQ29uZmlndXJhdGlvbiksXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgTVNTIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb25cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBidWlsZE1zc01hbmlmZXN0Q29uZmlndXJhdGlvbihjb25maWc6IE1zc01hbmlmZXN0Q29uZmlndXJhdGlvbik6IENmbk9yaWdpbkVuZHBvaW50Lk1zc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5IHtcbiAgcmV0dXJuIHtcbiAgICBtYW5pZmVzdE5hbWU6IGNvbmZpZy5tYW5pZmVzdE5hbWUsXG4gICAgbWFuaWZlc3RMYXlvdXQ6IGNvbmZpZy5tYW5pZmVzdExheW91dCxcbiAgICBtYW5pZmVzdFdpbmRvd1NlY29uZHM6IGNvbmZpZy5tYW5pZmVzdFdpbmRvdz8udG9TZWNvbmRzKCksXG4gICAgZmlsdGVyQ29uZmlndXJhdGlvbjogdmFsaWRhdGVGaWx0ZXJDb25maWd1cmF0aW9uKGNvbmZpZy5maWx0ZXJDb25maWd1cmF0aW9uKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBITFMgTWFuaWZlc3QgaW1wbGVtZW50YXRpb25cbiAqL1xuY2xhc3MgSGxzTWFuaWZlc3QgZXh0ZW5kcyBNYW5pZmVzdCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb24pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIF9iaW5kKGNvbnRleHQ6IE1hbmlmZXN0QmluZENvbnRleHQpOiB2b2lkIHtcbiAgICB2YWxpZGF0ZU1hbmlmZXN0Q29uZmlndXJhdGlvbih0aGlzLmNvbmZpZyk7XG4gICAgY29udGV4dC5obHNNYW5pZmVzdHMucHVzaChidWlsZEhsc01hbmlmZXN0Q29uZmlndXJhdGlvbih0aGlzLmNvbmZpZywgY29udGV4dC5zZWdtZW50Py5zZWdtZW50RHVyYXRpb24pKTtcbiAgfVxufVxuXG4vKipcbiAqIExvdyBMYXRlbmN5IEhMUyBNYW5pZmVzdCBpbXBsZW1lbnRhdGlvblxuICovXG5jbGFzcyBMb3dMYXRlbmN5SGxzTWFuaWZlc3QgZXh0ZW5kcyBNYW5pZmVzdCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBMb3dMYXRlbmN5SGxzTWFuaWZlc3RDb25maWd1cmF0aW9uKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBfYmluZChjb250ZXh0OiBNYW5pZmVzdEJpbmRDb250ZXh0KTogdm9pZCB7XG4gICAgdmFsaWRhdGVNYW5pZmVzdENvbmZpZ3VyYXRpb24odGhpcy5jb25maWcpO1xuICAgIGNvbnRleHQubGxIbHNNYW5pZmVzdHMucHVzaChidWlsZEhsc01hbmlmZXN0Q29uZmlndXJhdGlvbih0aGlzLmNvbmZpZywgY29udGV4dC5zZWdtZW50Py5zZWdtZW50RHVyYXRpb24pKTtcbiAgfVxufVxuXG4vKipcbiAqIERBU0ggTWFuaWZlc3QgaW1wbGVtZW50YXRpb25cbiAqL1xuY2xhc3MgRGFzaE1hbmlmZXN0IGV4dGVuZHMgTWFuaWZlc3Qge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogRGFzaE1hbmlmZXN0Q29uZmlndXJhdGlvbikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgX2JpbmQoY29udGV4dDogTWFuaWZlc3RCaW5kQ29udGV4dCk6IHZvaWQge1xuICAgIHZhbGlkYXRlTWFuaWZlc3RDb25maWd1cmF0aW9uKHRoaXMuY29uZmlnKTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy51dGNUaW1pbmdNb2RlID09PSBEYXNoVXRjVGltaW5nTW9kZS5VVENfRElSRUNUICYmIHRoaXMuY29uZmlnLnV0Y1RpbWluZ1NvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBVdGNEaXJlY3RUaW1pbmdTb3VyY2VgLCAnVVRDIERpcmVjdCBjb25maWd1cmVkIHdpdGggYSB0aW1pbmcgc291cmNlLCBlbnN1cmUgdGltaW5nIHNvdXJjZSBpcyB1bmRlZmluZWQgdG8gdXNlIFVUQyBEaXJlY3QuJyk7XG4gICAgfVxuXG4gICAgY29udGV4dC5kYXNoTWFuaWZlc3RzLnB1c2goYnVpbGREYXNoTWFuaWZlc3RDb25maWd1cmF0aW9uKHRoaXMuY29uZmlnLCBjb250ZXh0LnNlZ21lbnQpKTtcbiAgfVxufVxuXG4vKipcbiAqIE1TUyBNYW5pZmVzdCBpbXBsZW1lbnRhdGlvblxuICovXG5jbGFzcyBNc3NNYW5pZmVzdCBleHRlbmRzIE1hbmlmZXN0IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb25maWc6IE1zc01hbmlmZXN0Q29uZmlndXJhdGlvbikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgX2JpbmQoY29udGV4dDogTWFuaWZlc3RCaW5kQ29udGV4dCk6IHZvaWQge1xuICAgIHZhbGlkYXRlTWFuaWZlc3RDb25maWd1cmF0aW9uKHRoaXMuY29uZmlnKTtcbiAgICBjb250ZXh0Lm1zc01hbmlmZXN0cy5wdXNoKGJ1aWxkTXNzTWFuaWZlc3RDb25maWd1cmF0aW9uKHRoaXMuY29uZmlnKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBjb250YWluZXIgdG8gYXR0YWNoIHRvIHRoaXMgb3JpZ2luIGVuZHBvaW50LlxuICogQSBjb250YWluZXIgdHlwZSBpcyBhIGZpbGUgZm9ybWF0IHRoYXQgZW5jYXBzdWxhdGVzIG9uZSBvciBtb3JlIG1lZGlhIHN0cmVhbXMsIHN1Y2ggYXMgYXVkaW8gYW5kIHZpZGVvLCBpbnRvIGEgc2luZ2xlIGZpbGUuIFlvdSBjYW4ndCBjaGFuZ2UgdGhlIGNvbnRhaW5lciB0eXBlIGFmdGVyIHlvdSBjcmVhdGUgdGhlIGVuZHBvaW50LlxuICovXG5leHBvcnQgZW51bSBDb250YWluZXJUeXBlIHtcbiAgLyoqXG4gICAqIFRTIENvbnRhaW5lciBUeXBlXG4gICAqL1xuICBUUz0nVFMnLFxuICAvKipcbiAgICogQ01BRiBDb250YWluZXIgVHlwZVxuICAgKi9cbiAgQ01BRj0nQ01BRicsXG4gIC8qKlxuICAgKiBJU00gQ29udGFpbmVyIFR5cGUgKE1pY3Jvc29mdCBTbW9vdGggU3RyZWFtaW5nKVxuICAgKi9cbiAgSVNNPSdJU00nLFxufVxuXG4vKipcbiAqIEVuY3J5cHRpb24gbWV0aG9kcyBmb3IgQ01BRiBjb250YWluZXIgdHlwZS5cbiAqL1xuZXhwb3J0IGVudW0gQ21hZkVuY3J5cHRpb25NZXRob2Qge1xuICAvKipcbiAgICogQ29tbW9uIEVuY3J5cHRpb24gU2NoZW1lIChDRU5DKSAtIGNvbXBhdGlibGUgd2l0aCBQbGF5UmVhZHksIFdpZGV2aW5lLCBhbmQgSXJkZXRvIERSTSBzeXN0ZW1zLlxuICAgKi9cbiAgQ0VOQyA9ICdDRU5DJyxcbiAgLyoqXG4gICAqIENvbW1vbiBFbmNyeXB0aW9uIFNjaGVtZSB3aXRoIENCQ1MgbW9kZSAtIGNvbXBhdGlibGUgd2l0aCBQbGF5UmVhZHksIFdpZGV2aW5lLCBhbmQgRmFpclBsYXkgRFJNIHN5c3RlbXMuXG4gICAqL1xuICBDQkNTID0gJ0NCQ1MnLFxufVxuXG4vKipcbiAqIEVuY3J5cHRpb24gbWV0aG9kcyBmb3IgVFMgY29udGFpbmVyIHR5cGUuXG4gKi9cbmV4cG9ydCBlbnVtIFRzRW5jcnlwdGlvbk1ldGhvZCB7XG4gIC8qKlxuICAgKiBBRVMtMTI4IGVuY3J5cHRpb24gLSByZXF1aXJlcyBDbGVhciBLZXkgQUVTIDEyOCBEUk0gc3lzdGVtLlxuICAgKi9cbiAgQUVTXzEyOCA9ICdBRVNfMTI4JyxcbiAgLyoqXG4gICAqIFNhbXBsZS1sZXZlbCBBRVMgZW5jcnlwdGlvbiAtIHJlcXVpcmVzIEZhaXJQbGF5IERSTSBzeXN0ZW0uXG4gICAqL1xuICBTQU1QTEVfQUVTID0gJ1NBTVBMRV9BRVMnLFxufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBhdWRpbyBlbmNyeXB0aW9uIHByZXNldHMuXG4gKi9cbmV4cG9ydCBlbnVtIFByZXNldFNwZWtlMjBBdWRpbyB7XG4gIC8qKlxuICAgKiBVc2Ugb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBhdWRpbyB0cmFja3MgaW4geW91ciBzdHJlYW0uXG4gICAqL1xuICBQUkVTRVRfQVVESU9fMT0nUFJFU0VUX0FVRElPXzEnLFxuICAvKipcbiAgICogVXNlIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgc3RlcmVvIGF1ZGlvIHRyYWNrcyBhbmQgb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBtdWx0aWNoYW5uZWwgYXVkaW8gdHJhY2tzLlxuICAgKi9cbiAgUFJFU0VUX0FVRElPXzI9J1BSRVNFVF9BVURJT18yJyxcbiAgLyoqXG4gICAqIFVzZSBvbmUgY29udGVudCBrZXkgdG8gZW5jcnlwdCBhbGwgb2YgdGhlIHN0ZXJlbyBhdWRpbyB0cmFja3MsIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgbXVsdGljaGFubmVsIGF1ZGlvIHRyYWNrcyB3aXRoIDMgdG8gNiBjaGFubmVscyxcbiAgICogYW5kIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgbXVsdGljaGFubmVsIGF1ZGlvIHRyYWNrcyB3aXRoIG1vcmUgdGhhbiA2IGNoYW5uZWxzLlxuICAgKi9cbiAgUFJFU0VUX0FVRElPXzM9J1BSRVNFVF9BVURJT18zJyxcbiAgLyoqXG4gICAqIFVzZSB0aGUgc2FtZSBjb250ZW50IGtleSBmb3IgYWxsIG9mIHRoZSBhdWRpbyBhbmQgdmlkZW8gdHJhY2tzIGluIHlvdXIgc3RyZWFtLlxuICAgKi9cbiAgU0hBUkVEPSdTSEFSRUQnLFxuICAvKipcbiAgICogRG9uJ3QgZW5jcnlwdCBhbnkgb2YgdGhlIGF1ZGlvIHRyYWNrcyBpbiB5b3VyIHN0cmVhbS5cbiAgICovXG4gIFVORU5DUllQVEVEPSdVTkVOQ1JZUFRFRCcsXG59XG5cbi8qKlxuICogVGhlIFNQRUtFIFZlcnNpb24gMi4wIHByZXNldCB2aWRlbyBhc3NvY2lhdGVkIHdpdGggdGhlIGVuY3J5cHRpb24gY29udHJhY3QgY29uZmlndXJhdGlvbiBvZiB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICpcbiAqIEEgY29sbGVjdGlvbiBvZiB2aWRlbyBlbmNyeXB0aW9uIHByZXNldHMuXG4gKi9cbmV4cG9ydCBlbnVtIFByZXNldFNwZWtlMjBWaWRlbyB7XG4gIC8qKlxuICAgKiBVc2Ugb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSB2aWRlbyB0cmFja3MgaW4geW91ciBzdHJlYW0uXG4gICAqL1xuICBQUkVTRVRfVklERU9fMT0nUFJFU0VUX1ZJREVPXzEnLFxuICAvKipcbiAgICogVXNlIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgU0QgdmlkZW8gdHJhY2tzIGFuZCBvbmUgY29udGVudCBrZXkgZm9yIGFsbCBIRCBhbmQgaGlnaGVyIHJlc29sdXRpb25zIHZpZGVvIHRyYWNrcy5cbiAgICovXG4gIFBSRVNFVF9WSURFT18yPSdQUkVTRVRfVklERU9fMicsXG4gIC8qKlxuICAgKiBVc2Ugb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBTRCB2aWRlbyB0cmFja3MsIG9uZSBjb250ZW50IGtleSBmb3IgSEQgdmlkZW8gdHJhY2tzIGFuZCBvbmUgY29udGVudCBrZXkgZm9yIGFsbCBVSEQgdmlkZW8gdHJhY2tzLlxuICAgKi9cbiAgUFJFU0VUX1ZJREVPXzM9J1BSRVNFVF9WSURFT18zJyxcbiAgLyoqXG4gICAqIFVzZSBvbmUgY29udGVudCBrZXkgdG8gZW5jcnlwdCBhbGwgb2YgdGhlIFNEIHZpZGVvIHRyYWNrcywgb25lIGNvbnRlbnQga2V5IGZvciBIRCB2aWRlbyB0cmFja3MsXG4gICAqIG9uZSBjb250ZW50IGtleSBmb3IgYWxsIFVIRDEgdmlkZW8gdHJhY2tzIGFuZCBvbmUgY29udGVudCBrZXkgZm9yIGFsbCBVSEQyIHZpZGVvIHRyYWNrcy5cbiAgICovXG4gIFBSRVNFVF9WSURFT180PSdQUkVTRVRfVklERU9fNCcsXG4gIC8qKlxuICAgKiBVc2Ugb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBTRCB2aWRlbyB0cmFja3MsIG9uZSBjb250ZW50IGtleSBmb3IgSEQxIHZpZGVvIHRyYWNrcywgb25lIGNvbnRlbnQga2V5IGZvciBIRDIgdmlkZW8gdHJhY2tzLFxuICAgKiBvbmUgY29udGVudCBrZXkgZm9yIGFsbCBVSEQxIHZpZGVvIHRyYWNrcyBhbmQgb25lIGNvbnRlbnQga2V5IGZvciBhbGwgVUhEMiB2aWRlbyB0cmFja3MuXG4gICAqL1xuICBQUkVTRVRfVklERU9fNT0nUFJFU0VUX1ZJREVPXzUnLFxuICAvKipcbiAgICogVXNlIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgU0QgdmlkZW8gdHJhY2tzLCBvbmUgY29udGVudCBrZXkgZm9yIEhEMSB2aWRlbyB0cmFja3MsIG9uZSBjb250ZW50IGtleSBmb3IgSEQyIHZpZGVvIHRyYWNrc1xuICAgKiBhbmQgb25lIGNvbnRlbnQga2V5IGZvciBhbGwgVUhEIHZpZGVvIHRyYWNrcy5cbiAgICovXG4gIFBSRVNFVF9WSURFT182PSdQUkVTRVRfVklERU9fNicsXG4gIC8qKlxuICAgKiBVc2Ugb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBTRCtIRDEgdmlkZW8gdHJhY2tzLCBvbmUgY29udGVudCBrZXkgZm9yIEhEMiB2aWRlbyB0cmFja3MgYW5kIG9uZSBjb250ZW50IGtleSBmb3IgYWxsIFVIRCB2aWRlbyB0cmFja3MuXG4gICAqL1xuICBQUkVTRVRfVklERU9fNz0nUFJFU0VUX1ZJREVPXzcnLFxuICAvKipcbiAgICogVXNlIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgU0QrSEQxIHZpZGVvIHRyYWNrcywgb25lIGNvbnRlbnQga2V5IGZvciBIRDIgdmlkZW8gdHJhY2tzLCBvbmUgY29udGVudCBrZXkgZm9yIGFsbCBVSEQxXG4gICAqIHZpZGVvIHRyYWNrcyBhbmQgb25lIGNvbnRlbnQga2V5IGZvciBhbGwgVUhEMiB2aWRlbyB0cmFja3MuXG4gICAqL1xuICBQUkVTRVRfVklERU9fOD0nUFJFU0VUX1ZJREVPXzgnLFxuICAvKipcbiAgICogVXNlIHRoZSBzYW1lIGNvbnRlbnQga2V5IGZvciBhbGwgb2YgdGhlIHZpZGVvIGFuZCBhdWRpbyB0cmFja3MgaW4geW91ciBzdHJlYW0uXG4gICAqL1xuICBTSEFSRUQ9J1NIQVJFRCcsXG4gIC8qKlxuICAgKiBEb24ndCBlbmNyeXB0IGFueSBvZiB0aGUgdmlkZW8gdHJhY2tzIGluIHlvdXIgc3RyZWFtLlxuICAgKi9cbiAgVU5FTkNSWVBURUQ9J1VORU5DUllQVEVEJyxcbn1cblxuLyoqXG4gKiBFbmRwb2ludCBlcnJvciBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBlbnVtIEVuZHBvaW50RXJyb3JDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBtYW5pZmVzdCBzdGFsbGVkIGFuZCB0aGVyZSBhcmUgbm8gbmV3IHNlZ21lbnRzIG9yIHBhcnRzLlxuICAgKi9cbiAgU1RBTEVfTUFOSUZFU1Q9J1NUQUxFX01BTklGRVNUJyxcbiAgLyoqXG4gICAqIFRoZXJlIGlzIGEgZ2FwIGluIHRoZSBtYW5pZmVzdC5cbiAgICovXG4gIElOQ09NUExFVEVfTUFOSUZFU1Q9J0lOQ09NUExFVEVfTUFOSUZFU1QnLFxuICAvKipcbiAgICogS2V5IHJvdGF0aW9uIGlzIGVuYWJsZWQgYnV0IHdlJ3JlIHVuYWJsZSB0byBmZXRjaCB0aGUga2V5IGZvciB0aGUgY3VycmVudCBrZXkgcGVyaW9kLlxuICAgKi9cbiAgTUlTU0lOR19EUk1fS0VZPSdNSVNTSU5HX0RSTV9LRVknLFxuICAvKipcbiAgICogVGhlIHNlZ21lbnRzIHdoaWNoIGNvbnRhaW4gc2xhdGUgY29udGVudCBhcmUgY29uc2lkZXJlZCB0byBiZSBtaXNzaW5nIGNvbnRlbnQuXG4gICAqL1xuICBTTEFURV9JTlBVVD0nU0xBVEVfSU5QVVQnLFxufVxuXG4vKipcbiAqIFNDVEUtMzUgbWVzc2FnZSB0eXBlIG9wdGlvbnMgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgZW51bSBTY3RlTWVzc2FnZVR5cGUge1xuICAvKipcbiAgICogT3B0aW9uIGZvciBTUExJQ0VfSU5TRVJULlxuICAgKi9cbiAgU1BMSUNFX0lOU0VSVD0nU1BMSUNFX0lOU0VSVCcsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIEJSRUFLLlxuICAgKi9cbiAgQlJFQUs9J0JSRUFLJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgUFJPVklERVJfQURWRVJUSVNFTUVOVC5cbiAgICovXG4gIFBST1ZJREVSX0FEVkVSVElTRU1FTlQ9J1BST1ZJREVSX0FEVkVSVElTRU1FTlQnLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBESVNUUklCVVRPUl9BRFZFUlRJU0VNRU5ULlxuICAgKi9cbiAgRElTVFJJQlVUT1JfQURWRVJUSVNFTUVOVD0nRElTVFJJQlVUT1JfQURWRVJUSVNFTUVOVCcsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIFBST1ZJREVSX1BMQUNFTUVOVF9PUFBPUlRVTklUWS5cbiAgICovXG4gIFBST1ZJREVSX1BMQUNFTUVOVF9PUFBPUlRVTklUWT0nUFJPVklERVJfUExBQ0VNRU5UX09QUE9SVFVOSVRZJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgRElTVFJJQlVUT1JfUExBQ0VNRU5UX09QUE9SVFVOSVRZLlxuICAgKi9cbiAgRElTVFJJQlVUT1JfUExBQ0VNRU5UX09QUE9SVFVOSVRZPSdESVNUUklCVVRPUl9QTEFDRU1FTlRfT1BQT1JUVU5JVFknLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBQUk9WSURFUl9PVkVSTEFZX1BMQUNFTUVOVF9PUFBPUlRVTklUWS5cbiAgICovXG4gIFBST1ZJREVSX09WRVJMQVlfUExBQ0VNRU5UX09QUE9SVFVOSVRZPSdQUk9WSURFUl9PVkVSTEFZX1BMQUNFTUVOVF9PUFBPUlRVTklUWScsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIERJU1RSSUJVVE9SX09WRVJMQVlfUExBQ0VNRU5UX09QUE9SVFVOSVRZLlxuICAgKi9cbiAgRElTVFJJQlVUT1JfT1ZFUkxBWV9QTEFDRU1FTlRfT1BQT1JUVU5JVFk9J0RJU1RSSUJVVE9SX09WRVJMQVlfUExBQ0VNRU5UX09QUE9SVFVOSVRZJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgUFJPR1JBTS5cbiAgICovXG4gIFBST0dSQU09J1BST0dSQU0nLFxufVxuXG4vKipcbiAqIENvbnRyb2xzIHdoZXRoZXIgU0NURS0zNSBtZXNzYWdlcyBhcmUgaW5jbHVkZWQgaW4gc2VnbWVudCBmaWxlcy5cbiAqL1xuZXhwb3J0IGVudW0gU2N0ZUluU2VnbWVudHMge1xuICAvKipcbiAgICogU0NURS0zNSBtZXNzYWdlcyBhcmUgbm90IGluY2x1ZGVkIGluIHNlZ21lbnRzLlxuICAgKi9cbiAgTk9ORSA9ICdOT05FJyxcbiAgLyoqXG4gICAqIFNDVEUtMzUgbWVzc2FnZXMgYXJlIGVtYmVkZGVkIGluIHNlZ21lbnQgZGF0YS5cbiAgICpcbiAgICogRm9yIERBU0ggbWFuaWZlc3RzLCB3aGVuIHNldCB0byBBTEwsIGFuIEluYmFuZEV2ZW50U3RyZWFtIHRhZyBzaWduYWxzXG4gICAqIHRoYXQgU0NURSBtZXNzYWdlcyBhcmUgcHJlc2VudCBpbiBzZWdtZW50cy5cbiAgICovXG4gIEFMTCA9ICdBTEwnLFxufVxuXG4vKipcbiAqIE9yaWdpbiBFbmRwb2ludCBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJT3JpZ2luRW5kcG9pbnQgZXh0ZW5kcyBJUmVzb3VyY2UsIElPcmlnaW5FbmRwb2ludFJlZiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY2hhbm5lbCBncm91cCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbiBlbmRwb2ludCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjaGFubmVsR3JvdXBOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjaGFubmVsIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWxOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBvcmlnaW4gZW5kcG9pbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luRW5kcG9pbnROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5FbmRwb2ludEFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB0aGUgb3JpZ2luIGVuZHBvaW50IHdhcyBjcmVhdGVkLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjcmVhdGVkQXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRlIGFuZCB0aW1lIHRoZSBvcmlnaW4gZW5kcG9pbnQgd2FzIG1vZGlmaWVkLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBtb2RpZmllZEF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSExTIG1hbmlmZXN0IFVSTHMgZm9yIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGhsc01hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgTG93IExhdGVuY3kgSExTIG1hbmlmZXN0IFVSTHMgZm9yIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGxvd0xhdGVuY3lIbHNNYW5pZmVzdFVybHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIERBU0ggbWFuaWZlc3QgVVJMcyBmb3IgdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZGFzaE1hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgTVNTIG1hbmlmZXN0IFVSTHMgZm9yIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IG1zc01hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgb3JpZ2luIGVuZHBvaW50IHBvbGljeS5cbiAgICpcbiAgICogWW91IGNhbiBvbmx5IGFkZCAxIE9yaWdpbkVuZHBvaW50UG9saWN5IHRvIGFuIE9yaWdpbkVuZHBvaW50LlxuICAgKiBJZiB5b3UgaGF2ZSBhbHJlYWR5IGRlZmluZWQgb25lLCBpdCB3aWxsIGFwcGVuZCB0byB0aGUgcG9saWN5IGFscmVhZHkgY3JlYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRlbWVudCAtIFRoZSBwb2xpY3kgc3RhdGVtZW50IHRvIGFkZFxuICAgKiBAcGFyYW0gY2RuQXV0aCAtIE9wdGlvbmFsIENETiBhdXRob3JpemF0aW9uIGNvbmZpZ3VyYXRpb24uIE9ubHkgdGhlIGZpcnN0IENETiBhdXRoIGNvbmZpZ3VyYXRpb24gaXMgdXNlZCBpZiBwcm92aWRlZCBtdWx0aXBsZSB0aW1lcy5cbiAgICovXG4gIGFkZFRvUmVzb3VyY2VQb2xpY3koc3RhdGVtZW50OiBQb2xpY3lTdGF0ZW1lbnQsIGNkbkF1dGg/OiBDZG5BdXRoQ29uZmlndXJhdGlvbik6IEFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0cmljTmFtZSBuYW1lIG9mIHRoZSBtZXRyaWMuXG4gICAqIEBwYXJhbSBwcm9wcyBtZXRyaWMgb3B0aW9ucy5cbiAgICovXG4gIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJucyBNZXRyaWMgZm9yIEluZ3Jlc3MgQnl0ZXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNJbmdyZXNzQnl0ZXMob3B0aW9ucz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgTWV0cmljIGZvciBFZ3Jlc3MgQnl0ZXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNFZ3Jlc3NCeXRlcyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgTWV0cmljIGZvciBJbmdyZXNzIHJlc3BvbnNlIHRpbWVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdmVyYWdlIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgbWV0cmljSW5ncmVzc1Jlc3BvbnNlVGltZShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgTWV0cmljIGZvciBFZ3Jlc3MgUmVzcG9uc2UgdGltZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGF2ZXJhZ2Ugb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNFZ3Jlc3NSZXNwb25zZVRpbWUocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIE1ldHJpYyBmb3IgRWdyZXNzIFJlcXVlc3QgQ291bnRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNFZ3Jlc3NSZXF1ZXN0Q291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIE1ldHJpYyBmb3IgSW5ncmVzcyBSZXF1ZXN0IENvdW50XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgbWV0cmljSW5ncmVzc1JlcXVlc3RDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG59XG5cbi8qKlxuICogRFJNIHNldHRpbmdzIGtleXMgZm9yIG1hbmlmZXN0IGZpbHRlciBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZW51bSBEcm1TZXR0aW5nc0tleSB7XG4gIC8qKlxuICAgKiBFeGNsdWRlIEVYVC1YLVNFU1NJT04tS0VZIHRhZ3MgZnJvbSBITFMgYW5kIExMLUhMUyBtdWx0aXZhcmlhbnQgcGxheWxpc3RzLlxuICAgKlxuICAgKiBUaGlzIGNhbiBpbXByb3ZlIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgSExTIGNsaWVudHMgdGhhdCBoYXZlIGlzc3Vlc1xuICAgKiBwcm9jZXNzaW5nIHNlc3Npb24ga2V5cywgb3IgcHJvdmlkZSBtb3JlIGdyYW51bGFyIGFjY2VzcyBjb250cm9sIHdoZW5cbiAgICogdXNpbmcgbWFuaWZlc3QgZmlsdGVyaW5nLlxuICAgKi9cbiAgRVhDTFVERV9TRVNTSU9OX0tFWVMgPSAnZXhjbHVkZV9zZXNzaW9uX2tleXMnLFxufVxuXG4vKipcbiAqIEZpbHRlciBjb25maWd1cmF0aW9uIGluY2x1ZGVzIHNldHRpbmdzIGZvciBtYW5pZmVzdCBmaWx0ZXJpbmcsIHN0YXJ0IGFuZCBlbmQgdGltZXMsIGFuZCB0aW1lIGRlbGF5IHRoYXQgYXBwbHkgdG8gYWxsIG9mIHlvdXIgZWdyZXNzIHJlcXVlc3RzIGZvciB0aGlzIG1hbmlmZXN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogT3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBjbGlwIHN0YXJ0IHRpbWUgZm9yIGFsbCBvZiB5b3VyIG1hbmlmZXN0IGVncmVzcyByZXF1ZXN0cy5cbiAgICogV2hlbiB5b3UgaW5jbHVkZSBjbGlwIHN0YXJ0IHRpbWUsIG5vdGUgdGhhdCB5b3UgY2Fubm90IHVzZSBjbGlwIHN0YXJ0IHRpbWUgcXVlcnkgcGFyYW1ldGVycyBmb3IgdGhpcyBtYW5pZmVzdCdzIGVuZHBvaW50IFVSTC5cbiAgICpcbiAgICogVGhpcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIFVUQyB0aW1lc3RhbXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gY2xpcCBzdGFydCB0aW1lXG4gICAqL1xuICByZWFkb25seSBjbGlwU3RhcnRUaW1lPzogRGF0ZTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgZW5kIHRpbWUgZm9yIGFsbCBvZiB5b3VyIG1hbmlmZXN0IGVncmVzcyByZXF1ZXN0cy5cbiAgICogV2hlbiB5b3UgaW5jbHVkZSBlbmQgdGltZSwgbm90ZSB0aGF0IHlvdSBjYW5ub3QgdXNlIGVuZCB0aW1lIHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHRoaXMgbWFuaWZlc3QncyBlbmRwb2ludCBVUkwuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBVVEMgdGltZXN0YW1wLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGVuZCB0aW1lXG4gICAqL1xuICByZWFkb25seSBlbmQ/OiBEYXRlO1xuICAvKipcbiAgICogT3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBzdGFydCB0aW1lIGZvciBhbGwgb2YgeW91ciBtYW5pZmVzdCBlZ3Jlc3MgcmVxdWVzdHMuXG4gICAqIFdoZW4geW91IGluY2x1ZGUgc3RhcnQgdGltZSwgbm90ZSB0aGF0IHlvdSBjYW5ub3QgdXNlIHN0YXJ0IHRpbWUgcXVlcnkgcGFyYW1ldGVycyBmb3IgdGhpcyBtYW5pZmVzdCdzIGVuZHBvaW50IFVSTC5cbiAgICpcbiAgICogVGhpcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIFVUQyB0aW1lc3RhbXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gc3RhcnQgdGltZVxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnQ/OiBEYXRlO1xuICAvKipcbiAgICogT3B0aW9uYWxseSBzcGVjaWZ5IG9uZSBvciBtb3JlIG1hbmlmZXN0IGZpbHRlcnMgZm9yIGFsbCBvZiB5b3VyIG1hbmlmZXN0IGVncmVzcyByZXF1ZXN0cy5cbiAgICogV2hlbiB5b3UgaW5jbHVkZSBhIG1hbmlmZXN0IGZpbHRlciwgbm90ZSB0aGF0IHlvdSBjYW5ub3QgdXNlIGFuIGlkZW50aWNhbCBtYW5pZmVzdCBmaWx0ZXIgcXVlcnkgcGFyYW1ldGVyIGZvciB0aGlzIG1hbmlmZXN0J3MgZW5kcG9pbnQgVVJMLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIG1hbmlmZXN0IGZpbHRlcnNcbiAgICovXG4gIHJlYWRvbmx5IG1hbmlmZXN0RmlsdGVyPzogTWFuaWZlc3RGaWx0ZXJbXTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgdGltZSBkZWxheSBmb3IgYWxsIG9mIHlvdXIgbWFuaWZlc3QgZWdyZXNzIHJlcXVlc3RzLiBFbnRlciBhIHZhbHVlIHRoYXQgaXMgc21hbGxlciB0aGFuIHlvdXIgZW5kcG9pbnQncyBzdGFydG92ZXIgd2luZG93LlxuICAgKiBXaGVuIHlvdSBpbmNsdWRlIHRpbWUgZGVsYXksIG5vdGUgdGhhdCB5b3UgY2Fubm90IHVzZSB0aW1lIGRlbGF5IHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHRoaXMgbWFuaWZlc3QncyBlbmRwb2ludCBVUkwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gdGltZSBkZWxheVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZURlbGF5PzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBEUk0gc2V0dGluZ3MgZm9yIG1hbmlmZXN0IGVncmVzcyByZXF1ZXN0cy5cbiAgICpcbiAgICogV2hlbiB5b3UgaW5jbHVkZSBhIERSTSBzZXR0aW5nLCBub3RlIHRoYXQgeW91IGNhbm5vdCB1c2UgYW4gaWRlbnRpY2FsXG4gICAqIERSTSBzZXR0aW5nIHF1ZXJ5IHBhcmFtZXRlciBmb3IgdGhpcyBtYW5pZmVzdCdzIGVuZHBvaW50IFVSTC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBEUk0gc2V0dGluZ3NcbiAgICovXG4gIHJlYWRvbmx5IGRybVNldHRpbmdzPzogRHJtU2V0dGluZ3NLZXlbXTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyBhIFN0YXJ0VGFnLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0VGFnT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTcGVjaWZ5IHRoZSB2YWx1ZSBmb3IgUFJFQ0lTRSB3aXRoaW4geW91ciBFWFQtWC1TVEFSVCB0YWcuXG4gICAqXG4gICAqIExlYXZlIGJsYW5rLCBvciBjaG9vc2UgZmFsc2UsIHRvIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBOTy4gQ2hvb3NlIHRydWUgdG8gdXNlIHRoZSB2YWx1ZSBZRVMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBwcmVjaXNlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgZm9yIGNyZWF0aW5nIEVYVC1YLVNUQVJUIHRhZ3MgaW4gSExTIHBsYXlsaXN0cy5cbiAqXG4gKiBUaGUgRVhULVgtU1RBUlQgdGFnIGluZGljYXRlcyBhIHByZWZlcnJlZCBwb2ludCBhdCB3aGljaCB0byBzdGFydCBwbGF5aW5nIGEgcGxheWxpc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFydFRhZyB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzdGFydCB0YWcgd2l0aCBhIHRpbWUgb2Zmc2V0LlxuICAgKlxuICAgKiBAcGFyYW0gdGltZU9mZnNldCBUaGUgdGltZSBvZmZzZXQgaW4gc2Vjb25kcy4gQ2FuIGJlIHBvc2l0aXZlIChmb3J3YXJkIGZyb20gc3RhcnQpIG9yIG5lZ2F0aXZlIChiYWNrIGZyb20gbGl2ZSBlZGdlKS5cbiAgICogICAtIElmIHBvc2l0aXZlOiBtdXN0IGJlIGxlc3MgdGhhbiAobWFuaWZlc3QgZHVyYXRpb24gLSAzIMOXIHNlZ21lbnQgZHVyYXRpb24pXG4gICAqICAgLSBJZiBuZWdhdGl2ZTogYWJzb2x1dGUgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gKDMgw5cgc2VnbWVudCBkdXJhdGlvbikgYW5kIGxlc3MgdGhhbiBtYW5pZmVzdCBkdXJhdGlvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBBZGRpdGlvbmFsIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodGltZU9mZnNldDogbnVtYmVyLCBvcHRpb25zPzogU3RhcnRUYWdPcHRpb25zKTogU3RhcnRUYWcge1xuICAgIHJldHVybiB7XG4gICAgICB0aW1lT2Zmc2V0LFxuICAgICAgcHJlY2lzZTogb3B0aW9ucyAmJiBvcHRpb25zLnByZWNpc2UgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucHJlY2lzZSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0YXJ0IHRhZyB3aXRoIHByZWNpc2UgcG9zaXRpb25pbmcgZW5hYmxlZCAoUFJFQ0lTRT1ZRVMpLlxuICAgKlxuICAgKiBAcGFyYW0gdGltZU9mZnNldCBUaGUgdGltZSBvZmZzZXQgaW4gc2Vjb25kcyAocG9zaXRpdmUgb3IgbmVnYXRpdmUpXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHdpdGhQcmVjaXNlKHRpbWVPZmZzZXQ6IG51bWJlcik6IFN0YXJ0VGFnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGltZU9mZnNldCxcbiAgICAgIHByZWNpc2U6IHRydWUsXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIEVYVC1YLVNUQVJUIHRhZyBpbiBITFMgcGxheWxpc3RzLlxuICpcbiAqIFVzZSB0aGUgYFN0YXJ0VGFnYCBoZWxwZXIgY2xhc3MgdG8gY3JlYXRlIGluc3RhbmNlcyB3aXRoIHZhbGlkYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRUYWcge1xuICAvKipcbiAgICogU3BlY2lmeSB0aGUgdmFsdWUgZm9yIFBSRUNJU0Ugd2l0aGluIHlvdXIgRVhULVgtU1RBUlQgdGFnLlxuICAgKlxuICAgKiBMZWF2ZSBibGFuaywgb3IgY2hvb3NlIGZhbHNlLCB0byB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgTk8uIENob29zZSB0cnVlIHRvIHVzZSB0aGUgdmFsdWUgWUVTLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlY2lzZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTcGVjaWZ5IHRoZSB2YWx1ZSBmb3IgVElNRS1PRkZTRVQgd2l0aGluIHlvdXIgRVhULVgtU1RBUlQgdGFnLlxuICAgKlxuICAgKiBFbnRlciBhIHNpZ25lZCBmbG9hdGluZyBwb2ludCB2YWx1ZSB3aGljaCwgaWYgcG9zaXRpdmUsIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBjb25maWd1cmVkXG4gICAqIG1hbmlmZXN0IGR1cmF0aW9uIG1pbnVzIHRocmVlIHRpbWVzIHRoZSBjb25maWd1cmVkIHNlZ21lbnQgdGFyZ2V0IGR1cmF0aW9uLiBJZiBuZWdhdGl2ZSxcbiAgICogdGhlIGFic29sdXRlIHZhbHVlIG11c3QgYmUgbGFyZ2VyIHRoYW4gdGhyZWUgdGltZXMgdGhlIGNvbmZpZ3VyZWQgc2VnbWVudCB0YXJnZXQgZHVyYXRpb24sXG4gICAqIGFuZCB0aGUgYWJzb2x1dGUgdmFsdWUgbXVzdCBiZSBzbWFsbGVyIHRoYW4gdGhlIGNvbmZpZ3VyZWQgbWFuaWZlc3QgZHVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSB0aW1lT2Zmc2V0OiBudW1iZXI7XG59XG5cbi8qKlxuICogQmFzZSBtYW5pZmVzdCBjb25maWd1cmF0aW9uLlxuICovXG5pbnRlcmZhY2UgTWFuaWZlc3RDb25maWd1cmF0aW9uQmFzZSB7XG4gIC8qKlxuICAgKiBGaWx0ZXIgY29uZmlndXJhdGlvbiBpbmNsdWRlcyBzZXR0aW5ncyBmb3IgbWFuaWZlc3QgZmlsdGVyaW5nLCBzdGFydCBhbmQgZW5kIHRpbWVzLCBhbmQgdGltZSBkZWxheSB0aGF0IGFwcGx5IHRvIGFsbCBvZiB5b3VyIGVncmVzcyByZXF1ZXN0cyBmb3IgdGhpcyBtYW5pZmVzdC5cbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhcGFja2FnZS9sYXRlc3QvdXNlcmd1aWRlL21hbmlmZXN0LWZpbHRlci1xdWVyeS1wYXJhbWV0ZXJzLmh0bWxcbiAgICogQGRlZmF1bHQgLSBObyBmaWx0ZXIgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZmlsdGVyQ29uZmlndXJhdGlvbj86IEZpbHRlckNvbmZpZ3VyYXRpb247XG4gIC8qKlxuICAgKiBUaGUgdG90YWwgZHVyYXRpb24gKGluIHNlY29uZHMpIG9mIHRoZSBtYW5pZmVzdCdzIGNvbnRlbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IDYwXG4gICAqL1xuICByZWFkb25seSBtYW5pZmVzdFdpbmRvdz86IER1cmF0aW9uO1xufVxuXG4vKipcbiAqIENob29zZSBob3cgYWQgbWFya2VycyBhcmUgaW5jbHVkZWQgaW4gdGhlIHBhY2thZ2VkIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBlbnVtIEFkTWFya2VyRGFzaCB7XG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIEJJTkFSWSAtIFRoZSBTQ1RFLTM1IG1hcmtlciBpcyBleHByZXNzZWQgYXMgYSBoZXgtc3RyaW5nIChCYXNlNjQgc3RyaW5nKSByYXRoZXIgdGhhbiBmdWxsIFhNTC5cbiAgICovXG4gIEJJTkFSWT0nQklOQVJZJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgWE1MIC0gVGhlIFNDVEUgbWFya2VyIGlzIGV4cHJlc3NlZCBmdWxseSBpbiBYTUwuXG4gICAqL1xuICBYTUw9J1hNTCcsXG59XG5cbi8qKlxuICogQ2hvb3NlIGhvdyBTQ1RFLTM1IGFkIG1hcmtlcnMgYXJlIGluY2x1ZGVkIGluIEhMUyBhbmQgTEwtSExTIG1hbmlmZXN0cy5cbiAqL1xuZXhwb3J0IGVudW0gQWRNYXJrZXJIbHMge1xuICAvKipcbiAgICogSW5zZXJ0IEVYVC1YLURBVEVSQU5HRSB0YWdzIHRvIHNpZ25hbCBhZCBjb250ZW50LlxuICAgKi9cbiAgREFURVJBTkdFID0gJ0RBVEVSQU5HRScsXG4gIC8qKlxuICAgKiBJbnNlcnQgZW5oYW5jZWQgU0NURS0zNSB0YWdzIGZvciBhZCBjb250ZW50LlxuICAgKi9cbiAgU0NURTM1X0VOSEFOQ0VEID0gJ1NDVEUzNV9FTkhBTkNFRCcsXG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgdmFyaWFibGUgdGhhdCBNZWRpYVBhY2thZ2UgdXNlcyBpbiB0aGUgbWVkaWEgYXR0cmlidXRlIG9mIHRoZSBTZWdtZW50VGVtcGxhdGUgdGFnLlxuICovXG5leHBvcnQgZW51bSBTZWdtZW50VGVtcGxhdGVGb3JtYXQge1xuICAvKipcbiAgICogT3B0aW9uIGZvciBudW1iZXIgd2l0aCB0aW1lbGluZS5cbiAgICovXG4gIE5VTUJFUl9XSVRIX1RJTUVMSU5FPSdOVU1CRVJfV0lUSF9USU1FTElORScsXG59XG5cbi8qKlxuICogVGhlIFVUQyB0aW1pbmcgbW9kZSBmb3IgREFTSC5cbiAqL1xuZXhwb3J0IGVudW0gRGFzaFV0Y1RpbWluZ01vZGUge1xuICAvKipcbiAgICogT3B0aW9uIGZvciBIVFRQX0hFQUQuXG4gICAqL1xuICBIVFRQX0hFQUQ9J0hUVFBfSEVBRCcsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIEhUVFBfSVNPLlxuICAgKi9cbiAgSFRUUF9JU089J0hUVFBfSVNPJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgSFRUUF9YU0RBVEUuXG4gICAqL1xuICBIVFRQX1hTREFURT0nSFRUUF9YU0RBVEUnLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBVVENfRElSRUNULlxuICAgKi9cbiAgVVRDX0RJUkVDVD0nVVRDX0RJUkVDVCcsXG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdHJpZ2dlcnMgd2hpY2ggY2F1c2UgQVdTIEVsZW1lbnRhbCBNZWRpYVBhY2thZ2UgdG8gY3JlYXRlIG1lZGlhIHByZXNlbnRhdGlvbiBkZXNjcmlwdGlvbiAoTVBEKSBwZXJpb2RzIGluIHRoZSBvdXRwdXQgbWFuaWZlc3QuXG4gKi9cbmV4cG9ydCBlbnVtIERhc2hQZXJpb2RUcmlnZ2VycyB7XG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIEFWQUlMUy5cbiAgICovXG4gIEFWQUlMUz0nQVZBSUxTJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgRFJNX0tFWV9ST1RBVElPTi5cbiAgICovXG4gIERSTV9LRVlfUk9UQVRJT049J0RSTV9LRVlfUk9UQVRJT04nLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBTT1VSQ0VfQ0hBTkdFUy5cbiAgICovXG4gIFNPVVJDRV9DSEFOR0VTPSdTT1VSQ0VfQ0hBTkdFUycsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIFNPVVJDRV9ESVNSVVBUSU9OUy5cbiAgICovXG4gIFNPVVJDRV9ESVNSVVBUSU9OUz0nU09VUkNFX0RJU1JVUFRJT05TJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgTk9ORS5cbiAgICovXG4gIE5PTkU9J05PTkUnLFxufVxuXG4vKipcbiAqIERSTSBzaWduYWxpbmcgZGV0ZXJtaW5lcyB0aGUgd2F5IERBU0ggbWFuaWZlc3Qgc2lnbmFscyB0aGUgRFJNIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBlbnVtIERybVNpZ25hbGxpbmcge1xuICAvKipcbiAgICogT3B0aW9uIGZvciBJTkRJVklEVUFMLlxuICAgKi9cbiAgSU5ESVZJRFVBTD0nSU5ESVZJRFVBTCcsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIFJFRkVSRU5DRUQuXG4gICAqL1xuICBSRUZFUkVOQ0VEPSdSRUZFUkVOQ0VEJyxcbn1cblxuLyoqXG4gKiBTVEFOREFSRCBpbmRpY2F0ZXMgYSBkZWZhdWx0IG1hbmlmZXN0LCB3aGljaCBpcyBjb21wYWN0ZWQuIE5PTkUgaW5kaWNhdGVzIGEgZnVsbCBtYW5pZmVzdC5cbiAqL1xuZXhwb3J0IGVudW0gRGFzaE1hbmlmZXN0Q29tcGFjdG5lc3Mge1xuICAvKipcbiAgICogU1RBTkRBUkRcbiAgICovXG4gIFNUQU5EQVJEPSdTVEFOREFSRCcsXG4gIC8qKlxuICAgKiBOT05FXG4gICAqL1xuICBOT05FPSdOT05FJyxcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBVUkxzIHRvIHVzZSBmb3IgcmV0cmlldmluZyBzZWdtZW50cy4gWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIGxvY2F0aW9ucyBhbmQgaW5kaWNhdGUgdGhlXG4gKiBwcmlvcml0eSBhbmQgd2VpZ2h0IGZvciB3aGVuIGVhY2ggc2hvdWxkIGJlIHVzZWQsIGZvciB1c2UgaW4gbXVsdGktQ0ROIHdvcmtmbG93cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoQmFzZVVybFByb3BlcnR5IHtcbiAgLyoqXG4gICAqIEZvciB1c2Ugd2l0aCBEVkItREFTSCBwcm9maWxlcyBvbmx5LiBUaGUgcHJpb3JpdHkgb2YgdGhpcyBsb2NhdGlvbiBmb3Igc2VydmluZyBzZWdtZW50cy4gVGhlIGxvd2VyIHRoZSBudW1iZXIsIHRoZSBoaWdoZXIgdGhlIHByaW9yaXR5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHByaW9yaXR5IHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgZHZiUHJpb3JpdHk/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGb3IgdXNlIHdpdGggRFZCLURBU0ggcHJvZmlsZXMgb25seS4gVGhlIHdlaWdodGluZyBmb3Igc291cmNlIGxvY2F0aW9ucyB0aGF0IGhhdmUgdGhlIHNhbWUgcHJpb3JpdHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gd2VpZ2h0IHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgZHZiV2VpZ2h0PzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBsb2NhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBzZXJ2aWNlIGxvY2F0aW9uIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZUxvY2F0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogQSBzb3VyY2UgbG9jYXRpb24gZm9yIHNlZ21lbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRm9yIHVzZSB3aXRoIERWQi1EQVNIIHByb2ZpbGVzIG9ubHkuIFRoZSBzZXR0aW5ncyBmb3IgZXJyb3IgcmVwb3J0aW5nIGZyb20gdGhlIHBsYXliYWNrIGRldmljZVxuICogdGhhdCB5b3Ugd2FudCBBV1MgRWxlbWVudGFsIE1lZGlhUGFja2FnZSB0byBwYXNzIHRocm91Z2ggdG8gdGhlIG1hbmlmZXN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hEdmJNZXRyaWNzUmVwb3J0aW5nIHtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgcGxheWJhY2sgZGV2aWNlcyBwZXIgMTAwMCB0aGF0IHdpbGwgc2VuZCBlcnJvciByZXBvcnRzIHRvIHRoZSByZXBvcnRpbmcgVVJMLlxuICAgKiBUaGlzIHJlcHJlc2VudHMgdGhlIHByb2JhYmlsaXR5IHRoYXQgYSBwbGF5YmFjayBkZXZpY2Ugd2lsbCBiZSBhIHJlcG9ydGluZyBwbGF5ZXIgZm9yIHRoaXMgc2Vzc2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwcm9iYWJpbGl0eSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHByb2JhYmlsaXR5PzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIFVSTCB3aGVyZSBwbGF5YmFjayBkZXZpY2VzIHNlbmQgZXJyb3IgcmVwb3J0cy5cbiAgICovXG4gIHJlYWRvbmx5IHJlcG9ydGluZ1VybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEZvciB1c2Ugd2l0aCBEVkItREFTSCBwcm9maWxlcyBvbmx5LiBUaGUgc2V0dGluZ3MgZm9yIGZvbnQgZG93bmxvYWRzIHRoYXQgeW91IHdhbnQgQVdTIEVsZW1lbnRhbCBNZWRpYVBhY2thZ2UgdG8gcGFzcyB0aHJvdWdoIHRvIHRoZSBtYW5pZmVzdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoRHZiRm9udERvd25sb2FkIHtcbiAgLyoqXG4gICAqIFRoZSBmb250RmFtaWx5IG5hbWUgZm9yIHN1YnRpdGxlcywgYXMgZGVzY3JpYmVkIGluIEVCVS1UVC1EIFN1YnRpdGxpbmcgRGlzdHJpYnV0aW9uIEZvcm1hdC5cbiAgICogQGV4dGVybmFsIGh0dHBzOi8vdGVjaC5lYnUuY2gvcHVibGljYXRpb25zL3RlY2gzMzgwXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZm9udCBmYW1pbHkgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSBmb250RmFtaWx5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG1pbWVUeXBlIG9mIHRoZSByZXNvdXJjZSB0aGF0J3MgYXQgdGhlIGZvbnQgZG93bmxvYWQgVVJMLlxuICAgKiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgZm9udCBNSU1FIHR5cGVzLCBzZWUgdGhlIE1QRUctREFTSCBQcm9maWxlIGZvciBUcmFuc3BvcnQgb2YgSVNPIEJNRkYgQmFzZWQgRFZCIFNlcnZpY2VzIG92ZXIgSVAgQmFzZWQgTmV0d29ya3MgZG9jdW1lbnQuXG4gICAqXG4gICAqIEBleHRlcm5hbCBodHRwczovL2R2Yi5vcmcvd3AtY29udGVudC91cGxvYWRzLzIwMjEvMDYvQTE2OHI0X01QRUctREFTSC1Qcm9maWxlLWZvci1UcmFuc3BvcnQtb2YtSVNPLUJNRkYtQmFzZWQtRFZCLVNlcnZpY2VzX0RyYWZ0LXRzXzEwMy0yODUtdjE0MF9Ob3ZlbWJlcl8yMDIxLnBkZlxuICAgKiBAZGVmYXVsdCAtIE5vIE1JTUUgdHlwZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IG1pbWVUeXBlPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIFVSTCBmb3IgZG93bmxvYWRpbmcgZm9udHMgZm9yIHN1YnRpdGxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBmb250IGRvd25sb2FkIFVSTCBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZm9udCBkb3dubG9hZCBhbmQgZXJyb3IgcmVwb3J0aW5nIGluZm9ybWF0aW9uIHRoYXQgeW91IHdhbnQgTWVkaWFQYWNrYWdlIHRvIHBhc3MgdGhyb3VnaCB0byB0aGUgbWFuaWZlc3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaER2YlNldHRpbmdzIHtcbiAgLyoqXG4gICAqIFBsYXliYWNrIGRldmljZSBlcnJvciByZXBvcnRpbmcgc2V0dGluZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZXJyb3IgbWV0cmljcyBjb25maWd1cmVkXG4gICAqL1xuICByZWFkb25seSBlcnJvck1ldHJpY3M/OiBEYXNoRHZiTWV0cmljc1JlcG9ydGluZ1tdO1xuICAvKipcbiAgICogU3VidGl0bGUgZm9udCBzZXR0aW5ncy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBmb250IGRvd25sb2FkIGNvbmZpZ3VyZWRcbiAgICovXG4gIHJlYWRvbmx5IGZvbnREb3dubG9hZD86IERhc2hEdmJGb250RG93bmxvYWQ7XG59XG5cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgY29udGVudCB0aGF0IHlvdSB3YW50IE1lZGlhUGFja2FnZSB0byBwYXNzIHRocm91Z2ggaW4gdGhlIG1hbmlmZXN0IHRvIHRoZSBwbGF5YmFjayBkZXZpY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaFByb2dyYW1JbmZvcm1hdGlvbiB7XG4gIC8qKlxuICAgKiBBIGNvcHlyaWdodCBzdGF0ZW1lbnQgYWJvdXQgdGhlIGNvbnRlbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gY29weXJpZ2h0IGluZm9ybWF0aW9uXG4gICAqL1xuICByZWFkb25seSBjb3B5cmlnaHQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbGFuZ3VhZ2UgY29kZSBmb3IgdGhpcyBtYW5pZmVzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBsYW5ndWFnZSBjb2RlIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2VDb2RlPzogc3RyaW5nO1xuICAvKipcbiAgICogQW4gYWJzb2x1dGUgVVJMIHRoYXQgY29udGFpbnMgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbnRlbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBVUkxcbiAgICovXG4gIHJlYWRvbmx5IG1vcmVJbmZvcm1hdGlvblVybD86IHN0cmluZztcbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250ZW50IHByb3ZpZGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHNvdXJjZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRpdGxlIGZvciB0aGUgbWFuaWZlc3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gdGl0bGUgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBUVE1MIFByb2ZpbGVcbiAqL1xuZXhwb3J0IGVudW0gVHRtbFByb2ZpbGUge1xuICAvKipcbiAgICogSU1TQ18xXG4gICAqL1xuICBJTVNDXzE9J0lNU0NfMScsXG4gIC8qKlxuICAgKiBFQlVfVFRfRF8xMDFcbiAgICovXG4gIEVCVV9UVF9EXzEwMT0nRUJVX1RUX0RfMTAxJyxcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgVFRNTCBzdWJ0aXRsZXMgaW4gREFTSCBtYW5pZmVzdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaFR0bWxDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBwcm9maWxlIHRoYXQgTWVkaWFQYWNrYWdlIHVzZXMgd2hlbiBzaWduYWxpbmcgc3VidGl0bGVzIGluIHRoZSBtYW5pZmVzdC4gSU1TQyBpcyB0aGUgZGVmYXVsdCBwcm9maWxlLiBFQlUtVFQtRCBwcm9kdWNlcyBzdWJ0aXRsZXMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGggdGhlIEVCVS1UVC1EIFRUTUwgcHJvZmlsZS4gTWVkaWFQYWNrYWdlIHBhc3NlcyB0aHJvdWdoIHN1YnRpdGxlIHN0eWxlcyB0byB0aGUgbWFuaWZlc3QuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IEVCVS1UVC1EIHN1YnRpdGxlcywgc2VlIEVCVS1UVC1EIFN1YnRpdGxpbmcgRGlzdHJpYnV0aW9uIEZvcm1hdC5cbiAgICpcbiAgICogQGV4dGVybmFsIGh0dHBzOi8vdGVjaC5lYnUuY2gvcHVibGljYXRpb25zL3RlY2gzMzgwXG4gICAqL1xuICByZWFkb25seSB0dG1sUHJvZmlsZTogVHRtbFByb2ZpbGU7XG5cbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3Igc3VidGl0bGVzIGluIERBU0ggbWFuaWZlc3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hTdWJ0aXRsZUNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogU2V0dGluZ3MgZm9yIFRUTUwgc3VidGl0bGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIFRUTUwgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgdHRtbENvbmZpZ3VyYXRpb24/OiBEYXNoVHRtbENvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogVGhlIGxheW91dCBvZiB0aGUgTVNTIG1hbmlmZXN0LlxuICovXG5leHBvcnQgZW51bSBNc3NNYW5pZmVzdExheW91dCB7XG4gIC8qKlxuICAgKiBGdWxsIG1hbmlmZXN0IGxheW91dC5cbiAgICovXG4gIEZVTEwgPSAnRlVMTCcsXG4gIC8qKlxuICAgKiBDb21wYWN0IG1hbmlmZXN0IGxheW91dC5cbiAgICovXG4gIENPTVBBQ1QgPSAnQ09NUEFDVCcsXG59XG5cbi8qKlxuICogVGhlIE1TUyBtYW5pZmVzdCBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1zc01hbmlmZXN0Q29uZmlndXJhdGlvbiBleHRlbmRzIE1hbmlmZXN0Q29uZmlndXJhdGlvbkJhc2Uge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG1hbmlmZXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgTVNTIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBtYW5pZmVzdE5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBsYXlvdXQgb2YgdGhlIE1TUyBtYW5pZmVzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgTXNzTWFuaWZlc3RMYXlvdXQuRlVMTFxuICAgKi9cbiAgcmVhZG9ubHkgbWFuaWZlc3RMYXlvdXQ/OiBNc3NNYW5pZmVzdExheW91dDtcbn1cblxuLyoqXG4gKiBUaGUgREFTSCBtYW5pZmVzdCBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNYW5pZmVzdENvbmZpZ3VyYXRpb25CYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBiYXNlIFVSTHMgdG8gdXNlIGZvciByZXRyaWV2aW5nIHNlZ21lbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGJhc2UgVVJMcyBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IGJhc2VVcmxzPzogRGFzaEJhc2VVcmxQcm9wZXJ0eVtdO1xuICAvKipcbiAgICogVGhlIGxheW91dCBvZiB0aGUgREFTSCBtYW5pZmVzdCB0aGF0IE1lZGlhUGFja2FnZSBwcm9kdWNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgRGFzaE1hbmlmZXN0Q29tcGFjdG5lc3MuU1RBTkRBUkRcbiAgICovXG4gIHJlYWRvbmx5IGNvbXBhY3RuZXNzPzogRGFzaE1hbmlmZXN0Q29tcGFjdG5lc3M7XG4gIC8qKlxuICAgKiBGb3IgZW5kcG9pbnRzIHRoYXQgdXNlIHRoZSBEVkItREFTSCBwcm9maWxlIG9ubHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gRFZCIHNldHRpbmdzXG4gICAqL1xuICByZWFkb25seSBkdmJTZXR0aW5ncz86IERhc2hEdmJTZXR0aW5ncztcbiAgLyoqXG4gICAqIFRoZSBwcm9maWxlIHRoYXQgdGhlIG91dHB1dCBpcyBjb21wbGlhbnQgd2l0aC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwcm9maWxlcyBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHByb2ZpbGVzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBEZXRhaWxzIGFib3V0IHRoZSBjb250ZW50IHRoYXQgeW91IHdhbnQgTWVkaWFQYWNrYWdlIHRvIHBhc3MgdGhyb3VnaCBpbiB0aGUgbWFuaWZlc3QgdG8gdGhlIHBsYXliYWNrIGRldmljZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwcm9ncmFtIGluZm9ybWF0aW9uXG4gICAqL1xuICByZWFkb25seSBwcm9ncmFtSW5mb3JtYXRpb24/OiBEYXNoUHJvZ3JhbUluZm9ybWF0aW9uO1xuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIERBU0ggc3VidGl0bGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHN1YnRpdGxlIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHN1YnRpdGxlQ29uZmlndXJhdGlvbj86IERhc2hTdWJ0aXRsZUNvbmZpZ3VyYXRpb247XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWFuaWZlc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBEQVNIIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBtYW5pZmVzdE5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIERSTSBzaWduYWxpbmcgZGV0ZXJtaW5lcyB0aGUgd2F5IERBU0ggbWFuaWZlc3Qgc2lnbmFscyB0aGUgRFJNIGNvbnRlbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gRFJNIHNpZ25hbGluZyBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IGRybVNpZ25hbGxpbmc/OiBEcm1TaWduYWxsaW5nO1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gYW1vdW50IG9mIGNvbnRlbnQgdGhhdCB0aGUgcGxheWVyIG11c3Qga2VlcCBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlci5cbiAgICpcbiAgICogQGRlZmF1bHQgNVxuICAgKi9cbiAgcmVhZG9ubHkgbWluQnVmZmVyVGltZT86IER1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gYW1vdW50IG9mIHRpbWUgZm9yIHRoZSBwbGF5ZXIgdG8gd2FpdCBiZWZvcmUgcmVxdWVzdGluZyBhbiB1cGRhdGVkIG1hbmlmZXN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAyXG4gICAqL1xuICByZWFkb25seSBtaW5VcGRhdGVQZXJpb2Q/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hhdCB0cmlnZ2VycyBjYXVzZSBBV1MgRWxlbWVudGFsIE1lZGlhUGFja2FnZSB0byBjcmVhdGUgbWVkaWEgcHJlc2VudGF0aW9uIGRlc2NyaXB0aW9uIChNUEQpIHBlcmlvZHMgaW4gdGhlIG91dHB1dCBtYW5pZmVzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgW0Rhc2hQZXJpb2RUcmlnZ2Vycy5BVkFJTFMsIERhc2hQZXJpb2RUcmlnZ2Vycy5EUk1fS0VZX1JPVEFUSU9OLCBEYXNoUGVyaW9kVHJpZ2dlcnMuU09VUkNFX0NIQU5HRVMsIERhc2hQZXJpb2RUcmlnZ2Vycy5TT1VSQ0VfRElTUlVQVElPTlNdXG4gICAqL1xuICByZWFkb25seSBwZXJpb2RUcmlnZ2Vycz86IERhc2hQZXJpb2RUcmlnZ2Vyc1tdO1xuICAvKipcbiAgICogQ2hvb3NlIGhvdyBhZCBtYXJrZXJzIGFyZSBpbmNsdWRlZCBpbiB0aGUgcGFja2FnZWQgY29udGVudC4gSWYgeW91IGluY2x1ZGUgYWQgbWFya2VycyBpbiB0aGUgY29udGVudCBzdHJlYW0gaW4geW91ciB1cHN0cmVhbSBlbmNvZGVycyxcbiAgICogdGhlbiB5b3UgbmVlZCB0byBpbmZvcm0gTWVkaWFQYWNrYWdlIHdoYXQgdG8gZG8gd2l0aCB0aGUgYWQgbWFya2VycyBpbiB0aGUgb3V0cHV0LlxuICAgKlxuICAgKiBUbyBjaG9vc2UgdGhpcyBvcHRpb24gU1RDRSBmaWx0ZXJpbmcgbmVlZHMgdG8gYmUgZW5hYmxlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgQWRNYXJrZXJEYXNoLlhNTFxuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZURhc2hBZE1hcmtlcj86IEFkTWFya2VyRGFzaDtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHZhcmlhYmxlIHRoYXQgTWVkaWFQYWNrYWdlIHVzZXMgaW4gdGhlIG1lZGlhIGF0dHJpYnV0ZSBvZiB0aGUgU2VnbWVudFRlbXBsYXRlIHRhZy5cbiAgICpcbiAgICogQGRlZmF1bHQgU2VnbWVudFRlbXBsYXRlRm9ybWF0Lk5VTUJFUl9XSVRIX1RJTUVMSU5FXG4gICAqL1xuICByZWFkb25seSBzZWdtZW50VGVtcGxhdGVGb3JtYXQ/OiBTZWdtZW50VGVtcGxhdGVGb3JtYXQ7XG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgcGxheWVyIHNob3VsZCBiZSBmcm9tIHRoZSBlbmQgb2YgdGhlIG1hbmlmZXN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMFxuICAgKi9cbiAgcmVhZG9ubHkgc3VnZ2VzdGVkUHJlc2VudGF0aW9uRGVsYXk/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBVVEMgdGltaW5nIG1vZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IERhc2hVdGNUaW1pbmdNb2RlLlVUQ19ESVJFQ1RcbiAgICovXG4gIHJlYWRvbmx5IHV0Y1RpbWluZ01vZGU/OiBEYXNoVXRjVGltaW5nTW9kZTtcbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgdGhhdCB0aGUgcGxheWVyIHVzZXMgdG8gc3luY2hyb25pemUgdG8gY29vcmRpbmF0ZWQgdW5pdmVyc2FsIHRpbWUgKFVUQykgd2FsbCBjbG9jayB0aW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWQgLSBObyB2YWx1ZSBpcyBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHV0Y1RpbWluZ1NvdXJjZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgSExTIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGxzTWFuaWZlc3RDb25maWd1cmF0aW9uIGV4dGVuZHMgTWFuaWZlc3RDb25maWd1cmF0aW9uQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWFuaWZlc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBITFMgbWFuaWZlc3QgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1hbmlmZXN0TmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNoaWxkIG1hbmlmZXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgSExTIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gY2hpbGQgbWFuaWZlc3QgbmFtZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IGNoaWxkTWFuaWZlc3ROYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogSW5zZXJ0cyBFWFQtWC1QUk9HUkFNLURBVEUtVElNRSB0YWdzIGluIHRoZSBvdXRwdXQgbWFuaWZlc3QgYXQgdGhlIGludGVydmFsIHRoYXQgeW91IHNwZWNpZnkuXG4gICAqIElmIHlvdSBkb24ndCBlbnRlciBhbiBpbnRlcnZhbCwgRVhULVgtUFJPR1JBTS1EQVRFLVRJTUUgdGFncyBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIG1hbmlmZXN0LlxuICAgKiBUaGUgdGFncyBzeW5jIHRoZSBzdHJlYW0gdG8gdGhlIHdhbGwgY2xvY2sgc28gdGhhdCB2aWV3ZXJzIGNhbiBzZWVrIHRvIGEgc3BlY2lmaWMgdGltZSBpbiB0aGUgcGxheWJhY2sgdGltZWxpbmUgb24gdGhlIHBsYXllci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwcm9ncmFtIGRhdGUgdGltZSBpbnRlcnZhbFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZ3JhbURhdGVUaW1lSW50ZXJ2YWw/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBTQ1RFLTM1IEhMUyBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSExTIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBTQ1RFIGFkIG1hcmtlciBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSBzY3RlQWRNYXJrZXJIbHM/OiBBZE1hcmtlckhscztcbiAgLyoqXG4gICAqIEluc2VydCBFWFQtWC1TVEFSVCB0YWcgaW4gdGhlIG1hbmlmZXN0IHdpdGggdGhlIGNvbmZpZ3VyZWQgc2V0dGluZ3NcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBzdGFydCB0YWdcbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0VGFnPzogU3RhcnRUYWc7XG4gIC8qKlxuICAgKiBXaGVuIGVuYWJsZWQsIE1lZGlhUGFja2FnZSBVUkwtZW5jb2RlcyB0aGUgcXVlcnkgc3RyaW5nIGZvciBBUEkgcmVxdWVzdHMgZm9yIEhMUyBjaGlsZCBtYW5pZmVzdHMgdG8gY29tcGx5IHdpdGggQVdTIFNpZ25hdHVyZSBWZXJzaW9uIDQgKFNpZ1Y0KSBzaWduYXR1cmUgc2lnbmluZyBwcm90b2NvbC5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBBV1MgU2lnbmF0dXJlIFZlcnNpb24gNCBmb3IgQVBJIHJlcXVlc3RzIGluIEFXUyBJZGVudGl0eSBhbmQgQWNjZXNzIE1hbmFnZW1lbnQgVXNlciBHdWlkZS5cbiAgICpcbiAgICogQGV4dGVybmFsIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2Vfc2lndi5odG1sXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB1cmxFbmNvZGVDaGlsZE1hbmlmZXN0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTcGVjaWZ5IGEgbG93LWxhdGVuY3kgSFRUUCBsaXZlIHN0cmVhbWluZyAoTEwtSExTKSBtYW5pZmVzdCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvd0xhdGVuY3lIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNYW5pZmVzdENvbmZpZ3VyYXRpb25CYXNlIHtcbiAgLyoqXG4gICAqIEEgc2hvcnQgc3RyaW5nIHRoYXQncyBhcHBlbmRlZCB0byB0aGUgZW5kcG9pbnQgVVJMLiBUaGUgbWFuaWZlc3QgbmFtZSBjcmVhdGVzIGEgdW5pcXVlIHBhdGggdG8gdGhpcyBlbmRwb2ludC5cbiAgICogSWYgeW91IGRvbid0IGVudGVyIGEgdmFsdWUsIE1lZGlhUGFja2FnZSB1c2VzIHRoZSBkZWZhdWx0IG1hbmlmZXN0IG5hbWUsIGluZGV4LiBNZWRpYVBhY2thZ2UgYXV0b21hdGljYWxseSBpbnNlcnRzIHRoZSBmb3JtYXQgZXh0ZW5zaW9uLCBzdWNoIGFzIC5tM3U4LlxuICAgKiBZb3UgY2FuJ3QgdXNlIHRoZSBzYW1lIG1hbmlmZXN0IG5hbWUgaWYgeW91IHVzZSBITFMgbWFuaWZlc3QgYW5kIGxvdy1sYXRlbmN5IEhMUyBtYW5pZmVzdC5cbiAgICogVGhlIG1hbmlmZXN0TmFtZSBvbiB0aGUgSExTTWFuaWZlc3Qgb2JqZWN0IG92ZXJyaWRlcyB0aGUgbWFuaWZlc3ROYW1lIHlvdSBwcm92aWRlZCBvbiB0aGUgb3JpZ2luRW5kcG9pbnQgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgbWFuaWZlc3ROYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY2hpbGQgbWFuaWZlc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb3ctbGF0ZW5jeSBITFMgKExMLUhMUykgbWFuaWZlc3QgY29uZmlndXJhdGlvbiBvZiB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGNoaWxkIG1hbmlmZXN0IG5hbWUgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSBjaGlsZE1hbmlmZXN0TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEluc2VydHMgRVhULVgtUFJPR1JBTS1EQVRFLVRJTUUgdGFncyBpbiB0aGUgb3V0cHV0IG1hbmlmZXN0IGF0IHRoZSBpbnRlcnZhbCB0aGF0IHlvdSBzcGVjaWZ5LlxuICAgKiBJZiB5b3UgZG9uJ3QgZW50ZXIgYW4gaW50ZXJ2YWwsIEVYVC1YLVBST0dSQU0tREFURS1USU1FIHRhZ3MgYXJlbid0IGluY2x1ZGVkIGluIHRoZSBtYW5pZmVzdC5cbiAgICogVGhlIHRhZ3Mgc3luYyB0aGUgc3RyZWFtIHRvIHRoZSB3YWxsIGNsb2NrIHNvIHRoYXQgdmlld2VycyBjYW4gc2VlayB0byBhIHNwZWNpZmljIHRpbWUgaW4gdGhlIHBsYXliYWNrIHRpbWVsaW5lIG9uIHRoZSBwbGF5ZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcHJvZ3JhbSBkYXRlIHRpbWUgaW50ZXJ2YWxcbiAgICovXG4gIHJlYWRvbmx5IHByb2dyYW1EYXRlVGltZUludGVydmFsPzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBUaGUgU0NURS0zNSBITFMgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGxvdy1sYXRlbmN5IEhMUyAoTEwtSExTKSBtYW5pZmVzdCBjb25maWd1cmF0aW9uIG9mIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gU0NURSBhZCBtYXJrZXIgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZUFkTWFya2VySGxzPzogQWRNYXJrZXJIbHM7XG4gIC8qKlxuICAgKiBJbnNlcnQgRVhULVgtU1RBUlQgdGFnIGluIHRoZSBtYW5pZmVzdCB3aXRoIHRoZSBjb25maWd1cmVkIHNldHRpbmdzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gc3RhcnQgdGFnXG4gICAqL1xuICByZWFkb25seSBzdGFydFRhZz86IFN0YXJ0VGFnO1xuICAvKipcbiAgICogV2hlbiBlbmFibGVkLCBNZWRpYVBhY2thZ2UgVVJMLWVuY29kZXMgdGhlIHF1ZXJ5IHN0cmluZyBmb3IgQVBJIHJlcXVlc3RzIGZvciBMTC1ITFMgY2hpbGQgbWFuaWZlc3RzIHRvIGNvbXBseSB3aXRoIEFXUyBTaWduYXR1cmUgVmVyc2lvbiA0IChTaWdWNCkgc2lnbmF0dXJlIHNpZ25pbmcgcHJvdG9jb2wuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgQVdTIFNpZ25hdHVyZSBWZXJzaW9uIDQgZm9yIEFQSSByZXF1ZXN0cyBpbiBBV1MgSWRlbnRpdHkgYW5kIEFjY2VzcyBNYW5hZ2VtZW50IFVzZXIgR3VpZGUuXG4gICAqXG4gICAqIEBleHRlcm5hbCBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3NpZ3YuaHRtbFxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgdXJsRW5jb2RlQ2hpbGRNYW5pZmVzdD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciBhbiBBV1MgRWxlbWVudGFsIE1lZGlhUGFja2FnZSBWMiBPcmlnaW4gRW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JpZ2luRW5kcG9pbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBvcmlnaW4gZW5kcG9pbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQgY29uZmlndXJhdGlvbi5cbiAgICogQGRlZmF1bHQgYXV0b2dlbmVyYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luRW5kcG9pbnROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCAtIE5vIGRlc2NyaXB0aW9uIGlzIGFkZGVkIHRvIE9yaWdpbiBFbmRwb2ludFxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0YWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHRhZ2dpbmdcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBNYW5pZmVzdHMgY29uZmlndXJhdGlvbiBmb3IgSExTLCBMb3cgTGF0ZW5jeSBITFMgYW5kIERBU0guXG4gICAqL1xuICByZWFkb25seSBtYW5pZmVzdHM6IE1hbmlmZXN0W107XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSB3aW5kb3cgdG8gc3BlY2lmeSBhIHdpbmRvdyBvZiB0aGUgbGl2ZSBzdHJlYW0gdGhhdCdzIGF2YWlsYWJsZSBmb3Igb24tZGVtYW5kIHZpZXdpbmcuIFZpZXdlcnMgY2FuIHN0YXJ0LW92ZXIgb3IgY2F0Y2gtdXAgb24gY29udGVudCB0aGF0IGZhbGxzIHdpdGhpbiB0aGUgd2luZG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCA5MDBcbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0b3ZlcldpbmRvdz86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICpcbiAgICogSW5zaWRlIHRoZSBzZWdtZW50IGNvbmZpZ3VyYXRpb24geW91IGNhbiBkZWZpbmUgb3B0aW9ucyBzdWNoIGFzIGVuY3J5cHRpb24sIFNQRUtFIHBhcmFtZXRlcnMgYW5kIG90aGVyXG4gICAqIGdlbmVyYWwgc2VnbWVudCBjb25maWd1cmF0aW9ucy5cbiAgICpcbiAgICogVXNlIFNlZ21lbnQudHMoKSBvciBTZWdtZW50LmNtYWYoKSB0byBjcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBzZWdtZW50OiBTZWdtZW50Q29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIGZhaWxvdmVyIHNldHRpbmdzIGZvciB0aGUgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCAtIE5vIGZvcmNlIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24gaXMgY29uZmlndXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2VFbmRwb2ludENvbmZpZ3VyYXRpb25Db25kaXRpb25zPzogRW5kcG9pbnRFcnJvckNvbmZpZ3VyYXRpb25bXTtcblxuICAvKipcbiAgICogUHJvdmlkZSBhY2Nlc3MgdG8gTWVkaWFQYWNrYWdlIFYyIE9yaWdpbiBFbmRwb2ludCB2aWEgc2VjcmV0IGhlYWRlci5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkIC0gTm90IGNvbmZpZ3VyZWQgb24gZW5kcG9pbnRcbiAgICovXG4gIHJlYWRvbmx5IGNkbkF1dGg/OiBDZG5BdXRoQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogUG9saWN5IHRvIGFwcGx5IHdoZW4gdGhlIG9yaWdpbiBlbmRwb2ludCBpcyByZW1vdmVkIGZyb20gdGhlIHN0YWNrXG4gICAqXG4gICAqIEV2ZW4gdGhvdWdoIE1lZGlhUGFja2FnZSBDaGFubmVsR3JvdXBzLCBDaGFubmVscyBhbmQgT3JpZ2luRW5kcG9pbnRzIGFyZSB0ZWNobmljYWxseSBzdGF0ZWZ1bCxcbiAgICogdGhlaXIgY29udGVudHMgYXJlIHRyYW5zaWVudCBhbmQgaXQgaXMgY29tbW9uIHRvIGFkZCBhbmQgcmVtb3ZlIHRoZXNlIHdoaWxlIHJlYXJjaGl0ZWN0aW5nIHlvdXIgYXBwbGljYXRpb24uXG4gICAqIFRoZSBkZWZhdWx0IGlzIHRoZXJlZm9yZSBgREVTVFJPWWAuIENoYW5nZSBpdCB0byBgUkVUQUlOYCBpZiB0aGUgY29udGVudCAoaW4gYSBsb29rYmFjayB3aW5kb3cpIGFyZSBzb1xuICAgKiB2YWx1YWJsZSB0aGF0IGFjY2lkZW50YWxseSBsb3NpbmcgaXQgd291bGQgYmUgdW5hY2NlcHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LkRFU1RST1lcbiAgICovXG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5O1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgdG8gc2V0IG9uIGFuIE9yaWdpbiBFbmRwb2ludC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmlnaW5FbmRwb2ludFByb3BzIGV4dGVuZHMgT3JpZ2luRW5kcG9pbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbDogSUNoYW5uZWw7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBPcmlnaW4gRW5kcG9pbnQgZGVmaW5lZCBvdXRzaWRlIG9mIHRoaXMgc3RhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JpZ2luRW5kcG9pbnRBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIHRoYXQgZGVzY3JpYmVzIHRoZSBjaGFubmVsIGdyb3VwLiBUaGUgbmFtZSBpcyB0aGUgcHJpbWFyeSBpZGVudGlmaWVyIGZvciB0aGUgY2hhbm5lbCBncm91cC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbEdyb3VwTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSB0aGF0IGRlc2NyaWJlcyB0aGUgY2hhbm5lbC4gVGhlIG5hbWUgaXMgdGhlIHByaW1hcnkgaWRlbnRpZmllciBmb3IgdGhlIGNoYW5uZWwuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWxOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIHRoYXQgZGVzY3JpYmVzIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbkVuZHBvaW50TmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIERSTSBzeXN0ZW1zIGF2YWlsYWJsZSBmb3IgQ01BRiBlbmNyeXB0aW9uLlxuICpcbiAqIENFTkMgc3VwcG9ydHMgUGxheVJlYWR5LCBXaWRldmluZSwgYW5kIElyZGV0by5cbiAqIENCQ1Mgc3VwcG9ydHMgUGxheVJlYWR5LCBXaWRldmluZSwgYW5kIEZhaXJQbGF5LlxuICovXG5leHBvcnQgZW51bSBDbWFmRHJtU3lzdGVtIHtcbiAgLyoqXG4gICAqIEZhaXJQbGF5IERSTSAtIHVzZWQgd2l0aCBDQkNTIGVuY3J5cHRpb24uXG4gICAqL1xuICBGQUlSUExBWSA9ICdGQUlSUExBWScsXG4gIC8qKlxuICAgKiBQbGF5UmVhZHkgRFJNIC0gdXNlZCB3aXRoIENFTkMgYW5kIENCQ1MgZW5jcnlwdGlvbi5cbiAgICovXG4gIFBMQVlSRUFEWSA9ICdQTEFZUkVBRFknLFxuICAvKipcbiAgICogV2lkZXZpbmUgRFJNIC0gdXNlZCB3aXRoIENFTkMgYW5kIENCQ1MgZW5jcnlwdGlvbi5cbiAgICovXG4gIFdJREVWSU5FID0gJ1dJREVWSU5FJyxcbiAgLyoqXG4gICAqIElyZGV0byBEUk0gLSB1c2VkIHdpdGggQ0VOQyBlbmNyeXB0aW9uLlxuICAgKi9cbiAgSVJERVRPID0gJ0lSREVUTycsXG59XG5cbi8qKlxuICogRFJNIHN5c3RlbXMgYXZhaWxhYmxlIGZvciBUUyBlbmNyeXB0aW9uLlxuICpcbiAqIFNBTVBMRV9BRVMgdXNlcyBGYWlyUGxheSwgQUVTXzEyOCB1c2VzIENsZWFyIEtleSBBRVMgMTI4LlxuICovXG5leHBvcnQgZW51bSBUc0RybVN5c3RlbSB7XG4gIC8qKlxuICAgKiBGYWlyUGxheSBEUk0gLSB1c2VkIHdpdGggU0FNUExFX0FFUyBlbmNyeXB0aW9uLlxuICAgKi9cbiAgRkFJUlBMQVkgPSAnRkFJUlBMQVknLFxuICAvKipcbiAgICogQ2xlYXIgS2V5IEFFUyAxMjggLSB1c2VkIHdpdGggQUVTXzEyOCBlbmNyeXB0aW9uLlxuICAgKi9cbiAgQ0xFQVJfS0VZX0FFU18xMjggPSAnQ0xFQVJfS0VZX0FFU18xMjgnLFxufVxuXG4vKipcbiAqIERSTSBzeXN0ZW1zIGF2YWlsYWJsZSBmb3IgSVNNIGVuY3J5cHRpb24uXG4gKlxuICogSVNNIG9ubHkgc3VwcG9ydHMgUGxheVJlYWR5IHdpdGggQ0VOQy5cbiAqL1xuZXhwb3J0IGVudW0gSXNtRHJtU3lzdGVtIHtcbiAgLyoqXG4gICAqIFBsYXlSZWFkeSBEUk0uXG4gICAqL1xuICBQTEFZUkVBRFkgPSAnUExBWVJFQURZJyxcbn1cblxuLyoqXG4gKiBCYXNlIHByb3BlcnRpZXMgY29tbW9uIHRvIGFsbCBTUEVLRSBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICovXG5pbnRlcmZhY2UgU3Bla2VFbmNyeXB0aW9uUHJvcHNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvbnRlbnQuXG4gICAqXG4gICAqIFRoZSBzZXJ2aWNlIHNlbmRzIHRoaXMgaWRlbnRpZmllciB0byB0aGUga2V5IHNlcnZlciB0byBpZGVudGlmeSB0aGUgY3VycmVudCBlbmRwb2ludC5cbiAgICogSG93IHVuaXF1ZSB5b3UgbWFrZSB0aGlzIGlkZW50aWZpZXIgZGVwZW5kcyBvbiBob3cgZmluZS1ncmFpbmVkIHlvdSB3YW50IGFjY2VzcyBjb250cm9scyB0byBiZS5cbiAgICogVGhlIHNlcnZpY2UgZG9lcyBub3QgcGVybWl0IHlvdSB0byB1c2UgdGhlIHNhbWUgSUQgZm9yIHR3byBzaW11bHRhbmVvdXMgZW5jcnlwdGlvbiBwcm9jZXNzZXMuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElBTSByb2xlIGZvciBhY2Nlc3NpbmcgdGhlIGtleSBwcm92aWRlciBBUEkuXG4gICAqXG4gICAqIFRoaXMgcm9sZSBtdXN0IGhhdmUgYSB0cnVzdCBwb2xpY3kgdGhhdCBhbGxvd3MgTWVkaWFQYWNrYWdlIHRvIGFzc3VtZSB0aGUgcm9sZSxcbiAgICogYW5kIGl0IG11c3QgaGF2ZSBzdWZmaWNpZW50IHBlcm1pc3Npb25zIHRvIGFjY2VzcyB0aGUga2V5IHJldHJpZXZhbCBVUkwuXG4gICAqL1xuICByZWFkb25seSByb2xlOiBJUm9sZTtcblxuICAvKipcbiAgICogVVJMIG9mIHRoZSBTUEVLRSBrZXkgcHJvdmlkZXIuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgY2VydGlmaWNhdGUgdGhhdCB5b3UgaW1wb3J0ZWQgdG8gQVdTIENlcnRpZmljYXRlIE1hbmFnZXJcbiAgICogdG8gYWRkIGNvbnRlbnQga2V5IGVuY3J5cHRpb24gdG8gdGhpcyBlbmRwb2ludC5cbiAgICpcbiAgICogRm9yIHRoaXMgZmVhdHVyZSB0byB3b3JrLCB5b3VyIERSTSBrZXkgcHJvdmlkZXIgbXVzdCBzdXBwb3J0IGNvbnRlbnQga2V5IGVuY3J5cHRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29udGVudCBrZXkgZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgY2VydGlmaWNhdGU/OiBJQ2VydGlmaWNhdGU7XG5cbiAgLyoqXG4gICAqIEF1ZGlvIGVuY3J5cHRpb24gcHJlc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBQcmVzZXRTcGVrZTIwQXVkaW8uUFJFU0VUX0FVRElPXzFcbiAgICovXG4gIHJlYWRvbmx5IGF1ZGlvUHJlc2V0PzogUHJlc2V0U3Bla2UyMEF1ZGlvO1xuXG4gIC8qKlxuICAgKiBWaWRlbyBlbmNyeXB0aW9uIHByZXNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgUHJlc2V0U3Bla2UyMFZpZGVvLlBSRVNFVF9WSURFT18xXG4gICAqL1xuICByZWFkb25seSB2aWRlb1ByZXNldD86IFByZXNldFNwZWtlMjBWaWRlbztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBDTUFGIFNQRUtFIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbWFmU3Bla2VFbmNyeXB0aW9uUHJvcHMgZXh0ZW5kcyBTcGVrZUVuY3J5cHRpb25Qcm9wc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIGVuY3J5cHRpb24gbWV0aG9kIHRvIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZDogQ21hZkVuY3J5cHRpb25NZXRob2Q7XG5cbiAgLyoqXG4gICAqIFRoZSBEUk0gc3lzdGVtcyB0byB1c2UgZm9yIGNvbnRlbnQgcHJvdGVjdGlvbi5cbiAgICpcbiAgICogQ0VOQyBzdXBwb3J0cyBQbGF5UmVhZHksIFdpZGV2aW5lLCBhbmQgSXJkZXRvLlxuICAgKiBDQkNTIHN1cHBvcnRzIFBsYXlSZWFkeSwgV2lkZXZpbmUsIGFuZCBGYWlyUGxheS5cbiAgICovXG4gIHJlYWRvbmx5IGRybVN5c3RlbXM6IENtYWZEcm1TeXN0ZW1bXTtcblxuICAvKipcbiAgICogQ29uc3RhbnQgaW5pdGlhbGl6YXRpb24gdmVjdG9yICgzMi1jaGFyYWN0ZXIgaGV4IHN0cmluZykuXG4gICAqXG4gICAqIEEgMTI4LWJpdCwgMTYtYnl0ZSBoZXggdmFsdWUgcmVwcmVzZW50ZWQgYnkgYSAzMi1jaGFyYWN0ZXIgc3RyaW5nLFxuICAgKiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGtleSBmb3IgZW5jcnlwdGluZyBjb250ZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE1lZGlhUGFja2FnZSBnZW5lcmF0ZXMgdGhlIElWXG4gICAqL1xuICByZWFkb25seSBjb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLZXkgcm90YXRpb24gaW50ZXJ2YWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcm90YXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGtleVJvdGF0aW9uSW50ZXJ2YWw/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogV2hlbiBlbmFibGVkLCBEUk0gbWV0YWRhdGEgaXMgZXhjbHVkZWQgZnJvbSBDTUFGIHNlZ21lbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZVNlZ21lbnREcm1NZXRhZGF0YT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgVFMgU1BFS0UgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRzU3Bla2VFbmNyeXB0aW9uUHJvcHMgZXh0ZW5kcyBTcGVrZUVuY3J5cHRpb25Qcm9wc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIGVuY3J5cHRpb24gbWV0aG9kIHRvIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZDogVHNFbmNyeXB0aW9uTWV0aG9kO1xuXG4gIC8qKlxuICAgKiBUaGUgRFJNIHN5c3RlbXMgdG8gdXNlIGZvciBjb250ZW50IHByb3RlY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRmFpclBsYXkgZm9yIFNBTVBMRV9BRVMsIENsZWFyIEtleSBBRVMgMTI4IGZvciBBRVNfMTI4XG4gICAqL1xuICByZWFkb25seSBkcm1TeXN0ZW1zPzogVHNEcm1TeXN0ZW1bXTtcblxuICAvKipcbiAgICogQ29uc3RhbnQgaW5pdGlhbGl6YXRpb24gdmVjdG9yICgzMi1jaGFyYWN0ZXIgaGV4IHN0cmluZykuXG4gICAqXG4gICAqIEEgMTI4LWJpdCwgMTYtYnl0ZSBoZXggdmFsdWUgcmVwcmVzZW50ZWQgYnkgYSAzMi1jaGFyYWN0ZXIgc3RyaW5nLFxuICAgKiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGtleSBmb3IgZW5jcnlwdGluZyBjb250ZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE1lZGlhUGFja2FnZSBnZW5lcmF0ZXMgdGhlIElWXG4gICAqL1xuICByZWFkb25seSBjb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLZXkgcm90YXRpb24gaW50ZXJ2YWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcm90YXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGtleVJvdGF0aW9uSW50ZXJ2YWw/OiBEdXJhdGlvbjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBJU00gU1BFS0UgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uLlxuICpcbiAqIElTTSBvbmx5IHN1cHBvcnRzIENFTkMgZW5jcnlwdGlvbiB3aXRoIFBsYXlSZWFkeSBEUk0uXG4gKiBLZXkgcm90YXRpb24gYW5kIGNvbnN0YW50IGluaXRpYWxpemF0aW9uIHZlY3RvcnMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gKiBBdWRpbyBhbmQgdmlkZW8gcHJlc2V0cyBkZWZhdWx0IHRvIFNIQVJFRC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc21TcGVrZUVuY3J5cHRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgRFJNIHN5c3RlbXMgdG8gdXNlIGZvciBjb250ZW50IHByb3RlY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gW0lzbURybVN5c3RlbS5QTEFZUkVBRFldXG4gICAqL1xuICByZWFkb25seSBkcm1TeXN0ZW1zPzogSXNtRHJtU3lzdGVtW107XG5cbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElBTSByb2xlIGZvciBhY2Nlc3NpbmcgdGhlIGtleSBwcm92aWRlciBBUEkuXG4gICAqL1xuICByZWFkb25seSByb2xlOiBJUm9sZTtcblxuICAvKipcbiAgICogVVJMIG9mIHRoZSBTUEVLRSBrZXkgcHJvdmlkZXIuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgY2VydGlmaWNhdGUgdGhhdCB5b3UgaW1wb3J0ZWQgdG8gQVdTIENlcnRpZmljYXRlIE1hbmFnZXJcbiAgICogdG8gYWRkIGNvbnRlbnQga2V5IGVuY3J5cHRpb24gdG8gdGhpcyBlbmRwb2ludC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjb250ZW50IGtleSBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBjZXJ0aWZpY2F0ZT86IElDZXJ0aWZpY2F0ZTtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICpcbiAqIFVzZSBgQ21hZkVuY3J5cHRpb24uc3Bla2UoKWAsIGBUc0VuY3J5cHRpb24uc3Bla2UoKWAsIG9yIGBJc21FbmNyeXB0aW9uLnNwZWtlKClgIHRvIGNyZWF0ZSBpbnN0YW5jZXMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBFbmNyeXB0aW9uQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBCaW5kcyB0aGUgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIHRvIHByb2R1Y2UgdGhlIENsb3VkRm9ybWF0aW9uIHByb3BlcnR5LlxuICAgKlxuICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB1c2VkIGJ5IHRoZSBjb25zdHJ1Y3QgbGlicmFyeSBhbmQgc2hvdWxkIG5vdCBiZVxuICAgKiBjYWxsZWQgb3IgaW1wbGVtZW50ZWQgYnkgZXh0ZXJuYWwgY29uc3VtZXJzLiBJdCBtYXkgY2hhbmdlIHdpdGhvdXQgbm90aWNlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfYmluZChzY29wZTogQ29uc3RydWN0KTogQ2ZuT3JpZ2luRW5kcG9pbnQuRW5jcnlwdGlvblByb3BlcnR5O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBJQU0gcm9sZSB1c2VkIGZvciBlbmNyeXB0aW9uLCBpZiBhbnkuXG4gICAqXG4gICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kIHVzZWQgYnkgdGhlIGNvbnN0cnVjdCBsaWJyYXJ5IGFuZCBzaG91bGQgbm90IGJlXG4gICAqIGNhbGxlZCBvciBpbXBsZW1lbnRlZCBieSBleHRlcm5hbCBjb25zdW1lcnMuIEl0IG1heSBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IF9nZXRSb2xlKCk6IElSb2xlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBBQ00gY2VydGlmaWNhdGUgdXNlZCBmb3IgY29udGVudCBrZXkgZW5jcnlwdGlvbiwgaWYgYW55LlxuICAgKlxuICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB1c2VkIGJ5IHRoZSBjb25zdHJ1Y3QgbGlicmFyeSBhbmQgc2hvdWxkIG5vdCBiZVxuICAgKiBjYWxsZWQgb3IgaW1wbGVtZW50ZWQgYnkgZXh0ZXJuYWwgY29uc3VtZXJzLiBJdCBtYXkgY2hhbmdlIHdpdGhvdXQgbm90aWNlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfZ2V0Q2VydGlmaWNhdGUoKTogSUNlcnRpZmljYXRlIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgQ01BRiBzZWdtZW50cy5cbiAqXG4gKiBVc2UgYENtYWZFbmNyeXB0aW9uLnNwZWtlKClgIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGNsYXNzIENtYWZFbmNyeXB0aW9uIGV4dGVuZHMgRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGEgU1BFS0UtYmFzZWQgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIGZvciBDTUFGIHNlZ21lbnRzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzcGVrZShwcm9wczogQ21hZlNwZWtlRW5jcnlwdGlvblByb3BzKTogQ21hZkVuY3J5cHRpb24ge1xuICAgIGlmICghcHJvcHMudXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgU3Bla2VVcmxIdHRwc1JlcXVpcmVkYCwgJ1NQRUtFIGtleSBwcm92aWRlciBVUkwgbXVzdCB1c2UgSFRUUFMuJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5tZXRob2QgPT09IENtYWZFbmNyeXB0aW9uTWV0aG9kLkNFTkMgJiYgcHJvcHMuZHJtU3lzdGVtcy5pbmNsdWRlcyhDbWFmRHJtU3lzdGVtLkZBSVJQTEFZKSkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBDZW5jRmFpclBsYXlJbmNvbXBhdGlibGVgLCAnQ0VOQyBlbmNyeXB0aW9uIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IEZhaXJQbGF5LiBVc2UgQ0JDUyBmb3IgRmFpclBsYXkuJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5tZXRob2QgPT09IENtYWZFbmNyeXB0aW9uTWV0aG9kLkNCQ1MgJiYgcHJvcHMuZHJtU3lzdGVtcy5pbmNsdWRlcyhDbWFmRHJtU3lzdGVtLklSREVUTykpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgQ2Jjc0lyZGV0b0luY29tcGF0aWJsZWAsICdDQkNTIGVuY3J5cHRpb24gbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgSXJkZXRvLiBVc2UgQ0VOQyBmb3IgSXJkZXRvLicpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IENtYWZFbmNyeXB0aW9uKHByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBDbWFmU3Bla2VFbmNyeXB0aW9uUHJvcHM7XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJvcHM6IENtYWZTcGVrZUVuY3J5cHRpb25Qcm9wcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25maWcgPSBwcm9wcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9iaW5kKHNjb3BlOiBDb25zdHJ1Y3QpOiBDZm5PcmlnaW5FbmRwb2ludC5FbmNyeXB0aW9uUHJvcGVydHkge1xuICAgIGNvbnN0IHAgPSB0aGlzLmNvbmZpZztcbiAgICBpZiAocC5jb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yICYmIHAuY29uc3RhbnRJbml0aWFsaXphdGlvblZlY3Rvci5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBDb25zdGFudEluaXRWZWN0b3JMZW5ndGhgLCAnQ29uc3RhbnQgSW5pdGlhbGl6YXRpb24gVmVjdG9yIG5lZWRzIHRvIGJlIDMyIGNoYXJhY3RlcnMgaW4gbGVuZ3RoLicsIHNjb3BlKTtcbiAgICB9XG4gICAgaWYgKHAua2V5Um90YXRpb25JbnRlcnZhbCAmJiAocC5rZXlSb3RhdGlvbkludGVydmFsLnRvU2Vjb25kcygpIDwgMzAwIHx8IHAua2V5Um90YXRpb25JbnRlcnZhbC50b1NlY29uZHMoKSA+IDMxNTM2MDAwKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgS2V5Um90YXRpb25JbnRlcnZhbFJhbmdlYCwgJ0tleSBSb3RhdGlvbiBJbnRlcnZhbCBuZWVkcyB0byBiZSBiZXR3ZWVuIDMwMC0zMTUzNjAwMCBzZWNvbmRzLicsIHNjb3BlKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNtYWZFeGNsdWRlU2VnbWVudERybU1ldGFkYXRhOiBwLmV4Y2x1ZGVTZWdtZW50RHJtTWV0YWRhdGEsXG4gICAgICBjb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yOiBwLmNvbnN0YW50SW5pdGlhbGl6YXRpb25WZWN0b3IsXG4gICAgICBrZXlSb3RhdGlvbkludGVydmFsU2Vjb25kczogcC5rZXlSb3RhdGlvbkludGVydmFsPy50b1NlY29uZHMoKSxcbiAgICAgIGVuY3J5cHRpb25NZXRob2Q6IHsgY21hZkVuY3J5cHRpb25NZXRob2Q6IHAubWV0aG9kIH0sXG4gICAgICBzcGVrZUtleVByb3ZpZGVyOiB7XG4gICAgICAgIGNlcnRpZmljYXRlQXJuOiBwLmNlcnRpZmljYXRlPy5jZXJ0aWZpY2F0ZUFybixcbiAgICAgICAgZHJtU3lzdGVtczogcC5kcm1TeXN0ZW1zLFxuICAgICAgICBlbmNyeXB0aW9uQ29udHJhY3RDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgcHJlc2V0U3Bla2UyMEF1ZGlvOiBwLmF1ZGlvUHJlc2V0ID8/IFByZXNldFNwZWtlMjBBdWRpby5QUkVTRVRfQVVESU9fMSxcbiAgICAgICAgICBwcmVzZXRTcGVrZTIwVmlkZW86IHAudmlkZW9QcmVzZXQgPz8gUHJlc2V0U3Bla2UyMFZpZGVvLlBSRVNFVF9WSURFT18xLFxuICAgICAgICB9LFxuICAgICAgICB1cmw6IHAudXJsLFxuICAgICAgICByZXNvdXJjZUlkOiBwLnJlc291cmNlSWQsXG4gICAgICAgIHJvbGVBcm46IHAucm9sZS5yb2xlQXJuLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2dldFJvbGUoKTogSVJvbGUgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5jb25maWcucm9sZTsgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9nZXRDZXJ0aWZpY2F0ZSgpOiBJQ2VydGlmaWNhdGUgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5jb25maWcuY2VydGlmaWNhdGU7IH1cbn1cblxuLyoqXG4gKiBFbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIFRTIHNlZ21lbnRzLlxuICpcbiAqIFVzZSBgVHNFbmNyeXB0aW9uLnNwZWtlKClgIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRzRW5jcnlwdGlvbiBleHRlbmRzIEVuY3J5cHRpb25Db25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIFNQRUtFLWJhc2VkIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgVFMgc2VnbWVudHMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNwZWtlKHByb3BzOiBUc1NwZWtlRW5jcnlwdGlvblByb3BzKTogVHNFbmNyeXB0aW9uIHtcbiAgICBpZiAoIXByb3BzLnVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YFNwZWtlVXJsSHR0cHNSZXF1aXJlZGAsICdTUEVLRSBrZXkgcHJvdmlkZXIgVVJMIG11c3QgdXNlIEhUVFBTLicpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRzRW5jcnlwdGlvbihwcm9wcyk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogVHNTcGVrZUVuY3J5cHRpb25Qcm9wcztcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcm9wczogVHNTcGVrZUVuY3J5cHRpb25Qcm9wcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25maWcgPSBwcm9wcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9iaW5kKHNjb3BlOiBDb25zdHJ1Y3QpOiBDZm5PcmlnaW5FbmRwb2ludC5FbmNyeXB0aW9uUHJvcGVydHkge1xuICAgIGNvbnN0IHAgPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCBkZWZhdWx0RHJtOiBUc0RybVN5c3RlbVtdID0gcC5tZXRob2QgPT09IFRzRW5jcnlwdGlvbk1ldGhvZC5TQU1QTEVfQUVTXG4gICAgICA/IFtUc0RybVN5c3RlbS5GQUlSUExBWV0gOiBbVHNEcm1TeXN0ZW0uQ0xFQVJfS0VZX0FFU18xMjhdO1xuICAgIGlmIChwLmNvbnN0YW50SW5pdGlhbGl6YXRpb25WZWN0b3IgJiYgcC5jb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yLmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YENvbnN0YW50SW5pdFZlY3Rvckxlbmd0aGAsICdDb25zdGFudCBJbml0aWFsaXphdGlvbiBWZWN0b3IgbmVlZHMgdG8gYmUgMzIgY2hhcmFjdGVycyBpbiBsZW5ndGguJywgc2NvcGUpO1xuICAgIH1cbiAgICBpZiAocC5rZXlSb3RhdGlvbkludGVydmFsICYmIChwLmtleVJvdGF0aW9uSW50ZXJ2YWwudG9TZWNvbmRzKCkgPCAzMDAgfHwgcC5rZXlSb3RhdGlvbkludGVydmFsLnRvU2Vjb25kcygpID4gMzE1MzYwMDApKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBLZXlSb3RhdGlvbkludGVydmFsUmFuZ2VgLCAnS2V5IFJvdGF0aW9uIEludGVydmFsIG5lZWRzIHRvIGJlIGJldHdlZW4gMzAwLTMxNTM2MDAwIHNlY29uZHMuJywgc2NvcGUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY29uc3RhbnRJbml0aWFsaXphdGlvblZlY3RvcjogcC5jb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yLFxuICAgICAga2V5Um90YXRpb25JbnRlcnZhbFNlY29uZHM6IHAua2V5Um90YXRpb25JbnRlcnZhbD8udG9TZWNvbmRzKCksXG4gICAgICBlbmNyeXB0aW9uTWV0aG9kOiB7IHRzRW5jcnlwdGlvbk1ldGhvZDogcC5tZXRob2QgfSxcbiAgICAgIHNwZWtlS2V5UHJvdmlkZXI6IHtcbiAgICAgICAgY2VydGlmaWNhdGVBcm46IHAuY2VydGlmaWNhdGU/LmNlcnRpZmljYXRlQXJuLFxuICAgICAgICBkcm1TeXN0ZW1zOiAocC5kcm1TeXN0ZW1zID8/IGRlZmF1bHREcm0pLm1hcChkID0+IGQudG9TdHJpbmcoKSksXG4gICAgICAgIGVuY3J5cHRpb25Db250cmFjdENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBwcmVzZXRTcGVrZTIwQXVkaW86IHAuYXVkaW9QcmVzZXQgPz8gUHJlc2V0U3Bla2UyMEF1ZGlvLlBSRVNFVF9BVURJT18xLFxuICAgICAgICAgIHByZXNldFNwZWtlMjBWaWRlbzogcC52aWRlb1ByZXNldCA/PyBQcmVzZXRTcGVrZTIwVmlkZW8uUFJFU0VUX1ZJREVPXzEsXG4gICAgICAgIH0sXG4gICAgICAgIHVybDogcC51cmwsXG4gICAgICAgIHJlc291cmNlSWQ6IHAucmVzb3VyY2VJZCxcbiAgICAgICAgcm9sZUFybjogcC5yb2xlLnJvbGVBcm4sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBfZ2V0Um9sZSgpOiBJUm9sZSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLmNvbmZpZy5yb2xlOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2dldENlcnRpZmljYXRlKCk6IElDZXJ0aWZpY2F0ZSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLmNvbmZpZy5jZXJ0aWZpY2F0ZTsgfVxufVxuXG4vKipcbiAqIEVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgSVNNIChNaWNyb3NvZnQgU21vb3RoIFN0cmVhbWluZykgc2VnbWVudHMuXG4gKlxuICogSVNNIG9ubHkgc3VwcG9ydHMgQ0VOQyBlbmNyeXB0aW9uIHdpdGggUGxheVJlYWR5IERSTS5cbiAqIEF1ZGlvIGFuZCB2aWRlbyBwcmVzZXRzIGFyZSBhbHdheXMgU0hBUkVELlxuICpcbiAqIFVzZSBgSXNtRW5jcnlwdGlvbi5zcGVrZSgpYCB0byBjcmVhdGUgYW4gaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJc21FbmNyeXB0aW9uIGV4dGVuZHMgRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGEgU1BFS0UtYmFzZWQgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIGZvciBJU00gc2VnbWVudHMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNwZWtlKHByb3BzOiBJc21TcGVrZUVuY3J5cHRpb25Qcm9wcyk6IElzbUVuY3J5cHRpb24ge1xuICAgIGlmICghcHJvcHMudXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgU3Bla2VVcmxIdHRwc1JlcXVpcmVkYCwgJ1NQRUtFIGtleSBwcm92aWRlciBVUkwgbXVzdCB1c2UgSFRUUFMuJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSXNtRW5jcnlwdGlvbihwcm9wcyk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogSXNtU3Bla2VFbmNyeXB0aW9uUHJvcHM7XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJvcHM6IElzbVNwZWtlRW5jcnlwdGlvblByb3BzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbmZpZyA9IHByb3BzO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2JpbmQoX3Njb3BlOiBDb25zdHJ1Y3QpOiBDZm5PcmlnaW5FbmRwb2ludC5FbmNyeXB0aW9uUHJvcGVydHkge1xuICAgIGNvbnN0IHAgPSB0aGlzLmNvbmZpZztcbiAgICByZXR1cm4ge1xuICAgICAgZW5jcnlwdGlvbk1ldGhvZDogeyBpc21FbmNyeXB0aW9uTWV0aG9kOiAnQ0VOQycgfSxcbiAgICAgIHNwZWtlS2V5UHJvdmlkZXI6IHtcbiAgICAgICAgY2VydGlmaWNhdGVBcm46IHAuY2VydGlmaWNhdGU/LmNlcnRpZmljYXRlQXJuLFxuICAgICAgICBkcm1TeXN0ZW1zOiAocC5kcm1TeXN0ZW1zID8/IFtJc21Ecm1TeXN0ZW0uUExBWVJFQURZXSkubWFwKGQgPT4gZC50b1N0cmluZygpKSxcbiAgICAgICAgZW5jcnlwdGlvbkNvbnRyYWN0Q29uZmlndXJhdGlvbjoge1xuICAgICAgICAgIHByZXNldFNwZWtlMjBBdWRpbzogUHJlc2V0U3Bla2UyMEF1ZGlvLlNIQVJFRCxcbiAgICAgICAgICBwcmVzZXRTcGVrZTIwVmlkZW86IFByZXNldFNwZWtlMjBWaWRlby5TSEFSRUQsXG4gICAgICAgIH0sXG4gICAgICAgIHVybDogcC51cmwsXG4gICAgICAgIHJlc291cmNlSWQ6IHAucmVzb3VyY2VJZCxcbiAgICAgICAgcm9sZUFybjogcC5yb2xlLnJvbGVBcm4sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBfZ2V0Um9sZSgpOiBJUm9sZSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLmNvbmZpZy5yb2xlOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2dldENlcnRpZmljYXRlKCk6IElDZXJ0aWZpY2F0ZSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLmNvbmZpZy5jZXJ0aWZpY2F0ZTsgfVxufVxuXG4vKipcbiAqIFRoZSBzZWdtZW50IGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyB0aGUgc2VnbWVudCBuYW1lLCBkdXJhdGlvbiwgYW5kIG90aGVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlZ21lbnRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXIgdHlwZSBmb3IgdGhpcyBzZWdtZW50IChUUyBvciBDTUFGKVxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyVHlwZTogQ29udGFpbmVyVHlwZTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNlZ21lbnQgaW5jbHVkZXMgSS1mcmFtZS1vbmx5IHN0cmVhbXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCAtIE5vdCBzcGVjaWZpZWQuXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlSWZyYW1lT25seVN0cmVhbXM/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIFNDVEUtMzUgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHNlZ21lbnQuXG4gICAqXG4gICAqIFRoZSBTQ1RFLTM1IG1lc3NhZ2UgdHlwZXMgdGhhdCB5b3Ugd2FudCB0byBiZSB0cmVhdGVkIGFzIGFkIG1hcmtlcnMgaW4gdGhlIG91dHB1dC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBTQ1RFIGZpbHRlcmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZUZpbHRlcj86IFNjdGVNZXNzYWdlVHlwZVtdO1xuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBTQ1RFLTM1IG1lc3NhZ2VzIGFyZSBpbmNsdWRlZCBpbiBzZWdtZW50IGZpbGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNDVEUtMzUgbWVzc2FnZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiBzZWdtZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZUluU2VnbWVudHM/OiBTY3RlSW5TZWdtZW50cztcbiAgLyoqXG4gICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgc2VnbWVudHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IDZcbiAgICovXG4gIHJlYWRvbmx5IHNlZ21lbnREdXJhdGlvbj86IER1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHNlZ21lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHNlZ21lbnRcbiAgICovXG4gIHJlYWRvbmx5IHNlZ21lbnROYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgc2VnbWVudCBpbmNsdWRlcyBEVkIgc3VidGl0bGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgdHNJbmNsdWRlRHZiU3VidGl0bGVzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNlZ21lbnQgaXMgYW4gYXVkaW8gcmVuZGl0aW9uIGdyb3VwLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgdHNVc2VBdWRpb1JlbmRpdGlvbkdyb3VwPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIHNlZ21lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbj86IEVuY3J5cHRpb25Db25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIEJhc2UgcHJvcGVydGllcyBjb21tb24gdG8gYWxsIHNlZ21lbnQgY29uZmlndXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VnbWVudFByb3BzQmFzZSB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgSS1mcmFtZS1vbmx5IHN0cmVhbXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlSWZyYW1lT25seVN0cmVhbXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEdXJhdGlvbiBvZiBlYWNoIHNlZ21lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLnNlY29uZHMoNilcbiAgICovXG4gIHJlYWRvbmx5IGR1cmF0aW9uPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHNlZ21lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdzZWdtZW50J1xuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBUUyAoVHJhbnNwb3J0IFN0cmVhbSkgc2VnbWVudCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRzU2VnbWVudFByb3BzIGV4dGVuZHMgU2VnbWVudFByb3BzQmFzZSB7XG4gIC8qKlxuICAgKiBTQ1RFLTM1IG1lc3NhZ2UgdHlwZXMgdG8gdHJlYXQgYXMgYWQgbWFya2Vycy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBmaWx0ZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IHNjdGVGaWx0ZXI/OiBTY3RlTWVzc2FnZVR5cGVbXTtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBTQ1RFLTM1IG1lc3NhZ2VzIGFyZSBpbmNsdWRlZCBpbiBzZWdtZW50IGZpbGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNDVEUtMzUgbWVzc2FnZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiBzZWdtZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZUluU2VnbWVudHM/OiBTY3RlSW5TZWdtZW50cztcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIERWQiBzdWJ0aXRsZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlRHZiU3VidGl0bGVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1c2UgYXVkaW8gcmVuZGl0aW9uIGdyb3Vwcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHVzZUF1ZGlvUmVuZGl0aW9uR3JvdXA/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBUUyBzZWdtZW50LlxuICAgKlxuICAgKiBVc2UgYFRzRW5jcnlwdGlvbi5zcGVrZSgpYCB0byBjcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbj86IFRzRW5jcnlwdGlvbjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBDTUFGIHNlZ21lbnQgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbWFmU2VnbWVudFByb3BzIGV4dGVuZHMgU2VnbWVudFByb3BzQmFzZSB7XG4gIC8qKlxuICAgKiBTQ1RFLTM1IG1lc3NhZ2UgdHlwZXMgdG8gdHJlYXQgYXMgYWQgbWFya2Vycy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBmaWx0ZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IHNjdGVGaWx0ZXI/OiBTY3RlTWVzc2FnZVR5cGVbXTtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBTQ1RFLTM1IG1lc3NhZ2VzIGFyZSBpbmNsdWRlZCBpbiBzZWdtZW50IGZpbGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNDVEUtMzUgbWVzc2FnZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiBzZWdtZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZUluU2VnbWVudHM/OiBTY3RlSW5TZWdtZW50cztcblxuICAvKipcbiAgICogRW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGUgQ01BRiBzZWdtZW50LlxuICAgKlxuICAgKiBVc2UgYENtYWZFbmNyeXB0aW9uLnNwZWtlKClgIHRvIGNyZWF0ZSB0aGUgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uPzogQ21hZkVuY3J5cHRpb247XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgSVNNIChNaWNyb3NvZnQgU21vb3RoIFN0cmVhbWluZykgc2VnbWVudCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzbVNlZ21lbnRQcm9wcyBleHRlbmRzIFNlZ21lbnRQcm9wc0Jhc2Uge1xuICAvKipcbiAgICogRW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGUgSVNNIHNlZ21lbnQuXG4gICAqXG4gICAqIFVzZSBgSXNtRW5jcnlwdGlvbi5zcGVrZSgpYCB0byBjcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbj86IElzbUVuY3J5cHRpb247XG59XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIGZvciBjcmVhdGluZyBzZWdtZW50IGNvbmZpZ3VyYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgU2VnbWVudCB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBUUyAoVHJhbnNwb3J0IFN0cmVhbSkgc2VnbWVudCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBVc2UgdGhpcyBmb3IgZW5kcG9pbnRzIHdpdGggQ29udGFpbmVyVHlwZS5UUy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdHMocHJvcHM6IFRzU2VnbWVudFByb3BzID0ge30pOiBTZWdtZW50Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRhaW5lclR5cGU6IENvbnRhaW5lclR5cGUuVFMsXG4gICAgICBpbmNsdWRlSWZyYW1lT25seVN0cmVhbXM6IHByb3BzLmluY2x1ZGVJZnJhbWVPbmx5U3RyZWFtcyxcbiAgICAgIHNjdGVGaWx0ZXI6IHByb3BzLnNjdGVGaWx0ZXIsXG4gICAgICBzY3RlSW5TZWdtZW50czogcHJvcHMuc2N0ZUluU2VnbWVudHMsXG4gICAgICBzZWdtZW50RHVyYXRpb246IHByb3BzLmR1cmF0aW9uLFxuICAgICAgc2VnbWVudE5hbWU6IHByb3BzLm5hbWUsXG4gICAgICB0c0luY2x1ZGVEdmJTdWJ0aXRsZXM6IHByb3BzLmluY2x1ZGVEdmJTdWJ0aXRsZXMsXG4gICAgICB0c1VzZUF1ZGlvUmVuZGl0aW9uR3JvdXA6IHByb3BzLnVzZUF1ZGlvUmVuZGl0aW9uR3JvdXAsXG4gICAgICBlbmNyeXB0aW9uOiBwcm9wcy5lbmNyeXB0aW9uLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ01BRiBzZWdtZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFVzZSB0aGlzIGZvciBlbmRwb2ludHMgd2l0aCBDb250YWluZXJUeXBlLkNNQUYuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNtYWYocHJvcHM6IENtYWZTZWdtZW50UHJvcHMgPSB7fSk6IFNlZ21lbnRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGFpbmVyVHlwZTogQ29udGFpbmVyVHlwZS5DTUFGLFxuICAgICAgaW5jbHVkZUlmcmFtZU9ubHlTdHJlYW1zOiBwcm9wcy5pbmNsdWRlSWZyYW1lT25seVN0cmVhbXMsXG4gICAgICBzY3RlRmlsdGVyOiBwcm9wcy5zY3RlRmlsdGVyLFxuICAgICAgc2N0ZUluU2VnbWVudHM6IHByb3BzLnNjdGVJblNlZ21lbnRzLFxuICAgICAgc2VnbWVudER1cmF0aW9uOiBwcm9wcy5kdXJhdGlvbixcbiAgICAgIHNlZ21lbnROYW1lOiBwcm9wcy5uYW1lLFxuICAgICAgZW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBJU00gKE1pY3Jvc29mdCBTbW9vdGggU3RyZWFtaW5nKSBzZWdtZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFVzZSB0aGlzIGZvciBlbmRwb2ludHMgd2l0aCBDb250YWluZXJUeXBlLklTTS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNtKHByb3BzOiBJc21TZWdtZW50UHJvcHMgPSB7fSk6IFNlZ21lbnRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGFpbmVyVHlwZTogQ29udGFpbmVyVHlwZS5JU00sXG4gICAgICBpbmNsdWRlSWZyYW1lT25seVN0cmVhbXM6IHByb3BzLmluY2x1ZGVJZnJhbWVPbmx5U3RyZWFtcyxcbiAgICAgIHNlZ21lbnREdXJhdGlvbjogcHJvcHMuZHVyYXRpb24sXG4gICAgICBzZWdtZW50TmFtZTogcHJvcHMubmFtZSxcbiAgICAgIGVuY3J5cHRpb246IHByb3BzLmVuY3J5cHRpb24sXG4gICAgfTtcbiAgfVxufVxuXG5hYnN0cmFjdCBjbGFzcyBPcmlnaW5FbmRwb2ludEJhc2UgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElPcmlnaW5FbmRwb2ludCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIE9yaWdpbkVuZHBvaW50IGNvbnN0cnVjdCB0aGF0IHJlcHJlc2VudHMgYW4gZXh0ZXJuYWwgKGltcG9ydGVkKSBPcmlnaW4gRW5kcG9pbnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21PcmlnaW5FbmRwb2ludEF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IE9yaWdpbkVuZHBvaW50QXR0cmlidXRlcyk6IElPcmlnaW5FbmRwb2ludCB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgT3JpZ2luRW5kcG9pbnRCYXNlIGltcGxlbWVudHMgSU9yaWdpbkVuZHBvaW50IHtcbiAgICAgIHByb3RlY3RlZCBobHNNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50Lkhsc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5W10gPSBbXTtcbiAgICAgIHByb3RlY3RlZCBsbEhsc01hbmlmZXN0czogQ2ZuT3JpZ2luRW5kcG9pbnQuTG93TGF0ZW5jeUhsc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5W10gPSBbXTtcbiAgICAgIHByb3RlY3RlZCBkYXNoTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5EYXNoTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXSA9IFtdO1xuICAgICAgcHJvdGVjdGVkIG1zc01hbmlmZXN0czogQ2ZuT3JpZ2luRW5kcG9pbnQuTXNzTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXSA9IFtdO1xuICAgICAgcHJvdGVjdGVkIHNlZ21lbnQ/OiBTZWdtZW50Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBwb2xpY3kgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbEdyb3VwTmFtZSA9IGF0dHJzLmNoYW5uZWxHcm91cE5hbWU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbE5hbWUgPSBhdHRycy5jaGFubmVsTmFtZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBvcmlnaW5FbmRwb2ludE5hbWUgPSBhdHRycy5vcmlnaW5FbmRwb2ludE5hbWU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0ID0gdW5kZWZpbmVkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IG1vZGlmaWVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaGxzTWFuaWZlc3RVcmxzID0gdW5kZWZpbmVkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGxvd0xhdGVuY3lIbHNNYW5pZmVzdFVybHMgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZGFzaE1hbmlmZXN0VXJscyA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBtc3NNYW5pZmVzdFVybHMgPSB1bmRlZmluZWQ7XG4gICAgICBwcm90ZWN0ZWQgYXV0b0NyZWF0ZVBvbGljeSA9IGZhbHNlO1xuICAgICAgcHVibGljIHJlYWRvbmx5IG9yaWdpbkVuZHBvaW50QXJuID0gU3RhY2sub2YodGhpcykuZm9ybWF0QXJuKHtcbiAgICAgICAgc2VydmljZTogJ21lZGlhcGFja2FnZXYyJyxcbiAgICAgICAgcmVzb3VyY2U6IGBjaGFubmVsR3JvdXAvJHthdHRycy5jaGFubmVsR3JvdXBOYW1lfS9jaGFubmVsLyR7dGhpcy5jaGFubmVsTmFtZX0vb3JpZ2luRW5kcG9pbnRgLFxuICAgICAgICBhcm5Gb3JtYXQ6IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FLFxuICAgICAgICByZXNvdXJjZU5hbWU6IHRoaXMub3JpZ2luRW5kcG9pbnROYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjaGFubmVsR3JvdXBOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjaGFubmVsTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgb3JpZ2luRW5kcG9pbnROYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBvcmlnaW5FbmRwb2ludEFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY3JlYXRlZEF0Pzogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgbW9kaWZpZWRBdD86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGhsc01hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgbG93TGF0ZW5jeUhsc01hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZGFzaE1hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgbXNzTWFuaWZlc3RVcmxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIHRvIHRoaXMgT3JpZ2luIEVuZHBvaW50IHJlc291cmNlLlxuICAgKiBSZXF1aXJlZCBieSB0aGUgYXV0by1nZW5lcmF0ZWQgSU9yaWdpbkVuZHBvaW50UmVmIGludGVyZmFjZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgb3JpZ2luRW5kcG9pbnRSZWYoKTogT3JpZ2luRW5kcG9pbnRSZWZlcmVuY2Uge1xuICAgIHJldHVybiB7XG4gICAgICBvcmlnaW5FbmRwb2ludEFybjogdGhpcy5vcmlnaW5FbmRwb2ludEFybixcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGhsc01hbmlmZXN0czogQ2ZuT3JpZ2luRW5kcG9pbnQuSGxzTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXTtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGxsSGxzTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5Mb3dMYXRlbmN5SGxzTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXTtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGRhc2hNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50LkRhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgbXNzTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5Nc3NNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2VnbWVudD86IFNlZ21lbnRDb25maWd1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIHJlc291cmNlIHBvbGljeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIElmIGBhdXRvQ3JlYXRlUG9saWN5YCBpcyB0cnVlLCBhbiBgT3JpZ2luRW5kcG9pbnRQb2xpY3lgIHdpbGwgYmUgY3JlYXRlZCB1cG9uIHRoZVxuICAgKiBmaXJzdCBjYWxsIHRvIGFkZFRvUmVzb3VyY2VQb2xpY3kocykuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcG9saWN5PzogT3JpZ2luRW5kcG9pbnRQb2xpY3k7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBhbiBvcmlnaW4gZW5kcG9pbnQgcmVzb3VyY2UgcG9saWN5IHNob3VsZCBhdXRvbWF0aWNhbGx5IGJlIGNyZWF0ZWQgdXBvblxuICAgKiB0aGUgZmlyc3QgY2FsbCB0byBgYWRkVG9SZXNvdXJjZVBvbGljeWAuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYXV0b0NyZWF0ZVBvbGljeTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ0ROIGF1dGhvcml6YXRpb24gY29uZmlndXJhdGlvbiB0byBiZSBhcHBsaWVkIHdoZW4gdGhlIHBvbGljeSBpcyBjcmVhdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjZG5BdXRoQ29uZmlnPzogQ2RuQXV0aENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFNldCBDRE4gYXV0aCBjb25maWcuIFVzZWQgYnkgc3ViY2xhc3MgY29uc3RydWN0b3JzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfc2V0Q2RuQXV0aChjZG5BdXRoOiBDZG5BdXRoQ29uZmlndXJhdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5jZG5BdXRoQ29uZmlnKSB7XG4gICAgICB0aGlzLmNkbkF1dGhDb25maWcgPSBjZG5BdXRoO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgb3JpZ2luIGVuZHBvaW50IHBvbGljeS5cbiAgICpcbiAgICogWW91IGNhbiBvbmx5IGFkZCAxIE9yaWdpbkVuZHBvaW50UG9saWN5IHRvIGFuIE9yaWdpbkVuZHBvaW50LlxuICAgKiBJZiB5b3UgaGF2ZSBhbHJlYWR5IGRlZmluZWQgb25lLCBpdCB3aWxsIGFwcGVuZCB0byB0aGUgcG9saWN5IGFscmVhZHkgY3JlYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRlbWVudCAtIFRoZSBwb2xpY3kgc3RhdGVtZW50IHRvIGFkZFxuICAgKiBAcGFyYW0gY2RuQXV0aCAtIE9wdGlvbmFsIENETiBhdXRob3JpemF0aW9uIGNvbmZpZ3VyYXRpb24uIElmIHByb3ZpZGVkLCB0aGUgcG9saWN5IHdpbGwgYmVcbiAgICogICAgICAgICAgICAgICAgICBjcmVhdGVkIHdpdGggQ0ROIGF1dGhlbnRpY2F0aW9uIGVuYWJsZWQgdXNpbmcgc2VjcmV0cyBmcm9tIEFXUyBTZWNyZXRzIE1hbmFnZXIuXG4gICAqICAgICAgICAgICAgICAgICAgSWYgY2RuQXV0aCBpcyBwcm92aWRlZCBtdWx0aXBsZSB0aW1lcywgb25seSB0aGUgZmlyc3QgY29uZmlndXJhdGlvbiBpcyB1c2VkLlxuICAgKi9cbiAgcHVibGljIGFkZFRvUmVzb3VyY2VQb2xpY3koc3RhdGVtZW50OiBQb2xpY3lTdGF0ZW1lbnQsIGNkbkF1dGg/OiBDZG5BdXRoQ29uZmlndXJhdGlvbik6IEFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQge1xuICAgIC8vIFN0b3JlIENETiBhdXRoIGNvbmZpZyBpZiBwcm92aWRlZCAob25seSBpZiBub3QgYWxyZWFkeSBzZXQpXG4gICAgaWYgKGNkbkF1dGggJiYgIXRoaXMuY2RuQXV0aENvbmZpZykge1xuICAgICAgdGhpcy5jZG5BdXRoQ29uZmlnID0gY2RuQXV0aDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucG9saWN5ICYmIHRoaXMuYXV0b0NyZWF0ZVBvbGljeSkge1xuICAgICAgdGhpcy5wb2xpY3kgPSBuZXcgT3JpZ2luRW5kcG9pbnRQb2xpY3kodGhpcywgJ1BvbGljeScsIHtcbiAgICAgICAgb3JpZ2luRW5kcG9pbnQ6IHRoaXMsXG4gICAgICAgIGNkbkF1dGg6IHRoaXMuY2RuQXV0aENvbmZpZyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBvbGljeSkge1xuICAgICAgdGhpcy5wb2xpY3kuZG9jdW1lbnQuYWRkU3RhdGVtZW50cyhzdGF0ZW1lbnQpO1xuICAgICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IHRydWUsIHBvbGljeURlcGVuZGFibGU6IHRoaXMucG9saWN5IH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IGZhbHNlIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW5kIG1vZGlmeSBTZWdtZW50IGNvbmZpZ3VyYXRpb24gZm9yIGVuZHBvaW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNlZ21lbnRWYWxpZGF0aW9uKHNlZ21lbnRDb250YWluZXJUeXBlOiBDb250YWluZXJUeXBlLCBzZWdtZW50PzogU2VnbWVudENvbmZpZ3VyYXRpb24pOiBDZm5PcmlnaW5FbmRwb2ludC5TZWdtZW50UHJvcGVydHkgfCB1bmRlZmluZWQge1xuICAgIGlmIChzZWdtZW50Py5zZWdtZW50RHVyYXRpb24gJiYgKHNlZ21lbnQuc2VnbWVudER1cmF0aW9uPy50b1NlY29uZHMoKSA8IDEgfHwgc2VnbWVudC5zZWdtZW50RHVyYXRpb24/LnRvU2Vjb25kcygpID4gMzApKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBTZWdtZW50RHVyYXRpb25SYW5nZWAsICdTZWdtZW50IER1cmF0aW9uIG5lZWRzIHRvIGJlIGJldHdlZW4gMS0zMCBzZWNvbmRzLicsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmIChzZWdtZW50Q29udGFpbmVyVHlwZSAhPSBDb250YWluZXJUeXBlLlRTICYmIChzZWdtZW50Py50c0luY2x1ZGVEdmJTdWJ0aXRsZXMgfHwgc2VnbWVudD8udHNVc2VBdWRpb1JlbmRpdGlvbkdyb3VwKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgVHNPcHRpb25zSW5jb21wYXRpYmxlYCwgJ0Rpc2FibGUgVFMgU2VnbWVudCBvcHRpb25zIGZvciBEdmJTdWJ0aXRsZXMgYW5kIEF1ZGlvUmVuZGl0aW9uR3JvdXBzIHdoZW4gdXNpbmcgQ01BRi4nLCB0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW5jbHVkZUlmcmFtZU9ubHlTdHJlYW1zOiBzZWdtZW50Py5pbmNsdWRlSWZyYW1lT25seVN0cmVhbXMsXG4gICAgICBzZWdtZW50RHVyYXRpb25TZWNvbmRzOiBzZWdtZW50Py5zZWdtZW50RHVyYXRpb24/LnRvU2Vjb25kcygpLFxuICAgICAgc2VnbWVudE5hbWU6IHNlZ21lbnQ/LnNlZ21lbnROYW1lLFxuICAgICAgdHNJbmNsdWRlRHZiU3VidGl0bGVzOiBzZWdtZW50Py50c0luY2x1ZGVEdmJTdWJ0aXRsZXMsXG4gICAgICB0c1VzZUF1ZGlvUmVuZGl0aW9uR3JvdXA6IHNlZ21lbnQ/LnRzVXNlQXVkaW9SZW5kaXRpb25Hcm91cCxcbiAgICAgIHNjdGU6IChzZWdtZW50Py5zY3RlRmlsdGVyIHx8IHNlZ21lbnQ/LnNjdGVJblNlZ21lbnRzKSA/IHtcbiAgICAgICAgc2N0ZUZpbHRlcjogc2VnbWVudD8uc2N0ZUZpbHRlcixcbiAgICAgICAgc2N0ZUluU2VnbWVudHM6IHNlZ21lbnQ/LnNjdGVJblNlZ21lbnRzLFxuICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgIGVuY3J5cHRpb246IHNlZ21lbnQ/LmVuY3J5cHRpb24/Ll9iaW5kKHRoaXMpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBtZXRyaWMuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRyaWNOYW1lIG5hbWUgb2YgdGhlIG1ldHJpYy5cbiAgICogQHBhcmFtIHByb3BzIG1ldHJpYyBvcHRpb25zLlxuICAgKi9cbiAgcHVibGljIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWMoe1xuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIG5hbWVzcGFjZTogJ0FXUy9NZWRpYVBhY2thZ2UnLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBDaGFubmVsR3JvdXA6IHRoaXMuY2hhbm5lbEdyb3VwTmFtZSxcbiAgICAgICAgQ2hhbm5lbDogdGhpcy5jaGFubmVsTmFtZSxcbiAgICAgICAgT3JpZ2luRW5kcG9pbnQ6IHRoaXMub3JpZ2luRW5kcG9pbnROYW1lLFxuICAgICAgfSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pLmF0dGFjaFRvKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgTWV0cmljIGZvciBJbmdyZXNzIEJ5dGVzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY0luZ3Jlc3NCeXRlcyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnSW5ncmVzc0J5dGVzJywge1xuICAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0LkJZVEVTLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBNZXRyaWMgZm9yIEVncmVzcyBCeXRlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN1bSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNFZ3Jlc3NCeXRlcyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnRWdyZXNzQnl0ZXMnLCB7XG4gICAgICBzdGF0aXN0aWM6ICdzdW0nLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuQllURVMsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIE1ldHJpYyBmb3IgSW5ncmVzcyByZXNwb25zZSB0aW1lXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXZlcmFnZSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNJbmdyZXNzUmVzcG9uc2VUaW1lKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdJbmdyZXNzUmVzcG9uc2VUaW1lJywge1xuICAgICAgc3RhdGlzdGljOiAnYXZnJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0Lk1JTExJU0VDT05EUyxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgTWV0cmljIGZvciBFZ3Jlc3MgUmVzcG9uc2UgdGltZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGF2ZXJhZ2Ugb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljRWdyZXNzUmVzcG9uc2VUaW1lKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdFZ3Jlc3NSZXNwb25zZVRpbWUnLCB7XG4gICAgICBzdGF0aXN0aWM6ICdhdmcnLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuTUlMTElTRUNPTkRTLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBNZXRyaWMgZm9yIEVncmVzcyBSZXF1ZXN0IENvdW50XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY0VncmVzc1JlcXVlc3RDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnRWdyZXNzUmVxdWVzdENvdW50Jywge1xuICAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0LkNPVU5ULFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBNZXRyaWMgZm9yIEluZ3Jlc3MgUmVxdWVzdCBDb3VudFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN1bSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNJbmdyZXNzUmVxdWVzdENvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdJbmdyZXNzUmVxdWVzdENvdW50Jywge1xuICAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0LkNPVU5ULFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIGFuIEFXUyBFbGVtZW50YWwgTWVkaWFQYWNrYWdlIFYyIE9yaWdpbiBFbmRwb2ludFxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgT3JpZ2luRW5kcG9pbnQgZXh0ZW5kcyBPcmlnaW5FbmRwb2ludEJhc2UgaW1wbGVtZW50cyBJT3JpZ2luRW5kcG9pbnQge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1tZWRpYXBhY2thZ2V2Mi1hbHBoYS5PcmlnaW5FbmRwb2ludCc7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxHcm91cE5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBvcmlnaW5FbmRwb2ludE5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG9yaWdpbkVuZHBvaW50QXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGNyZWF0aW9uIG9mIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtb2RpZmllZEF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBcnJheSBjb250YWluaW5nIExvdyBMYXRlbmN5IEhMUyBNYW5pZmVzdHMgY3JlYXRlZCBieSB0aGUgT3JpZ2luRW5kcG9pbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG93TGF0ZW5jeUhsc01hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBcnJheSBjb250YWluaW5nIEhMUyBNYW5pZmVzdHMgY3JlYXRlZCBieSB0aGUgT3JpZ2luRW5kcG9pbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaGxzTWFuaWZlc3RVcmxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEFycmF5IGNvbnRhaW5pbmcgREFTSCBNYW5pZmVzdHMgY3JlYXRlZCBieSB0aGUgT3JpZ2luRW5kcG9pbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGFzaE1hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogQXJyYXkgY29udGFpbmluZyBNU1MgTWFuaWZlc3RzIGNyZWF0ZWQgYnkgdGhlIE9yaWdpbkVuZHBvaW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1zc01hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogVGhlIHJlc291cmNlIHBvbGljeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIElmIGBhdXRvQ3JlYXRlUG9saWN5YCBpcyB0cnVlLCBhbiBgT3JpZ2luRW5kcG9pbnRQb2xpY3lgIHdpbGwgYmUgY3JlYXRlZCB1cG9uIHRoZVxuICAgKiBmaXJzdCBjYWxsIHRvIGFkZFRvUmVzb3VyY2VQb2xpY3kocykuXG4gICAqL1xuICBwdWJsaWMgcG9saWN5PzogT3JpZ2luRW5kcG9pbnRQb2xpY3k7XG4gIHByb3RlY3RlZCBhdXRvQ3JlYXRlUG9saWN5ID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIGhsc01hbmlmZXN0czogQ2ZuT3JpZ2luRW5kcG9pbnQuSGxzTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXSA9IFtdO1xuICBwcm90ZWN0ZWQgbGxIbHNNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50Lkxvd0xhdGVuY3lIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdID0gW107XG4gIHByb3RlY3RlZCBkYXNoTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5EYXNoTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXSA9IFtdO1xuICBwcm90ZWN0ZWQgbXNzTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5Nc3NNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdID0gW107XG4gIHByb3RlY3RlZCBzZWdtZW50PzogU2VnbWVudENvbmZpZ3VyYXRpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE9yaWdpbkVuZHBvaW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHM/Lm9yaWdpbkVuZHBvaW50TmFtZSA/PyBMYXp5LnN0cmluZyh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7XG4gICAgICAgICAgbWF4TGVuZ3RoOiAyNTYsXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIC8vIFZhbGlkYXRlIG9yaWdpbkVuZHBvaW50TmFtZSBpZiBwcm92aWRlZFxuICAgIGlmIChwcm9wcy5vcmlnaW5FbmRwb2ludE5hbWUgIT0gbnVsbCAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLm9yaWdpbkVuZHBvaW50TmFtZSkpIHtcbiAgICAgIGlmIChwcm9wcy5vcmlnaW5FbmRwb2ludE5hbWUubGVuZ3RoIDwgMSB8fCBwcm9wcy5vcmlnaW5FbmRwb2ludE5hbWUubGVuZ3RoID4gMjU2KSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YE9yaWdpbkVuZHBvaW50TmFtZUxlbmd0aGAsICdPcmlnaW4gZW5kcG9pbnQgbmFtZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMjU2IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLicsIHRoaXMpO1xuICAgICAgfVxuICAgICAgaWYgKCFwcm9wcy5vcmlnaW5FbmRwb2ludE5hbWUubWF0Y2goL15bYS16QS1aMC05Xy1dKyQvKSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBPcmlnaW5FbmRwb2ludE5hbWVQYXR0ZXJuYCwgJ09yaWdpbiBlbmRwb2ludCBuYW1lIG11c3Qgb25seSBjb250YWluIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBoeXBoZW5zLCBhbmQgdW5kZXJzY29yZXMuJywgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZGVzY3JpcHRpb24gaWYgcHJvdmlkZWRcbiAgICBpZiAocHJvcHMuZGVzY3JpcHRpb24gJiYgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5kZXNjcmlwdGlvbikgJiYgcHJvcHMuZGVzY3JpcHRpb24ubGVuZ3RoID4gMTAyNCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgT3JpZ2luRW5kcG9pbnREZXNjcmlwdGlvbkxlbmd0aGAsICdPcmlnaW4gZW5kcG9pbnQgZGVzY3JpcHRpb24gbXVzdCBub3QgZXhjZWVkIDEwMjQgY2hhcmFjdGVycy4nLCB0aGlzKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlZ21lbnQgPSBwcm9wcy5zZWdtZW50O1xuXG4gICAgLy8gR2V0IGNvbnRhaW5lciB0eXBlIGZyb20gc2VnbWVudFxuICAgIGNvbnN0IGNvbnRhaW5lclR5cGUgPSBwcm9wcy5zZWdtZW50LmNvbnRhaW5lclR5cGU7XG5cbiAgICBpZiAocHJvcHM/LnN0YXJ0b3ZlcldpbmRvdyAmJiAocHJvcHMuc3RhcnRvdmVyV2luZG93LnRvU2Vjb25kcygpIDwgNjAgfHwgcHJvcHMuc3RhcnRvdmVyV2luZG93LnRvU2Vjb25kcygpID4gMTIwOTYwMCkpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YFN0YXJ0b3ZlcldpbmRvd1JhbmdlYCwgJ1N0YXJ0b3ZlciBXaW5kb3cgbmVlZHMgdG8gYmUgYmV0d2VlbiA2MC0xMjA5NjAwIHNlY29uZHMuJywgdGhpcyk7XG4gICAgfVxuXG4gICAgcHJvcHMubWFuaWZlc3RzLmZvckVhY2gobWFuaWZlc3QgPT4ge1xuICAgICAgbWFuaWZlc3QuX2JpbmQoe1xuICAgICAgICBobHNNYW5pZmVzdHM6IHRoaXMuaGxzTWFuaWZlc3RzLFxuICAgICAgICBsbEhsc01hbmlmZXN0czogdGhpcy5sbEhsc01hbmlmZXN0cyxcbiAgICAgICAgZGFzaE1hbmlmZXN0czogdGhpcy5kYXNoTWFuaWZlc3RzLFxuICAgICAgICBtc3NNYW5pZmVzdHM6IHRoaXMubXNzTWFuaWZlc3RzLFxuICAgICAgICBzZWdtZW50OiBwcm9wcy5zZWdtZW50LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBtYW5pZmVzdCBhbmQgY29udGFpbmVyIHR5cGUgY29tcGF0aWJpbGl0eVxuICAgIGlmICh0aGlzLm1zc01hbmlmZXN0cy5sZW5ndGggPiAwICYmIGNvbnRhaW5lclR5cGUgIT09IENvbnRhaW5lclR5cGUuSVNNKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBNc3NSZXF1aXJlc0lzbWAsICdNU1MgbWFuaWZlc3RzIHJlcXVpcmUgSVNNIGNvbnRhaW5lciB0eXBlLiBVc2UgU2VnbWVudC5pc20oKSBmb3IgTVNTIG1hbmlmZXN0cy4nLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXNoTWFuaWZlc3RzLmxlbmd0aCA+IDAgJiYgY29udGFpbmVyVHlwZSAhPT0gQ29udGFpbmVyVHlwZS5DTUFGKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBEYXNoUmVxdWlyZXNDbWFmYCwgJ0RBU0ggbWFuaWZlc3RzIHJlcXVpcmUgQ01BRiBjb250YWluZXIgdHlwZS4gVXNlIFNlZ21lbnQuY21hZigpIGZvciBEQVNIIG1hbmlmZXN0cy4nLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAoKHRoaXMuaGxzTWFuaWZlc3RzLmxlbmd0aCA+IDAgfHwgdGhpcy5sbEhsc01hbmlmZXN0cy5sZW5ndGggPiAwKSAmJiBjb250YWluZXJUeXBlID09PSBDb250YWluZXJUeXBlLklTTSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgSGxzSW5jb21wYXRpYmxlV2l0aElzbWAsICdITFMgYW5kIExvdyBMYXRlbmN5IEhMUyBtYW5pZmVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBJU00gY29udGFpbmVyIHR5cGUuIFVzZSBTZWdtZW50LmNtYWYoKSBvciBTZWdtZW50LnRzKCkgZm9yIEhMUyBtYW5pZmVzdHMuJywgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgRFJNIHNpZ25hbGxpbmcgcmVxdWlyZXMgZW5jcnlwdGlvblxuICAgIGlmICh0aGlzLmRhc2hNYW5pZmVzdHMuc29tZShtID0+IG0uZHJtU2lnbmFsaW5nKSAmJiAhcHJvcHMuc2VnbWVudC5lbmNyeXB0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBEcm1TaWduYWxsaW5nUmVxdWlyZXNFbmNyeXB0aW9uYCwgJ0RSTSBzaWduYWxsaW5nIHJlcXVpcmVzIGVuY3J5cHRpb24gdG8gYmUgY29uZmlndXJlZCBvbiB0aGUgZW5kcG9pbnQuJywgdGhpcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luID0gbmV3IENmbk9yaWdpbkVuZHBvaW50KHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIGNoYW5uZWxOYW1lOiBwcm9wcy5jaGFubmVsLmNoYW5uZWxOYW1lLFxuICAgICAgY2hhbm5lbEdyb3VwTmFtZTogcHJvcHMuY2hhbm5lbC5jaGFubmVsR3JvdXBOYW1lLFxuICAgICAgb3JpZ2luRW5kcG9pbnROYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIHRhZ3M6IHByb3BzPy50YWdzID8gcmVuZGVyVGFncyhwcm9wcy50YWdzKSA6IHVuZGVmaW5lZCxcbiAgICAgIGhsc01hbmlmZXN0czogTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiB0aGlzLmhsc01hbmlmZXN0cyB9LCB7IG9taXRFbXB0eUFycmF5OiB0cnVlIH0pLFxuICAgICAgbG93TGF0ZW5jeUhsc01hbmlmZXN0czogTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiB0aGlzLmxsSGxzTWFuaWZlc3RzIH0sIHsgb21pdEVtcHR5QXJyYXk6IHRydWUgfSksXG4gICAgICBkYXNoTWFuaWZlc3RzOiBMYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+IHRoaXMuZGFzaE1hbmlmZXN0cyB9LCB7IG9taXRFbXB0eUFycmF5OiB0cnVlIH0pLFxuICAgICAgbXNzTWFuaWZlc3RzOiBMYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+IHRoaXMubXNzTWFuaWZlc3RzIH0sIHsgb21pdEVtcHR5QXJyYXk6IHRydWUgfSksXG4gICAgICBjb250YWluZXJUeXBlOiBjb250YWluZXJUeXBlLFxuICAgICAgc3RhcnRvdmVyV2luZG93U2Vjb25kczogcHJvcHMuc3RhcnRvdmVyV2luZG93Py50b1NlY29uZHMoKSxcbiAgICAgIHNlZ21lbnQ6IHRoaXMuc2VnbWVudFZhbGlkYXRpb24oY29udGFpbmVyVHlwZSwgcHJvcHMuc2VnbWVudCksXG4gICAgICBmb3JjZUVuZHBvaW50RXJyb3JDb25maWd1cmF0aW9uOiBwcm9wcy5mb3JjZUVuZHBvaW50Q29uZmlndXJhdGlvbkNvbmRpdGlvbnMgPyB7XG4gICAgICAgIGVuZHBvaW50RXJyb3JDb25kaXRpb25zOiBwcm9wcy5mb3JjZUVuZHBvaW50Q29uZmlndXJhdGlvbkNvbmRpdGlvbnMsXG4gICAgICB9OiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgY2hhbm5lbE5hbWUvY2hhbm5lbEdyb3VwTmFtZSBhcmUgcmVuZGVyZWQgYXMgbGl0ZXJhbCBzdHJpbmdzIChub3QgQ0ZOIFJlZnMpLCBzb1xuICAgIC8vIENsb3VkRm9ybWF0aW9uIGNhbm5vdCBpbmZlciB0aGUgZGVwZW5kZW5jeS4gV2UgYWRkIGRpcmVjdCBDZm5SZXNvdXJjZS1sZXZlbCBEZXBlbmRzT25cbiAgICAvLyB0byBndWFyYW50ZWUgZGVwbG95IG9yZGVyaW5nIHdpdGhvdXQgdHJpZ2dlcmluZyBDREsncyBzdWJ0cmVlLWxldmVsIGN5Y2xlIGRldGVjdGlvbi5cbiAgICAvLyBGb3IgaW1wb3J0ZWQgY29uc3RydWN0cywgZGVmYXVsdENoaWxkIGlzIHVuZGVmaW5lZCAobm8gQ0ZOIHJlc291cmNlIHRvIG9yZGVyIGFnYWluc3QpLlxuICAgIGNvbnN0IGVuY3J5cHRpb25Sb2xlID0gcHJvcHMuc2VnbWVudC5lbmNyeXB0aW9uPy5fZ2V0Um9sZSgpO1xuICAgIGlmIChlbmNyeXB0aW9uUm9sZSkgb3JpZ2luLm5vZGUuYWRkRGVwZW5kZW5jeShlbmNyeXB0aW9uUm9sZSk7XG4gICAgY29uc3QgZW5jcnlwdGlvbkNlcnQgPSBwcm9wcy5zZWdtZW50LmVuY3J5cHRpb24/Ll9nZXRDZXJ0aWZpY2F0ZSgpO1xuICAgIGlmIChlbmNyeXB0aW9uQ2VydCkgb3JpZ2luLm5vZGUuYWRkRGVwZW5kZW5jeShlbmNyeXB0aW9uQ2VydCk7XG4gICAgY29uc3QgY2hhbm5lbENmbiA9IHByb3BzLmNoYW5uZWwubm9kZS5kZWZhdWx0Q2hpbGQgYXMgQ2ZuUmVzb3VyY2UgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGNoYW5uZWxDZm4gJiYgQ2ZuUmVzb3VyY2UuaXNDZm5SZXNvdXJjZShjaGFubmVsQ2ZuKSkge1xuICAgICAgb3JpZ2luLmFkZERlcGVuZGVuY3koY2hhbm5lbENmbik7XG4gICAgfVxuICAgIGNvbnN0IGdyb3VwQ2ZuID0gcHJvcHMuY2hhbm5lbC5jaGFubmVsR3JvdXA/Lm5vZGUuZGVmYXVsdENoaWxkIGFzIENmblJlc291cmNlIHwgdW5kZWZpbmVkO1xuICAgIGlmIChncm91cENmbiAmJiBDZm5SZXNvdXJjZS5pc0NmblJlc291cmNlKGdyb3VwQ2ZuKSkge1xuICAgICAgb3JpZ2luLmFkZERlcGVuZGVuY3koZ3JvdXBDZm4pO1xuICAgIH1cblxuICAgIHRoaXMubG93TGF0ZW5jeUhsc01hbmlmZXN0VXJscyA9IHRoaXMubGxIbHNNYW5pZmVzdHMubWFwKChfLCBpKSA9PiBGbi5zZWxlY3QoaSwgb3JpZ2luLmF0dHJMb3dMYXRlbmN5SGxzTWFuaWZlc3RVcmxzKSk7XG4gICAgdGhpcy5obHNNYW5pZmVzdFVybHMgPSB0aGlzLmhsc01hbmlmZXN0cy5tYXAoKF8sIGkpID0+IEZuLnNlbGVjdChpLCBvcmlnaW4uYXR0ckhsc01hbmlmZXN0VXJscykpO1xuICAgIHRoaXMuZGFzaE1hbmlmZXN0VXJscyA9IHRoaXMuZGFzaE1hbmlmZXN0cy5tYXAoKF8sIGkpID0+IEZuLnNlbGVjdChpLCBvcmlnaW4uYXR0ckRhc2hNYW5pZmVzdFVybHMpKTtcbiAgICB0aGlzLm1zc01hbmlmZXN0VXJscyA9IHRoaXMubXNzTWFuaWZlc3RzLm1hcCgoXywgaSkgPT4gRm4uc2VsZWN0KGksIG9yaWdpbi5hdHRyTXNzTWFuaWZlc3RVcmxzKSk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBvcmlnaW4uYXR0ckNyZWF0ZWRBdDtcbiAgICB0aGlzLm1vZGlmaWVkQXQgPSBvcmlnaW4uYXR0ck1vZGlmaWVkQXQ7XG4gICAgdGhpcy5jaGFubmVsR3JvdXBOYW1lID0gb3JpZ2luLmNoYW5uZWxHcm91cE5hbWU7XG4gICAgdGhpcy5jaGFubmVsTmFtZSA9IG9yaWdpbi5jaGFubmVsTmFtZTtcbiAgICB0aGlzLm9yaWdpbkVuZHBvaW50TmFtZSA9IG9yaWdpbi5vcmlnaW5FbmRwb2ludE5hbWU7XG4gICAgdGhpcy5vcmlnaW5FbmRwb2ludEFybiA9IG9yaWdpbi5hdHRyQXJuO1xuXG4gICAgb3JpZ2luLmFwcGx5UmVtb3ZhbFBvbGljeShwcm9wcz8ucmVtb3ZhbFBvbGljeSA/PyBSZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuXG4gICAgLy8gUHJlLXNldCBDRE4gYXV0aCBjb25maWcgaWYgcHJvdmlkZWQgaW4gcHJvcHNcbiAgICBpZiAocHJvcHMuY2RuQXV0aCkge1xuICAgICAgdGhpcy5fc2V0Q2RuQXV0aChwcm9wcy5jZG5BdXRoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|