@dbx-tools/shared-core 0.9.40 → 0.9.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/index.ts +5 -1
- package/lib/index.d.ts +5 -1
- package/lib/index.js +5 -2
- package/lib/src/bindings.d.ts +10 -0
- package/lib/src/bindings.js +15 -0
- package/lib/src/environment-utils.js +3 -3
- package/lib/src/log.d.ts +2 -0
- package/lib/src/log.js +2 -2
- package/lib/src/options.d.ts +120 -0
- package/lib/src/options.js +310 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +17 -2
- package/src/bindings.ts +17 -0
- package/src/environment-utils.ts +7 -6
- package/src/log.ts +1 -1
- package/src/options.ts +482 -0
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-safe option primitives shared across dbx-tools packages.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { isLoopbackHost, urlBuilder } from "./net.js";
|
|
8
|
+
import { isRecord, toBoolean } from "./object.js";
|
|
9
|
+
import { parseList, toIdentifierWithOptions, toSlug } from "./string-utils.js";
|
|
10
|
+
const environmentName = (name, description) => z.literal(name).default(name).describe(description);
|
|
11
|
+
export const DatabricksEnvironmentNamesSchema = z
|
|
12
|
+
.object({
|
|
13
|
+
profile: environmentName("DATABRICKS_CONFIG_PROFILE", "Databricks CLI profile environment."),
|
|
14
|
+
host: environmentName("DATABRICKS_HOST", "Databricks host environment."),
|
|
15
|
+
accountId: environmentName("DATABRICKS_ACCOUNT_ID", "Databricks account ID environment."),
|
|
16
|
+
workspaceId: environmentName("DATABRICKS_WORKSPACE_ID", "Databricks workspace ID environment."),
|
|
17
|
+
configFile: environmentName("DATABRICKS_CONFIG_FILE", "Databricks CLI config file environment."),
|
|
18
|
+
clientId: environmentName("DATABRICKS_CLIENT_ID", "Databricks OAuth client ID environment."),
|
|
19
|
+
clientSecret: environmentName("DATABRICKS_CLIENT_SECRET", "Databricks OAuth client secret environment."),
|
|
20
|
+
accessToken: environmentName("DATABRICKS_TOKEN", "Databricks access token environment."),
|
|
21
|
+
groupId: environmentName("DATABRICKS_GROUP_ID", "Databricks group ID environment."),
|
|
22
|
+
authType: environmentName("DATABRICKS_AUTH_TYPE", "Databricks auth type environment."),
|
|
23
|
+
appName: environmentName("DATABRICKS_APP_NAME", "Databricks App name environment."),
|
|
24
|
+
appPort: environmentName("DATABRICKS_APP_PORT", "Databricks App port environment."),
|
|
25
|
+
lakebaseEndpoint: environmentName("LAKEBASE_ENDPOINT", "Lakebase endpoint environment."),
|
|
26
|
+
})
|
|
27
|
+
.strict()
|
|
28
|
+
.describe("Canonical Databricks CLI, SDK, Apps, and Lakebase environment names.");
|
|
29
|
+
/** Canonical Databricks environment names derived from the owning schema. */
|
|
30
|
+
export const databricksEnvironmentNames = Object.freeze(DatabricksEnvironmentNamesSchema.parse({}));
|
|
31
|
+
/** Highest valid TCP port number. */
|
|
32
|
+
export const MAX_TCP_PORT = 65_535;
|
|
33
|
+
export const tcpPortSchema = z.coerce
|
|
34
|
+
.number()
|
|
35
|
+
.int()
|
|
36
|
+
.min(1)
|
|
37
|
+
.max(MAX_TCP_PORT)
|
|
38
|
+
.describe("TCP port from 1 through 65535.");
|
|
39
|
+
export const tcpPortOrZeroSchema = z.coerce
|
|
40
|
+
.number()
|
|
41
|
+
.int()
|
|
42
|
+
.min(0)
|
|
43
|
+
.max(MAX_TCP_PORT)
|
|
44
|
+
.describe("TCP port from 0 through 65535, where zero requests automatic allocation.");
|
|
45
|
+
export const normalizedUrlSchema = z
|
|
46
|
+
.string()
|
|
47
|
+
.trim()
|
|
48
|
+
.min(1)
|
|
49
|
+
.refine((value) => urlBuilder(value) !== undefined, {
|
|
50
|
+
message: "Expected a valid URL or host.",
|
|
51
|
+
})
|
|
52
|
+
.overwrite(normalizeUrl)
|
|
53
|
+
.describe("URL normalized through the shared URL builder.");
|
|
54
|
+
const databricksText = (description) => z.string().trim().min(1).optional().describe(description);
|
|
55
|
+
const databricksOptionMeta = (env, flag = true) => ({
|
|
56
|
+
env,
|
|
57
|
+
flag,
|
|
58
|
+
helpDefault: false,
|
|
59
|
+
});
|
|
60
|
+
export const DatabricksOptionsSchema = z
|
|
61
|
+
.object({
|
|
62
|
+
profile: databricksText("Databricks CLI profile.").meta(databricksOptionMeta(databricksEnvironmentNames.profile)),
|
|
63
|
+
host: normalizedUrlSchema
|
|
64
|
+
.optional()
|
|
65
|
+
.describe("Databricks host.")
|
|
66
|
+
.meta(databricksOptionMeta(databricksEnvironmentNames.host, false)),
|
|
67
|
+
accountId: databricksText("Databricks account ID.").meta(databricksOptionMeta(databricksEnvironmentNames.accountId, false)),
|
|
68
|
+
workspaceId: databricksText("Databricks workspace ID.").meta(databricksOptionMeta(databricksEnvironmentNames.workspaceId, false)),
|
|
69
|
+
configFile: databricksText("Databricks CLI config file.").meta(databricksOptionMeta(databricksEnvironmentNames.configFile, false)),
|
|
70
|
+
clientId: databricksText("Databricks OAuth client ID.").meta(databricksOptionMeta(databricksEnvironmentNames.clientId, false)),
|
|
71
|
+
clientSecret: databricksText("Databricks OAuth client secret.").meta(databricksOptionMeta(databricksEnvironmentNames.clientSecret, false)),
|
|
72
|
+
accessToken: databricksText("Databricks access token.").meta(databricksOptionMeta(databricksEnvironmentNames.accessToken, false)),
|
|
73
|
+
groupId: databricksText("Databricks group ID.").meta(databricksOptionMeta(databricksEnvironmentNames.groupId, false)),
|
|
74
|
+
authType: databricksText("Databricks authentication type.").meta(databricksOptionMeta(databricksEnvironmentNames.authType, false)),
|
|
75
|
+
appName: databricksText("Databricks App name.").meta(databricksOptionMeta(databricksEnvironmentNames.appName, false)),
|
|
76
|
+
appPort: tcpPortSchema
|
|
77
|
+
.optional()
|
|
78
|
+
.describe("Databricks App port.")
|
|
79
|
+
.meta(databricksOptionMeta(databricksEnvironmentNames.appPort, false)),
|
|
80
|
+
lakebaseEndpoint: databricksText("Lakebase endpoint.").meta(databricksOptionMeta(databricksEnvironmentNames.lakebaseEndpoint, false)),
|
|
81
|
+
})
|
|
82
|
+
.strict()
|
|
83
|
+
.describe("Common Databricks CLI, SDK, Apps, and Lakebase options.");
|
|
84
|
+
/** Serialize complete parsed options as JSON keyed by flags or environment names. */
|
|
85
|
+
export function serializeOpts(schema, values, format) {
|
|
86
|
+
return JSON.stringify(serializedOpts(schema, values, format), null, 2);
|
|
87
|
+
}
|
|
88
|
+
/** Serialize complete parsed options as a process environment map. */
|
|
89
|
+
export function serializeOptsEnvironment(schema, values) {
|
|
90
|
+
return Object.fromEntries(Object.entries(serializedOpts(schema, values, "env")).map(([key, value]) => [
|
|
91
|
+
key,
|
|
92
|
+
environmentOptionValue(value),
|
|
93
|
+
]));
|
|
94
|
+
}
|
|
95
|
+
/** Namespace a reusable option schema so composed CLI flags render as `--<namespace>-<field>`. */
|
|
96
|
+
export function namespaceOpts(schema, prefix) {
|
|
97
|
+
const shape = Object.fromEntries(Object.entries(schema.shape).map(([key, field]) => [namespacedOptionKey(prefix, key), field]));
|
|
98
|
+
return z.object(shape).strict();
|
|
99
|
+
}
|
|
100
|
+
/** Parse namespaced option values back through their owning schema. */
|
|
101
|
+
export function unnamespaceOpts(schema, values, prefix) {
|
|
102
|
+
const source = values;
|
|
103
|
+
return schema.parse(Object.fromEntries(Object.keys(schema.shape).map((key) => [key, source[namespacedOptionKey(prefix, key)]])));
|
|
104
|
+
}
|
|
105
|
+
function namespacedOptionKey(prefix, key) {
|
|
106
|
+
return `${prefix}${key.charAt(0).toUpperCase()}${key.slice(1)}`;
|
|
107
|
+
}
|
|
108
|
+
function serializedOpts(schema, values, format) {
|
|
109
|
+
const parsed = schema.parse(values);
|
|
110
|
+
const entries = optionProperties(schema).flatMap((property) => {
|
|
111
|
+
if (format === "flag" && property.flag === false)
|
|
112
|
+
return [];
|
|
113
|
+
const key = format === "flag"
|
|
114
|
+
? `--${toSlug(property.key)}`
|
|
115
|
+
: (optionEnvironmentNames(property.key, property.env)[0] ?? "");
|
|
116
|
+
if (!key)
|
|
117
|
+
return [];
|
|
118
|
+
const value = parsed[property.key];
|
|
119
|
+
return value === undefined ? [] : [[key, serializedOptionValue(value)]];
|
|
120
|
+
});
|
|
121
|
+
return Object.fromEntries(entries);
|
|
122
|
+
}
|
|
123
|
+
const optionalText = (description, env) => z.string().trim().min(1).optional().describe(description).meta({ env, flag: false });
|
|
124
|
+
export const LakebaseOptionsSchema = z
|
|
125
|
+
.object({
|
|
126
|
+
lakebaseEndpoint: optionalText("Lakebase project, resource path, host, or URL.", databricksEnvironmentNames.lakebaseEndpoint),
|
|
127
|
+
})
|
|
128
|
+
.strict()
|
|
129
|
+
.describe("Common Lakebase options.");
|
|
130
|
+
/** Parse only supplied flag and environment values through an owning Zod object schema. */
|
|
131
|
+
export function parseOpts(schema, flags = null, environment = null) {
|
|
132
|
+
const configured = optionValues(schema, flags, environment);
|
|
133
|
+
const parsed = schema.parse(configured);
|
|
134
|
+
return Object.fromEntries(Object.keys(configured).map((key) => [key, parsed[key]]));
|
|
135
|
+
}
|
|
136
|
+
/** Build a transport-aware listener schema. Bare addresses use the configured default scheme. */
|
|
137
|
+
export function listenAddressSchema(options) {
|
|
138
|
+
const defaults = {
|
|
139
|
+
scheme: "tcp",
|
|
140
|
+
host: options.host ?? "localhost",
|
|
141
|
+
port: options.port,
|
|
142
|
+
};
|
|
143
|
+
const allowed = new Set(options.schemes ?? ["tcp"]);
|
|
144
|
+
const schema = z
|
|
145
|
+
.preprocess((value) => parseListenAddress(value, defaults, options.scheme ?? "tcp"), z.discriminatedUnion("scheme", [
|
|
146
|
+
z
|
|
147
|
+
.object({
|
|
148
|
+
scheme: z.literal("tcp"),
|
|
149
|
+
host: z.string().trim().toLowerCase().min(1).default(defaults.host),
|
|
150
|
+
port: tcpPortOrZeroSchema.default(defaults.port),
|
|
151
|
+
})
|
|
152
|
+
.strict(),
|
|
153
|
+
z
|
|
154
|
+
.object({
|
|
155
|
+
scheme: z.literal("unix"),
|
|
156
|
+
path: z.string().trim().min(1),
|
|
157
|
+
})
|
|
158
|
+
.strict(),
|
|
159
|
+
]))
|
|
160
|
+
.refine((address) => allowed.has(address.scheme), "Listener scheme is not allowed.")
|
|
161
|
+
.refine((address) => address.scheme !== "tcp" || !options.loopback || isLoopbackHost(address.host), "Listener host must be loopback.")
|
|
162
|
+
.describe("TCP or Unix-domain listener address.");
|
|
163
|
+
return options.withDefault === false ? schema : schema.default(defaults);
|
|
164
|
+
}
|
|
165
|
+
/** Render a listener address as a `tcp://` or `unix://` URL. */
|
|
166
|
+
export function formatListenAddress(address) {
|
|
167
|
+
if (address.scheme === "unix") {
|
|
168
|
+
return `unix://${address.path.startsWith("/") ? "" : "/"}${address.path}`;
|
|
169
|
+
}
|
|
170
|
+
const host = address.host.includes(":") ? `[${address.host}]` : address.host;
|
|
171
|
+
return `tcp://${host}:${address.port}`;
|
|
172
|
+
}
|
|
173
|
+
function parseListenAddress(value, defaults, defaultScheme) {
|
|
174
|
+
if (isRecord(value) && value.scheme === undefined) {
|
|
175
|
+
if (typeof value.host === "string" && value.port !== undefined) {
|
|
176
|
+
return { ...value, scheme: "tcp" };
|
|
177
|
+
}
|
|
178
|
+
if (typeof value.path === "string") {
|
|
179
|
+
return { ...value, scheme: "unix" };
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (typeof value === "number") {
|
|
183
|
+
return defaultScheme === "tcp"
|
|
184
|
+
? { scheme: "tcp", host: defaults.host, port: value }
|
|
185
|
+
: { scheme: "unix", path: String(value) };
|
|
186
|
+
}
|
|
187
|
+
if (typeof value !== "string")
|
|
188
|
+
return value;
|
|
189
|
+
const text = value.trim();
|
|
190
|
+
if (text.startsWith("unix://")) {
|
|
191
|
+
const path = text.slice("unix://".length);
|
|
192
|
+
return { scheme: "unix", path: path.startsWith("/") ? path : `/${path}` };
|
|
193
|
+
}
|
|
194
|
+
const tcp = text.startsWith("tcp://") ? text.slice("tcp://".length) : text;
|
|
195
|
+
if (defaultScheme === "unix" && !text.startsWith("tcp://")) {
|
|
196
|
+
return { scheme: "unix", path: text };
|
|
197
|
+
}
|
|
198
|
+
if (/^\d+$/.test(tcp))
|
|
199
|
+
return { scheme: "tcp", host: defaults.host, port: tcp };
|
|
200
|
+
if (/^:\d+$/.test(tcp)) {
|
|
201
|
+
return { scheme: "tcp", host: defaults.host, port: tcp.slice(1) };
|
|
202
|
+
}
|
|
203
|
+
const bracketed = tcp.match(/^\[([^\]]+)\](?::(\d+))?$/);
|
|
204
|
+
if (bracketed) {
|
|
205
|
+
return {
|
|
206
|
+
scheme: "tcp",
|
|
207
|
+
host: bracketed[1],
|
|
208
|
+
port: bracketed[2] ?? defaults.port,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
const separator = tcp.lastIndexOf(":");
|
|
212
|
+
if (separator > 0 && !tcp.slice(0, separator).includes(":")) {
|
|
213
|
+
return {
|
|
214
|
+
scheme: "tcp",
|
|
215
|
+
host: tcp.slice(0, separator),
|
|
216
|
+
port: tcp.slice(separator + 1),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
return { scheme: "tcp", host: tcp || defaults.host, port: defaults.port };
|
|
220
|
+
}
|
|
221
|
+
function optionProperties(schema) {
|
|
222
|
+
const document = z.toJSONSchema(schema);
|
|
223
|
+
if (!isRecord(document.properties))
|
|
224
|
+
return [];
|
|
225
|
+
return Object.entries(document.properties).flatMap(([key, value]) => {
|
|
226
|
+
if (!isRecord(value))
|
|
227
|
+
return [];
|
|
228
|
+
return [
|
|
229
|
+
{
|
|
230
|
+
key,
|
|
231
|
+
type: typeof value.type === "string" ? value.type : undefined,
|
|
232
|
+
env: typeof value.env === "string" || Array.isArray(value.env)
|
|
233
|
+
? value.env
|
|
234
|
+
: undefined,
|
|
235
|
+
flag: typeof value.flag === "boolean" ? value.flag : undefined,
|
|
236
|
+
},
|
|
237
|
+
];
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
function serializedOptionValue(value) {
|
|
241
|
+
if (isRecord(value) && value.scheme === "tcp") {
|
|
242
|
+
if (typeof value.host === "string" && typeof value.port === "number") {
|
|
243
|
+
return formatListenAddress({ scheme: "tcp", host: value.host, port: value.port });
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
if (isRecord(value) && value.scheme === "unix" && typeof value.path === "string") {
|
|
247
|
+
return formatListenAddress({ scheme: "unix", path: value.path });
|
|
248
|
+
}
|
|
249
|
+
return value;
|
|
250
|
+
}
|
|
251
|
+
function environmentOptionValue(value) {
|
|
252
|
+
if (Array.isArray(value))
|
|
253
|
+
return value.map(String).join(",");
|
|
254
|
+
if (typeof value === "object" && value !== null)
|
|
255
|
+
return JSON.stringify(value);
|
|
256
|
+
return String(value);
|
|
257
|
+
}
|
|
258
|
+
function optionValues(schema, values, environment) {
|
|
259
|
+
const document = z.toJSONSchema(schema);
|
|
260
|
+
const properties = isRecord(document.properties) ? document.properties : {};
|
|
261
|
+
const configured = {};
|
|
262
|
+
for (const [key, property] of Object.entries(properties)) {
|
|
263
|
+
if (!isRecord(property))
|
|
264
|
+
continue;
|
|
265
|
+
const explicit = firstOptionValue(values, [key, `--${toSlug(key)}`]);
|
|
266
|
+
if (explicit !== undefined) {
|
|
267
|
+
configured[key] = optionEnvironmentValue(property.type, explicit);
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
const names = optionEnvironmentNames(key, property.env);
|
|
271
|
+
const sourced = firstOptionValue(environment, names);
|
|
272
|
+
if (sourced === undefined)
|
|
273
|
+
continue;
|
|
274
|
+
configured[key] = optionEnvironmentValue(property.type, sourced);
|
|
275
|
+
}
|
|
276
|
+
return configured;
|
|
277
|
+
}
|
|
278
|
+
function optionEnvironmentNames(key, configured) {
|
|
279
|
+
if (typeof configured === "string")
|
|
280
|
+
return [configured];
|
|
281
|
+
if (Array.isArray(configured)) {
|
|
282
|
+
return configured.filter((value) => typeof value === "string");
|
|
283
|
+
}
|
|
284
|
+
return [toIdentifierWithOptions({ delimiter: "_" }, key).toUpperCase()];
|
|
285
|
+
}
|
|
286
|
+
function optionEnvironmentValue(type, value) {
|
|
287
|
+
if (type === "boolean")
|
|
288
|
+
return toBoolean(value) ?? value;
|
|
289
|
+
if (type === "array" && typeof value === "string")
|
|
290
|
+
return parseList(value);
|
|
291
|
+
return value;
|
|
292
|
+
}
|
|
293
|
+
function firstOptionValue(source, keys) {
|
|
294
|
+
if (!source)
|
|
295
|
+
return undefined;
|
|
296
|
+
for (const key of keys) {
|
|
297
|
+
const value = source[key];
|
|
298
|
+
if (value !== undefined && value !== null && value !== "")
|
|
299
|
+
return value;
|
|
300
|
+
}
|
|
301
|
+
return undefined;
|
|
302
|
+
}
|
|
303
|
+
function normalizeUrl(value) {
|
|
304
|
+
const url = urlBuilder(value);
|
|
305
|
+
if (!url)
|
|
306
|
+
return value;
|
|
307
|
+
const normalized = url.toString();
|
|
308
|
+
return url.pathname === "/" && !url.search && !url.hash ? normalized.slice(0, -1) : normalized;
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFL0UsTUFBTSxlQUFlLEdBQUcsQ0FBbUIsSUFBTyxFQUFFLFdBQW1CLEVBQUUsRUFBRSxDQUN6RSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsQ0FBQztLQUM5QyxNQUFNLENBQUM7SUFDTixPQUFPLEVBQUUsZUFBZSxDQUFDLDJCQUEyQixFQUFFLHFDQUFxQyxDQUFDO0lBQzVGLElBQUksRUFBRSxlQUFlLENBQUMsaUJBQWlCLEVBQUUsOEJBQThCLENBQUM7SUFDeEUsU0FBUyxFQUFFLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxvQ0FBb0MsQ0FBQztJQUN6RixXQUFXLEVBQUUsZUFBZSxDQUFDLHlCQUF5QixFQUFFLHNDQUFzQyxDQUFDO0lBQy9GLFVBQVUsRUFBRSxlQUFlLENBQ3pCLHdCQUF3QixFQUN4Qix5Q0FBeUMsQ0FDMUM7SUFDRCxRQUFRLEVBQUUsZUFBZSxDQUFDLHNCQUFzQixFQUFFLHlDQUF5QyxDQUFDO0lBQzVGLFlBQVksRUFBRSxlQUFlLENBQzNCLDBCQUEwQixFQUMxQiw2Q0FBNkMsQ0FDOUM7SUFDRCxXQUFXLEVBQUUsZUFBZSxD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QUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUM1RSxDQUFDO0lBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMzRSxJQUFJLGFBQWEsS0FBSyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2hGLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLEdB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LE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzRSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLE1BQXNCLEVBQUUsSUFBdUI7SUFDdkUsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM5QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFFLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBYTtJQUNqQyxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsSUFBSSxDQUFDLEdBQUc7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN2QixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEMsT0FBTyxHQUFHLENBQUMsUUFBUSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7QUFDakcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnJvd3Nlci1zYWZlIG9wdGlvbiBwcmltaXRpdmVzIHNoYXJlZCBhY3Jvc3MgZGJ4LXRvb2xzIHBhY2thZ2VzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgaXNMb29wYmFja0hvc3QsIHVybEJ1aWxkZXIgfSBmcm9tIFwiLi9uZXQudHNcIjtcbmltcG9ydCB7IGlzUmVjb3JkLCB0b0Jvb2xlYW4gfSBmcm9tIFwiLi9vYmplY3QudHNcIjtcbmltcG9ydCB7IHBhcnNlTGlzdCwgdG9JZGVudGlmaWVyV2l0aE9wdGlvbnMsIHRvU2x1ZyB9IGZyb20gXCIuL3N0cmluZy11dGlscy50c1wiO1xuXG5jb25zdCBlbnZpcm9ubWVudE5hbWUgPSA8VCBleHRlbmRzIHN0cmluZz4obmFtZTogVCwgZGVzY3JpcHRpb246IHN0cmluZykgPT5cbiAgei5saXRlcmFsKG5hbWUpLmRlZmF1bHQobmFtZSkuZGVzY3JpYmUoZGVzY3JpcHRpb24pO1xuXG5leHBvcnQgY29uc3QgRGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXNTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHByb2ZpbGU6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfQ09ORklHX1BST0ZJTEVcIiwgXCJEYXRhYnJpY2tzIENMSSBwcm9maWxlIGVudmlyb25tZW50LlwiKSxcbiAgICBob3N0OiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0hPU1RcIiwgXCJEYXRhYnJpY2tzIGhvc3QgZW52aXJvbm1lbnQuXCIpLFxuICAgIGFjY291bnRJZDogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19BQ0NPVU5UX0lEXCIsIFwiRGF0YWJyaWNrcyBhY2NvdW50IElEIGVudmlyb25tZW50LlwiKSxcbiAgICB3b3Jrc3BhY2VJZDogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19XT1JLU1BBQ0VfSURcIiwgXCJEYXRhYnJpY2tzIHdvcmtzcGFjZSBJRCBlbnZpcm9ubWVudC5cIiksXG4gICAgY29uZmlnRmlsZTogZW52aXJvbm1lbnROYW1lKFxuICAgICAgXCJEQVRBQlJJQ0tTX0NPTkZJR19GSUxFXCIsXG4gICAgICBcIkRhdGFicmlja3MgQ0xJIGNvbmZpZyBmaWxlIGVudmlyb25tZW50LlwiLFxuICAgICksXG4gICAgY2xpZW50SWQ6IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfQ0xJRU5UX0lEXCIsIFwiRGF0YWJyaWNrcyBPQXV0aCBjbGllbnQgSUQgZW52aXJvbm1lbnQuXCIpLFxuICAgIGNsaWVudFNlY3JldDogZW52aXJvbm1lbnROYW1lKFxuICAgICAgXCJEQVRBQlJJQ0tTX0NMSUVOVF9TRUNSRVRcIixcbiAgICAgIFwiRGF0YWJyaWNrcyBPQXV0aCBjbGllbnQgc2VjcmV0IGVudmlyb25tZW50LlwiLFxuICAgICksXG4gICAgYWNjZXNzVG9rZW46IGVudmlyb25tZW50TmFtZShcIkRBVEFCUklDS1NfVE9LRU5cIiwgXCJEYXRhYnJpY2tzIGFjY2VzcyB0b2tlbiBlbnZpcm9ubWVudC5cIiksXG4gICAgZ3JvdXBJZDogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19HUk9VUF9JRFwiLCBcIkRhdGFicmlja3MgZ3JvdXAgSUQgZW52aXJvbm1lbnQuXCIpLFxuICAgIGF1dGhUeXBlOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0FVVEhfVFlQRVwiLCBcIkRhdGFicmlja3MgYXV0aCB0eXBlIGVudmlyb25tZW50LlwiKSxcbiAgICBhcHBOYW1lOiBlbnZpcm9ubWVudE5hbWUoXCJEQVRBQlJJQ0tTX0FQUF9OQU1FXCIsIFwiRGF0YWJyaWNrcyBBcHAgbmFtZSBlbnZpcm9ubWVudC5cIiksXG4gICAgYXBwUG9ydDogZW52aXJvbm1lbnROYW1lKFwiREFUQUJSSUNLU19BUFBfUE9SVFwiLCBcIkRhdGFicmlja3MgQXBwIHBvcnQgZW52aXJvbm1lbnQuXCIpLFxuICAgIGxha2ViYXNlRW5kcG9pbnQ6IGVudmlyb25tZW50TmFtZShcIkxBS0VCQVNFX0VORFBPSU5UXCIsIFwiTGFrZWJhc2UgZW5kcG9pbnQgZW52aXJvbm1lbnQuXCIpLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFwiQ2Fub25pY2FsIERhdGFicmlja3MgQ0xJLCBTREssIEFwcHMsIGFuZCBMYWtlYmFzZSBlbnZpcm9ubWVudCBuYW1lcy5cIik7XG5cbmV4cG9ydCB0eXBlIERhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzID0gei5vdXRwdXQ8dHlwZW9mIERhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzU2NoZW1hPjtcblxuLyoqIENhbm9uaWNhbCBEYXRhYnJpY2tzIGVudmlyb25tZW50IG5hbWVzIGRlcml2ZWQgZnJvbSB0aGUgb3duaW5nIHNjaGVtYS4gKi9cbmV4cG9ydCBjb25zdCBkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcyA9IE9iamVjdC5mcmVlemUoRGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXNTY2hlbWEucGFyc2Uoe30pKTtcblxuLyoqIEhpZ2hlc3QgdmFsaWQgVENQIHBvcnQgbnVtYmVyLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9UQ1BfUE9SVCA9IDY1XzUzNTtcblxuZXhwb3J0IGNvbnN0IHRjcFBvcnRTY2hlbWEgPSB6LmNvZXJjZVxuICAubnVtYmVyPG51bWJlcj4oKVxuICAuaW50KClcbiAgLm1pbigxKVxuICAubWF4KE1BWF9UQ1BfUE9SVClcbiAgLmRlc2NyaWJlKFwiVENQIHBvcnQgZnJvbSAxIHRocm91Z2ggNjU1MzUuXCIpO1xuXG5leHBvcnQgY29uc3QgdGNwUG9ydE9yWmVyb1NjaGVtYSA9IHouY29lcmNlXG4gIC5udW1iZXI8bnVtYmVyPigpXG4gIC5pbnQoKVxuICAubWluKDApXG4gIC5tYXgoTUFYX1RDUF9QT1JUKVxuICAuZGVzY3JpYmUoXCJUQ1AgcG9ydCBmcm9tIDAgdGhyb3VnaCA2NTUzNSwgd2hlcmUgemVybyByZXF1ZXN0cyBhdXRvbWF0aWMgYWxsb2NhdGlvbi5cIik7XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVkVXJsU2NoZW1hID0gelxuICAuc3RyaW5nKClcbiAgLnRyaW0oKVxuICAubWluKDEpXG4gIC5yZWZpbmUoKHZhbHVlKSA9PiB1cmxCdWlsZGVyKHZhbHVlKSAhPT0gdW5kZWZpbmVkLCB7XG4gICAgbWVzc2FnZTogXCJFeHBlY3RlZCBhIHZhbGlkIFVSTCBvciBob3N0LlwiLFxuICB9KVxuICAub3ZlcndyaXRlKG5vcm1hbGl6ZVVybClcbiAgLmRlc2NyaWJlKFwiVVJMIG5vcm1hbGl6ZWQgdGhyb3VnaCB0aGUgc2hhcmVkIFVSTCBidWlsZGVyLlwiKTtcblxuY29uc3QgZGF0YWJyaWNrc1RleHQgPSAoZGVzY3JpcHRpb246IHN0cmluZykgPT5cbiAgei5zdHJpbmcoKS50cmltKCkubWluKDEpLm9wdGlvbmFsKCkuZGVzY3JpYmUoZGVzY3JpcHRpb24pO1xuY29uc3QgZGF0YWJyaWNrc09wdGlvbk1ldGEgPSAoZW52OiBzdHJpbmcsIGZsYWcgPSB0cnVlKSA9PiAoe1xuICBlbnYsXG4gIGZsYWcsXG4gIGhlbHBEZWZhdWx0OiBmYWxzZSxcbn0pO1xuXG5leHBvcnQgY29uc3QgRGF0YWJyaWNrc09wdGlvbnNTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHByb2ZpbGU6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBDTEkgcHJvZmlsZS5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLnByb2ZpbGUpLFxuICAgICksXG4gICAgaG9zdDogbm9ybWFsaXplZFVybFNjaGVtYVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcIkRhdGFicmlja3MgaG9zdC5cIilcbiAgICAgIC5tZXRhKGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmhvc3QsIGZhbHNlKSksXG4gICAgYWNjb3VudElkOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgYWNjb3VudCBJRC5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmFjY291bnRJZCwgZmFsc2UpLFxuICAgICksXG4gICAgd29ya3NwYWNlSWQ6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyB3b3Jrc3BhY2UgSUQuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy53b3Jrc3BhY2VJZCwgZmFsc2UpLFxuICAgICksXG4gICAgY29uZmlnRmlsZTogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIENMSSBjb25maWcgZmlsZS5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmNvbmZpZ0ZpbGUsIGZhbHNlKSxcbiAgICApLFxuICAgIGNsaWVudElkOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgT0F1dGggY2xpZW50IElELlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuY2xpZW50SWQsIGZhbHNlKSxcbiAgICApLFxuICAgIGNsaWVudFNlY3JldDogZGF0YWJyaWNrc1RleHQoXCJEYXRhYnJpY2tzIE9BdXRoIGNsaWVudCBzZWNyZXQuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5jbGllbnRTZWNyZXQsIGZhbHNlKSxcbiAgICApLFxuICAgIGFjY2Vzc1Rva2VuOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgYWNjZXNzIHRva2VuLlwiKS5tZXRhKFxuICAgICAgZGF0YWJyaWNrc09wdGlvbk1ldGEoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMuYWNjZXNzVG9rZW4sIGZhbHNlKSxcbiAgICApLFxuICAgIGdyb3VwSWQ6IGRhdGFicmlja3NUZXh0KFwiRGF0YWJyaWNrcyBncm91cCBJRC5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmdyb3VwSWQsIGZhbHNlKSxcbiAgICApLFxuICAgIGF1dGhUeXBlOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgYXV0aGVudGljYXRpb24gdHlwZS5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmF1dGhUeXBlLCBmYWxzZSksXG4gICAgKSxcbiAgICBhcHBOYW1lOiBkYXRhYnJpY2tzVGV4dChcIkRhdGFicmlja3MgQXBwIG5hbWUuXCIpLm1ldGEoXG4gICAgICBkYXRhYnJpY2tzT3B0aW9uTWV0YShkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5hcHBOYW1lLCBmYWxzZSksXG4gICAgKSxcbiAgICBhcHBQb3J0OiB0Y3BQb3J0U2NoZW1hXG4gICAgICAub3B0aW9uYWwoKVxuICAgICAgLmRlc2NyaWJlKFwiRGF0YWJyaWNrcyBBcHAgcG9ydC5cIilcbiAgICAgIC5tZXRhKGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmFwcFBvcnQsIGZhbHNlKSksXG4gICAgbGFrZWJhc2VFbmRwb2ludDogZGF0YWJyaWNrc1RleHQoXCJMYWtlYmFzZSBlbmRwb2ludC5cIikubWV0YShcbiAgICAgIGRhdGFicmlja3NPcHRpb25NZXRhKGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmxha2ViYXNlRW5kcG9pbnQsIGZhbHNlKSxcbiAgICApLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFwiQ29tbW9uIERhdGFicmlja3MgQ0xJLCBTREssIEFwcHMsIGFuZCBMYWtlYmFzZSBvcHRpb25zLlwiKTtcblxuZXhwb3J0IHR5cGUgRGF0YWJyaWNrc09wdGlvbnMgPSB6LmlucHV0PHR5cGVvZiBEYXRhYnJpY2tzT3B0aW9uc1NjaGVtYT47XG5cbi8qKiBLZXkgZm9ybWF0IGVtaXR0ZWQgYnkge0BsaW5rIHNlcmlhbGl6ZU9wdHN9LiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9uU2VyaWFsaXphdGlvbkZvcm1hdCA9IFwiZmxhZ1wiIHwgXCJlbnZcIjtcblxuLyoqIE5hbWVzcGFjZSBldmVyeSBvcHRpb24gZmllbGQgd2hpbGUgcmV0YWluaW5nIGl0cyBvd25pbmcgWm9kIGZpZWxkIHNjaGVtYXMuICovXG5leHBvcnQgdHlwZSBOYW1lc3BhY2VkT3B0aW9uU2hhcGU8VCBleHRlbmRzIHouWm9kUmF3U2hhcGUsIFByZWZpeCBleHRlbmRzIHN0cmluZz4gPSB7XG4gIFtLZXkgaW4ga2V5b2YgVCBhcyBLZXkgZXh0ZW5kcyBzdHJpbmcgPyBgJHtQcmVmaXh9JHtDYXBpdGFsaXplPEtleT59YCA6IG5ldmVyXTogVFtLZXldO1xufTtcblxuaW50ZXJmYWNlIE9wdGlvblByb3BlcnR5IHtcbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHR5cGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudj86IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBmbGFnPzogYm9vbGVhbjtcbn1cblxuLyoqIFNlcmlhbGl6ZSBjb21wbGV0ZSBwYXJzZWQgb3B0aW9ucyBhcyBKU09OIGtleWVkIGJ5IGZsYWdzIG9yIGVudmlyb25tZW50IG5hbWVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZU9wdHM8VCBleHRlbmRzIHouWm9kUmF3U2hhcGU+KFxuICBzY2hlbWE6IHouWm9kT2JqZWN0PFQ+LFxuICB2YWx1ZXM6IHouaW5wdXQ8ei5ab2RPYmplY3Q8VD4+LFxuICBmb3JtYXQ6IE9wdGlvblNlcmlhbGl6YXRpb25Gb3JtYXQsXG4pOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZE9wdHMoc2NoZW1hLCB2YWx1ZXMsIGZvcm1hdCksIG51bGwsIDIpO1xufVxuXG4vKiogU2VyaWFsaXplIGNvbXBsZXRlIHBhcnNlZCBvcHRpb25zIGFzIGEgcHJvY2VzcyBlbnZpcm9ubWVudCBtYXAuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplT3B0c0Vudmlyb25tZW50PFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPihcbiAgc2NoZW1hOiB6LlpvZE9iamVjdDxUPixcbiAgdmFsdWVzOiB6LmlucHV0PHouWm9kT2JqZWN0PFQ+Pixcbik6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhzZXJpYWxpemVkT3B0cyhzY2hlbWEsIHZhbHVlcywgXCJlbnZcIikpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICBrZXksXG4gICAgICBlbnZpcm9ubWVudE9wdGlvblZhbHVlKHZhbHVlKSxcbiAgICBdKSxcbiAgKTtcbn1cblxuLyoqIE5hbWVzcGFjZSBhIHJldXNhYmxlIG9wdGlvbiBzY2hlbWEgc28gY29tcG9zZWQgQ0xJIGZsYWdzIHJlbmRlciBhcyBgLS08bmFtZXNwYWNlPi08ZmllbGQ+YC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYW1lc3BhY2VPcHRzPFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlLCBQcmVmaXggZXh0ZW5kcyBzdHJpbmc+KFxuICBzY2hlbWE6IHouWm9kT2JqZWN0PFQ+LFxuICBwcmVmaXg6IFByZWZpeCxcbik6IHouWm9kT2JqZWN0PE5hbWVzcGFjZWRPcHRpb25TaGFwZTxULCBQcmVmaXg+PiB7XG4gIGNvbnN0IHNoYXBlID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHNjaGVtYS5zaGFwZSkubWFwKChba2V5LCBmaWVsZF0pID0+IFtuYW1lc3BhY2VkT3B0aW9uS2V5KHByZWZpeCwga2V5KSwgZmllbGRdKSxcbiAgKTtcbiAgcmV0dXJuIHoub2JqZWN0KHNoYXBlKS5zdHJpY3QoKSBhcyB6LlpvZE9iamVjdDxOYW1lc3BhY2VkT3B0aW9uU2hhcGU8VCwgUHJlZml4Pj47XG59XG5cbi8qKiBQYXJzZSBuYW1lc3BhY2VkIG9wdGlvbiB2YWx1ZXMgYmFjayB0aHJvdWdoIHRoZWlyIG93bmluZyBzY2hlbWEuICovXG5leHBvcnQgZnVuY3Rpb24gdW5uYW1lc3BhY2VPcHRzPFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPihcbiAgc2NoZW1hOiB6LlpvZE9iamVjdDxUPixcbiAgdmFsdWVzOiBvYmplY3QsXG4gIHByZWZpeDogc3RyaW5nLFxuKTogei5vdXRwdXQ8ei5ab2RPYmplY3Q8VD4+IHtcbiAgY29uc3Qgc291cmNlID0gdmFsdWVzIGFzIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgcmV0dXJuIHNjaGVtYS5wYXJzZShcbiAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3Qua2V5cyhzY2hlbWEuc2hhcGUpLm1hcCgoa2V5KSA9PiBba2V5LCBzb3VyY2VbbmFtZXNwYWNlZE9wdGlvbktleShwcmVmaXgsIGtleSldXSksXG4gICAgKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gbmFtZXNwYWNlZE9wdGlvbktleShwcmVmaXg6IHN0cmluZywga2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7cHJlZml4fSR7a2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7a2V5LnNsaWNlKDEpfWA7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZWRPcHRzPFQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPihcbiAgc2NoZW1hOiB6LlpvZE9iamVjdDxUPixcbiAgdmFsdWVzOiB6LmlucHV0PHouWm9kT2JqZWN0PFQ+PixcbiAgZm9ybWF0OiBPcHRpb25TZXJpYWxpemF0aW9uRm9ybWF0LFxuKTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnBhcnNlKHZhbHVlcykgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICBjb25zdCBlbnRyaWVzID0gb3B0aW9uUHJvcGVydGllcyhzY2hlbWEpLmZsYXRNYXAoKHByb3BlcnR5KSA9PiB7XG4gICAgaWYgKGZvcm1hdCA9PT0gXCJmbGFnXCIgJiYgcHJvcGVydHkuZmxhZyA9PT0gZmFsc2UpIHJldHVybiBbXTtcbiAgICBjb25zdCBrZXkgPVxuICAgICAgZm9ybWF0ID09PSBcImZsYWdcIlxuICAgICAgICA/IGAtLSR7dG9TbHVnKHByb3BlcnR5LmtleSl9YFxuICAgICAgICA6IChvcHRpb25FbnZpcm9ubWVudE5hbWVzKHByb3BlcnR5LmtleSwgcHJvcGVydHkuZW52KVswXSA/PyBcIlwiKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VkW3Byb3BlcnR5LmtleV07XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyBbXSA6IFtba2V5LCBzZXJpYWxpemVkT3B0aW9uVmFsdWUodmFsdWUpXSBhcyBjb25zdF07XG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpO1xufVxuXG5jb25zdCBvcHRpb25hbFRleHQgPSAoZGVzY3JpcHRpb246IHN0cmluZywgZW52OiBzdHJpbmcpID0+XG4gIHouc3RyaW5nKCkudHJpbSgpLm1pbigxKS5vcHRpb25hbCgpLmRlc2NyaWJlKGRlc2NyaXB0aW9uKS5tZXRhKHsgZW52LCBmbGFnOiBmYWxzZSB9KTtcblxuZXhwb3J0IGNvbnN0IExha2ViYXNlT3B0aW9uc1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgbGFrZWJhc2VFbmRwb2ludDogb3B0aW9uYWxUZXh0KFxuICAgICAgXCJMYWtlYmFzZSBwcm9qZWN0LCByZXNvdXJjZSBwYXRoLCBob3N0LCBvciBVUkwuXCIsXG4gICAgICBkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5sYWtlYmFzZUVuZHBvaW50LFxuICAgICksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJDb21tb24gTGFrZWJhc2Ugb3B0aW9ucy5cIik7XG5cbmV4cG9ydCB0eXBlIExha2ViYXNlT3B0aW9ucyA9IHouaW5wdXQ8dHlwZW9mIExha2ViYXNlT3B0aW9uc1NjaGVtYT47XG5cbi8qKiBFeHBsaWNpdCBvcHRpb24gdmFsdWVzIG9yIGVudmlyb25tZW50IGVudHJpZXMgY29uc3VtZWQgYnkgb3B0aW9uIHBhcnNpbmcgaGVscGVycy4gKi9cbmV4cG9ydCB0eXBlIE9wdGlvblZhbHVlTWFwID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgbnVsbDtcblxuLyoqIFBhcnNlIG9ubHkgc3VwcGxpZWQgZmxhZyBhbmQgZW52aXJvbm1lbnQgdmFsdWVzIHRocm91Z2ggYW4gb3duaW5nIFpvZCBvYmplY3Qgc2NoZW1hLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT3B0czxUIGV4dGVuZHMgei5ab2RSYXdTaGFwZT4oXG4gIHNjaGVtYTogei5ab2RPYmplY3Q8VD4sXG4gIGZsYWdzOiBPcHRpb25WYWx1ZU1hcCA9IG51bGwsXG4gIGVudmlyb25tZW50OiBPcHRpb25WYWx1ZU1hcCA9IG51bGwsXG4pOiBQYXJ0aWFsPHoub3V0cHV0PHouWm9kT2JqZWN0PFQ+Pj4ge1xuICBjb25zdCBjb25maWd1cmVkID0gb3B0aW9uVmFsdWVzKHNjaGVtYSwgZmxhZ3MsIGVudmlyb25tZW50KTtcbiAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnBhcnNlKGNvbmZpZ3VyZWQpO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5rZXlzKGNvbmZpZ3VyZWQpLm1hcCgoa2V5KSA9PiBba2V5LCBwYXJzZWRba2V5IGFzIGtleW9mIHR5cGVvZiBwYXJzZWRdXSksXG4gICkgYXMgUGFydGlhbDx6Lm91dHB1dDx6LlpvZE9iamVjdDxUPj4+O1xufVxuXG4vKiogU3VwcG9ydGVkIGxpc3RlbmVyIHRyYW5zcG9ydCBzY2hlbWVzLiAqL1xuZXhwb3J0IHR5cGUgTGlzdGVuU2NoZW1lID0gXCJ0Y3BcIiB8IFwidW5peFwiO1xuXG4vKiogVENQIGxpc3RlbmVyIHJldHVybmVkIGJ5IHtAbGluayBsaXN0ZW5BZGRyZXNzU2NoZW1hfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGNwTGlzdGVuQWRkcmVzcyB7XG4gIHJlYWRvbmx5IHNjaGVtZTogXCJ0Y3BcIjtcbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG59XG5cbi8qKiBVbml4LWRvbWFpbiBsaXN0ZW5lciByZXR1cm5lZCBieSB7QGxpbmsgbGlzdGVuQWRkcmVzc1NjaGVtYX0uICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaXhMaXN0ZW5BZGRyZXNzIHtcbiAgcmVhZG9ubHkgc2NoZW1lOiBcInVuaXhcIjtcbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG4vKiogVHJhbnNwb3J0LWF3YXJlIGxpc3RlbmVyIGFkZHJlc3MuICovXG5leHBvcnQgdHlwZSBMaXN0ZW5BZGRyZXNzID0gVGNwTGlzdGVuQWRkcmVzcyB8IFVuaXhMaXN0ZW5BZGRyZXNzO1xuXG4vKiogRGVmYXVsdHMgYW5kIHZhbGlkYXRpb24gcG9saWN5IGZvciB7QGxpbmsgbGlzdGVuQWRkcmVzc1NjaGVtYX0uICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RlbkFkZHJlc3NPcHRpb25zIHtcbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuICByZWFkb25seSBsb29wYmFjaz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNjaGVtZT86IExpc3RlblNjaGVtZTtcbiAgcmVhZG9ubHkgc2NoZW1lcz86IHJlYWRvbmx5IExpc3RlblNjaGVtZVtdO1xuICByZWFkb25seSB3aXRoRGVmYXVsdD86IGJvb2xlYW47XG59XG5cbi8qKiBSYXcgbGlzdGVuZXIgaW5wdXQgYWNjZXB0ZWQgYmVmb3JlIHRyYW5zcG9ydC1hd2FyZSBub3JtYWxpemF0aW9uLiAqL1xuZXhwb3J0IHR5cGUgTGlzdGVuQWRkcmVzc0lucHV0ID0gTGlzdGVuQWRkcmVzcyB8IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbkFkZHJlc3NTY2hlbWEoXG4gIG9wdGlvbnM6IExpc3RlbkFkZHJlc3NPcHRpb25zICYge1xuICAgIHJlYWRvbmx5IHNjaGVtZXM6IHJlYWRvbmx5IFtcInRjcFwiLCBcInVuaXhcIl07XG4gICAgcmVhZG9ubHkgd2l0aERlZmF1bHQ6IGZhbHNlO1xuICB9LFxuKTogei5ab2RUeXBlPExpc3RlbkFkZHJlc3MsIHVua25vd24+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQWRkcmVzc1NjaGVtYShcbiAgb3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMgJiB7IHJlYWRvbmx5IHNjaGVtZXM6IHJlYWRvbmx5IFtcInRjcFwiLCBcInVuaXhcIl0gfSxcbik6IHouWm9kRGVmYXVsdDx6LlpvZFR5cGU8TGlzdGVuQWRkcmVzcywgdW5rbm93bj4+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQWRkcmVzc1NjaGVtYShcbiAgb3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMgJiB7IHJlYWRvbmx5IHdpdGhEZWZhdWx0OiBmYWxzZSB9LFxuKTogei5ab2RUeXBlPFRjcExpc3RlbkFkZHJlc3MsIHVua25vd24+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQWRkcmVzc1NjaGVtYShcbiAgb3B0aW9uczogTGlzdGVuQWRkcmVzc09wdGlvbnMsXG4pOiB6LlpvZERlZmF1bHQ8ei5ab2RUeXBlPFRjcExpc3RlbkFkZHJlc3MsIHVua25vd24+PjtcblxuLyoqIEJ1aWxkIGEgdHJhbnNwb3J0LWF3YXJlIGxpc3RlbmVyIHNjaGVtYS4gQmFyZSBhZGRyZXNzZXMgdXNlIHRoZSBjb25maWd1cmVkIGRlZmF1bHQgc2NoZW1lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbkFkZHJlc3NTY2hlbWEoXG4gIG9wdGlvbnM6IExpc3RlbkFkZHJlc3NPcHRpb25zLFxuKTogei5ab2RUeXBlPExpc3RlbkFkZHJlc3MsIHVua25vd24+IHwgei5ab2REZWZhdWx0PHouWm9kVHlwZTxMaXN0ZW5BZGRyZXNzLCB1bmtub3duPj4ge1xuICBjb25zdCBkZWZhdWx0czogVGNwTGlzdGVuQWRkcmVzcyA9IHtcbiAgICBzY2hlbWU6IFwidGNwXCIsXG4gICAgaG9zdDogb3B0aW9ucy5ob3N0ID8/IFwibG9jYWxob3N0XCIsXG4gICAgcG9ydDogb3B0aW9ucy5wb3J0LFxuICB9O1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldDxMaXN0ZW5TY2hlbWU+KG9wdGlvbnMuc2NoZW1lcyA/PyBbXCJ0Y3BcIl0pO1xuICBjb25zdCBzY2hlbWEgPSB6XG4gICAgLnByZXByb2Nlc3MoXG4gICAgICAodmFsdWUpID0+IHBhcnNlTGlzdGVuQWRkcmVzcyh2YWx1ZSwgZGVmYXVsdHMsIG9wdGlvbnMuc2NoZW1lID8/IFwidGNwXCIpLFxuICAgICAgei5kaXNjcmltaW5hdGVkVW5pb24oXCJzY2hlbWVcIiwgW1xuICAgICAgICB6XG4gICAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgICBzY2hlbWU6IHoubGl0ZXJhbChcInRjcFwiKSxcbiAgICAgICAgICAgIGhvc3Q6IHouc3RyaW5nKCkudHJpbSgpLnRvTG93ZXJDYXNlKCkubWluKDEpLmRlZmF1bHQoZGVmYXVsdHMuaG9zdCksXG4gICAgICAgICAgICBwb3J0OiB0Y3BQb3J0T3JaZXJvU2NoZW1hLmRlZmF1bHQoZGVmYXVsdHMucG9ydCksXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc3RyaWN0KCksXG4gICAgICAgIHpcbiAgICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICAgIHNjaGVtZTogei5saXRlcmFsKFwidW5peFwiKSxcbiAgICAgICAgICAgIHBhdGg6IHouc3RyaW5nKCkudHJpbSgpLm1pbigxKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zdHJpY3QoKSxcbiAgICAgIF0pLFxuICAgIClcbiAgICAucmVmaW5lKChhZGRyZXNzKSA9PiBhbGxvd2VkLmhhcyhhZGRyZXNzLnNjaGVtZSksIFwiTGlzdGVuZXIgc2NoZW1lIGlzIG5vdCBhbGxvd2VkLlwiKVxuICAgIC5yZWZpbmUoXG4gICAgICAoYWRkcmVzcykgPT4gYWRkcmVzcy5zY2hlbWUgIT09IFwidGNwXCIgfHwgIW9wdGlvbnMubG9vcGJhY2sgfHwgaXNMb29wYmFja0hvc3QoYWRkcmVzcy5ob3N0KSxcbiAgICAgIFwiTGlzdGVuZXIgaG9zdCBtdXN0IGJlIGxvb3BiYWNrLlwiLFxuICAgIClcbiAgICAuZGVzY3JpYmUoXCJUQ1Agb3IgVW5peC1kb21haW4gbGlzdGVuZXIgYWRkcmVzcy5cIikgYXMgei5ab2RUeXBlPExpc3RlbkFkZHJlc3MsIHVua25vd24+O1xuICByZXR1cm4gb3B0aW9ucy53aXRoRGVmYXVsdCA9PT0gZmFsc2UgPyBzY2hlbWEgOiBzY2hlbWEuZGVmYXVsdChkZWZhdWx0cyk7XG59XG5cbi8qKiBSZW5kZXIgYSBsaXN0ZW5lciBhZGRyZXNzIGFzIGEgYHRjcDovL2Agb3IgYHVuaXg6Ly9gIFVSTC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRMaXN0ZW5BZGRyZXNzKGFkZHJlc3M6IExpc3RlbkFkZHJlc3MpOiBzdHJpbmcge1xuICBpZiAoYWRkcmVzcy5zY2hlbWUgPT09IFwidW5peFwiKSB7XG4gICAgcmV0dXJuIGB1bml4Oi8vJHthZGRyZXNzLnBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBcIlwiIDogXCIvXCJ9JHthZGRyZXNzLnBhdGh9YDtcbiAgfVxuICBjb25zdCBob3N0ID0gYWRkcmVzcy5ob3N0LmluY2x1ZGVzKFwiOlwiKSA/IGBbJHthZGRyZXNzLmhvc3R9XWAgOiBhZGRyZXNzLmhvc3Q7XG4gIHJldHVybiBgdGNwOi8vJHtob3N0fToke2FkZHJlc3MucG9ydH1gO1xufVxuXG5mdW5jdGlvbiBwYXJzZUxpc3RlbkFkZHJlc3MoXG4gIHZhbHVlOiB1bmtub3duLFxuICBkZWZhdWx0czogVGNwTGlzdGVuQWRkcmVzcyxcbiAgZGVmYXVsdFNjaGVtZTogTGlzdGVuU2NoZW1lLFxuKTogdW5rbm93biB7XG4gIGlmIChpc1JlY29yZCh2YWx1ZSkgJiYgdmFsdWUuc2NoZW1lID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlLmhvc3QgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUucG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geyAuLi52YWx1ZSwgc2NoZW1lOiBcInRjcFwiIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUucGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHsgLi4udmFsdWUsIHNjaGVtZTogXCJ1bml4XCIgfTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBkZWZhdWx0U2NoZW1lID09PSBcInRjcFwiXG4gICAgICA/IHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiBkZWZhdWx0cy5ob3N0LCBwb3J0OiB2YWx1ZSB9XG4gICAgICA6IHsgc2NoZW1lOiBcInVuaXhcIiwgcGF0aDogU3RyaW5nKHZhbHVlKSB9O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB2YWx1ZTtcbiAgY29uc3QgdGV4dCA9IHZhbHVlLnRyaW0oKTtcbiAgaWYgKHRleHQuc3RhcnRzV2l0aChcInVuaXg6Ly9cIikpIHtcbiAgICBjb25zdCBwYXRoID0gdGV4dC5zbGljZShcInVuaXg6Ly9cIi5sZW5ndGgpO1xuICAgIHJldHVybiB7IHNjaGVtZTogXCJ1bml4XCIsIHBhdGg6IHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogYC8ke3BhdGh9YCB9O1xuICB9XG4gIGNvbnN0IHRjcCA9IHRleHQuc3RhcnRzV2l0aChcInRjcDovL1wiKSA/IHRleHQuc2xpY2UoXCJ0Y3A6Ly9cIi5sZW5ndGgpIDogdGV4dDtcbiAgaWYgKGRlZmF1bHRTY2hlbWUgPT09IFwidW5peFwiICYmICF0ZXh0LnN0YXJ0c1dpdGgoXCJ0Y3A6Ly9cIikpIHtcbiAgICByZXR1cm4geyBzY2hlbWU6IFwidW5peFwiLCBwYXRoOiB0ZXh0IH07XG4gIH1cbiAgaWYgKC9eXFxkKyQvLnRlc3QodGNwKSkgcmV0dXJuIHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiBkZWZhdWx0cy5ob3N0LCBwb3J0OiB0Y3AgfTtcbiAgaWYgKC9eOlxcZCskLy50ZXN0KHRjcCkpIHtcbiAgICByZXR1cm4geyBzY2hlbWU6IFwidGNwXCIsIGhvc3Q6IGRlZmF1bHRzLmhvc3QsIHBvcnQ6IHRjcC5zbGljZSgxKSB9O1xuICB9XG4gIGNvbnN0IGJyYWNrZXRlZCA9IHRjcC5tYXRjaCgvXlxcWyhbXlxcXV0rKVxcXSg/OjooXFxkKykpPyQvKTtcbiAgaWYgKGJyYWNrZXRlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWU6IFwidGNwXCIsXG4gICAgICBob3N0OiBicmFja2V0ZWRbMV0sXG4gICAgICBwb3J0OiBicmFja2V0ZWRbMl0gPz8gZGVmYXVsdHMucG9ydCxcbiAgICB9O1xuICB9XG4gIGNvbnN0IHNlcGFyYXRvciA9IHRjcC5sYXN0SW5kZXhPZihcIjpcIik7XG4gIGlmIChzZXBhcmF0b3IgPiAwICYmICF0Y3Auc2xpY2UoMCwgc2VwYXJhdG9yKS5pbmNsdWRlcyhcIjpcIikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NoZW1lOiBcInRjcFwiLFxuICAgICAgaG9zdDogdGNwLnNsaWNlKDAsIHNlcGFyYXRvciksXG4gICAgICBwb3J0OiB0Y3Auc2xpY2Uoc2VwYXJhdG9yICsgMSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4geyBzY2hlbWU6IFwidGNwXCIsIGhvc3Q6IHRjcCB8fCBkZWZhdWx0cy5ob3N0LCBwb3J0OiBkZWZhdWx0cy5wb3J0IH07XG59XG5cbmZ1bmN0aW9uIG9wdGlvblByb3BlcnRpZXMoc2NoZW1hOiB6LlpvZE9iamVjdDx6LlpvZFJhd1NoYXBlPik6IE9wdGlvblByb3BlcnR5W10ge1xuICBjb25zdCBkb2N1bWVudCA9IHoudG9KU09OU2NoZW1hKHNjaGVtYSk7XG4gIGlmICghaXNSZWNvcmQoZG9jdW1lbnQucHJvcGVydGllcykpIHJldHVybiBbXTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGRvY3VtZW50LnByb3BlcnRpZXMpLmZsYXRNYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAga2V5LFxuICAgICAgICB0eXBlOiB0eXBlb2YgdmFsdWUudHlwZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlLnR5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgIGVudjpcbiAgICAgICAgICB0eXBlb2YgdmFsdWUuZW52ID09PSBcInN0cmluZ1wiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUuZW52KVxuICAgICAgICAgICAgPyAodmFsdWUuZW52IGFzIHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGZsYWc6IHR5cGVvZiB2YWx1ZS5mbGFnID09PSBcImJvb2xlYW5cIiA/IHZhbHVlLmZsYWcgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIF07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVkT3B0aW9uVmFsdWUodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKGlzUmVjb3JkKHZhbHVlKSAmJiB2YWx1ZS5zY2hlbWUgPT09IFwidGNwXCIpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlLmhvc3QgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHZhbHVlLnBvcnQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiBmb3JtYXRMaXN0ZW5BZGRyZXNzKHsgc2NoZW1lOiBcInRjcFwiLCBob3N0OiB2YWx1ZS5ob3N0LCBwb3J0OiB2YWx1ZS5wb3J0IH0pO1xuICAgIH1cbiAgfVxuICBpZiAoaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLnNjaGVtZSA9PT0gXCJ1bml4XCIgJiYgdHlwZW9mIHZhbHVlLnBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gZm9ybWF0TGlzdGVuQWRkcmVzcyh7IHNjaGVtZTogXCJ1bml4XCIsIHBhdGg6IHZhbHVlLnBhdGggfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBlbnZpcm9ubWVudE9wdGlvblZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUubWFwKFN0cmluZykuam9pbihcIixcIik7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBvcHRpb25WYWx1ZXM8VCBleHRlbmRzIHouWm9kUmF3U2hhcGU+KFxuICBzY2hlbWE6IHouWm9kT2JqZWN0PFQ+LFxuICB2YWx1ZXM6IE9wdGlvblZhbHVlTWFwLFxuICBlbnZpcm9ubWVudDogT3B0aW9uVmFsdWVNYXAsXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IGRvY3VtZW50ID0gei50b0pTT05TY2hlbWEoc2NoZW1hKTtcbiAgY29uc3QgcHJvcGVydGllcyA9IGlzUmVjb3JkKGRvY3VtZW50LnByb3BlcnRpZXMpID8gZG9jdW1lbnQucHJvcGVydGllcyA6IHt9O1xuICBjb25zdCBjb25maWd1cmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHByb3BlcnR5XSBvZiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzKSkge1xuICAgIGlmICghaXNSZWNvcmQocHJvcGVydHkpKSBjb250aW51ZTtcbiAgICBjb25zdCBleHBsaWNpdCA9IGZpcnN0T3B0aW9uVmFsdWUodmFsdWVzLCBba2V5LCBgLS0ke3RvU2x1ZyhrZXkpfWBdKTtcbiAgICBpZiAoZXhwbGljaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlndXJlZFtrZXldID0gb3B0aW9uRW52aXJvbm1lbnRWYWx1ZShwcm9wZXJ0eS50eXBlLCBleHBsaWNpdCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbmFtZXMgPSBvcHRpb25FbnZpcm9ubWVudE5hbWVzKGtleSwgcHJvcGVydHkuZW52KTtcbiAgICBjb25zdCBzb3VyY2VkID0gZmlyc3RPcHRpb25WYWx1ZShlbnZpcm9ubWVudCwgbmFtZXMpO1xuICAgIGlmIChzb3VyY2VkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbmZpZ3VyZWRba2V5XSA9IG9wdGlvbkVudmlyb25tZW50VmFsdWUocHJvcGVydHkudHlwZSwgc291cmNlZCk7XG4gIH1cbiAgcmV0dXJuIGNvbmZpZ3VyZWQ7XG59XG5cbmZ1bmN0aW9uIG9wdGlvbkVudmlyb25tZW50TmFtZXMoa2V5OiBzdHJpbmcsIGNvbmZpZ3VyZWQ6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgY29uZmlndXJlZCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIFtjb25maWd1cmVkXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlndXJlZCkpIHtcbiAgICByZXR1cm4gY29uZmlndXJlZC5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIik7XG4gIH1cbiAgcmV0dXJuIFt0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyh7IGRlbGltaXRlcjogXCJfXCIgfSwga2V5KS50b1VwcGVyQ2FzZSgpXTtcbn1cblxuZnVuY3Rpb24gb3B0aW9uRW52aXJvbm1lbnRWYWx1ZSh0eXBlOiB1bmtub3duLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAodHlwZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB0b0Jvb2xlYW4odmFsdWUpID8/IHZhbHVlO1xuICBpZiAodHlwZSA9PT0gXCJhcnJheVwiICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHBhcnNlTGlzdCh2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZmlyc3RPcHRpb25WYWx1ZShzb3VyY2U6IE9wdGlvblZhbHVlTWFwLCBrZXlzOiByZWFkb25seSBzdHJpbmdbXSk6IHVua25vd24gfCB1bmRlZmluZWQge1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHZhbHVlID0gc291cmNlW2tleV07XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IFwiXCIpIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVVcmwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVybCA9IHVybEJ1aWxkZXIodmFsdWUpO1xuICBpZiAoIXVybCkgcmV0dXJuIHZhbHVlO1xuICBjb25zdCBub3JtYWxpemVkID0gdXJsLnRvU3RyaW5nKCk7XG4gIHJldHVybiB1cmwucGF0aG5hbWUgPT09IFwiL1wiICYmICF1cmwuc2VhcmNoICYmICF1cmwuaGFzaCA/IG5vcm1hbGl6ZWQuc2xpY2UoMCwgLTEpIDogbm9ybWFsaXplZDtcbn1cbiJdfQ==
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/async-utils.ts","../src/brand-utils.ts","../src/environment-utils.ts","../src/error-utils.ts","../src/execution.ts","../src/function-utils.ts","../src/hash.ts","../src/http.ts","../src/json.ts","../src/log.ts","../src/net.ts","../src/object.ts","../src/pattern.ts","../src/predicate.ts","../src/string-utils.ts","../src/token.ts","../index.ts"],"version":"5.9.3"}
|
|
1
|
+
{"root":["../src/async-utils.ts","../src/bindings.ts","../src/brand-utils.ts","../src/environment-utils.ts","../src/error-utils.ts","../src/execution.ts","../src/function-utils.ts","../src/hash.ts","../src/http.ts","../src/json.ts","../src/log.ts","../src/net.ts","../src/object.ts","../src/options.ts","../src/pattern.ts","../src/predicate.ts","../src/string-utils.ts","../src/token.ts","../index.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED
|
@@ -19,7 +19,6 @@
|
|
|
19
19
|
"projen": "projen"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
|
-
"@dbx-tools/test-polyglot": "^0.9.40",
|
|
23
22
|
"typescript": "^5.9.3"
|
|
24
23
|
},
|
|
25
24
|
"dependencies": {
|
|
@@ -40,6 +39,10 @@
|
|
|
40
39
|
"types": "./lib/src/async-utils.d.ts",
|
|
41
40
|
"default": "./lib/src/async-utils.js"
|
|
42
41
|
},
|
|
42
|
+
"./bindings": {
|
|
43
|
+
"types": "./lib/src/bindings.d.ts",
|
|
44
|
+
"default": "./lib/src/bindings.js"
|
|
45
|
+
},
|
|
43
46
|
"./brand-utils": {
|
|
44
47
|
"types": "./lib/src/brand-utils.d.ts",
|
|
45
48
|
"default": "./lib/src/brand-utils.js"
|
|
@@ -84,6 +87,10 @@
|
|
|
84
87
|
"types": "./lib/src/object.d.ts",
|
|
85
88
|
"default": "./lib/src/object.js"
|
|
86
89
|
},
|
|
90
|
+
"./options": {
|
|
91
|
+
"types": "./lib/src/options.d.ts",
|
|
92
|
+
"default": "./lib/src/options.js"
|
|
93
|
+
},
|
|
87
94
|
"./pattern": {
|
|
88
95
|
"types": "./lib/src/pattern.d.ts",
|
|
89
96
|
"default": "./lib/src/pattern.js"
|
|
@@ -103,7 +110,7 @@
|
|
|
103
110
|
"./package.json": "./package.json"
|
|
104
111
|
}
|
|
105
112
|
},
|
|
106
|
-
"version": "0.9.
|
|
113
|
+
"version": "0.9.46",
|
|
107
114
|
"types": "./lib/index.d.ts",
|
|
108
115
|
"dbxToolsConfig": {
|
|
109
116
|
"tags": [
|
|
@@ -120,6 +127,10 @@
|
|
|
120
127
|
"types": "./lib/src/async-utils.d.ts",
|
|
121
128
|
"default": "./lib/src/async-utils.js"
|
|
122
129
|
},
|
|
130
|
+
"./bindings": {
|
|
131
|
+
"types": "./lib/src/bindings.d.ts",
|
|
132
|
+
"default": "./lib/src/bindings.js"
|
|
133
|
+
},
|
|
123
134
|
"./brand-utils": {
|
|
124
135
|
"types": "./lib/src/brand-utils.d.ts",
|
|
125
136
|
"default": "./lib/src/brand-utils.js"
|
|
@@ -164,6 +175,10 @@
|
|
|
164
175
|
"types": "./lib/src/object.d.ts",
|
|
165
176
|
"default": "./lib/src/object.js"
|
|
166
177
|
},
|
|
178
|
+
"./options": {
|
|
179
|
+
"types": "./lib/src/options.d.ts",
|
|
180
|
+
"default": "./lib/src/options.js"
|
|
181
|
+
},
|
|
167
182
|
"./pattern": {
|
|
168
183
|
"types": "./lib/src/pattern.d.ts",
|
|
169
184
|
"default": "./lib/src/pattern.js"
|
package/src/bindings.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Binding-safe access to the shared logging threshold.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { activeLevel, isLevelEnabled, type LogLevel } from "./log.ts";
|
|
8
|
+
|
|
9
|
+
/** Return the active logging threshold. */
|
|
10
|
+
export function logActiveLevel(): LogLevel {
|
|
11
|
+
return activeLevel();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Return whether the current logging threshold enables `level`. */
|
|
15
|
+
export function logLevelEnabled(level: LogLevel): boolean {
|
|
16
|
+
return isLevelEnabled(level);
|
|
17
|
+
}
|
package/src/environment-utils.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { toBoolean } from "./object.ts";
|
|
2
|
-
|
|
3
|
-
const MAX_TCP_PORT = 65_535;
|
|
2
|
+
import { MAX_TCP_PORT } from "./options.ts";
|
|
4
3
|
|
|
5
4
|
function runtimeEnvironment(): Record<string, string | undefined> {
|
|
6
5
|
return (
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
(
|
|
7
|
+
globalThis as typeof globalThis & {
|
|
8
|
+
process?: { env?: Record<string, string | undefined> };
|
|
9
|
+
}
|
|
10
|
+
).process?.env ?? {}
|
|
11
|
+
);
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
/** Detect a Databricks App runtime from its required name, host, and port. */
|
package/src/log.ts
CHANGED
|
@@ -319,7 +319,7 @@ function parseLogLevel(raw: unknown): LogLevel | undefined {
|
|
|
319
319
|
}
|
|
320
320
|
|
|
321
321
|
/** Active threshold from `process.env.LOG_LEVEL`, default {@link DEFAULT_LEVEL}. */
|
|
322
|
-
function activeLevel(): LogLevel {
|
|
322
|
+
export function activeLevel(): LogLevel {
|
|
323
323
|
return parseLogLevel(globalProcess?.env?.LOG_LEVEL) ?? DEFAULT_LEVEL;
|
|
324
324
|
}
|
|
325
325
|
|