@dbx-tools/appkit-lakebox 0.9.154 → 0.9.158
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 +9 -9
- package/lib/index.d.ts +9 -9
- package/lib/index.js +10 -10
- package/lib/src/_resource-registry.d.ts +1 -1
- package/lib/src/_resource-registry.js +2 -2
- package/lib/src/_service-snapshots.js +4 -4
- package/lib/src/config.js +9 -9
- package/lib/src/desktop.js +4 -4
- package/lib/src/metrics.js +3 -3
- package/lib/src/plugin.d.ts +17 -17
- package/lib/src/plugin.js +8 -7
- package/lib/src/routes.d.ts +1 -1
- package/lib/src/routes.js +6 -6
- package/lib/src/runtime.d.ts +2 -2
- package/lib/src/runtime.js +10 -12
- package/lib/src/services.js +2 -2
- package/lib/src/user.js +3 -3
- package/package.json +11 -99
- package/src/_resource-registry.ts +1 -1
- package/src/_service-snapshots.ts +3 -3
- package/src/config.ts +8 -8
- package/src/desktop.ts +3 -3
- package/src/metrics.ts +2 -2
- package/src/plugin.ts +13 -13
- package/src/routes.ts +13 -6
- package/src/runtime.ts +12 -13
- package/src/services.ts +1 -1
- package/src/user.ts +2 -2
package/lib/src/plugin.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type IAppRouter } from "@databricks/appkit";
|
|
2
2
|
import { type ToolkitEntry, type ToolkitOptions, type ToolRegistry } from "@databricks/appkit/beta";
|
|
3
|
-
import {
|
|
3
|
+
import { ToolRegistryPlugin, type AgentToolExecutionContext } from "@dbx-tools/appkit";
|
|
4
4
|
import { type CreateLakeboxServiceRequest, type LakeboxClientConfigInput, type LakeboxCommandRequest, type LakeboxServiceLogsRequest } from "@dbx-tools/shared-lakebox";
|
|
5
5
|
import type { JSONSchema7 } from "json-schema";
|
|
6
6
|
import { z } from "zod";
|
|
@@ -149,16 +149,16 @@ export declare class AppKitLakeboxPlugin extends ToolRegistryPlugin<LakeboxPlugi
|
|
|
149
149
|
log: string;
|
|
150
150
|
}>;
|
|
151
151
|
operations: (identity?: string) => {
|
|
152
|
-
readonly get_lakebox:
|
|
153
|
-
readonly execute_lakebox_command:
|
|
152
|
+
readonly get_lakebox: import("@dbx-tools/appkit").AppKitOperation<z.ZodObject<{}, z.core.$strict>, unknown>;
|
|
153
|
+
readonly execute_lakebox_command: import("@dbx-tools/appkit").AppKitOperation<z.ZodObject<{
|
|
154
154
|
command: z.ZodString;
|
|
155
155
|
args: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
156
156
|
cwd: z.ZodOptional<z.ZodString>;
|
|
157
157
|
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
158
158
|
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
159
159
|
}, z.core.$strict>, unknown>;
|
|
160
|
-
readonly list_lakebox_services:
|
|
161
|
-
readonly create_lakebox_service:
|
|
160
|
+
readonly list_lakebox_services: import("@dbx-tools/appkit").AppKitOperation<z.ZodObject<{}, z.core.$strict>, unknown>;
|
|
161
|
+
readonly create_lakebox_service: import("@dbx-tools/appkit").AppKitOperation<z.ZodObject<{
|
|
162
162
|
name: z.ZodString;
|
|
163
163
|
image: z.ZodString;
|
|
164
164
|
command: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
@@ -177,16 +177,16 @@ export declare class AppKitLakeboxPlugin extends ToolRegistryPlugin<LakeboxPlugi
|
|
|
177
177
|
always: "always";
|
|
178
178
|
}>>;
|
|
179
179
|
}, z.core.$strict>, unknown>;
|
|
180
|
-
readonly start_lakebox_service:
|
|
180
|
+
readonly start_lakebox_service: import("@dbx-tools/appkit").AppKitOperation<z.ZodObject<{
|
|
181
181
|
name: z.ZodString;
|
|
182
182
|
}, z.core.$strict>, unknown>;
|
|
183
|
-
readonly stop_lakebox_service:
|
|
183
|
+
readonly stop_lakebox_service: import("@dbx-tools/appkit").AppKitOperation<z.ZodObject<{
|
|
184
184
|
name: z.ZodString;
|
|
185
185
|
}, z.core.$strict>, unknown>;
|
|
186
|
-
readonly remove_lakebox_service:
|
|
186
|
+
readonly remove_lakebox_service: import("@dbx-tools/appkit").AppKitOperation<z.ZodObject<{
|
|
187
187
|
name: z.ZodString;
|
|
188
188
|
}, z.core.$strict>, unknown>;
|
|
189
|
-
readonly get_lakebox_service_logs:
|
|
189
|
+
readonly get_lakebox_service_logs: import("@dbx-tools/appkit").AppKitOperation<z.ZodObject<{
|
|
190
190
|
name: z.ZodString;
|
|
191
191
|
maxLines: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
192
192
|
maxChars: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
@@ -200,16 +200,16 @@ export declare class AppKitLakeboxPlugin extends ToolRegistryPlugin<LakeboxPlugi
|
|
|
200
200
|
shutdown(): Promise<void>;
|
|
201
201
|
/** Returns the Zod-owned operation contracts used by agent tools. */
|
|
202
202
|
operations(identity?: string, origin?: string): {
|
|
203
|
-
readonly get_lakebox:
|
|
204
|
-
readonly execute_lakebox_command:
|
|
203
|
+
readonly get_lakebox: import("@dbx-tools/appkit").AppKitOperation<z.ZodObject<{}, z.core.$strict>, unknown>;
|
|
204
|
+
readonly execute_lakebox_command: import("@dbx-tools/appkit").AppKitOperation<z.ZodObject<{
|
|
205
205
|
command: z.ZodString;
|
|
206
206
|
args: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
207
207
|
cwd: z.ZodOptional<z.ZodString>;
|
|
208
208
|
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
209
209
|
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
210
210
|
}, z.core.$strict>, unknown>;
|
|
211
|
-
readonly list_lakebox_services:
|
|
212
|
-
readonly create_lakebox_service:
|
|
211
|
+
readonly list_lakebox_services: import("@dbx-tools/appkit").AppKitOperation<z.ZodObject<{}, z.core.$strict>, unknown>;
|
|
212
|
+
readonly create_lakebox_service: import("@dbx-tools/appkit").AppKitOperation<z.ZodObject<{
|
|
213
213
|
name: z.ZodString;
|
|
214
214
|
image: z.ZodString;
|
|
215
215
|
command: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
@@ -228,16 +228,16 @@ export declare class AppKitLakeboxPlugin extends ToolRegistryPlugin<LakeboxPlugi
|
|
|
228
228
|
always: "always";
|
|
229
229
|
}>>;
|
|
230
230
|
}, z.core.$strict>, unknown>;
|
|
231
|
-
readonly start_lakebox_service:
|
|
231
|
+
readonly start_lakebox_service: import("@dbx-tools/appkit").AppKitOperation<z.ZodObject<{
|
|
232
232
|
name: z.ZodString;
|
|
233
233
|
}, z.core.$strict>, unknown>;
|
|
234
|
-
readonly stop_lakebox_service:
|
|
234
|
+
readonly stop_lakebox_service: import("@dbx-tools/appkit").AppKitOperation<z.ZodObject<{
|
|
235
235
|
name: z.ZodString;
|
|
236
236
|
}, z.core.$strict>, unknown>;
|
|
237
|
-
readonly remove_lakebox_service:
|
|
237
|
+
readonly remove_lakebox_service: import("@dbx-tools/appkit").AppKitOperation<z.ZodObject<{
|
|
238
238
|
name: z.ZodString;
|
|
239
239
|
}, z.core.$strict>, unknown>;
|
|
240
|
-
readonly get_lakebox_service_logs:
|
|
240
|
+
readonly get_lakebox_service_logs: import("@dbx-tools/appkit").AppKitOperation<z.ZodObject<{
|
|
241
241
|
name: z.ZodString;
|
|
242
242
|
maxLines: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
243
243
|
maxChars: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
package/lib/src/plugin.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createWorkspaceClient, lakebase, toPlugin, } from "@databricks/appkit";
|
|
2
2
|
import { executeFromRegistry, } from "@databricks/appkit/beta";
|
|
3
|
-
import {
|
|
3
|
+
import { ToolRegistryPlugin, tryGetExecutionContext, captureServicePrincipalPool, require, entries, defineOperations, toolRegistryFromOperations, } from "@dbx-tools/appkit";
|
|
4
|
+
import { USER_ID_HEADER, USER_EMAIL_HEADER } from "@dbx-tools/shared-core";
|
|
4
5
|
import { createLakeboxServiceOperationSchema, executeLakeboxCommandOperationSchema, getLakeboxOperationSchema, getLakeboxServiceLogsOperationSchema, LAKEBOX_PLUGIN_NAME, LAKEBOX_ROUTES, lakeboxCommandRequestSchema, lakeboxServiceActionSchema, lakeboxServiceLogsRequestSchema, listLakeboxServicesOperationSchema, removeLakeboxServiceOperationSchema, startLakeboxServiceOperationSchema, stopLakeboxServiceOperationSchema, } from "@dbx-tools/shared-lakebox";
|
|
5
6
|
import { z } from "zod";
|
|
6
7
|
import { LakeboxResourceRegistry } from "./_resource-registry.js";
|
|
@@ -44,7 +45,7 @@ export class AppKitLakeboxPlugin extends ToolRegistryPlugin {
|
|
|
44
45
|
}
|
|
45
46
|
async setup() {
|
|
46
47
|
this.context?.onLifecycle("setup:complete", async () => {
|
|
47
|
-
const pool =
|
|
48
|
+
const pool = captureServicePrincipalPool(require(this.context, lakebase, "appkit-lakebox").exports().pool);
|
|
48
49
|
this.runtime.initialize(createWorkspaceClient().config, (headers) => this.requestIdentity(headers), new LakeboxServiceSnapshots(), new LakeboxResourceRegistry(this.runtime.config.application, pool));
|
|
49
50
|
void this.runtime.cleanupLegacy(pool);
|
|
50
51
|
const server = this.context?.getPlugins().get("server");
|
|
@@ -109,7 +110,7 @@ export class AppKitLakeboxPlugin extends ToolRegistryPlugin {
|
|
|
109
110
|
}
|
|
110
111
|
/** Returns selected AppKit toolkit entries backed by this plugin's agent tools. */
|
|
111
112
|
toolkit(options) {
|
|
112
|
-
return
|
|
113
|
+
return entries(LAKEBOX_PLUGIN_NAME, this.getAgentTools(), {
|
|
113
114
|
...options,
|
|
114
115
|
prefix: options?.prefix ?? "",
|
|
115
116
|
});
|
|
@@ -153,7 +154,7 @@ export class AppKitLakeboxPlugin extends ToolRegistryPlugin {
|
|
|
153
154
|
operations(identity, origin) {
|
|
154
155
|
const user = () => identity ?? this.executionIdentity();
|
|
155
156
|
const presentService = (value) => omitLog(withServiceOrigin(value, origin));
|
|
156
|
-
return
|
|
157
|
+
return defineOperations({
|
|
157
158
|
get_lakebox: {
|
|
158
159
|
schema: getLakeboxOperationSchema,
|
|
159
160
|
execute: async (_input, signal) => {
|
|
@@ -202,10 +203,10 @@ export class AppKitLakeboxPlugin extends ToolRegistryPlugin {
|
|
|
202
203
|
});
|
|
203
204
|
}
|
|
204
205
|
createToolRegistry(identity, origin) {
|
|
205
|
-
return
|
|
206
|
+
return toolRegistryFromOperations(this.operations(identity, origin));
|
|
206
207
|
}
|
|
207
208
|
executionIdentity() {
|
|
208
|
-
const context =
|
|
209
|
+
const context = tryGetExecutionContext();
|
|
209
210
|
if (!context)
|
|
210
211
|
throw new Error("Lakebox tools require an AppKit execution context");
|
|
211
212
|
return "userId" in context ? context.userId : context.serviceUserId;
|
|
@@ -326,4 +327,4 @@ function requestHeaders(request) {
|
|
|
326
327
|
}
|
|
327
328
|
/** AppKit plugin factory for {@link AppKitLakeboxPlugin}. */
|
|
328
329
|
export const lakebox = toPlugin(AppKitLakeboxPlugin);
|
|
329
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLFFBQVEsRUFDUixRQUFRLEdBR1QsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsbUJBQW1CLEdBSXBCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QsTUFBTSxFQUNOLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsY0FBYyxFQUNkLGNBQWMsRUFDZCxrQkFBa0IsR0FFbkIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQ0wsbUNBQW1DLEVBQ25DLG9DQUFvQyxFQUNwQyx5QkFBeUIsRUFDekIsb0NBQW9DLEVBQ3BDLG1CQUFtQixFQUNuQixjQUFjLEVBQ2QsMkJBQTJCLEVBQzNCLDBCQUEwQixFQUMxQiwrQkFBK0IsRUFDL0Isa0NBQWtDLEVBQ2xDLG1DQUFtQyxFQUNuQyxrQ0FBa0MsRUFDbEMsaUNBQWlDLEdBTWxDLE1BQU0sMkJBQTJCLENBQUM7QUFHbkMsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRSxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLDBCQUEwQixHQUUzQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsY0FBYyxFQUEwQixNQUFNLGNBQWMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFZbEQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyx5QkFBeUIsQ0FBZ0IsQ0FBQztBQUUvRTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFP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Q0FBQztZQUN6QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUs7Z0JBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkQsQ0FBQzthQUFNLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELDZEQUE2RDtBQUM3RCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEluY29taW5nSHR0cEhlYWRlcnMsIEluY29taW5nTWVzc2FnZSwgU2VydmVyIGFzIEh0dHBTZXJ2ZXIgfSBmcm9tIFwibm9kZTpodHRwXCI7XG5pbXBvcnQgdHlwZSB7IFNvY2tldCB9IGZyb20gXCJub2RlOm5ldFwiO1xuaW1wb3J0IHtcbiAgY3JlYXRlV29ya3NwYWNlQ2xpZW50LFxuICBsYWtlYmFzZSxcbiAgdG9QbHVnaW4sXG4gIHR5cGUgSUFwcFJvdXRlcixcbiAgdHlwZSBQbHVnaW5NYW5pZmVzdCxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgZXhlY3V0ZUZyb21SZWdpc3RyeSxcbiAgdHlwZSBUb29sa2l0RW50cnksXG4gIHR5cGUgVG9vbGtpdE9wdGlvbnMsXG4gIHR5cGUgVG9vbFJlZ2lzdHJ5LFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0L2JldGFcIjtcbmltcG9ydCB7XG4gIFVTRVJfRU1BSUxfSEVBREVSLFxuICBVU0VSX0lEX0hFQURFUixcbiAgYXBwa2l0LFxuICBsYWtlYmFzZVJlc29sdmVyLFxuICBwbHVnaW5SZWdpc3RyeSxcbiAgdG9vbGtpdEVudHJpZXMsXG4gIHRvb2xPcGVyYXRpb25zLFxuICBUb29sUmVnaXN0cnlQbHVnaW4sXG4gIHR5cGUgQWdlbnRUb29sRXhlY3V0aW9uQ29udGV4dCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQge1xuICBjcmVhdGVMYWtlYm94U2VydmljZU9wZXJhdGlvblNjaGVtYSxcbiAgZXhlY3V0ZUxha2Vib3hDb21tYW5kT3BlcmF0aW9uU2NoZW1hLFxuICBnZXRMYWtlYm94T3BlcmF0aW9uU2NoZW1hLFxuICBnZXRMYWtlYm94U2VydmljZUxvZ3NPcGVyYXRpb25TY2hlbWEsXG4gIExBS0VCT1hfUExVR0lOX05BTUUsXG4gIExBS0VCT1hfUk9VVEVTLFxuICBsYWtlYm94Q29tbWFuZFJlcXVlc3RTY2hlbWEsXG4gIGxha2Vib3hTZXJ2aWNlQWN0aW9uU2NoZW1hLFxuICBsYWtlYm94U2VydmljZUxvZ3NSZXF1ZXN0U2NoZW1hLFxuICBsaXN0TGFrZWJveFNlcnZpY2VzT3BlcmF0aW9uU2NoZW1hLFxuICByZW1vdmVMYWtlYm94U2VydmljZU9wZXJhdGlvblNjaGVtYSxcbiAgc3RhcnRMYWtlYm94U2VydmljZU9wZXJhdGlvblNjaGVtYSxcbiAgc3RvcExha2Vib3hTZXJ2aWNlT3BlcmF0aW9uU2NoZW1hLFxuICB0eXBlIENyZWF0ZUxha2Vib3hTZXJ2aWNlUmVxdWVzdCxcbiAgdHlwZSBMYWtlYm94Q2xpZW50Q29uZmlnSW5wdXQsXG4gIHR5cGUgTGFrZWJveENvbW1hbmRSZXF1ZXN0LFxuICB0eXBlIExha2Vib3hTZXJ2aWNlLFxuICB0eXBlIExha2Vib3hTZXJ2aWNlTG9nc1JlcXVlc3QsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1sYWtlYm94XCI7XG5pbXBvcnQgdHlwZSB7IEFwcGxpY2F0aW9uLCBSZXF1ZXN0LCBSZXNwb25zZSB9IGZyb20gXCJleHByZXNzXCI7XG5pbXBvcnQgdHlwZSB7IEpTT05TY2hlbWE3IH0gZnJvbSBcImpzb24tc2NoZW1hXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgTGFrZWJveFJlc291cmNlUmVnaXN0cnkgfSBmcm9tIFwiLi9fcmVzb3VyY2UtcmVnaXN0cnkudHNcIjtcbmltcG9ydCB7IExha2Vib3hTZXJ2aWNlU25hcHNob3RzIH0gZnJvbSBcIi4vX3NlcnZpY2Utc25hcHNob3RzLnRzXCI7XG5pbXBvcnQge1xuICBMYWtlYm94UGx1Z2luQ29uZmlnU2NoZW1hLFxuICByZXNvbHZlTGFrZWJveFBsdWdpbkNvbmZpZyxcbiAgdHlwZSBMYWtlYm94UGx1Z2luQ29uZmlnLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IExha2Vib3hSdW50aW1lLCB0eXBlIExha2Vib3hMZWdhY3lQb29sIH0gZnJvbSBcIi4vcnVudGltZS50c1wiO1xuaW1wb3J0IHsgd2l0aFNlcnZpY2VPcmlnaW4gfSBmcm9tIFwiLi9zZXJ2aWNlcy50c1wiO1xuXG5pbnRlcmZhY2UgU2VydmVyRXh0ZW5zaW9uIHtcbiAgYWRkRXh0ZW5zaW9uKGZuOiAoYXBwbGljYXRpb246IEFwcGxpY2F0aW9uKSA9PiB2b2lkKTogdm9pZDtcbiAgZ2V0U2VydmVyKCk6IEh0dHBTZXJ2ZXI7XG59XG5cbmludGVyZmFjZSBVcGdyYWRlSWRlbnRpdHlHYXRlIHtcbiAgaXNQcm90ZWN0ZWRIb3N0KGhlYWRlcnM6IEhlYWRlcnMpOiBib29sZWFuO1xuICBzZXNzaW9uKGhlYWRlcnM6IEhlYWRlcnMpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG59XG5cbmNvbnN0IENPTkZJR19TQ0hFTUEgPSB6LnRvSlNPTlNjaGVtYShMYWtlYm94UGx1Z2luQ29uZmlnU2NoZW1hKSBhcyBKU09OU2NoZW1hNztcblxuLyoqXG4gKiBBcHBLaXQgcGx1Z2luIGZvciB0aGUgc2luZ2xlIGFwcCBMYWtlYm94LlxuICpcbiAqIFJlZ2lzdGVycyB1c2VyLXNjb3BlZCBSRVNUIHJvdXRlcywgYWdlbnQgdG9vbHMsIHRoZSBkZXRlcm1pbmlzdGljIHNlcnZpY2VcbiAqIHByb3h5LCBhbmQgV2ViU29ja2V0IHVwZ3JhZGUgaGFuZGxpbmcuIEV2ZXJ5IExha2Vib3ggbGlmZWN5Y2xlIGNhbGwgdXNlcyB0aGVcbiAqIGFwcCBzZXJ2aWNlIHByaW5jaXBhbDsgdGhlIGF1dGhlbnRpY2F0ZWQgcmVxdWVzdCBpZGVudGl0eSBvbmx5IHNlbGVjdHMgdGhlXG4gKiB1c2VyJ3MgTGFrZWJveCBhY2NvdW50IGFuZCBhdXRob3JpemVzIHRoYXQgdXNlcidzIHJvdXRlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwcEtpdExha2Vib3hQbHVnaW4gZXh0ZW5kcyBUb29sUmVnaXN0cnlQbHVnaW48TGFrZWJveFBsdWdpbkNvbmZpZz4ge1xuICBzdGF0aWMgbWFuaWZlc3QgPSB7XG4gICAgbmFtZTogTEFLRUJPWF9QTFVHSU5fTkFNRSxcbiAgICBkaXNwbGF5TmFtZTogXCJMYWtlYm94XCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlJ1bnMgcGVyLXVzZXIgc2VydmljZXMsIHRlcm1pbmFscywgZGVza3RvcHMsIGFuZCBjb21tYW5kcyBpbiBvbmUgbGF6aWx5IGNyZWF0ZWQgRGF0YWJyaWNrcyBMYWtlYm94LlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7IHJlcXVpcmVkOiBbXSwgb3B0aW9uYWw6IFtdIH0sXG4gICAgY29uZmlnOiB7IHNjaGVtYTogQ09ORklHX1NDSEVNQSB9LFxuICB9IHNhdGlzZmllcyBQbHVnaW5NYW5pZmVzdDx0eXBlb2YgTEFLRUJPWF9QTFVHSU5fTkFNRT47XG5cbiAgcmVhZG9ubHkgcnVudGltZTogTGFrZWJveFJ1bnRpbWU7XG4gIHByaXZhdGUgbW91bnRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGh0dHBTZXJ2ZXI/OiBIdHRwU2VydmVyO1xuICBwcml2YXRlIHVwZ3JhZGVBdHRhY2hUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcml2YXRlIHVwZ3JhZGVJZGVudGl0eUdhdGU/OiBVcGdyYWRlSWRlbnRpdHlHYXRlO1xuICBwcml2YXRlIHJlYWRvbmx5IHVwZ3JhZGVIYW5kbGVyID0gKHJlcXVlc3Q6IEluY29taW5nTWVzc2FnZSwgc29ja2V0OiBTb2NrZXQsIGhlYWQ6IEJ1ZmZlcikgPT4ge1xuICAgIHZvaWQgdGhpcy5oYW5kbGVVcGdyYWRlKHJlcXVlc3QsIHNvY2tldCwgaGVhZCk7XG4gIH07XG5cbiAgLyoqIENyZWF0ZXMgYSBwbHVnaW4gd2l0aCBhIHN1cHBsaWVkIHNoYXJlZCBydW50aW1lIG9yIG9uZSBmcm9tIHJlc29sdmVkIGNvbmZpZy4gKi9cbiAgY29uc3RydWN0b3IoY29uZmlnOiBMYWtlYm94UGx1Z2luQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuICAgIHRoaXMucnVudGltZSA9IGNvbmZpZy5ydW50aW1lID8/IG5ldyBMYWtlYm94UnVudGltZShyZXNvbHZlTGFrZWJveFBsdWdpbkNvbmZpZyhjb25maWcpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdG9vbFJlZ2lzdHJ5KCk6IFRvb2xSZWdpc3RyeSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlVG9vbFJlZ2lzdHJ5KCk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNvbnRleHQ/Lm9uTGlmZWN5Y2xlKFwic2V0dXA6Y29tcGxldGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcG9vbCA9IGxha2ViYXNlUmVzb2x2ZXIuY2FwdHVyZVNlcnZpY2VQcmluY2lwYWxQb29sKFxuICAgICAgICBwbHVnaW5SZWdpc3RyeS5yZXF1aXJlKHRoaXMuY29udGV4dCwgbGFrZWJhc2UsIFwiYXBwa2l0LWxha2Vib3hcIikuZXhwb3J0cygpLnBvb2wsXG4gICAgICApO1xuICAgICAgdGhpcy5ydW50aW1lLmluaXRpYWxpemUoXG4gICAgICAgIGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpLmNvbmZpZyxcbiAgICAgICAgKGhlYWRlcnMpID0+IHRoaXMucmVxdWVzdElkZW50aXR5KGhlYWRlcnMpLFxuICAgICAgICBuZXcgTGFrZWJveFNlcnZpY2VTbmFwc2hvdHMoKSxcbiAgICAgICAgbmV3IExha2Vib3hSZXNvdXJjZVJlZ2lzdHJ5KHRoaXMucnVudGltZS5jb25maWcuYXBwbGljYXRpb24sIHBvb2wpLFxuICAgICAgKTtcbiAgICAgIHZvaWQgdGhpcy5ydW50aW1lLmNsZWFudXBMZWdhY3kocG9vbCBhcyBMYWtlYm94TGVnYWN5UG9vbCk7XG4gICAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLmNvbnRleHQ/LmdldFBsdWdpbnMoKS5nZXQoXCJzZXJ2ZXJcIikgYXMgU2VydmVyRXh0ZW5zaW9uIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCFzZXJ2ZXIgfHwgdGhpcy5tb3VudGVkKSByZXR1cm47XG4gICAgICB0aGlzLnVwZ3JhZGVJZGVudGl0eUdhdGUgPSByZXNvbHZlVXBncmFkZUlkZW50aXR5R2F0ZShcbiAgICAgICAgdGhpcy5jb250ZXh0Py5nZXRQbHVnaW5zKCkuZ2V0KFwiYXV0aEdhdGVcIiksXG4gICAgICApO1xuICAgICAgc2VydmVyLmFkZEV4dGVuc2lvbigoYXBwbGljYXRpb24pID0+IGFwcGxpY2F0aW9uLnVzZSh0aGlzLnJ1bnRpbWUucm91dGVzLm1pZGRsZXdhcmUoKSkpO1xuICAgICAgdGhpcy5tb3VudGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuYXR0YWNoVXBncmFkZUhhbmRsZXIoc2VydmVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGluamVjdFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICBjb25zdCBqc29uID0gKFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgbWV0aG9kOiBcImdldFwiIHwgXCJwb3N0XCIgfCBcImRlbGV0ZVwiLFxuICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgaGFuZGxlcjogKGlkZW50aXR5OiBzdHJpbmcsIHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTx1bmtub3duPixcbiAgICApID0+XG4gICAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICAgIHJlcy5qc29uKGF3YWl0IGhhbmRsZXIodGhpcy5yZXNvbHZlVXNlcklkKHJlcSksIHJlcSkpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAganNvbihcInN0YXR1c1wiLCBcImdldFwiLCBMQUtFQk9YX1JPVVRFUy5zdGF0dXMsIChpZGVudGl0eSkgPT4gdGhpcy5ydW50aW1lLnN1bW1hcnkoaWRlbnRpdHkpKTtcbiAgICBqc29uKFwic3RhcnRcIiwgXCJwb3N0XCIsIExBS0VCT1hfUk9VVEVTLnN0YXJ0LCBhc3luYyAoaWRlbnRpdHkpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMucnVudGltZS5zdGFydCgpO1xuICAgICAgcmV0dXJuIHRoaXMucnVudGltZS5zdW1tYXJ5KGlkZW50aXR5KTtcbiAgICB9KTtcbiAgICBqc29uKFwic3RvcFwiLCBcInBvc3RcIiwgTEFLRUJPWF9ST1VURVMuc3RvcCwgYXN5bmMgKGlkZW50aXR5KSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnJ1bnRpbWUuc3RvcCgpO1xuICAgICAgcmV0dXJuIHRoaXMucnVudGltZS5zdW1tYXJ5KGlkZW50aXR5KTtcbiAgICB9KTtcbiAgICBqc29uKFxuICAgICAgXCJleGVjdXRlQ29tbWFuZFwiLFxuICAgICAgXCJwb3N0XCIsXG4gICAgICBMQUtFQk9YX1JPVVRFUy5jb21tYW5kcyxcbiAgICAgIChpZGVudGl0eSwgcmVxKSA9PlxuICAgICAgICB0aGlzLnJ1bnRpbWUuZXhlY3V0ZShpZGVudGl0eSwgbGFrZWJveENvbW1hbmRSZXF1ZXN0U2NoZW1hLnBhcnNlKHJlcS5ib2R5ID8/IHt9KSkucmVzdWx0LFxuICAgICk7XG4gICAganNvbihcInNlcnZpY2VzXCIsIFwiZ2V0XCIsIExBS0VCT1hfUk9VVEVTLnNlcnZpY2VzLCBhc3luYyAoaWRlbnRpdHkpID0+ICh7XG4gICAgICBzZXJ2aWNlczogYXdhaXQgdGhpcy5ydW50aW1lLmxpc3RTZXJ2aWNlcyhpZGVudGl0eSksXG4gICAgfSkpO1xuICAgIGpzb24oXCJjcmVhdGVTZXJ2aWNlXCIsIFwicG9zdFwiLCBMQUtFQk9YX1JPVVRFUy5zZXJ2aWNlcywgYXN5bmMgKGlkZW50aXR5LCByZXEpID0+ICh7XG4gICAgICBzZXJ2aWNlOiBhd2FpdCB0aGlzLnJ1bnRpbWUuY3JlYXRlU2VydmljZShpZGVudGl0eSwgcmVxLmJvZHkgPz8ge30pLFxuICAgIH0pKTtcbiAgICBqc29uKFwic3RhcnRTZXJ2aWNlXCIsIFwicG9zdFwiLCBMQUtFQk9YX1JPVVRFUy5zZXJ2aWNlU3RhcnQsIGFzeW5jIChpZGVudGl0eSwgcmVxKSA9PiAoe1xuICAgICAgc2VydmljZTogYXdhaXQgdGhpcy5ydW50aW1lLnN0YXJ0U2VydmljZShpZGVudGl0eSwgc2VydmljZU5hbWUocmVxKSksXG4gICAgfSkpO1xuICAgIGpzb24oXCJzdG9wU2VydmljZVwiLCBcInBvc3RcIiwgTEFLRUJPWF9ST1VURVMuc2VydmljZVN0b3AsIGFzeW5jIChpZGVudGl0eSwgcmVxKSA9PiAoe1xuICAgICAgc2VydmljZTogYXdhaXQgdGhpcy5ydW50aW1lLnN0b3BTZXJ2aWNlKGlkZW50aXR5LCBzZXJ2aWNlTmFtZShyZXEpKSxcbiAgICB9KSk7XG4gICAganNvbihcInJlbW92ZVNlcnZpY2VcIiwgXCJkZWxldGVcIiwgTEFLRUJPWF9ST1VURVMuc2VydmljZSwgYXN5bmMgKGlkZW50aXR5LCByZXEpID0+ICh7XG4gICAgICByZW1vdmVkOiBhd2FpdCB0aGlzLnJ1bnRpbWUucmVtb3ZlU2VydmljZShpZGVudGl0eSwgc2VydmljZU5hbWUocmVxKSksXG4gICAgfSkpO1xuICAgIGpzb24oXCJzZXJ2aWNlTG9nc1wiLCBcImdldFwiLCBMQUtFQk9YX1JPVVRFUy5zZXJ2aWNlTG9ncywgKGlkZW50aXR5LCByZXEpID0+XG4gICAgICB0aGlzLnJ1bnRpbWUuc2VydmljZUxvZ3MoXG4gICAgICAgIGlkZW50aXR5LFxuICAgICAgICBsYWtlYm94U2VydmljZUxvZ3NSZXF1ZXN0U2NoZW1hLnBhcnNlKHtcbiAgICAgICAgICBuYW1lOiByZXEucGFyYW1zLm5hbWUsXG4gICAgICAgICAgbWF4TGluZXM6IHJlcS5xdWVyeS5tYXhMaW5lcyxcbiAgICAgICAgICBtYXhDaGFyczogcmVxLnF1ZXJ5Lm1heENoYXJzLFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgKTtcbiAgICBqc29uKFwibWV0cmljc1wiLCBcImdldFwiLCBMQUtFQk9YX1JPVVRFUy5tZXRyaWNzLCAoKSA9PiB0aGlzLnJ1bnRpbWUubWV0cmljc1Jlc3BvbnNlKCkpO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcIm1ldHJpY3NTdHJlYW1cIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IExBS0VCT1hfUk9VVEVTLm1ldHJpY3NTdHJlYW0sXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHRoaXMuc3RyZWFtTWV0cmljcyhyZXEsIHJlcyksXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmV0dXJucyBicm93c2VyLXNhZmUgcm91dGUgZGVmYXVsdHMgcHVibGlzaGVkIHRocm91Z2ggQXBwS2l0IGNsaWVudCBjb25maWcuICovXG4gIGNsaWVudENvbmZpZygpOiBMYWtlYm94Q2xpZW50Q29uZmlnSW5wdXQge1xuICAgIHJldHVybiB7IHJvdXRlUHJlZml4OiB0aGlzLnJ1bnRpbWUuY29uZmlnLnJvdXRlUHJlZml4IH07XG4gIH1cblxuICAvKiogUmV0dXJucyBzZWxlY3RlZCBBcHBLaXQgdG9vbGtpdCBlbnRyaWVzIGJhY2tlZCBieSB0aGlzIHBsdWdpbidzIGFnZW50IHRvb2xzLiAqL1xuICB0b29sa2l0KG9wdGlvbnM/OiBUb29sa2l0T3B0aW9ucyk6IFJlY29yZDxzdHJpbmcsIFRvb2xraXRFbnRyeT4ge1xuICAgIHJldHVybiB0b29sa2l0RW50cmllcy5lbnRyaWVzKExBS0VCT1hfUExVR0lOX05BTUUsIHRoaXMuZ2V0QWdlbnRUb29scygpLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgcHJlZml4OiBvcHRpb25zPy5wcmVmaXggPz8gXCJcIixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBFeGVjdXRlcyBvbmUgcmVnaXN0ZXJlZCBhZ2VudCB0b29sIGZvciB0aGUgY3VycmVudCBleGVjdXRpb24gaWRlbnRpdHkuICovXG4gIG92ZXJyaWRlIGV4ZWN1dGVBZ2VudFRvb2woXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGFyZ3M6IHVua25vd24sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgY29udGV4dD86IEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHQsXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBleGVjdXRlRnJvbVJlZ2lzdHJ5KFxuICAgICAgdGhpcy5jcmVhdGVUb29sUmVnaXN0cnkoY29udGV4dD8ucmVzb3VyY2VJZCwgY29udGV4dD8ub3JpZ2luKSxcbiAgICAgIG5hbWUsXG4gICAgICBhcmdzLFxuICAgICAgc2lnbmFsLFxuICAgICk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgdHlwZWQgc2libGluZy1wbHVnaW4gQVBJLiAqL1xuICBleHBvcnRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdW1tYXJ5OiAoaWRlbnRpdHk6IHN0cmluZykgPT4gdGhpcy5ydW50aW1lLnN1bW1hcnkoaWRlbnRpdHkpLFxuICAgICAgc3RhcnQ6ICgpID0+IHRoaXMucnVudGltZS5zdGFydCgpLFxuICAgICAgc3RvcDogKCkgPT4gdGhpcy5ydW50aW1lLnN0b3AoKSxcbiAgICAgIGRlbGV0ZTogKCkgPT4gdGhpcy5ydW50aW1lLmRlbGV0ZSgpLFxuICAgICAgZXhlY3V0ZUNvbW1hbmQ6IChpZGVudGl0eTogc3RyaW5nLCBpbnB1dDogTGFrZWJveENvbW1hbmRSZXF1ZXN0KSA9PlxuICAgICAgICB0aGlzLnJ1bnRpbWUuZXhlY3V0ZShpZGVudGl0eSwgaW5wdXQpLnJlc3VsdCxcbiAgICAgIGxpc3RTZXJ2aWNlczogKGlkZW50aXR5OiBzdHJpbmcpID0+IHRoaXMucnVudGltZS5saXN0U2VydmljZXMoaWRlbnRpdHkpLFxuICAgICAgY3JlYXRlU2VydmljZTogKGlkZW50aXR5OiBzdHJpbmcsIGlucHV0OiBDcmVhdGVMYWtlYm94U2VydmljZVJlcXVlc3QpID0+XG4gICAgICAgIHRoaXMucnVudGltZS5jcmVhdGVTZXJ2aWNlKGlkZW50aXR5LCBpbnB1dCksXG4gICAgICBzdGFydFNlcnZpY2U6IChpZGVudGl0eTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpID0+IHRoaXMucnVudGltZS5zdGFydFNlcnZpY2UoaWRlbnRpdHksIG5hbWUpLFxuICAgICAgc3RvcFNlcnZpY2U6IChpZGVudGl0eTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpID0+IHRoaXMucnVudGltZS5zdG9wU2VydmljZShpZGVudGl0eSwgbmFtZSksXG4gICAgICByZW1vdmVTZXJ2aWNlOiAoaWRlbnRpdHk6IHN0cmluZywgbmFtZTogc3RyaW5nKSA9PiB0aGlzLnJ1bnRpbWUucmVtb3ZlU2VydmljZShpZGVudGl0eSwgbmFtZSksXG4gICAgICBzZXJ2aWNlTG9nczogKGlkZW50aXR5OiBzdHJpbmcsIGlucHV0OiBMYWtlYm94U2VydmljZUxvZ3NSZXF1ZXN0KSA9PlxuICAgICAgICB0aGlzLnJ1bnRpbWUuc2VydmljZUxvZ3MoaWRlbnRpdHksIGlucHV0KSxcbiAgICAgIG9wZXJhdGlvbnM6IChpZGVudGl0eT86IHN0cmluZykgPT4gdGhpcy5vcGVyYXRpb25zKGlkZW50aXR5KSxcbiAgICAgIHRvb2xraXQ6IChvcHRpb25zPzogVG9vbGtpdE9wdGlvbnMpID0+IHRoaXMudG9vbGtpdChvcHRpb25zKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIENhbmNlbHMgaW4tZmxpZ2h0IHdvcmsgYmVmb3JlIHNodXRkb3duIHRlYXJzIGRvd24gcmVzb3VyY2VzLiAqL1xuICBvdmVycmlkZSBhYm9ydEFjdGl2ZU9wZXJhdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5ydW50aW1lLmFib3J0QWN0aXZlT3BlcmF0aW9ucygpO1xuICB9XG5cbiAgLyoqIERldGFjaGVzIFdlYlNvY2tldCBoYW5kbGluZyBhbmQgY2xvc2VzIHRoZSBzaGFyZWQgcnVudGltZS4gKi9cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMudXBncmFkZUF0dGFjaFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy51cGdyYWRlQXR0YWNoVGltZXIpO1xuICAgIHRoaXMudXBncmFkZUF0dGFjaFRpbWVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaHR0cFNlcnZlcj8ub2ZmKFwidXBncmFkZVwiLCB0aGlzLnVwZ3JhZGVIYW5kbGVyKTtcbiAgICB0aGlzLmh0dHBTZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gICAgYXdhaXQgdGhpcy5ydW50aW1lLmNsb3NlKCk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgWm9kLW93bmVkIG9wZXJhdGlvbiBjb250cmFjdHMgdXNlZCBieSBhZ2VudCB0b29scy4gKi9cbiAgb3BlcmF0aW9ucyhpZGVudGl0eT86IHN0cmluZywgb3JpZ2luPzogc3RyaW5nKSB7XG4gICAgY29uc3QgdXNlciA9ICgpID0+IGlkZW50aXR5ID8/IHRoaXMuZXhlY3V0aW9uSWRlbnRpdHkoKTtcbiAgICBjb25zdCBwcmVzZW50U2VydmljZSA9ICh2YWx1ZTogTGFrZWJveFNlcnZpY2UpID0+IG9taXRMb2cod2l0aFNlcnZpY2VPcmlnaW4odmFsdWUsIG9yaWdpbikpO1xuICAgIHJldHVybiB0b29sT3BlcmF0aW9ucy5kZWZpbmVPcGVyYXRpb25zKHtcbiAgICAgIGdldF9sYWtlYm94OiB7XG4gICAgICAgIHNjaGVtYTogZ2V0TGFrZWJveE9wZXJhdGlvblNjaGVtYSxcbiAgICAgICAgZXhlY3V0ZTogYXN5bmMgKF9pbnB1dCwgc2lnbmFsKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3VtbWFyeSA9IGF3YWl0IHRoaXMucnVudGltZS5zdW1tYXJ5KHVzZXIoKSwgc2lnbmFsKTtcbiAgICAgICAgICByZXR1cm4geyAuLi5zdW1tYXJ5LCBzZXJ2aWNlczogc3VtbWFyeS5zZXJ2aWNlcy5tYXAocHJlc2VudFNlcnZpY2UpIH07XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZXhlY3V0ZV9sYWtlYm94X2NvbW1hbmQ6IHtcbiAgICAgICAgc2NoZW1hOiBleGVjdXRlTGFrZWJveENvbW1hbmRPcGVyYXRpb25TY2hlbWEsXG4gICAgICAgIGV4ZWN1dGU6IChpbnB1dCwgc2lnbmFsKSA9PiB0aGlzLnJ1bnRpbWUuZXhlY3V0ZSh1c2VyKCksIGlucHV0LCBzaWduYWwpLnJlc3VsdCxcbiAgICAgIH0sXG4gICAgICBsaXN0X2xha2Vib3hfc2VydmljZXM6IHtcbiAgICAgICAgc2NoZW1hOiBsaXN0TGFrZWJveFNlcnZpY2VzT3BlcmF0aW9uU2NoZW1hLFxuICAgICAgICBleGVjdXRlOiBhc3luYyAoX2lucHV0LCBzaWduYWwpID0+ICh7XG4gICAgICAgICAgc2VydmljZXM6IChhd2FpdCB0aGlzLnJ1bnRpbWUubGlzdFNlcnZpY2VzKHVzZXIoKSwgc2lnbmFsKSkubWFwKHByZXNlbnRTZXJ2aWNlKSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICAgY3JlYXRlX2xha2Vib3hfc2VydmljZToge1xuICAgICAgICBzY2hlbWE6IGNyZWF0ZUxha2Vib3hTZXJ2aWNlT3BlcmF0aW9uU2NoZW1hLFxuICAgICAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQsIHNpZ25hbCkgPT4gKHtcbiAgICAgICAgICBzZXJ2aWNlOiBwcmVzZW50U2VydmljZShhd2FpdCB0aGlzLnJ1bnRpbWUuY3JlYXRlU2VydmljZSh1c2VyKCksIGlucHV0LCBzaWduYWwpKSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICAgc3RhcnRfbGFrZWJveF9zZXJ2aWNlOiB7XG4gICAgICAgIHNjaGVtYTogc3RhcnRMYWtlYm94U2VydmljZU9wZXJhdGlvblNjaGVtYSxcbiAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0LCBzaWduYWwpID0+ICh7XG4gICAgICAgICAgc2VydmljZTogcHJlc2VudFNlcnZpY2UoYXdhaXQgdGhpcy5ydW50aW1lLnN0YXJ0U2VydmljZSh1c2VyKCksIGlucHV0Lm5hbWUsIHNpZ25hbCkpLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgICBzdG9wX2xha2Vib3hfc2VydmljZToge1xuICAgICAgICBzY2hlbWE6IHN0b3BMYWtlYm94U2VydmljZU9wZXJhdGlvblNjaGVtYSxcbiAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0LCBzaWduYWwpID0+ICh7XG4gICAgICAgICAgc2VydmljZTogcHJlc2VudFNlcnZpY2UoYXdhaXQgdGhpcy5ydW50aW1lLnN0b3BTZXJ2aWNlKHVzZXIoKSwgaW5wdXQubmFtZSwgc2lnbmFsKSksXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICAgIHJlbW92ZV9sYWtlYm94X3NlcnZpY2U6IHtcbiAgICAgICAgc2NoZW1hOiByZW1vdmVMYWtlYm94U2VydmljZU9wZXJhdGlvblNjaGVtYSxcbiAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0LCBzaWduYWwpID0+ICh7XG4gICAgICAgICAgcmVtb3ZlZDogYXdhaXQgdGhpcy5ydW50aW1lLnJlbW92ZVNlcnZpY2UodXNlcigpLCBpbnB1dC5uYW1lLCBzaWduYWwpLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgICBnZXRfbGFrZWJveF9zZXJ2aWNlX2xvZ3M6IHtcbiAgICAgICAgc2NoZW1hOiBnZXRMYWtlYm94U2VydmljZUxvZ3NPcGVyYXRpb25TY2hlbWEsXG4gICAgICAgIGV4ZWN1dGU6IChpbnB1dCwgc2lnbmFsKSA9PiB0aGlzLnJ1bnRpbWUuc2VydmljZUxvZ3ModXNlcigpLCBpbnB1dCwgc2lnbmFsKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRvb2xSZWdpc3RyeShpZGVudGl0eT86IHN0cmluZywgb3JpZ2luPzogc3RyaW5nKTogVG9vbFJlZ2lzdHJ5IHtcbiAgICByZXR1cm4gdG9vbE9wZXJhdGlvbnMudG9vbFJlZ2lzdHJ5RnJvbU9wZXJhdGlvbnModGhpcy5vcGVyYXRpb25zKGlkZW50aXR5LCBvcmlnaW4pKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0aW9uSWRlbnRpdHkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250ZXh0ID0gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgICBpZiAoIWNvbnRleHQpIHRocm93IG5ldyBFcnJvcihcIkxha2Vib3ggdG9vbHMgcmVxdWlyZSBhbiBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHRcIik7XG4gICAgcmV0dXJuIFwidXNlcklkXCIgaW4gY29udGV4dCA/IGNvbnRleHQudXNlcklkIDogY29udGV4dC5zZXJ2aWNlVXNlcklkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHJvdXRlIGlkZW50aXR5IHdpdGggdGhlIHNhbWUgcnVsZXMgYXMgUkVTVDogdGhlIGZvcndhcmRlZCB1c2VyLFxuICAgKiBvciBBcHBLaXQncyBkZXZlbG9wbWVudCB1c2VyIGZvciBkaXJlY3QgbG9vcGJhY2sgbmF2aWdhdGlvbiBvdXRzaWRlXG4gICAqIHByb2R1Y3Rpb24uIEV2ZXJ5dGhpbmcgZWxzZSBpcyBhbm9ueW1vdXMgYW5kIGZhaWxzIGNsb3NlZC5cbiAgICovXG4gIHByaXZhdGUgcmVxdWVzdElkZW50aXR5KGhlYWRlcnM6IEluY29taW5nSHR0cEhlYWRlcnMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGZvcndhcmRlZCA9IGhlYWRlclZhbHVlKGhlYWRlcnNbVVNFUl9JRF9IRUFERVJdKT8udHJpbSgpO1xuICAgIGlmIChmb3J3YXJkZWQpIHJldHVybiBmb3J3YXJkZWQ7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcImRldmVsb3BtZW50XCIgfHwgIWlzTG9vcGJhY2tIb3N0KGhlYWRlclZhbHVlKGhlYWRlcnMuaG9zdCkpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZVVzZXJJZCh7XG4gICAgICAgIGhlYWRlcjogKG5hbWU6IHN0cmluZykgPT4gaGVhZGVyVmFsdWUoaGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBSZXF1ZXN0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdHJlYW1NZXRyaWNzKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGluaXRpYWwgPSBhd2FpdCB0aGlzLnJ1bnRpbWUubWV0cmljc1Jlc3BvbnNlKCk7XG4gICAgcmVzLnN0YXR1c0NvZGUgPSAyMDA7XG4gICAgcmVzLnNldEhlYWRlcihcImNvbnRlbnQtdHlwZVwiLCBcInRleHQvZXZlbnQtc3RyZWFtOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgIHJlcy5zZXRIZWFkZXIoXCJjYWNoZS1jb250cm9sXCIsIFwibm8tY2FjaGUsIG5vLXRyYW5zZm9ybVwiKTtcbiAgICByZXMuc2V0SGVhZGVyKFwiY29ubmVjdGlvblwiLCBcImtlZXAtYWxpdmVcIik7XG4gICAgcmVzLnNldEhlYWRlcihcIngtYWNjZWwtYnVmZmVyaW5nXCIsIFwibm9cIik7XG4gICAgcmVzLmZsdXNoSGVhZGVycz8uKCk7XG4gICAgcmVzLndyaXRlKGBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGluaXRpYWwpfVxcblxcbmApO1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gdGhpcy5ydW50aW1lLnN1YnNjcmliZU1ldHJpY3MoKHNuYXBzaG90KSA9PiB7XG4gICAgICByZXMud3JpdGUoYGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoeyBzdGF0dXM6IFwicnVubmluZ1wiLCBzZXJpZXM6IFtzbmFwc2hvdF0gfSl9XFxuXFxuYCk7XG4gICAgfSk7XG4gICAgcmVxLm9uY2UoXCJjbG9zZVwiLCB1bnN1YnNjcmliZSk7XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaFVwZ3JhZGVIYW5kbGVyKHNlcnZlcjogU2VydmVyRXh0ZW5zaW9uKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaHR0cFNlcnZlciB8fCB0aGlzLnVwZ3JhZGVBdHRhY2hUaW1lcikgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmh0dHBTZXJ2ZXIgPSBzZXJ2ZXIuZ2V0U2VydmVyKCk7XG4gICAgICB0aGlzLmh0dHBTZXJ2ZXIub24oXCJ1cGdyYWRlXCIsIHRoaXMudXBncmFkZUhhbmRsZXIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy51cGdyYWRlQXR0YWNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy51cGdyYWRlQXR0YWNoVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuYXR0YWNoVXBncmFkZUhhbmRsZXIoc2VydmVyKTtcbiAgICAgIH0sIDEwKTtcbiAgICAgIHRoaXMudXBncmFkZUF0dGFjaFRpbWVyLnVucmVmPy4oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVVwZ3JhZGUoXG4gICAgcmVxdWVzdDogSW5jb21pbmdNZXNzYWdlLFxuICAgIHNvY2tldDogU29ja2V0LFxuICAgIGhlYWQ6IEJ1ZmZlcixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGF0aCA9IG5ldyBVUkwocmVxdWVzdC51cmwgPz8gXCIvXCIsIFwiaHR0cDovL2xvY2FsaG9zdFwiKS5wYXRobmFtZTtcbiAgICBpZiAoIXRoaXMucnVudGltZS5yb3V0ZXMuY2FuSGFuZGxlVXBncmFkZShwYXRoKSkgcmV0dXJuO1xuICAgIGNvbnN0IGdhdGUgPSB0aGlzLnVwZ3JhZGVJZGVudGl0eUdhdGU7XG4gICAgaWYgKGdhdGUpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSByZXF1ZXN0SGVhZGVycyhyZXF1ZXN0KTtcbiAgICAgIGlmIChnYXRlLmlzUHJvdGVjdGVkSG9zdChoZWFkZXJzKSkge1xuICAgICAgICBkZWxldGUgcmVxdWVzdC5oZWFkZXJzW1VTRVJfSURfSEVBREVSXTtcbiAgICAgICAgZGVsZXRlIHJlcXVlc3QuaGVhZGVyc1tVU0VSX0VNQUlMX0hFQURFUl07XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGF3YWl0IGdhdGUuc2Vzc2lvbihoZWFkZXJzKTtcbiAgICAgICAgaWYgKCF1c2VySWQpIHtcbiAgICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0LmhlYWRlcnNbVVNFUl9JRF9IRUFERVJdID0gdXNlcklkO1xuICAgICAgICByZXF1ZXN0LmhlYWRlcnNbVVNFUl9FTUFJTF9IRUFERVJdID0gdXNlcklkO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIShhd2FpdCB0aGlzLnJ1bnRpbWUucm91dGVzLmhhbmRsZVVwZ3JhZGUocmVxdWVzdCwgc29ja2V0LCBoZWFkKSkpIHNvY2tldC5kZXN0cm95KCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VydmljZU5hbWUocmVxOiBSZXF1ZXN0KTogc3RyaW5nIHtcbiAgcmV0dXJuIGxha2Vib3hTZXJ2aWNlQWN0aW9uU2NoZW1hLnBhcnNlKHsgbmFtZTogcmVxLnBhcmFtcy5uYW1lIH0pLm5hbWU7XG59XG5cbmZ1bmN0aW9uIG9taXRMb2c8VCBleHRlbmRzIHsgbG9nPzogc3RyaW5nIH0+KHsgbG9nOiBfbG9nLCAuLi52YWx1ZSB9OiBUKTogT21pdDxULCBcImxvZ1wiPiB7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gaGVhZGVyVmFsdWUodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWVbMF0gOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gaXNMb29wYmFja0hvc3QoaG9zdDogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghaG9zdCkgcmV0dXJuIGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0IGhvc3RuYW1lID0gbmV3IFVSTChgaHR0cDovLyR7aG9zdH1gKS5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBob3N0bmFtZSA9PT0gXCJsb2NhbGhvc3RcIiB8fCBob3N0bmFtZSA9PT0gXCIxMjcuMC4wLjFcIiB8fCBob3N0bmFtZSA9PT0gXCJbOjoxXVwiO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVVwZ3JhZGVJZGVudGl0eUdhdGUocGx1Z2luOiB1bmtub3duKTogVXBncmFkZUlkZW50aXR5R2F0ZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGV4cG9ydHMgPSAocGx1Z2luIGFzIHsgZXhwb3J0cz86ICgpID0+IHVua25vd24gfSB8IHVuZGVmaW5lZCk/LmV4cG9ydHM/LigpO1xuICBpZiAoXG4gICAgdHlwZW9mIChleHBvcnRzIGFzIFVwZ3JhZGVJZGVudGl0eUdhdGUgfCB1bmRlZmluZWQpPy5pc1Byb3RlY3RlZEhvc3QgIT09IFwiZnVuY3Rpb25cIiB8fFxuICAgIHR5cGVvZiAoZXhwb3J0cyBhcyBVcGdyYWRlSWRlbnRpdHlHYXRlIHwgdW5kZWZpbmVkKT8uc2Vzc2lvbiAhPT0gXCJmdW5jdGlvblwiXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGV4cG9ydHMgYXMgVXBncmFkZUlkZW50aXR5R2F0ZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdEhlYWRlcnMocmVxdWVzdDogSW5jb21pbmdNZXNzYWdlKTogSGVhZGVycyB7XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVxdWVzdC5oZWFkZXJzKSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSBoZWFkZXJzLmFwcGVuZChuYW1lLCBpdGVtKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlYWRlcnMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhlYWRlcnM7XG59XG5cbi8qKiBBcHBLaXQgcGx1Z2luIGZhY3RvcnkgZm9yIHtAbGluayBBcHBLaXRMYWtlYm94UGx1Z2lufS4gKi9cbmV4cG9ydCBjb25zdCBsYWtlYm94ID0gdG9QbHVnaW4oQXBwS2l0TGFrZWJveFBsdWdpbik7XG4iXX0=
|
|
330
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLFFBQVEsRUFDUixRQUFRLEdBR1QsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsbUJBQW1CLEdBSXBCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUNMLGtCQUFrQixFQUVsQixzQkFBc0IsRUFDdEIsMkJBQTJCLEVBQzNCLE9BQU8sRUFDUCxPQUFPLEVBQ1AsZ0JBQWdCLEVBQ2hCLDBCQUEwQixHQUMzQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsbUNBQW1DLEVBQ25DLG9DQUFvQyxFQUNwQyx5QkFBeUIsRUFDekIsb0NBQW9DLEVBQ3BDLG1CQUFtQixFQUNuQixjQUFjLEVBQ2QsMkJBQTJCLEVBQzNCLDBCQUEwQixFQUMxQiwrQkFBK0IsRUFDL0Isa0NBQWtDLEVBQ2xDLG1DQUFtQyxFQUNuQyxrQ0FBa0MsRUFDbEMsaUNBQWlDLEdBTWxDLE1BQU0sMkJBQTJCLENBQUM7QUFHbkMsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRSxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLDBCQUEwQixHQUUzQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsY0FBYyxFQUEwQixNQUFNLGNBQWMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFZbEQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FB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S0FBSyxNQUFNLElBQUksSUFBSSxLQUFLO2dCQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZELENBQUM7YUFBTSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCw2REFBNkQ7QUFDN0QsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbmNvbWluZ0h0dHBIZWFkZXJzLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlciBhcyBIdHRwU2VydmVyIH0gZnJvbSBcIm5vZGU6aHR0cFwiO1xuaW1wb3J0IHR5cGUgeyBTb2NrZXQgfSBmcm9tIFwibm9kZTpuZXRcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZVdvcmtzcGFjZUNsaWVudCxcbiAgbGFrZWJhc2UsXG4gIHRvUGx1Z2luLFxuICB0eXBlIElBcHBSb3V0ZXIsXG4gIHR5cGUgUGx1Z2luTWFuaWZlc3QsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGV4ZWN1dGVGcm9tUmVnaXN0cnksXG4gIHR5cGUgVG9vbGtpdEVudHJ5LFxuICB0eXBlIFRvb2xraXRPcHRpb25zLFxuICB0eXBlIFRvb2xSZWdpc3RyeSxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQge1xuICBUb29sUmVnaXN0cnlQbHVnaW4sXG4gIHR5cGUgQWdlbnRUb29sRXhlY3V0aW9uQ29udGV4dCxcbiAgdHJ5R2V0RXhlY3V0aW9uQ29udGV4dCxcbiAgY2FwdHVyZVNlcnZpY2VQcmluY2lwYWxQb29sLFxuICByZXF1aXJlLFxuICBlbnRyaWVzLFxuICBkZWZpbmVPcGVyYXRpb25zLFxuICB0b29sUmVnaXN0cnlGcm9tT3BlcmF0aW9ucyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBVU0VSX0lEX0hFQURFUiwgVVNFUl9FTUFJTF9IRUFERVIgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgY3JlYXRlTGFrZWJveFNlcnZpY2VPcGVyYXRpb25TY2hlbWEsXG4gIGV4ZWN1dGVMYWtlYm94Q29tbWFuZE9wZXJhdGlvblNjaGVtYSxcbiAgZ2V0TGFrZWJveE9wZXJhdGlvblNjaGVtYSxcbiAgZ2V0TGFrZWJveFNlcnZpY2VMb2dzT3BlcmF0aW9uU2NoZW1hLFxuICBMQUtFQk9YX1BMVUdJTl9OQU1FLFxuICBMQUtFQk9YX1JPVVRFUyxcbiAgbGFrZWJveENvbW1hbmRSZXF1ZXN0U2NoZW1hLFxuICBsYWtlYm94U2VydmljZUFjdGlvblNjaGVtYSxcbiAgbGFrZWJveFNlcnZpY2VMb2dzUmVxdWVzdFNjaGVtYSxcbiAgbGlzdExha2Vib3hTZXJ2aWNlc09wZXJhdGlvblNjaGVtYSxcbiAgcmVtb3ZlTGFrZWJveFNlcnZpY2VPcGVyYXRpb25TY2hlbWEsXG4gIHN0YXJ0TGFrZWJveFNlcnZpY2VPcGVyYXRpb25TY2hlbWEsXG4gIHN0b3BMYWtlYm94U2VydmljZU9wZXJhdGlvblNjaGVtYSxcbiAgdHlwZSBDcmVhdGVMYWtlYm94U2VydmljZVJlcXVlc3QsXG4gIHR5cGUgTGFrZWJveENsaWVudENvbmZpZ0lucHV0LFxuICB0eXBlIExha2Vib3hDb21tYW5kUmVxdWVzdCxcbiAgdHlwZSBMYWtlYm94U2VydmljZSxcbiAgdHlwZSBMYWtlYm94U2VydmljZUxvZ3NSZXF1ZXN0LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbGFrZWJveFwiO1xuaW1wb3J0IHR5cGUgeyBBcHBsaWNhdGlvbiwgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tIFwiZXhwcmVzc1wiO1xuaW1wb3J0IHR5cGUgeyBKU09OU2NoZW1hNyB9IGZyb20gXCJqc29uLXNjaGVtYVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IExha2Vib3hSZXNvdXJjZVJlZ2lzdHJ5IH0gZnJvbSBcIi4vX3Jlc291cmNlLXJlZ2lzdHJ5LnRzXCI7XG5pbXBvcnQgeyBMYWtlYm94U2VydmljZVNuYXBzaG90cyB9IGZyb20gXCIuL19zZXJ2aWNlLXNuYXBzaG90cy50c1wiO1xuaW1wb3J0IHtcbiAgTGFrZWJveFBsdWdpbkNvbmZpZ1NjaGVtYSxcbiAgcmVzb2x2ZUxha2Vib3hQbHVnaW5Db25maWcsXG4gIHR5cGUgTGFrZWJveFBsdWdpbkNvbmZpZyxcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBMYWtlYm94UnVudGltZSwgdHlwZSBMYWtlYm94TGVnYWN5UG9vbCB9IGZyb20gXCIuL3J1bnRpbWUudHNcIjtcbmltcG9ydCB7IHdpdGhTZXJ2aWNlT3JpZ2luIH0gZnJvbSBcIi4vc2VydmljZXMudHNcIjtcblxuaW50ZXJmYWNlIFNlcnZlckV4dGVuc2lvbiB7XG4gIGFkZEV4dGVuc2lvbihmbjogKGFwcGxpY2F0aW9uOiBBcHBsaWNhdGlvbikgPT4gdm9pZCk6IHZvaWQ7XG4gIGdldFNlcnZlcigpOiBIdHRwU2VydmVyO1xufVxuXG5pbnRlcmZhY2UgVXBncmFkZUlkZW50aXR5R2F0ZSB7XG4gIGlzUHJvdGVjdGVkSG9zdChoZWFkZXJzOiBIZWFkZXJzKTogYm9vbGVhbjtcbiAgc2Vzc2lvbihoZWFkZXJzOiBIZWFkZXJzKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+O1xufVxuXG5jb25zdCBDT05GSUdfU0NIRU1BID0gei50b0pTT05TY2hlbWEoTGFrZWJveFBsdWdpbkNvbmZpZ1NjaGVtYSkgYXMgSlNPTlNjaGVtYTc7XG5cbi8qKlxuICogQXBwS2l0IHBsdWdpbiBmb3IgdGhlIHNpbmdsZSBhcHAgTGFrZWJveC5cbiAqXG4gKiBSZWdpc3RlcnMgdXNlci1zY29wZWQgUkVTVCByb3V0ZXMsIGFnZW50IHRvb2xzLCB0aGUgZGV0ZXJtaW5pc3RpYyBzZXJ2aWNlXG4gKiBwcm94eSwgYW5kIFdlYlNvY2tldCB1cGdyYWRlIGhhbmRsaW5nLiBFdmVyeSBMYWtlYm94IGxpZmVjeWNsZSBjYWxsIHVzZXMgdGhlXG4gKiBhcHAgc2VydmljZSBwcmluY2lwYWw7IHRoZSBhdXRoZW50aWNhdGVkIHJlcXVlc3QgaWRlbnRpdHkgb25seSBzZWxlY3RzIHRoZVxuICogdXNlcidzIExha2Vib3ggYWNjb3VudCBhbmQgYXV0aG9yaXplcyB0aGF0IHVzZXIncyByb3V0ZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBBcHBLaXRMYWtlYm94UGx1Z2luIGV4dGVuZHMgVG9vbFJlZ2lzdHJ5UGx1Z2luPExha2Vib3hQbHVnaW5Db25maWc+IHtcbiAgc3RhdGljIG1hbmlmZXN0ID0ge1xuICAgIG5hbWU6IExBS0VCT1hfUExVR0lOX05BTUUsXG4gICAgZGlzcGxheU5hbWU6IFwiTGFrZWJveFwiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJSdW5zIHBlci11c2VyIHNlcnZpY2VzLCB0ZXJtaW5hbHMsIGRlc2t0b3BzLCBhbmQgY29tbWFuZHMgaW4gb25lIGxhemlseSBjcmVhdGVkIERhdGFicmlja3MgTGFrZWJveC5cIixcbiAgICBzdGFiaWxpdHk6IFwiYmV0YVwiLFxuICAgIHJlc291cmNlczogeyByZXF1aXJlZDogW10sIG9wdGlvbmFsOiBbXSB9LFxuICAgIGNvbmZpZzogeyBzY2hlbWE6IENPTkZJR19TQ0hFTUEgfSxcbiAgfSBzYXRpc2ZpZXMgUGx1Z2luTWFuaWZlc3Q8dHlwZW9mIExBS0VCT1hfUExVR0lOX05BTUU+O1xuXG4gIHJlYWRvbmx5IHJ1bnRpbWU6IExha2Vib3hSdW50aW1lO1xuICBwcml2YXRlIG1vdW50ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBodHRwU2VydmVyPzogSHR0cFNlcnZlcjtcbiAgcHJpdmF0ZSB1cGdyYWRlQXR0YWNoVGltZXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSB1cGdyYWRlSWRlbnRpdHlHYXRlPzogVXBncmFkZUlkZW50aXR5R2F0ZTtcbiAgcHJpdmF0ZSByZWFkb25seSB1cGdyYWRlSGFuZGxlciA9IChyZXF1ZXN0OiBJbmNvbWluZ01lc3NhZ2UsIHNvY2tldDogU29ja2V0LCBoZWFkOiBCdWZmZXIpID0+IHtcbiAgICB2b2lkIHRoaXMuaGFuZGxlVXBncmFkZShyZXF1ZXN0LCBzb2NrZXQsIGhlYWQpO1xuICB9O1xuXG4gIC8qKiBDcmVhdGVzIGEgcGx1Z2luIHdpdGggYSBzdXBwbGllZCBzaGFyZWQgcnVudGltZSBvciBvbmUgZnJvbSByZXNvbHZlZCBjb25maWcuICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogTGFrZWJveFBsdWdpbkNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcbiAgICB0aGlzLnJ1bnRpbWUgPSBjb25maWcucnVudGltZSA/PyBuZXcgTGFrZWJveFJ1bnRpbWUocmVzb2x2ZUxha2Vib3hQbHVnaW5Db25maWcoY29uZmlnKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHRvb2xSZWdpc3RyeSgpOiBUb29sUmVnaXN0cnkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVRvb2xSZWdpc3RyeSgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc2V0dXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jb250ZXh0Py5vbkxpZmVjeWNsZShcInNldHVwOmNvbXBsZXRlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHBvb2wgPSBjYXB0dXJlU2VydmljZVByaW5jaXBhbFBvb2woXG4gICAgICAgIHJlcXVpcmUodGhpcy5jb250ZXh0LCBsYWtlYmFzZSwgXCJhcHBraXQtbGFrZWJveFwiKS5leHBvcnRzKCkucG9vbCxcbiAgICAgICk7XG4gICAgICB0aGlzLnJ1bnRpbWUuaW5pdGlhbGl6ZShcbiAgICAgICAgY3JlYXRlV29ya3NwYWNlQ2xpZW50KCkuY29uZmlnLFxuICAgICAgICAoaGVhZGVycykgPT4gdGhpcy5yZXF1ZXN0SWRlbnRpdHkoaGVhZGVycyksXG4gICAgICAgIG5ldyBMYWtlYm94U2VydmljZVNuYXBzaG90cygpLFxuICAgICAgICBuZXcgTGFrZWJveFJlc291cmNlUmVnaXN0cnkodGhpcy5ydW50aW1lLmNvbmZpZy5hcHBsaWNhdGlvbiwgcG9vbCksXG4gICAgICApO1xuICAgICAgdm9pZCB0aGlzLnJ1bnRpbWUuY2xlYW51cExlZ2FjeShwb29sIGFzIExha2Vib3hMZWdhY3lQb29sKTtcbiAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMuY29udGV4dD8uZ2V0UGx1Z2lucygpLmdldChcInNlcnZlclwiKSBhcyBTZXJ2ZXJFeHRlbnNpb24gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIXNlcnZlciB8fCB0aGlzLm1vdW50ZWQpIHJldHVybjtcbiAgICAgIHRoaXMudXBncmFkZUlkZW50aXR5R2F0ZSA9IHJlc29sdmVVcGdyYWRlSWRlbnRpdHlHYXRlKFxuICAgICAgICB0aGlzLmNvbnRleHQ/LmdldFBsdWdpbnMoKS5nZXQoXCJhdXRoR2F0ZVwiKSxcbiAgICAgICk7XG4gICAgICBzZXJ2ZXIuYWRkRXh0ZW5zaW9uKChhcHBsaWNhdGlvbikgPT4gYXBwbGljYXRpb24udXNlKHRoaXMucnVudGltZS5yb3V0ZXMubWlkZGxld2FyZSgpKSk7XG4gICAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5hdHRhY2hVcGdyYWRlSGFuZGxlcihzZXJ2ZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgaW5qZWN0Um91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIGNvbnN0IGpzb24gPSAoXG4gICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIgfCBcInBvc3RcIiB8IFwiZGVsZXRlXCIsXG4gICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICBoYW5kbGVyOiAoaWRlbnRpdHk6IHN0cmluZywgcmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPHVua25vd24+LFxuICAgICkgPT5cbiAgICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgICAgcmVzLmpzb24oYXdhaXQgaGFuZGxlcih0aGlzLnJlc29sdmVVc2VySWQocmVxKSwgcmVxKSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICBqc29uKFwic3RhdHVzXCIsIFwiZ2V0XCIsIExBS0VCT1hfUk9VVEVTLnN0YXR1cywgKGlkZW50aXR5KSA9PiB0aGlzLnJ1bnRpbWUuc3VtbWFyeShpZGVudGl0eSkpO1xuICAgIGpzb24oXCJzdGFydFwiLCBcInBvc3RcIiwgTEFLRUJPWF9ST1VURVMuc3RhcnQsIGFzeW5jIChpZGVudGl0eSkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5ydW50aW1lLnN0YXJ0KCk7XG4gICAgICByZXR1cm4gdGhpcy5ydW50aW1lLnN1bW1hcnkoaWRlbnRpdHkpO1xuICAgIH0pO1xuICAgIGpzb24oXCJzdG9wXCIsIFwicG9zdFwiLCBMQUtFQk9YX1JPVVRFUy5zdG9wLCBhc3luYyAoaWRlbnRpdHkpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMucnVudGltZS5zdG9wKCk7XG4gICAgICByZXR1cm4gdGhpcy5ydW50aW1lLnN1bW1hcnkoaWRlbnRpdHkpO1xuICAgIH0pO1xuICAgIGpzb24oXG4gICAgICBcImV4ZWN1dGVDb21tYW5kXCIsXG4gICAgICBcInBvc3RcIixcbiAgICAgIExBS0VCT1hfUk9VVEVTLmNvbW1hbmRzLFxuICAgICAgKGlkZW50aXR5LCByZXEpID0+XG4gICAgICAgIHRoaXMucnVudGltZS5leGVjdXRlKGlkZW50aXR5LCBsYWtlYm94Q29tbWFuZFJlcXVlc3RTY2hlbWEucGFyc2UocmVxLmJvZHkgPz8ge30pKS5yZXN1bHQsXG4gICAgKTtcbiAgICBqc29uKFwic2VydmljZXNcIiwgXCJnZXRcIiwgTEFLRUJPWF9ST1VURVMuc2VydmljZXMsIGFzeW5jIChpZGVudGl0eSkgPT4gKHtcbiAgICAgIHNlcnZpY2VzOiBhd2FpdCB0aGlzLnJ1bnRpbWUubGlzdFNlcnZpY2VzKGlkZW50aXR5KSxcbiAgICB9KSk7XG4gICAganNvbihcImNyZWF0ZVNlcnZpY2VcIiwgXCJwb3N0XCIsIExBS0VCT1hfUk9VVEVTLnNlcnZpY2VzLCBhc3luYyAoaWRlbnRpdHksIHJlcSkgPT4gKHtcbiAgICAgIHNlcnZpY2U6IGF3YWl0IHRoaXMucnVudGltZS5jcmVhdGVTZXJ2aWNlKGlkZW50aXR5LCByZXEuYm9keSA/PyB7fSksXG4gICAgfSkpO1xuICAgIGpzb24oXCJzdGFydFNlcnZpY2VcIiwgXCJwb3N0XCIsIExBS0VCT1hfUk9VVEVTLnNlcnZpY2VTdGFydCwgYXN5bmMgKGlkZW50aXR5LCByZXEpID0+ICh7XG4gICAgICBzZXJ2aWNlOiBhd2FpdCB0aGlzLnJ1bnRpbWUuc3RhcnRTZXJ2aWNlKGlkZW50aXR5LCBzZXJ2aWNlTmFtZShyZXEpKSxcbiAgICB9KSk7XG4gICAganNvbihcInN0b3BTZXJ2aWNlXCIsIFwicG9zdFwiLCBMQUtFQk9YX1JPVVRFUy5zZXJ2aWNlU3RvcCwgYXN5bmMgKGlkZW50aXR5LCByZXEpID0+ICh7XG4gICAgICBzZXJ2aWNlOiBhd2FpdCB0aGlzLnJ1bnRpbWUuc3RvcFNlcnZpY2UoaWRlbnRpdHksIHNlcnZpY2VOYW1lKHJlcSkpLFxuICAgIH0pKTtcbiAgICBqc29uKFwicmVtb3ZlU2VydmljZVwiLCBcImRlbGV0ZVwiLCBMQUtFQk9YX1JPVVRFUy5zZXJ2aWNlLCBhc3luYyAoaWRlbnRpdHksIHJlcSkgPT4gKHtcbiAgICAgIHJlbW92ZWQ6IGF3YWl0IHRoaXMucnVudGltZS5yZW1vdmVTZXJ2aWNlKGlkZW50aXR5LCBzZXJ2aWNlTmFtZShyZXEpKSxcbiAgICB9KSk7XG4gICAganNvbihcInNlcnZpY2VMb2dzXCIsIFwiZ2V0XCIsIExBS0VCT1hfUk9VVEVTLnNlcnZpY2VMb2dzLCAoaWRlbnRpdHksIHJlcSkgPT5cbiAgICAgIHRoaXMucnVudGltZS5zZXJ2aWNlTG9ncyhcbiAgICAgICAgaWRlbnRpdHksXG4gICAgICAgIGxha2Vib3hTZXJ2aWNlTG9nc1JlcXVlc3RTY2hlbWEucGFyc2Uoe1xuICAgICAgICAgIG5hbWU6IHJlcS5wYXJhbXMubmFtZSxcbiAgICAgICAgICBtYXhMaW5lczogcmVxLnF1ZXJ5Lm1heExpbmVzLFxuICAgICAgICAgIG1heENoYXJzOiByZXEucXVlcnkubWF4Q2hhcnMsXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApO1xuICAgIGpzb24oXCJtZXRyaWNzXCIsIFwiZ2V0XCIsIExBS0VCT1hfUk9VVEVTLm1ldHJpY3MsICgpID0+IHRoaXMucnVudGltZS5tZXRyaWNzUmVzcG9uc2UoKSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwibWV0cmljc1N0cmVhbVwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogTEFLRUJPWF9ST1VURVMubWV0cmljc1N0cmVhbSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4gdGhpcy5zdHJlYW1NZXRyaWNzKHJlcSwgcmVzKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGJyb3dzZXItc2FmZSByb3V0ZSBkZWZhdWx0cyBwdWJsaXNoZWQgdGhyb3VnaCBBcHBLaXQgY2xpZW50IGNvbmZpZy4gKi9cbiAgY2xpZW50Q29uZmlnKCk6IExha2Vib3hDbGllbnRDb25maWdJbnB1dCB7XG4gICAgcmV0dXJuIHsgcm91dGVQcmVmaXg6IHRoaXMucnVudGltZS5jb25maWcucm91dGVQcmVmaXggfTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHNlbGVjdGVkIEFwcEtpdCB0b29sa2l0IGVudHJpZXMgYmFja2VkIGJ5IHRoaXMgcGx1Z2luJ3MgYWdlbnQgdG9vbHMuICovXG4gIHRvb2xraXQob3B0aW9ucz86IFRvb2xraXRPcHRpb25zKTogUmVjb3JkPHN0cmluZywgVG9vbGtpdEVudHJ5PiB7XG4gICAgcmV0dXJuIGVudHJpZXMoTEFLRUJPWF9QTFVHSU5fTkFNRSwgdGhpcy5nZXRBZ2VudFRvb2xzKCksIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBwcmVmaXg6IG9wdGlvbnM/LnByZWZpeCA/PyBcIlwiLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEV4ZWN1dGVzIG9uZSByZWdpc3RlcmVkIGFnZW50IHRvb2wgZm9yIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBpZGVudGl0eS4gKi9cbiAgb3ZlcnJpZGUgZXhlY3V0ZUFnZW50VG9vbChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgYXJnczogdW5rbm93bixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICBjb250ZXh0PzogQWdlbnRUb29sRXhlY3V0aW9uQ29udGV4dCxcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGV4ZWN1dGVGcm9tUmVnaXN0cnkoXG4gICAgICB0aGlzLmNyZWF0ZVRvb2xSZWdpc3RyeShjb250ZXh0Py5yZXNvdXJjZUlkLCBjb250ZXh0Py5vcmlnaW4pLFxuICAgICAgbmFtZSxcbiAgICAgIGFyZ3MsXG4gICAgICBzaWduYWwsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSB0eXBlZCBzaWJsaW5nLXBsdWdpbiBBUEkuICovXG4gIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1bW1hcnk6IChpZGVudGl0eTogc3RyaW5nKSA9PiB0aGlzLnJ1bnRpbWUuc3VtbWFyeShpZGVudGl0eSksXG4gICAgICBzdGFydDogKCkgPT4gdGhpcy5ydW50aW1lLnN0YXJ0KCksXG4gICAgICBzdG9wOiAoKSA9PiB0aGlzLnJ1bnRpbWUuc3RvcCgpLFxuICAgICAgZGVsZXRlOiAoKSA9PiB0aGlzLnJ1bnRpbWUuZGVsZXRlKCksXG4gICAgICBleGVjdXRlQ29tbWFuZDogKGlkZW50aXR5OiBzdHJpbmcsIGlucHV0OiBMYWtlYm94Q29tbWFuZFJlcXVlc3QpID0+XG4gICAgICAgIHRoaXMucnVudGltZS5leGVjdXRlKGlkZW50aXR5LCBpbnB1dCkucmVzdWx0LFxuICAgICAgbGlzdFNlcnZpY2VzOiAoaWRlbnRpdHk6IHN0cmluZykgPT4gdGhpcy5ydW50aW1lLmxpc3RTZXJ2aWNlcyhpZGVudGl0eSksXG4gICAgICBjcmVhdGVTZXJ2aWNlOiAoaWRlbnRpdHk6IHN0cmluZywgaW5wdXQ6IENyZWF0ZUxha2Vib3hTZXJ2aWNlUmVxdWVzdCkgPT5cbiAgICAgICAgdGhpcy5ydW50aW1lLmNyZWF0ZVNlcnZpY2UoaWRlbnRpdHksIGlucHV0KSxcbiAgICAgIHN0YXJ0U2VydmljZTogKGlkZW50aXR5OiBzdHJpbmcsIG5hbWU6IHN0cmluZykgPT4gdGhpcy5ydW50aW1lLnN0YXJ0U2VydmljZShpZGVudGl0eSwgbmFtZSksXG4gICAgICBzdG9wU2VydmljZTogKGlkZW50aXR5OiBzdHJpbmcsIG5hbWU6IHN0cmluZykgPT4gdGhpcy5ydW50aW1lLnN0b3BTZXJ2aWNlKGlkZW50aXR5LCBuYW1lKSxcbiAgICAgIHJlbW92ZVNlcnZpY2U6IChpZGVudGl0eTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpID0+IHRoaXMucnVudGltZS5yZW1vdmVTZXJ2aWNlKGlkZW50aXR5LCBuYW1lKSxcbiAgICAgIHNlcnZpY2VMb2dzOiAoaWRlbnRpdHk6IHN0cmluZywgaW5wdXQ6IExha2Vib3hTZXJ2aWNlTG9nc1JlcXVlc3QpID0+XG4gICAgICAgIHRoaXMucnVudGltZS5zZXJ2aWNlTG9ncyhpZGVudGl0eSwgaW5wdXQpLFxuICAgICAgb3BlcmF0aW9uczogKGlkZW50aXR5Pzogc3RyaW5nKSA9PiB0aGlzLm9wZXJhdGlvbnMoaWRlbnRpdHkpLFxuICAgICAgdG9vbGtpdDogKG9wdGlvbnM/OiBUb29sa2l0T3B0aW9ucykgPT4gdGhpcy50b29sa2l0KG9wdGlvbnMpLFxuICAgIH07XG4gIH1cblxuICAvKiogQ2FuY2VscyBpbi1mbGlnaHQgd29yayBiZWZvcmUgc2h1dGRvd24gdGVhcnMgZG93biByZXNvdXJjZXMuICovXG4gIG92ZXJyaWRlIGFib3J0QWN0aXZlT3BlcmF0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnJ1bnRpbWUuYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk7XG4gIH1cblxuICAvKiogRGV0YWNoZXMgV2ViU29ja2V0IGhhbmRsaW5nIGFuZCBjbG9zZXMgdGhlIHNoYXJlZCBydW50aW1lLiAqL1xuICBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy51cGdyYWRlQXR0YWNoVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnVwZ3JhZGVBdHRhY2hUaW1lcik7XG4gICAgdGhpcy51cGdyYWRlQXR0YWNoVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5odHRwU2VydmVyPy5vZmYoXCJ1cGdyYWRlXCIsIHRoaXMudXBncmFkZUhhbmRsZXIpO1xuICAgIHRoaXMuaHR0cFNlcnZlciA9IHVuZGVmaW5lZDtcbiAgICBhd2FpdCB0aGlzLnJ1bnRpbWUuY2xvc2UoKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBab2Qtb3duZWQgb3BlcmF0aW9uIGNvbnRyYWN0cyB1c2VkIGJ5IGFnZW50IHRvb2xzLiAqL1xuICBvcGVyYXRpb25zKGlkZW50aXR5Pzogc3RyaW5nLCBvcmlnaW4/OiBzdHJpbmcpIHtcbiAgICBjb25zdCB1c2VyID0gKCkgPT4gaWRlbnRpdHkgPz8gdGhpcy5leGVjdXRpb25JZGVudGl0eSgpO1xuICAgIGNvbnN0IHByZXNlbnRTZXJ2aWNlID0gKHZhbHVlOiBMYWtlYm94U2VydmljZSkgPT4gb21pdExvZyh3aXRoU2VydmljZU9yaWdpbih2YWx1ZSwgb3JpZ2luKSk7XG4gICAgcmV0dXJuIGRlZmluZU9wZXJhdGlvbnMoe1xuICAgICAgZ2V0X2xha2Vib3g6IHtcbiAgICAgICAgc2NoZW1hOiBnZXRMYWtlYm94T3BlcmF0aW9uU2NoZW1hLFxuICAgICAgICBleGVjdXRlOiBhc3luYyAoX2lucHV0LCBzaWduYWwpID0+IHtcbiAgICAgICAgICBjb25zdCBzdW1tYXJ5ID0gYXdhaXQgdGhpcy5ydW50aW1lLnN1bW1hcnkodXNlcigpLCBzaWduYWwpO1xuICAgICAgICAgIHJldHVybiB7IC4uLnN1bW1hcnksIHNlcnZpY2VzOiBzdW1tYXJ5LnNlcnZpY2VzLm1hcChwcmVzZW50U2VydmljZSkgfTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBleGVjdXRlX2xha2Vib3hfY29tbWFuZDoge1xuICAgICAgICBzY2hlbWE6IGV4ZWN1dGVMYWtlYm94Q29tbWFuZE9wZXJhdGlvblNjaGVtYSxcbiAgICAgICAgZXhlY3V0ZTogKGlucHV0LCBzaWduYWwpID0+IHRoaXMucnVudGltZS5leGVjdXRlKHVzZXIoKSwgaW5wdXQsIHNpZ25hbCkucmVzdWx0LFxuICAgICAgfSxcbiAgICAgIGxpc3RfbGFrZWJveF9zZXJ2aWNlczoge1xuICAgICAgICBzY2hlbWE6IGxpc3RMYWtlYm94U2VydmljZXNPcGVyYXRpb25TY2hlbWEsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChfaW5wdXQsIHNpZ25hbCkgPT4gKHtcbiAgICAgICAgICBzZXJ2aWNlczogKGF3YWl0IHRoaXMucnVudGltZS5saXN0U2VydmljZXModXNlcigpLCBzaWduYWwpKS5tYXAocHJlc2VudFNlcnZpY2UpLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgICBjcmVhdGVfbGFrZWJveF9zZXJ2aWNlOiB7XG4gICAgICAgIHNjaGVtYTogY3JlYXRlTGFrZWJveFNlcnZpY2VPcGVyYXRpb25TY2hlbWEsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dCwgc2lnbmFsKSA9PiAoe1xuICAgICAgICAgIHNlcnZpY2U6IHByZXNlbnRTZXJ2aWNlKGF3YWl0IHRoaXMucnVudGltZS5jcmVhdGVTZXJ2aWNlKHVzZXIoKSwgaW5wdXQsIHNpZ25hbCkpLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgICBzdGFydF9sYWtlYm94X3NlcnZpY2U6IHtcbiAgICAgICAgc2NoZW1hOiBzdGFydExha2Vib3hTZXJ2aWNlT3BlcmF0aW9uU2NoZW1hLFxuICAgICAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQsIHNpZ25hbCkgPT4gKHtcbiAgICAgICAgICBzZXJ2aWNlOiBwcmVzZW50U2VydmljZShhd2FpdCB0aGlzLnJ1bnRpbWUuc3RhcnRTZXJ2aWNlKHVzZXIoKSwgaW5wdXQubmFtZSwgc2lnbmFsKSksXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICAgIHN0b3BfbGFrZWJveF9zZXJ2aWNlOiB7XG4gICAgICAgIHNjaGVtYTogc3RvcExha2Vib3hTZXJ2aWNlT3BlcmF0aW9uU2NoZW1hLFxuICAgICAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQsIHNpZ25hbCkgPT4gKHtcbiAgICAgICAgICBzZXJ2aWNlOiBwcmVzZW50U2VydmljZShhd2FpdCB0aGlzLnJ1bnRpbWUuc3RvcFNlcnZpY2UodXNlcigpLCBpbnB1dC5uYW1lLCBzaWduYWwpKSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICAgcmVtb3ZlX2xha2Vib3hfc2VydmljZToge1xuICAgICAgICBzY2hlbWE6IHJlbW92ZUxha2Vib3hTZXJ2aWNlT3BlcmF0aW9uU2NoZW1hLFxuICAgICAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQsIHNpZ25hbCkgPT4gKHtcbiAgICAgICAgICByZW1vdmVkOiBhd2FpdCB0aGlzLnJ1bnRpbWUucmVtb3ZlU2VydmljZSh1c2VyKCksIGlucHV0Lm5hbWUsIHNpZ25hbCksXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICAgIGdldF9sYWtlYm94X3NlcnZpY2VfbG9nczoge1xuICAgICAgICBzY2hlbWE6IGdldExha2Vib3hTZXJ2aWNlTG9nc09wZXJhdGlvblNjaGVtYSxcbiAgICAgICAgZXhlY3V0ZTogKGlucHV0LCBzaWduYWwpID0+IHRoaXMucnVudGltZS5zZXJ2aWNlTG9ncyh1c2VyKCksIGlucHV0LCBzaWduYWwpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVG9vbFJlZ2lzdHJ5KGlkZW50aXR5Pzogc3RyaW5nLCBvcmlnaW4/OiBzdHJpbmcpOiBUb29sUmVnaXN0cnkge1xuICAgIHJldHVybiB0b29sUmVnaXN0cnlGcm9tT3BlcmF0aW9ucyh0aGlzLm9wZXJhdGlvbnMoaWRlbnRpdHksIG9yaWdpbikpO1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjdXRpb25JZGVudGl0eSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0cnlHZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgaWYgKCFjb250ZXh0KSB0aHJvdyBuZXcgRXJyb3IoXCJMYWtlYm94IHRvb2xzIHJlcXVpcmUgYW4gQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0XCIpO1xuICAgIHJldHVybiBcInVzZXJJZFwiIGluIGNvbnRleHQgPyBjb250ZXh0LnVzZXJJZCA6IGNvbnRleHQuc2VydmljZVVzZXJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyByb3V0ZSBpZGVudGl0eSB3aXRoIHRoZSBzYW1lIHJ1bGVzIGFzIFJFU1Q6IHRoZSBmb3J3YXJkZWQgdXNlcixcbiAgICogb3IgQXBwS2l0J3MgZGV2ZWxvcG1lbnQgdXNlciBmb3IgZGlyZWN0IGxvb3BiYWNrIG5hdmlnYXRpb24gb3V0c2lkZVxuICAgKiBwcm9kdWN0aW9uLiBFdmVyeXRoaW5nIGVsc2UgaXMgYW5vbnltb3VzIGFuZCBmYWlscyBjbG9zZWQuXG4gICAqL1xuICBwcml2YXRlIHJlcXVlc3RJZGVudGl0eShoZWFkZXJzOiBJbmNvbWluZ0h0dHBIZWFkZXJzKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmb3J3YXJkZWQgPSBoZWFkZXJWYWx1ZShoZWFkZXJzW1VTRVJfSURfSEVBREVSXSk/LnRyaW0oKTtcbiAgICBpZiAoZm9yd2FyZGVkKSByZXR1cm4gZm9yd2FyZGVkO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJkZXZlbG9wbWVudFwiIHx8ICFpc0xvb3BiYWNrSG9zdChoZWFkZXJWYWx1ZShoZWFkZXJzLmhvc3QpKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVVc2VySWQoe1xuICAgICAgICBoZWFkZXI6IChuYW1lOiBzdHJpbmcpID0+IGhlYWRlclZhbHVlKGhlYWRlcnNbbmFtZS50b0xvd2VyQ2FzZSgpXSksXG4gICAgICB9IGFzIHVua25vd24gYXMgUmVxdWVzdCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3RyZWFtTWV0cmljcyhyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbml0aWFsID0gYXdhaXQgdGhpcy5ydW50aW1lLm1ldHJpY3NSZXNwb25zZSgpO1xuICAgIHJlcy5zdGF0dXNDb2RlID0gMjAwO1xuICAgIHJlcy5zZXRIZWFkZXIoXCJjb250ZW50LXR5cGVcIiwgXCJ0ZXh0L2V2ZW50LXN0cmVhbTsgY2hhcnNldD11dGYtOFwiKTtcbiAgICByZXMuc2V0SGVhZGVyKFwiY2FjaGUtY29udHJvbFwiLCBcIm5vLWNhY2hlLCBuby10cmFuc2Zvcm1cIik7XG4gICAgcmVzLnNldEhlYWRlcihcImNvbm5lY3Rpb25cIiwgXCJrZWVwLWFsaXZlXCIpO1xuICAgIHJlcy5zZXRIZWFkZXIoXCJ4LWFjY2VsLWJ1ZmZlcmluZ1wiLCBcIm5vXCIpO1xuICAgIHJlcy5mbHVzaEhlYWRlcnM/LigpO1xuICAgIHJlcy53cml0ZShgZGF0YTogJHtKU09OLnN0cmluZ2lmeShpbml0aWFsKX1cXG5cXG5gKTtcbiAgICBjb25zdCB1bnN1YnNjcmliZSA9IHRoaXMucnVudGltZS5zdWJzY3JpYmVNZXRyaWNzKChzbmFwc2hvdCkgPT4ge1xuICAgICAgcmVzLndyaXRlKGBkYXRhOiAke0pTT04uc3RyaW5naWZ5KHsgc3RhdHVzOiBcInJ1bm5pbmdcIiwgc2VyaWVzOiBbc25hcHNob3RdIH0pfVxcblxcbmApO1xuICAgIH0pO1xuICAgIHJlcS5vbmNlKFwiY2xvc2VcIiwgdW5zdWJzY3JpYmUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhdHRhY2hVcGdyYWRlSGFuZGxlcihzZXJ2ZXI6IFNlcnZlckV4dGVuc2lvbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmh0dHBTZXJ2ZXIgfHwgdGhpcy51cGdyYWRlQXR0YWNoVGltZXIpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgdGhpcy5odHRwU2VydmVyID0gc2VydmVyLmdldFNlcnZlcigpO1xuICAgICAgdGhpcy5odHRwU2VydmVyLm9uKFwidXBncmFkZVwiLCB0aGlzLnVwZ3JhZGVIYW5kbGVyKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMudXBncmFkZUF0dGFjaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudXBncmFkZUF0dGFjaFRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmF0dGFjaFVwZ3JhZGVIYW5kbGVyKHNlcnZlcik7XG4gICAgICB9LCAxMCk7XG4gICAgICB0aGlzLnVwZ3JhZGVBdHRhY2hUaW1lci51bnJlZj8uKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVVcGdyYWRlKFxuICAgIHJlcXVlc3Q6IEluY29taW5nTWVzc2FnZSxcbiAgICBzb2NrZXQ6IFNvY2tldCxcbiAgICBoZWFkOiBCdWZmZXIsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhdGggPSBuZXcgVVJMKHJlcXVlc3QudXJsID8/IFwiL1wiLCBcImh0dHA6Ly9sb2NhbGhvc3RcIikucGF0aG5hbWU7XG4gICAgaWYgKCF0aGlzLnJ1bnRpbWUucm91dGVzLmNhbkhhbmRsZVVwZ3JhZGUocGF0aCkpIHJldHVybjtcbiAgICBjb25zdCBnYXRlID0gdGhpcy51cGdyYWRlSWRlbnRpdHlHYXRlO1xuICAgIGlmIChnYXRlKSB7XG4gICAgICBjb25zdCBoZWFkZXJzID0gcmVxdWVzdEhlYWRlcnMocmVxdWVzdCk7XG4gICAgICBpZiAoZ2F0ZS5pc1Byb3RlY3RlZEhvc3QoaGVhZGVycykpIHtcbiAgICAgICAgZGVsZXRlIHJlcXVlc3QuaGVhZGVyc1tVU0VSX0lEX0hFQURFUl07XG4gICAgICAgIGRlbGV0ZSByZXF1ZXN0LmhlYWRlcnNbVVNFUl9FTUFJTF9IRUFERVJdO1xuICAgICAgICBjb25zdCB1c2VySWQgPSBhd2FpdCBnYXRlLnNlc3Npb24oaGVhZGVycyk7XG4gICAgICAgIGlmICghdXNlcklkKSB7XG4gICAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzW1VTRVJfSURfSEVBREVSXSA9IHVzZXJJZDtcbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzW1VTRVJfRU1BSUxfSEVBREVSXSA9IHVzZXJJZDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5ydW50aW1lLnJvdXRlcy5oYW5kbGVVcGdyYWRlKHJlcXVlc3QsIHNvY2tldCwgaGVhZCkpKSBzb2NrZXQuZGVzdHJveSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlcnZpY2VOYW1lKHJlcTogUmVxdWVzdCk6IHN0cmluZyB7XG4gIHJldHVybiBsYWtlYm94U2VydmljZUFjdGlvblNjaGVtYS5wYXJzZSh7IG5hbWU6IHJlcS5wYXJhbXMubmFtZSB9KS5uYW1lO1xufVxuXG5mdW5jdGlvbiBvbWl0TG9nPFQgZXh0ZW5kcyB7IGxvZz86IHN0cmluZyB9Pih7IGxvZzogX2xvZywgLi4udmFsdWUgfTogVCk6IE9taXQ8VCwgXCJsb2dcIj4ge1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGhlYWRlclZhbHVlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlWzBdIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzTG9vcGJhY2tIb3N0KGhvc3Q6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIWhvc3QpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBob3N0bmFtZSA9IG5ldyBVUkwoYGh0dHA6Ly8ke2hvc3R9YCkuaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gaG9zdG5hbWUgPT09IFwibG9jYWxob3N0XCIgfHwgaG9zdG5hbWUgPT09IFwiMTI3LjAuMC4xXCIgfHwgaG9zdG5hbWUgPT09IFwiWzo6MV1cIjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVVcGdyYWRlSWRlbnRpdHlHYXRlKHBsdWdpbjogdW5rbm93bik6IFVwZ3JhZGVJZGVudGl0eUdhdGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBleHBvcnRzID0gKHBsdWdpbiBhcyB7IGV4cG9ydHM/OiAoKSA9PiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5leHBvcnRzPy4oKTtcbiAgaWYgKFxuICAgIHR5cGVvZiAoZXhwb3J0cyBhcyBVcGdyYWRlSWRlbnRpdHlHYXRlIHwgdW5kZWZpbmVkKT8uaXNQcm90ZWN0ZWRIb3N0ICE9PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgKGV4cG9ydHMgYXMgVXBncmFkZUlkZW50aXR5R2F0ZSB8IHVuZGVmaW5lZCk/LnNlc3Npb24gIT09IFwiZnVuY3Rpb25cIlxuICApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBleHBvcnRzIGFzIFVwZ3JhZGVJZGVudGl0eUdhdGU7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RIZWFkZXJzKHJlcXVlc3Q6IEluY29taW5nTWVzc2FnZSk6IEhlYWRlcnMge1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlcXVlc3QuaGVhZGVycykpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkgaGVhZGVycy5hcHBlbmQobmFtZSwgaXRlbSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzLnNldChuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBoZWFkZXJzO1xufVxuXG4vKiogQXBwS2l0IHBsdWdpbiBmYWN0b3J5IGZvciB7QGxpbmsgQXBwS2l0TGFrZWJveFBsdWdpbn0uICovXG5leHBvcnQgY29uc3QgbGFrZWJveCA9IHRvUGx1Z2luKEFwcEtpdExha2Vib3hQbHVnaW4pO1xuIl19
|
package/lib/src/routes.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { IncomingHttpHeaders, IncomingMessage } from "node:http";
|
|
2
2
|
import { type Socket } from "node:net";
|
|
3
|
-
import type { SshSession } from "@dbx-tools/lakebox
|
|
3
|
+
import type { SshSession } from "@dbx-tools/lakebox";
|
|
4
4
|
import type { LakeboxUser } from "@dbx-tools/shared-lakebox";
|
|
5
5
|
import type { NextFunction, Request, Response } from "express";
|
|
6
6
|
import type { LakeboxServiceRoute } from "./services.ts";
|