cdk8s-plus-34 0.0.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/.jsii +101649 -0
  2. package/CODE_OF_CONDUCT.md +3 -0
  3. package/CONTRIBUTING.md +185 -0
  4. package/DCO +34 -0
  5. package/LICENSE +202 -0
  6. package/NOTICE +1 -0
  7. package/OWNERS.md +5 -0
  8. package/README.md +21 -33
  9. package/SECURITY.md +5 -0
  10. package/cdk8s.yaml +11 -0
  11. package/docs/java.md +150009 -0
  12. package/docs/plus/config-map.md +98 -0
  13. package/docs/plus/container.md +133 -0
  14. package/docs/plus/cronjob.md +67 -0
  15. package/docs/plus/deployment.md +232 -0
  16. package/docs/plus/horizontal-pod-autoscaler.md +226 -0
  17. package/docs/plus/ingress.md +68 -0
  18. package/docs/plus/job.md +48 -0
  19. package/docs/plus/namespace.md +58 -0
  20. package/docs/plus/network-policy.md +341 -0
  21. package/docs/plus/pod.md +455 -0
  22. package/docs/plus/pv.md +82 -0
  23. package/docs/plus/pvc.md +77 -0
  24. package/docs/plus/rbac.md +104 -0
  25. package/docs/plus/secret.md +32 -0
  26. package/docs/plus/service-account.md +35 -0
  27. package/docs/plus/service.md +41 -0
  28. package/docs/plus/volume.md +84 -0
  29. package/docs/python.md +161196 -0
  30. package/docs/typescript.md +139649 -0
  31. package/git-hooks/README.md +9 -0
  32. package/git-hooks/prepare-commit-msg +18 -0
  33. package/git-hooks/setup.sh +10 -0
  34. package/lib/_action.d.ts +26 -0
  35. package/lib/_action.js +39 -0
  36. package/lib/api-resource.d.ts +298 -0
  37. package/lib/api-resource.js +430 -0
  38. package/lib/base.d.ts +79 -0
  39. package/lib/base.js +92 -0
  40. package/lib/config-map.d.ts +126 -0
  41. package/lib/config-map.js +159 -0
  42. package/lib/container.d.ts +1057 -0
  43. package/lib/container.js +845 -0
  44. package/lib/cron-job.d.ts +138 -0
  45. package/lib/cron-job.js +103 -0
  46. package/lib/daemon-set.d.ts +45 -0
  47. package/lib/daemon-set.js +55 -0
  48. package/lib/deployment.d.ts +235 -0
  49. package/lib/deployment.js +216 -0
  50. package/lib/handler.d.ts +62 -0
  51. package/lib/handler.js +54 -0
  52. package/lib/horizontal-pod-autoscaler.d.ts +500 -0
  53. package/lib/horizontal-pod-autoscaler.js +569 -0
  54. package/lib/imports/k8s.d.ts +25809 -0
  55. package/lib/imports/k8s.js +19238 -0
  56. package/lib/index.d.ts +26 -0
  57. package/lib/index.js +44 -0
  58. package/lib/ingress.d.ts +230 -0
  59. package/lib/ingress.js +246 -0
  60. package/lib/job.d.ts +64 -0
  61. package/lib/job.js +54 -0
  62. package/lib/namespace.d.ts +128 -0
  63. package/lib/namespace.js +109 -0
  64. package/lib/network-policy.d.ts +311 -0
  65. package/lib/network-policy.js +344 -0
  66. package/lib/pod.d.ts +1097 -0
  67. package/lib/pod.js +1147 -0
  68. package/lib/probe.d.ts +181 -0
  69. package/lib/probe.js +88 -0
  70. package/lib/pv.d.ts +375 -0
  71. package/lib/pv.js +273 -0
  72. package/lib/pvc.d.ts +163 -0
  73. package/lib/pvc.js +154 -0
  74. package/lib/role-binding.d.ts +138 -0
  75. package/lib/role-binding.js +165 -0
  76. package/lib/role.d.ts +268 -0
  77. package/lib/role.js +401 -0
  78. package/lib/secret.d.ts +195 -0
  79. package/lib/secret.js +185 -0
  80. package/lib/service-account.d.ts +83 -0
  81. package/lib/service-account.js +105 -0
  82. package/lib/service.d.ts +289 -0
  83. package/lib/service.js +182 -0
  84. package/lib/stateful-set.d.ts +206 -0
  85. package/lib/stateful-set.js +244 -0
  86. package/lib/utils.d.ts +4 -0
  87. package/lib/utils.js +33 -0
  88. package/lib/volume.d.ts +577 -0
  89. package/lib/volume.js +377 -0
  90. package/lib/workload.d.ts +121 -0
  91. package/lib/workload.js +122 -0
  92. package/node_modules/balanced-match/.github/FUNDING.yml +2 -0
  93. package/node_modules/balanced-match/LICENSE.md +21 -0
  94. package/node_modules/balanced-match/README.md +97 -0
  95. package/node_modules/balanced-match/index.js +62 -0
  96. package/node_modules/balanced-match/package.json +48 -0
  97. package/node_modules/brace-expansion/.github/FUNDING.yml +2 -0
  98. package/node_modules/brace-expansion/LICENSE +21 -0
  99. package/node_modules/brace-expansion/README.md +135 -0
  100. package/node_modules/brace-expansion/index.js +202 -0
  101. package/node_modules/brace-expansion/package.json +49 -0
  102. package/node_modules/minimatch/LICENSE +15 -0
  103. package/node_modules/minimatch/README.md +491 -0
  104. package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts +2 -0
  105. package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map +1 -0
  106. package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js +14 -0
  107. package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map +1 -0
  108. package/node_modules/minimatch/dist/commonjs/ast.d.ts +20 -0
  109. package/node_modules/minimatch/dist/commonjs/ast.d.ts.map +1 -0
  110. package/node_modules/minimatch/dist/commonjs/ast.js +747 -0
  111. package/node_modules/minimatch/dist/commonjs/ast.js.map +1 -0
  112. package/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts +8 -0
  113. package/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map +1 -0
  114. package/node_modules/minimatch/dist/commonjs/brace-expressions.js +152 -0
  115. package/node_modules/minimatch/dist/commonjs/brace-expressions.js.map +1 -0
  116. package/node_modules/minimatch/dist/commonjs/escape.d.ts +12 -0
  117. package/node_modules/minimatch/dist/commonjs/escape.d.ts.map +1 -0
  118. package/node_modules/minimatch/dist/commonjs/escape.js +22 -0
  119. package/node_modules/minimatch/dist/commonjs/escape.js.map +1 -0
  120. package/node_modules/minimatch/dist/commonjs/index.d.ts +98 -0
  121. package/node_modules/minimatch/dist/commonjs/index.d.ts.map +1 -0
  122. package/node_modules/minimatch/dist/commonjs/index.js +1023 -0
  123. package/node_modules/minimatch/dist/commonjs/index.js.map +1 -0
  124. package/node_modules/minimatch/dist/commonjs/package.json +3 -0
  125. package/node_modules/minimatch/dist/commonjs/unescape.d.ts +17 -0
  126. package/node_modules/minimatch/dist/commonjs/unescape.d.ts.map +1 -0
  127. package/node_modules/minimatch/dist/commonjs/unescape.js +24 -0
  128. package/node_modules/minimatch/dist/commonjs/unescape.js.map +1 -0
  129. package/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts +2 -0
  130. package/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map +1 -0
  131. package/node_modules/minimatch/dist/esm/assert-valid-pattern.js +10 -0
  132. package/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map +1 -0
  133. package/node_modules/minimatch/dist/esm/ast.d.ts +20 -0
  134. package/node_modules/minimatch/dist/esm/ast.d.ts.map +1 -0
  135. package/node_modules/minimatch/dist/esm/ast.js +743 -0
  136. package/node_modules/minimatch/dist/esm/ast.js.map +1 -0
  137. package/node_modules/minimatch/dist/esm/brace-expressions.d.ts +8 -0
  138. package/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map +1 -0
  139. package/node_modules/minimatch/dist/esm/brace-expressions.js +148 -0
  140. package/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -0
  141. package/node_modules/minimatch/dist/esm/escape.d.ts +12 -0
  142. package/node_modules/minimatch/dist/esm/escape.d.ts.map +1 -0
  143. package/node_modules/minimatch/dist/esm/escape.js +18 -0
  144. package/node_modules/minimatch/dist/esm/escape.js.map +1 -0
  145. package/node_modules/minimatch/dist/esm/index.d.ts +98 -0
  146. package/node_modules/minimatch/dist/esm/index.d.ts.map +1 -0
  147. package/node_modules/minimatch/dist/esm/index.js +1007 -0
  148. package/node_modules/minimatch/dist/esm/index.js.map +1 -0
  149. package/node_modules/minimatch/dist/esm/package.json +3 -0
  150. package/node_modules/minimatch/dist/esm/unescape.d.ts +17 -0
  151. package/node_modules/minimatch/dist/esm/unescape.d.ts.map +1 -0
  152. package/node_modules/minimatch/dist/esm/unescape.js +20 -0
  153. package/node_modules/minimatch/dist/esm/unescape.js.map +1 -0
  154. package/node_modules/minimatch/package.json +82 -0
  155. package/package.json +176 -6
  156. package/rotate.md +85 -0
@@ -0,0 +1,845 @@
1
+ "use strict";
2
+ var _a, _b, _c, _d, _e, _f;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Env = exports.EnvFrom = exports.Cpu = exports.MountPropagation = exports.Container = exports.ContainerRestartPolicy = exports.ImagePullPolicy = exports.EnvValue = exports.ResourceFieldPaths = exports.EnvFieldPaths = exports.ContainerSecurityContext = exports.Protocol = exports.SeccompProfileType = exports.Capability = void 0;
5
+ exports.extractContainerPorts = extractContainerPorts;
6
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
7
+ const cdk8s_1 = require("cdk8s");
8
+ const k8s = require("./imports/k8s");
9
+ const probe = require("./probe");
10
+ const utils_1 = require("./utils");
11
+ /**
12
+ * Capability - complete list of POSIX capabilities
13
+ */
14
+ var Capability;
15
+ (function (Capability) {
16
+ /**
17
+ * ALL
18
+ */
19
+ Capability["ALL"] = "ALL";
20
+ /**
21
+ * CAP_AUDIT_CONTROL
22
+ */
23
+ Capability["AUDIT_CONTROL"] = "AUDIT_CONTROL";
24
+ /**
25
+ * CAP_AUDIT_READ
26
+ */
27
+ Capability["AUDIT_READ"] = "AUDIT_READ";
28
+ /**
29
+ * CAP_AUDIT_WRITE
30
+ */
31
+ Capability["AUDIT_WRITE"] = "AUDIT_WRITE";
32
+ /**
33
+ * CAP_BLOCK_SUSPEND
34
+ */
35
+ Capability["BLOCK_SUSPEND"] = "BLOCK_SUSPEND";
36
+ /**
37
+ * CAP_BPF
38
+ */
39
+ Capability["BPF"] = "BPF";
40
+ /**
41
+ * CAP_CHECKPOINT_RESTORE
42
+ */
43
+ Capability["CHECKPOINT_RESTORE"] = "CHECKPOINT_RESTORE";
44
+ /**
45
+ * CAP_CHOWN
46
+ */
47
+ Capability["CHOWN"] = "CHOWN";
48
+ /**
49
+ * CAP_DAC_OVERRIDE
50
+ */
51
+ Capability["DAC_OVERRIDE"] = "DAC_OVERRIDE";
52
+ /**
53
+ * CAP_DAC_READ_SEARCH
54
+ */
55
+ Capability["DAC_READ_SEARCH"] = "DAC_READ_SEARCH";
56
+ /**
57
+ * CAP_FOWNER
58
+ */
59
+ Capability["FOWNER"] = "FOWNER";
60
+ /**
61
+ * CAP_FSETID
62
+ */
63
+ Capability["FSETID"] = "FSETID";
64
+ /**
65
+ * CAP_IPC_LOCK
66
+ */
67
+ Capability["IPC_LOCK"] = "IPC_LOCK";
68
+ /**
69
+ * CAP_IPC_OWNER
70
+ */
71
+ Capability["IPC_OWNER"] = "IPC_OWNER";
72
+ /**
73
+ * CAP_KILL
74
+ */
75
+ Capability["KILL"] = "KILL";
76
+ /**
77
+ * CAP_LEASE
78
+ */
79
+ Capability["LEASE"] = "LEASE";
80
+ /**
81
+ * CAP_LINUX_IMMUTABLE
82
+ */
83
+ Capability["LINUX_IMMUTABLE"] = "LINUX_IMMUTABLE";
84
+ /**
85
+ * CAP_MAC_ADMIN
86
+ */
87
+ Capability["MAC_ADMIN"] = "MAC_ADMIN";
88
+ /**
89
+ * CAP_MAC_OVERRIDE
90
+ */
91
+ Capability["MAC_OVERRIDE"] = "MAC_OVERRIDE";
92
+ /**
93
+ * CAP_MKNOD
94
+ */
95
+ Capability["MKNOD"] = "MKNOD";
96
+ /**
97
+ * CAP_NET_ADMIN
98
+ */
99
+ Capability["NET_ADMIN"] = "NET_ADMIN";
100
+ /**
101
+ * CAP_NET_BIND_SERVICE
102
+ */
103
+ Capability["NET_BIND_SERVICE"] = "NET_BIND_SERVICE";
104
+ /**
105
+ * CAP_NET_BROADCAST
106
+ */
107
+ Capability["NET_BROADCAST"] = "NET_BROADCAST";
108
+ /**
109
+ * CAP_NET_RAW
110
+ */
111
+ Capability["NET_RAW"] = "NET_RAW";
112
+ /**
113
+ * CAP_PERFMON
114
+ */
115
+ Capability["PERFMON"] = "PERFMON";
116
+ /**
117
+ * CAP_SETGID
118
+ */
119
+ Capability["SETGID"] = "SETGID";
120
+ /**
121
+ * CAP_SETFCAP
122
+ */
123
+ Capability["SETFCAP"] = "SETFCAP";
124
+ /**
125
+ * CAP_SETPCAP
126
+ */
127
+ Capability["SETPCAP"] = "SETPCAP";
128
+ /**
129
+ * CAP_SETUID
130
+ */
131
+ Capability["SETUID"] = "SETUID";
132
+ /**
133
+ * CAP_SYS_ADMIN
134
+ */
135
+ Capability["SYS_ADMIN"] = "SYS_ADMIN";
136
+ /**
137
+ * CAP_SYS_BOOT
138
+ */
139
+ Capability["SYS_BOOT"] = "SYS_BOOT";
140
+ /**
141
+ * CAP_SYS_CHROOT
142
+ */
143
+ Capability["SYS_CHROOT"] = "SYS_CHROOT";
144
+ /**
145
+ * CAP_SYS_MODULE
146
+ */
147
+ Capability["SYS_MODULE"] = "SYS_MODULE";
148
+ /**
149
+ * CAP_SYS_NICE
150
+ */
151
+ Capability["SYS_NICE"] = "SYS_NICE";
152
+ /**
153
+ * CAP_SYS_PACCT
154
+ */
155
+ Capability["SYS_PACCT"] = "SYS_PACCT";
156
+ /**
157
+ * CAP_SYS_PTRACE
158
+ */
159
+ Capability["SYS_PTRACE"] = "SYS_PTRACE";
160
+ /**
161
+ * CAP_SYS_RAWIO
162
+ */
163
+ Capability["SYS_RAWIO"] = "SYS_RAWIO";
164
+ /**
165
+ * CAP_SYS_RESOURCE
166
+ */
167
+ Capability["SYS_RESOURCE"] = "SYS_RESOURCE";
168
+ /**
169
+ * CAP_SYS_TIME
170
+ */
171
+ Capability["SYS_TIME"] = "SYS_TIME";
172
+ /**
173
+ * CAP_SYS_TTY_CONFIG
174
+ */
175
+ Capability["SYS_TTY_CONFIG"] = "SYS_TTY_CONFIG";
176
+ /**
177
+ * CAP_SYSLOG
178
+ */
179
+ Capability["SYSLOG"] = "SYSLOG";
180
+ /**
181
+ * CAP_WAKE_ALARM
182
+ */
183
+ Capability["WAKE_ALARM"] = "WAKE_ALARM";
184
+ })(Capability || (exports.Capability = Capability = {}));
185
+ var SeccompProfileType;
186
+ (function (SeccompProfileType) {
187
+ /**
188
+ * A profile defined in a file on the node should be used
189
+ */
190
+ SeccompProfileType["LOCALHOST"] = "Localhost";
191
+ /**
192
+ * The container runtime default profile should be used
193
+ */
194
+ SeccompProfileType["RUNTIME_DEFAULT"] = "RuntimeDefault";
195
+ /**
196
+ * No profile should be applied
197
+ */
198
+ SeccompProfileType["UNCONFINED"] = "Unconfined";
199
+ })(SeccompProfileType || (exports.SeccompProfileType = SeccompProfileType = {}));
200
+ /**
201
+ * Network protocols.
202
+ */
203
+ var Protocol;
204
+ (function (Protocol) {
205
+ /**
206
+ * TCP.
207
+ */
208
+ Protocol["TCP"] = "TCP";
209
+ /**
210
+ * UDP.
211
+ */
212
+ Protocol["UDP"] = "UDP";
213
+ /**
214
+ * SCTP.
215
+ */
216
+ Protocol["SCTP"] = "SCTP";
217
+ })(Protocol || (exports.Protocol = Protocol = {}));
218
+ /**
219
+ * Container security attributes and settings.
220
+ */
221
+ class ContainerSecurityContext {
222
+ constructor(props = {}) {
223
+ if (props.seccompProfile?.localhostProfile && props.seccompProfile.type != SeccompProfileType.LOCALHOST) {
224
+ throw new Error('localhostProfile must only be set if type is "Localhost"');
225
+ }
226
+ this.ensureNonRoot = props.ensureNonRoot ?? true;
227
+ this.privileged = props.privileged ?? false;
228
+ this.readOnlyRootFilesystem = props.readOnlyRootFilesystem ?? true;
229
+ this.user = props.user;
230
+ this.group = props.group;
231
+ this.allowPrivilegeEscalation = props.allowPrivilegeEscalation ?? false;
232
+ this.capabilities = props.capabilities;
233
+ this.seccompProfile = props.seccompProfile;
234
+ }
235
+ /**
236
+ * @internal
237
+ */
238
+ _toKube() {
239
+ return {
240
+ runAsGroup: this.group,
241
+ runAsUser: this.user,
242
+ runAsNonRoot: this.ensureNonRoot,
243
+ privileged: this.privileged,
244
+ readOnlyRootFilesystem: this.readOnlyRootFilesystem,
245
+ allowPrivilegeEscalation: this.allowPrivilegeEscalation,
246
+ capabilities: this.capabilities,
247
+ seccompProfile: this.seccompProfile,
248
+ };
249
+ }
250
+ }
251
+ exports.ContainerSecurityContext = ContainerSecurityContext;
252
+ _a = JSII_RTTI_SYMBOL_1;
253
+ ContainerSecurityContext[_a] = { fqn: "cdk8s-plus-34.ContainerSecurityContext", version: "2.0.0" };
254
+ var EnvFieldPaths;
255
+ (function (EnvFieldPaths) {
256
+ /**
257
+ * The name of the pod.
258
+ */
259
+ EnvFieldPaths["POD_NAME"] = "metadata.name";
260
+ /**
261
+ * The namespace of the pod.
262
+ */
263
+ EnvFieldPaths["POD_NAMESPACE"] = "metadata.namespace";
264
+ /**
265
+ * The uid of the pod.
266
+ */
267
+ EnvFieldPaths["POD_UID"] = "metadata.uid";
268
+ /**
269
+ * The labels of the pod.
270
+ */
271
+ EnvFieldPaths["POD_LABEL"] = "metadata.labels";
272
+ /**
273
+ * The annotations of the pod.
274
+ */
275
+ EnvFieldPaths["POD_ANNOTATION"] = "metadata.annotations";
276
+ /**
277
+ * The ipAddress of the pod.
278
+ */
279
+ EnvFieldPaths["POD_IP"] = "status.podIP";
280
+ /**
281
+ * The service account name of the pod.
282
+ */
283
+ EnvFieldPaths["SERVICE_ACCOUNT_NAME"] = "spec.serviceAccountName";
284
+ /**
285
+ * The name of the node.
286
+ */
287
+ EnvFieldPaths["NODE_NAME"] = "spec.nodeName";
288
+ /**
289
+ * The ipAddress of the node.
290
+ */
291
+ EnvFieldPaths["NODE_IP"] = "status.hostIP";
292
+ /**
293
+ * The ipAddresess of the pod.
294
+ */
295
+ EnvFieldPaths["POD_IPS"] = "status.podIPs";
296
+ })(EnvFieldPaths || (exports.EnvFieldPaths = EnvFieldPaths = {}));
297
+ var ResourceFieldPaths;
298
+ (function (ResourceFieldPaths) {
299
+ /**
300
+ * CPU limit of the container.
301
+ */
302
+ ResourceFieldPaths["CPU_LIMIT"] = "limits.cpu";
303
+ /**
304
+ * Memory limit of the container.
305
+ */
306
+ ResourceFieldPaths["MEMORY_LIMIT"] = "limits.memory";
307
+ /**
308
+ * CPU request of the container.
309
+ */
310
+ ResourceFieldPaths["CPU_REQUEST"] = "requests.cpu";
311
+ /**
312
+ * Memory request of the container.
313
+ */
314
+ ResourceFieldPaths["MEMORY_REQUEST"] = "requests.memory";
315
+ /**
316
+ * Ephemeral storage limit of the container.
317
+ */
318
+ ResourceFieldPaths["STORAGE_LIMIT"] = "limits.ephemeral-storage";
319
+ /**
320
+ * Ephemeral storage request of the container.
321
+ */
322
+ ResourceFieldPaths["STORAGE_REQUEST"] = "requests.ephemeral-storage";
323
+ })(ResourceFieldPaths || (exports.ResourceFieldPaths = ResourceFieldPaths = {}));
324
+ /**
325
+ * Utility class for creating reading env values from various sources.
326
+ */
327
+ class EnvValue {
328
+ /**
329
+ * Create a value by reading a specific key inside a config map.
330
+ *
331
+ * @param configMap - The config map.
332
+ * @param key - The key to extract the value from.
333
+ * @param options - Additional options.
334
+ */
335
+ static fromConfigMap(configMap, key, options = {}) {
336
+ const source = {
337
+ configMapKeyRef: {
338
+ name: configMap.name,
339
+ key,
340
+ optional: options.optional,
341
+ },
342
+ };
343
+ return new EnvValue(undefined, source);
344
+ }
345
+ /**
346
+ * Defines an environment value from a secret JSON value.
347
+ *
348
+ * @param secretValue The secret value (secrent + key)
349
+ * @param options Additional options
350
+ */
351
+ static fromSecretValue(secretValue, options = {}) {
352
+ const source = {
353
+ secretKeyRef: {
354
+ name: secretValue.secret.name,
355
+ key: secretValue.key,
356
+ optional: options.optional,
357
+ },
358
+ };
359
+ return new EnvValue(undefined, source);
360
+ }
361
+ /**
362
+ * Create a value from the given argument.
363
+ *
364
+ * @param value - The value.
365
+ */
366
+ static fromValue(value) {
367
+ return new EnvValue(value);
368
+ }
369
+ /**
370
+ *
371
+ * Create a value from a field reference.
372
+ *
373
+ * @param fieldPath: The field reference.
374
+ * @param options: Additional options.
375
+ */
376
+ static fromFieldRef(fieldPath, options = {}) {
377
+ let needsKey = false;
378
+ if (fieldPath === EnvFieldPaths.POD_LABEL || fieldPath === EnvFieldPaths.POD_ANNOTATION) {
379
+ needsKey = true;
380
+ }
381
+ if (needsKey && options.key === undefined) {
382
+ throw new Error(`${fieldPath} requires a key`);
383
+ }
384
+ const source = {
385
+ fieldRef: {
386
+ fieldPath: (`${fieldPath}` + (needsKey ? `['${options.key}']` : '')),
387
+ ...(options.apiVersion ? { apiVersion: options.apiVersion } : {}),
388
+ },
389
+ };
390
+ return new EnvValue(undefined, source);
391
+ }
392
+ /**
393
+ * Create a value from a resource.
394
+ *
395
+ * @param resource: Resource to select the value from.
396
+ * @param options: Additional options.
397
+ */
398
+ static fromResource(resource, options = {}) {
399
+ const source = {
400
+ resourceFieldRef: {
401
+ resource: `${resource}`,
402
+ ...(options.divisor ? { divisor: k8s.IntOrString.fromString(options.divisor) } : {}),
403
+ ...(options.container ? { containerName: options.container.name } : {}),
404
+ },
405
+ };
406
+ return new EnvValue(undefined, source);
407
+ }
408
+ /**
409
+ * Create a value from a key in the current process environment.
410
+ *
411
+ * @param key - The key to read.
412
+ * @param options - Additional options.
413
+ */
414
+ static fromProcess(key, options = {}) {
415
+ const value = process.env[key];
416
+ if (options.required && !value) {
417
+ throw new Error(`Missing ${key} env variable`);
418
+ }
419
+ return EnvValue.fromValue(value);
420
+ }
421
+ constructor(value, valueFrom) {
422
+ this.value = value;
423
+ this.valueFrom = valueFrom;
424
+ }
425
+ }
426
+ exports.EnvValue = EnvValue;
427
+ _b = JSII_RTTI_SYMBOL_1;
428
+ EnvValue[_b] = { fqn: "cdk8s-plus-34.EnvValue", version: "2.0.0" };
429
+ var ImagePullPolicy;
430
+ (function (ImagePullPolicy) {
431
+ /**
432
+ * Every time the kubelet launches a container, the kubelet queries the container image registry
433
+ * to resolve the name to an image digest. If the kubelet has a container image with that exact
434
+ * digest cached locally, the kubelet uses its cached image; otherwise, the kubelet downloads
435
+ * (pulls) the image with the resolved digest, and uses that image to launch the container.
436
+ *
437
+ * Default is Always if ImagePullPolicy is omitted and either the image tag is :latest or
438
+ * the image tag is omitted.
439
+ */
440
+ ImagePullPolicy["ALWAYS"] = "Always";
441
+ /**
442
+ * The image is pulled only if it is not already present locally.
443
+ *
444
+ * Default is IfNotPresent if ImagePullPolicy is omitted and the image tag is present but
445
+ * not :latest
446
+ */
447
+ ImagePullPolicy["IF_NOT_PRESENT"] = "IfNotPresent";
448
+ /**
449
+ * The image is assumed to exist locally. No attempt is made to pull the image.
450
+ */
451
+ ImagePullPolicy["NEVER"] = "Never";
452
+ })(ImagePullPolicy || (exports.ImagePullPolicy = ImagePullPolicy = {}));
453
+ /**
454
+ * RestartPolicy defines the restart behavior of individual containers in a pod.
455
+ * This field may only be set for init containers, and the only allowed value is "Always".
456
+ * For non-init containers or when this field is not specified,
457
+ * the restart behavior is defined by the Pod's restart policy and the container type.
458
+ * Setting the RestartPolicy as "Always" for the init container will have the following effect:
459
+ * this init container will be continually restarted on exit until all regular containers have terminated.
460
+ * Once all regular containers have completed, all init containers with restartPolicy "Always" will be shut down.
461
+ * This lifecycle differs from normal init containers and is often referred to as a "sidecar" container.
462
+ *
463
+ * @see https://kubernetes.io/docs/concepts/workloads/pods/sidecar-containers/
464
+ */
465
+ var ContainerRestartPolicy;
466
+ (function (ContainerRestartPolicy) {
467
+ /**
468
+ * If an init container is created with its restartPolicy set to Always,
469
+ * it will start and remain running during the entire life of the Pod.
470
+ * For regular containers, this is ignored by Kubernetes.
471
+ */
472
+ ContainerRestartPolicy["ALWAYS"] = "Always";
473
+ })(ContainerRestartPolicy || (exports.ContainerRestartPolicy = ContainerRestartPolicy = {}));
474
+ /**
475
+ * A single application container that you want to run within a pod.
476
+ */
477
+ class Container {
478
+ constructor(props) {
479
+ this._ports = [];
480
+ if (props instanceof Container) {
481
+ throw new Error('Attempted to construct a container from a Container object.');
482
+ }
483
+ const defaultResourceSpec = {
484
+ cpu: {
485
+ request: Cpu.millis(1000),
486
+ limit: Cpu.millis(1500),
487
+ },
488
+ memory: {
489
+ request: cdk8s_1.Size.mebibytes(512),
490
+ limit: cdk8s_1.Size.mebibytes(2048),
491
+ },
492
+ };
493
+ if (props.port && props.portNumber) {
494
+ throw new Error('Either \'port\' or \'portNumber\' is allowed. Use \'portNumber\' since \'port\' is deprecated');
495
+ }
496
+ const portNumber = props.portNumber ?? props.port;
497
+ const defaultProbeConfiguration = probe.Probe.fromTcpSocket({ port: portNumber });
498
+ this.name = props.name ?? 'main';
499
+ this.image = props.image;
500
+ this.portNumber = portNumber;
501
+ this._command = props.command;
502
+ this._args = props.args;
503
+ this._readiness = props.readiness;
504
+ this._liveness = props.liveness;
505
+ this._startup = props.startup ?? (this.portNumber ? defaultProbeConfiguration : undefined);
506
+ this._lifecycle = props.lifecycle;
507
+ this.resources = props.resources ?? defaultResourceSpec;
508
+ this.workingDir = props.workingDir;
509
+ this.mounts = props.volumeMounts ?? [];
510
+ this.imagePullPolicy = props.imagePullPolicy ?? ImagePullPolicy.ALWAYS;
511
+ this.securityContext = new ContainerSecurityContext(props.securityContext);
512
+ this.env = new Env(props.envFrom ?? [], props.envVariables ?? {});
513
+ this.restartPolicy = props.restartPolicy;
514
+ if (this.portNumber) {
515
+ this.addPort({
516
+ number: this.portNumber,
517
+ });
518
+ }
519
+ for (const port of props.ports ?? []) {
520
+ this.addPort(port);
521
+ }
522
+ }
523
+ /**
524
+ * @deprecated - use `portNumber`.
525
+ */
526
+ get port() {
527
+ return this.portNumber;
528
+ }
529
+ /**
530
+ * Ports exposed by this containers.
531
+ * Returns a copy, use `addPort` to modify.
532
+ */
533
+ get ports() {
534
+ return [...this._ports];
535
+ }
536
+ /**
537
+ * Entrypoint array (the command to execute when the container starts).
538
+ * @returns a copy of the entrypoint array, cannot be modified
539
+ */
540
+ get command() {
541
+ return this._command ? [...this._command] : undefined;
542
+ }
543
+ /**
544
+ * Arguments to the entrypoint.
545
+ *
546
+ * @returns a copy of the arguments array, cannot be modified.
547
+ */
548
+ get args() {
549
+ return this._args ? [...this._args] : undefined;
550
+ }
551
+ /**
552
+ * Mount a volume to a specific path so that it is accessible by the container.
553
+ * Every pod that is configured to use this container will autmoatically have access to the volume.
554
+ *
555
+ * @param path - The desired path in the container.
556
+ * @param storage - The storage to mount.
557
+ */
558
+ mount(path, storage, options = {}) {
559
+ this.mounts.push({ path, volume: storage.asVolume(), ...options });
560
+ }
561
+ /**
562
+ * Add a port to expose from this container.
563
+ */
564
+ addPort(port) {
565
+ const names = this._ports.map(p => p.name).filter(x => x);
566
+ const numberProtocols = this._ports.map(p => `${p.number}/${p.protocol || Protocol.TCP}`);
567
+ if (port.name && names.includes(port.name)) {
568
+ throw new Error(`Port with name ${port.name} already exists`);
569
+ }
570
+ const protocol = `${port.number}/${port.protocol || Protocol.TCP}`;
571
+ if (numberProtocols.includes(protocol)) {
572
+ throw new Error(`Port with number ${port.number} and protocol ${port.protocol || Protocol.TCP} already exists`);
573
+ }
574
+ this._ports.push(port);
575
+ }
576
+ /**
577
+ * @internal
578
+ */
579
+ _toKube() {
580
+ const volumeMounts = [];
581
+ for (const mount of this.mounts) {
582
+ volumeMounts.push({
583
+ name: mount.volume.name,
584
+ mountPath: mount.path,
585
+ readOnly: mount.readOnly,
586
+ mountPropagation: mount.propagation,
587
+ subPath: mount.subPath,
588
+ subPathExpr: mount.subPathExpr,
589
+ });
590
+ }
591
+ const ports = new Array();
592
+ for (const port of this.ports) {
593
+ ports.push({
594
+ containerPort: port.number,
595
+ protocol: port.protocol?.toString(),
596
+ name: port.name,
597
+ hostPort: port.hostPort,
598
+ hostIp: port.hostIp,
599
+ });
600
+ }
601
+ // Resource requests and limits
602
+ const cpuLimit = this.resources?.cpu?.limit?.amount;
603
+ const cpuRequest = this.resources?.cpu?.request?.amount;
604
+ const memoryLimit = this.resources?.memory?.limit;
605
+ const memoryRequest = this.resources?.memory?.request;
606
+ const ephemeralStorageLimit = this.resources?.ephemeralStorage?.limit;
607
+ const ephemeralStorageRequest = this.resources?.ephemeralStorage?.request;
608
+ const limits = {};
609
+ const requests = {};
610
+ if (cpuLimit) {
611
+ limits.cpu = k8s.Quantity.fromString(cpuLimit);
612
+ }
613
+ if (memoryLimit) {
614
+ limits.memory = k8s.Quantity.fromString(memoryLimit.toMebibytes().toString() + 'Mi');
615
+ }
616
+ if (ephemeralStorageLimit) {
617
+ limits['ephemeral-storage'] = k8s.Quantity.fromString(ephemeralStorageLimit.toGibibytes().toString() + 'Gi');
618
+ }
619
+ if (cpuRequest) {
620
+ requests.cpu = k8s.Quantity.fromString(cpuRequest);
621
+ }
622
+ if (memoryRequest) {
623
+ requests.memory = k8s.Quantity.fromString(memoryRequest.toMebibytes().toString() + 'Mi');
624
+ }
625
+ if (ephemeralStorageRequest) {
626
+ requests['ephemeral-storage'] = k8s.Quantity.fromString(ephemeralStorageRequest.toGibibytes().toString() + 'Gi');
627
+ }
628
+ let resourceRequirements = undefined;
629
+ if (Object.keys(limits).length > 0 || Object.keys(requests).length > 0) {
630
+ resourceRequirements = {
631
+ limits: (0, utils_1.undefinedIfEmpty)(limits),
632
+ requests: (0, utils_1.undefinedIfEmpty)(requests),
633
+ };
634
+ }
635
+ const env = this.env._toKube();
636
+ return {
637
+ name: this.name,
638
+ image: this.image,
639
+ imagePullPolicy: this.imagePullPolicy,
640
+ ports: (0, utils_1.undefinedIfEmpty)(ports),
641
+ volumeMounts: (0, utils_1.undefinedIfEmpty)(volumeMounts),
642
+ command: this.command,
643
+ args: this.args,
644
+ workingDir: this.workingDir,
645
+ env: env.variables,
646
+ envFrom: env.from,
647
+ readinessProbe: this._readiness?._toKube(this),
648
+ livenessProbe: this._liveness?._toKube(this),
649
+ startupProbe: this._startup?._toKube(this),
650
+ lifecycle: this._lifecycle ? {
651
+ postStart: this._lifecycle.postStart?._toKube(this),
652
+ preStop: this._lifecycle.preStop?._toKube(this),
653
+ } : undefined,
654
+ resources: resourceRequirements,
655
+ restartPolicy: this.restartPolicy,
656
+ securityContext: this.securityContext._toKube(),
657
+ };
658
+ }
659
+ }
660
+ exports.Container = Container;
661
+ _c = JSII_RTTI_SYMBOL_1;
662
+ Container[_c] = { fqn: "cdk8s-plus-34.Container", version: "2.0.0" };
663
+ var MountPropagation;
664
+ (function (MountPropagation) {
665
+ /**
666
+ * This volume mount will not receive any subsequent mounts that are mounted
667
+ * to this volume or any of its subdirectories by the host. In similar
668
+ * fashion, no mounts created by the Container will be visible on the host.
669
+ *
670
+ * This is the default mode.
671
+ *
672
+ * This mode is equal to `private` mount propagation as described in the Linux
673
+ * kernel documentation
674
+ */
675
+ MountPropagation["NONE"] = "None";
676
+ /**
677
+ * This volume mount will receive all subsequent mounts that are mounted to
678
+ * this volume or any of its subdirectories.
679
+ *
680
+ * In other words, if the host mounts anything inside the volume mount, the
681
+ * Container will see it mounted there.
682
+ *
683
+ * Similarly, if any Pod with Bidirectional mount propagation to the same
684
+ * volume mounts anything there, the Container with HostToContainer mount
685
+ * propagation will see it.
686
+ *
687
+ * This mode is equal to `rslave` mount propagation as described in the Linux
688
+ * kernel documentation
689
+ */
690
+ MountPropagation["HOST_TO_CONTAINER"] = "HostToContainer";
691
+ /**
692
+ * This volume mount behaves the same the HostToContainer mount. In addition,
693
+ * all volume mounts created by the Container will be propagated back to the
694
+ * host and to all Containers of all Pods that use the same volume
695
+ *
696
+ * A typical use case for this mode is a Pod with a FlexVolume or CSI driver
697
+ * or a Pod that needs to mount something on the host using a hostPath volume.
698
+ *
699
+ * This mode is equal to `rshared` mount propagation as described in the Linux
700
+ * kernel documentation
701
+ *
702
+ * Caution: Bidirectional mount propagation can be dangerous. It can damage
703
+ * the host operating system and therefore it is allowed only in privileged
704
+ * Containers. Familiarity with Linux kernel behavior is strongly recommended.
705
+ * In addition, any volume mounts created by Containers in Pods must be
706
+ * destroyed (unmounted) by the Containers on termination.
707
+ *
708
+ */
709
+ MountPropagation["BIDIRECTIONAL"] = "Bidirectional";
710
+ })(MountPropagation || (exports.MountPropagation = MountPropagation = {}));
711
+ /**
712
+ * Represents the amount of CPU.
713
+ * The amount can be passed as millis or units.
714
+ */
715
+ class Cpu {
716
+ static millis(amount) {
717
+ return new Cpu(amount + 'm');
718
+ }
719
+ static units(amount) {
720
+ return new Cpu(amount.toString());
721
+ }
722
+ constructor(amount) {
723
+ this.amount = amount;
724
+ }
725
+ }
726
+ exports.Cpu = Cpu;
727
+ _d = JSII_RTTI_SYMBOL_1;
728
+ Cpu[_d] = { fqn: "cdk8s-plus-34.Cpu", version: "2.0.0" };
729
+ /**
730
+ * A collection of env variables defined in other resources.
731
+ */
732
+ class EnvFrom {
733
+ constructor(configMap, prefix, sec) {
734
+ this.configMap = configMap;
735
+ this.prefix = prefix;
736
+ this.sec = sec;
737
+ }
738
+ ;
739
+ /**
740
+ * @internal
741
+ */
742
+ _toKube() {
743
+ return {
744
+ configMapRef: this.configMap ? {
745
+ name: this.configMap.name,
746
+ } : undefined,
747
+ secretRef: this.sec ? {
748
+ name: this.sec.name,
749
+ } : undefined,
750
+ prefix: this.prefix,
751
+ };
752
+ }
753
+ }
754
+ exports.EnvFrom = EnvFrom;
755
+ _e = JSII_RTTI_SYMBOL_1;
756
+ EnvFrom[_e] = { fqn: "cdk8s-plus-34.EnvFrom", version: "2.0.0" };
757
+ function extractContainerPorts(selector) {
758
+ if (!selector) {
759
+ return [];
760
+ }
761
+ // we don't use instanceof intentionally since it can create
762
+ // cyclic import problems.
763
+ const containers = selector.containers ?? [];
764
+ return containers.flatMap(c => c.ports);
765
+ }
766
+ /**
767
+ * Container environment variables.
768
+ */
769
+ class Env {
770
+ /**
771
+ * Selects a ConfigMap to populate the environment variables with.
772
+ * The contents of the target ConfigMap's Data field will represent
773
+ * the key-value pairs as environment variables.
774
+ */
775
+ static fromConfigMap(configMap, prefix) {
776
+ return new EnvFrom(configMap, prefix, undefined);
777
+ }
778
+ /**
779
+ * Selects a Secret to populate the environment variables with.
780
+ * The contents of the target Secret's Data field will represent
781
+ * the key-value pairs as environment variables.
782
+ */
783
+ static fromSecret(secr) {
784
+ return new EnvFrom(undefined, undefined, secr);
785
+ }
786
+ constructor(sources, variables) {
787
+ this._sources = sources;
788
+ this._variables = variables;
789
+ }
790
+ /**
791
+ * Add a single variable by name and value.
792
+ * The variable value can come from various dynamic sources such a secrets of config maps.
793
+ * Use `EnvValue.fromXXX` to select sources.
794
+ */
795
+ addVariable(name, value) {
796
+ this._variables[name] = value;
797
+ }
798
+ /**
799
+ * The environment variables for this container.
800
+ * Returns a copy. To add environment variables use `container.env.addVariable()`.
801
+ */
802
+ get variables() {
803
+ return { ...this._variables };
804
+ }
805
+ /**
806
+ * Add a collection of variables by copying from another source.
807
+ * Use `Env.fromXXX` functions to select sources.
808
+ */
809
+ copyFrom(from) {
810
+ this._sources.push(from);
811
+ }
812
+ /**
813
+ * The list of sources used to populate the container environment,
814
+ * in addition to the `variables`.
815
+ *
816
+ * Returns a copy. To add a source use `container.env.copyFrom()`.
817
+ */
818
+ get sources() {
819
+ return [...this._sources];
820
+ }
821
+ renderEnv(env) {
822
+ const result = new Array();
823
+ for (const [name, v] of Object.entries(env)) {
824
+ result.push({
825
+ name,
826
+ value: v.value,
827
+ valueFrom: v.valueFrom,
828
+ });
829
+ }
830
+ return result;
831
+ }
832
+ /**
833
+ * @internal
834
+ */
835
+ _toKube() {
836
+ return {
837
+ from: (0, utils_1.undefinedIfEmpty)(this._sources.map(s => s._toKube())),
838
+ variables: (0, utils_1.undefinedIfEmpty)(this.renderEnv(this._variables)),
839
+ };
840
+ }
841
+ }
842
+ exports.Env = Env;
843
+ _f = JSII_RTTI_SYMBOL_1;
844
+ Env[_f] = { fqn: "cdk8s-plus-34.Env", version: "2.0.0" };
845
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBZzNDQSxzREFTQzs7QUF6M0NELGlDQUE2QjtBQUc3QixxQ0FBcUM7QUFDckMsaUNBQWlDO0FBRWpDLG1DQUEyQztBQUczQzs7R0FFRztBQUNILElBQVksVUF5S1g7QUF6S0QsV0FBWSxVQUFVO0lBQ3BCOztPQUVHO0lBQ0gseUJBQVcsQ0FBQTtJQUNYOztPQUVHO0lBQ0gsNkNBQStCLENBQUE7SUFDL0I7O09BRUc7SUFDSCx1Q0FBeUIsQ0FBQTtJQUN6Qjs7T0FFRztJQUNILHlDQUEyQixDQUFBO0lBQzNCOztPQUVHO0lBQ0gsNkNBQStCLENBQUE7SUFDL0I7O09BRUc7SUFDSCx5QkFBVyxDQUFBO0lBQ1g7O09BRUc7SUFDSCx1REFBeUMsQ0FBQTtJQUN6Qzs7T0FFRztJQUNILDZCQUFlLENBQUE7SUFDZjs7T0FFRztJQUNILDJDQUE2QixDQUFBO0lBQzdCOztPQUVHO0lBQ0gsaURBQW1DLENBQUE7SUFDbkM7O09BRUc7SUFDSCwrQkFBaUIsQ0FBQTtJQUNqQjs7T0FFRztJQUNILCtCQUFpQixDQUFBO0lBQ2pCOztPQUVHO0lBQ0gsbUNBQXFCLENBQUE7SUFDckI7O09BRUc7SUFDSCxxQ0FBdUIsQ0FBQTtJQUN2Qjs7T0FFRztJQUNILDJCQUFhLENBQUE7SUFDYjs7T0FFRztJQUNILDZCQUFlLENBQUE7SUFDZjs7T0FFRztJQUNILGlEQUFtQyxDQUFBO0lBQ25DOztPQUVHO0lBQ0gscUNBQXVCLENBQUE7SUFDdkI7O09BRUc7SUFDSCwyQ0FBNkIsQ0FBQTtJQUM3Qjs7T0FFRztJQUNILDZCQUFlLENBQUE7SUFDZjs7T0FFRztJQUNILHFDQUF1QixDQUFBO0lBQ3ZCOztPQUVHO0lBQ0gsbURBQXFDLENBQUE7SUFDckM7O09BRUc7SUFDSCw2Q0FBK0IsQ0FBQTtJQUMvQjs7T0FFRztJQUNILGlDQUFt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QUFDO1lBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ1YsSUFBSTtnQkFDSixLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7Z0JBQ2QsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO2FBQ3ZCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPO1FBQ1osT0FBTztZQUNMLElBQUksRUFBRSxJQUFBLHdCQUFnQixFQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDM0QsU0FBUyxFQUFFLElBQUEsd0JBQWdCLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDN0QsQ0FBQztJQUNKLENBQUM7O0FBbkZILGtCQW9GQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNpemUgfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgKiBhcyBjb25maWdtYXAgZnJvbSAnLi9jb25maWctbWFwJztcbmltcG9ydCAqIGFzIGhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyJztcbmltcG9ydCAqIGFzIGs4cyBmcm9tICcuL2ltcG9ydHMvazhzJztcbmltcG9ydCAqIGFzIHByb2JlIGZyb20gJy4vcHJvYmUnO1xuaW1wb3J0ICogYXMgc2VjcmV0IGZyb20gJy4vc2VjcmV0JztcbmltcG9ydCB7IHVuZGVmaW5lZElmRW1wdHkgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCAqIGFzIHZvbHVtZSBmcm9tICcuL3ZvbHVtZSc7XG5cbi8qKlxuICogQ2FwYWJpbGl0eSAtIGNvbXBsZXRlIGxpc3Qgb2YgUE9TSVggY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBlbnVtIENhcGFiaWxpdHkge1xuICAvKipcbiAgICogQUxMXG4gICAqL1xuICBBTEwgPSAnQUxMJyxcbiAgLyoqXG4gICAqIENBUF9BVURJVF9DT05UUk9MXG4gICAqL1xuICBBVURJVF9DT05UUk9MID0gJ0FVRElUX0NPTlRST0wnLFxuICAvKipcbiAgICogQ0FQX0FVRElUX1JFQURcbiAgICovXG4gIEFVRElUX1JFQUQgPSAnQVVESVRfUkVBRCcsXG4gIC8qKlxuICAgKiBDQVBfQVVESVRfV1JJVEVcbiAgICovXG4gIEFVRElUX1dSSVRFID0gJ0FVRElUX1dSSVRFJyxcbiAgLyoqXG4gICAqIENBUF9CTE9DS19TVVNQRU5EXG4gICAqL1xuICBCTE9DS19TVVNQRU5EID0gJ0JMT0NLX1NVU1BFTkQnLFxuICAvKipcbiAgICogQ0FQX0JQRlxuICAgKi9cbiAgQlBGID0gJ0JQRicsXG4gIC8qKlxuICAgKiBDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFXG4gICAqL1xuICBDSEVDS1BPSU5UX1JFU1RPUkUgPSAnQ0hFQ0tQT0lOVF9SRVNUT1JFJyxcbiAgLyoqXG4gICAqIENBUF9DSE9XTlxuICAgKi9cbiAgQ0hPV04gPSAnQ0hPV04nLFxuICAvKipcbiAgICogQ0FQX0RBQ19PVkVSUklERVxuICAgKi9cbiAgREFDX09WRVJSSURFID0gJ0RBQ19PVkVSUklERScsXG4gIC8qKlxuICAgKiBDQVBfREFDX1JFQURfU0VBUkNIXG4gICAqL1xuICBEQUNfUkVBRF9TRUFSQ0ggPSAnREFDX1JFQURfU0VBUkNIJyxcbiAgLyoqXG4gICAqIENBUF9GT1dORVJcbiAgICovXG4gIEZPV05FUiA9ICdGT1dORVInLFxuICAvKipcbiAgICogQ0FQX0ZTRVRJRFxuICAgKi9cbiAgRlNFVElEID0gJ0ZTRVRJRCcsXG4gIC8qKlxuICAgKiBDQVBfSVBDX0xPQ0tcbiAgICovXG4gIElQQ19MT0NLID0gJ0lQQ19MT0NLJyxcbiAgLyoqXG4gICAqIENBUF9JUENfT1dORVJcbiAgICovXG4gIElQQ19PV05FUiA9ICdJUENfT1dORVInLFxuICAvKipcbiAgICogQ0FQX0tJTExcbiAgICovXG4gIEtJTEwgPSAnS0lMTCcsXG4gIC8qKlxuICAgKiBDQVBfTEVBU0VcbiAgICovXG4gIExFQVNFID0gJ0xFQVNFJyxcbiAgLyoqXG4gICAqIENBUF9MSU5VWF9JTU1VVEFCTEVcbiAgICovXG4gIExJTlVYX0lNTVVUQUJMRSA9ICdMSU5VWF9JTU1VVEFCTEUnLFxuICAvKipcbiAgICogQ0FQX01BQ19BRE1JTlxuICAgKi9cbiAgTUFDX0FETUlOID0gJ01BQ19BRE1JTicsXG4gIC8qKlxuICAgKiBDQVBfTUFDX09WRVJSSURFXG4gICAqL1xuICBNQUNfT1ZFUlJJREUgPSAnTUFDX09WRVJSSURFJyxcbiAgLyoqXG4gICAqIENBUF9NS05PRFxuICAgKi9cbiAgTUtOT0QgPSAnTUtOT0QnLFxuICAvKipcbiAgICogQ0FQX05FVF9BRE1JTlxuICAgKi9cbiAgTkVUX0FETUlOID0gJ05FVF9BRE1JTicsXG4gIC8qKlxuICAgKiBDQVBfTkVUX0JJTkRfU0VSVklDRVxuICAgKi9cbiAgTkVUX0JJTkRfU0VSVklDRSA9ICdORVRfQklORF9TRVJWSUNFJyxcbiAgLyoqXG4gICAqIENBUF9ORVRfQlJPQURDQVNUXG4gICAqL1xuICBORVRfQlJPQURDQVNUID0gJ05FVF9CUk9BRENBU1QnLFxuICAvKipcbiAgICogQ0FQX05FVF9SQVdcbiAgICovXG4gIE5FVF9SQVcgPSAnTkVUX1JBVycsXG4gIC8qKlxuICAgKiBDQVBfUEVSRk1PTlxuICAgKi9cbiAgUEVSRk1PTiA9ICdQRVJGTU9OJyxcbiAgLyoqXG4gICAqIENBUF9TRVRHSURcbiAgICovXG4gIFNFVEdJRCA9ICdTRVRHSUQnLFxuICAvKipcbiAgICogQ0FQX1NFVEZDQVBcbiAgICovXG4gIFNFVEZDQVAgPSAnU0VURkNBUCcsXG4gIC8qKlxuICAgKiBDQVBfU0VUUENBUFxuICAgKi9cbiAgU0VUUENBUCA9ICdTRVRQQ0FQJyxcbiAgLyoqXG4gICAqIENBUF9TRVRVSURcbiAgICovXG4gIFNFVFVJRCA9ICdTRVRVSUQnLFxuICAvKipcbiAgICogQ0FQX1NZU19BRE1JTlxuICAgKi9cbiAgU1lTX0FETUlOID0gJ1NZU19BRE1JTicsXG4gIC8qKlxuICAgKiBDQVBfU1lTX0JPT1RcbiAgICovXG4gIFNZU19CT09UID0gJ1NZU19CT09UJyxcbiAgLyoqXG4gICAqIENBUF9TWVNfQ0hST09UXG4gICAqL1xuICBTWVNfQ0hST09UID0gJ1NZU19DSFJPT1QnLFxuICAvKipcbiAgICogQ0FQX1NZU19NT0RVTEVcbiAgICovXG4gIFNZU19NT0RVTEUgPSAnU1lTX01PRFVMRScsXG4gIC8qKlxuICAgKiBDQVBfU1lTX05JQ0VcbiAgICovXG4gIFNZU19OSUNFID0gJ1NZU19OSUNFJyxcbiAgLyoqXG4gICAqIENBUF9TWVNfUEFDQ1RcbiAgICovXG4gIFNZU19QQUNDVCA9ICdTWVNfUEFDQ1QnLFxuICAvKipcbiAgICogQ0FQX1NZU19QVFJBQ0VcbiAgICovXG4gIFNZU19QVFJBQ0UgPSAnU1lTX1BUUkFDRScsXG4gIC8qKlxuICAgKiBDQVBfU1lTX1JBV0lPXG4gICAqL1xuICBTWVNfUkFXSU8gPSAnU1lTX1JBV0lPJyxcbiAgLyoqXG4gICAqIENBUF9TWVNfUkVTT1VSQ0VcbiAgICovXG4gIFNZU19SRVNPVVJDRSA9ICdTWVNfUkVTT1VSQ0UnLFxuICAvKipcbiAgICogQ0FQX1NZU19USU1FXG4gICAqL1xuICBTWVNfVElNRSA9ICdTWVNfVElNRScsXG4gIC8qKlxuICAgKiBDQVBfU1lTX1RUWV9DT05GSUdcbiAgICovXG4gIFNZU19UVFlfQ09ORklHID0gJ1NZU19UVFlfQ09ORklHJyxcbiAgLyoqXG4gICAqIENBUF9TWVNMT0dcbiAgICovXG4gIFNZU0xPRyA9ICdTWVNMT0cnLFxuICAvKipcbiAgICogQ0FQX1dBS0VfQUxBUk1cbiAgICovXG4gIFdBS0VfQUxBUk0gPSAnV0FLRV9BTEFSTScsXG59XG5cbmV4cG9ydCBlbnVtIFNlY2NvbXBQcm9maWxlVHlwZSB7XG4gIC8qKlxuICAqIEEgcHJvZmlsZSBkZWZpbmVkIGluIGEgZmlsZSBvbiB0aGUgbm9kZSBzaG91bGQgYmUgdXNlZFxuICAqL1xuICBMT0NBTEhPU1QgPSAnTG9jYWxob3N0JyxcbiAgLyoqXG4gICogVGhlIGNvbnRhaW5lciBydW50aW1lIGRlZmF1bHQgcHJvZmlsZSBzaG91bGQgYmUgdXNlZFxuICAqL1xuICBSVU5USU1FX0RFRkFVTFQgPSAnUnVudGltZURlZmF1bHQnLFxuICAvKipcbiAgKiBObyBwcm9maWxlIHNob3VsZCBiZSBhcHBsaWVkXG4gICovXG4gIFVOQ09ORklORUQgPSAnVW5jb25maW5lZCcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VjY29tcFByb2ZpbGUge1xuICAvKipcbiAgICogbG9jYWxob3N0UHJvZmlsZSBpbmRpY2F0ZXMgYSBwcm9maWxlIGRlZmluZWQgaW4gYSBmaWxlIG9uIHRoZSBub2RlIHNob3VsZCBiZSB1c2VkLlxuICAgKiBUaGUgcHJvZmlsZSBtdXN0IGJlIHByZWNvbmZpZ3VyZWQgb24gdGhlIG5vZGUgdG8gd29yay4gTXVzdCBiZSBhIGRlc2NlbmRpbmcgcGF0aCxcbiAgICogcmVsYXRpdmUgdG8gdGhlIGt1YmVsZXQncyBjb25maWd1cmVkIHNlY2NvbXAgcHJvZmlsZSBsb2NhdGlvbi5cbiAgICogTXVzdCBvbmx5IGJlIHNldCBpZiB0eXBlIGlzIFwiTG9jYWxob3N0XCIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZW1wdHkgc3RyaW5nXG4gICAqL1xuICByZWFkb25seSBsb2NhbGhvc3RQcm9maWxlPzogc3RyaW5nO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoaWNoIGtpbmQgb2Ygc2VjY29tcCBwcm9maWxlIHdpbGwgYmUgYXBwbGllZFxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogU2VjY29tcFByb2ZpbGVUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lclNlY3V0aXJ5Q29udGV4dENhcGFiaWxpdGllcyB7XG4gIC8qKlxuICAgKiBBZGRlZCBjYXBhYmlsaXRpZXNcbiAgICovXG4gIHJlYWRvbmx5IGFkZD86IENhcGFiaWxpdHlbXTtcblxuICAvKipcbiAgICogUmVtb3ZlZCBjYXBhYmlsaXRpZXNcbiAgICovXG4gIHJlYWRvbmx5IGRyb3A/OiBDYXBhYmlsaXR5W107XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYENvbnRhaW5lclNlY3VyaXR5Q29udGV4dGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250YWluZXJTZWN1cml0eUNvbnRleHRQcm9wcyB7XG5cbiAgLyoqXG4gICAgKiBUaGUgVUlEIHRvIHJ1biB0aGUgZW50cnlwb2ludCBvZiB0aGUgY29udGFpbmVyIHByb2Nlc3MuXG4gICAgKlxuICAgICogQGRlZmF1bHQgLSAyNTAwMC4gQW4gYXJiaXRyYXJ5IG51bWJlciBiaWdnZXIgdGhhbiA5OTk5IGlzIHNlbGVjdGVkIGhlcmUuXG4gICAgKiBUaGlzIGlzIHNvIHRoYXQgdGhlIGNvbnRhaW5lciBpcyBibG9ja2VkIHRvIGFjY2VzcyBob3N0IGZpbGVzIGV2ZW4gaWZcbiAgICAqIHNvbWVob3cgaXQgbWFuYWdlcyB0byBnZXQgYWNjZXNzIHRvIGhvc3QgZmlsZSBzeXN0ZW0uXG4gICAgKi9cbiAgcmVhZG9ubHkgdXNlcj86IG51bWJlcjtcblxuICAvKipcbiAgICAqIFRoZSBHSUQgdG8gcnVuIHRoZSBlbnRyeXBvaW50IG9mIHRoZSBjb250YWluZXIgcHJvY2Vzcy5cbiAgICAqXG4gICAgKiBAZGVmYXVsdCAtIDI2MDAwLiBBbiBhcmJpdHJhcnkgbnVtYmVyIGJpZ2dlciB0aGFuIDk5OTkgaXMgc2VsZWN0ZWQgaGVyZS5cbiAgICAqIFRoaXMgaXMgc28gdGhhdCB0aGUgY29udGFpbmVyIGlzIGJsb2NrZWQgdG8gYWNjZXNzIGhvc3QgZmlsZXMgZXZlbiBpZlxuICAgICogc29tZWhvdyBpdCBtYW5hZ2VzIHRvIGdldCBhY2Nlc3MgdG8gaG9zdCBmaWxlIHN5c3RlbS5cbiAgICAqL1xuICByZWFkb25seSBncm91cD86IG51bWJlcjtcblxuICAvKipcbiAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBjb250YWluZXIgbXVzdCBydW4gYXMgYSBub24tcm9vdCB1c2VyLlxuICAgICogSWYgdHJ1ZSwgdGhlIEt1YmVsZXQgd2lsbCB2YWxpZGF0ZSB0aGUgaW1hZ2UgYXQgcnVudGltZSB0byBlbnN1cmUgdGhhdCBpdCBkb2VzXG4gICAgKiBub3QgcnVuIGFzIFVJRCAwIChyb290KSBhbmQgZmFpbCB0byBzdGFydCB0aGUgY29udGFpbmVyIGlmIGl0IGRvZXMuXG4gICAgKlxuICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICovXG4gIHJlYWRvbmx5IGVuc3VyZU5vblJvb3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSdW4gY29udGFpbmVyIGluIHByaXZpbGVnZWQgbW9kZS4gUHJvY2Vzc2VzIGluIHByaXZpbGVnZWQgY29udGFpbmVycyBhcmUgZXNzZW50aWFsbHkgZXF1aXZhbGVudCB0byByb290IG9uIHRoZSBob3N0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJpdmlsZWdlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBjb250YWluZXIgaGFzIGEgcmVhZC1vbmx5IHJvb3QgZmlsZXN5c3RlbS5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVhZE9ubHlSb290RmlsZXN5c3RlbT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBwcm9jZXNzIGNhbiBnYWluIG1vcmUgcHJpdmlsZWdlcyB0aGFuIGl0cyBwYXJlbnQgcHJvY2Vzcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBPU0lYIGNhcGFiaWxpdGllcyBmb3IgcnVubmluZyBjb250YWluZXJzXG4gICAqXG4gICAqIEBkZWZhdWx0IG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllcz86IENvbnRhaW5lclNlY3V0aXJ5Q29udGV4dENhcGFiaWxpdGllcztcblxuICAvKipcbiAgKiBDb250YWluZXIncyBzZWNjb21wIHByb2ZpbGUgc2V0dGluZ3MuIE9ubHkgb25lIHByb2ZpbGUgc291cmNlIG1heSBiZSBzZXRcbiAgKlxuICAqIEBkZWZhdWx0IG5vbmVcbiAgKi9cbiAgcmVhZG9ubHkgc2VjY29tcFByb2ZpbGU/OiBTZWNjb21wUHJvZmlsZTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbmV0d29yayBwb3J0IGluIGEgc2luZ2xlIGNvbnRhaW5lci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250YWluZXJQb3J0IHtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIHBvcnQgdG8gZXhwb3NlIG9uIHRoZSBwb2QncyBJUCBhZGRyZXNzLiBUaGlzIG11c3QgYmUgYSB2YWxpZCBwb3J0IG51bWJlciwgMCA8IHggPCA2NTUzNi5cbiAgICovXG4gIHJlYWRvbmx5IG51bWJlcjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGF0IGhvc3QgSVAgdG8gYmluZCB0aGUgZXh0ZXJuYWwgcG9ydCB0by5cbiAgICpcbiAgICogQGRlZmF1bHQgLSAxMjcuMC4wLjEuXG4gICAqL1xuICByZWFkb25seSBob3N0SXA/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBwb3J0IHRvIGV4cG9zZSBvbiB0aGUgaG9zdC4gSWYgc3BlY2lmaWVkLCB0aGlzIG11c3QgYmUgYSB2YWxpZCBwb3J0IG51bWJlciwgMCA8IHggPCA2NTUzNi5cbiAgICogTW9zdCBjb250YWluZXJzIGRvIG5vdCBuZWVkIHRoaXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXV0byBnZW5lcmF0ZWQgYnkga3ViZXJuZXRlcyBhbmQgbWlnaHQgY2hhbmdlIG9uIHJlc3RhcnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdFBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIElmIHNwZWNpZmllZCwgdGhpcyBtdXN0IGJlIGFuIElBTkFfU1ZDX05BTUUgYW5kIHVuaXF1ZSB3aXRoaW4gdGhlIHBvZC5cbiAgICogRWFjaCBuYW1lZCBwb3J0IGluIGEgcG9kIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLlxuICAgKiBOYW1lIGZvciB0aGUgcG9ydCB0aGF0IGNhbiBiZSByZWZlcnJlZCB0byBieSBzZXJ2aWNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBwb3J0IGlzIG5vdCBuYW1lZC5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByb3RvY29sIGZvciBwb3J0LiBNdXN0IGJlIFVEUCwgVENQLCBvciBTQ1RQLiBEZWZhdWx0cyB0byBcIlRDUFwiLlxuICAgKlxuICAgKiBAZGVmYXVsdCBQcm90b2NvbC5UQ1BcbiAgICovXG4gIHJlYWRvbmx5IHByb3RvY29sPzogUHJvdG9jb2w7XG5cbn1cblxuLyoqXG4gKiBOZXR3b3JrIHByb3RvY29scy5cbiAqL1xuZXhwb3J0IGVudW0gUHJvdG9jb2wge1xuXG4gIC8qKlxuICAgKiBUQ1AuXG4gICAqL1xuICBUQ1AgPSAnVENQJyxcblxuICAvKipcbiAgICogVURQLlxuICAgKi9cbiAgVURQID0gJ1VEUCcsXG5cbiAgLyoqXG4gICAqIFNDVFAuXG4gICAqL1xuICBTQ1RQID0gJ1NDVFAnLFxufVxuXG5cbi8qKlxuICogQ29udGFpbmVyIHNlY3VyaXR5IGF0dHJpYnV0ZXMgYW5kIHNldHRpbmdzLlxuICovXG5leHBvcnQgY2xhc3MgQ29udGFpbmVyU2VjdXJpdHlDb250ZXh0IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgZW5zdXJlTm9uUm9vdDogYm9vbGVhbjtcbiAgcHVibGljIHJlYWRvbmx5IHByaXZpbGVnZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSByZWFkT25seVJvb3RGaWxlc3lzdGVtOiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlcj86IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IGdyb3VwPzogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uPzogYm9vbGVhbjtcbiAgcHVibGljIHJlYWRvbmx5IGNhcGFiaWxpdGllcz86IENvbnRhaW5lclNlY3V0aXJ5Q29udGV4dENhcGFiaWxpdGllcztcbiAgcHVibGljIHJlYWRvbmx5IHNlY2NvbXBQcm9maWxlPzogU2VjY29tcFByb2ZpbGU7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IENvbnRhaW5lclNlY3VyaXR5Q29udGV4dFByb3BzID0ge30pIHtcbiAgICBpZiAocHJvcHMuc2VjY29tcFByb2ZpbGU/LmxvY2FsaG9zdFByb2ZpbGUgJiYgcHJvcHMuc2VjY29tcFByb2ZpbGUudHlwZSAhPSBTZWNjb21wUHJvZmlsZVR5cGUuTE9DQUxIT1NUKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xvY2FsaG9zdFByb2ZpbGUgbXVzdCBvbmx5IGJlIHNldCBpZiB0eXBlIGlzIFwiTG9jYWxob3N0XCInKTtcbiAgICB9XG4gICAgdGhpcy5lbnN1cmVOb25Sb290ID0gcHJvcHMuZW5zdXJlTm9uUm9vdCA/PyB0cnVlO1xuICAgIHRoaXMucHJpdmlsZWdlZCA9IHByb3BzLnByaXZpbGVnZWQgPz8gZmFsc2U7XG4gICAgdGhpcy5yZWFkT25seVJvb3RGaWxlc3lzdGVtID0gcHJvcHMucmVhZE9ubHlSb290RmlsZXN5c3RlbSA/PyB0cnVlO1xuICAgIHRoaXMudXNlciA9IHByb3BzLnVzZXI7XG4gICAgdGhpcy5ncm91cCA9IHByb3BzLmdyb3VwO1xuICAgIHRoaXMuYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uID0gcHJvcHMuYWxsb3dQcml2aWxlZ2VFc2NhbGF0aW9uID8/IGZhbHNlO1xuICAgIHRoaXMuY2FwYWJpbGl0aWVzID0gcHJvcHMuY2FwYWJpbGl0aWVzO1xuICAgIHRoaXMuc2VjY29tcFByb2ZpbGUgPSBwcm9wcy5zZWNjb21wUHJvZmlsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfdG9LdWJlKCk6IGs4cy5TZWN1cml0eUNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBydW5Bc0dyb3VwOiB0aGlzLmdyb3VwLFxuICAgICAgcnVuQXNVc2VyOiB0aGlzLnVzZXIsXG4gICAgICBydW5Bc05vblJvb3Q6IHRoaXMuZW5zdXJlTm9uUm9vdCxcbiAgICAgIHByaXZpbGVnZWQ6IHRoaXMucHJpdmlsZWdlZCxcbiAgICAgIHJlYWRPbmx5Um9vdEZpbGVzeXN0ZW06IHRoaXMucmVhZE9ubHlSb290RmlsZXN5c3RlbSxcbiAgICAgIGFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbjogdGhpcy5hbGxvd1ByaXZpbGVnZUVzY2FsYXRpb24sXG4gICAgICBjYXBhYmlsaXRpZXM6IHRoaXMuY2FwYWJpbGl0aWVzLFxuICAgICAgc2VjY29tcFByb2ZpbGU6IHRoaXMuc2VjY29tcFByb2ZpbGUsXG4gICAgfTtcbiAgfVxuXG59XG5cbmV4cG9ydCBlbnVtIEVudkZpZWxkUGF0aHMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHBvZC5cbiAgICovXG4gIFBPRF9OQU1FID0gJ21ldGFkYXRhLm5hbWUnLFxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZXNwYWNlIG9mIHRoZSBwb2QuXG4gICAqL1xuICBQT0RfTkFNRVNQQUNFID0gJ21ldGFkYXRhLm5hbWVzcGFjZScsXG5cbiAgLyoqXG4gICAqIFRoZSB1aWQgb2YgdGhlIHBvZC5cbiAgICovXG4gIFBPRF9VSUQgPSAnbWV0YWRhdGEudWlkJyxcblxuICAvKipcbiAgICogVGhlIGxhYmVscyBvZiB0aGUgcG9kLlxuICAgKi9cbiAgUE9EX0xBQkVMID0gJ21ldGFkYXRhLmxhYmVscycsXG5cbiAgLyoqXG4gICAqIFRoZSBhbm5vdGF0aW9ucyBvZiB0aGUgcG9kLlxuICAgKi9cbiAgUE9EX0FOTk9UQVRJT04gPSAnbWV0YWRhdGEuYW5ub3RhdGlvbnMnLFxuXG4gIC8qKlxuICAgKiBUaGUgaXBBZGRyZXNzIG9mIHRoZSBwb2QuXG4gICAqL1xuICBQT0RfSVAgPSAnc3RhdHVzLnBvZElQJyxcblxuICAvKipcbiAgICogVGhlIHNlcnZpY2UgYWNjb3VudCBuYW1lIG9mIHRoZSBwb2QuXG4gICAqL1xuICBTRVJWSUNFX0FDQ09VTlRfTkFNRSA9ICdzcGVjLnNlcnZpY2VBY2NvdW50TmFtZScsXG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBub2RlLlxuICAgKi9cbiAgTk9ERV9OQU1FID0gJ3NwZWMubm9kZU5hbWUnLFxuXG4gIC8qKlxuICAgKiBUaGUgaXBBZGRyZXNzIG9mIHRoZSBub2RlLlxuICAgKi9cbiAgTk9ERV9JUCA9ICdzdGF0dXMuaG9zdElQJyxcblxuICAvKipcbiAgICogVGhlIGlwQWRkcmVzZXNzIG9mIHRoZSBwb2QuXG4gICAqL1xuICBQT0RfSVBTID0gJ3N0YXR1cy5wb2RJUHMnLFxufVxuXG5leHBvcnQgZW51bSBSZXNvdXJjZUZpZWxkUGF0aHMge1xuICAvKipcbiAgICogQ1BVIGxpbWl0IG9mIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBDUFVfTElNSVQgPSAnbGltaXRzLmNwdScsXG5cbiAgLyoqXG4gICAqIE1lbW9yeSBsaW1pdCBvZiB0aGUgY29udGFpbmVyLlxuICAgKi9cbiAgTUVNT1JZX0xJTUlUID0gJ2xpbWl0cy5tZW1vcnknLFxuXG4gIC8qKlxuICAgKiBDUFUgcmVxdWVzdCBvZiB0aGUgY29udGFpbmVyLlxuICAgKi9cbiAgQ1BVX1JFUVVFU1QgPSAncmVxdWVzdHMuY3B1JyxcblxuICAvKipcbiAgICogTWVtb3J5IHJlcXVlc3Qgb2YgdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIE1FTU9SWV9SRVFVRVNUID0gJ3JlcXVlc3RzLm1lbW9yeScsXG5cbiAgLyoqXG4gICAqIEVwaGVtZXJhbCBzdG9yYWdlIGxpbWl0IG9mIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBTVE9SQUdFX0xJTUlUID0gJ2xpbWl0cy5lcGhlbWVyYWwtc3RvcmFnZScsXG5cbiAgLyoqXG4gICAqIEVwaGVtZXJhbCBzdG9yYWdlIHJlcXVlc3Qgb2YgdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIFNUT1JBR0VfUkVRVUVTVCA9ICdyZXF1ZXN0cy5lcGhlbWVyYWwtc3RvcmFnZScsXG59XG5cbi8qKlxuICogT3B0aW9ucyB0byBzcGVjaWZ5IGFuIGVudmlvbm1lbnQgdmFyaWFibGUgdmFsdWUgZnJvbSBhIENvbmZpZ01hcCBrZXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW52VmFsdWVGcm9tQ29uZmlnTWFwT3B0aW9ucyB7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgQ29uZmlnTWFwIG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgdG8gc3BlY2lmeSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSBmcm9tIGEgU2VjcmV0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudlZhbHVlRnJvbVNlY3JldE9wdGlvbnMge1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcblxufVxuXG4vKipcbiAqIE9wdGlvbnMgdG8gc3BlY2lmeSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSBmcm9tIHRoZSBwcm9jZXNzIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudlZhbHVlRnJvbVByb2Nlc3NPcHRpb25zIHtcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBrZXkgbXVzdCBleGlzdCBpbiB0aGUgZW52aXJvbm1lbnQuXG4gICAqIElmIHRoaXMgaXMgc2V0IHRvIHRydWUsIGFuZCB0aGUga2V5IGRvZXMgbm90IGV4aXN0LCBhbiBlcnJvciB3aWxsIHRocm93bi5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRvIHNwZWNpZnkgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWUgZnJvbSBhIGZpZWxkIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnZWYWx1ZUZyb21GaWVsZFJlZk9wdGlvbnMge1xuICAvKipcbiAgICogVmVyc2lvbiBvZiB0aGUgc2NoZW1hIHRoZSBGaWVsZFBhdGggaXMgd3JpdHRlbiBpbiB0ZXJtcyBvZi5cbiAgICovXG4gIHJlYWRvbmx5IGFwaVZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0IHRoZSBwb2QgbGFiZWwgb3IgYW5ub3RhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGtleT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRvIHNwZWNpZnkgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWUgZnJvbSBhIHJlc291cmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudlZhbHVlRnJvbVJlc291cmNlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVyIHRvIHNlbGVjdCB0aGUgdmFsdWUgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRhaW5lcj86IENvbnRhaW5lcjtcblxuICAvKipcbiAgICogVGhlIG91dHB1dCBmb3JtYXQgb2YgdGhlIGV4cG9zZWQgcmVzb3VyY2UuXG4gICAqL1xuICByZWFkb25seSBkaXZpc29yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFV0aWxpdHkgY2xhc3MgZm9yIGNyZWF0aW5nIHJlYWRpbmcgZW52IHZhbHVlcyBmcm9tIHZhcmlvdXMgc291cmNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudlZhbHVlIHtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgdmFsdWUgYnkgcmVhZGluZyBhIHNwZWNpZmljIGtleSBpbnNpZGUgYSBjb25maWcgbWFwLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnTWFwIC0gVGhlIGNvbmZpZyBtYXAuXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IHRvIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQWRkaXRpb25hbCBvcHRpb25zLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQ29uZmlnTWFwKGNvbmZpZ01hcDogY29uZmlnbWFwLklDb25maWdNYXAsIGtleTogc3RyaW5nLCBvcHRpb25zOiBFbnZWYWx1ZUZyb21Db25maWdNYXBPcHRpb25zID0ge30pOiBFbnZWYWx1ZSB7XG5cbiAgICBjb25zdCBzb3VyY2U6IGs4cy5FbnZWYXJTb3VyY2UgPSB7XG4gICAgICBjb25maWdNYXBLZXlSZWY6IHtcbiAgICAgICAgbmFtZTogY29uZmlnTWFwLm5hbWUsXG4gICAgICAgIGtleSxcbiAgICAgICAgb3B0aW9uYWw6IG9wdGlvbnMub3B0aW9uYWwsXG4gICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBFbnZWYWx1ZSh1bmRlZmluZWQsIHNvdXJjZSk7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBhbiBlbnZpcm9ubWVudCB2YWx1ZSBmcm9tIGEgc2VjcmV0IEpTT04gdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSBzZWNyZXRWYWx1ZSBUaGUgc2VjcmV0IHZhbHVlIChzZWNyZW50ICsga2V5KVxuICAgKiBAcGFyYW0gb3B0aW9ucyBBZGRpdGlvbmFsIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNlY3JldFZhbHVlKHNlY3JldFZhbHVlOiBzZWNyZXQuU2VjcmV0VmFsdWUsIG9wdGlvbnM6IEVudlZhbHVlRnJvbVNlY3JldE9wdGlvbnMgPSB7fSk6IEVudlZhbHVlIHtcbiAgICBjb25zdCBzb3VyY2U6IGs4cy5FbnZWYXJTb3VyY2UgPSB7XG4gICAgICBzZWNyZXRLZXlSZWY6IHtcbiAgICAgICAgbmFtZTogc2VjcmV0VmFsdWUuc2VjcmV0Lm5hbWUsXG4gICAgICAgIGtleTogc2VjcmV0VmFsdWUua2V5LFxuICAgICAgICBvcHRpb25hbDogb3B0aW9ucy5vcHRpb25hbCxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgRW52VmFsdWUodW5kZWZpbmVkLCBzb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHZhbHVlIGZyb20gdGhlIGdpdmVuIGFyZ3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21WYWx1ZSh2YWx1ZTogc3RyaW5nKTogRW52VmFsdWUge1xuICAgIHJldHVybiBuZXcgRW52VmFsdWUodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIENyZWF0ZSBhIHZhbHVlIGZyb20gYSBmaWVsZCByZWZlcmVuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZFBhdGg6IFRoZSBmaWVsZCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSBvcHRpb25zOiBBZGRpdGlvbmFsIG9wdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21GaWVsZFJlZihmaWVsZFBhdGg6IEVudkZpZWxkUGF0aHMsIG9wdGlvbnM6IEVudlZhbHVlRnJvbUZpZWxkUmVmT3B0aW9ucyA9IHt9KTogRW52VmFsdWUge1xuICAgIGxldCBuZWVkc0tleTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgaWYgKGZpZWxkUGF0aCA9PT0gRW52RmllbGRQYXRocy5QT0RfTEFCRUwgfHwgZmllbGRQYXRoID09PSBFbnZGaWVsZFBhdGhzLlBPRF9BTk5PVEFUSU9OKSB7XG4gICAgICBuZWVkc0tleSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5lZWRzS2V5ICYmIG9wdGlvbnMua2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWVsZFBhdGh9IHJlcXVpcmVzIGEga2V5YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlOiBrOHMuRW52VmFyU291cmNlID0ge1xuICAgICAgZmllbGRSZWY6IHtcbiAgICAgICAgZmllbGRQYXRoOiAoYCR7ZmllbGRQYXRofWAgKyAobmVlZHNLZXkgPyBgWycke29wdGlvbnMua2V5fSddYCA6ICcnKSksXG4gICAgICAgIC4uLihvcHRpb25zLmFwaVZlcnNpb24gPyB7IGFwaVZlcnNpb246IG9wdGlvbnMuYXBpVmVyc2lvbiB9IDoge30pLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBFbnZWYWx1ZSh1bmRlZmluZWQsIHNvdXJjZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgdmFsdWUgZnJvbSBhIHJlc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gcmVzb3VyY2U6IFJlc291cmNlIHRvIHNlbGVjdCB0aGUgdmFsdWUgZnJvbS5cbiAgICogQHBhcmFtIG9wdGlvbnM6IEFkZGl0aW9uYWwgb3B0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVJlc291cmNlKHJlc291cmNlOiBSZXNvdXJjZUZpZWxkUGF0aHMsIG9wdGlvbnM6IEVudlZhbHVlRnJvbVJlc291cmNlT3B0aW9ucyA9IHt9KTogRW52VmFsdWUge1xuICAgIGNvbnN0IHNvdXJjZTogazhzLkVudlZhclNvdXJjZSA9IHtcbiAgICAgIHJlc291cmNlRmllbGRSZWY6IHtcbiAgICAgICAgcmVzb3VyY2U6IGAke3Jlc291cmNlfWAsXG4gICAgICAgIC4uLiAob3B0aW9ucy5kaXZpc29yID8geyBkaXZpc29yOiBrOHMuSW50T3JTdHJpbmcuZnJvbVN0cmluZyhvcHRpb25zLmRpdmlzb3IpIH0gOiB7fSksXG4gICAgICAgIC4uLiAob3B0aW9ucy5jb250YWluZXIgPyB7IGNvbnRhaW5lck5hbWU6IG9wdGlvbnMuY29udGFpbmVyLm5hbWUgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgRW52VmFsdWUodW5kZWZpbmVkLCBzb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHZhbHVlIGZyb20gYSBrZXkgaW4gdGhlIGN1cnJlbnQgcHJvY2VzcyBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgdG8gcmVhZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBBZGRpdGlvbmFsIG9wdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Qcm9jZXNzKGtleTogc3RyaW5nLCBvcHRpb25zOiBFbnZWYWx1ZUZyb21Qcm9jZXNzT3B0aW9ucyA9IHt9KTogRW52VmFsdWUge1xuXG4gICAgY29uc3QgdmFsdWUgPSBwcm9jZXNzLmVudltrZXldO1xuXG4gICAgaWYgKG9wdGlvbnMucmVxdWlyZWQgJiYgIXZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgJHtrZXl9IGVudiB2YXJpYWJsZWApO1xuICAgIH1cblxuICAgIHJldHVybiBFbnZWYWx1ZS5mcm9tVmFsdWUodmFsdWUhKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlPzogYW55LCBwdWJsaWMgcmVhZG9ubHkgdmFsdWVGcm9tPzogYW55KSB7IH1cbn1cblxuZXhwb3J0IGVudW0gSW1hZ2VQdWxsUG9saWN5IHtcbiAgLyoqXG4gICAqIEV2ZXJ5IHRpbWUgdGhlIGt1YmVsZXQgbGF1bmNoZXMgYSBjb250YWluZXIsIHRoZSBrdWJlbGV0IHF1ZXJpZXMgdGhlIGNvbnRhaW5lciBpbWFnZSByZWdpc3RyeVxuICAgKiB0byByZXNvbHZlIHRoZSBuYW1lIHRvIGFuIGltYWdlIGRpZ2VzdC4gSWYgdGhlIGt1YmVsZXQgaGFzIGEgY29udGFpbmVyIGltYWdlIHdpdGggdGhhdCBleGFjdFxuICAgKiBkaWdlc3QgY2FjaGVkIGxvY2FsbHksIHRoZSBrdWJlbGV0IHVzZXMgaXRzIGNhY2hlZCBpbWFnZTsgb3RoZXJ3aXNlLCB0aGUga3ViZWxldCBkb3dubG9hZHNcbiAgICogKHB1bGxzKSB0aGUgaW1hZ2Ugd2l0aCB0aGUgcmVzb2x2ZWQgZGlnZXN0LCBhbmQgdXNlcyB0aGF0IGltYWdlIHRvIGxhdW5jaCB0aGUgY29udGFpbmVyLlxuICAgKlxuICAgKiBEZWZhdWx0IGlzIEFsd2F5cyBpZiBJbWFnZVB1bGxQb2xpY3kgaXMgb21pdHRlZCBhbmQgZWl0aGVyIHRoZSBpbWFnZSB0YWcgaXMgOmxhdGVzdCBvclxuICAgKiB0aGUgaW1hZ2UgdGFnIGlzIG9taXR0ZWQuXG4gICAqL1xuICBBTFdBWVMgPSAnQWx3YXlzJyxcblxuICAvKipcbiAgICogVGhlIGltYWdlIGlzIHB1bGxlZCBvbmx5IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgbG9jYWxseS5cbiAgICpcbiAgICogRGVmYXVsdCBpcyBJZk5vdFByZXNlbnQgaWYgSW1hZ2VQdWxsUG9saWN5IGlzIG9taXR0ZWQgYW5kIHRoZSBpbWFnZSB0YWcgaXMgcHJlc2VudCBidXRcbiAgICogbm90IDpsYXRlc3RcbiAgICovXG4gIElGX05PVF9QUkVTRU5UID0gJ0lmTm90UHJlc2VudCcsXG5cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBpcyBhc3N1bWVkIHRvIGV4aXN0IGxvY2FsbHkuIE5vIGF0dGVtcHQgaXMgbWFkZSB0byBwdWxsIHRoZSBpbWFnZS5cbiAgICovXG4gIE5FVkVSID0gJ05ldmVyJyxcbn1cblxuLyoqXG4gKiBDb250YWluZXIgbGlmZWN5Y2xlIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFpbmVyTGlmZWN5Y2xlIHtcblxuICAvKipcbiAgICogVGhpcyBob29rIGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgY29udGFpbmVyIGlzIGNyZWF0ZWQuIEhvd2V2ZXIsXG4gICAqIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBob29rIHdpbGwgZXhlY3V0ZSBiZWZvcmUgdGhlIGNvbnRhaW5lciBFTlRSWVBPSU5ULlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHBvc3Qgc3RhcnQgaGFuZGxlci5cbiAgICovXG4gIHJlYWRvbmx5IHBvc3RTdGFydD86IGhhbmRsZXIuSGFuZGxlcjtcblxuICAvKipcbiAgICogVGhpcyBob29rIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgYSBjb250YWluZXIgaXMgdGVybWluYXRlZCBkdWUgdG8gYW4gQVBJIHJlcXVlc3Qgb3IgbWFuYWdlbWVudFxuICAgKiBldmVudCBzdWNoIGFzIGEgbGl2ZW5lc3Mvc3RhcnR1cCBwcm9iZSBmYWlsdXJlLCBwcmVlbXB0aW9uLCByZXNvdXJjZSBjb250ZW50aW9uIGFuZCBvdGhlcnMuXG4gICAqIEEgY2FsbCB0byB0aGUgUHJlU3RvcCBob29rIGZhaWxzIGlmIHRoZSBjb250YWluZXIgaXMgYWxyZWFkeSBpbiBhIHRlcm1pbmF0ZWQgb3IgY29tcGxldGVkIHN0YXRlXG4gICAqIGFuZCB0aGUgaG9vayBtdXN0IGNvbXBsZXRlIGJlZm9yZSB0aGUgVEVSTSBzaWduYWwgdG8gc3RvcCB0aGUgY29udGFpbmVyIGNhbiBiZSBzZW50LlxuICAgKiBUaGUgUG9kJ3MgdGVybWluYXRpb24gZ3JhY2UgcGVyaW9kIGNvdW50ZG93biBiZWdpbnMgYmVmb3JlIHRoZSBQcmVTdG9wIGhvb2sgaXMgZXhlY3V0ZWQsXG4gICAqIHNvIHJlZ2FyZGxlc3Mgb2YgdGhlIG91dGNvbWUgb2YgdGhlIGhhbmRsZXIsIHRoZSBjb250YWluZXIgd2lsbCBldmVudHVhbGx5IHRlcm1pbmF0ZVxuICAgKiB3aXRoaW4gdGhlIFBvZCdzIHRlcm1pbmF0aW9uIGdyYWNlIHBlcmlvZC4gTm8gcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRvIHRoZSBoYW5kbGVyLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3dvcmtsb2Fkcy9wb2RzL3BvZC1saWZlY3ljbGUvI3BvZC10ZXJtaW5hdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHByZSBzdG9wIGhhbmRsZXIuXG4gICAqL1xuICByZWFkb25seSBwcmVTdG9wPzogaGFuZGxlci5IYW5kbGVyO1xuXG59XG5cbi8qKlxuICogUmVzdGFydFBvbGljeSBkZWZpbmVzIHRoZSByZXN0YXJ0IGJlaGF2aW9yIG9mIGluZGl2aWR1YWwgY29udGFpbmVycyBpbiBhIHBvZC5cbiAqIFRoaXMgZmllbGQgbWF5IG9ubHkgYmUgc2V0IGZvciBpbml0IGNvbnRhaW5lcnMsIGFuZCB0aGUgb25seSBhbGxvd2VkIHZhbHVlIGlzIFwiQWx3YXlzXCIuXG4gKiBGb3Igbm9uLWluaXQgY29udGFpbmVycyBvciB3aGVuIHRoaXMgZmllbGQgaXMgbm90IHNwZWNpZmllZCxcbiAqIHRoZSByZXN0YXJ0IGJlaGF2aW9yIGlzIGRlZmluZWQgYnkgdGhlIFBvZCdzIHJlc3RhcnQgcG9saWN5IGFuZCB0aGUgY29udGFpbmVyIHR5cGUuXG4gKiBTZXR0aW5nIHRoZSBSZXN0YXJ0UG9saWN5IGFzIFwiQWx3YXlzXCIgZm9yIHRoZSBpbml0IGNvbnRhaW5lciB3aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBlZmZlY3Q6XG4gKiB0aGlzIGluaXQgY29udGFpbmVyIHdpbGwgYmUgY29udGludWFsbHkgcmVzdGFydGVkIG9uIGV4aXQgdW50aWwgYWxsIHJlZ3VsYXIgY29udGFpbmVycyBoYXZlIHRlcm1pbmF0ZWQuXG4gKiBPbmNlIGFsbCByZWd1bGFyIGNvbnRhaW5lcnMgaGF2ZSBjb21wbGV0ZWQsIGFsbCBpbml0IGNvbnRhaW5lcnMgd2l0aCByZXN0YXJ0UG9saWN5IFwiQWx3YXlzXCIgd2lsbCBiZSBzaHV0IGRvd24uXG4gKiBUaGlzIGxpZmVjeWNsZSBkaWZmZXJzIGZyb20gbm9ybWFsIGluaXQgY29udGFpbmVycyBhbmQgaXMgb2Z0ZW4gcmVmZXJyZWQgdG8gYXMgYSBcInNpZGVjYXJcIiBjb250YWluZXIuXG4gKlxuICogQHNlZSBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy93b3JrbG9hZHMvcG9kcy9zaWRlY2FyLWNvbnRhaW5lcnMvXG4gKi9cbmV4cG9ydCBlbnVtIENvbnRhaW5lclJlc3RhcnRQb2xpY3kge1xuXG4gIC8qKlxuICAgKiBJZiBhbiBpbml0IGNvbnRhaW5lciBpcyBjcmVhdGVkIHdpdGggaXRzIHJlc3RhcnRQb2xpY3kgc2V0IHRvIEFsd2F5cyxcbiAgICogaXQgd2lsbCBzdGFydCBhbmQgcmVtYWluIHJ1bm5pbmcgZHVyaW5nIHRoZSBlbnRpcmUgbGlmZSBvZiB0aGUgUG9kLlxuICAgKiBGb3IgcmVndWxhciBjb250YWluZXJzLCB0aGlzIGlzIGlnbm9yZWQgYnkgS3ViZXJuZXRlcy5cbiAgICovXG4gIEFMV0FZUyA9ICdBbHdheXMnLFxufVxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhIGNvbnRhaW5lci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250YWluZXJQcm9wcyBleHRlbmRzIENvbnRhaW5lck9wdHMge1xuXG4gIC8qKlxuICAgKiBEb2NrZXIgaW1hZ2UgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9uYWwgcHJvcGVydGllcyBvZiBhIGNvbnRhaW5lci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250YWluZXJPcHRzIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIGNvbnRhaW5lciBzcGVjaWZpZWQgYXMgYSBETlNfTEFCRUwuIEVhY2ggY29udGFpbmVyIGluIGEgcG9kIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lIChETlNfTEFCRUwpLiBDYW5ub3QgYmUgdXBkYXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgJ21haW4nXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSBgcG9ydE51bWJlcmAuXG4gICAqL1xuICByZWFkb25seSBwb3J0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgcG9ydCB0byBleHBvc2Ugb24gdGhlIHBvZCdzIElQIGFkZHJlc3MuIFRoaXMgbXVzdCBiZSBhIHZhbGlkIHBvcnQgbnVtYmVyLCAwIDwgeCA8IDY1NTM2LlxuICAgKlxuICAgKiBUaGlzIGlzIGEgY29udmluaWVuY2UgcHJvcGVydHkgaWYgYWxsIHlvdSBuZWVkIGEgc2luZ2xlIFRDUCBudW1iZXJlZCBwb3J0LlxuICAgKiBJbiBjYXNlIG1vcmUgYWR2YW5jZWQgY29uZmlndWFydGlvbiBpcyByZXF1aXJlZCwgdXNlIHRoZSBgcG9ydHNgIHByb3BlcnR5LlxuICAgKlxuICAgKiBUaGlzIHBvcnQgaXMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgcG9ydHMgbWVudGlvbmVkIGluIHRoZSBgcG9ydHNgIHByb3BlcnR5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE9ubHkgdGhlIHBvcnRzIG1lbnRpb25kIGluIHRoZSBgcG9ydHNgIHByb3BlcnR5IGFyZSBleHBvc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydE51bWJlcj86IG51bWJlcjtcblxuICAvKipcbiAgICogTGlzdCBvZiBwb3J0cyB0byBleHBvc2UgZnJvbSB0aGlzIGNvbnRhaW5lci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBPbmx5IHRoZSBwb3J0IG1lbnRpb25lZCBpbiB0aGUgYHBvcnROdW1iZXJgIHByb3BlcnR5IGlzIGV4cG9zZWQuXG4gICAqL1xuICByZWFkb25seSBwb3J0cz86IENvbnRhaW5lclBvcnRbXTtcblxuICAvKipcbiAgICogRW50cnlwb2ludCBhcnJheS4gTm90IGV4ZWN1dGVkIHdpdGhpbiBhIHNoZWxsLiBUaGUgZG9ja2VyIGltYWdlJ3MgRU5UUllQT0lOVCBpcyB1c2VkIGlmIHRoaXMgaXMgbm90IHByb3ZpZGVkLiBWYXJpYWJsZSByZWZlcmVuY2VzICQoVkFSX05BTUUpIGFyZSBleHBhbmRlZCB1c2luZyB0aGUgY29udGFpbmVyJ3MgZW52aXJvbm1lbnQuXG4gICAqIElmIGEgdmFyaWFibGUgY2Fubm90IGJlIHJlc29sdmVkLCB0aGUgcmVmZXJlbmNlIGluIHRoZSBpbnB1dCBzdHJpbmcgd2lsbCBiZSB1bmNoYW5nZWQuIFRoZSAkKFZBUl9OQU1FKSBzeW50YXggY2FuIGJlIGVzY2FwZWQgd2l0aCBhIGRvdWJsZSAkJCwgaWU6ICQkKFZBUl9OQU1FKS5cbiAgICogRXNjYXBlZCByZWZlcmVuY2VzIHdpbGwgbmV2ZXIgYmUgZXhwYW5kZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgdmFyaWFibGUgZXhpc3RzIG9yIG5vdC4gQ2Fubm90IGJlIHVwZGF0ZWQuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvdGFza3MvaW5qZWN0LWRhdGEtYXBwbGljYXRpb24vZGVmaW5lLWNvbW1hbmQtYXJndW1lbnQtY29udGFpbmVyLyNydW5uaW5nLWEtY29tbWFuZC1pbi1hLXNoZWxsXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIGRvY2tlciBpbWFnZSdzIEVOVFJZUE9JTlQuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEFyZ3VtZW50cyB0byB0aGUgZW50cnlwb2ludC4gVGhlIGRvY2tlciBpbWFnZSdzIENNRCBpcyB1c2VkIGlmIGBjb21tYW5kYCBpc1xuICAgKiBub3QgcHJvdmlkZWQuXG4gICAqXG4gICAqIFZhcmlhYmxlIHJlZmVyZW5jZXMgJChWQVJfTkFNRSkgYXJlIGV4cGFuZGVkIHVzaW5nIHRoZSBjb250YWluZXInc1xuICAgKiBlbnZpcm9ubWVudC4gSWYgYSB2YXJpYWJsZSBjYW5ub3QgYmUgcmVzb2x2ZWQsIHRoZSByZWZlcmVuY2UgaW4gdGhlIGlucHV0XG4gICAqIHN0cmluZyB3aWxsIGJlIHVuY2hhbmdlZC4gVGhlICQoVkFSX05BTUUpIHN5bnRheCBjYW4gYmUgZXNjYXBlZCB3aXRoIGFcbiAgICogZG91YmxlICQkLCBpZTogJCQoVkFSX05BTUUpLiBFc2NhcGVkIHJlZmVyZW5jZXMgd2lsbCBuZXZlciBiZSBleHBhbmRlZCxcbiAgICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSB2YXJpYWJsZSBleGlzdHMgb3Igbm90LlxuICAgKlxuICAgKiBDYW5ub3QgYmUgdXBkYXRlZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy90YXNrcy9pbmplY3QtZGF0YS1hcHBsaWNhdGlvbi9kZWZpbmUtY29tbWFuZC1hcmd1bWVudC1jb250YWluZXIvI3J1bm5pbmctYS1jb21tYW5kLWluLWEtc2hlbGxcbiAgICogQGRlZmF1bHQgW11cbiAgICovXG4gIHJlYWRvbmx5IGFyZ3M/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQ29udGFpbmVyJ3Mgd29ya2luZyBkaXJlY3RvcnkuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBjb250YWluZXIgcnVudGltZSdzIGRlZmF1bHQgd2lsbCBiZSB1c2VkLCB3aGljaCBtaWdodCBiZSBjb25maWd1cmVkIGluIHRoZSBjb250YWluZXIgaW1hZ2UuIENhbm5vdCBiZSB1cGRhdGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBjb250YWluZXIgcnVudGltZSdzIGRlZmF1bHQuXG4gICAqL1xuICByZWFkb25seSB3b3JraW5nRGlyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc2V0IGluIHRoZSBjb250YWluZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZW52VmFyaWFibGVzPzogeyBbbmFtZTogc3RyaW5nXTogRW52VmFsdWUgfTtcblxuICAvKipcbiAgICogTGlzdCBvZiBzb3VyY2VzIHRvIHBvcHVsYXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiB0aGUgY29udGFpbmVyLlxuICAgKiBXaGVuIGEga2V5IGV4aXN0cyBpbiBtdWx0aXBsZSBzb3VyY2VzLCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoXG4gICAqIHRoZSBsYXN0IHNvdXJjZSB3aWxsIHRha2UgcHJlY2VkZW5jZS4gVmFsdWVzIGRlZmluZWQgYnkgdGhlIGBlbnZWYXJpYWJsZXNgIHByb3BlcnR5XG4gICAqIHdpdGggYSBkdXBsaWNhdGUga2V5IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHNvdXJjZXMuXG4gICAqL1xuICByZWFkb25seSBlbnZGcm9tPzogRW52RnJvbVtdO1xuXG4gIC8qKlxuICAgKiBQb2Qgdm9sdW1lcyB0byBtb3VudCBpbnRvIHRoZSBjb250YWluZXIncyBmaWxlc3lzdGVtLiBDYW5ub3QgYmUgdXBkYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZvbHVtZU1vdW50cz86IFZvbHVtZU1vdW50W107XG5cbiAgLyoqXG4gICAqIEltYWdlIHB1bGwgcG9saWN5IGZvciB0aGlzIGNvbnRhaW5lclxuICAgKiBAZGVmYXVsdCBJbWFnZVB1bGxQb2xpY3kuQUxXQVlTXG4gICAqL1xuICByZWFkb25seSBpbWFnZVB1bGxQb2xpY3k/OiBJbWFnZVB1bGxQb2xpY3k7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hlbiB0aGUgY29udGFpbmVyIGlzIHJlYWR5IHRvIHNlcnZlIHRyYWZmaWMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcmVhZGluZXNzIHByb2JlIGlzIGRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHJlYWRpbmVzcz86IHByb2JlLlByb2JlO1xuXG4gIC8qKlxuICAgKiBQZXJpb2RpYyBwcm9iZSBvZiBjb250YWluZXIgbGl2ZW5lc3MuIENvbnRhaW5lciB3aWxsIGJlIHJlc3RhcnRlZCBpZiB0aGUgcHJvYmUgZmFpbHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gbGl2ZW5lc3MgcHJvYmUgaXMgZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgbGl2ZW5lc3M/OiBwcm9iZS5Qcm9iZTtcblxuICAvKipcbiAgICogU3RhcnR1cFByb2JlIGluZGljYXRlcyB0aGF0IHRoZSBQb2QgaGFzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZC5cbiAgICogSWYgc3BlY2lmaWVkLCBubyBvdGhlciBwcm9iZXMgYXJlIGV4ZWN1dGVkIHVudGlsIHRoaXMgY29tcGxldGVzIHN1Y2Nlc3NmdWxseVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIGEgcG9ydCBpcyBwcm92aWRlZCwgdGhlbiBrbm9ja3Mgb24gdGhhdCBwb3J0XG4gICAqIHRvIGRldGVybWluZSB3aGVuIHRoZSBjb250YWluZXIgaXMgcmVhZHkgZm9yIHJlYWRpbmVzcyBhbmRcbiAgICogbGl2ZW5lc3MgcHJvYmUgY2hlY2tzLlxuICAgKiBPdGhlcndpc2UsIG5vIHN0YXJ0dXAgcHJvYmUgaXMgZGVmaW5lZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0dXA/OiBwcm9iZS5Qcm9iZTtcblxuICAvKipcbiAgICogRGVzY3JpYmVzIGFjdGlvbnMgdGhhdCB0aGUgbWFuYWdlbWVudCBzeXN0ZW0gc2hvdWxkIHRha2UgaW4gcmVzcG9uc2UgdG8gY29udGFpbmVyIGxpZmVjeWNsZSBldmVudHMuXG4gICAqL1xuICByZWFkb25seSBsaWZlY3ljbGU/OiBDb250YWluZXJMaWZlY3ljbGU7XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgcmVzb3VyY2VzIChDUFUgYW5kIG1lbW9yeSByZXF1ZXN0cyBhbmQgbGltaXRzKSByZXF1aXJlZCBieSB0aGUgY29udGFpbmVyXG4gICAqIEBzZWUgaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvY29uZmlndXJhdGlvbi9tYW5hZ2UtcmVzb3VyY2VzLWNvbnRhaW5lcnMvXG4gICAqXG4gICAqIEBkZWZhdWx0XG4gICAqICAgIGNwdTpcbiAgICogICAgICByZXF1ZXN0OiAxMDAwIG1pbGxpc1xuICAgKiAgICAgIGxpbWl0OiAxNTAwIG1pbGxpc1xuICAgKiAgICBtZW1vcnk6XG4gICAqICAgICAgcmVxdWVzdDogNTEyIG1lYmlieXRlc1xuICAgKiAgICAgIGxpbWl0OiAyMDQ4IG1lYmlieXRlc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VzPzogQ29udGFpbmVyUmVzb3VyY2VzO1xuXG4gIC8qKlxuICAgKiBTZWN1cml0eUNvbnRleHQgZGVmaW5lcyB0aGUgc2VjdXJpdHkgb3B0aW9ucyB0aGUgY29udGFpbmVyIHNob3VsZCBiZSBydW4gd2l0aC5cbiAgICogSWYgc2V0LCB0aGUgZmllbGRzIG92ZXJyaWRlIGVxdWl2YWxlbnQgZmllbGRzIG9mIHRoZSBwb2QncyBzZWN1cml0eSBjb250ZXh0LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL3Rhc2tzL2NvbmZpZ3VyZS1wb2QtY29udGFpbmVyL3NlY3VyaXR5LWNvbnRleHQvXG4gICAqIEBkZWZhdWx0XG4gICAqXG4gICAqICAgZW5zdXJlTm9uUm9vdDogdHJ1ZVxuICAgKiAgIHByaXZpbGVnZWQ6IGZhbHNlXG4gICAqICAgcmVhZE9ubHlSb290RmlsZXN5c3RlbTogdHJ1ZVxuICAgKiAgIGFsbG93UHJpdmlsZWdlRXNjYWxhdGlvbjogZmFsc2VcbiAgICogICB1c2VyOiAyNTAwMFxuICAgKiAgIGdyb3VwOiAyNjAwMFxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlDb250ZXh0PzogQ29udGFpbmVyU2VjdXJpdHlDb250ZXh0UHJvcHM7XG5cbiAgLyoqXG4gICAqIEt1YmVsZXQgd2lsbCBzdGFydCBpbml0IGNvbnRhaW5lcnMgd2l0aCByZXN0YXJ0UG9saWN5PUFsd2F5cyBpbiB0aGUgb3JkZXIgd2l0aCBvdGhlciBpbml0IGNvbnRhaW5lcnMsXG4gICAqIGJ1dCBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIGl0cyBjb21wbGV0aW9uLCBpdCB3aWxsIHdhaXQgZm9yIHRoZSBjb250YWluZXIgc3RhcnR1cCBjb21wbGV0aW9uXG4gICAqIEN1cnJlbnRseSwgb25seSBhY2NlcHRlZCB2YWx1ZSBpcyBBbHdheXNcbiAgICogQHNlZSBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy93b3JrbG9hZHMvcG9kcy9zaWRlY2FyLWNvbnRhaW5lcnMvXG4gICAqIEBkZWZhdWx0IC0gbm8gcmVzdGFydCBwb2xpY3kgaXMgZGVmaW5lZCBhbmQgdGhlIHBvZCByZXN0YXJ0IHBvbGljeSBpcyBhcHBsaWVkXG4gICAqL1xuICByZWFkb25seSByZXN0YXJ0UG9saWN5PzogQ29udGFpbmVyUmVzdGFydFBvbGljeTtcbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBhcHBsaWNhdGlvbiBjb250YWluZXIgdGhhdCB5b3Ugd2FudCB0byBydW4gd2l0aGluIGEgcG9kLlxuICovXG5leHBvcnQgY2xhc3MgQ29udGFpbmVyIHtcblxuICAvKipcbiAgICogVGhlIHBvcnQgbnVtYmVyIHRoYXQgd2FzIGNvbmZpZ3VyZWQgZm9yIHRoaXMgY29udGFpbmVyLlxuICAgKiBJZiB1bmRlZmluZWQsIGVpdGhlciB0aGUgY29udGFpbmVyIGRvZXNuJ3QgZXhwb3NlIGEgcG9ydCwgb3IgaXRzXG4gICAqIHBvcnQgY29uZmlndXJhdGlvbiBpcyBzdG9yZWQgaW4gdGhlIGBwb3J0c2AgZmllbGQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcG9ydE51bWJlcj86IG51bWJlcjtcblxuICAvKipcbiAgICogVm9sdW1lIG1vdW50cyBjb25maWd1cmVkIGZvciB0aGlzIGNvbnRhaW5lci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtb3VudHM6IFZvbHVtZU1vdW50W107XG5cbiAgLyoqXG4gICAqIEltYWdlIHB1bGwgcG9saWN5IGZvciB0aGlzIGNvbnRhaW5lclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGltYWdlUHVsbFBvbGljeTogSW1hZ2VQdWxsUG9saWN5O1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVyIGltYWdlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGltYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkgaW5zaWRlIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya2luZ0Rpcj86IHN0cmluZztcblxuICAvKipcbiAgICogQ29tcHV0ZSByZXNvdXJjZXMgKENQVSBhbmQgbWVtb3J5IHJlcXVlc3RzIGFuZCBsaW1pdHMpIHJlcXVpcmVkIGJ5IHRoZSBjb250YWluZXJcbiAgICogQHNlZSBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9jb25maWd1cmF0aW9uL21hbmFnZS1yZXNvdXJjZXMtY29udGFpbmVycy9cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZXM/OiBDb250YWluZXJSZXNvdXJjZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBzZWN1cml0eSBjb250ZXh0IG9mIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2VjdXJpdHlDb250ZXh0OiBDb250YWluZXJTZWN1cml0eUNvbnRleHQ7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnZpcm9ubWVudCBvZiB0aGUgY29udGFpbmVyLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudjogRW52O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzdGFydCBwb2xpY3kgb2YgdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXN0YXJ0UG9saWN5PzogQ29udGFpbmVyUmVzdGFydFBvbGljeTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9jb21tYW5kPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FyZ3M/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcG9ydHM6IENvbnRhaW5lclBvcnRbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZWFkaW5lc3M/OiBwcm9iZS5Qcm9iZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbGl2ZW5lc3M/OiBwcm9iZS5Qcm9iZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc3RhcnR1cD86IHByb2JlLlByb2JlO1xuICBwcml2YXRlIHJlYWRvbmx5IF9saWZlY3ljbGU/OiBDb250YWluZXJMaWZlY3ljbGU7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IENvbnRhaW5lclByb3BzKSB7XG4gICAgaWYgKHByb3BzIGluc3RhbmNlb2YgQ29udGFpbmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0dGVtcHRlZCB0byBjb25zdHJ1Y3QgYSBjb250YWluZXIgZnJvbSBhIENvbnRhaW5lciBvYmplY3QuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFJlc291cmNlU3BlYzogQ29udGFpbmVyUmVzb3VyY2VzID0ge1xuICAgICAgY3B1OiB7XG4gICAgICAgIHJlcXVlc3Q6IENwdS5taWxsaXMoMTAwMCksXG4gICAgICAgIGxpbWl0OiBDcHUubWlsbGlzKDE1MDApLFxuICAgICAgfSxcbiAgICAgIG1lbW9yeToge1xuICAgICAgICByZXF1ZXN0OiBTaXplLm1lYmlieXRlcyg1MTIpLFxuICAgICAgICBsaW1pdDogU2l6ZS5tZWJpYnl0ZXMoMjA0OCksXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBpZiAocHJvcHMucG9ydCAmJiBwcm9wcy5wb3J0TnVtYmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VpdGhlciBcXCdwb3J0XFwnIG9yIFxcJ3BvcnROdW1iZXJcXCcgaXMgYWxsb3dlZC4gVXNlIFxcJ3BvcnROdW1iZXJcXCcgc2luY2UgXFwncG9ydFxcJyBpcyBkZXByZWNhdGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydE51bWJlciA9IHByb3BzLnBvcnROdW1iZXIgPz8gcHJvcHMucG9ydDtcbiAgICBjb25zdCBkZWZhdWx0UHJvYmVDb25maWd1cmF0aW9uOiBwcm9iZS5Qcm9iZSA9IHByb2JlLlByb2JlLmZyb21UY3BTb2NrZXQoeyBwb3J0OiBwb3J0TnVtYmVyIH0pO1xuXG4gICAgdGhpcy5uYW1lID0gcHJvcHMubmFtZSA/PyAnbWFpbic7XG4gICAgdGhpcy5pbWFnZSA9IHByb3BzLmltYWdlO1xuICAgIHRoaXMucG9ydE51bWJlciA9IHBvcnROdW1iZXI7XG4gICAgdGhpcy5fY29tbWFuZCA9IHByb3BzLmNvbW1hbmQ7XG4gICAgdGhpcy5fYXJncyA9IHByb3BzLmFyZ3M7XG4gICAgdGhpcy5fcmVhZGluZXNzID0gcHJvcHMucmVhZGluZXNzO1xuICAgIHRoaXMuX2xpdmVuZXNzID0gcHJvcHMubGl2ZW5lc3M7XG4gICAgdGhpcy5fc3RhcnR1cCA9IHByb3BzLnN0YXJ0dXAgPz8gKHRoaXMucG9ydE51bWJlciA/IGRlZmF1bHRQcm9iZUNvbmZpZ3VyYXRpb24gOiB1bmRlZmluZWQpO1xuICAgIHRoaXMuX2xpZmVjeWNsZSA9IHByb3BzLmxpZmVjeWNsZTtcbiAgICB0aGlzLnJlc291cmNlcyA9IHByb3BzLnJlc291cmNlcyA/PyBkZWZhdWx0UmVzb3VyY2VTcGVjO1xuICAgIHRoaXMud29ya2luZ0RpciA9IHByb3BzLndvcmtpbmdEaXI7XG4gICAgdGhpcy5tb3VudHMgPSBwcm9wcy52b2x1bWVNb3VudHMgPz8gW107XG4gICAgdGhpcy5pbWFnZVB1bGxQb2xpY3kgPSBwcm9wcy5pbWFnZVB1bGxQb2xpY3kgPz8gSW1hZ2VQdWxsUG9saWN5LkFMV0FZUztcbiAgICB0aGlzLnNlY3VyaXR5Q29udGV4dCA9IG5ldyBDb250YWluZXJTZWN1cml0eUNvbnRleHQocHJvcHMuc2VjdXJpdHlDb250ZXh0KTtcbiAgICB0aGlzLmVudiA9IG5ldyBFbnYocHJvcHMuZW52RnJvbSA/PyBbXSwgcHJvcHMuZW52VmFyaWFibGVzID8/IHt9KTtcbiAgICB0aGlzLnJlc3RhcnRQb2xpY3kgPSBwcm9wcy5yZXN0YXJ0UG9saWN5O1xuXG4gICAgaWYgKHRoaXMucG9ydE51bWJlcikge1xuICAgICAgdGhpcy5hZGRQb3J0KHtcbiAgICAgICAgbnVtYmVyOiB0aGlzLnBvcnROdW1iZXIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHBvcnQgb2YgcHJvcHMucG9ydHMgPz8gW10pIHtcbiAgICAgIHRoaXMuYWRkUG9ydChwb3J0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgYHBvcnROdW1iZXJgLlxuICAgKi9cbiAgcHVibGljIGdldCBwb3J0KCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucG9ydE51bWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3J0cyBleHBvc2VkIGJ5IHRoaXMgY29udGFpbmVycy5cbiAgICogUmV0dXJucyBhIGNvcHksIHVzZSBgYWRkUG9ydGAgdG8gbW9kaWZ5LlxuICAgKi9cbiAgcHVibGljIGdldCBwb3J0cygpOiBDb250YWluZXJQb3J0W10ge1xuICAgIHJldHVybiBbLi4udGhpcy5fcG9ydHNdO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudHJ5cG9pbnQgYXJyYXkgKHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgd2hlbiB0aGUgY29udGFpbmVyIHN0YXJ0cykuXG4gICAqIEByZXR1cm5zIGEgY29weSBvZiB0aGUgZW50cnlwb2ludCBhcnJheSwgY2Fubm90IGJlIG1vZGlmaWVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbW1hbmQoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb21tYW5kID8gWy4uLnRoaXMuX2NvbW1hbmRdIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFyZ3VtZW50cyB0byB0aGUgZW50cnlwb2ludC5cbiAgICpcbiAgICogQHJldHVybnMgYSBjb3B5IG9mIHRoZSBhcmd1bWVudHMgYXJyYXksIGNhbm5vdCBiZSBtb2RpZmllZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgYXJncygpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2FyZ3MgPyBbLi4udGhpcy5fYXJnc10gOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogTW91bnQgYSB2b2x1bWUgdG8gYSBzcGVjaWZpYyBwYXRoIHNvIHRoYXQgaXQgaXMgYWNjZXNzaWJsZSBieSB0aGUgY29udGFpbmVyLlxuICAgKiBFdmVyeSBwb2QgdGhhdCBpcyBjb25maWd1cmVkIHRvIHVzZSB0aGlzIGNvbnRhaW5lciB3aWxsIGF1dG1vYXRpY2FsbHkgaGF2ZSBhY2Nlc3MgdG8gdGhlIHZvbHVtZS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBUaGUgZGVzaXJlZCBwYXRoIGluIHRoZSBjb250YWluZXIuXG4gICAqIEBwYXJhbSBzdG9yYWdlIC0gVGhlIHN0b3JhZ2UgdG8gbW91bnQuXG4gICAqL1xuICBwdWJsaWMgbW91bnQocGF0aDogc3RyaW5nLCBzdG9yYWdlOiB2b2x1bWUuSVN0b3JhZ2UsIG9wdGlvbnM6IE1vdW50T3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5tb3VudHMucHVzaCh7IHBhdGgsIHZvbHVtZTogc3RvcmFnZS5hc1ZvbHVtZSgpLCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHBvcnQgdG8gZXhwb3NlIGZyb20gdGhpcyBjb250YWluZXIuXG4gICAqL1xuICBwdWJsaWMgYWRkUG9ydChwb3J0OiBDb250YWluZXJQb3J0KSB7XG5cbiAgICBjb25zdCBuYW1lcyA9IHRoaXMuX3BvcnRzLm1hcChwID0+IHAubmFtZSkuZmlsdGVyKHggPT4geCk7XG4gICAgY29uc3QgbnVtYmVyUHJvdG9jb2xzID0gdGhpcy5fcG9ydHMubWFwKHAgPT4gYCR7cC5udW1iZXJ9LyR7cC5wcm90b2NvbCB8fCBQcm90b2NvbC5UQ1B9YCk7XG5cbiAgICBpZiAocG9ydC5uYW1lICYmIG5hbWVzLmluY2x1ZGVzKHBvcnQubmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUG9ydCB3aXRoIG5hbWUgJHtwb3J0Lm5hbWV9IGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG9jb2wgPSBgJHtwb3J0Lm51bWJlcn0vJHtwb3J0LnByb3RvY29sIHx8IFByb3RvY29sLlRDUH1gO1xuICAgIGlmIChudW1iZXJQcm90b2NvbHMuaW5jbHVkZXMocHJvdG9jb2wpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBvcnQgd2l0aCBudW1iZXIgJHtwb3J0Lm51bWJlcn0gYW5kIHByb3RvY29sICR7cG9ydC5wcm90b2NvbCB8fCBQcm90b2NvbC5UQ1B9IGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcG9ydHMucHVzaChwb3J0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfdG9LdWJlKCk6IGs4cy5Db250YWluZXIge1xuICAgIGNvbnN0IHZvbHVtZU1vdW50czogazhzLlZvbHVtZU1vdW50W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgbW91bnQgb2YgdGhpcy5tb3VudHMpIHtcbiAgICAgIHZvbHVtZU1vdW50cy5wdXNoKHtcbiAgICAgICAgbmFtZTogbW91bnQudm9sdW1lLm5hbWUsXG4gICAgICAgIG1vdW50UGF0aDogbW91bnQucGF0aCxcbiAgICAgICAgcmVhZE9ubHk6IG1vdW50LnJlYWRPbmx5LFxuICAgICAgICBtb3VudFByb3BhZ2F0aW9uOiBtb3VudC5wcm9wYWdhdGlvbixcbiAgICAgICAgc3ViUGF0aDogbW91bnQuc3ViUGF0aCxcbiAgICAgICAgc3ViUGF0aEV4cHI6IG1vdW50LnN1YlBhdGhFeHByLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydHMgPSBuZXcgQXJyYXk8azhzLkNvbnRhaW5lclBvcnQ+KCk7XG5cbiAgICBmb3IgKGNvbnN0IHBvcnQgb2YgdGhpcy5wb3J0cykge1xuICAgICAgcG9ydHMucHVzaCh7XG4gICAgICAgIGNvbnRhaW5lclBvcnQ6IHBvcnQubnVtYmVyLFxuICAgICAgICBwcm90b2NvbDogcG9ydC5wcm90b2NvbD8udG9TdHJpbmcoKSxcbiAgICAgICAgbmFtZTogcG9ydC5uYW1lLFxuICAgICAgICBob3N0UG9ydDogcG9ydC5ob3N0UG9ydCxcbiAgICAgICAgaG9zdElwOiBwb3J0Lmhvc3RJcCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlc291cmNlIHJlcXVlc3RzIGFuZCBsaW1pdHNcbiAgICBjb25zdCBjcHVMaW1pdCA9IHRoaXMucmVzb3VyY2VzPy5jcHU/LmxpbWl0Py5hbW91bnQ7XG4gICAgY29uc3QgY3B1UmVxdWVzdCA9IHRoaXMucmVzb3VyY2VzPy5jcHU/LnJlcXVlc3Q/LmFtb3VudDtcbiAgICBjb25zdCBtZW1vcnlMaW1pdCA9IHRoaXMucmVzb3VyY2VzPy5tZW1vcnk/LmxpbWl0O1xuICAgIGNvbnN0IG1lbW9yeVJlcXVlc3QgPSB0aGlzLnJlc291cmNlcz8ubWVtb3J5Py5yZXF1ZXN0O1xuICAgIGNvbnN0IGVwaGVtZXJhbFN0b3JhZ2VMaW1pdCA9IHRoaXMucmVzb3VyY2VzPy5lcGhlbWVyYWxTdG9yYWdlPy5saW1pdDtcbiAgICBjb25zdCBlcGhlbWVyYWxTdG9yYWdlUmVxdWVzdCA9IHRoaXMucmVzb3VyY2VzPy5lcGhlbWVyYWxTdG9yYWdlPy5yZXF1ZXN0O1xuXG4gICAgY29uc3QgbGltaXRzOiB7IFtrZXk6IHN0cmluZ106IGs4cy5RdWFudGl0eSB9ID0ge307XG4gICAgY29uc3QgcmVxdWVzdHM6IHsgW2tleTogc3RyaW5nXTogazhzLlF1YW50aXR5IH0gPSB7fTtcblxuICAgIGlmIChjcHVMaW1pdCkge1xuICAgICAgbGltaXRzLmNwdSA9IGs4cy5RdWFudGl0eS5mcm9tU3RyaW5nKGNwdUxpbWl0KTtcbiAgICB9XG4gICAgaWYgKG1lbW9yeUxpbWl0KSB7XG4gICAgICBsaW1pdHMubWVtb3J5ID0gazhzLlF1YW50aXR5LmZyb21TdHJpbmcobWVtb3J5TGltaXQudG9NZWJpYnl0ZXMoKS50b1N0cmluZygpICsgJ01pJyk7XG4gICAgfVxuICAgIGlmIChlcGhlbWVyYWxTdG9yYWdlTGltaXQpIHtcbiAgICAgIGxpbWl0c1snZXBoZW1lcmFsLXN0b3JhZ2UnXSA9IGs4cy5RdWFudGl0eS5mcm9tU3RyaW5nKGVwaGVtZXJhbFN0b3JhZ2VMaW1pdC50b0dpYmlieXRlcygpLnRvU3RyaW5nKCkgKyAnR2knKTtcbiAgICB9XG4gICAgaWYgKGNwdVJlcXVlc3QpIHtcbiAgICAgIHJlcXVlc3RzLmNwdSA9IGs4cy5RdWFudGl0eS5mcm9tU3RyaW5nKGNwdVJlcXVlc3QpO1xuICAgIH1cbiAgICBpZiAobWVtb3J5UmVxdWVzdCkge1xuICAgICAgcmVxdWVzdHMubWVtb3J5ID0gazhzLlF1YW50aXR5LmZyb21TdHJpbmcobWVtb3J5UmVxdWVzdC50b01lYmlieXRlcygpLnRvU3RyaW5nKCkgKyAnTWknKTtcbiAgICB9XG4gICAgaWYgKGVwaGVtZXJhbFN0b3JhZ2VSZXF1ZXN0KSB7XG4gICAgICByZXF1ZXN0c1snZXBoZW1lcmFsLXN0b3JhZ2UnXSA9IGs4cy5RdWFudGl0eS5mcm9tU3RyaW5nKGVwaGVtZXJhbFN0b3JhZ2VSZXF1ZXN0LnRvR2liaWJ5dGVzKCkudG9TdHJpbmcoKSArICdHaScpO1xuICAgIH1cblxuICAgIGxldCByZXNvdXJjZVJlcXVpcmVtZW50czogazhzLlJlc291cmNlUmVxdWlyZW1lbnRzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmIChPYmplY3Qua2V5cyhsaW1pdHMpLmxlbmd0aCA+IDAgfHwgT2JqZWN0LmtleXMocmVxdWVzdHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc291cmNlUmVxdWlyZW1lbnRzID0ge1xuICAgICAgICBsaW1pdHM6IHVuZGVmaW5lZElmRW1wdHkobGltaXRzKSxcbiAgICAgICAgcmVxdWVzdHM6IHVuZGVmaW5lZElmRW1wdHkocmVxdWVzdHMpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnYgPSB0aGlzLmVudi5fdG9LdWJlKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgaW1hZ2U6IHRoaXMuaW1hZ2UsXG4gICAgICBpbWFnZVB1bGxQb2xpY3k6IHRoaXMuaW1hZ2VQdWxsUG9saWN5LFxuICAgICAgcG9ydHM6IHVuZGVmaW5lZElmRW1wdHkocG9ydHMpLFxuICAgICAgdm9sdW1lTW91bnRzOiB1bmRlZmluZWRJZkVtcHR5KHZvbHVtZU1vdW50cyksXG4gICAgICBjb21tYW5kOiB0aGlzLmNvbW1hbmQsXG4gICAgICBhcmdzOiB0aGlzLmFyZ3MsXG4gICAgICB3b3JraW5nRGlyOiB0aGlzLndvcmtpbmdEaXIsXG4gICAgICBlbnY6IGVudi52YXJpYWJsZXMsXG4gICAgICBlbnZGcm9tOiBlbnYuZnJvbSxcbiAgICAgIHJlYWRpbmVzc1Byb2JlOiB0aGlzLl9yZWFkaW5lc3M/Ll90b0t1YmUodGhpcyksXG4gICAgICBsaXZlbmVzc1Byb2JlOiB0aGlzLl9saXZlbmVzcz8uX3RvS3ViZSh0aGlzKSxcbiAgICAgIHN0YXJ0dXBQcm9iZTogdGhpcy5fc3RhcnR1cD8uX3RvS3ViZSh0aGlzKSxcbiAgICAgIGxpZmVjeWNsZTogdGhpcy5fbGlmZWN5Y2xlID8ge1xuICAgICAgICBwb3N0U3RhcnQ6IHRoaXMuX2xpZmVjeWNsZS5wb3N0U3RhcnQ/Ll90b0t1YmUodGhpcyksXG4gICAgICAgIHByZVN0b3A6IHRoaXMuX2xpZmVjeWNsZS5wcmVTdG9wPy5fdG9LdWJlKHRoaXMpLFxuICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHJlc291cmNlczogcmVzb3VyY2VSZXF1aXJlbWVudHMsXG4gICAgICByZXN0YXJ0UG9saWN5OiB0aGlzLnJlc3RhcnRQb2xpY3ksXG4gICAgICBzZWN1cml0eUNvbnRleHQ6IHRoaXMuc2VjdXJpdHlDb250ZXh0Ll90b0t1YmUoKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgbW91bnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vdW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGhvdyBtb3VudHMgYXJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgaG9zdCB0byBjb250YWluZXIgYW5kIHRoZVxuICAgKiBvdGhlciB3YXkgYXJvdW5kLiBXaGVuIG5vdCBzZXQsIE1vdW50UHJvcGFnYXRpb25Ob25lIGlzIHVzZWQuXG4gICAqXG4gICAqIE1vdW50IHByb3BhZ2F0aW9uIGFsbG93cyBmb3Igc2hhcmluZyB2b2x1bWVzIG1vdW50ZWQgYnkgYSBDb250YWluZXIgdG9cbiAgICogb3RoZXIgQ29udGFpbmVycyBpbiB0aGUgc2FtZSBQb2QsIG9yIGV2ZW4gdG8gb3RoZXIgUG9kcyBvbiB0aGUgc2FtZSBub2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBNb3VudFByb3BhZ2F0aW9uLk5PTkVcbiAgICovXG4gIHJlYWRvbmx5IHByb3BhZ2F0aW9uPzogTW91bnRQcm9wYWdhdGlvbjtcblxuICAvKipcbiAgICogTW91bnRlZCByZWFkLW9ubHkgaWYgdHJ1ZSwgcmVhZC13cml0ZSBvdGhlcndpc2UgKGZhbHNlIG9yIHVuc3BlY2lmaWVkKS5cbiAgICogRGVmYXVsdHMgdG8gZmFsc2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSByZWFkT25seT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBhdGggd2l0aGluIHRoZSB2b2x1bWUgZnJvbSB3aGljaCB0aGUgY29udGFpbmVyJ3Mgdm9sdW1lIHNob3VsZCBiZSBtb3VudGVkLikuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiXCIgdGhlIHZvbHVtZSdzIHJvb3RcbiAgICovXG4gIHJlYWRvbmx5IHN1YlBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV4cGFuZGVkIHBhdGggd2l0aGluIHRoZSB2b2x1bWUgZnJvbSB3aGljaCB0aGUgY29udGFpbmVyJ3Mgdm9sdW1lIHNob3VsZCBiZVxuICAgKiBtb3VudGVkLiBCZWhhdmVzIHNpbWlsYXJseSB0byBTdWJQYXRoIGJ1dCBlbnZpcm9ubWVudCB2YXJpYWJsZSByZWZlcmVuY2VzXG4gICAqICQoVkFSX05BTUUpIGFyZSBleHBhbmRlZCB1c2luZyB0aGUgY29udGFpbmVyJ3MgZW52aXJvbm1lbnQuIERlZmF1bHRzIHRvIFwiXCJcbiAgICogKHZvbHVtZSdzIHJvb3QpLlxuICAgKlxuICAgKiBgc3ViUGF0aEV4cHJgIGFuZCBgc3ViUGF0aGAgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJcIiB2b2x1bWUncyByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgc3ViUGF0aEV4cHI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogTW91bnQgYSB2b2x1bWUgZnJvbSB0aGUgcG9kIHRvIHRoZSBjb250YWluZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVm9sdW1lTW91bnQgZXh0ZW5kcyBNb3VudE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHZvbHVtZSB0byBtb3VudC5cbiAgICovXG4gIHJlYWRvbmx5IHZvbHVtZTogdm9sdW1lLlZvbHVtZTtcblxuICAvKipcbiAgICogUGF0aCB3aXRoaW4gdGhlIGNvbnRhaW5lciBhdCB3aGljaCB0aGUgdm9sdW1lIHNob3VsZCBiZSBtb3VudGVkLiBNdXN0IG5vdFxuICAgKiBjb250YWluICc6Jy5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gTW91bnRQcm9wYWdhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGlzIHZvbHVtZSBtb3VudCB3aWxsIG5vdCByZWNlaXZlIGFueSBzdWJzZXF1ZW50IG1vdW50cyB0aGF0IGFyZSBtb3VudGVkXG4gICAqIHRvIHRoaXMgdm9sdW1lIG9yIGFueSBvZiBpdHMgc3ViZGlyZWN0b3JpZXMgYnkgdGhlIGhvc3QuIEluIHNpbWlsYXJcbiAgICogZmFzaGlvbiwgbm8gbW91bnRzIGNyZWF0ZWQgYnkgdGhlIENvbnRhaW5lciB3aWxsIGJlIHZpc2libGUgb24gdGhlIGhvc3QuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgbW9kZS5cbiAgICpcbiAgICogVGhpcyBtb2RlIGlzIGVxdWFsIHRvIGBwcml2YXRlYCBtb3VudCBwcm9wYWdhdGlvbiBhcyBkZXNjcmliZWQgaW4gdGhlIExpbnV4XG4gICAqIGtlcm5lbCBkb2N1bWVudGF0aW9uXG4gICAqL1xuICBOT05FID0gJ05vbmUnLFxuXG4gIC8qKlxuICAgKiBUaGlzIHZvbHVtZSBtb3VudCB3aWxsIHJlY2VpdmUgYWxsIHN1YnNlcXVlbnQgbW91bnRzIHRoYXQgYXJlIG1vdW50ZWQgdG9cbiAgICogdGhpcyB2b2x1bWUgb3IgYW55IG9mIGl0cyBzdWJkaXJlY3Rvcmllcy5cbiAgICpcbiAgICogSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBob3N0IG1vdW50cyBhbnl0aGluZyBpbnNpZGUgdGhlIHZvbHVtZSBtb3VudCwgdGhlXG4gICAqIENvbnRhaW5lciB3aWxsIHNlZSBpdCBtb3VudGVkIHRoZXJlLlxuICAgKlxuICAgKiBTaW1pbGFybHksIGlmIGFueSBQb2Qgd2l0aCBCaWRpcmVjdGlvbmFsIG1vdW50IHByb3BhZ2F0aW9uIHRvIHRoZSBzYW1lXG4gICAqIHZvbHVtZSBtb3VudHMgYW55dGhpbmcgdGhlcmUsIHRoZSBDb250YWluZXIgd2l0aCBIb3N0VG9Db250YWluZXIgbW91bnRcbiAgICogcHJvcGFnYXRpb24gd2lsbCBzZWUgaXQuXG4gICAqXG4gICAqIFRoaXMgbW9kZSBpcyBlcXVhbCB0byBgcnNsYXZlYCBtb3VudCBwcm9wYWdhdGlvbiBhcyBkZXNjcmliZWQgaW4gdGhlIExpbnV4XG4gICAqIGtlcm5lbCBkb2N1bWVudGF0aW9uXG4gICAqL1xuICBIT1NUX1RPX0NPTlRBSU5FUiA9ICdIb3N0VG9Db250YWluZXInLFxuXG4gIC8qKlxuICAgKiBUaGlzIHZvbHVtZSBtb3VudCBiZWhhdmVzIHRoZSBzYW1lIHRoZSBIb3N0VG9Db250YWluZXIgbW91bnQuIEluIGFkZGl0aW9uLFxuICAgKiBhbGwgdm9sdW1lIG1vdW50cyBjcmVhdGVkIGJ5IHRoZSBDb250YWluZXIgd2lsbCBiZSBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlXG4gICAqIGhvc3QgYW5kIHRvIGFsbCBDb250YWluZXJzIG9mIGFsbCBQb2RzIHRoYXQgdXNlIHRoZSBzYW1lIHZvbHVtZVxuICAgKlxuICAgKiBBIHR5cGljYWwgdXNlIGNhc2UgZm9yIHRoaXMgbW9kZSBpcyBhIFBvZCB3aXRoIGEgRmxleFZvbHVtZSBvciBDU0kgZHJpdmVyXG4gICAqIG9yIGEgUG9kIHRoYXQgbmVlZHMgdG8gbW91bnQgc29tZXRoaW5nIG9uIHRoZSBob3N0IHVzaW5nIGEgaG9zdFBhdGggdm9sdW1lLlxuICAgKlxuICAgKiBUaGlzIG1vZGUgaXMgZXF1YWwgdG8gYHJzaGFyZWRgIG1vdW50IHByb3BhZ2F0aW9uIGFzIGRlc2NyaWJlZCBpbiB0aGUgTGludXhcbiAgICoga2VybmVsIGRvY3VtZW50YXRpb25cbiAgICpcbiAgICogQ2F1dGlvbjogQmlkaXJlY3Rpb25hbCBtb3VudCBwcm9wYWdhdGlvbiBjYW4gYmUgZGFuZ2Vyb3VzLiBJdCBjYW4gZGFtYWdlXG4gICAqIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0gYW5kIHRoZXJlZm9yZSBpdCBpcyBhbGxvd2VkIG9ubHkgaW4gcHJpdmlsZWdlZFxuICAgKiBDb250YWluZXJzLiBGYW1pbGlhcml0eSB3aXRoIExpbnV4IGtlcm5lbCBiZWhhdmlvciBpcyBzdHJvbmdseSByZWNvbW1lbmRlZC5cbiAgICogSW4gYWRkaXRpb24sIGFueSB2b2x1bWUgbW91bnRzIGNyZWF0ZWQgYnkgQ29udGFpbmVycyBpbiBQb2RzIG11c3QgYmVcbiAgICogZGVzdHJveWVkICh1bm1vdW50ZWQpIGJ5IHRoZSBDb250YWluZXJzIG9uIHRlcm1pbmF0aW9uLlxuICAgKlxuICAgKi9cbiAgQklESVJFQ1RJT05BTCA9ICdCaWRpcmVjdGlvbmFsJyxcbn1cblxuLyoqXG4gKiBDUFUgYW5kIG1lbW9yeSBjb21wdXRlIHJlc291cmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lclJlc291cmNlcyB7XG4gIHJlYWRvbmx5IGNwdT86IENwdVJlc291cmNlcztcbiAgcmVhZG9ubHkgbWVtb3J5PzogTWVtb3J5UmVzb3VyY2VzO1xuICByZWFkb25seSBlcGhlbWVyYWxTdG9yYWdlPzogRXBoZW1lcmFsU3RvcmFnZVJlc291cmNlcztcbn1cblxuLyoqXG4gKiBDUFUgcmVxdWVzdCBhbmQgbGltaXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcHVSZXNvdXJjZXMge1xuICByZWFkb25seSByZXF1ZXN0PzogQ3B1O1xuICByZWFkb25seSBsaW1pdD86IENwdTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBhbW91bnQgb2YgQ1BVLlxuICogVGhlIGFtb3VudCBjYW4gYmUgcGFzc2VkIGFzIG1pbGxpcyBvciB1bml0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIENwdSB7XG4gIHN0YXRpYyBtaWxsaXMoYW1vdW50OiBudW1iZXIpOiBDcHUge1xuICAgIHJldHVybiBuZXcgQ3B1KGFtb3VudCArICdtJyk7XG4gIH1cbiAgc3RhdGljIHVuaXRzKGFtb3VudDogbnVtYmVyKTogQ3B1IHtcbiAgICByZXR1cm4gbmV3IENwdShhbW91bnQudG9TdHJpbmcoKSk7XG4gIH1cbiAgYW1vdW50OiBzdHJpbmc7XG4gIHByaXZhdGUgY29uc3RydWN0b3IoYW1vdW50OiBzdHJpbmcpIHtcbiAgICB0aGlzLmFtb3VudCA9IGFtb3VudDtcbiAgfVxufVxuXG4vKipcbiAqIE1lbW9yeSByZXF1ZXN0IGFuZCBsaW1pdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9yeVJlc291cmNlcyB7XG4gIHJlYWRvbmx5IHJlcXVlc3Q/OiBTaXplO1xuICByZWFkb25seSBsaW1pdD86IFNpemU7XG59XG5cbi8qKlxuICogRW1waGVtZXJhbCBzdG9yYWdlIHJlcXVlc3QgYW5kIGxpbWl0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXBoZW1lcmFsU3RvcmFnZVJlc291cmNlcyB7XG4gIHJlYWRvbmx5IHJlcXVlc3Q/OiBTaXplO1xuICByZWFkb25seSBsaW1pdD86IFNpemU7XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGVudiB2YXJpYWJsZXMgZGVmaW5lZCBpbiBvdGhlciByZXNvdXJjZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnZGcm9tIHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ01hcD86IGNvbmZpZ21hcC5JQ29uZmlnTWFwLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJlZml4Pzogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VjPzogc2VjcmV0LklTZWNyZXQpIHsgfTtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3RvS3ViZSgpOiBrOHMuRW52RnJvbVNvdXJjZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbmZpZ01hcFJlZjogdGhpcy5jb25maWdNYXAgPyB7XG4gICAgICAgIG5hbWU6IHRoaXMuY29uZmlnTWFwLm5hbWUsXG4gICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgc2VjcmV0UmVmOiB0aGlzLnNlYyA/IHtcbiAgICAgICAgbmFtZTogdGhpcy5zZWMubmFtZSxcbiAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICBwcmVmaXg6IHRoaXMucHJlZml4LFxuICAgIH07XG4gIH1cblxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdENvbnRhaW5lclBvcnRzKHNlbGVjdG9yPzogYW55KTogQ29udGFpbmVyUG9ydFtdIHtcblxuICBpZiAoIXNlbGVjdG9yKSB7IHJldHVybiBbXTsgfVxuXG4gIC8vIHdlIGRvbid0IHVzZSBpbnN0YW5jZW9mIGludGVudGlvbmFsbHkgc2luY2UgaXQgY2FuIGNyZWF0ZVxuICAvLyBjeWNsaWMgaW1wb3J0IHByb2JsZW1zLlxuICBjb25zdCBjb250YWluZXJzOiBDb250YWluZXJbXSA9IChzZWxlY3RvciBhcyBhbnkpLmNvbnRhaW5lcnMgPz8gW107XG5cbiAgcmV0dXJuIGNvbnRhaW5lcnMuZmxhdE1hcChjID0+IGMucG9ydHMpO1xufVxuXG4vKipcbiAqIENvbnRhaW5lciBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnYge1xuXG4gIC8qKlxuICAgKiBTZWxlY3RzIGEgQ29uZmlnTWFwIHRvIHBvcHVsYXRlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2l0aC5cbiAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSB0YXJnZXQgQ29uZmlnTWFwJ3MgRGF0YSBmaWVsZCB3aWxsIHJlcHJlc2VudFxuICAgKiB0aGUga2V5LXZhbHVlIHBhaXJzIGFzIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUNvbmZpZ01hcChjb25maWdNYXA6IGNvbmZpZ21hcC5JQ29uZmlnTWFwLCBwcmVmaXg/OiBzdHJpbmcpOiBFbnZGcm9tIHtcbiAgICByZXR1cm4gbmV3IEVudkZyb20oY29uZmlnTWFwLCBwcmVmaXgsIHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBhIFNlY3JldCB0byBwb3B1bGF0ZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpdGguXG4gICAqIFRoZSBjb250ZW50cyBvZiB0aGUgdGFyZ2V0IFNlY3JldCdzIERhdGEgZmllbGQgd2lsbCByZXByZXNlbnRcbiAgICogdGhlIGtleS12YWx1ZSBwYWlycyBhcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21TZWNyZXQoc2Vjcjogc2VjcmV0LklTZWNyZXQpOiBFbnZGcm9tIHtcbiAgICByZXR1cm4gbmV3IEVudkZyb20odW5kZWZpbmVkLCB1bmRlZmluZWQsIHNlY3IpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc291cmNlczogRW52RnJvbVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IF92YXJpYWJsZXM6IHsgW2tleTogc3RyaW5nXTogRW52VmFsdWUgfTtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc291cmNlczogRW52RnJvbVtdLCB2YXJpYWJsZXM6IHsgW25hbWU6IHN0cmluZ106IEVudlZhbHVlIH0pIHtcbiAgICB0aGlzLl9zb3VyY2VzID0gc291cmNlcztcbiAgICB0aGlzLl92YXJpYWJsZXMgPSB2YXJpYWJsZXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgc2luZ2xlIHZhcmlhYmxlIGJ5IG5hbWUgYW5kIHZhbHVlLlxuICAgKiBUaGUgdmFyaWFibGUgdmFsdWUgY2FuIGNvbWUgZnJvbSB2YXJpb3VzIGR5bmFtaWMgc291cmNlcyBzdWNoIGEgc2VjcmV0cyBvZiBjb25maWcgbWFwcy5cbiAgICogVXNlIGBFbnZWYWx1ZS5mcm9tWFhYYCB0byBzZWxlY3Qgc291cmNlcy5cbiAgICovXG4gIHB1YmxpYyBhZGRWYXJpYWJsZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBFbnZWYWx1ZSkge1xuICAgIHRoaXMuX3ZhcmlhYmxlc1tuYW1lXSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoaXMgY29udGFpbmVyLlxuICAgKiBSZXR1cm5zIGEgY29weS4gVG8gYWRkIGVudmlyb25tZW50IHZhcmlhYmxlcyB1c2UgYGNvbnRhaW5lci5lbnYuYWRkVmFyaWFibGUoKWAuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhcmlhYmxlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBFbnZWYWx1ZSB9IHtcbiAgICByZXR1cm4geyAuLi50aGlzLl92YXJpYWJsZXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb2xsZWN0aW9uIG9mIHZhcmlhYmxlcyBieSBjb3B5aW5nIGZyb20gYW5vdGhlciBzb3VyY2UuXG4gICAqIFVzZSBgRW52LmZyb21YWFhgIGZ1bmN0aW9ucyB0byBzZWxlY3Qgc291cmNlcy5cbiAgICovXG4gIHB1YmxpYyBjb3B5RnJvbShmcm9tOiBFbnZGcm9tKSB7XG4gICAgdGhpcy5fc291cmNlcy5wdXNoKGZyb20pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHNvdXJjZXMgdXNlZCB0byBwb3B1bGF0ZSB0aGUgY29udGFpbmVyIGVudmlyb25tZW50LFxuICAgKiBpbiBhZGRpdGlvbiB0byB0aGUgYHZhcmlhYmxlc2AuXG4gICAqXG4gICAqIFJldHVybnMgYSBjb3B5LiBUbyBhZGQgYSBzb3VyY2UgdXNlIGBjb250YWluZXIuZW52LmNvcHlGcm9tKClgLlxuICAgKi9cbiAgcHVibGljIGdldCBzb3VyY2VzKCk6IEVudkZyb21bXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9zb3VyY2VzXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyRW52KGVudjogeyBbbmFtZTogc3RyaW5nXTogRW52VmFsdWUgfSk6IGs4cy5FbnZWYXJbXSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PGs4cy5FbnZWYXI+KCk7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdl0gb2YgT2JqZWN0LmVudHJpZXMoZW52KSkge1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICBuYW1lLFxuICAgICAgICB2YWx1ZTogdi52YWx1ZSxcbiAgICAgICAgdmFsdWVGcm9tOiB2LnZhbHVlRnJvbSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF90b0t1YmUoKTogeyB2YXJpYWJsZXM/OiBrOHMuRW52VmFyW107IGZyb20/OiBrOHMuRW52RnJvbVNvdXJjZVtdIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBmcm9tOiB1bmRlZmluZWRJZkVtcHR5KHRoaXMuX3NvdXJjZXMubWFwKHMgPT4gcy5fdG9LdWJlKCkpKSxcbiAgICAgIHZhcmlhYmxlczogdW5kZWZpbmVkSWZFbXB0eSh0aGlzLnJlbmRlckVudih0aGlzLl92YXJpYWJsZXMpKSxcbiAgICB9O1xuICB9XG59XG4iXX0=