__vite_ssr_exportName__("EnvironmentRpcUnavailableError", () => { try { return EnvironmentRpcUnavailableError } catch {} });
__vite_ssr_exportName__("EnvironmentRpcRequestObserver", () => { try { return EnvironmentRpcRequestObserver } catch {} });
__vite_ssr_exportName__("EnvironmentRpcSubscriptionObserver", () => { try { return EnvironmentRpcSubscriptionObserver } catch {} });
__vite_ssr_exportName__("isRpcClientError", () => { try { return isRpcClientError } catch {} });
__vite_ssr_exportName__("getInitialServerConfig", () => { try { return getInitialServerConfig } catch {} });
__vite_ssr_exportName__("RpcPermissionGuard", () => { try { return RpcPermissionGuard } catch {} });
__vite_ssr_exportName__("requestGuarded", () => { try { return requestGuarded } catch {} });
__vite_ssr_exportName__("runStreamGuarded", () => { try { return runStreamGuarded } catch {} });
__vite_ssr_exportName__("subscribeDynamic", () => { try { return subscribeDynamic } catch {} });
__vite_ssr_exportName__("subscribeDynamicWithSession", () => { try { return subscribeDynamicWithSession } catch {} });
__vite_ssr_exportName__("subscribe", () => { try { return subscribe } catch {} });
__vite_ssr_exportName__("request", () => { try { return request } catch {} });
__vite_ssr_exportName__("runStream", () => { try { return runStream } catch {} });
const __vite_ssr_import_0__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/contracts/src/index.ts", {"importedNames":["EnvironmentAuthorizationError","clientRpcRequiredScopes","authScopeRequiredResponse","ORCHESTRATION_V2_WS_METHODS","WS_METHODS"]});
const __vite_ssr_import_1__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Cause.js");
const __vite_ssr_import_2__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Context.js");
const __vite_ssr_import_3__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Duration.js");
const __vite_ssr_import_4__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Effect.js");
const __vite_ssr_import_5__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Option.js");
const __vite_ssr_import_6__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Schema.js");
const __vite_ssr_import_7__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Stream.js");
const __vite_ssr_import_8__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/SubscriptionRef.js");
const __vite_ssr_import_9__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/rpc/index.js", {"importedNames":["RpcClientError"]});
const __vite_ssr_import_10__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/connection/supervisor.ts");











class EnvironmentRpcUnavailableError extends __vite_ssr_import_6__.TaggedError()("EnvironmentRpcUnavailableError", {
	environmentId: __vite_ssr_import_6__.String,
	message: __vite_ssr_import_6__.String
}) {};
class EnvironmentRpcRequestObserver extends __vite_ssr_import_2__.Reference("@t3tools/client-runtime/rpc/EnvironmentRpcRequestObserver", { defaultValue: () => ({ observe: () => __vite_ssr_import_4__.succeed(__vite_ssr_import_4__.void) }) }) {};
class EnvironmentRpcSubscriptionObserver extends __vite_ssr_import_2__.Reference("@t3tools/client-runtime/rpc/EnvironmentRpcSubscriptionObserver", { defaultValue: () => ({ observe: () => __vite_ssr_import_4__.succeed(__vite_ssr_import_4__.void) }) }) {};
const isRpcClientError = __vite_ssr_import_6__.is(__vite_ssr_import_9__.RpcClientError.RpcClientError);
const isEnvironmentAuthorizationError = __vite_ssr_import_6__.is((0,__vite_ssr_import_0__.EnvironmentAuthorizationError));
const MAX_EXPECTED_FAILURE_RETRY_DELAY_MS = 3e4;
const currentSession = __vite_ssr_import_4__.fn("EnvironmentRpc.currentSession")(function* () {
	const supervisor = yield* __vite_ssr_import_10__.EnvironmentSupervisor;
	return yield* __vite_ssr_import_8__.get(supervisor.session).pipe(__vite_ssr_import_4__.flatMap(__vite_ssr_import_5__.match({
		onNone: () => __vite_ssr_import_4__.fail(new EnvironmentRpcUnavailableError({
			environmentId: supervisor.target.environmentId,
			message: `${supervisor.target.label} is not connected.`
		})),
		onSome: __vite_ssr_import_4__.succeed
	})));
});
const getInitialServerConfig = __vite_ssr_import_4__.fn("EnvironmentRpc.getInitialServerConfig")(function* () {
	const session = yield* currentSession();
	return yield* session.initialConfig;
});
/** Installed by the shared command boundary. A missing boundary denies protected writes. */
class RpcPermissionGuard extends __vite_ssr_import_2__.Reference("@t3tools/client-runtime/rpc/RpcPermissionGuard", { defaultValue: () => ({ authorize: (_environmentId, method, input) => {
	const scope = (0,__vite_ssr_import_0__.clientRpcRequiredScopes)(method, input)[0];
	return scope === undefined ? __vite_ssr_import_4__.void : __vite_ssr_import_4__.fail(new __vite_ssr_import_0__.EnvironmentAuthorizationError({
		...(0,__vite_ssr_import_0__.authScopeRequiredResponse)(scope),
		message: `This connection requires ${scope}.`
	}));
} }) }) {};
const authorizeRequest = __vite_ssr_import_4__.fn("EnvironmentRpc.authorize")(function* (method, input) {
	if ((0,__vite_ssr_import_0__.clientRpcRequiredScopes)(method, input).length === 0) return;
	const supervisor = yield* __vite_ssr_import_10__.EnvironmentSupervisor;
	const guard = yield* RpcPermissionGuard;
	yield* guard.authorize(supervisor.target.environmentId, method, input);
});
const requestGuarded = __vite_ssr_import_4__.fn("EnvironmentRpc.request")(function* (tag, input) {
	const supervisor = yield* __vite_ssr_import_10__.EnvironmentSupervisor;
	yield* __vite_ssr_import_4__.annotateCurrentSpan({
		"environment.id": supervisor.target.environmentId,
		"rpc.method": tag
	});
	const session = yield* currentSession();
	yield* authorizeRequest(tag, input);
	const observer = yield* EnvironmentRpcRequestObserver;
	const method = session.client[tag];
	const completeObservation = yield* observer.observe({
		environmentId: supervisor.target.environmentId,
		environmentLabel: supervisor.target.label,
		method: tag
	});
	return yield* method(input).pipe(__vite_ssr_import_4__.ensuring(completeObservation));
});
function runStreamGuarded(tag, input) {
	return __vite_ssr_import_7__.unwrap(authorizeRequest(tag, input).pipe(__vite_ssr_import_4__.andThen(currentSession()), __vite_ssr_import_4__.map((session) => {
		const method = session.client[tag];
		return method(input);
	}))).pipe(__vite_ssr_import_7__.withSpan("EnvironmentRpc.runStream", { attributes: { "rpc.method": tag } }));
};
function subscribeDynamicMapped(tag, makeInput, mapStream, options) {
	return __vite_ssr_import_7__.unwrap(__vite_ssr_import_4__.gen(function* () {
		const supervisor = yield* __vite_ssr_import_10__.EnvironmentSupervisor;
		const observer = yield* EnvironmentRpcSubscriptionObserver;
		const sessionChanges = __vite_ssr_import_8__.changes(supervisor.session);
		const sessions = options?.resubscribe === undefined ? sessionChanges : __vite_ssr_import_7__.merge(sessionChanges, options.resubscribe.pipe(__vite_ssr_import_7__.mapEffect(() => __vite_ssr_import_8__.get(supervisor.session))));
		return sessions.pipe(__vite_ssr_import_7__.switchMap(__vite_ssr_import_5__.match({
			onNone: () => __vite_ssr_import_7__.empty,
			onSome: (session) => {
				const method = tag === __vite_ssr_import_0__.WS_METHODS.subscribeServerConfig ? session.subscribeServerConfig : session.client[tag];
				let expectedFailureRetries = 0;
				const subscribeToSession = () => __vite_ssr_import_7__.suspend(() => __vite_ssr_import_7__.unwrap(__vite_ssr_import_4__.gen(function* () {
					const input = yield* makeInput(session);
					const completeObservation = yield* observer.observe({
						environmentId: supervisor.target.environmentId,
						method: tag,
						input
					});
					const stream = mapStream(session, method(input)).pipe(__vite_ssr_import_7__.onFirst(() => __vite_ssr_import_4__.sync(() => {
						expectedFailureRetries = 0;
					})));
					return stream.pipe(__vite_ssr_import_7__.ensuring(completeObservation));
				})).pipe(__vite_ssr_import_7__.tapCause((cause) => options?.onDefect !== undefined && cause.reasons.some((reason) => reason._tag === "Die" || reason._tag === "Fail" && isRpcClientError(reason.error) && reason.error.reason._tag === "RpcClientDefect") ? options.onDefect(cause) : __vite_ssr_import_4__.void), __vite_ssr_import_7__.catchCause((cause) => {
					const hasOnlyExpectedFailures = cause.reasons.length > 0 && cause.reasons.every((reason) => reason._tag === "Fail");
					const isTransportFailure = hasOnlyExpectedFailures && cause.reasons.every((reason) => reason._tag === "Fail" && isRpcClientError(reason.error));
					if (isTransportFailure) {
						return __vite_ssr_import_7__.fromEffect(__vite_ssr_import_4__.logWarning("Durable RPC subscription lost its transport; waiting for the next session.", {
							cause: __vite_ssr_import_1__.pretty(cause),
							method: tag,
							environmentId: supervisor.target.environmentId
						})).pipe(__vite_ssr_import_7__.drain);
					};
					if (hasOnlyExpectedFailures && options?.onExpectedFailure !== undefined) {
						const handled = __vite_ssr_import_7__.fromEffect(options.onExpectedFailure(cause)).pipe(__vite_ssr_import_7__.drain);
						const isAuthorizationFailure = cause.reasons.some((reason) => reason._tag === "Fail" && isEnvironmentAuthorizationError(reason.error));
						if (options.retryExpectedFailureAfter === undefined || isAuthorizationFailure) {
							return handled;
						};
						const retryDelay = __vite_ssr_import_3__.millis(Math.min(__vite_ssr_import_3__.toMillis(options.retryExpectedFailureAfter) * 2 ** expectedFailureRetries, MAX_EXPECTED_FAILURE_RETRY_DELAY_MS));
						expectedFailureRetries += 1;
						return handled.pipe(__vite_ssr_import_7__.concat(__vite_ssr_import_7__.fromEffect(__vite_ssr_import_4__.sleep(retryDelay)).pipe(__vite_ssr_import_7__.drain)), __vite_ssr_import_7__.concat(subscribeToSession()));
					};
					return __vite_ssr_import_7__.failCause(cause);
				})));
				return subscribeToSession();
			}
		})));
	})).pipe(__vite_ssr_import_7__.withSpan("EnvironmentRpc.subscribe", { attributes: { "rpc.method": tag } }));
}
function subscribeDynamic(tag, makeInput, options) {
	return subscribeDynamicMapped(tag, makeInput, (_session, stream) => stream, options);
};
/** Tags each value before `switchMap` can buffer it across a session change. */
function subscribeDynamicWithSession(tag, makeInput, options) {
	return subscribeDynamicMapped(tag, makeInput, (session, stream) => stream.pipe(__vite_ssr_import_7__.map((value) => [session, value])), options);
};
function subscribe(tag, input, options) {
	return subscribeDynamic(tag, () => __vite_ssr_import_4__.succeed(input), options);
};
const request = (tag, input) => requestGuarded(tag, input);
const runStream = (tag, input) => runStreamGuarded(tag, input);
//# sourceMappingSource=vite-generated
//# sourceMappingURL=data:application/json;base64,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dXJjZXMiOlsiY2xpZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudmlyb25tZW50QXV0aG9yaXphdGlvbkVycm9yLFxuICBjbGllbnRScGNSZXF1aXJlZFNjb3BlcyxcbiAgYXV0aFNjb3BlUmVxdWlyZWRSZXNwb25zZSxcbiAgdHlwZSBFbnZpcm9ubWVudElkLFxuICB0eXBlIENsaWVudEd1YXJkZWRScGNUYWcsXG4gIE9SQ0hFU1RSQVRJT05fVjJfV1NfTUVUSE9EUyxcbiAgV1NfTUVUSE9EUyxcbn0gZnJvbSBcIkB0M3Rvb2xzL2NvbnRyYWN0c1wiO1xuaW1wb3J0ICogYXMgQ2F1c2UgZnJvbSBcImVmZmVjdC9DYXVzZVwiO1xuaW1wb3J0ICogYXMgQ29udGV4dCBmcm9tIFwiZWZmZWN0L0NvbnRleHRcIjtcbmltcG9ydCAqIGFzIER1cmF0aW9uIGZyb20gXCJlZmZlY3QvRHVyYXRpb25cIjtcbmltcG9ydCAqIGFzIEVmZmVjdCBmcm9tIFwiZWZmZWN0L0VmZmVjdFwiO1xuaW1wb3J0ICogYXMgT3B0aW9uIGZyb20gXCJlZmZlY3QvT3B0aW9uXCI7XG5pbXBvcnQgKiBhcyBTY2hlbWEgZnJvbSBcImVmZmVjdC9TY2hlbWFcIjtcbmltcG9ydCAqIGFzIFN0cmVhbSBmcm9tIFwiZWZmZWN0L1N0cmVhbVwiO1xuaW1wb3J0ICogYXMgU3Vic2NyaXB0aW9uUmVmIGZyb20gXCJlZmZlY3QvU3Vic2NyaXB0aW9uUmVmXCI7XG5pbXBvcnQgeyBScGNDbGllbnRFcnJvciB9IGZyb20gXCJlZmZlY3QvcnBjXCI7XG5cbmltcG9ydCAqIGFzIEVudmlyb25tZW50U3VwZXJ2aXNvciBmcm9tIFwiLi4vY29ubmVjdGlvbi9zdXBlcnZpc29yLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFdzUnBjUHJvdG9jb2xDbGllbnQgfSBmcm9tIFwiLi4vcnBjL3Byb3RvY29sLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFJwY1Nlc3Npb24gfSBmcm9tIFwiLi4vcnBjL3Nlc3Npb24udHNcIjtcblxuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50UnBjVW5hdmFpbGFibGVFcnJvciBleHRlbmRzIFNjaGVtYS5UYWdnZWRFcnJvcjxFbnZpcm9ubWVudFJwY1VuYXZhaWxhYmxlRXJyb3I+KCkoXG4gIFwiRW52aXJvbm1lbnRScGNVbmF2YWlsYWJsZUVycm9yXCIsXG4gIHtcbiAgICBlbnZpcm9ubWVudElkOiBTY2hlbWEuU3RyaW5nLFxuICAgIG1lc3NhZ2U6IFNjaGVtYS5TdHJpbmcsXG4gIH0sXG4pIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW52aXJvbm1lbnRScGNSZXF1ZXN0T2JzZXJ2YXRpb24ge1xuICByZWFkb25seSBlbnZpcm9ubWVudElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudmlyb25tZW50TGFiZWw6IHN0cmluZztcbiAgcmVhZG9ubHkgbWV0aG9kOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudFJwY1JlcXVlc3RPYnNlcnZlciBleHRlbmRzIENvbnRleHQuUmVmZXJlbmNlPHtcbiAgcmVhZG9ubHkgb2JzZXJ2ZTogKFxuICAgIHJlcXVlc3Q6IEVudmlyb25tZW50UnBjUmVxdWVzdE9ic2VydmF0aW9uLFxuICApID0+IEVmZmVjdC5FZmZlY3Q8RWZmZWN0LkVmZmVjdDx2b2lkPj47XG59PihcIkB0M3Rvb2xzL2NsaWVudC1ydW50aW1lL3JwYy9FbnZpcm9ubWVudFJwY1JlcXVlc3RPYnNlcnZlclwiLCB7XG4gIGRlZmF1bHRWYWx1ZTogKCkgPT4gKHtcbiAgICBvYnNlcnZlOiAoKSA9PiBFZmZlY3Quc3VjY2VlZChFZmZlY3Qudm9pZCksXG4gIH0pLFxufSkge31cblxuZXhwb3J0IHR5cGUgRW52aXJvbm1lbnRScGNUYWcgPSBrZXlvZiBXc1JwY1Byb3RvY29sQ2xpZW50ICYgc3RyaW5nO1xudHlwZSBScGNNZXRob2Q8VFRhZyBleHRlbmRzIEVudmlyb25tZW50UnBjVGFnPiA9IFdzUnBjUHJvdG9jb2xDbGllbnRbVFRhZ107XG5cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50U3Vic2NyaXB0aW9uUnBjVGFnID1cbiAgfCB0eXBlb2YgV1NfTUVUSE9EUy5jb2RleEF1dGhDYWxsYmFja1N1YnNjcmliZVxuICB8IHR5cGVvZiBXU19NRVRIT0RTLnByb3ZpZGVyQXV0aFN1YnNjcmliZVxuICB8IHR5cGVvZiBXU19NRVRIT0RTLnByb3ZpZGVySW5zdGFsbFN1YnNjcmliZVxuICB8IHR5cGVvZiBPUkNIRVNUUkFUSU9OX1YyX1dTX01FVEhPRFMuc3Vic2NyaWJlU2hlbGxcbiAgfCB0eXBlb2YgT1JDSEVTVFJBVElPTl9WMl9XU19NRVRIT0RTLnN1YnNjcmliZVRocmVhZFxuICB8IHR5cGVvZiBPUkNIRVNUUkFUSU9OX1YyX1dTX01FVEhPRFMuc3Vic2NyaWJlQ29tbWFuZE91dHB1dFxuICB8IHR5cGVvZiBPUkNIRVNUUkFUSU9OX1YyX1dTX01FVEhPRFMuc2VhcmNoVGhyZWFkU3RyZWFtXG4gIHwgdHlwZW9mIFdTX01FVEhPRFMuc3Vic2NyaWJlQXV0aEFjY2Vzc1xuICB8IHR5cGVvZiBXU19NRVRIT0RTLnN1YnNjcmliZVNlcnZlckNvbmZpZ1xuICB8IHR5cGVvZiBXU19NRVRIT0RTLnN1YnNjcmliZVNlcnZlckxpZmVjeWNsZVxuICB8IHR5cGVvZiBXU19NRVRIT0RTLnNjaGVkdWxlZFRhc2tzU3Vic2NyaWJlXG4gIHwgdHlwZW9mIFdTX01FVEhPRFMuc2VydmVyR2V0U3RvcmFnZUNsZWFudXBSZXBvcnRcbiAgfCB0eXBlb2YgV1NfTUVUSE9EUy5zZXJ2ZXJHZXREYXRhYmFzZVN0b3JhZ2VcbiAgfCB0eXBlb2YgV1NfTUVUSE9EUy5zdWJzY3JpYmVUZXJtaW5hbEV2ZW50c1xuICB8IHR5cGVvZiBXU19NRVRIT0RTLnN1YnNjcmliZVRlcm1pbmFsTWV0YWRhdGFcbiAgfCB0eXBlb2YgV1NfTUVUSE9EUy5zdWJzY3JpYmVQcmV2aWV3RXZlbnRzXG4gIHwgdHlwZW9mIFdTX01FVEhPRFMuc3Vic2NyaWJlRGlzY292ZXJlZExvY2FsU2VydmVyc1xuICB8IHR5cGVvZiBXU19NRVRIT0RTLnN1YnNjcmliZURldmljZVN0YXRlXG4gIHwgdHlwZW9mIFdTX01FVEhPRFMuc3Vic2NyaWJlUmVzb3VyY2VUZWxlbWV0cnlcbiAgfCB0eXBlb2YgV1NfTUVUSE9EUy5wdWxsUmVxdWVzdHNTdWJzY3JpYmVSZWZyZXNoZXNcbiAgfCB0eXBlb2YgV1NfTUVUSE9EUy5zdWJzY3JpYmVWY3NTdGF0dXNcbiAgfCB0eXBlb2YgV1NfTUVUSE9EUy5zdWJzY3JpYmVXb3JrdHJlZVNldHVwXG4gIHwgdHlwZW9mIFdTX01FVEhPRFMuc3Vic2NyaWJlUHJvamVjdENsb25lc1xuICB8IHR5cGVvZiBXU19NRVRIT0RTLnRlcm1pbmFsQXR0YWNoXG4gIHwgdHlwZW9mIFdTX01FVEhPRFMudGVybWluYWxPYnNlcnZlO1xuXG5leHBvcnQgdHlwZSBFbnZpcm9ubWVudFN0cmVhbUNvbW1hbmRScGNUYWcgPVxuICB8IHR5cGVvZiBXU19NRVRIT0RTLmNoYXRHcHRIYW5kb2ZmU3Vic2NyaWJlXG4gIHwgdHlwZW9mIFdTX01FVEhPRFMuY2xvdWRJbnN0YWxsUmVsYXlDbGllbnRcbiAgfCB0eXBlb2YgV1NfTUVUSE9EUy5zZXJ2ZXJVcGRhdGVTZXJ2ZXJXaXRoUHJvZ3Jlc3NcbiAgfCB0eXBlb2YgV1NfTUVUSE9EUy5naXRSdW5TdGFja2VkQWN0aW9uO1xuXG5leHBvcnQgdHlwZSBFbnZpcm9ubWVudFN0cmVhbVJwY1RhZyA9XG4gIHwgRW52aXJvbm1lbnRTdWJzY3JpcHRpb25ScGNUYWdcbiAgfCBFbnZpcm9ubWVudFN0cmVhbUNvbW1hbmRScGNUYWc7XG5cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50VW5hcnlScGNUYWcgPSBFeGNsdWRlPEVudmlyb25tZW50UnBjVGFnLCBFbnZpcm9ubWVudFN0cmVhbVJwY1RhZz47XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW52aXJvbm1lbnRScGNTdWJzY3JpcHRpb25PYnNlcnZhdGlvbiB7XG4gIHJlYWRvbmx5IGVudmlyb25tZW50SWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgbWV0aG9kOiBFbnZpcm9ubWVudFN1YnNjcmlwdGlvblJwY1RhZztcbiAgcmVhZG9ubHkgaW5wdXQ6IHVua25vd247XG59XG5cbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudFJwY1N1YnNjcmlwdGlvbk9ic2VydmVyIGV4dGVuZHMgQ29udGV4dC5SZWZlcmVuY2U8e1xuICByZWFkb25seSBvYnNlcnZlOiAoXG4gICAgc3Vic2NyaXB0aW9uOiBFbnZpcm9ubWVudFJwY1N1YnNjcmlwdGlvbk9ic2VydmF0aW9uLFxuICApID0+IEVmZmVjdC5FZmZlY3Q8RWZmZWN0LkVmZmVjdDx2b2lkPj47XG59PihcIkB0M3Rvb2xzL2NsaWVudC1ydW50aW1lL3JwYy9FbnZpcm9ubWVudFJwY1N1YnNjcmlwdGlvbk9ic2VydmVyXCIsIHtcbiAgZGVmYXVsdFZhbHVlOiAoKSA9PiAoe1xuICAgIG9ic2VydmU6ICgpID0+IEVmZmVjdC5zdWNjZWVkKEVmZmVjdC52b2lkKSxcbiAgfSksXG59KSB7fVxuXG5leHBvcnQgY29uc3QgaXNScGNDbGllbnRFcnJvciA9IFNjaGVtYS5pcyhScGNDbGllbnRFcnJvci5ScGNDbGllbnRFcnJvcik7XG5jb25zdCBpc0Vudmlyb25tZW50QXV0aG9yaXphdGlvbkVycm9yID0gU2NoZW1hLmlzKEVudmlyb25tZW50QXV0aG9yaXphdGlvbkVycm9yKTtcblxuY29uc3QgTUFYX0VYUEVDVEVEX0ZBSUxVUkVfUkVUUllfREVMQVlfTVMgPSAzMF8wMDA7XG5cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50UnBjSW5wdXQ8VFRhZyBleHRlbmRzIEVudmlyb25tZW50UnBjVGFnPiA9IFBhcmFtZXRlcnM8UnBjTWV0aG9kPFRUYWc+PlswXTtcblxuZXhwb3J0IHR5cGUgRW52aXJvbm1lbnRScGNTdWNjZXNzPFRUYWcgZXh0ZW5kcyBFbnZpcm9ubWVudFVuYXJ5UnBjVGFnPiA9XG4gIFJwY01ldGhvZDxUVGFnPiBleHRlbmRzIChpbnB1dDogYW55LCBvcHRpb25zPzogYW55KSA9PiBFZmZlY3QuRWZmZWN0PGluZmVyIEEsIGFueSwgYW55PlxuICAgID8gQVxuICAgIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50UnBjRmFpbHVyZTxUVGFnIGV4dGVuZHMgRW52aXJvbm1lbnRVbmFyeVJwY1RhZz4gPVxuICBScGNNZXRob2Q8VFRhZz4gZXh0ZW5kcyAoaW5wdXQ6IGFueSwgb3B0aW9ucz86IGFueSkgPT4gRWZmZWN0LkVmZmVjdDxhbnksIGluZmVyIEUsIGFueT5cbiAgICA/IEVcbiAgICA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBFbnZpcm9ubWVudFJwY1N0cmVhbVZhbHVlPFRUYWcgZXh0ZW5kcyBFbnZpcm9ubWVudFN0cmVhbVJwY1RhZz4gPVxuICBScGNNZXRob2Q8VFRhZz4gZXh0ZW5kcyAoaW5wdXQ6IGFueSwgb3B0aW9ucz86IGFueSkgPT4gU3RyZWFtLlN0cmVhbTxpbmZlciBBLCBhbnksIGFueT5cbiAgICA/IEFcbiAgICA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBFbnZpcm9ubWVudFJwY1N0cmVhbUZhaWx1cmU8VFRhZyBleHRlbmRzIEVudmlyb25tZW50U3RyZWFtUnBjVGFnPiA9XG4gIFJwY01ldGhvZDxUVGFnPiBleHRlbmRzIChpbnB1dDogYW55LCBvcHRpb25zPzogYW55KSA9PiBTdHJlYW0uU3RyZWFtPGFueSwgaW5mZXIgRSwgYW55PlxuICAgID8gRVxuICAgIDogbmV2ZXI7XG5cbmNvbnN0IGN1cnJlbnRTZXNzaW9uID0gRWZmZWN0LmZuKFwiRW52aXJvbm1lbnRScGMuY3VycmVudFNlc3Npb25cIikoZnVuY3Rpb24qICgpIHtcbiAgY29uc3Qgc3VwZXJ2aXNvciA9IHlpZWxkKiBFbnZpcm9ubWVudFN1cGVydmlzb3IuRW52aXJvbm1lbnRTdXBlcnZpc29yO1xuICByZXR1cm4geWllbGQqIFN1YnNjcmlwdGlvblJlZi5nZXQoc3VwZXJ2aXNvci5zZXNzaW9uKS5waXBlKFxuICAgIEVmZmVjdC5mbGF0TWFwKFxuICAgICAgT3B0aW9uLm1hdGNoKHtcbiAgICAgICAgb25Ob25lOiAoKSA9PlxuICAgICAgICAgIEVmZmVjdC5mYWlsKFxuICAgICAgICAgICAgbmV3IEVudmlyb25tZW50UnBjVW5hdmFpbGFibGVFcnJvcih7XG4gICAgICAgICAgICAgIGVudmlyb25tZW50SWQ6IHN1cGVydmlzb3IudGFyZ2V0LmVudmlyb25tZW50SWQsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGAke3N1cGVydmlzb3IudGFyZ2V0LmxhYmVsfSBpcyBub3QgY29ubmVjdGVkLmAsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICBvblNvbWU6IEVmZmVjdC5zdWNjZWVkLFxuICAgICAgfSksXG4gICAgKSxcbiAgKTtcbn0pO1xuXG5leHBvcnQgY29uc3QgZ2V0SW5pdGlhbFNlcnZlckNvbmZpZyA9IEVmZmVjdC5mbihcIkVudmlyb25tZW50UnBjLmdldEluaXRpYWxTZXJ2ZXJDb25maWdcIikoXG4gIGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHlpZWxkKiBjdXJyZW50U2Vzc2lvbigpO1xuICAgIHJldHVybiB5aWVsZCogc2Vzc2lvbi5pbml0aWFsQ29uZmlnO1xuICB9LFxuKTtcblxuLyoqIEluc3RhbGxlZCBieSB0aGUgc2hhcmVkIGNvbW1hbmQgYm91bmRhcnkuIEEgbWlzc2luZyBib3VuZGFyeSBkZW5pZXMgcHJvdGVjdGVkIHdyaXRlcy4gKi9cbmV4cG9ydCBjbGFzcyBScGNQZXJtaXNzaW9uR3VhcmQgZXh0ZW5kcyBDb250ZXh0LlJlZmVyZW5jZTx7XG4gIHJlYWRvbmx5IGF1dGhvcml6ZTogKFxuICAgIGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQsXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgaW5wdXQ6IHVua25vd24sXG4gICkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBFbnZpcm9ubWVudEF1dGhvcml6YXRpb25FcnJvcj47XG59PihcIkB0M3Rvb2xzL2NsaWVudC1ydW50aW1lL3JwYy9ScGNQZXJtaXNzaW9uR3VhcmRcIiwge1xuICBkZWZhdWx0VmFsdWU6ICgpID0+ICh7XG4gICAgYXV0aG9yaXplOiAoX2Vudmlyb25tZW50SWQsIG1ldGhvZCwgaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IHNjb3BlID0gY2xpZW50UnBjUmVxdWlyZWRTY29wZXMobWV0aG9kLCBpbnB1dClbMF07XG4gICAgICByZXR1cm4gc2NvcGUgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IEVmZmVjdC52b2lkXG4gICAgICAgIDogRWZmZWN0LmZhaWwoXG4gICAgICAgICAgICBuZXcgRW52aXJvbm1lbnRBdXRob3JpemF0aW9uRXJyb3Ioe1xuICAgICAgICAgICAgICAuLi5hdXRoU2NvcGVSZXF1aXJlZFJlc3BvbnNlKHNjb3BlKSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogYFRoaXMgY29ubmVjdGlvbiByZXF1aXJlcyAke3Njb3BlfS5gLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICB9LFxuICB9KSxcbn0pIHt9XG5cbmNvbnN0IGF1dGhvcml6ZVJlcXVlc3QgPSBFZmZlY3QuZm4oXCJFbnZpcm9ubWVudFJwYy5hdXRob3JpemVcIikoZnVuY3Rpb24qIChcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIGlucHV0OiB1bmtub3duLFxuKSB7XG4gIGlmIChjbGllbnRScGNSZXF1aXJlZFNjb3BlcyhtZXRob2QsIGlucHV0KS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgY29uc3Qgc3VwZXJ2aXNvciA9IHlpZWxkKiBFbnZpcm9ubWVudFN1cGVydmlzb3IuRW52aXJvbm1lbnRTdXBlcnZpc29yO1xuICBjb25zdCBndWFyZCA9IHlpZWxkKiBScGNQZXJtaXNzaW9uR3VhcmQ7XG4gIHlpZWxkKiBndWFyZC5hdXRob3JpemUoc3VwZXJ2aXNvci50YXJnZXQuZW52aXJvbm1lbnRJZCwgbWV0aG9kLCBpbnB1dCk7XG59KTtcblxuZXhwb3J0IGNvbnN0IHJlcXVlc3RHdWFyZGVkID0gRWZmZWN0LmZuKFwiRW52aXJvbm1lbnRScGMucmVxdWVzdFwiKShmdW5jdGlvbiogPFxuICBUVGFnIGV4dGVuZHMgRW52aXJvbm1lbnRVbmFyeVJwY1RhZyxcbj4odGFnOiBUVGFnLCBpbnB1dDogRW52aXJvbm1lbnRScGNJbnB1dDxUVGFnPikge1xuICBjb25zdCBzdXBlcnZpc29yID0geWllbGQqIEVudmlyb25tZW50U3VwZXJ2aXNvci5FbnZpcm9ubWVudFN1cGVydmlzb3I7XG4gIHlpZWxkKiBFZmZlY3QuYW5ub3RhdGVDdXJyZW50U3Bhbih7XG4gICAgXCJlbnZpcm9ubWVudC5pZFwiOiBzdXBlcnZpc29yLnRhcmdldC5lbnZpcm9ubWVudElkLFxuICAgIFwicnBjLm1ldGhvZFwiOiB0YWcsXG4gIH0pO1xuICBjb25zdCBzZXNzaW9uID0geWllbGQqIGN1cnJlbnRTZXNzaW9uKCk7XG4gIHlpZWxkKiBhdXRob3JpemVSZXF1ZXN0KHRhZywgaW5wdXQpO1xuICBjb25zdCBvYnNlcnZlciA9IHlpZWxkKiBFbnZpcm9ubWVudFJwY1JlcXVlc3RPYnNlcnZlcjtcbiAgY29uc3QgbWV0aG9kID0gc2Vzc2lvbi5jbGllbnRbdGFnXSBhcyAoXG4gICAgaW5wdXQ6IEVudmlyb25tZW50UnBjSW5wdXQ8VFRhZz4sXG4gICkgPT4gRWZmZWN0LkVmZmVjdDxFbnZpcm9ubWVudFJwY1N1Y2Nlc3M8VFRhZz4sIEVudmlyb25tZW50UnBjRmFpbHVyZTxUVGFnPj47XG4gIGNvbnN0IGNvbXBsZXRlT2JzZXJ2YXRpb24gPSB5aWVsZCogb2JzZXJ2ZXIub2JzZXJ2ZSh7XG4gICAgZW52aXJvbm1lbnRJZDogc3VwZXJ2aXNvci50YXJnZXQuZW52aXJvbm1lbnRJZCxcbiAgICBlbnZpcm9ubWVudExhYmVsOiBzdXBlcnZpc29yLnRhcmdldC5sYWJlbCxcbiAgICBtZXRob2Q6IHRhZyxcbiAgfSk7XG4gIHJldHVybiB5aWVsZCogbWV0aG9kKGlucHV0KS5waXBlKEVmZmVjdC5lbnN1cmluZyhjb21wbGV0ZU9ic2VydmF0aW9uKSk7XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJ1blN0cmVhbUd1YXJkZWQ8VFRhZyBleHRlbmRzIEVudmlyb25tZW50U3RyZWFtQ29tbWFuZFJwY1RhZz4oXG4gIHRhZzogVFRhZyxcbiAgaW5wdXQ6IEVudmlyb25tZW50UnBjSW5wdXQ8VFRhZz4sXG4pOiBTdHJlYW0uU3RyZWFtPFxuICBFbnZpcm9ubWVudFJwY1N0cmVhbVZhbHVlPFRUYWc+LFxuICB8IEVudmlyb25tZW50UnBjU3RyZWFtRmFpbHVyZTxUVGFnPlxuICB8IEVudmlyb25tZW50UnBjVW5hdmFpbGFibGVFcnJvclxuICB8IEVudmlyb25tZW50QXV0aG9yaXphdGlvbkVycm9yLFxuICBFbnZpcm9ubWVudFN1cGVydmlzb3IuRW52aXJvbm1lbnRTdXBlcnZpc29yXG4+IHtcbiAgcmV0dXJuIFN0cmVhbS51bndyYXAoXG4gICAgYXV0aG9yaXplUmVxdWVzdCh0YWcsIGlucHV0KS5waXBlKFxuICAgICAgRWZmZWN0LmFuZFRoZW4oY3VycmVudFNlc3Npb24oKSksXG4gICAgICBFZmZlY3QubWFwKChzZXNzaW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IHNlc3Npb24uY2xpZW50W3RhZ10gYXMgKFxuICAgICAgICAgIGlucHV0OiBFbnZpcm9ubWVudFJwY0lucHV0PFRUYWc+LFxuICAgICAgICApID0+IFN0cmVhbS5TdHJlYW08RW52aXJvbm1lbnRScGNTdHJlYW1WYWx1ZTxUVGFnPiwgRW52aXJvbm1lbnRScGNTdHJlYW1GYWlsdXJlPFRUYWc+PjtcbiAgICAgICAgcmV0dXJuIG1ldGhvZChpbnB1dCk7XG4gICAgICB9KSxcbiAgICApLFxuICApLnBpcGUoXG4gICAgU3RyZWFtLndpdGhTcGFuKFwiRW52aXJvbm1lbnRScGMucnVuU3RyZWFtXCIsIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHsgXCJycGMubWV0aG9kXCI6IHRhZyB9LFxuICAgIH0pLFxuICApO1xufVxuXG5pbnRlcmZhY2UgU3Vic2NyaXB0aW9uT3B0aW9uczxUVGFnIGV4dGVuZHMgRW52aXJvbm1lbnRTdWJzY3JpcHRpb25ScGNUYWc+IHtcbiAgcmVhZG9ubHkgb25EZWZlY3Q/OiAoXG4gICAgY2F1c2U6IENhdXNlLkNhdXNlPEVudmlyb25tZW50UnBjU3RyZWFtRmFpbHVyZTxUVGFnPj4sXG4gICkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgbmV2ZXI+O1xuICByZWFkb25seSBvbkV4cGVjdGVkRmFpbHVyZT86IChcbiAgICBjYXVzZTogQ2F1c2UuQ2F1c2U8RW52aXJvbm1lbnRScGNTdHJlYW1GYWlsdXJlPFRUYWc+PixcbiAgKSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBuZXZlcj47XG4gIHJlYWRvbmx5IHJldHJ5RXhwZWN0ZWRGYWlsdXJlQWZ0ZXI/OiBEdXJhdGlvbi5JbnB1dDtcbiAgcmVhZG9ubHkgcmVzdWJzY3JpYmU/OiBTdHJlYW0uU3RyZWFtPHVua25vd24sIG5ldmVyLCBuZXZlcj47XG59XG5cbmZ1bmN0aW9uIHN1YnNjcmliZUR5bmFtaWNNYXBwZWQ8VFRhZyBleHRlbmRzIEVudmlyb25tZW50U3Vic2NyaXB0aW9uUnBjVGFnLCBBPihcbiAgdGFnOiBUVGFnLFxuICBtYWtlSW5wdXQ6IChzZXNzaW9uOiBScGNTZXNzaW9uKSA9PiBFZmZlY3QuRWZmZWN0PEVudmlyb25tZW50UnBjSW5wdXQ8VFRhZz4+LFxuICBtYXBTdHJlYW06IChcbiAgICBzZXNzaW9uOiBScGNTZXNzaW9uLFxuICAgIHN0cmVhbTogU3RyZWFtLlN0cmVhbTxFbnZpcm9ubWVudFJwY1N0cmVhbVZhbHVlPFRUYWc+LCBFbnZpcm9ubWVudFJwY1N0cmVhbUZhaWx1cmU8VFRhZz4+LFxuICApID0+IFN0cmVhbS5TdHJlYW08QSwgRW52aXJvbm1lbnRScGNTdHJlYW1GYWlsdXJlPFRUYWc+PixcbiAgb3B0aW9ucz86IFN1YnNjcmlwdGlvbk9wdGlvbnM8VFRhZz4sXG4pOiBTdHJlYW0uU3RyZWFtPFxuICBBLFxuICBFbnZpcm9ubWVudFJwY1N0cmVhbUZhaWx1cmU8VFRhZz4sXG4gIEVudmlyb25tZW50U3VwZXJ2aXNvci5FbnZpcm9ubWVudFN1cGVydmlzb3Jcbj4ge1xuICByZXR1cm4gU3RyZWFtLnVud3JhcChcbiAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCBzdXBlcnZpc29yID0geWllbGQqIEVudmlyb25tZW50U3VwZXJ2aXNvci5FbnZpcm9ubWVudFN1cGVydmlzb3I7XG4gICAgICBjb25zdCBvYnNlcnZlciA9IHlpZWxkKiBFbnZpcm9ubWVudFJwY1N1YnNjcmlwdGlvbk9ic2VydmVyO1xuICAgICAgY29uc3Qgc2Vzc2lvbkNoYW5nZXMgPSBTdWJzY3JpcHRpb25SZWYuY2hhbmdlcyhzdXBlcnZpc29yLnNlc3Npb24pO1xuICAgICAgY29uc3Qgc2Vzc2lvbnMgPVxuICAgICAgICBvcHRpb25zPy5yZXN1YnNjcmliZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBzZXNzaW9uQ2hhbmdlc1xuICAgICAgICAgIDogU3RyZWFtLm1lcmdlKFxuICAgICAgICAgICAgICBzZXNzaW9uQ2hhbmdlcyxcbiAgICAgICAgICAgICAgb3B0aW9ucy5yZXN1YnNjcmliZS5waXBlKFxuICAgICAgICAgICAgICAgIFN0cmVhbS5tYXBFZmZlY3QoKCkgPT4gU3Vic2NyaXB0aW9uUmVmLmdldChzdXBlcnZpc29yLnNlc3Npb24pKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICByZXR1cm4gc2Vzc2lvbnMucGlwZShcbiAgICAgICAgU3RyZWFtLnN3aXRjaE1hcChcbiAgICAgICAgICBPcHRpb24ubWF0Y2goe1xuICAgICAgICAgICAgb25Ob25lOiAoKSA9PiBTdHJlYW0uZW1wdHksXG4gICAgICAgICAgICBvblNvbWU6IChzZXNzaW9uKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IChcbiAgICAgICAgICAgICAgICB0YWcgPT09IFdTX01FVEhPRFMuc3Vic2NyaWJlU2VydmVyQ29uZmlnXG4gICAgICAgICAgICAgICAgICA/IHNlc3Npb24uc3Vic2NyaWJlU2VydmVyQ29uZmlnXG4gICAgICAgICAgICAgICAgICA6IHNlc3Npb24uY2xpZW50W3RhZ11cbiAgICAgICAgICAgICAgKSBhcyAoXG4gICAgICAgICAgICAgICAgaW5wdXQ6IEVudmlyb25tZW50UnBjSW5wdXQ8VFRhZz4sXG4gICAgICAgICAgICAgICkgPT4gU3RyZWFtLlN0cmVhbTxcbiAgICAgICAgICAgICAgICBFbnZpcm9ubWVudFJwY1N0cmVhbVZhbHVlPFRUYWc+LFxuICAgICAgICAgICAgICAgIEVudmlyb25tZW50UnBjU3RyZWFtRmFpbHVyZTxUVGFnPlxuICAgICAgICAgICAgICA+O1xuICAgICAgICAgICAgICBsZXQgZXhwZWN0ZWRGYWlsdXJlUmV0cmllcyA9IDA7XG4gICAgICAgICAgICAgIGNvbnN0IHN1YnNjcmliZVRvU2Vzc2lvbiA9ICgpOiBTdHJlYW0uU3RyZWFtPEEsIEVudmlyb25tZW50UnBjU3RyZWFtRmFpbHVyZTxUVGFnPj4gPT5cbiAgICAgICAgICAgICAgICBTdHJlYW0uc3VzcGVuZCgoKSA9PlxuICAgICAgICAgICAgICAgICAgU3RyZWFtLnVud3JhcChcbiAgICAgICAgICAgICAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0ID0geWllbGQqIG1ha2VJbnB1dChzZXNzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZU9ic2VydmF0aW9uID0geWllbGQqIG9ic2VydmVyLm9ic2VydmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRJZDogc3VwZXJ2aXNvci50YXJnZXQuZW52aXJvbm1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogdGFnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gbWFwU3RyZWFtKHNlc3Npb24sIG1ldGhvZChpbnB1dCkpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0ub25GaXJzdCgoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3Quc3luYygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRGYWlsdXJlUmV0cmllcyA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW0ucGlwZShTdHJlYW0uZW5zdXJpbmcoY29tcGxldGVPYnNlcnZhdGlvbikpO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgU3RyZWFtLnRhcENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPy5vbkRlZmVjdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgY2F1c2UucmVhc29ucy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHJlYXNvbikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uLl90YWcgPT09IFwiRGllXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlYXNvbi5fdGFnID09PSBcIkZhaWxcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUnBjQ2xpZW50RXJyb3IocmVhc29uLmVycm9yKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbi5lcnJvci5yZWFzb24uX3RhZyA9PT0gXCJScGNDbGllbnREZWZlY3RcIiksXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBvcHRpb25zLm9uRGVmZWN0KGNhdXNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBFZmZlY3Qudm9pZCxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgU3RyZWFtLmNhdGNoQ2F1c2UoKGNhdXNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzT25seUV4cGVjdGVkRmFpbHVyZXMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F1c2UucmVhc29ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXVzZS5yZWFzb25zLmV2ZXJ5KChyZWFzb24pID0+IHJlYXNvbi5fdGFnID09PSBcIkZhaWxcIik7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNUcmFuc3BvcnRGYWlsdXJlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc09ubHlFeHBlY3RlZEZhaWx1cmVzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXVzZS5yZWFzb25zLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAocmVhc29uKSA9PiByZWFzb24uX3RhZyA9PT0gXCJGYWlsXCIgJiYgaXNScGNDbGllbnRFcnJvcihyZWFzb24uZXJyb3IpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNUcmFuc3BvcnRGYWlsdXJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyZWFtLmZyb21FZmZlY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdC5sb2dXYXJuaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRHVyYWJsZSBSUEMgc3Vic2NyaXB0aW9uIGxvc3QgaXRzIHRyYW5zcG9ydDsgd2FpdGluZyBmb3IgdGhlIG5leHQgc2Vzc2lvbi5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZTogQ2F1c2UucHJldHR5KGNhdXNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogdGFnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRJZDogc3VwZXJ2aXNvci50YXJnZXQuZW52aXJvbm1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgKS5waXBlKFN0cmVhbS5kcmFpbik7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNPbmx5RXhwZWN0ZWRGYWlsdXJlcyAmJiBvcHRpb25zPy5vbkV4cGVjdGVkRmFpbHVyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVkID0gU3RyZWFtLmZyb21FZmZlY3Qob3B0aW9ucy5vbkV4cGVjdGVkRmFpbHVyZShjYXVzZSkpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbS5kcmFpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0F1dGhvcml6YXRpb25GYWlsdXJlID0gY2F1c2UucmVhc29ucy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAocmVhc29uKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbi5fdGFnID09PSBcIkZhaWxcIiAmJiBpc0Vudmlyb25tZW50QXV0aG9yaXphdGlvbkVycm9yKHJlYXNvbi5lcnJvciksXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnJldHJ5RXhwZWN0ZWRGYWlsdXJlQWZ0ZXIgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc0F1dGhvcml6YXRpb25GYWlsdXJlXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXRyeURlbGF5ID0gRHVyYXRpb24ubWlsbGlzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEdXJhdGlvbi50b01pbGxpcyhvcHRpb25zLnJldHJ5RXhwZWN0ZWRGYWlsdXJlQWZ0ZXIpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiogZXhwZWN0ZWRGYWlsdXJlUmV0cmllcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfRVhQRUNURURfRkFJTFVSRV9SRVRSWV9ERUxBWV9NUyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEZhaWx1cmVSZXRyaWVzICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlZC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0uY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbS5mcm9tRWZmZWN0KEVmZmVjdC5zbGVlcChyZXRyeURlbGF5KSkucGlwZShTdHJlYW0uZHJhaW4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0uY29uY2F0KHN1YnNjcmliZVRvU2Vzc2lvbigpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJlYW0uZmFpbENhdXNlKGNhdXNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybiBzdWJzY3JpYmVUb1Nlc3Npb24oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0pLFxuICApLnBpcGUoXG4gICAgU3RyZWFtLndpdGhTcGFuKFwiRW52aXJvbm1lbnRScGMuc3Vic2NyaWJlXCIsIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHsgXCJycGMubWV0aG9kXCI6IHRhZyB9LFxuICAgIH0pLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Vic2NyaWJlRHluYW1pYzxUVGFnIGV4dGVuZHMgRW52aXJvbm1lbnRTdWJzY3JpcHRpb25ScGNUYWc+KFxuICB0YWc6IFRUYWcsXG4gIG1ha2VJbnB1dDogKHNlc3Npb246IFJwY1Nlc3Npb24pID0+IEVmZmVjdC5FZmZlY3Q8RW52aXJvbm1lbnRScGNJbnB1dDxUVGFnPj4sXG4gIG9wdGlvbnM/OiBTdWJzY3JpcHRpb25PcHRpb25zPFRUYWc+LFxuKTogU3RyZWFtLlN0cmVhbTxcbiAgRW52aXJvbm1lbnRScGNTdHJlYW1WYWx1ZTxUVGFnPixcbiAgRW52aXJvbm1lbnRScGNTdHJlYW1GYWlsdXJlPFRUYWc+LFxuICBFbnZpcm9ubWVudFN1cGVydmlzb3IuRW52aXJvbm1lbnRTdXBlcnZpc29yXG4+IHtcbiAgcmV0dXJuIHN1YnNjcmliZUR5bmFtaWNNYXBwZWQodGFnLCBtYWtlSW5wdXQsIChfc2Vzc2lvbiwgc3RyZWFtKSA9PiBzdHJlYW0sIG9wdGlvbnMpO1xufVxuXG4vKiogVGFncyBlYWNoIHZhbHVlIGJlZm9yZSBgc3dpdGNoTWFwYCBjYW4gYnVmZmVyIGl0IGFjcm9zcyBhIHNlc3Npb24gY2hhbmdlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YnNjcmliZUR5bmFtaWNXaXRoU2Vzc2lvbjxUVGFnIGV4dGVuZHMgRW52aXJvbm1lbnRTdWJzY3JpcHRpb25ScGNUYWc+KFxuICB0YWc6IFRUYWcsXG4gIG1ha2VJbnB1dDogKHNlc3Npb246IFJwY1Nlc3Npb24pID0+IEVmZmVjdC5FZmZlY3Q8RW52aXJvbm1lbnRScGNJbnB1dDxUVGFnPj4sXG4gIG9wdGlvbnM/OiBTdWJzY3JpcHRpb25PcHRpb25zPFRUYWc+LFxuKTogU3RyZWFtLlN0cmVhbTxcbiAgcmVhZG9ubHkgW3Nlc3Npb246IFJwY1Nlc3Npb24sIHZhbHVlOiBFbnZpcm9ubWVudFJwY1N0cmVhbVZhbHVlPFRUYWc+XSxcbiAgRW52aXJvbm1lbnRScGNTdHJlYW1GYWlsdXJlPFRUYWc+LFxuICBFbnZpcm9ubWVudFN1cGVydmlzb3IuRW52aXJvbm1lbnRTdXBlcnZpc29yXG4+IHtcbiAgcmV0dXJuIHN1YnNjcmliZUR5bmFtaWNNYXBwZWQoXG4gICAgdGFnLFxuICAgIG1ha2VJbnB1dCxcbiAgICAoc2Vzc2lvbiwgc3RyZWFtKSA9PiBzdHJlYW0ucGlwZShTdHJlYW0ubWFwKCh2YWx1ZSkgPT4gW3Nlc3Npb24sIHZhbHVlXSBhcyBjb25zdCkpLFxuICAgIG9wdGlvbnMsXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJzY3JpYmU8VFRhZyBleHRlbmRzIEVudmlyb25tZW50U3Vic2NyaXB0aW9uUnBjVGFnPihcbiAgdGFnOiBUVGFnLFxuICBpbnB1dDogRW52aXJvbm1lbnRScGNJbnB1dDxUVGFnPixcbiAgb3B0aW9ucz86IFN1YnNjcmlwdGlvbk9wdGlvbnM8VFRhZz4sXG4pOiBTdHJlYW0uU3RyZWFtPFxuICBFbnZpcm9ubWVudFJwY1N0cmVhbVZhbHVlPFRUYWc+LFxuICBFbnZpcm9ubWVudFJwY1N0cmVhbUZhaWx1cmU8VFRhZz4sXG4gIEVudmlyb25tZW50U3VwZXJ2aXNvci5FbnZpcm9ubWVudFN1cGVydmlzb3Jcbj4ge1xuICByZXR1cm4gc3Vic2NyaWJlRHluYW1pYyh0YWcsICgpID0+IEVmZmVjdC5zdWNjZWVkKGlucHV0KSwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBjb25zdCByZXF1ZXN0ID0gPFRUYWcgZXh0ZW5kcyBFeGNsdWRlPEVudmlyb25tZW50VW5hcnlScGNUYWcsIENsaWVudEd1YXJkZWRScGNUYWc+PihcbiAgdGFnOiBUVGFnLFxuICBpbnB1dDogRW52aXJvbm1lbnRScGNJbnB1dDxUVGFnPixcbikgPT4gcmVxdWVzdEd1YXJkZWQodGFnLCBpbnB1dCk7XG5cbmV4cG9ydCBjb25zdCBydW5TdHJlYW0gPSA8XG4gIFRUYWcgZXh0ZW5kcyBFeGNsdWRlPEVudmlyb25tZW50U3RyZWFtQ29tbWFuZFJwY1RhZywgQ2xpZW50R3VhcmRlZFJwY1RhZz4sXG4+KFxuICB0YWc6IFRUYWcsXG4gIGlucHV0OiBFbnZpcm9ubWVudFJwY0lucHV0PFRUYWc+LFxuKSA9PiBydW5TdHJlYW1HdWFyZGVkKHRhZywgaW5wdXQpO1xuIl0sImZpbGUiOiIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9ycGMvY2xpZW50LnRzIn0=

//# vitestCache=W3siZmlsZSI6IjEiLCJpZCI6IjEiLCJ1cmwiOiIyIiwiaW1wb3J0cyI6IjMiLCJtYXBwaW5ncyI6ZmFsc2UsImRlcHMiOiI0IiwiZHluYW1pY0RlcHMiOiI1Iiwic3RhdGljTW9ja3MiOm51bGx9LCIvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL3JwYy9jbGllbnQudHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9ycGMvY2xpZW50LnRzIix7InVybHMiOiI2IiwiaWRzIjoiNyJ9LFsiOCIsIjkiLCIxMCIsIjExIiwiMTIiLCIxMyIsIjE0IiwiMTUiLCIxNiIsIjE3IiwiMTgiXSxbXSxbIjgiLCI5IiwiMTAiLCIxMSIsIjEyIiwiMTMiLCIxNCIsIjE1IiwiMTYiLCIxNyIsIjE4Il0se30sIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY29udHJhY3RzL3NyYy9pbmRleC50cyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvQ2F1c2UuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L0NvbnRleHQuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L0R1cmF0aW9uLmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9FZmZlY3QuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L09wdGlvbi5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvU2NoZW1hLmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9TdHJlYW0uanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L1N1YnNjcmlwdGlvblJlZi5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvcnBjL2luZGV4LmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9jbGllbnQtcnVudGltZS9zcmMvY29ubmVjdGlvbi9zdXBlcnZpc29yLnRzIl0=