@mnaoumov/typescript-dev-toolkit 3.1.0 → 3.3.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.
@@ -0,0 +1,113 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ "use strict";
7
+ var __create = Object.create;
8
+ var __defProp = Object.defineProperty;
9
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
10
+ var __getOwnPropNames = Object.getOwnPropertyNames;
11
+ var __getProtoOf = Object.getPrototypeOf;
12
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
13
+ var __export = (target, all) => {
14
+ for (var name in all)
15
+ __defProp(target, name, { get: all[name], enumerable: true });
16
+ };
17
+ var __copyProps = (to, from, except, desc) => {
18
+ if (from && typeof from === "object" || typeof from === "function") {
19
+ for (let key of __getOwnPropNames(from))
20
+ if (!__hasOwnProp.call(to, key) && key !== except)
21
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
22
+ }
23
+ return to;
24
+ };
25
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
26
+ // If the importer is in node compatibility mode or this is not an ESM
27
+ // file that has been converted to a CommonJS file using a Babel-
28
+ // compatible transform (i.e. "__esModule" has not been set), then set
29
+ // "default" to the CommonJS "module.exports" for node compatibility.
30
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
31
+ mod
32
+ ));
33
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
34
+ var upstream_sync_cli_exports = {};
35
+ __export(upstream_sync_cli_exports, {
36
+ createNodeSyncDependencies: () => createNodeSyncDependencies,
37
+ parseSyncUpstreamsArguments: () => parseSyncUpstreamsArguments,
38
+ runSyncUpstreamsCli: () => runSyncUpstreamsCli
39
+ });
40
+ module.exports = __toCommonJS(upstream_sync_cli_exports);
41
+ var import_node_child_process = require('node:child_process');
42
+ var import_node_process = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('node:process')), 1);
43
+ var import_upstream_sync = require('./upstream-sync.cjs');
44
+ const DEFAULT_BASE_BRANCH = "main";
45
+ const DEFAULT_CONFIG_PATH = "upstreams.json";
46
+ function createNodeSyncDependencies() {
47
+ return {
48
+ exec(file, arguments_, env) {
49
+ return toResult((0, import_node_child_process.spawnSync)(file, arguments_, { encoding: "utf-8", env: { ...import_node_process.default.env, ...env } }));
50
+ },
51
+ async fetchJson(url) {
52
+ const headers = { Accept: "application/vnd.github+json" };
53
+ const token = import_node_process.default.env["GITHUB_TOKEN"];
54
+ if (token && url.startsWith("https://api.github.com/")) {
55
+ headers["Authorization"] = `Bearer ${token}`;
56
+ }
57
+ const response = await fetch(url, { headers });
58
+ if (!response.ok) {
59
+ throw new Error(`GET ${url} failed: HTTP ${String(response.status)}.`);
60
+ }
61
+ return await response.json();
62
+ },
63
+ log(text) {
64
+ import_node_process.default.stdout.write(`${text}
65
+ `);
66
+ },
67
+ shell(command, env) {
68
+ import_node_process.default.stdout.write(`> ${command}
69
+ `);
70
+ const result = toResult((0, import_node_child_process.spawnSync)(command, { encoding: "utf-8", env: { ...import_node_process.default.env, ...env }, shell: true }));
71
+ import_node_process.default.stdout.write(result.output);
72
+ return result;
73
+ }
74
+ };
75
+ }
76
+ function parseSyncUpstreamsArguments(cliArguments) {
77
+ const known = ["--dry-run", "--only=", "--base=", "--config="];
78
+ const unknown = cliArguments.filter((argument) => known.every((prefix) => !(prefix.endsWith("=") ? argument.startsWith(prefix) : argument === prefix)));
79
+ if (unknown.length > 0) {
80
+ throw new Error(`sync-upstreams: unknown argument ${unknown.map((argument) => `"${argument}"`).join(", ")}. Known: --dry-run, --only=, --base=, --config=.`);
81
+ }
82
+ return {
83
+ baseBranch: readOption(cliArguments, "base") ?? DEFAULT_BASE_BRANCH,
84
+ configPath: readOption(cliArguments, "config") ?? DEFAULT_CONFIG_PATH,
85
+ dryRun: cliArguments.includes("--dry-run"),
86
+ only: readOption(cliArguments, "only")?.split(",").filter((name) => name !== "") ?? []
87
+ };
88
+ }
89
+ async function runSyncUpstreamsCli(cliArguments, dependencies = createNodeSyncDependencies()) {
90
+ try {
91
+ const results = await (0, import_upstream_sync.syncUpstreams)(parseSyncUpstreamsArguments(cliArguments), dependencies);
92
+ return results.some((result) => result.outcome === "error") ? 1 : 0;
93
+ } catch (error) {
94
+ import_node_process.default.stderr.write(`${error instanceof Error ? error.message : String(error)}
95
+ `);
96
+ return 1;
97
+ }
98
+ }
99
+ function readOption(cliArguments, name) {
100
+ const prefix = `--${name}=`;
101
+ const value = cliArguments.find((argument) => argument.startsWith(prefix))?.slice(prefix.length);
102
+ return value === "" ? void 0 : value;
103
+ }
104
+ function toResult(result) {
105
+ return result.error ? { exitCode: 1, output: result.error.message } : { exitCode: result.status ?? 1, output: `${result.stdout}${result.stderr}` };
106
+ }
107
+ // Annotate the CommonJS export names for ESM import in node:
108
+ 0 && (module.exports = {
109
+ createNodeSyncDependencies,
110
+ parseSyncUpstreamsArguments,
111
+ runSyncUpstreamsCli
112
+ });
113
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3Vwc3RyZWFtLXN5bmMtY2xpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGBzeW5jLXVwc3RyZWFtc2AgY29tbWFuZDogcmVhZHMgaXRzIGFyZ3VtZW50cywgd2lyZXMge0BsaW5rIHN5bmNVcHN0cmVhbXN9IHRvIHRoZSByZWFsIGdpdCwgYGdoYCwgR2l0SHViIEFQSSBhbmRcbiAqIG5wbSByZWdpc3RyeSwgYW5kIHR1cm5zIHRoZSByZXN1bHRzIGludG8gYW4gZXhpdCBjb2RlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3Bhd25TeW5jUmV0dXJucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIENvbW1hbmRSZXN1bHQsXG4gIFN5bmNEZXBlbmRlbmNpZXMsXG4gIFN5bmNVcHN0cmVhbXNPcHRpb25zXG59IGZyb20gJy4vdXBzdHJlYW0tc3luYy50cyc7XG5cbmltcG9ydCB7IHN5bmNVcHN0cmVhbXMgfSBmcm9tICcuL3Vwc3RyZWFtLXN5bmMudHMnO1xuXG5jb25zdCBERUZBVUxUX0JBU0VfQlJBTkNIID0gJ21haW4nO1xuY29uc3QgREVGQVVMVF9DT05GSUdfUEFUSCA9ICd1cHN0cmVhbXMuanNvbic7XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgc3luYydzIG91dHNpZGUgd29ybGQ6IGNvbW1hbmRzIHJ1biB3aXRoIGBzcGF3blN5bmNgLCBKU09OIGZldGNoZWQgd2l0aCBgZmV0Y2hgLCBvdXRwdXQgdG8gc3Rkb3V0LlxuICogYEdJVEhVQl9UT0tFTmAsIHdoZW4gc2V0LCBpcyBzZW50IHRvIHRoZSBHaXRIdWIgQVBJIGFuZCBub3doZXJlIGVsc2UuXG4gKlxuICogQHJldHVybnMgVGhlIGRlcGVuZGVuY2llcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5vZGVTeW5jRGVwZW5kZW5jaWVzKCk6IFN5bmNEZXBlbmRlbmNpZXMge1xuICByZXR1cm4ge1xuICAgIGV4ZWMoZmlsZSwgYXJndW1lbnRzXywgZW52KTogQ29tbWFuZFJlc3VsdCB7XG4gICAgICByZXR1cm4gdG9SZXN1bHQoc3Bhd25TeW5jKGZpbGUsIGFyZ3VtZW50c18sIHsgZW5jb2Rpbmc6ICd1dGYtOCcsIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZW52IH0gfSkpO1xuICAgIH0sXG4gICAgYXN5bmMgZmV0Y2hKc29uKHVybCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgQWNjZXB0OiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uJyB9O1xuICAgICAgY29uc3QgdG9rZW4gPSBwcm9jZXNzLmVudlsnR0lUSFVCX1RPS0VOJ107XG4gICAgICBpZiAodG9rZW4gJiYgdXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vJykpIHtcbiAgICAgICAgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJlYXJlciAke3Rva2VufWA7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdFVCAke3VybH0gZmFpbGVkOiBIVFRQICR7U3RyaW5nKHJlc3BvbnNlLnN0YXR1cyl9LmApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICB9LFxuICAgIGxvZyh0ZXh0KTogdm9pZCB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgJHt0ZXh0fVxcbmApO1xuICAgIH0sXG4gICAgc2hlbGwoY29tbWFuZCwgZW52KTogQ29tbWFuZFJlc3VsdCB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgPiAke2NvbW1hbmR9XFxuYCk7XG4gICAgICBjb25zdCByZXN1bHQgPSB0b1Jlc3VsdChzcGF3blN5bmMoY29tbWFuZCwgeyBlbmNvZGluZzogJ3V0Zi04JywgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi5lbnYgfSwgc2hlbGw6IHRydWUgfSkpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUocmVzdWx0Lm91dHB1dCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHN5bmMgb3B0aW9ucyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuXG4gKlxuICogYC0tZHJ5LXJ1bmAgcHJpbnRzIGVhY2ggUFIgaXQgd291bGQgb3BlbiBhbmQgY2hhbmdlcyBub3RoaW5nLiBgLS1vbmx5PTxuYW1lPlssPG5hbWU+XWAgbGltaXRzIHRoZSBzeW5jIHRvIHRob3NlXG4gKiBlbnRyaWVzLCBgLS1iYXNlPTxicmFuY2g+YCBuYW1lcyB0aGUgYnJhbmNoIHRoZSBQUnMgdGFyZ2V0IChgbWFpbmAgYnkgZGVmYXVsdCksIGFuZCBgLS1jb25maWc9PHBhdGg+YCBuYW1lcyB0aGVcbiAqIGB1cHN0cmVhbXMuanNvbmAgKHRoZSBvbmUgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGJ5IGRlZmF1bHQpLlxuICpcbiAqIEBwYXJhbSBjbGlBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIGFmdGVyIHRoZSBjb21tYW5kIG5hbWUuXG4gKiBAcmV0dXJucyBUaGUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3luY1Vwc3RyZWFtc0FyZ3VtZW50cyhjbGlBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogU3luY1Vwc3RyZWFtc09wdGlvbnMge1xuICBjb25zdCBrbm93biA9IFsnLS1kcnktcnVuJywgJy0tb25seT0nLCAnLS1iYXNlPScsICctLWNvbmZpZz0nXTtcbiAgY29uc3QgdW5rbm93biA9IGNsaUFyZ3VtZW50cy5maWx0ZXIoKGFyZ3VtZW50KSA9PiBrbm93bi5ldmVyeSgocHJlZml4KSA9PiAhKHByZWZpeC5lbmRzV2l0aCgnPScpID8gYXJndW1lbnQuc3RhcnRzV2l0aChwcmVmaXgpIDogYXJndW1lbnQgPT09IHByZWZpeCkpKTtcbiAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgc3luYy11cHN0cmVhbXM6IHVua25vd24gYXJndW1lbnQgJHt1bmtub3duLm1hcCgoYXJndW1lbnQpID0+IGBcIiR7YXJndW1lbnR9XCJgKS5qb2luKCcsICcpfS4gS25vd246IC0tZHJ5LXJ1biwgLS1vbmx5PSwgLS1iYXNlPSwgLS1jb25maWc9LmApO1xuICB9XG4gIHJldHVybiB7XG4gICAgYmFzZUJyYW5jaDogcmVhZE9wdGlvbihjbGlBcmd1bWVudHMsICdiYXNlJykgPz8gREVGQVVMVF9CQVNFX0JSQU5DSCxcbiAgICBjb25maWdQYXRoOiByZWFkT3B0aW9uKGNsaUFyZ3VtZW50cywgJ2NvbmZpZycpID8/IERFRkFVTFRfQ09ORklHX1BBVEgsXG4gICAgZHJ5UnVuOiBjbGlBcmd1bWVudHMuaW5jbHVkZXMoJy0tZHJ5LXJ1bicpLFxuICAgIG9ubHk6IHJlYWRPcHRpb24oY2xpQXJndW1lbnRzLCAnb25seScpPy5zcGxpdCgnLCcpLmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gJycpID8/IFtdXG4gIH07XG59XG5cbi8qKlxuICogUnVucyB0aGUgYHN5bmMtdXBzdHJlYW1zYCBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBjbGlBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIGFmdGVyIHRoZSBjb21tYW5kIG5hbWUuXG4gKiBAcGFyYW0gZGVwZW5kZW5jaWVzIC0gVGhlIG91dHNpZGUgd29ybGQuIFRoZSByZWFsIG9uZSB3aGVuIG9taXR0ZWQuXG4gKiBAcmV0dXJucyBUaGUgZXhpdCBjb2RlOiBgMWAgd2hlbiB0aGUgYXJndW1lbnRzIG9yIGB1cHN0cmVhbXMuanNvbmAgYXJlIHdyb25nIG9yIGFueSBlbnRyeSBmYWlsZWQsIGAwYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5TeW5jVXBzdHJlYW1zQ2xpKGNsaUFyZ3VtZW50czogcmVhZG9ubHkgc3RyaW5nW10sIGRlcGVuZGVuY2llczogU3luY0RlcGVuZGVuY2llcyA9IGNyZWF0ZU5vZGVTeW5jRGVwZW5kZW5jaWVzKCkpOiBQcm9taXNlPG51bWJlcj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBzeW5jVXBzdHJlYW1zKHBhcnNlU3luY1Vwc3RyZWFtc0FyZ3VtZW50cyhjbGlBcmd1bWVudHMpLCBkZXBlbmRlbmNpZXMpO1xuICAgIHJldHVybiByZXN1bHRzLnNvbWUoKHJlc3VsdCkgPT4gcmVzdWx0Lm91dGNvbWUgPT09ICdlcnJvcicpID8gMSA6IDA7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gQSB3cm9uZyBhcmd1bWVudCBvciBjb25maWcgaXMgdGhlIHVzZXIncyB0byBmaXgsIHNvIGl0IGdldHMgaXRzIG1lc3NhZ2UgcmF0aGVyIHRoYW4gYSBzdGFjayB0cmFjZS5cbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShgJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9XFxuYCk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn1cblxuLy8gQW4gZW1wdHkgdmFsdWUgY291bnRzIGFzIGFic2VudCwgYmVjYXVzZSBhIHdvcmtmbG93IHBhc3NlcyBhbiB1bnNldCBpbnB1dCBhcyBvbmUuXG5mdW5jdGlvbiByZWFkT3B0aW9uKGNsaUFyZ3VtZW50czogcmVhZG9ubHkgc3RyaW5nW10sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByZWZpeCA9IGAtLSR7bmFtZX09YDtcbiAgY29uc3QgdmFsdWUgPSBjbGlBcmd1bWVudHMuZmluZCgoYXJndW1lbnQpID0+IGFyZ3VtZW50LnN0YXJ0c1dpdGgocHJlZml4KSk/LnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICByZXR1cm4gdmFsdWUgPT09ICcnID8gdW5kZWZpbmVkIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHRvUmVzdWx0KHJlc3VsdDogU3Bhd25TeW5jUmV0dXJuczxzdHJpbmc+KTogQ29tbWFuZFJlc3VsdCB7XG4gIHJldHVybiByZXN1bHQuZXJyb3IgPyB7IGV4aXRDb2RlOiAxLCBvdXRwdXQ6IHJlc3VsdC5lcnJvci5tZXNzYWdlIH0gOiB7IGV4aXRDb2RlOiByZXN1bHQuc3RhdHVzID8/IDEsIG91dHB1dDogYCR7cmVzdWx0LnN0ZG91dH0ke3Jlc3VsdC5zdGRlcnJ9YCB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTQSxnQ0FBMEI7QUFDMUIsMEJBQW9CO0FBUXBCLDJCQUE4QjtBQUU5QixNQUFNLHNCQUFzQjtBQUM1QixNQUFNLHNCQUFzQjtBQVFyQixTQUFTLDZCQUErQztBQUM3RCxTQUFPO0FBQUEsSUFDTCxLQUFLLE1BQU0sWUFBWSxLQUFvQjtBQUN6QyxhQUFPLGFBQVMscUNBQVUsTUFBTSxZQUFZLEVBQUUsVUFBVSxTQUFTLEtBQUssRUFBRSxHQUFHLG9CQUFBQSxRQUFRLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQUEsSUFDckc7QUFBQSxJQUNBLE1BQU0sVUFBVSxLQUF1QjtBQUNyQyxZQUFNLFVBQWtDLEVBQUUsUUFBUSw4QkFBOEI7QUFDaEYsWUFBTSxRQUFRLG9CQUFBQSxRQUFRLElBQUksY0FBYztBQUN4QyxVQUFJLFNBQVMsSUFBSSxXQUFXLHlCQUF5QixHQUFHO0FBQ3RELGdCQUFRLGVBQWUsSUFBSSxVQUFVLEtBQUs7QUFBQSxNQUM1QztBQUNBLFlBQU0sV0FBVyxNQUFNLE1BQU0sS0FBSyxFQUFFLFFB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
@@ -0,0 +1,34 @@
1
+ /// <reference path="./library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * The `sync-upstreams` command: reads its arguments, wires {@link syncUpstreams} to the real git, `gh`, GitHub API and
6
+ * npm registry, and turns the results into an exit code.
7
+ */
8
+ import type { SyncDependencies, SyncUpstreamsOptions } from './upstream-sync.cjs';
9
+ /**
10
+ * Creates the sync's outside world: commands run with `spawnSync`, JSON fetched with `fetch`, output to stdout.
11
+ * `GITHUB_TOKEN`, when set, is sent to the GitHub API and nowhere else.
12
+ *
13
+ * @returns The dependencies.
14
+ */
15
+ export declare function createNodeSyncDependencies(): SyncDependencies;
16
+ /**
17
+ * Builds the sync options from the command line.
18
+ *
19
+ * `--dry-run` prints each PR it would open and changes nothing. `--only=<name>[,<name>]` limits the sync to those
20
+ * entries, `--base=<branch>` names the branch the PRs target (`main` by default), and `--config=<path>` names the
21
+ * `upstreams.json` (the one in the working directory by default).
22
+ *
23
+ * @param cliArguments - The arguments after the command name.
24
+ * @returns The options.
25
+ */
26
+ export declare function parseSyncUpstreamsArguments(cliArguments: readonly string[]): SyncUpstreamsOptions;
27
+ /**
28
+ * Runs the `sync-upstreams` command.
29
+ *
30
+ * @param cliArguments - The arguments after the command name.
31
+ * @param dependencies - The outside world. The real one when omitted.
32
+ * @returns The exit code: `1` when the arguments or `upstreams.json` are wrong or any entry failed, `0` otherwise.
33
+ */
34
+ export declare function runSyncUpstreamsCli(cliArguments: readonly string[], dependencies?: SyncDependencies): Promise<number>;
@@ -0,0 +1,294 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ "use strict";
7
+ var __defProp = Object.defineProperty;
8
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
9
+ var __getOwnPropNames = Object.getOwnPropertyNames;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __export = (target, all) => {
12
+ for (var name in all)
13
+ __defProp(target, name, { get: all[name], enumerable: true });
14
+ };
15
+ var __copyProps = (to, from, except, desc) => {
16
+ if (from && typeof from === "object" || typeof from === "function") {
17
+ for (let key of __getOwnPropNames(from))
18
+ if (!__hasOwnProp.call(to, key) && key !== except)
19
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
20
+ }
21
+ return to;
22
+ };
23
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
24
+ var upstream_sync_exports = {};
25
+ __export(upstream_sync_exports, {
26
+ buildPrBody: () => buildPrBody,
27
+ compareWithUpstream: () => compareWithUpstream,
28
+ parseUpstreamsConfig: () => parseUpstreamsConfig,
29
+ planSync: () => planSync,
30
+ syncUpstreams: () => syncUpstreams,
31
+ writePin: () => writePin
32
+ });
33
+ module.exports = __toCommonJS(upstream_sync_exports);
34
+ var import_node_fs = require('node:fs');
35
+ var import_node_path = require('node:path');
36
+ const COMPARE_FILE_LIMIT = 300;
37
+ const SHORT_SHA_LENGTH = 12;
38
+ const OUTPUT_TAIL_LINES = 60;
39
+ const JSON_INDENT_SPACES = 2;
40
+ function buildPrBody(plan, steps, diffStat) {
41
+ const { entry, head, pin } = plan.status;
42
+ const source = isGitUpstream(entry) ? `\`${entry.repo}@${entry.ref}\`` : `npm \`${entry.npm}@${entry.tag ?? "latest"}\``;
43
+ const lines = [
44
+ `Upstream \`${entry.name}\` moved: ${source} from \`${pin}\` to \`${head}\`.`,
45
+ "",
46
+ `Compare: ${plan.status.compareUrl}`,
47
+ ""
48
+ ];
49
+ if (isGitUpstream(entry)) {
50
+ lines.push("### Changed upstream files", "", ...plan.status.changedPaths.map((path) => `- \`${path}\``));
51
+ if (plan.status.truncated) {
52
+ lines.push(`- GitHub lists at most ${String(COMPARE_FILE_LIMIT)} files: open the compare link for the rest.`);
53
+ }
54
+ lines.push("");
55
+ }
56
+ if (steps === null) {
57
+ lines.push("### Handler", "", `\`${entry.handler}\`: not run (dry run).`, "");
58
+ } else {
59
+ lines.push(...describeStep("Handler", steps.handler));
60
+ if (steps.verify !== null) {
61
+ lines.push(...describeStep("Verify", steps.verify));
62
+ }
63
+ }
64
+ if (diffStat !== null) {
65
+ lines.push("### Generated changes", "", "```text", diffStat.trimEnd(), "```", "");
66
+ }
67
+ lines.push("This PR was opened by the upstream-sync job and is never merged automatically.");
68
+ return `${lines.join("\n")}
69
+ `;
70
+ }
71
+ async function compareWithUpstream(entry, dependencies) {
72
+ if (!isGitUpstream(entry)) {
73
+ const tag = entry.tag ?? "latest";
74
+ const packument = await dependencies.fetchJson(`https://registry.npmjs.org/${entry.npm.replace("/", "%2f")}`);
75
+ const head2 = packument["dist-tags"][tag];
76
+ if (head2 === void 0) {
77
+ throw new Error(`npm package ${entry.npm} has no dist-tag "${tag}".`);
78
+ }
79
+ return {
80
+ changedPaths: [],
81
+ compareUrl: `https://www.npmjs.com/package/${entry.npm}/v/${head2}`,
82
+ entry,
83
+ head: head2,
84
+ pin: entry.version,
85
+ state: head2 === entry.version ? "current" : "moved",
86
+ truncated: false
87
+ };
88
+ }
89
+ const commit = await dependencies.fetchJson(`https://api.github.com/repos/${entry.repo}/commits/${encodeURIComponent(entry.ref)}`);
90
+ const head = commit.sha;
91
+ const compareUrl = `https://github.com/${entry.repo}/compare/${entry.commit}...${head}`;
92
+ if (head === entry.commit) {
93
+ return { changedPaths: [], compareUrl, entry, head, pin: entry.commit, state: "current", truncated: false };
94
+ }
95
+ const compare = await dependencies.fetchJson(`https://api.github.com/repos/${entry.repo}/compare/${entry.commit}...${head}`);
96
+ const files = compare.files ?? [];
97
+ const touched = new Set(files.flatMap((file) => file.previous_filename === void 0 ? [file.filename] : [file.filename, file.previous_filename]));
98
+ const changedPaths = [...touched].filter((path) => entry.paths.some((glob) => (0, import_node_path.matchesGlob)(path, glob))).sort();
99
+ const isTruncated = files.length >= COMPARE_FILE_LIMIT;
100
+ return {
101
+ changedPaths,
102
+ compareUrl,
103
+ entry,
104
+ head,
105
+ pin: entry.commit,
106
+ state: changedPaths.length > 0 || isTruncated ? "moved" : "unwatched",
107
+ truncated: isTruncated
108
+ };
109
+ }
110
+ function parseUpstreamsConfig(text) {
111
+ const config = JSON.parse(text);
112
+ if (!Array.isArray(config.upstreams)) {
113
+ throw new TypeError('upstreams.json has no "upstreams" array.');
114
+ }
115
+ const entries = config.upstreams;
116
+ const names = /* @__PURE__ */ new Set();
117
+ for (const entry of entries) {
118
+ const name = Reflect.get(entry, "name");
119
+ const label = typeof name === "string" ? `"${name}"` : "with no name";
120
+ const isGit = "repo" in entry;
121
+ const required = isGit ? ["name", "repo", "ref", "commit", "handler"] : ["name", "npm", "version", "handler"];
122
+ for (const key of required) {
123
+ if (typeof Reflect.get(entry, key) !== "string") {
124
+ throw new TypeError(`upstreams.json: entry ${label} needs a string "${key}".`);
125
+ }
126
+ }
127
+ if (isGit && !Array.isArray(Reflect.get(entry, "paths"))) {
128
+ throw new Error(`upstreams.json: entry ${label} needs a "paths" array.`);
129
+ }
130
+ if (names.has(name)) {
131
+ throw new Error(`upstreams.json: the name ${label} is used twice.`);
132
+ }
133
+ names.add(name);
134
+ }
135
+ return config;
136
+ }
137
+ function planSync(status) {
138
+ return {
139
+ branch: `upstream/${status.entry.name}`,
140
+ status,
141
+ title: `chore(upstream): sync ${status.entry.name} to ${shorten(status.head)}`
142
+ };
143
+ }
144
+ async function syncUpstreams(options, dependencies) {
145
+ const config = parseUpstreamsConfig((0, import_node_fs.readFileSync)(options.configPath, "utf-8"));
146
+ const unknown = options.only.filter((name) => config.upstreams.every((entry) => entry.name !== name));
147
+ if (unknown.length > 0) {
148
+ throw new Error(`upstreams.json has no entry named ${unknown.map((name) => `"${name}"`).join(", ")}.`);
149
+ }
150
+ const results = [];
151
+ for (const entry of config.upstreams) {
152
+ if (options.only.length > 0 && !options.only.includes(entry.name)) {
153
+ continue;
154
+ }
155
+ try {
156
+ results.push(await syncEntry(entry, config, options, dependencies));
157
+ } catch (error) {
158
+ const message = error instanceof Error ? error.message : String(error);
159
+ dependencies.log(`${entry.name}: ERROR ${message}`);
160
+ results.push({ error: message, name: entry.name, outcome: "error" });
161
+ }
162
+ }
163
+ return results;
164
+ }
165
+ function writePin(configPath, status) {
166
+ const text = (0, import_node_fs.readFileSync)(configPath, "utf-8");
167
+ const parsed = JSON.parse(text);
168
+ const key = isGitUpstream(status.entry) ? "commit" : "version";
169
+ const target = parsed.upstreams.find((entry) => entry["name"] === status.entry.name);
170
+ if (target?.[key] !== status.pin) {
171
+ return;
172
+ }
173
+ target[key] = status.head;
174
+ (0, import_node_fs.writeFileSync)(configPath, `${JSON.stringify(parsed, null, JSON_INDENT_SPACES)}
175
+ `);
176
+ }
177
+ function applyPlan(plan, config, options, dependencies) {
178
+ const { entry } = plan.status;
179
+ const env = { UPSTREAM_NAME: entry.name, UPSTREAM_TARGET: plan.status.head };
180
+ const handler = { command: entry.handler, result: dependencies.shell(entry.handler, env) };
181
+ writePin(options.configPath, plan.status);
182
+ const verifyCommand = entry.verify ?? config.verify;
183
+ const verify = verifyCommand === void 0 ? null : { command: verifyCommand, result: dependencies.shell(verifyCommand, env) };
184
+ const isFailed = handler.result.exitCode !== 0 || verify !== null && verify.result.exitCode !== 0;
185
+ execOrThrow(dependencies, "git", ["add", "--all"]);
186
+ execOrThrow(dependencies, "git", ["commit", "--no-verify", "--message", plan.title]);
187
+ const diffStat = execOrThrow(dependencies, "git", ["diff", "--stat", "HEAD~1", "HEAD"]);
188
+ const isRemoteBranch = dependencies.exec("git", ["ls-remote", "--exit-code", "--heads", "origin", plan.branch]).exitCode === 0;
189
+ if (isRemoteBranch) {
190
+ execOrThrow(dependencies, "git", ["fetch", "origin", plan.branch]);
191
+ if (dependencies.exec("git", ["diff", "--quiet", "FETCH_HEAD", "HEAD"]).exitCode === 0) {
192
+ dependencies.log(`${entry.name}: ${plan.branch} already holds this result; nothing pushed.`);
193
+ return { name: entry.name, outcome: "unchanged" };
194
+ }
195
+ }
196
+ execOrThrow(dependencies, "git", ["push", "--force", "origin", `HEAD:refs/heads/${plan.branch}`]);
197
+ const body = buildPrBody(plan, { handler, verify }, diffStat);
198
+ const existing = execOrThrow(dependencies, "gh", ["pr", "list", "--head", plan.branch, "--state", "open", "--json", "number", "--jq", ".[0].number"]).trim();
199
+ if (existing !== "" && existing !== "null") {
200
+ const prNumber2 = Number(existing);
201
+ execOrThrow(dependencies, "gh", ["pr", "edit", existing, "--title", plan.title, "--body", body]);
202
+ execOrThrow(dependencies, "gh", isFailed ? ["pr", "ready", existing, "--undo"] : ["pr", "ready", existing]);
203
+ dependencies.log(`${entry.name}: updated PR #${existing}${isFailed ? " (draft: a step failed)" : ""}.`);
204
+ return { name: entry.name, outcome: "updated", prNumber: prNumber2 };
205
+ }
206
+ const url = execOrThrow(dependencies, "gh", [
207
+ "pr",
208
+ "create",
209
+ "--base",
210
+ options.baseBranch,
211
+ "--head",
212
+ plan.branch,
213
+ "--title",
214
+ plan.title,
215
+ "--body",
216
+ body,
217
+ ...isFailed ? ["--draft"] : []
218
+ ]).trim();
219
+ dependencies.log(`${entry.name}: opened ${url}${isFailed ? " (draft: a step failed)" : ""}.`);
220
+ const prNumber = Number(/\/pull\/(?<Number>\d+)/.exec(url)?.groups?.["Number"] ?? NaN);
221
+ return Number.isNaN(prNumber) ? { name: entry.name, outcome: "opened" } : { name: entry.name, outcome: "opened", prNumber };
222
+ }
223
+ function describeStep(heading, step) {
224
+ const isPassed = step.result.exitCode === 0;
225
+ const tail = step.result.output.trimEnd().split(/\r?\n/).slice(-OUTPUT_TAIL_LINES).join("\n");
226
+ return [
227
+ `### ${heading}`,
228
+ "",
229
+ `\`${step.command}\`: ${isPassed ? "passed" : `**FAILED** (exit ${String(step.result.exitCode)})`}.`,
230
+ "",
231
+ isPassed ? "<details><summary>Output</summary>" : "<details open><summary>Output</summary>",
232
+ "",
233
+ "```text",
234
+ tail,
235
+ "```",
236
+ "",
237
+ "</details>",
238
+ ""
239
+ ];
240
+ }
241
+ function execOrThrow(dependencies, file, arguments_) {
242
+ const result = dependencies.exec(file, arguments_);
243
+ if (result.exitCode !== 0) {
244
+ throw new Error(`${file} ${arguments_.join(" ")} failed (exit ${String(result.exitCode)}): ${result.output.trim()}`);
245
+ }
246
+ return result.output;
247
+ }
248
+ function isGitUpstream(entry) {
249
+ return "repo" in entry;
250
+ }
251
+ function shorten(head) {
252
+ return /^[0-9a-f]{40}$/.test(head) ? head.slice(0, SHORT_SHA_LENGTH) : head;
253
+ }
254
+ async function syncEntry(entry, config, options, dependencies) {
255
+ const status = await compareWithUpstream(entry, dependencies);
256
+ if (status.state === "current") {
257
+ dependencies.log(`${entry.name}: current at ${shorten(status.head)}.`);
258
+ return { name: entry.name, outcome: "current" };
259
+ }
260
+ if (status.state === "unwatched") {
261
+ dependencies.log(`${entry.name}: moved to ${shorten(status.head)}, but no watched path changed since ${shorten(status.pin)}.`);
262
+ return { name: entry.name, outcome: "unwatched" };
263
+ }
264
+ const plan = planSync(status);
265
+ if (options.dryRun) {
266
+ dependencies.log(`${entry.name}: moved from ${shorten(status.pin)} to ${shorten(status.head)}. Would push ${plan.branch} and open:`);
267
+ dependencies.log(` title: ${plan.title}`);
268
+ dependencies.log(buildPrBody(plan, null, null).replaceAll(/^/gm, " | "));
269
+ return { name: entry.name, outcome: "planned" };
270
+ }
271
+ const dirty = execOrThrow(dependencies, "git", ["status", "--porcelain"]).trim();
272
+ if (dirty !== "") {
273
+ throw new Error(`the working tree is not clean, and the update commit would take these files with it:
274
+ ${dirty}`);
275
+ }
276
+ execOrThrow(dependencies, "git", ["fetch", "origin", options.baseBranch]);
277
+ execOrThrow(dependencies, "git", ["checkout", "-B", plan.branch, `origin/${options.baseBranch}`]);
278
+ try {
279
+ return applyPlan(plan, config, options, dependencies);
280
+ } finally {
281
+ dependencies.exec("git", ["checkout", "--force", options.baseBranch]);
282
+ dependencies.exec("git", ["branch", "--delete", "--force", plan.branch]);
283
+ }
284
+ }
285
+ // Annotate the CommonJS export names for ESM import in node:
286
+ 0 && (module.exports = {
287
+ buildPrBody,
288
+ compareWithUpstream,
289
+ parseUpstreamsConfig,
290
+ planSync,
291
+ syncUpstreams,
292
+ writePin
293
+ });
294
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3Vwc3RyZWFtLXN5bmMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBXYXRjaGVzIHRoZSB1cHN0cmVhbXMgYSByZXBvc2l0b3J5IG1pcnJvcnMgYW5kIG9wZW5zIG9uZSB1cGRhdGUgUFIgcGVyIHVwc3RyZWFtIHRoYXQgbW92ZWQuXG4gKlxuICogRXZlcnl0aGluZyBoZXJlIGlzIGRyaXZlbiBieSBgdXBzdHJlYW1zLmpzb25gIGFuZCB0aGUgaGFuZGxlciBjb21tYW5kcyBpdCBuYW1lcywgc28gYW55IHJlcG9zaXRvcnkgdGhhdCB2ZW5kb3JzXG4gKiB1cHN0cmVhbSBjb2RlIGNhbiB1c2UgaXQ6IHRocm91Z2ggdGhlIGBzeW5jLXVwc3RyZWFtc2AgYmluLCBvciB0aGUgcmV1c2FibGUgYHN5bmMtdXBzdHJlYW1zLnltbGAgd29ya2Zsb3cuXG4gKi9cblxuaW1wb3J0IHtcbiAgcmVhZEZpbGVTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgbWF0Y2hlc0dsb2IgfSBmcm9tICdub2RlOnBhdGgnO1xuXG4vKipcbiAqIFdoYXQgYSBjb21tYW5kIHByaW50ZWQgYW5kIGhvdyBpdCBleGl0ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZFJlc3VsdCB7XG4gIHJlYWRvbmx5IGV4aXRDb2RlOiBudW1iZXI7XG4gIHJlYWRvbmx5IG91dHB1dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFuIHVwc3RyZWFtIGZvbGxvd2VkIG9uIGEgR2l0SHViIGJyYW5jaCBvciB0YWcsIHBpbm5lZCB0byBhIGNvbW1pdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRVcHN0cmVhbUVudHJ5IHtcbiAgLyoqXG4gICAqIFRoZSBwaW5uZWQgY29tbWl0OiB0aGUgbGFzdCB1cHN0cmVhbSBzdGF0ZSB0aGUgaGFuZGxlciB3YXMgcnVuIGFnYWluc3QuXG4gICAqL1xuICBjb21taXQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBzaGVsbCBjb21tYW5kIHRoYXQgdHVybnMgYSBuZXdlciB1cHN0cmVhbSBzdGF0ZSBpbnRvIGNoYW5nZXMgaW4gdGhpcyByZXBvc2l0b3J5LlxuICAgKi9cbiAgaGFuZGxlcjogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGF0aHMgd2F0Y2hlZCB1cHN0cmVhbSwgYXMgZ2xvYnMgcmVsYXRpdmUgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdC4gQSBtb3ZlIHRoYXQgdG91Y2hlcyBub25lIG9mIHRoZW0gb3BlbnMgbm8gUFIuXG4gICAqL1xuICBwYXRoczogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgYnJhbmNoIG9yIHRhZyBmb2xsb3dlZC5cbiAgICovXG4gIHJlZjogc3RyaW5nO1xuICAvKipcbiAgICogYDxvd25lcj4vPHJlcG8+YCBvbiBHaXRIdWIuXG4gICAqL1xuICByZXBvOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc2hlbGwgY29tbWFuZCB0aGF0IGNoZWNrcyB0aGUgaGFuZGxlcidzIHJlc3VsdC4gT3ZlcnJpZGVzIHRoZSBmaWxlJ3MgdG9wLWxldmVsIGB2ZXJpZnlgLlxuICAgKi9cbiAgdmVyaWZ5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFuIHVwc3RyZWFtIGZvbGxvd2VkIGFzIGFuIG5wbSBwYWNrYWdlJ3MgZGlzdC10YWcsIHBpbm5lZCB0byBhIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnBtVXBzdHJlYW1FbnRyeSB7XG4gIGhhbmRsZXI6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBhY2thZ2UgbmFtZS5cbiAgICovXG4gIG5wbTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGRpc3QtdGFnIGZvbGxvd2VkLiBgbGF0ZXN0YCB3aGVuIGFic2VudC5cbiAgICovXG4gIHRhZz86IHN0cmluZztcbiAgdmVyaWZ5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBpbm5lZCB2ZXJzaW9uLlxuICAgKi9cbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEV2ZXJ5dGhpbmcgdGhlIHN5bmMgZG9lcyB0byB0aGUgb3V0c2lkZSB3b3JsZCwgc28gYSB0ZXN0IGNhbiBzdGFuZCBhIGZpeHR1cmUgaW4gZm9yIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN5bmNEZXBlbmRlbmNpZXMge1xuICAvKipcbiAgICogUnVucyBhbiBleGVjdXRhYmxlIHdpdGggYXJndW1lbnRzIGFuZCBubyBzaGVsbC5cbiAgICovXG4gIGV4ZWM6IChmaWxlOiBzdHJpbmcsIGFyZ3VtZW50c186IHJlYWRvbmx5IHN0cmluZ1tdLCBlbnY/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PikgPT4gQ29tbWFuZFJlc3VsdDtcbiAgLyoqXG4gICAqIEdFVHMgYSBVUkwgYW5kIHBhcnNlcyB0aGUgSlNPTiBpdCByZXR1cm5zLCB0aHJvd2luZyBvbiBhbiBIVFRQIGVycm9yLlxuICAgKi9cbiAgZmV0Y2hKc29uOiAodXJsOiBzdHJpbmcpID0+IFByb21pc2U8dW5rbm93bj47XG4gIGxvZzogKHRleHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFJ1bnMgYSBjb21tYW5kIGxpbmUgdGhyb3VnaCB0aGUgc2hlbGw6IGEgaGFuZGxlciBvciBhIHZlcmlmeSBjb21tYW5kLlxuICAgKi9cbiAgc2hlbGw6IChjb21tYW5kOiBzdHJpbmcsIGVudj86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KSA9PiBDb21tYW5kUmVzdWx0O1xufVxuXG4vKipcbiAqIFRoZSBQUiBhbiB1cHN0cmVhbSBtb3ZlIGFza3MgZm9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN5bmNQbGFuIHtcbiAgYnJhbmNoOiBzdHJpbmc7XG4gIHN0YXR1czogVXBzdHJlYW1TdGF0dXM7XG4gIHRpdGxlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hhdCBoYXBwZW5lZCB0byBvbmUgZW50cnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3luY1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBTZXQgd2hlbiBjaGVja2luZyBvciBhcHBseWluZyB0aHJldzogdGhlIGpvYiByZXBvcnRzIGl0IGFuZCBtb3ZlcyBvbiB0byB0aGUgbmV4dCBlbnRyeS5cbiAgICovXG4gIHJlYWRvbmx5IGVycm9yPzogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBgcGxhbm5lZGAgaW4gYSBkcnkgcnVuLCBgb3BlbmVkYC9gdXBkYXRlZGAgd2hlbiBhIFBSIHdhcyBwdXNoZWQsIGB1bmNoYW5nZWRgIHdoZW4gdGhlIGJyYW5jaCBhbHJlYWR5IGhlbGQgdGhpcyByZXN1bHQuXG4gICAqL1xuICByZWFkb25seSBvdXRjb21lOiAnY3VycmVudCcgfCAnZXJyb3InIHwgJ29wZW5lZCcgfCAncGxhbm5lZCcgfCAndW5jaGFuZ2VkJyB8ICd1bndhdGNoZWQnIHwgJ3VwZGF0ZWQnO1xuICByZWFkb25seSBwck51bWJlcj86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBXaGF0IHtAbGluayBzeW5jVXBzdHJlYW1zfSBzeW5jcywgYW5kIGhvdy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTeW5jVXBzdHJlYW1zT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgYnJhbmNoIGVhY2ggUFIgdGFyZ2V0cyBhbmQgZWFjaCB1cGRhdGUgYnJhbmNoIGlzIGN1dCBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUJyYW5jaDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBhdGggdG8gYHVwc3RyZWFtcy5qc29uYCwgd2hpY2ggdGhlIHN5bmMgdXBkYXRlcyB0aGUgcGluIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnUGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogUGxhbiBhbmQgcHJpbnQgZXZlcnkgUFIsIGFuZCBjaGFuZ2Ugbm90aGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGRyeVJ1bjogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE9ubHkgdGhlIGVudHJpZXMgd2l0aCB0aGVzZSBuYW1lcywgb3IgZXZlcnkgZW50cnkgd2hlbiBlbXB0eS5cbiAgICovXG4gIHJlYWRvbmx5IG9ubHk6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE9uZSB1cHN0cmVhbSB0aGF0IGB1cHN0cmVhbXMuanNvbmAgbGlzdHM6IGEgZ2l0IG9uZSBvciBhbiBucG0gb25lLlxuICovXG5leHBvcnQgdHlwZSBVcHN0cmVhbUVudHJ5ID0gR2l0VXBzdHJlYW1FbnRyeSB8IE5wbVVwc3RyZWFtRW50cnk7XG5cbi8qKlxuICogVGhlIGNvbnRlbnQgb2YgYHVwc3RyZWFtcy5qc29uYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcHN0cmVhbXNDb25maWcge1xuICB1cHN0cmVhbXM6IHJlYWRvbmx5IFVwc3RyZWFtRW50cnlbXTtcbiAgLyoqXG4gICAqIFRoZSBzaGVsbCBjb21tYW5kIHRoYXQgY2hlY2tzIGV2ZXJ5IGhhbmRsZXIncyByZXN1bHQsIHVubGVzcyBhbiBlbnRyeSBuYW1lcyBpdHMgb3duLlxuICAgKi9cbiAgdmVyaWZ5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgb25lIGNvbXBhcmlzb24gb2YgYW4gZW50cnkgd2l0aCBpdHMgdXBzdHJlYW0gZm91bmQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBzdHJlYW1TdGF0dXMge1xuICAvKipcbiAgICogVGhlIHVwc3RyZWFtIHBhdGhzIHRoYXQgY2hhbmdlZCBhbmQgYXJlIHdhdGNoZWQsIHNvcnRlZC4gQWx3YXlzIGVtcHR5IGZvciBhbiBucG0gdXBzdHJlYW0uXG4gICAqL1xuICBjaGFuZ2VkUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogQSBsaW5rIHRoYXQgc2hvd3Mgd2hhdCBjaGFuZ2VkIGJldHdlZW4gdGhlIHBpbiBhbmQgdGhlIGhlYWQuXG4gICAqL1xuICBjb21wYXJlVXJsOiBzdHJpbmc7XG4gIGVudHJ5OiBVcHN0cmVhbUVudHJ5O1xuICAvKipcbiAgICogVGhlIGNvbW1pdCBvciB2ZXJzaW9uIHRoZSB1cHN0cmVhbSBpcyBhdCBub3cuXG4gICAqL1xuICBoZWFkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY29tbWl0IG9yIHZlcnNpb24gYHVwc3RyZWFtcy5qc29uYCByZWNvcmRzLlxuICAgKi9cbiAgcGluOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBgY3VycmVudGA6IG5vdGhpbmcgdG8gZG8uIGBtb3ZlZGA6IGEgUFIgaXMgZHVlLiBgdW53YXRjaGVkYDogdXBzdHJlYW0gbW92ZWQsIGJ1dCBubyB3YXRjaGVkIHBhdGggY2hhbmdlZC5cbiAgICovXG4gIHN0YXRlOiAnY3VycmVudCcgfCAnbW92ZWQnIHwgJ3Vud2F0Y2hlZCc7XG4gIC8qKlxuICAgKiBXaGV0aGVyIEdpdEh1YiB0cnVuY2F0ZWQgdGhlIGNvbXBhcmUncyBmaWxlIGxpc3QsIHNvIGEgd2F0Y2hlZCBwYXRoIG1heSBiZSBtaXNzaW5nIGZyb20gYGNoYW5nZWRQYXRoc2AuXG4gICAqL1xuICB0cnVuY2F0ZWQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBHaXRIdWJDb21taXQge1xuICBzaGE6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEdpdEh1YkNvbXBhcmUge1xuICBmaWxlcz86IHJlYWRvbmx5IEdpdEh1YkNvbXBhcmVGaWxlW107XG59XG5cbi8qKlxuICogT25lIGZpbGUgb2YgYSBHaXRIdWIgY29tcGFyZSwgYXMgdGhlIEFQSSBzcGVsbHMgaXQuXG4gKi9cbmludGVyZmFjZSBHaXRIdWJDb21wYXJlRmlsZSB7XG4gIGZpbGVuYW1lOiBzdHJpbmc7XG5cbiAgcHJldmlvdXNfZmlsZW5hbWU/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBOcG1QYWNrdW1lbnQge1xuICAnZGlzdC10YWdzJzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIFN0ZXBSZXN1bHQge1xuICByZWFkb25seSBjb21tYW5kOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlc3VsdDogQ29tbWFuZFJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgaGFuZGxlciBhbmQgdmVyaWZ5IHJ1bnMgYSBQUiBib2R5IHJlcG9ydHMuXG4gKi9cbmludGVyZmFjZSBTdGVwUmVzdWx0cyB7XG4gIGhhbmRsZXI6IFN0ZXBSZXN1bHQ7XG4gIHZlcmlmeTogbnVsbCB8IFN0ZXBSZXN1bHQ7XG59XG5cbi8qKlxuICogYHVwc3RyZWFtcy5qc29uYCByZWFkIGxvb3NlbHksIHRvIHdyaXRlIG9uZSB2YWx1ZSBiYWNrIHdpdGhvdXQgZGlzdHVyYmluZyB0aGUgcmVzdC5cbiAqL1xuaW50ZXJmYWNlIFVwc3RyZWFtc0ZpbGVTaGFwZSB7XG4gIHVwc3RyZWFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcbn1cblxuLyoqXG4gKiBHaXRIdWIncyBjb21wYXJlIEFQSSBsaXN0cyBhdCBtb3N0IHRoaXMgbWFueSBmaWxlcywgYW5kIHNheXMgbm90aGluZyB3aGVuIGl0IHN0b3BzLlxuICovXG5jb25zdCBDT01QQVJFX0ZJTEVfTElNSVQgPSAzMDA7XG5cbmNvbnN0IFNIT1JUX1NIQV9MRU5HVEggPSAxMjtcblxuLyoqXG4gKiBUaGUgdGFpbCBvZiBhIGNvbW1hbmQncyBvdXRwdXQgYSBQUiBib2R5IHF1b3RlczogZW5vdWdoIHRvIHJlYWQgYSBmYWlsdXJlLCBzaG9ydCBlbm91Z2ggdG8gc3RheSB1bmRlciBHaXRIdWIncyBib2R5IGxpbWl0LlxuICovXG5jb25zdCBPVVRQVVRfVEFJTF9MSU5FUyA9IDYwO1xuXG5jb25zdCBKU09OX0lOREVOVF9TUEFDRVMgPSAyO1xuXG4vKipcbiAqIFdyaXRlcyB0aGUgUFIgYm9keS5cbiAqXG4gKiBAcGFyYW0gcGxhbiAtIFRoZSBwbGFuLlxuICogQHBhcmFtIHN0ZXBzIC0gVGhlIGhhbmRsZXIgYW5kIHZlcmlmeSBydW5zLCBvciBgbnVsbGAgaW4gYSBkcnkgcnVuLCB3aGVyZSBuZWl0aGVyIHJ1bnMuXG4gKiBAcGFyYW0gZGlmZlN0YXQgLSBgZ2l0IGRpZmYgLS1zdGF0YCBvZiB0aGUgdXBkYXRlIGNvbW1pdCwgb3IgYG51bGxgIGluIGEgZHJ5IHJ1bi5cbiAqIEByZXR1cm5zIFRoZSBib2R5LCBpbiBNYXJrZG93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUHJCb2R5KHBsYW46IFN5bmNQbGFuLCBzdGVwczogbnVsbCB8IFN0ZXBSZXN1bHRzLCBkaWZmU3RhdDogbnVsbCB8IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgZW50cnksIGhlYWQsIHBpbiB9ID0gcGxhbi5zdGF0dXM7XG4gIGNvbnN0IHNvdXJjZSA9IGlzR2l0VXBzdHJlYW0oZW50cnkpID8gYFxcYCR7ZW50cnkucmVwb31AJHtlbnRyeS5yZWZ9XFxgYCA6IGBucG0gXFxgJHtlbnRyeS5ucG19QCR7ZW50cnkudGFnID8/ICdsYXRlc3QnfVxcYGA7XG4gIGNvbnN0IGxpbmVzID0gW1xuICAgIGBVcHN0cmVhbSBcXGAke2VudHJ5Lm5hbWV9XFxgIG1vdmVkOiAke3NvdXJjZX0gZnJvbSBcXGAke3Bpbn1cXGAgdG8gXFxgJHtoZWFkfVxcYC5gLFxuICAgICcnLFxuICAgIGBDb21wYXJlOiAke3BsYW4uc3RhdHVzLmNvbXBhcmVVcmx9YCxcbiAgICAnJ1xuICBdO1xuXG4gIGlmIChpc0dpdFVwc3RyZWFtKGVudHJ5KSkge1xuICAgIGxpbmVzLnB1c2goJyMjIyBDaGFuZ2VkIHVwc3RyZWFtIGZpbGVzJywgJycsIC4uLnBsYW4uc3RhdHVzLmNoYW5nZWRQYXRocy5tYXAoKHBhdGgpID0+IGAtIFxcYCR7cGF0aH1cXGBgKSk7XG4gICAgaWYgKHBsYW4uc3RhdHVzLnRydW5jYXRlZCkge1xuICAgICAgbGluZXMucHVzaChgLSBHaXRIdWIgbGlzdHMgYXQgbW9zdCAke1N0cmluZyhDT01QQVJFX0ZJTEVfTElNSVQpfSBmaWxlczogb3BlbiB0aGUgY29tcGFyZSBsaW5rIGZvciB0aGUgcmVzdC5gKTtcbiAgICB9XG4gICAgbGluZXMucHVzaCgnJyk7XG4gIH1cblxuICBpZiAoc3RlcHMgPT09IG51bGwpIHtcbiAgICBsaW5lcy5wdXNoKCcjIyMgSGFuZGxlcicsICcnLCBgXFxgJHtlbnRyeS5oYW5kbGVyfVxcYDogbm90IHJ1biAoZHJ5IHJ1bikuYCwgJycpO1xuICB9IGVsc2Uge1xuICAgIGxpbmVzLnB1c2goLi4uZGVzY3JpYmVTdGVwKCdIYW5kbGVyJywgc3RlcHMuaGFuZGxlcikpO1xuICAgIGlmIChzdGVwcy52ZXJpZnkgIT09IG51bGwpIHtcbiAgICAgIGxpbmVzLnB1c2goLi4uZGVzY3JpYmVTdGVwKCdWZXJpZnknLCBzdGVwcy52ZXJpZnkpKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZGlmZlN0YXQgIT09IG51bGwpIHtcbiAgICBsaW5lcy5wdXNoKCcjIyMgR2VuZXJhdGVkIGNoYW5nZXMnLCAnJywgJ2BgYHRleHQnLCBkaWZmU3RhdC50cmltRW5kKCksICdgYGAnLCAnJyk7XG4gIH1cblxuICBsaW5lcy5wdXNoKCdUaGlzIFBSIHdhcyBvcGVuZWQgYnkgdGhlIHVwc3RyZWFtLXN5bmMgam9iIGFuZCBpcyBuZXZlciBtZXJnZWQgYXV0b21hdGljYWxseS4nKTtcbiAgcmV0dXJuIGAke2xpbmVzLmpvaW4oJ1xcbicpfVxcbmA7XG59XG5cbi8qKlxuICogQ29tcGFyZXMgb25lIGVudHJ5IHdpdGggaXRzIHVwc3RyZWFtLlxuICpcbiAqIEBwYXJhbSBlbnRyeSAtIFRoZSBlbnRyeS5cbiAqIEBwYXJhbSBkZXBlbmRlbmNpZXMgLSBUaGUgb3V0c2lkZSB3b3JsZC5cbiAqIEByZXR1cm5zIFdoYXQgdGhlIGNvbXBhcmlzb24gZm91bmQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb21wYXJlV2l0aFVwc3RyZWFtKGVudHJ5OiBVcHN0cmVhbUVudHJ5LCBkZXBlbmRlbmNpZXM6IFBpY2s8U3luY0RlcGVuZGVuY2llcywgJ2ZldGNoSnNvbic+KTogUHJvbWlzZTxVcHN0cmVhbVN0YXR1cz4ge1xuICBpZiAoIWlzR2l0VXBzdHJlYW0oZW50cnkpKSB7XG4gICAgY29uc3QgdGFnID0gZW50cnkudGFnID8/ICdsYXRlc3QnO1xuICAgIGNvbnN0IHBhY2t1bWVudCA9IGF3YWl0IGRlcGVuZGVuY2llcy5mZXRjaEpzb24oYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnLyR7ZW50cnkubnBtLnJlcGxhY2UoJy8nLCAnJTJmJyl9YCkgYXMgTnBtUGFja3VtZW50O1xuICAgIGNvbnN0IGhlYWQgPSBwYWNrdW1lbnRbJ2Rpc3QtdGFncyddW3RhZ107XG4gICAgaWYgKGhlYWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBucG0gcGFja2FnZSAke2VudHJ5Lm5wbX0gaGFzIG5vIGRpc3QtdGFnIFwiJHt0YWd9XCIuYCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjaGFuZ2VkUGF0aHM6IFtdLFxuICAgICAgY29tcGFyZVVybDogYGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlLyR7ZW50cnkubnBtfS92LyR7aGVhZH1gLFxuICAgICAgZW50cnksXG4gICAgICBoZWFkLFxuICAgICAgcGluOiBlbnRyeS52ZXJzaW9uLFxuICAgICAgc3RhdGU6IGhlYWQgPT09IGVudHJ5LnZlcnNpb24gPyAnY3VycmVudCcgOiAnbW92ZWQnLFxuICAgICAgdHJ1bmNhdGVkOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICBjb25zdCBjb21taXQgPSBhd2FpdCBkZXBlbmRlbmNpZXMuZmV0Y2hKc29uKGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7ZW50cnkucmVwb30vY29tbWl0cy8ke2VuY29kZVVSSUNvbXBvbmVudChlbnRyeS5yZWYpfWApIGFzIEdpdEh1YkNvbW1pdDtcbiAgY29uc3QgaGVhZCA9IGNvbW1pdC5zaGE7XG4gIGNvbnN0IGNvbXBhcmVVcmwgPSBgaHR0cHM6Ly9naXRodWIuY29tLyR7ZW50cnkucmVwb30vY29tcGFyZS8ke2VudHJ5LmNvbW1pdH0uLi4ke2hlYWR9YDtcbiAgaWYgKGhlYWQgPT09IGVudHJ5LmNvbW1pdCkge1xuICAgIHJldHVybiB7IGNoYW5nZWRQYXRoczogW10sIGNvbXBhcmVVcmwsIGVudHJ5LCBoZWFkLCBwaW46IGVudHJ5LmNvbW1pdCwgc3RhdGU6ICdjdXJyZW50JywgdHJ1bmNhdGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgY29uc3QgY29tcGFyZSA9IGF3YWl0IGRlcGVuZGVuY2llcy5mZXRjaEpzb24oYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtlbnRyeS5yZXBvfS9jb21wYXJlLyR7ZW50cnkuY29tbWl0fS4uLiR7aGVhZH1gKSBhcyBHaXRIdWJDb21wYXJlO1xuICBjb25zdCBmaWxlcyA9IGNvbXBhcmUuZmlsZXMgPz8gW107XG4gIGNvbnN0IHRvdWNoZWQgPSBuZXcgU2V0KGZpbGVzLmZsYXRNYXAoKGZpbGUpID0+IGZpbGUucHJldmlvdXNfZmlsZW5hbWUgPT09IHVuZGVmaW5lZCA/IFtmaWxlLmZpbGVuYW1lXSA6IFtmaWxlLmZpbGVuYW1lLCBmaWxlLnByZXZpb3VzX2ZpbGVuYW1lXSkpO1xuICBjb25zdCBjaGFuZ2VkUGF0aHMgPSBbLi4udG91Y2hlZF0uZmlsdGVyKChwYXRoKSA9PiBlbnRyeS5wYXRocy5zb21lKChnbG9iKSA9PiBtYXRjaGVzR2xvYihwYXRoLCBnbG9iKSkpLnNvcnQoKTtcbiAgY29uc3QgaXNUcnVuY2F0ZWQgPSBmaWxlcy5sZW5ndGggPj0gQ09NUEFSRV9GSUxFX0xJTUlUO1xuICByZXR1cm4ge1xuICAgIGNoYW5nZWRQYXRocyxcbiAgICBjb21wYXJlVXJsLFxuICAgIGVudHJ5LFxuICAgIGhlYWQsXG4gICAgcGluOiBlbnRyeS5jb21taXQsXG4gICAgc3RhdGU6IGNoYW5nZWRQYXRocy5sZW5ndGggPiAwIHx8IGlzVHJ1bmNhdGVkID8gJ21vdmVkJyA6ICd1bndhdGNoZWQnLFxuICAgIHRydW5jYXRlZDogaXNUcnVuY2F0ZWRcbiAgfTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYW5kIHZhbGlkYXRlcyBhbiBgdXBzdHJlYW1zLmpzb25gLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIGZpbGUncyBjb250ZW50LlxuICogQHJldHVybnMgVGhlIGNvbmZpZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVXBzdHJlYW1zQ29uZmlnKHRleHQ6IHN0cmluZyk6IFVwc3RyZWFtc0NvbmZpZyB7XG4gIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UodGV4dCkgYXMgUGFydGlhbDxVcHN0cmVhbXNDb25maWc+O1xuICBpZiAoIUFycmF5LmlzQXJyYXkoY29uZmlnLnVwc3RyZWFtcykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1cHN0cmVhbXMuanNvbiBoYXMgbm8gXCJ1cHN0cmVhbXNcIiBhcnJheS4nKTtcbiAgfVxuICAvLyBSZWFkIHRocm91Z2ggYFJlZmxlY3QuZ2V0YCwgYmVjYXVzZSBub3RoaW5nIGFib3V0IHRoZSBwYXJzZWQgZW50cmllcyBpcyBrbm93biB5ZXQuXG4gIGNvbnN0IGVudHJpZXM6IHJlYWRvbmx5IG9iamVjdFtdID0gY29uZmlnLnVwc3RyZWFtcztcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0PHVua25vd24+KCk7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IG5hbWU6IHVua25vd24gPSBSZWZsZWN0LmdldChlbnRyeSwgJ25hbWUnKTtcbiAgICBjb25zdCBsYWJlbCA9IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyA/IGBcIiR7bmFtZX1cImAgOiAnd2l0aCBubyBuYW1lJztcbiAgICBjb25zdCBpc0dpdCA9ICdyZXBvJyBpbiBlbnRyeTtcbiAgICBjb25zdCByZXF1aXJlZCA9IGlzR2l0ID8gWyduYW1lJywgJ3JlcG8nLCAncmVmJywgJ2NvbW1pdCcsICdoYW5kbGVyJ10gOiBbJ25hbWUnLCAnbnBtJywgJ3ZlcnNpb24nLCAnaGFuZGxlciddO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHJlcXVpcmVkKSB7XG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QuZ2V0KGVudHJ5LCBrZXkpICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGB1cHN0cmVhbXMuanNvbjogZW50cnkgJHtsYWJlbH0gbmVlZHMgYSBzdHJpbmcgXCIke2tleX1cIi5gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzR2l0ICYmICFBcnJheS5pc0FycmF5KFJlZmxlY3QuZ2V0KGVudHJ5LCAncGF0aHMnKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdXBzdHJlYW1zLmpzb246IGVudHJ5ICR7bGFiZWx9IG5lZWRzIGEgXCJwYXRoc1wiIGFycmF5LmApO1xuICAgIH1cbiAgICBpZiAobmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVwc3RyZWFtcy5qc29uOiB0aGUgbmFtZSAke2xhYmVsfSBpcyB1c2VkIHR3aWNlLmApO1xuICAgIH1cbiAgICBuYW1lcy5hZGQobmFtZSk7XG4gIH1cbiAgcmV0dXJuIGNvbmZpZyBhcyBVcHN0cmVhbXNDb25maWc7XG59XG5cbi8qKlxuICogUGxhbnMgdGhlIFBSIGEgbW92ZWQgdXBzdHJlYW0gYXNrcyBmb3IuXG4gKlxuICogQHBhcmFtIHN0YXR1cyAtIFRoZSBjb21wYXJpc29uIG9mIGEgbW92ZWQgZW50cnkuXG4gKiBAcmV0dXJucyBUaGUgYnJhbmNoIGFuZCB0aXRsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsYW5TeW5jKHN0YXR1czogVXBzdHJlYW1TdGF0dXMpOiBTeW5jUGxhbiB7XG4gIHJldHVybiB7XG4gICAgYnJhbmNoOiBgdXBzdHJlYW0vJHtzdGF0dXMuZW50cnkubmFtZX1gLFxuICAgIHN0YXR1cyxcbiAgICB0aXRsZTogYGNob3JlKHVwc3RyZWFtKTogc3luYyAke3N0YXR1cy5lbnRyeS5uYW1lfSB0byAke3Nob3J0ZW4oc3RhdHVzLmhlYWQpfWBcbiAgfTtcbn1cblxuLyoqXG4gKiBDaGVja3MgZXZlcnkgZW50cnksIGFuZCBvcGVucyBvciB1cGRhdGVzIG9uZSBQUiBwZXIgbW92ZWQgdXBzdHJlYW0uXG4gKlxuICogQSBoYW5kbGVyIG9yIHZlcmlmeSBmYWlsdXJlIHN0aWxsIG9wZW5zIHRoZSBQUiwgYXMgYSBkcmFmdCB3aXRoIHRoZSBmYWlsdXJlIGluIGl0cyBib2R5LCBzbyBhIGJyZWFraW5nIHVwc3RyZWFtIGNoYW5nZVxuICogaXMgc2VlbiByYXRoZXIgdGhhbiBza2lwcGVkLiBBbiBlcnJvciBpbiB0aGUgc3luYyBpdHNlbGYsIHN1Y2ggYXMgYSBmYWlsZWQgQVBJIGNhbGwsIGlzIHJlcG9ydGVkIGluIHRoZSBlbnRyeSdzIHJlc3VsdFxuICogYW5kIHRoZSBuZXh0IGVudHJ5IHN0aWxsIHJ1bnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBXaGF0IHRvIHN5bmMsIGFuZCBob3cuXG4gKiBAcGFyYW0gZGVwZW5kZW5jaWVzIC0gVGhlIG91dHNpZGUgd29ybGQuXG4gKiBAcmV0dXJucyBPbmUgcmVzdWx0IHBlciBlbnRyeSBjaGVja2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3luY1Vwc3RyZWFtcyhvcHRpb25zOiBTeW5jVXBzdHJlYW1zT3B0aW9ucywgZGVwZW5kZW5jaWVzOiBTeW5jRGVwZW5kZW5jaWVzKTogUHJvbWlzZTxTeW5jUmVzdWx0W10+IHtcbiAgY29uc3QgY29uZmlnID0gcGFyc2VVcHN0cmVhbXNDb25maWcocmVhZEZpbGVTeW5jKG9wdGlvbnMuY29uZmlnUGF0aCwgJ3V0Zi04JykpO1xuICBjb25zdCB1bmtub3duID0gb3B0aW9ucy5vbmx5LmZpbHRlcigobmFtZSkgPT4gY29uZmlnLnVwc3RyZWFtcy5ldmVyeSgoZW50cnkpID0+IGVudHJ5Lm5hbWUgIT09IG5hbWUpKTtcbiAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgdXBzdHJlYW1zLmpzb24gaGFzIG5vIGVudHJ5IG5hbWVkICR7dW5rbm93bi5tYXAoKG5hbWUpID0+IGBcIiR7bmFtZX1cImApLmpvaW4oJywgJyl9LmApO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0czogU3luY1Jlc3VsdFtdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgY29uZmlnLnVwc3RyZWFtcykge1xuICAgIGlmIChvcHRpb25zLm9ubHkubGVuZ3RoID4gMCAmJiAhb3B0aW9ucy5vbmx5LmluY2x1ZGVzKGVudHJ5Lm5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdHMucHVzaChhd2FpdCBzeW5jRW50cnkoZW50cnksIGNvbmZpZywgb3B0aW9ucywgZGVwZW5kZW5jaWVzKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBkZXBlbmRlbmNpZXMubG9nKGAke2VudHJ5Lm5hbWV9OiBFUlJPUiAke21lc3NhZ2V9YCk7XG4gICAgICByZXN1bHRzLnB1c2goeyBlcnJvcjogbWVzc2FnZSwgbmFtZTogZW50cnkubmFtZSwgb3V0Y29tZTogJ2Vycm9yJyB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbi8qKlxuICogUmVjb3JkcyBgaGVhZGAgYXMgdGhlIGVudHJ5J3MgcGluIGluIGB1cHN0cmVhbXMuanNvbmAsIHVubGVzcyB0aGUgaGFuZGxlciBhbHJlYWR5IG1vdmVkIGl0LCBrZWVwaW5nIHRoZSBmaWxlJ3NcbiAqIGtleSBvcmRlciBhbmQgZm9ybWF0dGluZy5cbiAqXG4gKiBAcGFyYW0gY29uZmlnUGF0aCAtIFRoZSBwYXRoIHRvIGB1cHN0cmVhbXMuanNvbmAuXG4gKiBAcGFyYW0gc3RhdHVzIC0gVGhlIGNvbXBhcmlzb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVBpbihjb25maWdQYXRoOiBzdHJpbmcsIHN0YXR1czogVXBzdHJlYW1TdGF0dXMpOiB2b2lkIHtcbiAgY29uc3QgdGV4dCA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KSBhcyBVcHN0cmVhbXNGaWxlU2hhcGU7XG4gIGNvbnN0IGtleSA9IGlzR2l0VXBzdHJlYW0oc3RhdHVzLmVudHJ5KSA/ICdjb21taXQnIDogJ3ZlcnNpb24nO1xuICBjb25zdCB0YXJnZXQgPSBwYXJzZWQudXBzdHJlYW1zLmZpbmQoKGVudHJ5KSA9PiBlbnRyeVsnbmFtZSddID09PSBzdGF0dXMuZW50cnkubmFtZSk7XG4gIGlmICh0YXJnZXQ/LltrZXldICE9PSBzdGF0dXMucGluKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRhcmdldFtrZXldID0gc3RhdHVzLmhlYWQ7XG4gIHdyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgYCR7SlNPTi5zdHJpbmdpZnkocGFyc2VkLCBudWxsLCBKU09OX0lOREVOVF9TUEFDRVMpfVxcbmApO1xufVxuXG5mdW5jdGlvbiBhcHBseVBsYW4ocGxhbjogU3luY1BsYW4sIGNvbmZpZzogVXBzdHJlYW1zQ29uZmlnLCBvcHRpb25zOiBTeW5jVXBzdHJlYW1zT3B0aW9ucywgZGVwZW5kZW5jaWVzOiBTeW5jRGVwZW5kZW5jaWVzKTogU3luY1Jlc3VsdCB7XG4gIGNvbnN0IHsgZW50cnkgfSA9IHBsYW4uc3RhdHVzO1xuICBjb25zdCBlbnYgPSB7IFVQU1RSRUFNX05BTUU6IGVudHJ5Lm5hbWUsIFVQU1RSRUFNX1RBUkdFVDogcGxhbi5zdGF0dXMuaGVhZCB9O1xuICBjb25zdCBoYW5kbGVyOiBTdGVwUmVzdWx0ID0geyBjb21tYW5kOiBlbnRyeS5oYW5kbGVyLCByZXN1bHQ6IGRlcGVuZGVuY2llcy5zaGVsbChlbnRyeS5oYW5kbGVyLCBlbnYpIH07XG4gIHdyaXRlUGluKG9wdGlvbnMuY29uZmlnUGF0aCwgcGxhbi5zdGF0dXMpO1xuICBjb25zdCB2ZXJpZnlDb21tYW5kID0gZW50cnkudmVyaWZ5ID8/IGNvbmZpZy52ZXJpZnk7XG4gIGNvbnN0IHZlcmlmeTogbnVsbCB8IFN0ZXBSZXN1bHQgPSB2ZXJpZnlDb21tYW5kID09PSB1bmRlZmluZWQgPyBudWxsIDogeyBjb21tYW5kOiB2ZXJpZnlDb21tYW5kLCByZXN1bHQ6IGRlcGVuZGVuY2llcy5zaGVsbCh2ZXJpZnlDb21tYW5kLCBlbnYpIH07XG4gIGNvbnN0IGlzRmFpbGVkID0gaGFuZGxlci5yZXN1bHQuZXhpdENvZGUgIT09IDAgfHwgKHZlcmlmeSAhPT0gbnVsbCAmJiB2ZXJpZnkucmVzdWx0LmV4aXRDb2RlICE9PSAwKTtcblxuICBleGVjT3JUaHJvdyhkZXBlbmRlbmNpZXMsICdnaXQnLCBbJ2FkZCcsICctLWFsbCddKTtcbiAgZXhlY09yVGhyb3coZGVwZW5kZW5jaWVzLCAnZ2l0JywgWydjb21taXQnLCAnLS1uby12ZXJpZnknLCAnLS1tZXNzYWdlJywgcGxhbi50aXRsZV0pO1xuICBjb25zdCBkaWZmU3RhdCA9IGV4ZWNPclRocm93KGRlcGVuZGVuY2llcywgJ2dpdCcsIFsnZGlmZicsICctLXN0YXQnLCAnSEVBRH4xJywgJ0hFQUQnXSk7XG5cbiAgY29uc3QgaXNSZW1vdGVCcmFuY2ggPSBkZXBlbmRlbmNpZXMuZXhlYygnZ2l0JywgWydscy1yZW1vdGUnLCAnLS1leGl0LWNvZGUnLCAnLS1oZWFkcycsICdvcmlnaW4nLCBwbGFuLmJyYW5jaF0pLmV4aXRDb2RlID09PSAwO1xuICBpZiAoaXNSZW1vdGVCcmFuY2gpIHtcbiAgICBleGVjT3JUaHJvdyhkZXBlbmRlbmNpZXMsICdnaXQnLCBbJ2ZldGNoJywgJ29yaWdpbicsIHBsYW4uYnJhbmNoXSk7XG4gICAgaWYgKGRlcGVuZGVuY2llcy5leGVjKCdnaXQnLCBbJ2RpZmYnLCAnLS1xdWlldCcsICdGRVRDSF9IRUFEJywgJ0hFQUQnXSkuZXhpdENvZGUgPT09IDApIHtcbiAgICAgIGRlcGVuZGVuY2llcy5sb2coYCR7ZW50cnkubmFtZX06ICR7cGxhbi5icmFuY2h9IGFscmVhZHkgaG9sZHMgdGhpcyByZXN1bHQ7IG5vdGhpbmcgcHVzaGVkLmApO1xuICAgICAgcmV0dXJuIHsgbmFtZTogZW50cnkubmFtZSwgb3V0Y29tZTogJ3VuY2hhbmdlZCcgfTtcbiAgICB9XG4gIH1cbiAgZXhlY09yVGhyb3coZGVwZW5kZW5jaWVzLCAnZ2l0JywgWydwdXNoJywgJy0tZm9yY2UnLCAnb3JpZ2luJywgYEhFQUQ6cmVmcy9oZWFkcy8ke3BsYW4uYnJhbmNofWBdKTtcblxuICBjb25zdCBib2R5ID0gYnVpbGRQckJvZHkocGxhbiwgeyBoYW5kbGVyLCB2ZXJpZnkgfSwgZGlmZlN0YXQpO1xuICBjb25zdCBleGlzdGluZyA9IGV4ZWNPclRocm93KGRlcGVuZGVuY2llcywgJ2doJywgWydwcicsICdsaXN0JywgJy0taGVhZCcsIHBsYW4uYnJhbmNoLCAnLS1zdGF0ZScsICdvcGVuJywgJy0tanNvbicsICdudW1iZXInLCAnLS1qcScsICcuWzBdLm51bWJlciddKS50cmltKCk7XG4gIGlmIChleGlzdGluZyAhPT0gJycgJiYgZXhpc3RpbmcgIT09ICdudWxsJykge1xuICAgIGNvbnN0IHByTnVtYmVyID0gTnVtYmVyKGV4aXN0aW5nKTtcbiAgICBleGVjT3JUaHJvdyhkZXBlbmRlbmNpZXMsICdnaCcsIFsncHInLCAnZWRpdCcsIGV4aXN0aW5nLCAnLS10aXRsZScsIHBsYW4udGl0bGUsICctLWJvZHknLCBib2R5XSk7XG4gICAgZXhlY09yVGhyb3coZGVwZW5kZW5jaWVzLCAnZ2gnLCBpc0ZhaWxlZCA/IFsncHInLCAncmVhZHknLCBleGlzdGluZywgJy0tdW5kbyddIDogWydwcicsICdyZWFkeScsIGV4aXN0aW5nXSk7XG4gICAgZGVwZW5kZW5jaWVzLmxvZyhgJHtlbnRyeS5uYW1lfTogdXBkYXRlZCBQUiAjJHtleGlzdGluZ30ke2lzRmFpbGVkID8gJyAoZHJhZnQ6IGEgc3RlcCBmYWlsZWQpJyA6ICcnfS5gKTtcbiAgICByZXR1cm4geyBuYW1lOiBlbnRyeS5uYW1lLCBvdXRjb21lOiAndXBkYXRlZCcsIHByTnVtYmVyIH07XG4gIH1cblxuICBjb25zdCB1cmwgPSBleGVjT3JUaHJvdyhkZXBlbmRlbmNpZXMsICdnaCcsIFtcbiAgICAncHInLFxuICAgICdjcmVhdGUnLFxuICAgICctLWJhc2UnLFxuICAgIG9wdGlvbnMuYmFzZUJyYW5jaCxcbiAgICAnLS1oZWFkJyxcbiAgICBwbGFuLmJyYW5jaCxcbiAgICAnLS10aXRsZScsXG4gICAgcGxhbi50aXRsZSxcbiAgICAnLS1ib2R5JyxcbiAgICBib2R5LFxuICAgIC4uLihpc0ZhaWxlZCA/IFsnLS1kcmFmdCddIDogW10pXG4gIF0pLnRyaW0oKTtcbiAgZGVwZW5kZW5jaWVzLmxvZyhgJHtlbnRyeS5uYW1lfTogb3BlbmVkICR7dXJsfSR7aXNGYWlsZWQgPyAnIChkcmFmdDogYSBzdGVwIGZhaWxlZCknIDogJyd9LmApO1xuICBjb25zdCBwck51bWJlciA9IE51bWJlcigvXFwvcHVsbFxcLyg/PE51bWJlcj5cXGQrKS8uZXhlYyh1cmwpPy5ncm91cHM/LlsnTnVtYmVyJ10gPz8gTmFOKTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihwck51bWJlcikgPyB7IG5hbWU6IGVudHJ5Lm5hbWUsIG91dGNvbWU6ICdvcGVuZWQnIH0gOiB7IG5hbWU6IGVudHJ5Lm5hbWUsIG91dGNvbWU6ICdvcGVuZWQnLCBwck51bWJlciB9O1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVN0ZXAoaGVhZGluZzogc3RyaW5nLCBzdGVwOiBTdGVwUmVzdWx0KTogc3RyaW5nW10ge1xuICBjb25zdCBpc1Bhc3NlZCA9IHN0ZXAucmVzdWx0LmV4aXRDb2RlID09PSAwO1xuICBjb25zdCB0YWlsID0gc3RlcC5yZXN1bHQub3V0cHV0LnRyaW1FbmQoKS5zcGxpdCgvXFxyP1xcbi8pLnNsaWNlKC1PVVRQVVRfVEFJTF9MSU5FUykuam9pbignXFxuJyk7XG4gIHJldHVybiBbXG4gICAgYCMjIyAke2hlYWRpbmd9YCxcbiAgICAnJyxcbiAgICBgXFxgJHtzdGVwLmNvbW1hbmR9XFxgOiAke2lzUGFzc2VkID8gJ3Bhc3NlZCcgOiBgKipGQUlMRUQqKiAoZXhpdCAke1N0cmluZyhzdGVwLnJlc3VsdC5leGl0Q29kZSl9KWB9LmAsXG4gICAgJycsXG4gICAgaXNQYXNzZWQgPyAnPGRldGFpbHM+PHN1bW1hcnk+T3V0cHV0PC9zdW1tYXJ5PicgOiAnPGRldGFpbHMgb3Blbj48c3VtbWFyeT5PdXRwdXQ8L3N1bW1hcnk+JyxcbiAgICAnJyxcbiAgICAnYGBgdGV4dCcsXG4gICAgdGFpbCxcbiAgICAnYGBgJyxcbiAgICAnJyxcbiAgICAnPC9kZXRhaWxzPicsXG4gICAgJydcbiAgXTtcbn1cblxuZnVuY3Rpb24gZXhlY09yVGhyb3coZGVwZW5kZW5jaWVzOiBTeW5jRGVwZW5kZW5jaWVzLCBmaWxlOiBzdHJpbmcsIGFyZ3VtZW50c186IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzdWx0ID0gZGVwZW5kZW5jaWVzLmV4ZWMoZmlsZSwgYXJndW1lbnRzXyk7XG4gIGlmIChyZXN1bHQuZXhpdENvZGUgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZmlsZX0gJHthcmd1bWVudHNfLmpvaW4oJyAnKX0gZmFpbGVkIChleGl0ICR7U3RyaW5nKHJlc3VsdC5leGl0Q29kZSl9KTogJHtyZXN1bHQub3V0cHV0LnRyaW0oKX1gKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0Lm91dHB1dDtcbn1cblxuZnVuY3Rpb24gaXNHaXRVcHN0cmVhbShlbnRyeTogVXBzdHJlYW1FbnRyeSk6IGVudHJ5IGlzIEdpdFVwc3RyZWFtRW50cnkge1xuICByZXR1cm4gJ3JlcG8nIGluIGVudHJ5O1xufVxuXG5mdW5jdGlvbiBzaG9ydGVuKGhlYWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAvXlswLTlhLWZdezQwfSQvLnRlc3QoaGVhZCkgPyBoZWFkLnNsaWNlKDAsIFNIT1JUX1NIQV9MRU5HVEgpIDogaGVhZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3luY0VudHJ5KGVudHJ5OiBVcHN0cmVhbUVudHJ5LCBjb25maWc6IFVwc3RyZWFtc0NvbmZpZywgb3B0aW9uczogU3luY1Vwc3RyZWFtc09wdGlvbnMsIGRlcGVuZGVuY2llczogU3luY0RlcGVuZGVuY2llcyk6IFByb21pc2U8U3luY1Jlc3VsdD4ge1xuICBjb25zdCBzdGF0dXMgPSBhd2FpdCBjb21wYXJlV2l0aFVwc3RyZWFtKGVudHJ5LCBkZXBlbmRlbmNpZXMpO1xuICBpZiAoc3RhdHVzLnN0YXRlID09PSAnY3VycmVudCcpIHtcbiAgICBkZXBlbmRlbmNpZXMubG9nKGAke2VudHJ5Lm5hbWV9OiBjdXJyZW50IGF0ICR7c2hvcnRlbihzdGF0dXMuaGVhZCl9LmApO1xuICAgIHJldHVybiB7IG5hbWU6IGVudHJ5Lm5hbWUsIG91dGNvbWU6ICdjdXJyZW50JyB9O1xuICB9XG4gIGlmIChzdGF0dXMuc3RhdGUgPT09ICd1bndhdGNoZWQnKSB7XG4gICAgZGVwZW5kZW5jaWVzLmxvZyhgJHtlbnRyeS5uYW1lfTogbW92ZWQgdG8gJHtzaG9ydGVuKHN0YXR1cy5oZWFkKX0sIGJ1dCBubyB3YXRjaGVkIHBhdGggY2hhbmdlZCBzaW5jZSAke3Nob3J0ZW4oc3RhdHVzLnBpbil9LmApO1xuICAgIHJldHVybiB7IG5hbWU6IGVudHJ5Lm5hbWUsIG91dGNvbWU6ICd1bndhdGNoZWQnIH07XG4gIH1cblxuICBjb25zdCBwbGFuID0gcGxhblN5bmMoc3RhdHVzKTtcbiAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgZGVwZW5kZW5jaWVzLmxvZyhgJHtlbnRyeS5uYW1lfTogbW92ZWQgZnJvbSAke3Nob3J0ZW4oc3RhdHVzLnBpbil9IHRvICR7c2hvcnRlbihzdGF0dXMuaGVhZCl9LiBXb3VsZCBwdXNoICR7cGxhbi5icmFuY2h9IGFuZCBvcGVuOmApO1xuICAgIGRlcGVuZGVuY2llcy5sb2coYCAgdGl0bGU6ICR7cGxhbi50aXRsZX1gKTtcbiAgICBkZXBlbmRlbmNpZXMubG9nKGJ1aWxkUHJCb2R5KHBsYW4sIG51bGwsIG51bGwpLnJlcGxhY2VBbGwoL14vZ20sICcgIHwgJykpO1xuICAgIHJldHVybiB7IG5hbWU6IGVudHJ5Lm5hbWUsIG91dGNvbWU6ICdwbGFubmVkJyB9O1xuICB9XG5cbiAgLy8gVGhlIHVwZGF0ZSBjb21taXQgdGFrZXMgZXZlcnkgZmlsZSBpbiB0aGUgdHJlZSwgc28gYSBmaWxlIGxlZnQgbHlpbmcgYXJvdW5kIHdvdWxkIGJlIHB1c2hlZCB3aXRoIGl0LlxuICBjb25zdCBkaXJ0eSA9IGV4ZWNPclRocm93KGRlcGVuZGVuY2llcywgJ2dpdCcsIFsnc3RhdHVzJywgJy0tcG9yY2VsYWluJ10pLnRyaW0oKTtcbiAgaWYgKGRpcnR5ICE9PSAnJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgdGhlIHdvcmtpbmcgdHJlZSBpcyBub3QgY2xlYW4sIGFuZCB0aGUgdXBkYXRlIGNvbW1pdCB3b3VsZCB0YWtlIHRoZXNlIGZpbGVzIHdpdGggaXQ6XFxuJHtkaXJ0eX1gKTtcbiAgfVxuICBleGVjT3JUaHJvdyhkZXBlbmRlbmNpZXMsICdnaXQnLCBbJ2ZldGNoJywgJ29yaWdpbicsIG9wdGlvbnMuYmFzZUJyYW5jaF0pO1xuICBleGVjT3JUaHJvdyhkZXBlbmRlbmNpZXMsICdnaXQnLCBbJ2NoZWNrb3V0JywgJy1CJywgcGxhbi5icmFuY2gsIGBvcmlnaW4vJHtvcHRpb25zLmJhc2VCcmFuY2h9YF0pO1xuICB0cnkge1xuICAgIHJldHVybiBhcHBseVBsYW4ocGxhbiwgY29uZmlnLCBvcHRpb25zLCBkZXBlbmRlbmNpZXMpO1xuICB9IGZpbmFsbHkge1xuICAgIGRlcGVuZGVuY2llcy5leGVjKCdnaXQnLCBbJ2NoZWNrb3V0JywgJy0tZm9yY2UnLCBvcHRpb25zLmJhc2VCcmFuY2hdKTtcbiAgICBkZXBlbmRlbmNpZXMuZXhlYygnZ2l0JywgWydicmFuY2gnLCAnLS1kZWxldGUnLCAnLS1mb3JjZScsIHBsYW4uYnJhbmNoXSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTQSxxQkFHTztBQUNQLHVCQUE0QjtBQTJONUIsTUFBTSxxQkFBcUI7QUFFM0IsTUFBTSxtQkFBbUI7QUFLekIsTUFBTSxvQkFBb0I7QUFFMUIsTUFBTSxxQkFBcUI7QUFVcEIsU0FBUyxZQUFZLE1BQWdCLE9BQTJCLFVBQWlDO0FBQ3RHLFFBQU0sRUFBRSxPQUFPLE1BQU0sSUFBSSxJQUFJLEtBQUs7QUFDbEMsUUFBTSxTQUFTLGNBQWMsS0FBSyxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxHQUFHLE9BQU8sU0FBUyxNQUFNLEdBQUcsSUFBSSxNQUFNLE9BQU8sUUFBUTtBQUNwSCxRQUFNLFFBQVE7QUFBQSxJQUNaLGNBQWMsTUFBTSxJQUFJLGFBQWEsTUFBTSxXQUFXLEdBQUcsV0FBVyxJQUFJO0FBQUEsSUFDeEU7QUFBQSxJQUNBLFlBQVksS0FBSyxPQUFPLFVBQVU7QUFBQSxJQUNsQztBQUFBLEVBQ0Y7QUFFQSxNQUFJLGNBQWMsS0FBSyxHQUFHO0FBQ3hCLFVBQU0sS0FBSyw4QkFBOEIsSUFBSSxHQUFHLEtBQUssT0FBTyxhQUFhLElBQUksQ0FBQyxTQUFTLE9BQU8sSUFBSSxJQUFJLENBQUM7QUFDdkcsUUFBSSxLQUFLLE9BQU8sV0FBVztBQUN6QixZQUFNLEtBQUssMEJBQTBCLE9BQU8sa0JBQWtCLENBQUMsNkNBQTZDO0FBQUEsSUFDOUc7QUFDQSxVQUFNLEtBQUssRUFBRTtBQUFBLEVBQ2Y7QUFFQSxNQUFJLFVBQVUsTUFBTTtBQUNsQixVQUFNLEtBQUssZUFBZSxJQUFJLEtBQUssTUFBTSxPQUFPLDBCQUEwQixFQUFFO0FBQUEsRUFDOUUsT0FBTztBQUNMLFVBQU0sS0FBSyxHQUFHLGFBQWEsV0FBVyxNQUFNLE9BQU8sQ0FBQztBQUNwRCxRQUFJLE1BQU0sV0FBVyxNQUFNO0FBQ3pCLFlBQU0sS0FBSyxHQUFHLGFBQWEsVUFBVSxNQUFNLE1BQU0sQ0FBQztBQUFBLElBQ3BEO0FBQUEsRUFDRjtBQUVBLE1BQUksYUFBYSxNQUFNO0FBQ3JCLFVBQU0sS0FBSyx5QkFBeUIsSUFBSSxXQUFXLFNBQVMsUUFBUSxHQUFHLE9BQU8sRUFBRTtBQUFBLEVBQ2xGO0FBRUEsUUFBTSxLQUFLLGdGQUFnRjtBQUMzRixTQUFPLEdBQUcsTUFBTSxLQUFLLElBQUksQ0FBQztBQUFBO0FBQzVCO0FBU0EsZUFBc0Isb0JBQW9CLE9BQXNCLGNBQTRFO0FBQzFJLE1BQUksQ0FBQyxjQUFjLEtBQUssR0FBRztBQUN6QixVQUFNLE1BQU0sTUFBTSxPQUFPO0FBQ3pCLFVBQU0sWUFBWSxNQUFNLGFBQWEsVUFBVSw4QkFBOEIsTUFBTSxJQUFJLFFBQVEsS0FBSyxLQUFLLENBQUMsRUFBRTtBQUM1RyxVQUFNQSxRQUFPLFVBQVUsV0FBVyxFQUFFLEdBQUc7QUFDdkMsUUFBSUEsVUFBUyxRQUFXO0FBQ3RCLFlBQU0sSUFBSSxNQUFNLGVBQWUsTUFBTSxHQUFHLHFCQUFxQixHQUFHLElBQUk7QUFBQSxJQUN0RTtBQUNBLFdBQU87QUFBQSxNQUNMLGNBQWMsQ0FBQztBQUFBLE1BQ2YsWUFBWSxpQ0FBaUMsTUFBTSxHQUFHLE1BQU1BLEtBQUk7QUFBQSxNQUNoRTtBQUFBLE1BQ0EsTUFBQUE7QUFBQSxNQUNBLEtBQUssTUFBTTtBQUFBLE1BQ1gsT0FBT0EsVUFBUyxNQUFNLFVBQVUsWUFBWTtBQUFBLE1BQzVDLFdBQVc7QUFBQSxJQUNiO0FBQUEsRUFDRjtBQUVBLFFBQU0sU0FBUyxNQUFNLGFBQWEsVUFBVSxnQ0FBZ0MsTUFBTSxJQUFJLFlBQVksbUJBQW1CLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDakksUUFBTSxPQUFPLE9BQU87QUFDcEIsUUFBTSxhQUFhLHNCQUFzQixNQUFNLElBQUksWUFBWSxNQUFNLE1BQU0sTUFBTSxJQUFJO0FBQ3JGLE1BQUksU0FBUyxNQUFNLFFBQVE7QUFDekIsV0FBTyxFQUFFLGNBQWMsQ0FBQyxHQUFHLFlBQVksT0FBTyxNQUFNLEtBQUssTUFBTSxRQUFRLE9BQU8sV0FBVyxXQUFXLE1BQU07QUFBQSxFQUM1RztBQUVBLFFBQU0sVUFBVSxNQUFNLGFBQWEsVUFBVSxnQ0FBZ0MsTUFBTSxJQUFJLFlBQVksTUFBTSxNQUFNLE1BQU0sSUFBSSxFQUFFO0FBQzNILFFBQU0sUUFBUSxRQUFRLFNBQVMsQ0FBQztBQUNoQyxRQUFNLFVBQVUsSUFBSSxJQUFJLE1BQU0sUUFBUSxDQUFDLFNBQVMsS0FBSyxzQkFBc0IsU0FBWSxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxVQUFVLEtBQUssaUJBQWlCLENBQUMsQ0FBQztBQUNqSixRQUFNLGVBQWUsQ0FBQyxHQUFHLE9BQU8sRUFBRSxPQUFPLENBQUMsU0FBUyxNQUFNLE1BQU0sS0FBSyxDQUFDLGFBQVMsOEJBQVksTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUs7QUFDN0csUUFBTSxjQUFjLE1BQU0sVUFBVTtBQUNwQyxTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsS0FBSyxNQUFNO0FBQUEsSUFDWCxPQUFPLGFBQWEsU0FBUyxLQUFLLGNBQWMsVUFBVTtBQUFBLElBQzFELFdBQVc7QUFBQSxFQUNiO0FBQ0Y7QUFRTyxTQUFTLHFCQUFxQixNQUErQjtBQUNsRSxRQUFNLFNBQVMsS0FBSyxNQUFNLElBQUk7QUFDOUIsTUFBSSxDQUFDLE1BQU0sUUFBUSxPQUFPLFNBQVMsR0FBRztBQUNwQyxVQUFNLElBQUksVUFBVSwwQ0FBMEM7QUFBQSxFQUNoRTtBQUVBLFFBQU0sVUFBNkIsT0FBTztBQUMxQyxRQUFNLFFBQVEsb0JBQUksSUFBYTtBQUMvQixhQUFXLFNBQVMsU0FBUztBQUMzQixVQUFNLE9BQWdCLFFBQVEsSUFBSSxPQUFPLE1BQU07QUFDL0MsVUFBTSxRQUFRLE9BQU8sU0FBUyxXQUFXLElBQUksSUFBSSxNQUFNO0FBQ3ZELFVBQU0sUUFBUSxVQUFVO0FBQ3hCLFVBQU0sV0FBVyxRQUFRLENBQUMsUUFBUSxRQUFRLE9BQU8sVUFBVSxTQUFTLElBQUksQ0FBQyxRQUFRLE9BQU8sV0FBVyxTQUFTO0FBQzVHLGVBQVcsT0FBTyxVQUFVO0FBQzFCLFVBQUksT0FBTyxRQUFRLElBQUksT0FBTyxHQUFHLE1BQU0sVUFBVTtBQUMvQyxjQUFNLElBQUksVUFBVSx5QkFBeUIsS0FBSyxvQkFBb0IsR0FBRyxJQUFJO0FBQUEsTUFDL0U7QUFBQSxJQUNGO0FBQ0EsUUFBSSxTQUFTLENBQUMsTUFBTSxRQUFRLFFBQVEsSUFBSSxPQUFPLE9BQU8sQ0FBQyxHQUFHO0FBQ3hELFlBQU0sSUFBSSxNQUFNLHlCQUF5QixLQUFLLHlCQUF5QjtBQUFBLElBQ3pFO0FBQ0EsUUFBSSxNQUFNLElBQUksSUFBSSxHQUFHO0FBQ25CLFlBQU0sSUFBSSxNQUFNLDRCQUE0QixLQUFLLGlCQUFpQjtBQUFBLElBQ3BFO0FBQ0EsVUFBTSxJQUFJLElBQUk7QUFBQSxFQUNoQjtBQUNBLFNBQU87QUFDVDtBQVFPLFNBQVMsU0FBUyxRQUFrQztBQUN6RCxTQUFPO0FBQUEsSUFDTCxRQUFRLFlBQVksT0FBTyxNQUFNLElBQUk7QUFBQSxJQUNyQztBQUFBLElBQ0EsT0FBTyx5QkFBeUIsT0FBTyxNQUFNLElBQUksT0FBTyxRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQUEsRUFDOUU7QUFDRjtBQWFBLGVBQXNCLGNBQWMsU0FBK0IsY0FBdUQ7QUFDeEgsUUFBTSxTQUFTLHlCQUFxQiw2QkFBYSxRQUFRLFlBQVksT0FBTyxDQUFDO0FBQzdFLFFBQU0sVUFBVSxRQUFRLEtBQUssT0FBTyxDQUFDLFNBQVMsT0FBTyxVQUFVLE1BQU0sQ0FBQyxVQUFVLE1BQU0sU0FBUyxJQUFJLENBQUM7QUFDcEcsTUFBSSxRQUFRLFNBQVMsR0FBRztBQUN0QixVQUFNLElBQUksTUFBTSxxQ0FBcUMsUUFBUSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUc7QUFBQSxFQUN2RztBQUVBLFFBQU0sVUFBd0IsQ0FBQztBQUMvQixhQUFXLFNBQVMsT0FBTyxXQUFXO0FBQ3BDLFFBQUksUUFBUSxLQUFLLFNBQVMsS0FBSyxDQUFDLFFBQVEsS0FBSyxTQUFTLE1BQU0sSUFBSSxHQUFHO0FBQ2pFO0FBQUEsSUFDRjtBQUNBLFFBQUk7QUFDRixjQUFRLEtBQUssTUFBTSxVQUFVLE9BQU8sUUFBUSxTQUFTLFlBQVksQ0FBQztBQUFBLElBQ3BFLFNBQVMsT0FBTztBQUNkLFlBQU0sVUFBVSxpQkFBaUIsUUFBUSxNQUFNLFVBQVUsT0FBTyxLQUFLO0FBQ3JFLG1CQUFhLElBQUksR0FBRyxNQUFNLElBQUksV0FBVyxPQUFPLEVBQUU7QUFDbEQsY0FBUSxLQUFLLEVBQUUsT0FBTyxTQUFTLE1BQU0sTUFBTSxNQUFNLFNBQVMsUUFBUSxDQUFDO0FBQUEsSUFDckU7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBU08sU0FBUyxTQUFTLFlBQW9CLFFBQThCO0FBQ3pFLFFBQU0sV0FBTyw2QkFBYSxZQUFZLE9BQU87QUFDN0MsUUFBTSxTQUFTLEtBQUssTUFBTSxJQUFJO0FBQzlCLFFBQU0sTUFBTSxjQUFjLE9BQU8sS0FBSyxJQUFJLFdBQVc7QUFDckQsUUFBTSxTQUFTLE9BQU8sVUFBVSxLQUFLLENBQUMsVUFBVSxNQUFNLE1BQU0sTUFBTSxPQUFPLE1BQU0sSUFBSTtBQUNuRixNQUFJLFNBQVMsR0FBRyxNQUFNLE9BQU8sS0FBSztBQUNoQztBQUFBLEVBQ0Y7QUFDQSxTQUFPLEdBQUcsSUFBSSxPQUFPO0FBQ3JCLG9DQUFjLFlBQVksR0FBRyxLQUFLLFVBQVUsUUFBUSxNQUFNLGtCQUFrQixDQUFDO0FBQUEsQ0FBSTtBQUNuRjtBQUVBLFNBQVMsVUFBVSxNQUFnQixRQUF5QixTQUErQixjQUE0QztBQUNySSxRQUFNLEVBQUUsTUFBTSxJQUFJLEtBQUs7QUFDdkIsUUFBTSxNQUFNLEVBQUUsZUFBZSxNQUFNLE1BQU0saUJBQWlCLEtBQUssT0FBTyxLQUFLO0FBQzNFLFFBQU0sVUFBc0IsRUFBRSxTQUFTLE1BQU0sU0FBUyxRQUFRLGFBQWEsTUFBTSxNQUFNLFNBQVMsR0FBRyxFQUFFO0FBQ3JHLFdBQVMsUUFBUSxZQUFZLEtBQUssTUFBTTtBQUN4QyxRQUFNLGdCQUFnQixNQUFNLFVBQVUsT0FBTztBQUM3QyxRQUFNLFNBQTRCLGtCQUFrQixTQUFZLE9BQU8sRUFBRSxTQUFTLGVBQWUsUUFBUSxhQUFhLE1BQU0sZUFBZSxHQUFHLEVBQUU7QUFDaEosUUFBTSxXQUFXLFFBQVEsT0FBTyxhQUFhLEtBQU0sV0FBVyxRQUFRLE9BQU8sT0FBTyxhQUFhO0FBRWpHLGNBQVksY0FBYyxPQUFPLENBQUMsT0FBTyxPQUFPLENBQUM7QUFDakQsY0FBWSxjQUFjLE9BQU8sQ0FBQyxVQUFVLGVBQWUsYUFBYSxLQUFLLEtBQUssQ0FBQztBQUNuRixRQUFNLFdBQVcsWUFBWSxjQUFjLE9BQU8sQ0FBQyxRQUFRLFVBQVUsVUFBVSxNQUFNLENBQUM7QUFFdEYsUUFBTSxpQkFBaUIsYUFBYSxLQUFLLE9BQU8sQ0FBQyxhQUFhLGVBQWUsV0FBVyxVQUFVLEtBQUssTUFBTSxDQUFDLEVBQUUsYUFBYTtBQUM3SCxNQUFJLGdCQUFnQjtBQUNsQixnQkFBWSxjQUFjLE9BQU8sQ0FBQyxTQUFTLFVBQVUsS0FBSyxNQUFNLENBQUM7QUFDakUsUUFBSSxhQUFhLEtBQUssT0FBTyxDQUFDLFFBQVEsV0FBVyxjQUFjLE1BQU0sQ0FBQyxFQUFFLGFBQWEsR0FBRztBQUN0RixtQkFBYSxJQUFJLEdBQUcsTUFBTSxJQUFJLEtBQUssS0FBSyxNQUFNLDZDQUE2QztBQUMzRixhQUFPLEVBQUUsTUFBTSxNQUFNLE1BQU0sU0FBUyxZQUFZO0FBQUEsSUFDbEQ7QUFBQSxFQUNGO0FBQ0EsY0FBWSxjQUFjLE9BQU8sQ0FBQyxRQUFRLFdBQVcsVUFBVSxtQkFBbUIsS0FBSyxNQUFNLEVBQUUsQ0FBQztBQUVoRyxRQUFNLE9BQU8sWUFBWSxNQUFNLEVBQUUsU0FBUyxPQUFPLEdBQUcsUUFBUTtBQUM1RCxRQUFNLFdBQVcsWUFBWSxjQUFjLE1BQU0sQ0FBQyxNQUFNLFFBQVEsVUFBVSxLQUFLLFFBQVEsV0FBVyxRQUFRLFVBQVUsVUFBVSxRQUFRLGFBQWEsQ0FBQyxFQUFFLEtBQUs7QUFDM0osTUFBSSxhQUFhLE1BQU0sYUFBYSxRQUFRO0FBQzFDLFVBQU1DLFlBQVcsT0FBTyxRQUFRO0FBQ2hDLGdCQUFZLGNBQWMsTUFBTSxDQUFDLE1BQU0sUUFBUSxVQUFVLFdBQVcsS0FBSyxPQUFPLFVBQVUsSUFBSSxDQUFDO0FBQy9GLGdCQUFZLGNBQWMsTUFBTSxXQUFXLENBQUMsTUFBTSxTQUFTLFVBQVUsUUFBUSxJQUFJLENBQUMsTUFBTSxTQUFTLFFBQVEsQ0FBQztBQUMxRyxpQkFBYSxJQUFJLEdBQUcsTUFBTSxJQUFJLGlCQUFpQixRQUFRLEdBQUcsV0FBVyw0QkFBNEIsRUFBRSxHQUFHO0FBQ3RHLFdBQU8sRUFBRSxNQUFNLE1BQU0sTUFBTSxTQUFTLFdBQVcsVUFBQUEsVUFBUztBQUFBLEVBQzFEO0FBRUEsUUFBTSxNQUFNLFlBQVksY0FBYyxNQUFNO0FBQUEsSUFDMUM7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsUUFBUTtBQUFBLElBQ1I7QUFBQSxJQUNBLEtBQUs7QUFBQSxJQUNMO0FBQUEsSUFDQSxLQUFLO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxJQUNBLEdBQUksV0FBVyxDQUFDLFNBQVMsSUFBSSxDQUFDO0FBQUEsRUFDaEMsQ0FBQyxFQUFFLEtBQUs7QUFDUixlQUFhLElBQUksR0FBRyxNQUFNLElBQUksWUFBWSxHQUFHLEdBQUcsV0FBVyw0QkFBNEIsRUFBRSxHQUFHO0FBQzVGLFFBQU0sV0FBVyxPQUFPLHlCQUF5QixLQUFLLEdBQUcsR0FBRyxTQUFTLFFBQVEsS0FBSyxHQUFHO0FBQ3JGLFNBQU8sT0FBTyxNQUFNLFFBQVEsSUFBSSxFQUFFLE1BQU0sTUFBTSxNQUFNLFNBQVMsU0FBUyxJQUFJLEVBQUUsTUFBTSxNQUFNLE1BQU0sU0FBUyxVQUFVLFNBQVM7QUFDNUg7QUFFQSxTQUFTLGFBQWEsU0FBaUIsTUFBNEI7QUFDakUsUUFBTSxXQUFXLEtBQUssT0FBTyxhQUFhO0FBQzFDLFFBQU0sT0FBTyxLQUFLLE9BQU8sT0FBTyxRQUFRLEVBQUUsTUFBTSxPQUFPLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixFQUFFLEtBQUssSUFBSTtBQUM1RixTQUFPO0FBQUEsSUFDTCxPQUFPLE9BQU87QUFBQSxJQUNkO0FBQUEsSUFDQSxLQUFLLEtBQUssT0FBTyxPQUFPLFdBQVcsV0FBVyxvQkFBb0IsT0FBTyxLQUFLLE9BQU8sUUFBUSxDQUFDLEdBQUc7QUFBQSxJQUNqRztBQUFBLElBQ0EsV0FBVyx1Q0FBdUM7QUFBQSxJQUNsRDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDRjtBQUVBLFNBQVMsWUFBWSxjQUFnQyxNQUFjLFlBQXVDO0FBQ3hHLFFBQU0sU0FBUyxhQUFhLEtBQUssTUFBTSxVQUFVO0FBQ2pELE1BQUksT0FBTyxhQUFhLEdBQUc7QUFDekIsVUFBTSxJQUFJLE1BQU0sR0FBRyxJQUFJLElBQUksV0FBVyxLQUFLLEdBQUcsQ0FBQyxpQkFBaUIsT0FBTyxPQUFPLFFBQVEsQ0FBQyxNQUFNLE9BQU8sT0FBTyxLQUFLLENBQUMsRUFBRTtBQUFBLEVBQ3JIO0FBQ0EsU0FBTyxPQUFPO0FBQ2hCO0FBRUEsU0FBUyxjQUFjLE9BQWlEO0FBQ3RFLFNBQU8sVUFBVTtBQUNuQjtBQUVBLFNBQVMsUUFBUSxNQUFzQjtBQUNyQyxTQUFPLGlCQUFpQixLQUFLLElBQUksSUFBSSxLQUFLLE1BQU0sR0FBRyxnQkFBZ0IsSUFBSTtBQUN6RTtBQUVBLGVBQWUsVUFBVSxPQUFzQixRQUF5QixTQUErQixjQUFxRDtBQUMxSixRQUFNLFNBQVMsTUFBTSxvQkFBb0IsT0FBTyxZQUFZO0FBQzVELE1BQUksT0FBTyxVQUFVLFdBQVc7QUFDOUIsaUJBQWEsSUFBSSxHQUFHLE1BQU0sSUFBSSxnQkFBZ0IsUUFBUSxPQUFPLElBQUksQ0FBQyxHQUFHO0FBQ3JFLFdBQU8sRUFBRSxNQUFNLE1BQU0sTUFBTSxTQUFTLFVBQVU7QUFBQSxFQUNoRDtBQUNBLE1BQUksT0FBTyxVQUFVLGFBQWE7QUFDaEMsaUJBQWEsSUFBSSxHQUFHLE1BQU0sSUFBSSxjQUFjLFFBQVEsT0FBTyxJQUFJLENBQUMsdUNBQXVDLFFBQVEsT0FBTyxHQUFHLENBQUMsR0FBRztBQUM3SCxXQUFPLEVBQUUsTUFBTSxNQUFNLE1BQU0sU0FBUyxZQUFZO0FBQUEsRUFDbEQ7QUFFQSxRQUFNLE9BQU8sU0FBUyxNQUFNO0FBQzVCLE1BQUksUUFBUSxRQUFRO0FBQ2xCLGlCQUFhLElBQUksR0FBRyxNQUFNLElBQUksZ0JBQWdCLFFBQVEsT0FBTyxHQUFHLENBQUMsT0FBTyxRQUFRLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixLQUFLLE1BQU0sWUFBWTtBQUNuSSxpQkFBYSxJQUFJLFlBQVksS0FBSyxLQUFLLEVBQUU7QUFDekMsaUJBQWEsSUFBSSxZQUFZLE1BQU0sTUFBTSxJQUFJLEVBQUUsV0FBVyxPQUFPLE1BQU0sQ0FBQztBQUN4RSxXQUFPLEVBQUUsTUFBTSxNQUFNLE1BQU0sU0FBUyxVQUFVO0FBQUEsRUFDaEQ7QUFHQSxRQUFNLFFBQVEsWUFBWSxjQUFjLE9BQU8sQ0FBQyxVQUFVLGFBQWEsQ0FBQyxFQUFFLEtBQUs7QUFDL0UsTUFBSSxVQUFVLElBQUk7QUFDaEIsVUFBTSxJQUFJLE1BQU07QUFBQSxFQUF5RixLQUFLLEVBQUU7QUFBQSxFQUNsSDtBQUNBLGNBQVksY0FBYyxPQUFPLENBQUMsU0FBUyxVQUFVLFFBQVEsVUFBVSxDQUFDO0FBQ3hFLGNBQVksY0FBYyxPQUFPLENBQUMsWUFBWSxNQUFNLEtBQUssUUFBUSxVQUFVLFFBQVEsVUFBVSxFQUFFLENBQUM7QUFDaEcsTUFBSTtBQUNGLFdBQU8sVUFBVSxNQUFNLFFBQVEsU0FBUyxZQUFZO0FBQUEsRUFDdEQsVUFBRTtBQUNBLGlCQUFhLEtBQUssT0FBTyxDQUFDLFlBQVksV0FBVyxRQUFRLFVBQVUsQ0FBQztBQUNwRSxpQkFBYSxLQUFLLE9BQU8sQ0FBQyxVQUFVLFlBQVksV0FBVyxLQUFLLE1BQU0sQ0FBQztBQUFBLEVBQ3pFO0FBQ0Y7IiwKICAibmFtZXMiOiBbImhlYWQiLCAicHJOdW1iZXIiXQp9Cg==