@dbx-tools/tunnel 0.6.120 → 0.6.124

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/index.ts CHANGED
@@ -15,6 +15,7 @@ export * as plugin from "./src/plugin.ts";
15
15
  export * as portr from "./src/portr.ts";
16
16
  export * as sendCode from "./src/send-code.ts";
17
17
  export * as signingKey from "./src/signing-key.ts";
18
+ export * as supervisor from "./src/supervisor.ts";
18
19
  export type { CodeCopy } from "./src/code-email.ts";
19
20
  export type { FrpInstallOptions, FrpConfig } from "./src/frp.ts";
20
21
  export { AUTH_PREFIX, UNAUTHORIZED_BODY } from "./src/gate.ts";
@@ -28,3 +29,4 @@ export type { AuthGateConfig, SendCodeOptions, ResolvedAuthGateConfig, AuthGateA
28
29
  export type { PortrInstallOptions, PortrConfig } from "./src/portr.ts";
29
30
  export { KEY_TTL_SECONDS } from "./src/signing-key.ts";
30
31
  export type { SigningKey } from "./src/signing-key.ts";
32
+ export type { ProcessSupervisor } from "./src/supervisor.ts";
package/lib/index.d.ts CHANGED
@@ -11,6 +11,7 @@ export * as plugin from "./src/plugin.ts";
11
11
  export * as portr from "./src/portr.ts";
12
12
  export * as sendCode from "./src/send-code.ts";
13
13
  export * as signingKey from "./src/signing-key.ts";
14
+ export * as supervisor from "./src/supervisor.ts";
14
15
  export type { CodeCopy } from "./src/code-email.ts";
15
16
  export type { FrpInstallOptions, FrpConfig } from "./src/frp.ts";
16
17
  export { AUTH_PREFIX, UNAUTHORIZED_BODY } from "./src/gate.ts";
@@ -24,3 +25,4 @@ export type { AuthGateConfig, SendCodeOptions, ResolvedAuthGateConfig, AuthGateA
24
25
  export type { PortrInstallOptions, PortrConfig } from "./src/portr.ts";
25
26
  export { KEY_TTL_SECONDS } from "./src/signing-key.ts";
26
27
  export type { SigningKey } from "./src/signing-key.ts";
28
+ export type { ProcessSupervisor } from "./src/supervisor.ts";
package/lib/index.js CHANGED
@@ -14,8 +14,9 @@ export * as plugin from "./src/plugin.js";
14
14
  export * as portr from "./src/portr.js";
15
15
  export * as sendCode from "./src/send-code.js";
16
16
  export * as signingKey from "./src/signing-key.js";
17
+ export * as supervisor from "./src/supervisor.js";
17
18
  export { AUTH_PREFIX, UNAUTHORIZED_BODY } from "./src/gate.js";
18
19
  export { PROTECTED_HEADERS, DEFAULT_FORWARD_HEADERS } from "./src/headers.js";
19
20
  export { AuthGatePlugin, authGate } from "./src/plugin.js";
20
21
  export { KEY_TTL_SECONDS } from "./src/signing-key.js";
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxTQUFTLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxTQUFTLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxLQUFLLFNBQVMsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFFBQVEsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEtBQUssVUFBVSxNQUFNLHNCQUFzQixDQUFDO0FBR25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJOUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUczRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL3R1bm5lbFwiO1xuZXhwb3J0ICogYXMgYWxsb3dsaXN0IGZyb20gXCIuL3NyYy9hbGxvd2xpc3QudHNcIjtcbmV4cG9ydCAqIGFzIGNvZGVFbWFpbCBmcm9tIFwiLi9zcmMvY29kZS1lbWFpbC50c1wiO1xuZXhwb3J0ICogYXMgZnJwIGZyb20gXCIuL3NyYy9mcnAudHNcIjtcbmV4cG9ydCAqIGFzIGdhdGUgZnJvbSBcIi4vc3JjL2dhdGUudHNcIjtcbmV4cG9ydCAqIGFzIGhlYWRlcnMgZnJvbSBcIi4vc3JjL2hlYWRlcnMudHNcIjtcbmV4cG9ydCAqIGFzIGludGVyY2VwdG9yIGZyb20gXCIuL3NyYy9pbnRlcmNlcHRvci50c1wiO1xuZXhwb3J0ICogYXMgbG9naW5QYWdlIGZyb20gXCIuL3NyYy9sb2dpbi1wYWdlLnRzXCI7XG5leHBvcnQgKiBhcyBwYXRoUHJveHkgZnJvbSBcIi4vc3JjL3BhdGgtcHJveHkudHNcIjtcbmV4cG9ydCAqIGFzIHBsdWdpbiBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgKiBhcyBwb3J0ciBmcm9tIFwiLi9zcmMvcG9ydHIudHNcIjtcbmV4cG9ydCAqIGFzIHNlbmRDb2RlIGZyb20gXCIuL3NyYy9zZW5kLWNvZGUudHNcIjtcbmV4cG9ydCAqIGFzIHNpZ25pbmdLZXkgZnJvbSBcIi4vc3JjL3NpZ25pbmcta2V5LnRzXCI7XG5leHBvcnQgdHlwZSB7IENvZGVDb3B5IH0gZnJvbSBcIi4vc3JjL2NvZGUtZW1haWwudHNcIjtcbmV4cG9ydCB0eXBlIHsgRnJwSW5zdGFsbE9wdGlvbnMsIEZycENvbmZpZyB9IGZyb20gXCIuL3NyYy9mcnAudHNcIjtcbmV4cG9ydCB7IEFVVEhfUFJFRklYLCBVTkFVVEhPUklaRURfQk9EWSB9IGZyb20gXCIuL3NyYy9nYXRlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEdhdGVPcHRpb25zLCBHYXRlQWN0aW9uIH0gZnJvbSBcIi4vc3JjL2dhdGUudHNcIjtcbmV4cG9ydCB7IFBST1RFQ1RFRF9IRUFERVJTLCBERUZBVUxUX0ZPUldBUkRfSEVBREVSUyB9IGZyb20gXCIuL3NyYy9oZWFkZXJzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEhlYWRlclBvbGljeSB9IGZyb20gXCIuL3NyYy9oZWFkZXJzLnRzXCI7XG5leHBvcnQgdHlwZSB7IFR1bm5lbEludGVyY2VwdG9yT3B0aW9ucywgVHVubmVsVHJhbnNwb3J0IH0gZnJvbSBcIi4vc3JjL2ludGVyY2VwdG9yLnRzXCI7XG5leHBvcnQgdHlwZSB7IExvZ2luUGFnZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvbG9naW4tcGFnZS50c1wiO1xuZXhwb3J0IHsgQXV0aEdhdGVQbHVnaW4sIGF1dGhHYXRlIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdXRoR2F0ZUNvbmZpZywgU2VuZENvZGVPcHRpb25zLCBSZXNvbHZlZEF1dGhHYXRlQ29uZmlnLCBBdXRoR2F0ZUFwaSB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgUG9ydHJJbnN0YWxsT3B0aW9ucywgUG9ydHJDb25maWcgfSBmcm9tIFwiLi9zcmMvcG9ydHIudHNcIjtcbmV4cG9ydCB7IEtFWV9UVExfU0VDT05EUyB9IGZyb20gXCIuL3NyYy9zaWduaW5nLWtleS50c1wiO1xuZXhwb3J0IHR5cGUgeyBTaWduaW5nS2V5IH0gZnJvbSBcIi4vc3JjL3NpZ25pbmcta2V5LnRzXCI7XG4iXX0=
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxTQUFTLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxTQUFTLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxLQUFLLFNBQVMsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFFBQVEsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEtBQUssVUFBVSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFHbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUk5RSxPQUFPLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvdHVubmVsXCI7XG5leHBvcnQgKiBhcyBhbGxvd2xpc3QgZnJvbSBcIi4vc3JjL2FsbG93bGlzdC50c1wiO1xuZXhwb3J0ICogYXMgY29kZUVtYWlsIGZyb20gXCIuL3NyYy9jb2RlLWVtYWlsLnRzXCI7XG5leHBvcnQgKiBhcyBmcnAgZnJvbSBcIi4vc3JjL2ZycC50c1wiO1xuZXhwb3J0ICogYXMgZ2F0ZSBmcm9tIFwiLi9zcmMvZ2F0ZS50c1wiO1xuZXhwb3J0ICogYXMgaGVhZGVycyBmcm9tIFwiLi9zcmMvaGVhZGVycy50c1wiO1xuZXhwb3J0ICogYXMgaW50ZXJjZXB0b3IgZnJvbSBcIi4vc3JjL2ludGVyY2VwdG9yLnRzXCI7XG5leHBvcnQgKiBhcyBsb2dpblBhZ2UgZnJvbSBcIi4vc3JjL2xvZ2luLXBhZ2UudHNcIjtcbmV4cG9ydCAqIGFzIHBhdGhQcm94eSBmcm9tIFwiLi9zcmMvcGF0aC1wcm94eS50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHBvcnRyIGZyb20gXCIuL3NyYy9wb3J0ci50c1wiO1xuZXhwb3J0ICogYXMgc2VuZENvZGUgZnJvbSBcIi4vc3JjL3NlbmQtY29kZS50c1wiO1xuZXhwb3J0ICogYXMgc2lnbmluZ0tleSBmcm9tIFwiLi9zcmMvc2lnbmluZy1rZXkudHNcIjtcbmV4cG9ydCAqIGFzIHN1cGVydmlzb3IgZnJvbSBcIi4vc3JjL3N1cGVydmlzb3IudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29kZUNvcHkgfSBmcm9tIFwiLi9zcmMvY29kZS1lbWFpbC50c1wiO1xuZXhwb3J0IHR5cGUgeyBGcnBJbnN0YWxsT3B0aW9ucywgRnJwQ29uZmlnIH0gZnJvbSBcIi4vc3JjL2ZycC50c1wiO1xuZXhwb3J0IHsgQVVUSF9QUkVGSVgsIFVOQVVUSE9SSVpFRF9CT0RZIH0gZnJvbSBcIi4vc3JjL2dhdGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2F0ZU9wdGlvbnMsIEdhdGVBY3Rpb24gfSBmcm9tIFwiLi9zcmMvZ2F0ZS50c1wiO1xuZXhwb3J0IHsgUFJPVEVDVEVEX0hFQURFUlMsIERFRkFVTFRfRk9SV0FSRF9IRUFERVJTIH0gZnJvbSBcIi4vc3JjL2hlYWRlcnMudHNcIjtcbmV4cG9ydCB0eXBlIHsgSGVhZGVyUG9saWN5IH0gZnJvbSBcIi4vc3JjL2hlYWRlcnMudHNcIjtcbmV4cG9ydCB0eXBlIHsgVHVubmVsSW50ZXJjZXB0b3JPcHRpb25zLCBUdW5uZWxUcmFuc3BvcnQgfSBmcm9tIFwiLi9zcmMvaW50ZXJjZXB0b3IudHNcIjtcbmV4cG9ydCB0eXBlIHsgTG9naW5QYWdlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9sb2dpbi1wYWdlLnRzXCI7XG5leHBvcnQgeyBBdXRoR2F0ZVBsdWdpbiwgYXV0aEdhdGUgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF1dGhHYXRlQ29uZmlnLCBTZW5kQ29kZU9wdGlvbnMsIFJlc29sdmVkQXV0aEdhdGVDb25maWcsIEF1dGhHYXRlQXBpIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBQb3J0ckluc3RhbGxPcHRpb25zLCBQb3J0ckNvbmZpZyB9IGZyb20gXCIuL3NyYy9wb3J0ci50c1wiO1xuZXhwb3J0IHsgS0VZX1RUTF9TRUNPTkRTIH0gZnJvbSBcIi4vc3JjL3NpZ25pbmcta2V5LnRzXCI7XG5leHBvcnQgdHlwZSB7IFNpZ25pbmdLZXkgfSBmcm9tIFwiLi9zcmMvc2lnbmluZy1rZXkudHNcIjtcbmV4cG9ydCB0eXBlIHsgUHJvY2Vzc1N1cGVydmlzb3IgfSBmcm9tIFwiLi9zcmMvc3VwZXJ2aXNvci50c1wiO1xuIl19
package/lib/src/frp.d.ts CHANGED
@@ -9,6 +9,7 @@
9
9
  * @module
10
10
  */
11
11
  import { spawn } from "node:child_process";
12
+ import { type ProcessSupervisor } from "./supervisor.ts";
12
13
  /** Options for installing the frpc executable. */
13
14
  export interface FrpInstallOptions {
14
15
  /** Home directory containing `.frpc`; defaults to the OS home directory. */
@@ -48,3 +49,4 @@ export declare function installFrp(options?: FrpInstallOptions): Promise<NodeJS.
48
49
  export declare function writeFrpConfig(resolved: FrpConfig, childEnv: NodeJS.ProcessEnv): Promise<string>;
49
50
  /** Launch frpc as a child process (caller supervises and terminates it). */
50
51
  export declare function startFrp(resolved: FrpConfig, childEnv: NodeJS.ProcessEnv, configPath: string): ReturnType<typeof spawn>;
52
+ export declare function superviseFrp(resolved: FrpConfig, childEnv: NodeJS.ProcessEnv, configPath: string): ProcessSupervisor;
package/lib/src/frp.js CHANGED
@@ -15,6 +15,7 @@ import { delimiter, join } from "node:path";
15
15
  import { bin, config } from "@dbx-tools/core";
16
16
  import { log } from "@dbx-tools/shared-core";
17
17
  import { TUNNEL_CONFIG } from "./_config.js";
18
+ import { superviseProcessForever } from "./supervisor.js";
18
19
  const logger = log.logger("tunnel:frp");
19
20
  const FRP_VERSION = "0.68.1";
20
21
  const FRP_RELEASE_URL = `https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}`;
@@ -115,6 +116,7 @@ export async function writeFrpConfig(resolved, childEnv) {
115
116
  `serverAddr = ${tomlString(resolved.server)}`,
116
117
  `serverPort = ${resolved.serverPort}`,
117
118
  `transport.protocol = ${tomlString(resolved.protocol)}`,
119
+ "loginFailExit = false",
118
120
  ];
119
121
  if (resolved.token)
120
122
  lines.push(`auth.token = ${tomlString(resolved.token)}`);
@@ -127,4 +129,11 @@ export function startFrp(resolved, childEnv, configPath) {
127
129
  logger.info(`frpc tunneling https://${resolved.publicDomain}${resolved.path === "/" ? "" : resolved.path} -> :${resolved.port}`);
128
130
  return spawn("frpc", ["-c", configPath], { env: childEnv, stdio: "inherit" });
129
131
  }
130
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZycC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekIsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFNUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU3QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3hDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQztBQUM3QixNQUFNLGVBQWUsR0FBRyxzREFBc0QsV0FBVyxFQUFFLENBQUM7QUFzQjVGLFNBQVMsUUFBUSxDQUFDLEtBQXlCO0lBQ3pDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0IsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzNFLE9BQU8sVUFBVSxJQUFJLFNBQVMsQ0FBQztBQUNqQyxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsS0FBeUI7SUFDOUMsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzlCLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxLQUFL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LGdCQUFnQixVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUNoRixFQUFFLENBQ0gsQ0FBQztJQUNGLE1BQU0sU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDeEMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLE1BQU0sVUFBVSxRQUFRLENBQ3RCLFFBQW1CLEVBQ25CLFFBQTJCLEVBQzNCLFVBQWtCO0lBRWxCLE1BQU0sQ0FBQyxJQUFJLENBQ1QsMEJBQTBCLFFBQVEsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQ3BILENBQUM7SUFDRixPQUFPLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0FBQ2hGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEluc3RhbGwgYW5kIHJ1biBhbiBmcnAgY2xpZW50IChgZnJwY2ApIGZvciBhIHB1YmxpYyBIVFRQIHR1bm5lbC5cbiAqXG4gKiBUaGUgZGVmYXVsdHMgbWF0Y2ggdGhlIGRlcGxveW1lbnQgc2hhcGUgdXNlZCBieSBpbnNwaXJlLW1lZGlhbWl4OiBhIHNpbmdsZVxuICogVExTLXRlcm1pbmF0aW5nIGhvc3QgaXMgYm90aCB0aGUgV1NTIGNvbnRyb2wgZW5kcG9pbnQgYW5kIHRoZSBIVFRQIGN1c3RvbVxuICogZG9tYWluLiBDYWxsZXJzIG1heSBwb2ludCBgc2VydmVyYCBzb21ld2hlcmUgZWxzZSB3aGVuIGZycHMgaXMgZXhwb3NlZCBvbiBhXG4gKiBzZXBhcmF0ZSBjb250cm9sIGhvc3QuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgbWtkaXIsIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGRlbGltaXRlciwgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcblxuaW1wb3J0IHsgYmluLCBjb25maWcgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgVFVOTkVMX0NPTkZJRyB9IGZyb20gXCIuL19jb25maWcudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInR1bm5lbDpmcnBcIik7XG5jb25zdCBGUlBfVkVSU0lPTiA9IFwiMC42OC4xXCI7XG5jb25zdCBGUlBfUkVMRUFTRV9VUkwgPSBgaHR0cHM6Ly9naXRodWIuY29tL2ZhdGVkaWVyL2ZycC9yZWxlYXNlcy9kb3dubG9hZC92JHtGUlBfVkVSU0lPTn1gO1xuXG4vKiogT3B0aW9ucyBmb3IgaW5zdGFsbGluZyB0aGUgZnJwYyBleGVjdXRhYmxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGcnBJbnN0YWxsT3B0aW9ucyB7XG4gIC8qKiBIb21lIGRpcmVjdG9yeSBjb250YWluaW5nIGAuZnJwY2A7IGRlZmF1bHRzIHRvIHRoZSBPUyBob21lIGRpcmVjdG9yeS4gKi9cbiAgaG9tZURpcj86IHN0cmluZztcbn1cblxuLyoqIFJlc29sdmVkIGZycGMgd2lyaW5nLCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vIEZSUCB0dW5uZWwgaXMgY29uZmlndXJlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnJwQ29uZmlnIHtcbiAgcHVibGljRG9tYWluOiBzdHJpbmc7XG4gIHNlcnZlcjogc3RyaW5nO1xuICBzZXJ2ZXJQb3J0OiBudW1iZXI7XG4gIHByb3RvY29sOiBzdHJpbmc7XG4gIHRva2VuPzogc3RyaW5nO1xuICBwcm94eU5hbWU6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBzdHJpcFByZWZpeDogYm9vbGVhbjtcbiAgcG9ydDogbnVtYmVyO1xuICB0YXJnZXRQb3J0OiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIGJhcmVIb3N0KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBub3JtYWxpemVkID0gdmFsdWUucmVwbGFjZSgvXmh0dHBzPzpcXC9cXC8vLCBcIlwiKS5zcGxpdChcIi9cIilbMF0/LnRyaW0oKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQgfHwgdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkID0gdmFsdWU/LnRyaW0oKTtcbiAgaWYgKCF0cmltbWVkIHx8IHRyaW1tZWQgPT09IFwiL1wiKSByZXR1cm4gXCIvXCI7XG4gIHJldHVybiBgLyR7dHJpbW1lZC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKX1gO1xufVxuXG4vKiogUmVzb2x2ZSBmcnBjIGNvbmZpZyBmcm9tIHRoZSBwdWJsaWMgZG9tYWluIGFuZCBGUlAtc3BlY2lmaWMgZW52aXJvbm1lbnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZycENvbmZpZyhvcHRzOiB7XG4gIHB1YmxpY0RvbWFpbj86IHN0cmluZztcbiAgc2VydmVyPzogc3RyaW5nO1xuICBzZXJ2ZXJQb3J0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICBwcm90b2NvbD86IHN0cmluZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIHByb3h5TmFtZT86IHN0cmluZztcbiAgcGF0aD86IHN0cmluZztcbiAgc3RyaXBQcmVmaXg/OiBib29sZWFuO1xuICBwb3J0OiBudW1iZXI7XG4gIHRhcmdldFBvcnQ/OiBudW1iZXI7XG59KTogRnJwQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHVibGljRG9tYWluID0gYmFyZUhvc3QoXG4gICAgY29uZmlnLnN0cmluZyhcbiAgICAgIG9wdHMucHVibGljRG9tYWluLFxuICAgICAgW1wiRlJQX1BVQkxJQ19ET01BSU5cIiwgXCJQVUJMSUNfRE9NQUlOXCJdLFxuICAgICAgVFVOTkVMX0NPTkZJRyxcbiAgICApLFxuICApO1xuICBpZiAoIXB1YmxpY0RvbWFpbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgc2VydmVyID0gYmFyZUhvc3QoY29uZmlnLnN0cmluZyhvcHRzLnNlcnZlciwgXCJGUlBfU0VSVkVSXCIpKSA/PyBwdWJsaWNEb21haW47XG4gIGNvbnN0IHNlcnZlclBvcnQgPSBjb25maWcucG9ydChvcHRzLnNlcnZlclBvcnQsIFwiRlJQX1NFUlZFUl9QT1JUXCIsIDQ0Myk7XG4gIGNvbnN0IHByb3RvY29sID0gY29uZmlnLnN0cmluZyhvcHRzLnByb3RvY29sLCBcIkZSUF9QUk9UT0NPTFwiKSA/PyBcIndzc1wiO1xuICBjb25zdCB0b2tlbiA9IGNvbmZpZy5zdHJpbmcob3B0cy50b2tlbiwgW1wiRlJQX1RPS0VOXCIsIFwiVFVOTkVMX1RPS0VOXCJdKTtcbiAgY29uc3QgcHJveHlOYW1lID1cbiAgICBjb25maWcuc3RyaW5nKG9wdHMucHJveHlOYW1lLCBcIkZSUF9QUk9YWV9OQU1FXCIpID8/IHB1YmxpY0RvbWFpbi5zcGxpdChcIi5cIilbMF0gPz8gXCJhcHBcIjtcbiAgY29uc3QgYXBwTmFtZSA9IGNvbmZpZy5zdHJpbmcodW5kZWZpbmVkLCBcIkRBVEFCUklDS1NfQVBQX05BTUVcIikgPz8gcHJveHlOYW1lO1xuICBjb25zdCBwYXRoID0gbm9ybWFsaXplUGF0aChjb25maWcuc3RyaW5nKG9wdHMucGF0aCwgXCJGUlBfUEFUSFwiKSA/PyBhcHBOYW1lKTtcbiAgY29uc3Qgc3RyaXBQcmVmaXggPSBjb25maWcuYm9vbGVhbihvcHRzLnN0cmlwUHJlZml4LCBcIkZSUF9TVFJJUF9QUkVGSVhcIikgPz8gcGF0aCAhPT0gXCIvXCI7XG4gIHJldHVybiB7XG4gICAgcHVibGljRG9tYWluLFxuICAgIHNlcnZlcixcbiAgICBzZXJ2ZXJQb3J0LFxuICAgIHByb3RvY29sLFxuICAgIC4uLih0b2tlbiA/IHsgdG9rZW4gfSA6IHt9KSxcbiAgICBwcm94eU5hbWUsXG4gICAgcGF0aCxcbiAgICBzdHJpcFByZWZpeCxcbiAgICBwb3J0OiBvcHRzLnBvcnQsXG4gICAgdGFyZ2V0UG9ydDogb3B0cy50YXJnZXRQb3J0ID8/IG9wdHMucG9ydCxcbiAgfTtcbn1cblxuLyoqIEdpdEh1YiByZWxlYXNlIGFzc2V0IG5hbWUgZm9yIHRoZSBjdXJyZW50IG9yIHN1cHBsaWVkIE9TL2FyY2hpdGVjdHVyZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcnBBc3NldE5hbWUoXG4gIHZlcnNpb246IHN0cmluZyxcbiAgcGxhdGZvcm06IE5vZGVKUy5QbGF0Zm9ybSA9IHByb2Nlc3MucGxhdGZvcm0sXG4gIGFyY2g6IHN0cmluZyA9IHByb2Nlc3MuYXJjaCxcbik6IHN0cmluZyB7XG4gIGNvbnN0IG9zTmFtZSA9IHBsYXRmb3JtID09PSBcImRhcndpblwiID8gXCJkYXJ3aW5cIiA6IHBsYXRmb3JtID09PSBcImxpbnV4XCIgPyBcImxpbnV4XCIgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGFyY2hOYW1lID0gYXJjaCA9PT0gXCJhcm02NFwiID8gXCJhcm02NFwiIDogYXJjaCA9PT0gXCJ4NjRcIiA/IFwiYW1kNjRcIiA6IHVuZGVmaW5lZDtcbiAgaWYgKCFvc05hbWUgfHwgIWFyY2hOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBmcnAgaGFzIG5vIHN1cHBvcnRlZCByZWxlYXNlIGFzc2V0IGZvciAke3BsYXRmb3JtfS8ke2FyY2h9YCk7XG4gIH1cbiAgcmV0dXJuIGBmcnBfJHt2ZXJzaW9ufV8ke29zTmFtZX1fJHthcmNoTmFtZX0udGFyLmd6YDtcbn1cblxuZnVuY3Rpb24gZnJwRG93bmxvYWRVcmwoKTogc3RyaW5nIHtcbiAgY29uc3QgYXNzZXROYW1lID0gZnJwQXNzZXROYW1lKEZSUF9WRVJTSU9OKTtcbiAgbG9nZ2VyLmluZm8oXCJpbnN0YWxsaW5nIGZycGNcIiwgeyB2ZXJzaW9uOiBGUlBfVkVSU0lPTiwgYXNzZXQ6IGFzc2V0TmFtZSB9KTtcbiAgcmV0dXJuIGAke0ZSUF9SRUxFQVNFX1VSTH0vJHthc3NldE5hbWV9YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VsZWN0RnJwYyhzb3VyY2U6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHBhdGggPSBqb2luKHNvdXJjZSwgZnJwQXJjaGl2ZURpcmVjdG9yeSgpLCBcImZycGNcIik7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcImRhcndpblwiKSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2lnbmVyID0gc3Bhd24oXCJjb2Rlc2lnblwiLCBbXCItLWZvcmNlXCIsIFwiLS1zaWduXCIsIFwiLVwiLCBwYXRoXSwgeyBzdGRpbzogXCJpZ25vcmVcIiB9KTtcbiAgICAgIHNpZ25lci5vbmNlKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgICAgIHNpZ25lci5vbmNlKFwiZXhpdFwiLCAoY29kZSkgPT5cbiAgICAgICAgY29kZSA9PT0gMCA/IHJlc29sdmUoKSA6IHJlamVjdChuZXcgRXJyb3IoYGNvZGVzaWduIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5cbi8qKiBJbnN0YWxsIGZycGMgd2hlbiBhYnNlbnQgYW5kIHJldHVybiB0aGUgZW52aXJvbm1lbnQgdXNlZCBieSBpdHMgcHJvY2Vzcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsRnJwKG9wdGlvbnM6IEZycEluc3RhbGxPcHRpb25zID0ge30pOiBQcm9taXNlPE5vZGVKUy5Qcm9jZXNzRW52PiB7XG4gIGNvbnN0IGhvbWVEaXIgPSBvcHRpb25zLmhvbWVEaXIgPz8gb3MuaG9tZWRpcigpO1xuICBjb25zdCBjb250ZXh0ID0gYXdhaXQgYmluLmVuc3VyZShcImZycGNcIiwgZnJwRG93bmxvYWRVcmwsIHtcbiAgICBhdXRvVW5wYWNrYWdlOiB0cnVlLFxuICAgIGhvbWVEaXIsXG4gICAgbWluVmVyc2lvbjogRlJQX1ZFUlNJT04sXG4gICAgc2VsZWN0b3I6ICh7IHNvdXJjZSB9KSA9PiBzZWxlY3RGcnBjKHNvdXJjZSksXG4gICAgdmVyc2lvblBhcnNlcjogKHsgc3Rkb3V0LCBzdGRlcnIgfSkgPT4ge1xuICAgICAgY29uc3QgdmVyc2lvbiA9IGJpbi5wYXJzZVZlcnNpb24oeyBzdGRvdXQsIHN0ZGVyciB9KTtcbiAgICAgIHJldHVybiB2ZXJzaW9uID09PSBGUlBfVkVSU0lPTiA/IHZlcnNpb24gOiB1bmRlZmluZWQ7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgSE9NRTogaG9tZURpcixcbiAgICBQQVRIOiBbY29udGV4dC5iaW5EaXIsIHByb2Nlc3MuZW52LlBBVEggPz8gXCJcIl0uam9pbihkZWxpbWl0ZXIpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBmcnBBcmNoaXZlRGlyZWN0b3J5KFxuICBwbGF0Zm9ybTogTm9kZUpTLlBsYXRmb3JtID0gcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgYXJjaDogc3RyaW5nID0gcHJvY2Vzcy5hcmNoLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZycEFzc2V0TmFtZShGUlBfVkVSU0lPTiwgcGxhdGZvcm0sIGFyY2gpLnJlcGxhY2UoL1xcLnRhclxcLmd6JC8sIFwiXCIpO1xufVxuXG5mdW5jdGlvbiB0b21sU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xufVxuXG4vKiogUmVuZGVyIGB+Ly5mcnBjL2ZycGMudG9tbGAgZm9yIHRoZSByZXNvbHZlZCB0dW5uZWwuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVGcnBDb25maWcoXG4gIHJlc29sdmVkOiBGcnBDb25maWcsXG4gIGNoaWxkRW52OiBOb2RlSlMuUHJvY2Vzc0Vudixcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRpcmVjdG9yeSA9IGpvaW4oY2hpbGRFbnYuSE9NRSA/PyBvcy5ob21lZGlyKCksIFwiLmZycGNcIik7XG4gIGNvbnN0IHBhdGggPSBqb2luKGRpcmVjdG9yeSwgXCJmcnBjLnRvbWxcIik7XG4gIGF3YWl0IG1rZGlyKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGxpbmVzID0gW1xuICAgIGBzZXJ2ZXJBZGRyID0gJHt0b21sU3RyaW5nKHJlc29sdmVkLnNlcnZlcil9YCxcbiAgICBgc2VydmVyUG9ydCA9ICR7cmVzb2x2ZWQuc2VydmVyUG9ydH1gLFxuICAgIGB0cmFuc3BvcnQucHJvdG9jb2wgPSAke3RvbWxTdHJpbmcocmVzb2x2ZWQucHJvdG9jb2wpfWAsXG4gIF07XG4gIGlmIChyZXNvbHZlZC50b2tlbikgbGluZXMucHVzaChgYXV0aC50b2tlbiA9ICR7dG9tbFN0cmluZyhyZXNvbHZlZC50b2tlbil9YCk7XG4gIGxpbmVzLnB1c2goXG4gICAgXCJcIixcbiAgICBcIltbcHJveGllc11dXCIsXG4gICAgYG5hbWUgPSAke3RvbWxTdHJpbmcocmVzb2x2ZWQucHJveHlOYW1lKX1gLFxuICAgICd0eXBlID0gXCJodHRwXCInLFxuICAgIGBsb2NhbFBvcnQgPSAke3Jlc29sdmVkLnRhcmdldFBvcnR9YCxcbiAgICBgY3VzdG9tRG9tYWlucyA9IFske3RvbWxTdHJpbmcocmVzb2x2ZWQucHVibGljRG9tYWluKX1dYCxcbiAgICAuLi4ocmVzb2x2ZWQucGF0aCA9PT0gXCIvXCIgPyBbXSA6IFtgbG9jYXRpb25zID0gWyR7dG9tbFN0cmluZyhyZXNvbHZlZC5wYXRoKX1dYF0pLFxuICAgIFwiXCIsXG4gICk7XG4gIGF3YWl0IHdyaXRlRmlsZShwYXRoLCBsaW5lcy5qb2luKFwiXFxuXCIpKTtcbiAgcmV0dXJuIHBhdGg7XG59XG5cbi8qKiBMYXVuY2ggZnJwYyBhcyBhIGNoaWxkIHByb2Nlc3MgKGNhbGxlciBzdXBlcnZpc2VzIGFuZCB0ZXJtaW5hdGVzIGl0KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydEZycChcbiAgcmVzb2x2ZWQ6IEZycENvbmZpZyxcbiAgY2hpbGRFbnY6IE5vZGVKUy5Qcm9jZXNzRW52LFxuICBjb25maWdQYXRoOiBzdHJpbmcsXG4pOiBSZXR1cm5UeXBlPHR5cGVvZiBzcGF3bj4ge1xuICBsb2dnZXIuaW5mbyhcbiAgICBgZnJwYyB0dW5uZWxpbmcgaHR0cHM6Ly8ke3Jlc29sdmVkLnB1YmxpY0RvbWFpbn0ke3Jlc29sdmVkLnBhdGggPT09IFwiL1wiID8gXCJcIiA6IHJlc29sdmVkLnBhdGh9IC0+IDoke3Jlc29sdmVkLnBvcnR9YCxcbiAgKTtcbiAgcmV0dXJuIHNwYXduKFwiZnJwY1wiLCBbXCItY1wiLCBjb25maWdQYXRoXSwgeyBlbnY6IGNoaWxkRW52LCBzdGRpbzogXCJpbmhlcml0XCIgfSk7XG59XG4iXX0=
132
+ export function superviseFrp(resolved, childEnv, configPath) {
133
+ return superviseProcessForever({
134
+ name: "frpc",
135
+ logger,
136
+ start: () => startFrp(resolved, childEnv, configPath),
137
+ });
138
+ }
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZycC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekIsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFNUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsdUJBQXVCLEVBQTBCLE1BQU0saUJBQWlCLENBQUM7QUFFbEYsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN4QyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUM7QUFDN0IsTUFBTSxlQUFlLEdBQUcsc0RBQXNELFdBQVcsRUFBRSxDQUFDO0FBc0I1RixTQUFTLFFBQVEsQ0FBQyxLQUF5QjtJQUN6QyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzdCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUMzRSxPQUFPLFVBQVUsSUFBSSxTQUFTLENBQUM7QUFDakMsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLEtBQXlCO0lBQzlDLE1BQU0sT0FBTyxHQUFHLEtBQUssRUFBRSxJQUFJ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Q0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQ2hGLEVBQUUsQ0FDSCxDQUFDO0lBQ0YsTUFBTSxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN4QyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsTUFBTSxVQUFVLFFBQVEsQ0FDdEIsUUFBbUIsRUFDbkIsUUFBMkIsRUFDM0IsVUFBa0I7SUFFbEIsTUFBTSxDQUFDLElBQUksQ0FDVCwwQkFBMEIsUUFBUSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FDcEgsQ0FBQztJQUNGLE9BQU8sS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQzFCLFFBQW1CLEVBQ25CLFFBQTJCLEVBQzNCLFVBQWtCO0lBRWxCLE9BQU8sdUJBQXVCLENBQUM7UUFDN0IsSUFBSSxFQUFFLE1BQU07UUFDWixNQUFNO1FBQ04sS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQztLQUN0RCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbnN0YWxsIGFuZCBydW4gYW4gZnJwIGNsaWVudCAoYGZycGNgKSBmb3IgYSBwdWJsaWMgSFRUUCB0dW5uZWwuXG4gKlxuICogVGhlIGRlZmF1bHRzIG1hdGNoIHRoZSBkZXBsb3ltZW50IHNoYXBlIHVzZWQgYnkgaW5zcGlyZS1tZWRpYW1peDogYSBzaW5nbGVcbiAqIFRMUy10ZXJtaW5hdGluZyBob3N0IGlzIGJvdGggdGhlIFdTUyBjb250cm9sIGVuZHBvaW50IGFuZCB0aGUgSFRUUCBjdXN0b21cbiAqIGRvbWFpbi4gQ2FsbGVycyBtYXkgcG9pbnQgYHNlcnZlcmAgc29tZXdoZXJlIGVsc2Ugd2hlbiBmcnBzIGlzIGV4cG9zZWQgb24gYVxuICogc2VwYXJhdGUgY29udHJvbCBob3N0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IG1rZGlyLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBkZWxpbWl0ZXIsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IGJpbiwgY29uZmlnIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IFRVTk5FTF9DT05GSUcgfSBmcm9tIFwiLi9fY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBzdXBlcnZpc2VQcm9jZXNzRm9yZXZlciwgdHlwZSBQcm9jZXNzU3VwZXJ2aXNvciB9IGZyb20gXCIuL3N1cGVydmlzb3IudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInR1bm5lbDpmcnBcIik7XG5jb25zdCBGUlBfVkVSU0lPTiA9IFwiMC42OC4xXCI7XG5jb25zdCBGUlBfUkVMRUFTRV9VUkwgPSBgaHR0cHM6Ly9naXRodWIuY29tL2ZhdGVkaWVyL2ZycC9yZWxlYXNlcy9kb3dubG9hZC92JHtGUlBfVkVSU0lPTn1gO1xuXG4vKiogT3B0aW9ucyBmb3IgaW5zdGFsbGluZyB0aGUgZnJwYyBleGVjdXRhYmxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGcnBJbnN0YWxsT3B0aW9ucyB7XG4gIC8qKiBIb21lIGRpcmVjdG9yeSBjb250YWluaW5nIGAuZnJwY2A7IGRlZmF1bHRzIHRvIHRoZSBPUyBob21lIGRpcmVjdG9yeS4gKi9cbiAgaG9tZURpcj86IHN0cmluZztcbn1cblxuLyoqIFJlc29sdmVkIGZycGMgd2lyaW5nLCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vIEZSUCB0dW5uZWwgaXMgY29uZmlndXJlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnJwQ29uZmlnIHtcbiAgcHVibGljRG9tYWluOiBzdHJpbmc7XG4gIHNlcnZlcjogc3RyaW5nO1xuICBzZXJ2ZXJQb3J0OiBudW1iZXI7XG4gIHByb3RvY29sOiBzdHJpbmc7XG4gIHRva2VuPzogc3RyaW5nO1xuICBwcm94eU5hbWU6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBzdHJpcFByZWZpeDogYm9vbGVhbjtcbiAgcG9ydDogbnVtYmVyO1xuICB0YXJnZXRQb3J0OiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIGJhcmVIb3N0KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBub3JtYWxpemVkID0gdmFsdWUucmVwbGFjZSgvXmh0dHBzPzpcXC9cXC8vLCBcIlwiKS5zcGxpdChcIi9cIilbMF0/LnRyaW0oKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQgfHwgdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkID0gdmFsdWU/LnRyaW0oKTtcbiAgaWYgKCF0cmltbWVkIHx8IHRyaW1tZWQgPT09IFwiL1wiKSByZXR1cm4gXCIvXCI7XG4gIHJldHVybiBgLyR7dHJpbW1lZC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKX1gO1xufVxuXG4vKiogUmVzb2x2ZSBmcnBjIGNvbmZpZyBmcm9tIHRoZSBwdWJsaWMgZG9tYWluIGFuZCBGUlAtc3BlY2lmaWMgZW52aXJvbm1lbnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZycENvbmZpZyhvcHRzOiB7XG4gIHB1YmxpY0RvbWFpbj86IHN0cmluZztcbiAgc2VydmVyPzogc3RyaW5nO1xuICBzZXJ2ZXJQb3J0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICBwcm90b2NvbD86IHN0cmluZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIHByb3h5TmFtZT86IHN0cmluZztcbiAgcGF0aD86IHN0cmluZztcbiAgc3RyaXBQcmVmaXg/OiBib29sZWFuO1xuICBwb3J0OiBudW1iZXI7XG4gIHRhcmdldFBvcnQ/OiBudW1iZXI7XG59KTogRnJwQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHVibGljRG9tYWluID0gYmFyZUhvc3QoXG4gICAgY29uZmlnLnN0cmluZyhcbiAgICAgIG9wdHMucHVibGljRG9tYWluLFxuICAgICAgW1wiRlJQX1BVQkxJQ19ET01BSU5cIiwgXCJQVUJMSUNfRE9NQUlOXCJdLFxuICAgICAgVFVOTkVMX0NPTkZJRyxcbiAgICApLFxuICApO1xuICBpZiAoIXB1YmxpY0RvbWFpbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgc2VydmVyID0gYmFyZUhvc3QoY29uZmlnLnN0cmluZyhvcHRzLnNlcnZlciwgXCJGUlBfU0VSVkVSXCIpKSA/PyBwdWJsaWNEb21haW47XG4gIGNvbnN0IHNlcnZlclBvcnQgPSBjb25maWcucG9ydChvcHRzLnNlcnZlclBvcnQsIFwiRlJQX1NFUlZFUl9QT1JUXCIsIDQ0Myk7XG4gIGNvbnN0IHByb3RvY29sID0gY29uZmlnLnN0cmluZyhvcHRzLnByb3RvY29sLCBcIkZSUF9QUk9UT0NPTFwiKSA/PyBcIndzc1wiO1xuICBjb25zdCB0b2tlbiA9IGNvbmZpZy5zdHJpbmcob3B0cy50b2tlbiwgW1wiRlJQX1RPS0VOXCIsIFwiVFVOTkVMX1RPS0VOXCJdKTtcbiAgY29uc3QgcHJveHlOYW1lID1cbiAgICBjb25maWcuc3RyaW5nKG9wdHMucHJveHlOYW1lLCBcIkZSUF9QUk9YWV9OQU1FXCIpID8/IHB1YmxpY0RvbWFpbi5zcGxpdChcIi5cIilbMF0gPz8gXCJhcHBcIjtcbiAgY29uc3QgYXBwTmFtZSA9IGNvbmZpZy5zdHJpbmcodW5kZWZpbmVkLCBcIkRBVEFCUklDS1NfQVBQX05BTUVcIikgPz8gcHJveHlOYW1lO1xuICBjb25zdCBwYXRoID0gbm9ybWFsaXplUGF0aChjb25maWcuc3RyaW5nKG9wdHMucGF0aCwgXCJGUlBfUEFUSFwiKSA/PyBhcHBOYW1lKTtcbiAgY29uc3Qgc3RyaXBQcmVmaXggPSBjb25maWcuYm9vbGVhbihvcHRzLnN0cmlwUHJlZml4LCBcIkZSUF9TVFJJUF9QUkVGSVhcIikgPz8gcGF0aCAhPT0gXCIvXCI7XG4gIHJldHVybiB7XG4gICAgcHVibGljRG9tYWluLFxuICAgIHNlcnZlcixcbiAgICBzZXJ2ZXJQb3J0LFxuICAgIHByb3RvY29sLFxuICAgIC4uLih0b2tlbiA/IHsgdG9rZW4gfSA6IHt9KSxcbiAgICBwcm94eU5hbWUsXG4gICAgcGF0aCxcbiAgICBzdHJpcFByZWZpeCxcbiAgICBwb3J0OiBvcHRzLnBvcnQsXG4gICAgdGFyZ2V0UG9ydDogb3B0cy50YXJnZXRQb3J0ID8/IG9wdHMucG9ydCxcbiAgfTtcbn1cblxuLyoqIEdpdEh1YiByZWxlYXNlIGFzc2V0IG5hbWUgZm9yIHRoZSBjdXJyZW50IG9yIHN1cHBsaWVkIE9TL2FyY2hpdGVjdHVyZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcnBBc3NldE5hbWUoXG4gIHZlcnNpb246IHN0cmluZyxcbiAgcGxhdGZvcm06IE5vZGVKUy5QbGF0Zm9ybSA9IHByb2Nlc3MucGxhdGZvcm0sXG4gIGFyY2g6IHN0cmluZyA9IHByb2Nlc3MuYXJjaCxcbik6IHN0cmluZyB7XG4gIGNvbnN0IG9zTmFtZSA9IHBsYXRmb3JtID09PSBcImRhcndpblwiID8gXCJkYXJ3aW5cIiA6IHBsYXRmb3JtID09PSBcImxpbnV4XCIgPyBcImxpbnV4XCIgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGFyY2hOYW1lID0gYXJjaCA9PT0gXCJhcm02NFwiID8gXCJhcm02NFwiIDogYXJjaCA9PT0gXCJ4NjRcIiA/IFwiYW1kNjRcIiA6IHVuZGVmaW5lZDtcbiAgaWYgKCFvc05hbWUgfHwgIWFyY2hOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBmcnAgaGFzIG5vIHN1cHBvcnRlZCByZWxlYXNlIGFzc2V0IGZvciAke3BsYXRmb3JtfS8ke2FyY2h9YCk7XG4gIH1cbiAgcmV0dXJuIGBmcnBfJHt2ZXJzaW9ufV8ke29zTmFtZX1fJHthcmNoTmFtZX0udGFyLmd6YDtcbn1cblxuZnVuY3Rpb24gZnJwRG93bmxvYWRVcmwoKTogc3RyaW5nIHtcbiAgY29uc3QgYXNzZXROYW1lID0gZnJwQXNzZXROYW1lKEZSUF9WRVJTSU9OKTtcbiAgbG9nZ2VyLmluZm8oXCJpbnN0YWxsaW5nIGZycGNcIiwgeyB2ZXJzaW9uOiBGUlBfVkVSU0lPTiwgYXNzZXQ6IGFzc2V0TmFtZSB9KTtcbiAgcmV0dXJuIGAke0ZSUF9SRUxFQVNFX1VSTH0vJHthc3NldE5hbWV9YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VsZWN0RnJwYyhzb3VyY2U6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHBhdGggPSBqb2luKHNvdXJjZSwgZnJwQXJjaGl2ZURpcmVjdG9yeSgpLCBcImZycGNcIik7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcImRhcndpblwiKSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2lnbmVyID0gc3Bhd24oXCJjb2Rlc2lnblwiLCBbXCItLWZvcmNlXCIsIFwiLS1zaWduXCIsIFwiLVwiLCBwYXRoXSwgeyBzdGRpbzogXCJpZ25vcmVcIiB9KTtcbiAgICAgIHNpZ25lci5vbmNlKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgICAgIHNpZ25lci5vbmNlKFwiZXhpdFwiLCAoY29kZSkgPT5cbiAgICAgICAgY29kZSA9PT0gMCA/IHJlc29sdmUoKSA6IHJlamVjdChuZXcgRXJyb3IoYGNvZGVzaWduIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5cbi8qKiBJbnN0YWxsIGZycGMgd2hlbiBhYnNlbnQgYW5kIHJldHVybiB0aGUgZW52aXJvbm1lbnQgdXNlZCBieSBpdHMgcHJvY2Vzcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsRnJwKG9wdGlvbnM6IEZycEluc3RhbGxPcHRpb25zID0ge30pOiBQcm9taXNlPE5vZGVKUy5Qcm9jZXNzRW52PiB7XG4gIGNvbnN0IGhvbWVEaXIgPSBvcHRpb25zLmhvbWVEaXIgPz8gb3MuaG9tZWRpcigpO1xuICBjb25zdCBjb250ZXh0ID0gYXdhaXQgYmluLmVuc3VyZShcImZycGNcIiwgZnJwRG93bmxvYWRVcmwsIHtcbiAgICBhdXRvVW5wYWNrYWdlOiB0cnVlLFxuICAgIGhvbWVEaXIsXG4gICAgbWluVmVyc2lvbjogRlJQX1ZFUlNJT04sXG4gICAgc2VsZWN0b3I6ICh7IHNvdXJjZSB9KSA9PiBzZWxlY3RGcnBjKHNvdXJjZSksXG4gICAgdmVyc2lvblBhcnNlcjogKHsgc3Rkb3V0LCBzdGRlcnIgfSkgPT4ge1xuICAgICAgY29uc3QgdmVyc2lvbiA9IGJpbi5wYXJzZVZlcnNpb24oeyBzdGRvdXQsIHN0ZGVyciB9KTtcbiAgICAgIHJldHVybiB2ZXJzaW9uID09PSBGUlBfVkVSU0lPTiA/IHZlcnNpb24gOiB1bmRlZmluZWQ7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgSE9NRTogaG9tZURpcixcbiAgICBQQVRIOiBbY29udGV4dC5iaW5EaXIsIHByb2Nlc3MuZW52LlBBVEggPz8gXCJcIl0uam9pbihkZWxpbWl0ZXIpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBmcnBBcmNoaXZlRGlyZWN0b3J5KFxuICBwbGF0Zm9ybTogTm9kZUpTLlBsYXRmb3JtID0gcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgYXJjaDogc3RyaW5nID0gcHJvY2Vzcy5hcmNoLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZycEFzc2V0TmFtZShGUlBfVkVSU0lPTiwgcGxhdGZvcm0sIGFyY2gpLnJlcGxhY2UoL1xcLnRhclxcLmd6JC8sIFwiXCIpO1xufVxuXG5mdW5jdGlvbiB0b21sU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xufVxuXG4vKiogUmVuZGVyIGB+Ly5mcnBjL2ZycGMudG9tbGAgZm9yIHRoZSByZXNvbHZlZCB0dW5uZWwuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVGcnBDb25maWcoXG4gIHJlc29sdmVkOiBGcnBDb25maWcsXG4gIGNoaWxkRW52OiBOb2RlSlMuUHJvY2Vzc0Vudixcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRpcmVjdG9yeSA9IGpvaW4oY2hpbGRFbnYuSE9NRSA/PyBvcy5ob21lZGlyKCksIFwiLmZycGNcIik7XG4gIGNvbnN0IHBhdGggPSBqb2luKGRpcmVjdG9yeSwgXCJmcnBjLnRvbWxcIik7XG4gIGF3YWl0IG1rZGlyKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGxpbmVzID0gW1xuICAgIGBzZXJ2ZXJBZGRyID0gJHt0b21sU3RyaW5nKHJlc29sdmVkLnNlcnZlcil9YCxcbiAgICBgc2VydmVyUG9ydCA9ICR7cmVzb2x2ZWQuc2VydmVyUG9ydH1gLFxuICAgIGB0cmFuc3BvcnQucHJvdG9jb2wgPSAke3RvbWxTdHJpbmcocmVzb2x2ZWQucHJvdG9jb2wpfWAsXG4gICAgXCJsb2dpbkZhaWxFeGl0ID0gZmFsc2VcIixcbiAgXTtcbiAgaWYgKHJlc29sdmVkLnRva2VuKSBsaW5lcy5wdXNoKGBhdXRoLnRva2VuID0gJHt0b21sU3RyaW5nKHJlc29sdmVkLnRva2VuKX1gKTtcbiAgbGluZXMucHVzaChcbiAgICBcIlwiLFxuICAgIFwiW1twcm94aWVzXV1cIixcbiAgICBgbmFtZSA9ICR7dG9tbFN0cmluZyhyZXNvbHZlZC5wcm94eU5hbWUpfWAsXG4gICAgJ3R5cGUgPSBcImh0dHBcIicsXG4gICAgYGxvY2FsUG9ydCA9ICR7cmVzb2x2ZWQudGFyZ2V0UG9ydH1gLFxuICAgIGBjdXN0b21Eb21haW5zID0gWyR7dG9tbFN0cmluZyhyZXNvbHZlZC5wdWJsaWNEb21haW4pfV1gLFxuICAgIC4uLihyZXNvbHZlZC5wYXRoID09PSBcIi9cIiA/IFtdIDogW2Bsb2NhdGlvbnMgPSBbJHt0b21sU3RyaW5nKHJlc29sdmVkLnBhdGgpfV1gXSksXG4gICAgXCJcIixcbiAgKTtcbiAgYXdhaXQgd3JpdGVGaWxlKHBhdGgsIGxpbmVzLmpvaW4oXCJcXG5cIikpO1xuICByZXR1cm4gcGF0aDtcbn1cblxuLyoqIExhdW5jaCBmcnBjIGFzIGEgY2hpbGQgcHJvY2VzcyAoY2FsbGVyIHN1cGVydmlzZXMgYW5kIHRlcm1pbmF0ZXMgaXQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0RnJwKFxuICByZXNvbHZlZDogRnJwQ29uZmlnLFxuICBjaGlsZEVudjogTm9kZUpTLlByb2Nlc3NFbnYsXG4gIGNvbmZpZ1BhdGg6IHN0cmluZyxcbik6IFJldHVyblR5cGU8dHlwZW9mIHNwYXduPiB7XG4gIGxvZ2dlci5pbmZvKFxuICAgIGBmcnBjIHR1bm5lbGluZyBodHRwczovLyR7cmVzb2x2ZWQucHVibGljRG9tYWlufSR7cmVzb2x2ZWQucGF0aCA9PT0gXCIvXCIgPyBcIlwiIDogcmVzb2x2ZWQucGF0aH0gLT4gOiR7cmVzb2x2ZWQucG9ydH1gLFxuICApO1xuICByZXR1cm4gc3Bhd24oXCJmcnBjXCIsIFtcIi1jXCIsIGNvbmZpZ1BhdGhdLCB7IGVudjogY2hpbGRFbnYsIHN0ZGlvOiBcImluaGVyaXRcIiB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1cGVydmlzZUZycChcbiAgcmVzb2x2ZWQ6IEZycENvbmZpZyxcbiAgY2hpbGRFbnY6IE5vZGVKUy5Qcm9jZXNzRW52LFxuICBjb25maWdQYXRoOiBzdHJpbmcsXG4pOiBQcm9jZXNzU3VwZXJ2aXNvciB7XG4gIHJldHVybiBzdXBlcnZpc2VQcm9jZXNzRm9yZXZlcih7XG4gICAgbmFtZTogXCJmcnBjXCIsXG4gICAgbG9nZ2VyLFxuICAgIHN0YXJ0OiAoKSA9PiBzdGFydEZycChyZXNvbHZlZCwgY2hpbGRFbnYsIGNvbmZpZ1BhdGgpLFxuICB9KTtcbn1cbiJdfQ==
@@ -16,7 +16,9 @@
16
16
  *
17
17
  * @module
18
18
  */
19
- import type { Interceptor } from "@dbx-tools/appkit";
19
+ import type { Interceptor, InterceptorContext } from "@dbx-tools/appkit";
20
+ import { resolveFrpConfig } from "./frp.ts";
21
+ import { resolvePortrConfig } from "./portr.ts";
20
22
  /** Options for {@link tunnelInterceptor} (each also resolvable from env). */
21
23
  export interface TunnelInterceptorOptions {
22
24
  /** Tunnel clients to run. Env `DBX_TOOLS_TUNNEL_TRANSPORT`; defaults to `portr`. */
@@ -50,6 +52,13 @@ export interface TunnelInterceptorOptions {
50
52
  }
51
53
  /** Public tunnel clients supported by the interceptor and CLI. */
52
54
  export type TunnelTransport = "portr" | "frp" | "both";
55
+ interface TunnelAuxiliary {
56
+ stop(): void;
57
+ }
58
+ interface TunnelRuntime {
59
+ startPortr(config: NonNullable<ReturnType<typeof resolvePortrConfig>>): Promise<TunnelAuxiliary>;
60
+ startFrp(config: NonNullable<ReturnType<typeof resolveFrpConfig>>, ctx: InterceptorContext): Promise<TunnelAuxiliary>;
61
+ }
53
62
  /** Resolve and validate the tunnel transport selector. */
54
63
  export declare function resolveTunnelTransport(transport?: string): TunnelTransport;
55
64
  /**
@@ -67,4 +76,5 @@ export declare function resolveTunnelTransport(transport?: string): TunnelTransp
67
76
  * interceptor: tunnelInterceptor(),
68
77
  * });
69
78
  */
70
- export declare function tunnelInterceptor(options?: TunnelInterceptorOptions): Interceptor;
79
+ export declare function tunnelInterceptor(options?: TunnelInterceptorOptions, runtime?: TunnelRuntime): Interceptor;
80
+ export {};
@@ -17,16 +17,38 @@
17
17
  * @module
18
18
  */
19
19
  import { log, object } from "@dbx-tools/shared-core";
20
- import { installFrp, resolveFrpConfig, startFrp, writeFrpConfig } from "./frp.js";
21
- import { installPortr, resolvePortrConfig, startPortr, writePortrConfig } from "./portr.js";
20
+ import { installFrp, resolveFrpConfig, superviseFrp, writeFrpConfig } from "./frp.js";
21
+ import { installPortr, resolvePortrConfig, supervisePortr, writePortrConfig } from "./portr.js";
22
22
  import { startPathProxy } from "./path-proxy.js";
23
23
  const logger = log.logger("tunnel:interceptor");
24
+ const defaultRuntime = {
25
+ async startPortr(config) {
26
+ const portrEnv = await installPortr();
27
+ await writePortrConfig(config, portrEnv);
28
+ return supervisePortr(config, portrEnv);
29
+ },
30
+ async startFrp(config, ctx) {
31
+ const pathProxy = config.stripPrefix && config.path !== "/"
32
+ ? await startPathProxy(config.targetPort, config.path)
33
+ : undefined;
34
+ if (pathProxy) {
35
+ config.targetPort = pathProxy.port;
36
+ ctx.onLifecycle("shutdown", () => void pathProxy.close());
37
+ }
38
+ const frpEnv = await installFrp();
39
+ const configPath = await writeFrpConfig(config, frpEnv);
40
+ const supervisor = superviseFrp(config, frpEnv, configPath);
41
+ return {
42
+ stop() {
43
+ supervisor.stop();
44
+ void pathProxy?.close();
45
+ },
46
+ };
47
+ },
48
+ };
24
49
  /** Resolve and validate the tunnel transport selector. */
25
50
  export function resolveTunnelTransport(transport) {
26
- const resolved = transport ??
27
- process.env.DBX_TOOLS_TUNNEL_TRANSPORT ??
28
- process.env.TUNNEL_TRANSPORT ??
29
- "portr";
51
+ const resolved = transport ?? process.env.DBX_TOOLS_TUNNEL_TRANSPORT ?? process.env.TUNNEL_TRANSPORT ?? "portr";
30
52
  if (resolved === "portr" || resolved === "frp" || resolved === "both")
31
53
  return resolved;
32
54
  throw new TypeError(`invalid tunnel transport: ${resolved} (expected portr, frp, or both)`);
@@ -50,14 +72,14 @@ function resolvePublicPort(port) {
50
72
  * interceptor: tunnelInterceptor(),
51
73
  * });
52
74
  */
53
- export function tunnelInterceptor(options = {}) {
75
+ export function tunnelInterceptor(options = {}, runtime = defaultRuntime) {
54
76
  return async (ctx) => {
55
77
  if (ctx.env.databricksHost) {
56
78
  process.env.DATABRICKS_HOST ??= ctx.env.databricksHost;
57
79
  }
58
80
  const port = resolvePublicPort(options.port);
59
81
  const transport = resolveTunnelTransport(options.transport);
60
- const children = [];
82
+ const initializers = [];
61
83
  if (transport === "portr" || transport === "both") {
62
84
  const portrConfig = resolvePortrConfig({
63
85
  publicDomain: options.publicDomain,
@@ -65,9 +87,7 @@ export function tunnelInterceptor(options = {}) {
65
87
  port,
66
88
  });
67
89
  if (portrConfig) {
68
- const portrEnv = await installPortr();
69
- await writePortrConfig(portrConfig, portrEnv);
70
- children.push(await startPortr(portrConfig, portrEnv));
90
+ initializers.push(runtime.startPortr(portrConfig));
71
91
  }
72
92
  else {
73
93
  logger.info("portr not configured (requires PORTR_TOKEN and TUNNEL_PUBLIC_DOMAIN)");
@@ -86,31 +106,38 @@ export function tunnelInterceptor(options = {}) {
86
106
  port,
87
107
  });
88
108
  if (frpConfig) {
89
- const pathProxy = frpConfig.stripPrefix && frpConfig.path !== "/"
90
- ? await startPathProxy(port, frpConfig.path)
91
- : undefined;
92
- if (pathProxy) {
93
- frpConfig.targetPort = pathProxy.port;
94
- ctx.onLifecycle("shutdown", () => void pathProxy.close());
95
- }
96
- const frpEnv = await installFrp();
97
- const configPath = await writeFrpConfig(frpConfig, frpEnv);
98
- children.push(startFrp(frpConfig, frpEnv, configPath));
109
+ initializers.push(runtime.startFrp(frpConfig, ctx));
99
110
  }
100
111
  else {
101
112
  logger.info("frp not configured (requires TUNNEL_PUBLIC_DOMAIN)");
102
113
  }
103
114
  }
104
- if (!children.length)
115
+ if (!initializers.length)
105
116
  return;
106
- for (const child of children)
107
- ctx.bindProcess(child);
108
- ctx.onLifecycle("shutdown", () => {
109
- for (const child of children)
110
- if (!child.killed)
111
- child.kill("SIGTERM");
117
+ const auxiliaries = [];
118
+ let stopped = false;
119
+ const stop = () => {
120
+ stopped = true;
121
+ for (const auxiliary of auxiliaries)
122
+ auxiliary.stop();
123
+ };
124
+ ctx.onTeardown(stop);
125
+ ctx.onLifecycle("shutdown", stop);
126
+ void Promise.allSettled(initializers).then((results) => {
127
+ for (const result of results) {
128
+ if (result.status === "rejected") {
129
+ logger.error("tunnel failed to start", { error: result.reason });
130
+ continue;
131
+ }
132
+ if (stopped)
133
+ result.value.stop();
134
+ else
135
+ auxiliaries.push(result.value);
136
+ }
137
+ if (!stopped && auxiliaries.length)
138
+ logger.info(`tunnel bound: ${transport} -> :${port}`);
112
139
  });
113
- logger.info(`tunnel bound: ${transport} -> :${port}`);
140
+ logger.info(`tunnel initialization scheduled: ${transport} -> :${port}`);
114
141
  };
115
142
  }
116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBSUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEYsT0FBTyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQXFDaEQsMERBQTBEO0FBQzFELE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxTQUFrQjtJQUN2RCxNQUFNLFFBQVEsR0FDWixTQUFTO1FBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEI7UUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0I7UUFDNUIsT0FBTyxDQUFDO0lBQ1YsSUFBSSxRQUFRLEtBQUssT0FBTyxJQUFJLFFBQVEsS0FBSyxLQUFLLElBQUksUUFBUSxLQUFLLE1BQU07UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUN2RixNQUFNLElBQUksU0FBUyxDQUFDLDZCQUE2QixRQUFRLGlDQUFpQyxDQUFDLENBQUM7QUFDOUYsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixTQUFTLGlCQUFpQixDQUFDLElBQWE7SUFDdEMsT0FBTyxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLElBQUksSUFBSSxDQUFDO0FBQzFFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxVQUFvQyxFQUFFO0lBQ3RFLE9BQU8sS0FBSyxFQUFFLEdBQXVCLEVBQWlCLEVBQUU7UUFDdEQsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDO1FBQ3pELENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0MsTUFBTSxTQUFTLEdBQUcsc0JBQXNCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sUUFBUSxHQUFtQixFQUFFLENBQUM7UUFDcEMsSUFBSSxTQUFTLEtBQUssT0FBTyxJQUFJLFNBQVMsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNsRCxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQztnQkFDckMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO2dCQUNsQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7Z0JBQzVCLElBQUk7YUFDTCxDQUFDLENBQUM7WUFDSCxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixNQUFNLFFBQVEsR0FBRyxNQUFNLFlBQVksRUFBRSxDQUFDO2dCQUN0QyxNQUFNLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDOUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLFVBQVUsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN6RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDO1lBQ3RGLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxTQUFTLEtBQUssS0FBSyxJQUFJLFNBQVMsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNoRCxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQztnQkFDakMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxlQUFlO2dCQUNyQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFNBQVM7Z0JBQ3pCLFVBQVUsRUFBRSxPQUFPLENBQUMsYUFBYTtnQkFDakMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxXQUFXO2dCQUM3QixLQUFLLEVBQUUsT0FBTyxDQUFDLFFBQVE7Z0JBQ3ZCLFNBQVMsRUFBRSxPQUFPLENBQUMsWUFBWTtnQkFDL0IsSUFBSSxFQUFFLE9BQU8sQ0FBQyxPQUFPO2dCQUNyQixXQUFXLEVBQUUsT0FBTyxDQUFDLGNBQWM7Z0JBQ25DLElBQUk7YUFDTCxDQUFDLENBQUM7WUFDSCxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLE1BQU0sU0FBUyxHQUNiLFNBQVMsQ0FBQyxXQUFXLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxHQUFHO29CQUM3QyxDQUFDLENBQUMsTUFBTSxjQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUM7b0JBQzVDLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ2hCLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQ2QsU0FBUyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO29CQUN0QyxHQUFHLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RCxDQUFDO2dCQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sVUFBVSxHQUFHLE1BQU0sY0FBYyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDM0QsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ3pELENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxDQUFDLENBQUM7WUFDcEUsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQzdCLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUTtZQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO1lBQy9CLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUTtnQkFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07b0JBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RSxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLFNBQVMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGB0dW5uZWxJbnRlcmNlcHRvcigpYCAtIHRoZSB7QGxpbmsgSW50ZXJjZXB0b3J9IHRoYXQgZnJvbnRzIGFuIGFwcCB3aXRoIGEgcHVibGljXG4gKiBwb3J0ciBhbmQvb3IgZnJwIHR1bm5lbCwgY29uc3VtaW5nIHRoZSB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0fSBgQGRieC10b29scy9hcHBraXRgJ3NcbiAqIGBjcmVhdGVBcHBgIGhhbmRzIGl0LlxuICpcbiAqIFRoZSB0dW5uZWwgcnVucyBJTi1QUk9DRVNTOiB0aGUgQVBQIGlzIHRoZSBtYWluIHByb2Nlc3MgYW5kIGhhbmRzIHRoaXMgaW50ZXJjZXB0b3JcbiAqIGl0cyBjb250ZXh0LCByYXRoZXIgdGhhbiBhIHdyYXBwZXIgcHJvY2VzcyBzcGF3bmluZyB0aGUgYXBwIGFzIGEgY2hpbGQuIFRoZVxuICogaW50ZXJjZXB0b3IgYXBwbGllcyB0aGUgY29tcHV0ZWQgd29ya3NwYWNlIGhvc3QsIGluc3RhbGxzIGFuZCBsYXVuY2hlcyBwb3J0ciBvbiB0aGVcbiAqIGFwcCdzIHB1YmxpYyBwb3J0LCBiaW5kcyB0aGUgY2hpbGQgcHJvY2VzcyB0byB0aGUgYXBwLCBhbmQgc3RvcHMgcG9ydHIgZHVyaW5nIGFuXG4gKiBvcmRlcmx5IEFwcEtpdCBzaHV0ZG93bi5cbiAqXG4gKiBUaGUgcGFzc3dvcmRsZXNzIEdBVEUgaXMgYSBzZXBhcmF0ZSBjb25jZXJuOiBpdCBpcyB0aGUgYGF1dGhHYXRlYCBBcHBLaXQgcGx1Z2luLFxuICogd2hpY2ggcmVnaXN0ZXJzIHRoZSBsb2dpbiByb3V0ZXMgKyBhIGdhdGluZyBtaWRkbGV3YXJlIG9uIHRoZSBhcHAncyBvd24gc2VydmVyLlxuICogUmVnaXN0ZXIgaXQgaW4gdGhlIGFwcCdzIGBwbHVnaW5zYCBmb3IgZ2F0ZWQgdHJhZmZpYy4gVGhpcyBpbnRlcmNlcHRvciBpcyBvbmx5XG4gKiB0aGUgcG9ydHIgaGFsZiAtIFwidXBkYXRlIHRoZSBob3N0LCBiaW5kIHBvcnRyXCIgLSB0aGUgc21hbGxlc3QgdXNlZnVsIHVuaXQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcmNlcHRvciwgSW50ZXJjZXB0b3JDb250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBsb2csIG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBpbnN0YWxsRnJwLCByZXNvbHZlRnJwQ29uZmlnLCBzdGFydEZycCwgd3JpdGVGcnBDb25maWcgfSBmcm9tIFwiLi9mcnAudHNcIjtcbmltcG9ydCB7IGluc3RhbGxQb3J0ciwgcmVzb2x2ZVBvcnRyQ29uZmlnLCBzdGFydFBvcnRyLCB3cml0ZVBvcnRyQ29uZmlnIH0gZnJvbSBcIi4vcG9ydHIudHNcIjtcbmltcG9ydCB7IHN0YXJ0UGF0aFByb3h5IH0gZnJvbSBcIi4vcGF0aC1wcm94eS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwidHVubmVsOmludGVyY2VwdG9yXCIpO1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIHR1bm5lbEludGVyY2VwdG9yfSAoZWFjaCBhbHNvIHJlc29sdmFibGUgZnJvbSBlbnYpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUdW5uZWxJbnRlcmNlcHRvck9wdGlvbnMge1xuICAvKiogVHVubmVsIGNsaWVudHMgdG8gcnVuLiBFbnYgYERCWF9UT09MU19UVU5ORUxfVFJBTlNQT1JUYDsgZGVmYXVsdHMgdG8gYHBvcnRyYC4gKi9cbiAgdHJhbnNwb3J0PzogVHVubmVsVHJhbnNwb3J0O1xuICAvKiogUHVibGljIGhvc3QgdG8gc2VydmUgb24uIEVudiBgVFVOTkVMX1BVQkxJQ19ET01BSU5gLiAqL1xuICBwdWJsaWNEb21haW4/OiBzdHJpbmc7XG4gIC8qKiBwb3J0ciBzdWJkb21haW4gKGVsc2UgZGVyaXZlZCBmcm9tIHtAbGluayBwdWJsaWNEb21haW59KS4gKi9cbiAgc3ViZG9tYWluPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIFBVQkxJQyBwb3J0IHBvcnRyIGZvcndhcmRzIHRvIC0gdGhlIHBvcnQgdGhlIGFwcCBpdHNlbGYgbGlzdGVucyBvbi5cbiAgICogRGVmYXVsdHMgdG8gdGhlIERhdGFicmlja3MgQXBwcyBydW50aW1lIGNvbnRyYWN0IGBEQVRBQlJJQ0tTX0FQUF9QT1JUYFxuICAgKiAodGhlbiBgODAwMGApLCB3aGljaCBpcyB0aGUgcG9ydCB0aGUgcGxhdGZvcm0gcm91dGVzIHRvLlxuICAgKi9cbiAgcG9ydD86IG51bWJlcjtcbiAgLyoqIGZycHMgY29udHJvbCBob3N0OyBkZWZhdWx0cyB0byB0aGUgRlJQIHB1YmxpYyBkb21haW4uIEVudiBgRlJQX1NFUlZFUmAuICovXG4gIGZycFNlcnZlcj86IHN0cmluZztcbiAgLyoqIEZSUCBwdWJsaWMgSFRUUCBob3N0LiBFbnYgYFRVTk5FTF9GUlBfUFVCTElDX0RPTUFJTmAuICovXG4gIGZycFB1YmxpY0RvbWFpbj86IHN0cmluZztcbiAgLyoqIGZycHMgY29udHJvbCBwb3J0LiBFbnYgYEZSUF9TRVJWRVJfUE9SVGA7IGRlZmF1bHRzIHRvIGA0NDNgLiAqL1xuICBmcnBTZXJ2ZXJQb3J0PzogbnVtYmVyO1xuICAvKiogZnJwYyB0cmFuc3BvcnQgcHJvdG9jb2wuIEVudiBgRlJQX1BST1RPQ09MYDsgZGVmYXVsdHMgdG8gYHdzc2AuICovXG4gIGZycFByb3RvY29sPzogc3RyaW5nO1xuICAvKiogZnJwcyBhdXRoIHRva2VuLiBFbnYgYEZSUF9UT0tFTmAgKG9yIGBUVU5ORUxfVE9LRU5gKS4gKi9cbiAgZnJwVG9rZW4/OiBzdHJpbmc7XG4gIC8qKiBmcnAgcHJveHkgcmVnaXN0cmF0aW9uIG5hbWUuIEVudiBgRlJQX1BST1hZX05BTUVgLiAqL1xuICBmcnBQcm94eU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBGUlAgcGF0aCBsb2NhdGlvbi4gRW52IGBGUlBfUEFUSGA7IGRlZmF1bHRzIHRvIGBEQVRBQlJJQ0tTX0FQUF9OQU1FYC4gKi9cbiAgZnJwUGF0aD86IHN0cmluZztcbiAgLyoqIFN0cmlwIHRoZSBGUlAgcGF0aCBiZWZvcmUgZm9yd2FyZGluZy4gRW52IGBGUlBfU1RSSVBfUFJFRklYYDsgZGVmYXVsdHMgdHJ1ZSBmb3Igbm9uLXJvb3QgcGF0aHMuICovXG4gIGZycFN0cmlwUHJlZml4PzogYm9vbGVhbjtcbn1cblxuLyoqIFB1YmxpYyB0dW5uZWwgY2xpZW50cyBzdXBwb3J0ZWQgYnkgdGhlIGludGVyY2VwdG9yIGFuZCBDTEkuICovXG5leHBvcnQgdHlwZSBUdW5uZWxUcmFuc3BvcnQgPSBcInBvcnRyXCIgfCBcImZycFwiIHwgXCJib3RoXCI7XG5cbi8qKiBSZXNvbHZlIGFuZCB2YWxpZGF0ZSB0aGUgdHVubmVsIHRyYW5zcG9ydCBzZWxlY3Rvci4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVHVubmVsVHJhbnNwb3J0KHRyYW5zcG9ydD86IHN0cmluZyk6IFR1bm5lbFRyYW5zcG9ydCB7XG4gIGNvbnN0IHJlc29sdmVkID1cbiAgICB0cmFuc3BvcnQgPz9cbiAgICBwcm9jZXNzLmVudi5EQlhfVE9PTFNfVFVOTkVMX1RSQU5TUE9SVCA/P1xuICAgIHByb2Nlc3MuZW52LlRVTk5FTF9UUkFOU1BPUlQgPz9cbiAgICBcInBvcnRyXCI7XG4gIGlmIChyZXNvbHZlZCA9PT0gXCJwb3J0clwiIHx8IHJlc29sdmVkID09PSBcImZycFwiIHx8IHJlc29sdmVkID09PSBcImJvdGhcIikgcmV0dXJuIHJlc29sdmVkO1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKGBpbnZhbGlkIHR1bm5lbCB0cmFuc3BvcnQ6ICR7cmVzb2x2ZWR9IChleHBlY3RlZCBwb3J0ciwgZnJwLCBvciBib3RoKWApO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgcHVibGljIHBvcnQgcG9ydHIgc2hvdWxkIHRhcmdldDogZXhwbGljaXQsIGVsc2UgdGhlIEFwcHMgY29udHJhY3QuICovXG5mdW5jdGlvbiByZXNvbHZlUHVibGljUG9ydChwb3J0PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHBvcnQgPz8gb2JqZWN0LnRvTnVtYmVyKHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQVBQX1BPUlQpID8/IDgwMDA7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHR1bm5lbCB7QGxpbmsgSW50ZXJjZXB0b3J9LiBQYXNzIGl0IHRvIGBjcmVhdGVBcHAoeyBpbnRlcmNlcHRvciB9KWAuXG4gKlxuICogQSBuby1vcCAobG9ncyBhbmQgcmV0dXJucykgd2hlbiBub25lIG9mIHRoZSBzZWxlY3RlZCB0dW5uZWwgY2xpZW50cyByZXNvbHZlXG4gKiB1c2FibGUgY29uZmlndXJhdGlvbiwgc28gYW4gYXBwIGNhbiByZWdpc3RlciBpdCB1bmNvbmRpdGlvbmFsbHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgdHVubmVsSW50ZXJjZXB0b3IgfSBmcm9tIFwiQGRieC10b29scy90dW5uZWxcIjtcbiAqXG4gKiBhd2FpdCBhcHBraXQuY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW3NlcnZlcih7IGhvc3QsIHN0YXRpY1BhdGggfSldLFxuICogICBpbnRlcmNlcHRvcjogdHVubmVsSW50ZXJjZXB0b3IoKSxcbiAqIH0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHVubmVsSW50ZXJjZXB0b3Iob3B0aW9uczogVHVubmVsSW50ZXJjZXB0b3JPcHRpb25zID0ge30pOiBJbnRlcmNlcHRvciB7XG4gIHJldHVybiBhc3luYyAoY3R4OiBJbnRlcmNlcHRvckNvbnRleHQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoY3R4LmVudi5kYXRhYnJpY2tzSG9zdCkge1xuICAgICAgcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUID8/PSBjdHguZW52LmRhdGFicmlja3NIb3N0O1xuICAgIH1cblxuICAgIGNvbnN0IHBvcnQgPSByZXNvbHZlUHVibGljUG9ydChvcHRpb25zLnBvcnQpO1xuICAgIGNvbnN0IHRyYW5zcG9ydCA9IHJlc29sdmVUdW5uZWxUcmFuc3BvcnQob3B0aW9ucy50cmFuc3BvcnQpO1xuICAgIGNvbnN0IGNoaWxkcmVuOiBDaGlsZFByb2Nlc3NbXSA9IFtdO1xuICAgIGlmICh0cmFuc3BvcnQgPT09IFwicG9ydHJcIiB8fCB0cmFuc3BvcnQgPT09IFwiYm90aFwiKSB7XG4gICAgICBjb25zdCBwb3J0ckNvbmZpZyA9IHJlc29sdmVQb3J0ckNvbmZpZyh7XG4gICAgICAgIHB1YmxpY0RvbWFpbjogb3B0aW9ucy5wdWJsaWNEb21haW4sXG4gICAgICAgIHN1YmRvbWFpbjogb3B0aW9ucy5zdWJkb21haW4sXG4gICAgICAgIHBvcnQsXG4gICAgICB9KTtcbiAgICAgIGlmIChwb3J0ckNvbmZpZykge1xuICAgICAgICBjb25zdCBwb3J0ckVudiA9IGF3YWl0IGluc3RhbGxQb3J0cigpO1xuICAgICAgICBhd2FpdCB3cml0ZVBvcnRyQ29uZmlnKHBvcnRyQ29uZmlnLCBwb3J0ckVudik7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goYXdhaXQgc3RhcnRQb3J0cihwb3J0ckNvbmZpZywgcG9ydHJFbnYpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwicG9ydHIgbm90IGNvbmZpZ3VyZWQgKHJlcXVpcmVzIFBPUlRSX1RPS0VOIGFuZCBUVU5ORUxfUFVCTElDX0RPTUFJTilcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0cmFuc3BvcnQgPT09IFwiZnJwXCIgfHwgdHJhbnNwb3J0ID09PSBcImJvdGhcIikge1xuICAgICAgY29uc3QgZnJwQ29uZmlnID0gcmVzb2x2ZUZycENvbmZpZyh7XG4gICAgICAgIHB1YmxpY0RvbWFpbjogb3B0aW9ucy5mcnBQdWJsaWNEb21haW4sXG4gICAgICAgIHNlcnZlcjogb3B0aW9ucy5mcnBTZXJ2ZXIsXG4gICAgICAgIHNlcnZlclBvcnQ6IG9wdGlvbnMuZnJwU2VydmVyUG9ydCxcbiAgICAgICAgcHJvdG9jb2w6IG9wdGlvbnMuZnJwUHJvdG9jb2wsXG4gICAgICAgIHRva2VuOiBvcHRpb25zLmZycFRva2VuLFxuICAgICAgICBwcm94eU5hbWU6IG9wdGlvbnMuZnJwUHJveHlOYW1lLFxuICAgICAgICBwYXRoOiBvcHRpb25zLmZycFBhdGgsXG4gICAgICAgIHN0cmlwUHJlZml4OiBvcHRpb25zLmZycFN0cmlwUHJlZml4LFxuICAgICAgICBwb3J0LFxuICAgICAgfSk7XG4gICAgICBpZiAoZnJwQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHBhdGhQcm94eSA9XG4gICAgICAgICAgZnJwQ29uZmlnLnN0cmlwUHJlZml4ICYmIGZycENvbmZpZy5wYXRoICE9PSBcIi9cIlxuICAgICAgICAgICAgPyBhd2FpdCBzdGFydFBhdGhQcm94eShwb3J0LCBmcnBDb25maWcucGF0aClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAocGF0aFByb3h5KSB7XG4gICAgICAgICAgZnJwQ29uZmlnLnRhcmdldFBvcnQgPSBwYXRoUHJveHkucG9ydDtcbiAgICAgICAgICBjdHgub25MaWZlY3ljbGUoXCJzaHV0ZG93blwiLCAoKSA9PiB2b2lkIHBhdGhQcm94eS5jbG9zZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcnBFbnYgPSBhd2FpdCBpbnN0YWxsRnJwKCk7XG4gICAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBhd2FpdCB3cml0ZUZycENvbmZpZyhmcnBDb25maWcsIGZycEVudik7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goc3RhcnRGcnAoZnJwQ29uZmlnLCBmcnBFbnYsIGNvbmZpZ1BhdGgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiZnJwIG5vdCBjb25maWd1cmVkIChyZXF1aXJlcyBUVU5ORUxfUFVCTElDX0RPTUFJTilcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghY2hpbGRyZW4ubGVuZ3RoKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikgY3R4LmJpbmRQcm9jZXNzKGNoaWxkKTtcbiAgICBjdHgub25MaWZlY3ljbGUoXCJzaHV0ZG93blwiLCAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSBpZiAoIWNoaWxkLmtpbGxlZCkgY2hpbGQua2lsbChcIlNJR1RFUk1cIik7XG4gICAgfSk7XG4gICAgbG9nZ2VyLmluZm8oYHR1bm5lbCBib3VuZDogJHt0cmFuc3BvcnR9IC0+IDoke3BvcnR9YCk7XG4gIH07XG59XG4iXX0=
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBR0gsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdEYsT0FBTyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQWlEaEQsTUFBTSxjQUFjLEdBQWtCO0lBQ3BDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTTtRQUNyQixNQUFNLFFBQVEsR0FBRyxNQUFNLFlBQVksRUFBRSxDQUFDO1FBQ3RDLE1BQU0sZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sY0FBYyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRztRQUN4QixNQUFNLFNBQVMsR0FDYixNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssR0FBRztZQUN2QyxDQUFDLENBQUMsTUFBTSxjQUFjLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3RELENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEIsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE1BQU0sQ0FBQyxVQUFVLEdBQUcsU0FB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RSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztvQkFDakUsU0FBUztnQkFDWCxDQUFDO2dCQUNELElBQUksT0FBTztvQkFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDOztvQkFDNUIsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEMsQ0FBQztZQUNELElBQUksQ0FBQyxPQUFPLElBQUksV0FBVyxDQUFDLE1BQU07Z0JBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsU0FBUyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7UUFDNUYsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxTQUFTLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRSxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBgdHVubmVsSW50ZXJjZXB0b3IoKWAgLSB0aGUge0BsaW5rIEludGVyY2VwdG9yfSB0aGF0IGZyb250cyBhbiBhcHAgd2l0aCBhIHB1YmxpY1xuICogcG9ydHIgYW5kL29yIGZycCB0dW5uZWwsIGNvbnN1bWluZyB0aGUge0BsaW5rIEludGVyY2VwdG9yQ29udGV4dH0gYEBkYngtdG9vbHMvYXBwa2l0YCdzXG4gKiBgY3JlYXRlQXBwYCBoYW5kcyBpdC5cbiAqXG4gKiBUaGUgdHVubmVsIHJ1bnMgSU4tUFJPQ0VTUzogdGhlIEFQUCBpcyB0aGUgbWFpbiBwcm9jZXNzIGFuZCBoYW5kcyB0aGlzIGludGVyY2VwdG9yXG4gKiBpdHMgY29udGV4dCwgcmF0aGVyIHRoYW4gYSB3cmFwcGVyIHByb2Nlc3Mgc3Bhd25pbmcgdGhlIGFwcCBhcyBhIGNoaWxkLiBUaGVcbiAqIGludGVyY2VwdG9yIGFwcGxpZXMgdGhlIGNvbXB1dGVkIHdvcmtzcGFjZSBob3N0LCBpbnN0YWxscyBhbmQgbGF1bmNoZXMgcG9ydHIgb24gdGhlXG4gKiBhcHAncyBwdWJsaWMgcG9ydCwgYmluZHMgdGhlIGNoaWxkIHByb2Nlc3MgdG8gdGhlIGFwcCwgYW5kIHN0b3BzIHBvcnRyIGR1cmluZyBhblxuICogb3JkZXJseSBBcHBLaXQgc2h1dGRvd24uXG4gKlxuICogVGhlIHBhc3N3b3JkbGVzcyBHQVRFIGlzIGEgc2VwYXJhdGUgY29uY2VybjogaXQgaXMgdGhlIGBhdXRoR2F0ZWAgQXBwS2l0IHBsdWdpbixcbiAqIHdoaWNoIHJlZ2lzdGVycyB0aGUgbG9naW4gcm91dGVzICsgYSBnYXRpbmcgbWlkZGxld2FyZSBvbiB0aGUgYXBwJ3Mgb3duIHNlcnZlci5cbiAqIFJlZ2lzdGVyIGl0IGluIHRoZSBhcHAncyBgcGx1Z2luc2AgZm9yIGdhdGVkIHRyYWZmaWMuIFRoaXMgaW50ZXJjZXB0b3IgaXMgb25seVxuICogdGhlIHBvcnRyIGhhbGYgLSBcInVwZGF0ZSB0aGUgaG9zdCwgYmluZCBwb3J0clwiIC0gdGhlIHNtYWxsZXN0IHVzZWZ1bCB1bml0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEludGVyY2VwdG9yLCBJbnRlcmNlcHRvckNvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGxvZywgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGluc3RhbGxGcnAsIHJlc29sdmVGcnBDb25maWcsIHN1cGVydmlzZUZycCwgd3JpdGVGcnBDb25maWcgfSBmcm9tIFwiLi9mcnAudHNcIjtcbmltcG9ydCB7IGluc3RhbGxQb3J0ciwgcmVzb2x2ZVBvcnRyQ29uZmlnLCBzdXBlcnZpc2VQb3J0ciwgd3JpdGVQb3J0ckNvbmZpZyB9IGZyb20gXCIuL3BvcnRyLnRzXCI7XG5pbXBvcnQgeyBzdGFydFBhdGhQcm94eSB9IGZyb20gXCIuL3BhdGgtcHJveHkudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInR1bm5lbDppbnRlcmNlcHRvclwiKTtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayB0dW5uZWxJbnRlcmNlcHRvcn0gKGVhY2ggYWxzbyByZXNvbHZhYmxlIGZyb20gZW52KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHVubmVsSW50ZXJjZXB0b3JPcHRpb25zIHtcbiAgLyoqIFR1bm5lbCBjbGllbnRzIHRvIHJ1bi4gRW52IGBEQlhfVE9PTFNfVFVOTkVMX1RSQU5TUE9SVGA7IGRlZmF1bHRzIHRvIGBwb3J0cmAuICovXG4gIHRyYW5zcG9ydD86IFR1bm5lbFRyYW5zcG9ydDtcbiAgLyoqIFB1YmxpYyBob3N0IHRvIHNlcnZlIG9uLiBFbnYgYFRVTk5FTF9QVUJMSUNfRE9NQUlOYC4gKi9cbiAgcHVibGljRG9tYWluPzogc3RyaW5nO1xuICAvKiogcG9ydHIgc3ViZG9tYWluIChlbHNlIGRlcml2ZWQgZnJvbSB7QGxpbmsgcHVibGljRG9tYWlufSkuICovXG4gIHN1YmRvbWFpbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBQVUJMSUMgcG9ydCBwb3J0ciBmb3J3YXJkcyB0byAtIHRoZSBwb3J0IHRoZSBhcHAgaXRzZWxmIGxpc3RlbnMgb24uXG4gICAqIERlZmF1bHRzIHRvIHRoZSBEYXRhYnJpY2tzIEFwcHMgcnVudGltZSBjb250cmFjdCBgREFUQUJSSUNLU19BUFBfUE9SVGBcbiAgICogKHRoZW4gYDgwMDBgKSwgd2hpY2ggaXMgdGhlIHBvcnQgdGhlIHBsYXRmb3JtIHJvdXRlcyB0by5cbiAgICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBmcnBzIGNvbnRyb2wgaG9zdDsgZGVmYXVsdHMgdG8gdGhlIEZSUCBwdWJsaWMgZG9tYWluLiBFbnYgYEZSUF9TRVJWRVJgLiAqL1xuICBmcnBTZXJ2ZXI/OiBzdHJpbmc7XG4gIC8qKiBGUlAgcHVibGljIEhUVFAgaG9zdC4gRW52IGBUVU5ORUxfRlJQX1BVQkxJQ19ET01BSU5gLiAqL1xuICBmcnBQdWJsaWNEb21haW4/OiBzdHJpbmc7XG4gIC8qKiBmcnBzIGNvbnRyb2wgcG9ydC4gRW52IGBGUlBfU0VSVkVSX1BPUlRgOyBkZWZhdWx0cyB0byBgNDQzYC4gKi9cbiAgZnJwU2VydmVyUG9ydD86IG51bWJlcjtcbiAgLyoqIGZycGMgdHJhbnNwb3J0IHByb3RvY29sLiBFbnYgYEZSUF9QUk9UT0NPTGA7IGRlZmF1bHRzIHRvIGB3c3NgLiAqL1xuICBmcnBQcm90b2NvbD86IHN0cmluZztcbiAgLyoqIGZycHMgYXV0aCB0b2tlbi4gRW52IGBGUlBfVE9LRU5gIChvciBgVFVOTkVMX1RPS0VOYCkuICovXG4gIGZycFRva2VuPzogc3RyaW5nO1xuICAvKiogZnJwIHByb3h5IHJlZ2lzdHJhdGlvbiBuYW1lLiBFbnYgYEZSUF9QUk9YWV9OQU1FYC4gKi9cbiAgZnJwUHJveHlOYW1lPzogc3RyaW5nO1xuICAvKiogRlJQIHBhdGggbG9jYXRpb24uIEVudiBgRlJQX1BBVEhgOyBkZWZhdWx0cyB0byBgREFUQUJSSUNLU19BUFBfTkFNRWAuICovXG4gIGZycFBhdGg/OiBzdHJpbmc7XG4gIC8qKiBTdHJpcCB0aGUgRlJQIHBhdGggYmVmb3JlIGZvcndhcmRpbmcuIEVudiBgRlJQX1NUUklQX1BSRUZJWGA7IGRlZmF1bHRzIHRydWUgZm9yIG5vbi1yb290IHBhdGhzLiAqL1xuICBmcnBTdHJpcFByZWZpeD86IGJvb2xlYW47XG59XG5cbi8qKiBQdWJsaWMgdHVubmVsIGNsaWVudHMgc3VwcG9ydGVkIGJ5IHRoZSBpbnRlcmNlcHRvciBhbmQgQ0xJLiAqL1xuZXhwb3J0IHR5cGUgVHVubmVsVHJhbnNwb3J0ID0gXCJwb3J0clwiIHwgXCJmcnBcIiB8IFwiYm90aFwiO1xuXG5pbnRlcmZhY2UgVHVubmVsQXV4aWxpYXJ5IHtcbiAgc3RvcCgpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgVHVubmVsUnVudGltZSB7XG4gIHN0YXJ0UG9ydHIoY29uZmlnOiBOb25OdWxsYWJsZTxSZXR1cm5UeXBlPHR5cGVvZiByZXNvbHZlUG9ydHJDb25maWc+Pik6IFByb21pc2U8VHVubmVsQXV4aWxpYXJ5PjtcbiAgc3RhcnRGcnAoXG4gICAgY29uZmlnOiBOb25OdWxsYWJsZTxSZXR1cm5UeXBlPHR5cGVvZiByZXNvbHZlRnJwQ29uZmlnPj4sXG4gICAgY3R4OiBJbnRlcmNlcHRvckNvbnRleHQsXG4gICk6IFByb21pc2U8VHVubmVsQXV4aWxpYXJ5Pjtcbn1cblxuY29uc3QgZGVmYXVsdFJ1bnRpbWU6IFR1bm5lbFJ1bnRpbWUgPSB7XG4gIGFzeW5jIHN0YXJ0UG9ydHIoY29uZmlnKSB7XG4gICAgY29uc3QgcG9ydHJFbnYgPSBhd2FpdCBpbnN0YWxsUG9ydHIoKTtcbiAgICBhd2FpdCB3cml0ZVBvcnRyQ29uZmlnKGNvbmZpZywgcG9ydHJFbnYpO1xuICAgIHJldHVybiBzdXBlcnZpc2VQb3J0cihjb25maWcsIHBvcnRyRW52KTtcbiAgfSxcbiAgYXN5bmMgc3RhcnRGcnAoY29uZmlnLCBjdHgpIHtcbiAgICBjb25zdCBwYXRoUHJveHkgPVxuICAgICAgY29uZmlnLnN0cmlwUHJlZml4ICYmIGNvbmZpZy5wYXRoICE9PSBcIi9cIlxuICAgICAgICA/IGF3YWl0IHN0YXJ0UGF0aFByb3h5KGNvbmZpZy50YXJnZXRQb3J0LCBjb25maWcucGF0aClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHBhdGhQcm94eSkge1xuICAgICAgY29uZmlnLnRhcmdldFBvcnQgPSBwYXRoUHJveHkucG9ydDtcbiAgICAgIGN0eC5vbkxpZmVjeWNsZShcInNodXRkb3duXCIsICgpID0+IHZvaWQgcGF0aFByb3h5LmNsb3NlKCkpO1xuICAgIH1cbiAgICBjb25zdCBmcnBFbnYgPSBhd2FpdCBpbnN0YWxsRnJwKCk7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IGF3YWl0IHdyaXRlRnJwQ29uZmlnKGNvbmZpZywgZnJwRW52KTtcbiAgICBjb25zdCBzdXBlcnZpc29yID0gc3VwZXJ2aXNlRnJwKGNvbmZpZywgZnJwRW52LCBjb25maWdQYXRoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RvcCgpIHtcbiAgICAgICAgc3VwZXJ2aXNvci5zdG9wKCk7XG4gICAgICAgIHZvaWQgcGF0aFByb3h5Py5jbG9zZSgpO1xuICAgICAgfSxcbiAgICB9O1xuICB9LFxufTtcblxuLyoqIFJlc29sdmUgYW5kIHZhbGlkYXRlIHRoZSB0dW5uZWwgdHJhbnNwb3J0IHNlbGVjdG9yLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUdW5uZWxUcmFuc3BvcnQodHJhbnNwb3J0Pzogc3RyaW5nKTogVHVubmVsVHJhbnNwb3J0IHtcbiAgY29uc3QgcmVzb2x2ZWQgPVxuICAgIHRyYW5zcG9ydCA/PyBwcm9jZXNzLmVudi5EQlhfVE9PTFNfVFVOTkVMX1RSQU5TUE9SVCA/PyBwcm9jZXNzLmVudi5UVU5ORUxfVFJBTlNQT1JUID8/IFwicG9ydHJcIjtcbiAgaWYgKHJlc29sdmVkID09PSBcInBvcnRyXCIgfHwgcmVzb2x2ZWQgPT09IFwiZnJwXCIgfHwgcmVzb2x2ZWQgPT09IFwiYm90aFwiKSByZXR1cm4gcmVzb2x2ZWQ7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgdHVubmVsIHRyYW5zcG9ydDogJHtyZXNvbHZlZH0gKGV4cGVjdGVkIHBvcnRyLCBmcnAsIG9yIGJvdGgpYCk7XG59XG5cbi8qKiBSZXNvbHZlIHRoZSBwdWJsaWMgcG9ydCBwb3J0ciBzaG91bGQgdGFyZ2V0OiBleHBsaWNpdCwgZWxzZSB0aGUgQXBwcyBjb250cmFjdC4gKi9cbmZ1bmN0aW9uIHJlc29sdmVQdWJsaWNQb3J0KHBvcnQ/OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gcG9ydCA/PyBvYmplY3QudG9OdW1iZXIocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19BUFBfUE9SVCkgPz8gODAwMDtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgdHVubmVsIHtAbGluayBJbnRlcmNlcHRvcn0uIFBhc3MgaXQgdG8gYGNyZWF0ZUFwcCh7IGludGVyY2VwdG9yIH0pYC5cbiAqXG4gKiBBIG5vLW9wIChsb2dzIGFuZCByZXR1cm5zKSB3aGVuIG5vbmUgb2YgdGhlIHNlbGVjdGVkIHR1bm5lbCBjbGllbnRzIHJlc29sdmVcbiAqIHVzYWJsZSBjb25maWd1cmF0aW9uLCBzbyBhbiBhcHAgY2FuIHJlZ2lzdGVyIGl0IHVuY29uZGl0aW9uYWxseS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyB0dW5uZWxJbnRlcmNlcHRvciB9IGZyb20gXCJAZGJ4LXRvb2xzL3R1bm5lbFwiO1xuICpcbiAqIGF3YWl0IGFwcGtpdC5jcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbc2VydmVyKHsgaG9zdCwgc3RhdGljUGF0aCB9KV0sXG4gKiAgIGludGVyY2VwdG9yOiB0dW5uZWxJbnRlcmNlcHRvcigpLFxuICogfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0dW5uZWxJbnRlcmNlcHRvcihcbiAgb3B0aW9uczogVHVubmVsSW50ZXJjZXB0b3JPcHRpb25zID0ge30sXG4gIHJ1bnRpbWU6IFR1bm5lbFJ1bnRpbWUgPSBkZWZhdWx0UnVudGltZSxcbik6IEludGVyY2VwdG9yIHtcbiAgcmV0dXJuIGFzeW5jIChjdHg6IEludGVyY2VwdG9yQ29udGV4dCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChjdHguZW52LmRhdGFicmlja3NIb3N0KSB7XG4gICAgICBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0hPU1QgPz89IGN0eC5lbnYuZGF0YWJyaWNrc0hvc3Q7XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IHJlc29sdmVQdWJsaWNQb3J0KG9wdGlvbnMucG9ydCk7XG4gICAgY29uc3QgdHJhbnNwb3J0ID0gcmVzb2x2ZVR1bm5lbFRyYW5zcG9ydChvcHRpb25zLnRyYW5zcG9ydCk7XG4gICAgY29uc3QgaW5pdGlhbGl6ZXJzOiBBcnJheTxQcm9taXNlPFR1bm5lbEF1eGlsaWFyeT4+ID0gW107XG4gICAgaWYgKHRyYW5zcG9ydCA9PT0gXCJwb3J0clwiIHx8IHRyYW5zcG9ydCA9PT0gXCJib3RoXCIpIHtcbiAgICAgIGNvbnN0IHBvcnRyQ29uZmlnID0gcmVzb2x2ZVBvcnRyQ29uZmlnKHtcbiAgICAgICAgcHVibGljRG9tYWluOiBvcHRpb25zLnB1YmxpY0RvbWFpbixcbiAgICAgICAgc3ViZG9tYWluOiBvcHRpb25zLnN1YmRvbWFpbixcbiAgICAgICAgcG9ydCxcbiAgICAgIH0pO1xuICAgICAgaWYgKHBvcnRyQ29uZmlnKSB7XG4gICAgICAgIGluaXRpYWxpemVycy5wdXNoKHJ1bnRpbWUuc3RhcnRQb3J0cihwb3J0ckNvbmZpZykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXCJwb3J0ciBub3QgY29uZmlndXJlZCAocmVxdWlyZXMgUE9SVFJfVE9LRU4gYW5kIFRVTk5FTF9QVUJMSUNfRE9NQUlOKVwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRyYW5zcG9ydCA9PT0gXCJmcnBcIiB8fCB0cmFuc3BvcnQgPT09IFwiYm90aFwiKSB7XG4gICAgICBjb25zdCBmcnBDb25maWcgPSByZXNvbHZlRnJwQ29uZmlnKHtcbiAgICAgICAgcHVibGljRG9tYWluOiBvcHRpb25zLmZycFB1YmxpY0RvbWFpbixcbiAgICAgICAgc2VydmVyOiBvcHRpb25zLmZycFNlcnZlcixcbiAgICAgICAgc2VydmVyUG9ydDogb3B0aW9ucy5mcnBTZXJ2ZXJQb3J0LFxuICAgICAgICBwcm90b2NvbDogb3B0aW9ucy5mcnBQcm90b2NvbCxcbiAgICAgICAgdG9rZW46IG9wdGlvbnMuZnJwVG9rZW4sXG4gICAgICAgIHByb3h5TmFtZTogb3B0aW9ucy5mcnBQcm94eU5hbWUsXG4gICAgICAgIHBhdGg6IG9wdGlvbnMuZnJwUGF0aCxcbiAgICAgICAgc3RyaXBQcmVmaXg6IG9wdGlvbnMuZnJwU3RyaXBQcmVmaXgsXG4gICAgICAgIHBvcnQsXG4gICAgICB9KTtcbiAgICAgIGlmIChmcnBDb25maWcpIHtcbiAgICAgICAgaW5pdGlhbGl6ZXJzLnB1c2gocnVudGltZS5zdGFydEZycChmcnBDb25maWcsIGN0eCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXCJmcnAgbm90IGNvbmZpZ3VyZWQgKHJlcXVpcmVzIFRVTk5FTF9QVUJMSUNfRE9NQUlOKVwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFpbml0aWFsaXplcnMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgYXV4aWxpYXJpZXM6IFR1bm5lbEF1eGlsaWFyeVtdID0gW107XG4gICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICBjb25zdCBzdG9wID0gKCkgPT4ge1xuICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICBmb3IgKGNvbnN0IGF1eGlsaWFyeSBvZiBhdXhpbGlhcmllcykgYXV4aWxpYXJ5LnN0b3AoKTtcbiAgICB9O1xuICAgIGN0eC5vblRlYXJkb3duKHN0b3ApO1xuICAgIGN0eC5vbkxpZmVjeWNsZShcInNodXRkb3duXCIsIHN0b3ApO1xuICAgIHZvaWQgUHJvbWlzZS5hbGxTZXR0bGVkKGluaXRpYWxpemVycykudGhlbigocmVzdWx0cykgPT4ge1xuICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKFwidHVubmVsIGZhaWxlZCB0byBzdGFydFwiLCB7IGVycm9yOiByZXN1bHQucmVhc29uIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdG9wcGVkKSByZXN1bHQudmFsdWUuc3RvcCgpO1xuICAgICAgICBlbHNlIGF1eGlsaWFyaWVzLnB1c2gocmVzdWx0LnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RvcHBlZCAmJiBhdXhpbGlhcmllcy5sZW5ndGgpIGxvZ2dlci5pbmZvKGB0dW5uZWwgYm91bmQ6ICR7dHJhbnNwb3J0fSAtPiA6JHtwb3J0fWApO1xuICAgIH0pO1xuICAgIGxvZ2dlci5pbmZvKGB0dW5uZWwgaW5pdGlhbGl6YXRpb24gc2NoZWR1bGVkOiAke3RyYW5zcG9ydH0gLT4gOiR7cG9ydH1gKTtcbiAgfTtcbn1cbiJdfQ==
@@ -213,7 +213,7 @@ export declare class AuthGatePlugin extends Plugin<AuthGateConfig> {
213
213
  };
214
214
  };
215
215
  private resolved;
216
- private runtime?;
216
+ private readonly runtimes;
217
217
  static getResourceRequirements(config: AuthGateConfig): ResourceRequirement[];
218
218
  setup(): Promise<void>;
219
219
  shutdown(): Promise<void>;