__vite_ssr_exportName__("PREVIEW_AUTOMATION_V1_OPERATIONS", () => { try { return PREVIEW_AUTOMATION_V1_OPERATIONS } catch {} });
__vite_ssr_exportName__("PREVIEW_AUTOMATION_SERVER_OPERATIONS", () => { try { return PREVIEW_AUTOMATION_SERVER_OPERATIONS } catch {} });
__vite_ssr_exportName__("PreviewAutomationOperation", () => { try { return PreviewAutomationOperation } catch {} });
__vite_ssr_exportName__("PreviewAutomationTabTargetInput", () => { try { return PreviewAutomationTabTargetInput } catch {} });
__vite_ssr_exportName__("PreviewAutomationTabOwner", () => { try { return PreviewAutomationTabOwner } catch {} });
__vite_ssr_exportName__("PreviewAutomationProfile", () => { try { return PreviewAutomationProfile } catch {} });
__vite_ssr_exportName__("PreviewAutomationStatus", () => { try { return PreviewAutomationStatus } catch {} });
__vite_ssr_exportName__("PreviewAutomationDialogInput", () => { try { return PreviewAutomationDialogInput } catch {} });
__vite_ssr_exportName__("PreviewAutomationOpenInput", () => { try { return PreviewAutomationOpenInput } catch {} });
__vite_ssr_exportName__("BrowserNavigationTarget", () => { try { return BrowserNavigationTarget } catch {} });
__vite_ssr_exportName__("PreviewAutomationNavigateInput", () => { try { return PreviewAutomationNavigateInput } catch {} });
__vite_ssr_exportName__("PreviewAutomationResizeInput", () => { try { return PreviewAutomationResizeInput } catch {} });
__vite_ssr_exportName__("PreviewAutomationResizeResult", () => { try { return PreviewAutomationResizeResult } catch {} });
__vite_ssr_exportName__("PreviewAutomationColorScheme", () => { try { return PreviewAutomationColorScheme } catch {} });
__vite_ssr_exportName__("PreviewAutomationSetColorSchemeInput", () => { try { return PreviewAutomationSetColorSchemeInput } catch {} });
__vite_ssr_exportName__("PreviewAutomationSetColorSchemeResult", () => { try { return PreviewAutomationSetColorSchemeResult } catch {} });
__vite_ssr_exportName__("PreviewAutomationClickInput", () => { try { return PreviewAutomationClickInput } catch {} });
__vite_ssr_exportName__("PreviewAutomationHoverInput", () => { try { return PreviewAutomationHoverInput } catch {} });
__vite_ssr_exportName__("PreviewAutomationSelectInput", () => { try { return PreviewAutomationSelectInput } catch {} });
__vite_ssr_exportName__("PreviewAutomationSelectResult", () => { try { return PreviewAutomationSelectResult } catch {} });
__vite_ssr_exportName__("PreviewAutomationDragInput", () => { try { return PreviewAutomationDragInput } catch {} });
__vite_ssr_exportName__("PreviewAutomationUploadInput", () => { try { return PreviewAutomationUploadInput } catch {} });
__vite_ssr_exportName__("PreviewAutomationTypeInput", () => { try { return PreviewAutomationTypeInput } catch {} });
__vite_ssr_exportName__("PreviewAutomationPressInput", () => { try { return PreviewAutomationPressInput } catch {} });
__vite_ssr_exportName__("PreviewAutomationScrollInput", () => { try { return PreviewAutomationScrollInput } catch {} });
__vite_ssr_exportName__("PreviewAutomationEvaluateInput", () => { try { return PreviewAutomationEvaluateInput } catch {} });
__vite_ssr_exportName__("PreviewAutomationWaitForInput", () => { try { return PreviewAutomationWaitForInput } catch {} });
__vite_ssr_exportName__("PreviewAutomationElement", () => { try { return PreviewAutomationElement } catch {} });
__vite_ssr_exportName__("PreviewAutomationConsoleEntry", () => { try { return PreviewAutomationConsoleEntry } catch {} });
__vite_ssr_exportName__("PreviewAutomationNetworkEntry", () => { try { return PreviewAutomationNetworkEntry } catch {} });
__vite_ssr_exportName__("PreviewAutomationActionEvent", () => { try { return PreviewAutomationActionEvent } catch {} });
__vite_ssr_exportName__("PreviewAutomationSnapshot", () => { try { return PreviewAutomationSnapshot } catch {} });
__vite_ssr_exportName__("PreviewAutomationRecordingStatus", () => { try { return PreviewAutomationRecordingStatus } catch {} });
__vite_ssr_exportName__("PREVIEW_RECORDING_STOP_TIMEOUT_MS", () => { try { return PREVIEW_RECORDING_STOP_TIMEOUT_MS } catch {} });
__vite_ssr_exportName__("PreviewAutomationRecordingArtifact", () => { try { return PreviewAutomationRecordingArtifact } catch {} });
__vite_ssr_exportName__("PreviewAutomationClientId", () => { try { return PreviewAutomationClientId } catch {} });
__vite_ssr_exportName__("PreviewAutomationConnectionId", () => { try { return PreviewAutomationConnectionId } catch {} });
__vite_ssr_exportName__("PreviewAutomationHostIdentity", () => { try { return PreviewAutomationHostIdentity } catch {} });
__vite_ssr_exportName__("PreviewAutomationHost", () => { try { return PreviewAutomationHost } catch {} });
__vite_ssr_exportName__("PreviewAutomationHostFocus", () => { try { return PreviewAutomationHostFocus } catch {} });
__vite_ssr_exportName__("PreviewAutomationRequest", () => { try { return PreviewAutomationRequest } catch {} });
__vite_ssr_exportName__("PreviewAutomationStreamEvent", () => { try { return PreviewAutomationStreamEvent } catch {} });
__vite_ssr_exportName__("PreviewAutomationResponse", () => { try { return PreviewAutomationResponse } catch {} });
__vite_ssr_exportName__("PreviewAutomationUnavailableError", () => { try { return PreviewAutomationUnavailableError } catch {} });
__vite_ssr_exportName__("McpCapabilityUnavailableError", () => { try { return McpCapabilityUnavailableError } catch {} });
__vite_ssr_exportName__("SERVER_BROWSER_AUTOMATION_CLIENT_ID", () => { try { return SERVER_BROWSER_AUTOMATION_CLIENT_ID } catch {} });
__vite_ssr_exportName__("PreviewAutomationNoAvailableHostError", () => { try { return PreviewAutomationNoAvailableHostError } catch {} });
__vite_ssr_exportName__("PreviewAutomationUnsupportedClientError", () => { try { return PreviewAutomationUnsupportedClientError } catch {} });
__vite_ssr_exportName__("PreviewAutomationTabNotFoundError", () => { try { return PreviewAutomationTabNotFoundError } catch {} });
__vite_ssr_exportName__("PreviewAutomationTimeoutError", () => { try { return PreviewAutomationTimeoutError } catch {} });
__vite_ssr_exportName__("PreviewAutomationControlReason", () => { try { return PreviewAutomationControlReason } catch {} });
__vite_ssr_exportName__("PreviewAutomationControlInterruptedError", () => { try { return PreviewAutomationControlInterruptedError } catch {} });
__vite_ssr_exportName__("PreviewAutomationExecutionError", () => { try { return PreviewAutomationExecutionError } catch {} });
__vite_ssr_exportName__("PreviewAutomationInvalidSelectorError", () => { try { return PreviewAutomationInvalidSelectorError } catch {} });
__vite_ssr_exportName__("PreviewAutomationTargetNotEditableError", () => { try { return PreviewAutomationTargetNotEditableError } catch {} });
__vite_ssr_exportName__("PreviewAutomationResultTooLargeError", () => { try { return PreviewAutomationResultTooLargeError } catch {} });
__vite_ssr_exportName__("PreviewAutomationClientDisconnectedError", () => { try { return PreviewAutomationClientDisconnectedError } catch {} });
__vite_ssr_exportName__("PreviewAutomationRequestQueueClosedError", () => { try { return PreviewAutomationRequestQueueClosedError } catch {} });
__vite_ssr_exportName__("PreviewAutomationRemoteUnavailableError", () => { try { return PreviewAutomationRemoteUnavailableError } catch {} });
__vite_ssr_exportName__("PreviewAutomationMalformedResponseError", () => { try { return PreviewAutomationMalformedResponseError } catch {} });
__vite_ssr_exportName__("PreviewAutomationRecordingTransferError", () => { try { return PreviewAutomationRecordingTransferError } catch {} });
__vite_ssr_exportName__("PreviewAutomationRecordingDesktopUpdateRequiredError", () => { try { return PreviewAutomationRecordingDesktopUpdateRequiredError } catch {} });
__vite_ssr_exportName__("PreviewAutomationRecordingTooLargeError", () => { try { return PreviewAutomationRecordingTooLargeError } catch {} });
__vite_ssr_exportName__("PreviewAutomationRecordingDeadlineExpiredError", () => { try { return PreviewAutomationRecordingDeadlineExpiredError } catch {} });
__vite_ssr_exportName__("PreviewAutomationError", () => { try { return PreviewAutomationError } catch {} });
__vite_ssr_exportName__("PreviewUrlResolution", () => { try { return PreviewUrlResolution } catch {} });
const __vite_ssr_import_0__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/index.js", {"importedNames":["Schema"]});
const __vite_ssr_import_1__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/contracts/src/baseSchemas.ts", {"importedNames":["EnvironmentId","ThreadId","TrimmedNonEmptyString"]});
const __vite_ssr_import_2__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/contracts/src/preview.ts", {"importedNames":["PREVIEW_VIEWPORT_MAX_AREA","PreviewRenderedViewportSize","PreviewTabId","PreviewViewportPresetId","PreviewViewportSetting","PreviewViewportSize"]});
const __vite_ssr_import_3__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/contracts/src/providerInstance.ts", {"importedNames":["ProviderInstanceId"]});
const __vite_ssr_import_4__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/contracts/src/browserProfile.ts", {"importedNames":["BrowserProfileId"]});





const BoundedUrl = __vite_ssr_import_0__.Schema.String.check(__vite_ssr_import_0__.Schema.isTrimmed()).check(__vite_ssr_import_0__.Schema.isNonEmpty()).check(__vite_ssr_import_0__.Schema.isMaxLength(2048));
const URL_GUIDANCE = "Absolute http(s) URL or a schemeless host such as t3.chat or localhost:5173. Schemeless public hosts use https; loopback hosts use http.";
const PROFILE_GUIDANCE = "Browser profile for a new tab, by id or name (case-insensitive) from preview_status profiles. Omit to use the user's default profile. A tab keeps the profile it opened with.";
const OptionalTimeoutMs = __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Int.check(__vite_ssr_import_0__.Schema.isGreaterThan(0)).check(__vite_ssr_import_0__.Schema.isLessThanOrEqualTo(6e4)).annotate({ description: "Maximum wait in milliseconds. Defaults to 15000; maximum 60000." })).annotate({ description: "Maximum wait in milliseconds. Defaults to 15000; maximum 60000." });
const PREVIEW_AUTOMATION_V1_OPERATIONS = [
	"status",
	"open",
	"navigate",
	"snapshot",
	"click",
	"type",
	"press",
	"scroll",
	"evaluate",
	"waitFor",
	"recordingStart",
	"recordingStop"
];
const PREVIEW_AUTOMATION_OPERATIONS = [
	...PREVIEW_AUTOMATION_V1_OPERATIONS,
	"resize",
	"setColorScheme"
];
const PREVIEW_AUTOMATION_SERVER_OPERATIONS = [
	...PREVIEW_AUTOMATION_OPERATIONS,
	"dialog",
	"close",
	"upload",
	"hover",
	"select",
	"drag"
];
const PreviewAutomationOperation = __vite_ssr_import_0__.Schema.Literals(PREVIEW_AUTOMATION_SERVER_OPERATIONS);
const PreviewAutomationTabTargetFields = { tabId: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_2__.PreviewTabId.annotate({ description: "Exact collaborative browser tab to target, including a tab the user opened (see preview_status tabs). Omit to use this agent session's current tab, or the user's visible tab when this session has none." })).annotate({ description: "Exact collaborative browser tab to target, including a tab the user opened (see preview_status tabs). Omit to use this agent session's current tab, or the user's visible tab when this session has none." }) };
const PreviewAutomationTabTargetInput = __vite_ssr_import_0__.Schema.Struct(PreviewAutomationTabTargetFields);
const PreviewAutomationTabOwner = __vite_ssr_import_0__.Schema.Literals([
	"agent",
	"human",
	"unclaimed"
]);
const PreviewAutomationProfile = __vite_ssr_import_0__.Schema.Struct({
	id: __vite_ssr_import_4__.BrowserProfileId,
	name: __vite_ssr_import_0__.Schema.String,
	incognito: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Boolean)
});
const PreviewAutomationStatus = __vite_ssr_import_0__.Schema.Struct({
	available: __vite_ssr_import_0__.Schema.Boolean,
	visible: __vite_ssr_import_0__.Schema.Boolean,
	tabId: __vite_ssr_import_0__.Schema.NullOr((0,__vite_ssr_import_2__.PreviewTabId)),
	url: __vite_ssr_import_0__.Schema.NullOr(__vite_ssr_import_0__.Schema.String),
	title: __vite_ssr_import_0__.Schema.NullOr(__vite_ssr_import_0__.Schema.String),
	loading: __vite_ssr_import_0__.Schema.Boolean,
	control: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Struct({
		owner: PreviewAutomationTabOwner,
		ownedByCaller: __vite_ssr_import_0__.Schema.Boolean,
		generation: __vite_ssr_import_0__.Schema.Number
	})),
	dialog: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.NullOr(__vite_ssr_import_0__.Schema.Struct({
		type: __vite_ssr_import_0__.Schema.String,
		message: __vite_ssr_import_0__.Schema.String,
		defaultValue: __vite_ssr_import_0__.Schema.String
	}))),
	viewportSetting: __vite_ssr_import_0__.Schema.optional((0,__vite_ssr_import_2__.PreviewViewportSetting)),
	viewport: __vite_ssr_import_0__.Schema.optional((0,__vite_ssr_import_2__.PreviewRenderedViewportSize)),
	fileChooser: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.NullOr(__vite_ssr_import_0__.Schema.Struct({
		multiple: __vite_ssr_import_0__.Schema.Boolean,
		accept: __vite_ssr_import_0__.Schema.String
	}))),
	downloads: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Array(__vite_ssr_import_0__.Schema.Struct({
		fileName: __vite_ssr_import_0__.Schema.String,
		path: __vite_ssr_import_0__.Schema.String,
		sizeBytes: __vite_ssr_import_0__.Schema.Number,
		url: __vite_ssr_import_0__.Schema.String,
		completedAt: __vite_ssr_import_0__.Schema.String
	}))),
	/** Server hosts: all thread tabs are readable; actions require ownedByCaller or an unclaimed tab without human control. */
	tabs: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Array(__vite_ssr_import_0__.Schema.Struct({
		tabId: __vite_ssr_import_2__.PreviewTabId,
		url: __vite_ssr_import_0__.Schema.NullOr(__vite_ssr_import_0__.Schema.String),
		openerTabId: __vite_ssr_import_0__.Schema.optional((0,__vite_ssr_import_2__.PreviewTabId)),
		owner: __vite_ssr_import_0__.Schema.optional(PreviewAutomationTabOwner),
		ownedByCaller: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Boolean),
		visible: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Boolean),
		profileId: __vite_ssr_import_0__.Schema.optional((0,__vite_ssr_import_4__.BrowserProfileId))
	}))),
	profiles: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Array(PreviewAutomationProfile)),
	defaultProfileId: __vite_ssr_import_0__.Schema.optional((0,__vite_ssr_import_4__.BrowserProfileId))
});
const PreviewAutomationDialogInput = __vite_ssr_import_0__.Schema.Struct({
	...PreviewAutomationTabTargetFields,
	accept: __vite_ssr_import_0__.Schema.Boolean.annotate({ description: "Accept the pending browser dialog when true, or dismiss it when false." }),
	promptText: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.String).annotate({ description: "Optional text to submit when accepting a prompt dialog." })
});
const PreviewAutomationOpenInput = __vite_ssr_import_0__.Schema.Struct({
	...PreviewAutomationTabTargetFields,
	url: __vite_ssr_import_0__.Schema.optional(BoundedUrl).annotate({ description: `Optional initial page URL. ${URL_GUIDANCE} Omit to open a blank tab.` }),
	open: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Boolean.annotate({ description: "Whether to open the thread-bound inline preview for the human. Defaults to true; set false for background-only automation." })),
	show: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Boolean.annotate({ description: "Deprecated alias for open. Whether to reveal the thread-bound inline preview to the human." })),
	reuseExistingTab: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Boolean.annotate({ description: "Reuse tabId when supplied, otherwise this agent session's current tab. Defaults to true; set false to create a new tab." })),
	profileId: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_1__.TrimmedNonEmptyString.check(__vite_ssr_import_0__.Schema.isMaxLength(64)).annotate({ description: PROFILE_GUIDANCE })).annotate({ description: PROFILE_GUIDANCE })
}).check(__vite_ssr_import_0__.Schema.makeFilter((input) => !(input.tabId !== undefined && input.reuseExistingTab === false) || "tabId cannot be combined with reuseExistingTab=false.")).annotate({ description: "Opens the collaborative browser for the current thread. Use preview_navigate afterward when readiness waiting matters." });
const BrowserNavigationTarget = __vite_ssr_import_0__.Schema.Union([__vite_ssr_import_0__.Schema.Struct({
	kind: __vite_ssr_import_0__.Schema.Literal("url").annotate({ description: "Selects direct URL navigation." }),
	url: BoundedUrl.annotate({ description: `Direct website URL. ${URL_GUIDANCE}` })
}), __vite_ssr_import_0__.Schema.Struct({
	kind: __vite_ssr_import_0__.Schema.Literal("environment-port").annotate({ description: "Selects a dev-server port relative to the current execution environment." }),
	port: __vite_ssr_import_0__.Schema.Int.check(__vite_ssr_import_0__.Schema.isGreaterThan(0)).check(__vite_ssr_import_0__.Schema.isLessThan(65536)).annotate({ description: "Dev-server TCP port inside the current environment." }),
	protocol: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Literals(["http", "https"]).annotate({ description: "Dev-server protocol. Defaults to http." })),
	path: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.String.annotate({ description: "Optional path, query, and fragment, for example /settings?tab=account." }))
})]);
const PreviewAutomationNavigateInput = __vite_ssr_import_0__.Schema.Struct({
	...PreviewAutomationTabTargetFields,
	url: __vite_ssr_import_0__.Schema.optional(BoundedUrl).annotate({ description: `Website URL. ${URL_GUIDANCE} Use this for public pages and directly reachable URLs.` }),
	target: __vite_ssr_import_0__.Schema.optional(BrowserNavigationTarget.annotate({ description: "Environment-relative target. Prefer {kind:'environment-port',port:5173} for a dev server in the current environment." })).annotate({ description: "Environment-relative target. Prefer {kind:'environment-port',port:5173} for a dev server in the current environment." }),
	readiness: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Literals([
		"load",
		"domContentLoaded",
		"none"
	]).annotate({ description: "Readiness milestone before returning. 'load' waits for loading to stop (default), 'domContentLoaded' waits for an interactive document, and 'none' returns immediately." })).annotate({ description: "Readiness milestone before returning. 'load' is the default; use 'none' only when a later wait call will verify the page." }),
	timeoutMs: OptionalTimeoutMs
}).check(__vite_ssr_import_0__.Schema.makeFilter((input) => Number(input.url !== undefined) + Number(input.target !== undefined) === 1 || "Provide exactly one of url or target.")).annotate({ description: "Navigates the active browser tab. Provide exactly one of url or target; for most public pages use url." });
const PreviewAutomationResizeInput = __vite_ssr_import_0__.Schema.Struct({
	...PreviewAutomationTabTargetFields,
	mode: __vite_ssr_import_0__.Schema.Literals([
		"fill",
		"freeform",
		"preset"
	]).annotate({ description: "Viewport mode: fill follows the preview panel, freeform uses exact independently resizable dimensions, and preset uses a named device size." }),
	preset: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_2__.PreviewViewportPresetId.annotate({ description: "Named viewport from Chrome DevTools' standard device catalog." })).annotate({ description: "Named device size. Required only when mode is preset." }),
	width: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_2__.PreviewViewportSize.fields.width.annotate({ description: "Freeform viewport width in CSS pixels. Required only in freeform mode." })).annotate({ description: "Freeform viewport width in CSS pixels. Required only in freeform mode." }),
	height: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_2__.PreviewViewportSize.fields.height.annotate({ description: "Freeform viewport height in CSS pixels. Required only in freeform mode." })).annotate({ description: "Freeform viewport height in CSS pixels. Required only in freeform mode." }),
	orientation: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Literals(["portrait", "landscape"]).annotate({ description: "Orientation for a fixed device preset. Defaults to the preset's native orientation." })).annotate({ description: "Orientation for a named device preset. It is not accepted in fill or freeform mode." }),
	timeoutMs: OptionalTimeoutMs
}).check(__vite_ssr_import_0__.Schema.makeFilter((input) => {
	const hasPreset = input.preset !== undefined;
	const hasWidth = input.width !== undefined;
	const hasHeight = input.height !== undefined;
	if (hasWidth !== hasHeight) return "Custom dimensions require both width and height.";
	if (input.mode === "fill") {
		return !hasPreset && !hasWidth && input.orientation === undefined ? true : "Fill mode does not accept a preset, dimensions, or orientation.";
	};
	if (input.mode === "freeform") {
		if (!hasWidth || !hasHeight || hasPreset || input.orientation !== undefined) {
			return "Freeform mode requires width and height and does not accept a preset or orientation.";
		}
	} else if (!hasPreset || hasWidth || hasHeight) {
		return "Preset mode requires a preset and does not accept custom dimensions.";
	};
	if (hasWidth && hasHeight && input.width * input.height > __vite_ssr_import_2__.PREVIEW_VIEWPORT_MAX_AREA) {
		return `Custom viewport area must not exceed ${__vite_ssr_import_2__.PREVIEW_VIEWPORT_MAX_AREA} pixels.`;
	};
	return true;
})).annotate({ description: "Sets the active browser tab to fill-panel, independently resizable freeform, or named device-preset sizing." });
const PreviewAutomationResizeResult = __vite_ssr_import_0__.Schema.Struct({
	tabId: __vite_ssr_import_2__.PreviewTabId,
	setting: __vite_ssr_import_2__.PreviewViewportSetting,
	viewport: __vite_ssr_import_2__.PreviewRenderedViewportSize
});
// Mirrors DesktopPreviewColorScheme without importing ipc.ts.
const PreviewAutomationColorScheme = __vite_ssr_import_0__.Schema.Literals([
	"system",
	"light",
	"dark"
]);
const PreviewAutomationSetColorSchemeInput = __vite_ssr_import_0__.Schema.Struct({
	...PreviewAutomationTabTargetFields,
	colorScheme: PreviewAutomationColorScheme.annotate({ description: "Emulated prefers-color-scheme for the page: light, dark, or system to follow the OS appearance." })
}).annotate({ description: "Emulates prefers-color-scheme in the active browser tab without changing the OS or app theme." });
const PreviewAutomationSetColorSchemeResult = __vite_ssr_import_0__.Schema.Struct({
	tabId: __vite_ssr_import_2__.PreviewTabId,
	colorScheme: PreviewAutomationColorScheme
});
const Locator = __vite_ssr_import_1__.TrimmedNonEmptyString.annotate({ description: "Use locator='aria-ref=<ref>' with a ref from the latest server snapshot (including iframe elements), or a unique Playwright role/text selector. Refs expire on navigation, a new snapshot, or control handoff; refresh the snapshot after a stale-ref error." });
const LegacySelector = __vite_ssr_import_1__.TrimmedNonEmptyString.annotate({ description: "Legacy CSS selector such as button[type='submit']. Prefer locator for resilient role/text targeting." });
const PointerTargetFields = {
	...PreviewAutomationTabTargetFields,
	selector: __vite_ssr_import_0__.Schema.optional(LegacySelector).annotate({ description: "Legacy CSS selector such as button[type='submit']. Prefer locator for resilient role/text targeting." }),
	locator: __vite_ssr_import_0__.Schema.optional(Locator).annotate({ description: "Use locator='aria-ref=<ref>' with a ref from the latest server snapshot (including iframe elements), or a unique Playwright role/text selector. Refs expire on navigation, a new snapshot, or control handoff; refresh the snapshot after a stale-ref error." }),
	x: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Finite.annotate({ description: "Viewport-relative X coordinate in CSS pixels. Must be paired with y." })),
	y: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Finite.annotate({ description: "Viewport-relative Y coordinate in CSS pixels. Must be paired with x." })),
	timeoutMs: OptionalTimeoutMs
};
const singlePointerTarget = __vite_ssr_import_0__.Schema.makeFilter((input) => {
	const selectorModes = Number(input.selector !== undefined) + Number(input.locator !== undefined);
	const hasX = input.x !== undefined;
	const hasY = input.y !== undefined;
	if (hasX !== hasY) return "Coordinates require both x and y.";
	const coordinateModes = hasX && hasY ? 1 : 0;
	return selectorModes + coordinateModes === 1 || "Provide exactly one target.";
});
const PreviewAutomationClickInput = __vite_ssr_import_0__.Schema.Struct({
	...PointerTargetFields,
	button: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Literals([
		"left",
		"right",
		"middle"
	]).annotate({ description: "Mouse button. Defaults to left; right opens the page's context menu." })),
	clickCount: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Int.check(__vite_ssr_import_0__.Schema.isBetween({
		minimum: 1,
		maximum: 3
	})).annotate({ description: "1 for a click, 2 for a double-click, 3 for a triple-click. Defaults to 1." }))
}).check(singlePointerTarget).annotate({ description: "Clicks one target. Provide exactly one of locator, selector, or the x/y coordinate pair." });
const PreviewAutomationHoverInput = __vite_ssr_import_0__.Schema.Struct(PointerTargetFields).check(singlePointerTarget).annotate({ description: "Moves the mouse over one target. Provide exactly one of locator, selector, or the x/y coordinate pair." });
const PreviewAutomationSelectInput = __vite_ssr_import_0__.Schema.Struct({
	...PreviewAutomationTabTargetFields,
	selector: __vite_ssr_import_0__.Schema.optional(LegacySelector).annotate({ description: "Legacy CSS selector for a <select>. Prefer locator." }),
	locator: __vite_ssr_import_0__.Schema.optional(Locator).annotate({ description: "The <select> element, for example aria-ref=<ref> or role=combobox[name='Size']." }),
	values: __vite_ssr_import_0__.Schema.Array(__vite_ssr_import_0__.Schema.String).check(__vite_ssr_import_0__.Schema.isMaxLength(100)).annotate({ description: "Option values or visible labels to select. Pass several for a multiple select, or an empty list to clear it." }),
	timeoutMs: OptionalTimeoutMs
}).check(__vite_ssr_import_0__.Schema.makeFilter((input) => Number(input.selector !== undefined) + Number(input.locator !== undefined) === 1 || "Provide exactly one of selector or locator.")).annotate({ description: "Chooses options in one native <select> element." });
const PreviewAutomationSelectResult = __vite_ssr_import_0__.Schema.Struct({ selected: __vite_ssr_import_0__.Schema.Array(__vite_ssr_import_0__.Schema.String).annotate({ description: "The values of the options now selected." }) });
/** Its JSON schema keeps only the description on its last check. */
const DescribedLocator = (description) => __vite_ssr_import_0__.Schema.String.check(__vite_ssr_import_0__.Schema.isTrimmed()).check(__vite_ssr_import_0__.Schema.isNonEmpty({ description })).annotateKey({ description });
const PreviewAutomationDragInput = __vite_ssr_import_0__.Schema.Struct({
	...PreviewAutomationTabTargetFields,
	source: DescribedLocator("Locator of the element to drag, for example aria-ref=<ref> from the latest snapshot."),
	target: DescribedLocator("Locator of the element to drop onto, for example aria-ref=<ref>."),
	timeoutMs: OptionalTimeoutMs
}).annotate({ description: "Drags one element and drops it onto another." });
const PreviewAutomationUploadInput = __vite_ssr_import_0__.Schema.Struct({
	...PreviewAutomationTabTargetFields,
	paths: __vite_ssr_import_0__.Schema.Array((0,__vite_ssr_import_1__.TrimmedNonEmptyString)).check(__vite_ssr_import_0__.Schema.isMaxLength(20)).annotate({ description: "Absolute paths of files on the environment to give the page. An empty list cancels the open file picker." }),
	selector: __vite_ssr_import_0__.Schema.optional(LegacySelector).annotate({ description: "Legacy CSS selector for an <input type=file>. Prefer locator." }),
	locator: __vite_ssr_import_0__.Schema.optional(Locator).annotate({ description: "Set files directly on this <input type=file> instead of answering the open file picker." }),
	timeoutMs: OptionalTimeoutMs
}).check(__vite_ssr_import_0__.Schema.makeFilter((input) => !(input.selector !== undefined && input.locator !== undefined) || "Provide at most one of selector or locator.")).annotate({ description: "Answers the page's open file picker, or sets files on a file input when locator/selector is given." });
const PreviewAutomationTypeInput = __vite_ssr_import_0__.Schema.Struct({
	...PreviewAutomationTabTargetFields,
	text: __vite_ssr_import_0__.Schema.String.annotate({ description: "Literal text to insert." }),
	selector: __vite_ssr_import_0__.Schema.optional(LegacySelector).annotate({ description: "Legacy CSS selector for the input. Prefer locator." }),
	locator: __vite_ssr_import_0__.Schema.optional(Locator).annotate({ description: "Playwright selector for the input, for example role=textbox[name='Message'] or textarea[placeholder*='Message']." }),
	clear: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Boolean.annotate({ description: "Clear the existing input value before inserting text. Defaults to false." })),
	timeoutMs: OptionalTimeoutMs
}).check(__vite_ssr_import_0__.Schema.makeFilter((input) => !(input.selector !== undefined && input.locator !== undefined) || "Provide at most one of selector or locator.")).annotate({ description: "Types into locator/selector, or into the currently focused element when neither target is provided." });
const PreviewAutomationPressInput = __vite_ssr_import_0__.Schema.Struct({
	...PreviewAutomationTabTargetFields,
	key: __vite_ssr_import_0__.Schema.String.check(__vite_ssr_import_0__.Schema.isTrimmed()).check(__vite_ssr_import_0__.Schema.isNonEmpty({ description: "Keyboard key name such as Enter, Escape, Tab, ArrowDown, Backspace, or a single character." })).annotateKey({ description: "Keyboard key name such as Enter, Escape, Tab, ArrowDown, Backspace, or a single character." }),
	modifiers: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Array(__vite_ssr_import_0__.Schema.Literals([
		"Alt",
		"Control",
		"Meta",
		"Shift"
	])).annotate({ description: "Modifier keys held while pressing key." }))
}).annotate({ description: "Presses one keyboard key in the active browser tab." });
const PreviewAutomationScrollInput = __vite_ssr_import_0__.Schema.Struct({
	...PreviewAutomationTabTargetFields,
	deltaX: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Finite.annotate({ description: "Horizontal scroll delta in CSS pixels. Positive scrolls right. Defaults to 0." })),
	deltaY: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Finite.annotate({ description: "Vertical scroll delta in CSS pixels. Positive scrolls down. Defaults to 0." })),
	selector: __vite_ssr_import_0__.Schema.optional(LegacySelector).annotate({ description: "Legacy CSS selector for a scrollable container. Omit to scroll the viewport." }),
	locator: __vite_ssr_import_0__.Schema.optional(Locator).annotate({ description: "Playwright selector for a scrollable container. Omit to scroll the viewport." })
}).check(__vite_ssr_import_0__.Schema.makeFilter((input) => {
	if (input.selector !== undefined && input.locator !== undefined) {
		return "Provide at most one of selector or locator.";
	};
	return input.deltaX !== undefined || input.deltaY !== undefined || "Provide deltaX or deltaY.";
})).annotate({ description: "Scrolls the viewport, or a locator/selector container. Provide deltaX, deltaY, or both." });
const PreviewAutomationEvaluateInput = __vite_ssr_import_0__.Schema.Struct({
	...PreviewAutomationTabTargetFields,
	expression: __vite_ssr_import_0__.Schema.String.check(__vite_ssr_import_0__.Schema.isTrimmed()).check(__vite_ssr_import_0__.Schema.isNonEmpty({ description: "JavaScript expression evaluated in the page's main frame, for example document.title or (() => ({href: location.href}))()." })).check(__vite_ssr_import_0__.Schema.isMaxLength(64e3)).annotateKey({ description: "JavaScript expression evaluated in the page's main frame, for example document.title or (() => ({href: location.href}))()." }),
	awaitPromise: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Boolean.annotate({ description: "Await a returned Promise. Defaults to true." })),
	returnByValue: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Boolean.annotate({ description: "Serialize and return the value instead of a remote object reference. Defaults to true." }))
}).annotate({ description: "Evaluates JavaScript in the page. Prefer snapshot and semantic actions; use evaluate for inspection or unsupported interactions." });
const PreviewAutomationWaitForInput = __vite_ssr_import_0__.Schema.Struct({
	...PreviewAutomationTabTargetFields,
	selector: __vite_ssr_import_0__.Schema.optional(LegacySelector).annotate({ description: "Legacy CSS selector that must match an element. Prefer locator." }),
	locator: __vite_ssr_import_0__.Schema.optional(Locator).annotate({ description: "Playwright selector that must match an element, for example role=button[name='Send']." }),
	text: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_1__.TrimmedNonEmptyString.annotate({ description: "Case-sensitive substring that must appear in visible document text." })).annotate({ description: "Case-sensitive substring that must appear in visible document text." }),
	urlIncludes: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_1__.TrimmedNonEmptyString.annotate({ description: "Substring that must appear in the current absolute URL." })).annotate({ description: "Substring that must appear in the current absolute URL." }),
	timeoutMs: OptionalTimeoutMs
}).check(__vite_ssr_import_0__.Schema.makeFilter((input) => {
	if (input.selector !== undefined && input.locator !== undefined) {
		return "Provide at most one of selector or locator.";
	};
	return input.selector !== undefined || input.locator !== undefined || input.text !== undefined || input.urlIncludes !== undefined || "Provide at least one wait condition.";
})).annotate({ description: "Waits until all provided conditions match. Use after click/type when the page changes asynchronously." });
const PreviewAutomationElement = __vite_ssr_import_0__.Schema.Struct({
	tag: __vite_ssr_import_0__.Schema.String,
	role: __vite_ssr_import_0__.Schema.NullOr(__vite_ssr_import_0__.Schema.String),
	name: __vite_ssr_import_0__.Schema.String,
	selector: __vite_ssr_import_0__.Schema.String,
	x: __vite_ssr_import_0__.Schema.Number,
	y: __vite_ssr_import_0__.Schema.Number,
	width: __vite_ssr_import_0__.Schema.Number,
	height: __vite_ssr_import_0__.Schema.Number
});
const PreviewAutomationConsoleEntry = __vite_ssr_import_0__.Schema.Struct({
	level: __vite_ssr_import_0__.Schema.String,
	text: __vite_ssr_import_0__.Schema.String,
	timestamp: __vite_ssr_import_0__.Schema.String,
	source: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.String)
});
const PreviewAutomationNetworkEntry = __vite_ssr_import_0__.Schema.Struct({
	url: __vite_ssr_import_0__.Schema.String,
	method: __vite_ssr_import_0__.Schema.String,
	status: __vite_ssr_import_0__.Schema.NullOr(__vite_ssr_import_0__.Schema.Number),
	failed: __vite_ssr_import_0__.Schema.Boolean,
	errorText: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.String),
	timestamp: __vite_ssr_import_0__.Schema.String
});
const PreviewAutomationActionEvent = __vite_ssr_import_0__.Schema.Struct({
	id: __vite_ssr_import_0__.Schema.String,
	action: __vite_ssr_import_0__.Schema.String,
	status: __vite_ssr_import_0__.Schema.Literals([
		"running",
		"succeeded",
		"failed",
		"interrupted"
	]),
	startedAt: __vite_ssr_import_0__.Schema.String,
	completedAt: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.String),
	error: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.String)
});
const PreviewAutomationSnapshot = __vite_ssr_import_0__.Schema.Struct({
	url: __vite_ssr_import_0__.Schema.String,
	title: __vite_ssr_import_0__.Schema.String,
	loading: __vite_ssr_import_0__.Schema.Boolean,
	visibleText: __vite_ssr_import_0__.Schema.String,
	interactiveElements: __vite_ssr_import_0__.Schema.Array(PreviewAutomationElement),
	accessibilityTree: __vite_ssr_import_0__.Schema.Unknown,
	consoleEntries: __vite_ssr_import_0__.Schema.Array(PreviewAutomationConsoleEntry),
	networkEntries: __vite_ssr_import_0__.Schema.Array(PreviewAutomationNetworkEntry),
	actionTimeline: __vite_ssr_import_0__.Schema.Array(PreviewAutomationActionEvent),
	screenshot: __vite_ssr_import_0__.Schema.Struct({
		mimeType: __vite_ssr_import_0__.Schema.Literal("image/png"),
		data: __vite_ssr_import_0__.Schema.String,
		width: __vite_ssr_import_0__.Schema.Int,
		height: __vite_ssr_import_0__.Schema.Int
	})
});
const PreviewAutomationRecordingStatus = __vite_ssr_import_0__.Schema.Struct({
	tabId: __vite_ssr_import_2__.PreviewTabId,
	recording: __vite_ssr_import_0__.Schema.Boolean,
	startedAt: __vite_ssr_import_0__.Schema.NullOr(__vite_ssr_import_0__.Schema.String)
});
const PREVIEW_RECORDING_STOP_TIMEOUT_MS = 12e4;
const PreviewAutomationRecordingArtifact = __vite_ssr_import_0__.Schema.Struct({
	id: __vite_ssr_import_0__.Schema.String,
	tabId: __vite_ssr_import_2__.PreviewTabId,
	path: __vite_ssr_import_0__.Schema.String,
	mimeType: __vite_ssr_import_0__.Schema.String,
	sizeBytes: __vite_ssr_import_0__.Schema.Int,
	createdAt: __vite_ssr_import_0__.Schema.String
});
const PreviewAutomationClientId = __vite_ssr_import_1__.TrimmedNonEmptyString.check(__vite_ssr_import_0__.Schema.isMaxLength(128));
const PreviewAutomationConnectionId = __vite_ssr_import_1__.TrimmedNonEmptyString.check(__vite_ssr_import_0__.Schema.isMaxLength(64));
const PreviewAutomationHostIdentity = __vite_ssr_import_0__.Schema.Struct({
	clientId: PreviewAutomationClientId,
	environmentId: __vite_ssr_import_1__.EnvironmentId
});
const PreviewAutomationHost = __vite_ssr_import_0__.Schema.Struct({
	...PreviewAutomationHostIdentity.fields,
	/** Missing means the V1 operation set from before capability negotiation. */
	supportedOperations: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Array(PreviewAutomationOperation))
});
const PreviewAutomationHostFocus = __vite_ssr_import_0__.Schema.Struct({
	...PreviewAutomationHostIdentity.fields,
	connectionId: PreviewAutomationConnectionId,
	focused: __vite_ssr_import_0__.Schema.Boolean,
	liveTabs: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Array(__vite_ssr_import_0__.Schema.Struct({
		threadId: __vite_ssr_import_1__.ThreadId,
		tabId: __vite_ssr_import_2__.PreviewTabId,
		visible: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Boolean)
	})))
});
const PreviewAutomationRequest = __vite_ssr_import_0__.Schema.Struct({
	requestId: __vite_ssr_import_1__.TrimmedNonEmptyString,
	threadId: __vite_ssr_import_1__.ThreadId,
	tabId: __vite_ssr_import_0__.Schema.optional((0,__vite_ssr_import_2__.PreviewTabId)),
	tabIdExplicit: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Boolean),
	/** Supplied by the broker from authenticated scope, never from tool input. */
	agentSessionId: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.String),
	operation: PreviewAutomationOperation,
	input: __vite_ssr_import_0__.Schema.Unknown,
	timeoutMs: __vite_ssr_import_0__.Schema.Int.check(__vite_ssr_import_0__.Schema.isGreaterThan(0))
});
const PreviewAutomationStreamEvent = __vite_ssr_import_0__.Schema.Union([__vite_ssr_import_0__.Schema.Struct({
	type: __vite_ssr_import_0__.Schema.Literal("connected"),
	connectionId: PreviewAutomationConnectionId
}), __vite_ssr_import_0__.Schema.Struct({
	type: __vite_ssr_import_0__.Schema.Literal("request"),
	connectionId: PreviewAutomationConnectionId,
	request: PreviewAutomationRequest
})]);
const PreviewAutomationResponse = __vite_ssr_import_0__.Schema.Struct({
	clientId: PreviewAutomationClientId,
	connectionId: PreviewAutomationConnectionId,
	requestId: __vite_ssr_import_1__.TrimmedNonEmptyString,
	ok: __vite_ssr_import_0__.Schema.Boolean,
	result: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Unknown),
	error: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Struct({
		_tag: __vite_ssr_import_1__.TrimmedNonEmptyString,
		message: __vite_ssr_import_0__.Schema.String,
		detail: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Unknown)
	}))
});
const McpCapabilityErrorFields = {
	environmentId: __vite_ssr_import_1__.EnvironmentId,
	threadId: __vite_ssr_import_0__.Schema.optional((0,__vite_ssr_import_1__.ThreadId)),
	providerSessionId: __vite_ssr_import_0__.Schema.optional((0,__vite_ssr_import_1__.TrimmedNonEmptyString)),
	providerInstanceId: __vite_ssr_import_0__.Schema.optional((0,__vite_ssr_import_3__.ProviderInstanceId))
};
class PreviewAutomationUnavailableError extends __vite_ssr_import_0__.Schema.TaggedError()("PreviewAutomationUnavailableError", {
	capability: __vite_ssr_import_0__.Schema.Literal("preview"),
	...McpCapabilityErrorFields
}) {
	get message() {
		return `MCP credential does not grant the ${this.capability} capability: browser preview tools are off for this thread. Do not retry them. To check a page, use a headless browser from the shell, such as Playwright, or curl. The user can turn on "Agent browser access" in Settings; it applies when the agent session next starts.`;
	}
};
class McpCapabilityUnavailableError extends __vite_ssr_import_0__.Schema.TaggedError()("McpCapabilityUnavailableError", {
	capability: __vite_ssr_import_1__.TrimmedNonEmptyString,
	...McpCapabilityErrorFields
}) {
	get message() {
		return `MCP credential does not grant the ${this.capability} capability.`;
	}
};
const PreviewAutomationScopeErrorFields = {
	operation: PreviewAutomationOperation,
	environmentId: __vite_ssr_import_1__.EnvironmentId,
	threadId: __vite_ssr_import_1__.ThreadId,
	providerSessionId: __vite_ssr_import_1__.TrimmedNonEmptyString,
	providerInstanceId: __vite_ssr_import_3__.ProviderInstanceId
};
const SERVER_BROWSER_AUTOMATION_CLIENT_ID = "server-browser";
const PreviewAutomationRequestErrorFields = {
	...PreviewAutomationScopeErrorFields,
	clientId: __vite_ssr_import_1__.TrimmedNonEmptyString,
	connectionId: PreviewAutomationConnectionId,
	requestId: __vite_ssr_import_1__.TrimmedNonEmptyString,
	tabId: __vite_ssr_import_0__.Schema.optional((0,__vite_ssr_import_2__.PreviewTabId)),
	timeoutMs: __vite_ssr_import_0__.Schema.Int.check(__vite_ssr_import_0__.Schema.isGreaterThan(0))
};
const PreviewAutomationRemoteDiagnosticFields = {
	remoteTag: __vite_ssr_import_1__.TrimmedNonEmptyString,
	remoteMessageLength: __vite_ssr_import_0__.Schema.Int.check(__vite_ssr_import_0__.Schema.isGreaterThanOrEqualTo(0)),
	remoteDetailKind: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Literals([
		"null",
		"array",
		"object",
		"string",
		"number",
		"boolean"
	])),
	cause: __vite_ssr_import_0__.Schema.Defect()
};
const PreviewAutomationOptionalRemoteDiagnosticFields = {
	remoteTag: __vite_ssr_import_0__.Schema.optional((0,__vite_ssr_import_1__.TrimmedNonEmptyString)),
	remoteMessageLength: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Int.check(__vite_ssr_import_0__.Schema.isGreaterThanOrEqualTo(0))),
	remoteDetailKind: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Literals([
		"null",
		"array",
		"object",
		"string",
		"number",
		"boolean"
	])),
	cause: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Defect())
};
class PreviewAutomationNoAvailableHostError extends __vite_ssr_import_0__.Schema.TaggedError()("PreviewAutomationNoAvailableHostError", {
	...PreviewAutomationScopeErrorFields,
	clientId: __vite_ssr_import_0__.Schema.optional((0,__vite_ssr_import_1__.TrimmedNonEmptyString)),
	connectionId: __vite_ssr_import_0__.Schema.optional(PreviewAutomationConnectionId),
	requestId: __vite_ssr_import_0__.Schema.optional((0,__vite_ssr_import_1__.TrimmedNonEmptyString)),
	tabId: __vite_ssr_import_0__.Schema.optional((0,__vite_ssr_import_2__.PreviewTabId)),
	timeoutMs: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Int.check(__vite_ssr_import_0__.Schema.isGreaterThan(0))),
	...PreviewAutomationOptionalRemoteDiagnosticFields
}) {
	get message() {
		return `No preview automation host is available for ${this.operation} in environment ${this.environmentId}. The server-owned browser may be starting or reconnecting. Retry preview_status, then call preview_open if no tab is available. If it remains unavailable, report the browser connection failure.`;
	}
};
class PreviewAutomationUnsupportedClientError extends __vite_ssr_import_0__.Schema.TaggedError()("PreviewAutomationUnsupportedClientError", {
	...PreviewAutomationRequestErrorFields,
	...PreviewAutomationRemoteDiagnosticFields
}) {
	get message() {
		return `Preview automation client ${this.clientId} does not support ${this.operation}.`;
	}
};
class PreviewAutomationTabNotFoundError extends __vite_ssr_import_0__.Schema.TaggedError()("PreviewAutomationTabNotFoundError", {
	...PreviewAutomationRequestErrorFields,
	...PreviewAutomationRemoteDiagnosticFields
}) {
	get message() {
		return this.tabId ? `Preview tab ${this.tabId} was not found for ${this.operation}. Omit tabId to use the current tab, or call preview_open.` : `No active preview tab was found for ${this.operation}. Call preview_open first.`;
	}
};
class PreviewAutomationTimeoutError extends __vite_ssr_import_0__.Schema.TaggedError()("PreviewAutomationTimeoutError", {
	...PreviewAutomationRequestErrorFields,
	...PreviewAutomationOptionalRemoteDiagnosticFields
}) {
	get message() {
		const summary = `Preview automation ${this.operation} timed out after ${this.timeoutMs}ms.`;
		return summary;
	}
};
const PreviewAutomationControlReason = __vite_ssr_import_0__.Schema.Literals([
	"agentMismatch",
	"humanControl",
	"tabRequired",
	"closed",
	"interrupted",
	"dialogPending",
	"tabLimit"
]);
class PreviewAutomationControlInterruptedError extends __vite_ssr_import_0__.Schema.TaggedError()("PreviewAutomationControlInterruptedError", {
	...PreviewAutomationRequestErrorFields,
	...PreviewAutomationRemoteDiagnosticFields,
	reason: __vite_ssr_import_0__.Schema.optional(PreviewAutomationControlReason)
}) {
	get message() {
		if (this.reason === "agentMismatch") return "This browser tab belongs to another agent session or a human. Open your own tab.";
		if (this.reason === "humanControl") return "A human controls this browser tab. Wait until they release control.";
		if (this.reason === "tabRequired") return "Multiple browser tabs belong to this session. Pass a tabId from preview_open or from the tabs listed by preview_status.";
		if (this.reason === "dialogPending") return "A browser dialog is pending. Read preview_status and resolve it with preview_dialog.";
		if (this.reason === "tabLimit") return "Too many server browser tabs are open. Close one with t3_preview_close, or reuse a tabId from preview_status tabs.";
		if (this.reason === "closed") return "This browser tab is closed. Call preview_open.";
		if (this.reason === "interrupted") return "Browser control changed. Take a fresh snapshot before trying again.";
		return `Preview automation ${this.operation} was interrupted on client ${this.clientId}.`;
	}
};
class PreviewAutomationExecutionError extends __vite_ssr_import_0__.Schema.TaggedError()("PreviewAutomationExecutionError", {
	...PreviewAutomationRequestErrorFields,
	...PreviewAutomationRemoteDiagnosticFields,
	reason: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.String)
}) {
	get message() {
		return this.reason === undefined ? `Preview automation ${this.operation} failed on client ${this.clientId}.` : `Preview automation ${this.operation} failed: ${this.reason}`;
	}
};
class PreviewAutomationInvalidSelectorError extends __vite_ssr_import_0__.Schema.TaggedError()("PreviewAutomationInvalidSelectorError", {
	...PreviewAutomationRequestErrorFields,
	...PreviewAutomationRemoteDiagnosticFields,
	selectorKind: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Literals(["locator", "selector"])),
	selectorLength: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Int.check(__vite_ssr_import_0__.Schema.isGreaterThanOrEqualTo(0))),
	staleRef: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Boolean)
}) {
	get message() {
		if (this.staleRef) return "This element ref is stale. Navigation, dialogs, and new snapshots replace refs; take a fresh snapshot and use its refs.";
		if (this.selectorKind !== undefined && this.selectorLength !== undefined) {
			return `Preview automation ${this.operation} received an invalid ${this.selectorKind} (${this.selectorLength} characters).`;
		};
		return `Preview automation ${this.operation} received an invalid selector.`;
	}
};
class PreviewAutomationTargetNotEditableError extends __vite_ssr_import_0__.Schema.TaggedError()("PreviewAutomationTargetNotEditableError", {
	...PreviewAutomationRequestErrorFields,
	...PreviewAutomationRemoteDiagnosticFields,
	selectorKind: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Literals([
		"focused-element",
		"locator",
		"selector"
	])),
	selectorLength: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Int.check(__vite_ssr_import_0__.Schema.isGreaterThanOrEqualTo(0)))
}) {
	get message() {
		if (this.selectorKind === "focused-element") {
			return `Preview automation ${this.operation} requires an editable focused element.`;
		};
		if (this.selectorKind !== undefined && this.selectorLength !== undefined) {
			return `Preview automation ${this.operation} requires an editable ${this.selectorKind} (${this.selectorLength} characters).`;
		};
		return `Preview automation ${this.operation} requires an editable target.`;
	}
};
class PreviewAutomationResultTooLargeError extends __vite_ssr_import_0__.Schema.TaggedError()("PreviewAutomationResultTooLargeError", {
	...PreviewAutomationRequestErrorFields,
	...PreviewAutomationRemoteDiagnosticFields,
	maximumBytes: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Int.check(__vite_ssr_import_0__.Schema.isGreaterThan(0)))
}) {
	get message() {
		const summary = this.maximumBytes === undefined ? `Preview automation ${this.operation} produced a result that is too large.` : `Preview automation ${this.operation} produced a result larger than ${this.maximumBytes} bytes.`;
		return summary;
	}
};
class PreviewAutomationClientDisconnectedError extends __vite_ssr_import_0__.Schema.TaggedError()("PreviewAutomationClientDisconnectedError", PreviewAutomationRequestErrorFields) {
	get message() {
		return `Preview automation client ${this.clientId} disconnected during ${this.operation}.`;
	}
};
class PreviewAutomationRequestQueueClosedError extends __vite_ssr_import_0__.Schema.TaggedError()("PreviewAutomationRequestQueueClosedError", PreviewAutomationRequestErrorFields) {
	get message() {
		return `Preview automation client ${this.clientId} stopped accepting ${this.operation} requests.`;
	}
};
class PreviewAutomationRemoteUnavailableError extends __vite_ssr_import_0__.Schema.TaggedError()("PreviewAutomationRemoteUnavailableError", {
	...PreviewAutomationRequestErrorFields,
	...PreviewAutomationRemoteDiagnosticFields
}) {
	get message() {
		return `Preview automation ${this.operation} is unavailable on client ${this.clientId}.`;
	}
};
class PreviewAutomationMalformedResponseError extends __vite_ssr_import_0__.Schema.TaggedError()("PreviewAutomationMalformedResponseError", PreviewAutomationRequestErrorFields) {
	get message() {
		return `Preview automation client ${this.clientId} returned a malformed response for ${this.operation}.`;
	}
};
class PreviewAutomationRecordingTransferError extends __vite_ssr_import_0__.Schema.TaggedError()("PreviewAutomationRecordingTransferError", {
	threadId: __vite_ssr_import_1__.ThreadId,
	cause: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Defect())
}) {
	get message() {
		return "Preview recording could not be saved to the agent environment.";
	}
};
class PreviewAutomationRecordingDesktopUpdateRequiredError extends __vite_ssr_import_0__.Schema.TaggedError()("PreviewAutomationRecordingDesktopUpdateRequiredError", {
	threadId: __vite_ssr_import_1__.ThreadId,
	cause: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Defect())
}) {
	get message() {
		return "Update the desktop app to transfer recordings. The recording remains on the desktop.";
	}
};
class PreviewAutomationRecordingTooLargeError extends __vite_ssr_import_0__.Schema.TaggedError()("PreviewAutomationRecordingTooLargeError", {
	threadId: __vite_ssr_import_1__.ThreadId,
	cause: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Defect())
}) {
	get message() {
		return "The recording exceeds 50 MiB. Make a shorter recording.";
	}
};
class PreviewAutomationRecordingDeadlineExpiredError extends __vite_ssr_import_0__.Schema.TaggedError()("PreviewAutomationRecordingDeadlineExpiredError", {
	threadId: __vite_ssr_import_1__.ThreadId,
	cause: __vite_ssr_import_0__.Schema.optional(__vite_ssr_import_0__.Schema.Defect())
}) {
	get message() {
		return "The recording transfer deadline expired.";
	}
};
const PreviewAutomationError = __vite_ssr_import_0__.Schema.Union([
	PreviewAutomationRecordingTransferError,
	PreviewAutomationRecordingDesktopUpdateRequiredError,
	PreviewAutomationRecordingTooLargeError,
	PreviewAutomationRecordingDeadlineExpiredError,
	PreviewAutomationUnavailableError,
	PreviewAutomationNoAvailableHostError,
	PreviewAutomationUnsupportedClientError,
	PreviewAutomationTabNotFoundError,
	PreviewAutomationTimeoutError,
	PreviewAutomationControlInterruptedError,
	PreviewAutomationExecutionError,
	PreviewAutomationInvalidSelectorError,
	PreviewAutomationTargetNotEditableError,
	PreviewAutomationResultTooLargeError,
	PreviewAutomationClientDisconnectedError,
	PreviewAutomationRequestQueueClosedError,
	PreviewAutomationRemoteUnavailableError,
	PreviewAutomationMalformedResponseError
]);
const PreviewUrlResolution = __vite_ssr_import_0__.Schema.Struct({
	requestedUrl: __vite_ssr_import_0__.Schema.String,
	resolvedUrl: __vite_ssr_import_0__.Schema.String,
	resolutionKind: __vite_ssr_import_0__.Schema.Literals(["direct", "direct-private-network"]),
	environmentId: __vite_ssr_import_1__.EnvironmentId
});
//# sourceMappingSource=vite-generated
//# sourceMappingURL=data:application/json;base64,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QkFBTyxNQUFNO0NBQ2pEO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtBQUNGLENBQUM7QUFHTSxNQUFNLHVCQUF1Qiw2QkFBTyxPQUFPO0NBQ2hELGNBQWMsNkJBQU87Q0FDckIsYUFBYSw2QkFBTztDQUNwQixnQkFBZ0IsNkJBQU8sU0FBUyxDQUFDLFVBQVUsd0JBQXdCLENBQUM7Q0FDcEUsZUFBZTtBQUNqQixDQUFDIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJwcmV2aWV3QXV0b21hdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTY2hlbWEgfSBmcm9tIFwiZWZmZWN0XCI7XG5cbmltcG9ydCB7IEVudmlyb25tZW50SWQsIFRocmVhZElkLCBUcmltbWVkTm9uRW1wdHlTdHJpbmcgfSBmcm9tIFwiLi9iYXNlU2NoZW1hcy50c1wiO1xuaW1wb3J0IHtcbiAgUFJFVklFV19WSUVXUE9SVF9NQVhfQVJFQSxcbiAgUHJldmlld1JlbmRlcmVkVmlld3BvcnRTaXplLFxuICBQcmV2aWV3VGFiSWQsXG4gIFByZXZpZXdWaWV3cG9ydFByZXNldElkLFxuICBQcmV2aWV3Vmlld3BvcnRTZXR0aW5nLFxuICBQcmV2aWV3Vmlld3BvcnRTaXplLFxufSBmcm9tIFwiLi9wcmV2aWV3LnRzXCI7XG5pbXBvcnQgeyBQcm92aWRlckluc3RhbmNlSWQgfSBmcm9tIFwiLi9wcm92aWRlckluc3RhbmNlLnRzXCI7XG5pbXBvcnQgeyBCcm93c2VyUHJvZmlsZUlkIH0gZnJvbSBcIi4vYnJvd3NlclByb2ZpbGUudHNcIjtcblxuY29uc3QgQm91bmRlZFVybCA9IFNjaGVtYS5TdHJpbmcuY2hlY2soU2NoZW1hLmlzVHJpbW1lZCgpKVxuICAuY2hlY2soU2NoZW1hLmlzTm9uRW1wdHkoKSlcbiAgLmNoZWNrKFNjaGVtYS5pc01heExlbmd0aCgyMDQ4KSk7XG5jb25zdCBVUkxfR1VJREFOQ0UgPVxuICBcIkFic29sdXRlIGh0dHAocykgVVJMIG9yIGEgc2NoZW1lbGVzcyBob3N0IHN1Y2ggYXMgdDMuY2hhdCBvciBsb2NhbGhvc3Q6NTE3My4gU2NoZW1lbGVzcyBwdWJsaWMgaG9zdHMgdXNlIGh0dHBzOyBsb29wYmFjayBob3N0cyB1c2UgaHR0cC5cIjtcbmNvbnN0IFBST0ZJTEVfR1VJREFOQ0UgPVxuICBcIkJyb3dzZXIgcHJvZmlsZSBmb3IgYSBuZXcgdGFiLCBieSBpZCBvciBuYW1lIChjYXNlLWluc2Vuc2l0aXZlKSBmcm9tIHByZXZpZXdfc3RhdHVzIHByb2ZpbGVzLiBPbWl0IHRvIHVzZSB0aGUgdXNlcidzIGRlZmF1bHQgcHJvZmlsZS4gQSB0YWIga2VlcHMgdGhlIHByb2ZpbGUgaXQgb3BlbmVkIHdpdGguXCI7XG5jb25zdCBPcHRpb25hbFRpbWVvdXRNcyA9IFNjaGVtYS5vcHRpb25hbChcbiAgU2NoZW1hLkludC5jaGVjayhTY2hlbWEuaXNHcmVhdGVyVGhhbigwKSlcbiAgICAuY2hlY2soU2NoZW1hLmlzTGVzc1RoYW5PckVxdWFsVG8oNjBfMDAwKSlcbiAgICAuYW5ub3RhdGUoeyBkZXNjcmlwdGlvbjogXCJNYXhpbXVtIHdhaXQgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byAxNTAwMDsgbWF4aW11bSA2MDAwMC5cIiB9KSxcbikuYW5ub3RhdGUoeyBkZXNjcmlwdGlvbjogXCJNYXhpbXVtIHdhaXQgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byAxNTAwMDsgbWF4aW11bSA2MDAwMC5cIiB9KTtcblxuZXhwb3J0IGNvbnN0IFBSRVZJRVdfQVVUT01BVElPTl9WMV9PUEVSQVRJT05TID0gW1xuICBcInN0YXR1c1wiLFxuICBcIm9wZW5cIixcbiAgXCJuYXZpZ2F0ZVwiLFxuICBcInNuYXBzaG90XCIsXG4gIFwiY2xpY2tcIixcbiAgXCJ0eXBlXCIsXG4gIFwicHJlc3NcIixcbiAgXCJzY3JvbGxcIixcbiAgXCJldmFsdWF0ZVwiLFxuICBcIndhaXRGb3JcIixcbiAgXCJyZWNvcmRpbmdTdGFydFwiLFxuICBcInJlY29yZGluZ1N0b3BcIixcbl0gYXMgY29uc3Q7XG5cbmNvbnN0IFBSRVZJRVdfQVVUT01BVElPTl9PUEVSQVRJT05TID0gW1xuICAuLi5QUkVWSUVXX0FVVE9NQVRJT05fVjFfT1BFUkFUSU9OUyxcbiAgXCJyZXNpemVcIixcbiAgXCJzZXRDb2xvclNjaGVtZVwiLFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFBSRVZJRVdfQVVUT01BVElPTl9TRVJWRVJfT1BFUkFUSU9OUyA9IFtcbiAgLi4uUFJFVklFV19BVVRPTUFUSU9OX09QRVJBVElPTlMsXG4gIFwiZGlhbG9nXCIsXG4gIFwiY2xvc2VcIixcbiAgXCJ1cGxvYWRcIixcbiAgXCJob3ZlclwiLFxuICBcInNlbGVjdFwiLFxuICBcImRyYWdcIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgUHJldmlld0F1dG9tYXRpb25PcGVyYXRpb24gPSBTY2hlbWEuTGl0ZXJhbHMoUFJFVklFV19BVVRPTUFUSU9OX1NFUlZFUl9PUEVSQVRJT05TKTtcbmV4cG9ydCB0eXBlIFByZXZpZXdBdXRvbWF0aW9uT3BlcmF0aW9uID0gdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uT3BlcmF0aW9uLlR5cGU7XG5cbmNvbnN0IFByZXZpZXdBdXRvbWF0aW9uVGFiVGFyZ2V0RmllbGRzID0ge1xuICB0YWJJZDogU2NoZW1hLm9wdGlvbmFsKFxuICAgIFByZXZpZXdUYWJJZC5hbm5vdGF0ZSh7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJFeGFjdCBjb2xsYWJvcmF0aXZlIGJyb3dzZXIgdGFiIHRvIHRhcmdldCwgaW5jbHVkaW5nIGEgdGFiIHRoZSB1c2VyIG9wZW5lZCAoc2VlIHByZXZpZXdfc3RhdHVzIHRhYnMpLiBPbWl0IHRvIHVzZSB0aGlzIGFnZW50IHNlc3Npb24ncyBjdXJyZW50IHRhYiwgb3IgdGhlIHVzZXIncyB2aXNpYmxlIHRhYiB3aGVuIHRoaXMgc2Vzc2lvbiBoYXMgbm9uZS5cIixcbiAgICB9KSxcbiAgKS5hbm5vdGF0ZSh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkV4YWN0IGNvbGxhYm9yYXRpdmUgYnJvd3NlciB0YWIgdG8gdGFyZ2V0LCBpbmNsdWRpbmcgYSB0YWIgdGhlIHVzZXIgb3BlbmVkIChzZWUgcHJldmlld19zdGF0dXMgdGFicykuIE9taXQgdG8gdXNlIHRoaXMgYWdlbnQgc2Vzc2lvbidzIGN1cnJlbnQgdGFiLCBvciB0aGUgdXNlcidzIHZpc2libGUgdGFiIHdoZW4gdGhpcyBzZXNzaW9uIGhhcyBub25lLlwiLFxuICB9KSxcbn07XG5cbmV4cG9ydCBjb25zdCBQcmV2aWV3QXV0b21hdGlvblRhYlRhcmdldElucHV0ID0gU2NoZW1hLlN0cnVjdChQcmV2aWV3QXV0b21hdGlvblRhYlRhcmdldEZpZWxkcyk7XG5leHBvcnQgdHlwZSBQcmV2aWV3QXV0b21hdGlvblRhYlRhcmdldElucHV0ID0gdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uVGFiVGFyZ2V0SW5wdXQuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFByZXZpZXdBdXRvbWF0aW9uVGFiT3duZXIgPSBTY2hlbWEuTGl0ZXJhbHMoW1wiYWdlbnRcIiwgXCJodW1hblwiLCBcInVuY2xhaW1lZFwiXSk7XG5cbmV4cG9ydCBjb25zdCBQcmV2aWV3QXV0b21hdGlvblByb2ZpbGUgPSBTY2hlbWEuU3RydWN0KHtcbiAgaWQ6IEJyb3dzZXJQcm9maWxlSWQsXG4gIG5hbWU6IFNjaGVtYS5TdHJpbmcsXG4gIGluY29nbml0bzogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5Cb29sZWFuKSxcbn0pO1xuZXhwb3J0IHR5cGUgUHJldmlld0F1dG9tYXRpb25Qcm9maWxlID0gdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uUHJvZmlsZS5UeXBlO1xuXG5leHBvcnQgY29uc3QgUHJldmlld0F1dG9tYXRpb25TdGF0dXMgPSBTY2hlbWEuU3RydWN0KHtcbiAgYXZhaWxhYmxlOiBTY2hlbWEuQm9vbGVhbixcbiAgdmlzaWJsZTogU2NoZW1hLkJvb2xlYW4sXG4gIHRhYklkOiBTY2hlbWEuTnVsbE9yKFByZXZpZXdUYWJJZCksXG4gIHVybDogU2NoZW1hLk51bGxPcihTY2hlbWEuU3RyaW5nKSxcbiAgdGl0bGU6IFNjaGVtYS5OdWxsT3IoU2NoZW1hLlN0cmluZyksXG4gIGxvYWRpbmc6IFNjaGVtYS5Cb29sZWFuLFxuICBjb250cm9sOiBTY2hlbWEub3B0aW9uYWwoXG4gICAgU2NoZW1hLlN0cnVjdCh7XG4gICAgICBvd25lcjogUHJldmlld0F1dG9tYXRpb25UYWJPd25lcixcbiAgICAgIG93bmVkQnlDYWxsZXI6IFNjaGVtYS5Cb29sZWFuLFxuICAgICAgZ2VuZXJhdGlvbjogU2NoZW1hLk51bWJlcixcbiAgICB9KSxcbiAgKSxcbiAgZGlhbG9nOiBTY2hlbWEub3B0aW9uYWwoXG4gICAgU2NoZW1hLk51bGxPcihcbiAgICAgIFNjaGVtYS5TdHJ1Y3Qoe1xuICAgICAgICB0eXBlOiBTY2hlbWEuU3RyaW5nLFxuICAgICAgICBtZXNzYWdlOiBTY2hlbWEuU3RyaW5nLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IFNjaGVtYS5TdHJpbmcsXG4gICAgICB9KSxcbiAgICApLFxuICApLFxuICB2aWV3cG9ydFNldHRpbmc6IFNjaGVtYS5vcHRpb25hbChQcmV2aWV3Vmlld3BvcnRTZXR0aW5nKSxcbiAgdmlld3BvcnQ6IFNjaGVtYS5vcHRpb25hbChQcmV2aWV3UmVuZGVyZWRWaWV3cG9ydFNpemUpLFxuICBmaWxlQ2hvb3NlcjogU2NoZW1hLm9wdGlvbmFsKFxuICAgIFNjaGVtYS5OdWxsT3IoU2NoZW1hLlN0cnVjdCh7IG11bHRpcGxlOiBTY2hlbWEuQm9vbGVhbiwgYWNjZXB0OiBTY2hlbWEuU3RyaW5nIH0pKSxcbiAgKSxcbiAgZG93bmxvYWRzOiBTY2hlbWEub3B0aW9uYWwoXG4gICAgU2NoZW1hLkFycmF5KFxuICAgICAgU2NoZW1hLlN0cnVjdCh7XG4gICAgICAgIGZpbGVOYW1lOiBTY2hlbWEuU3RyaW5nLFxuICAgICAgICBwYXRoOiBTY2hlbWEuU3RyaW5nLFxuICAgICAgICBzaXplQnl0ZXM6IFNjaGVtYS5OdW1iZXIsXG4gICAgICAgIHVybDogU2NoZW1hLlN0cmluZyxcbiAgICAgICAgY29tcGxldGVkQXQ6IFNjaGVtYS5TdHJpbmcsXG4gICAgICB9KSxcbiAgICApLFxuICApLFxuICAvKiogU2VydmVyIGhvc3RzOiBhbGwgdGhyZWFkIHRhYnMgYXJlIHJlYWRhYmxlOyBhY3Rpb25zIHJlcXVpcmUgb3duZWRCeUNhbGxlciBvciBhbiB1bmNsYWltZWQgdGFiIHdpdGhvdXQgaHVtYW4gY29udHJvbC4gKi9cbiAgdGFiczogU2NoZW1hLm9wdGlvbmFsKFxuICAgIFNjaGVtYS5BcnJheShcbiAgICAgIFNjaGVtYS5TdHJ1Y3Qoe1xuICAgICAgICB0YWJJZDogUHJldmlld1RhYklkLFxuICAgICAgICB1cmw6IFNjaGVtYS5OdWxsT3IoU2NoZW1hLlN0cmluZyksXG4gICAgICAgIG9wZW5lclRhYklkOiBTY2hlbWEub3B0aW9uYWwoUHJldmlld1RhYklkKSxcbiAgICAgICAgb3duZXI6IFNjaGVtYS5vcHRpb25hbChQcmV2aWV3QXV0b21hdGlvblRhYk93bmVyKSxcbiAgICAgICAgb3duZWRCeUNhbGxlcjogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5Cb29sZWFuKSxcbiAgICAgICAgdmlzaWJsZTogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5Cb29sZWFuKSxcbiAgICAgICAgcHJvZmlsZUlkOiBTY2hlbWEub3B0aW9uYWwoQnJvd3NlclByb2ZpbGVJZCksXG4gICAgICB9KSxcbiAgICApLFxuICApLFxuICBwcm9maWxlczogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5BcnJheShQcmV2aWV3QXV0b21hdGlvblByb2ZpbGUpKSxcbiAgZGVmYXVsdFByb2ZpbGVJZDogU2NoZW1hLm9wdGlvbmFsKEJyb3dzZXJQcm9maWxlSWQpLFxufSk7XG5leHBvcnQgdHlwZSBQcmV2aWV3QXV0b21hdGlvblN0YXR1cyA9IHR5cGVvZiBQcmV2aWV3QXV0b21hdGlvblN0YXR1cy5UeXBlO1xuXG5leHBvcnQgY29uc3QgUHJldmlld0F1dG9tYXRpb25EaWFsb2dJbnB1dCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICAuLi5QcmV2aWV3QXV0b21hdGlvblRhYlRhcmdldEZpZWxkcyxcbiAgYWNjZXB0OiBTY2hlbWEuQm9vbGVhbi5hbm5vdGF0ZSh7XG4gICAgZGVzY3JpcHRpb246IFwiQWNjZXB0IHRoZSBwZW5kaW5nIGJyb3dzZXIgZGlhbG9nIHdoZW4gdHJ1ZSwgb3IgZGlzbWlzcyBpdCB3aGVuIGZhbHNlLlwiLFxuICB9KSxcbiAgcHJvbXB0VGV4dDogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5TdHJpbmcpLmFubm90YXRlKHtcbiAgICBkZXNjcmlwdGlvbjogXCJPcHRpb25hbCB0ZXh0IHRvIHN1Ym1pdCB3aGVuIGFjY2VwdGluZyBhIHByb21wdCBkaWFsb2cuXCIsXG4gIH0pLFxufSk7XG5leHBvcnQgdHlwZSBQcmV2aWV3QXV0b21hdGlvbkRpYWxvZ0lucHV0ID0gdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uRGlhbG9nSW5wdXQuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFByZXZpZXdBdXRvbWF0aW9uT3BlbklucHV0ID0gU2NoZW1hLlN0cnVjdCh7XG4gIC4uLlByZXZpZXdBdXRvbWF0aW9uVGFiVGFyZ2V0RmllbGRzLFxuICB1cmw6IFNjaGVtYS5vcHRpb25hbChCb3VuZGVkVXJsKS5hbm5vdGF0ZSh7XG4gICAgZGVzY3JpcHRpb246IGBPcHRpb25hbCBpbml0aWFsIHBhZ2UgVVJMLiAke1VSTF9HVUlEQU5DRX0gT21pdCB0byBvcGVuIGEgYmxhbmsgdGFiLmAsXG4gIH0pLFxuICBvcGVuOiBTY2hlbWEub3B0aW9uYWwoXG4gICAgU2NoZW1hLkJvb2xlYW4uYW5ub3RhdGUoe1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiV2hldGhlciB0byBvcGVuIHRoZSB0aHJlYWQtYm91bmQgaW5saW5lIHByZXZpZXcgZm9yIHRoZSBodW1hbi4gRGVmYXVsdHMgdG8gdHJ1ZTsgc2V0IGZhbHNlIGZvciBiYWNrZ3JvdW5kLW9ubHkgYXV0b21hdGlvbi5cIixcbiAgICB9KSxcbiAgKSxcbiAgc2hvdzogU2NoZW1hLm9wdGlvbmFsKFxuICAgIFNjaGVtYS5Cb29sZWFuLmFubm90YXRlKHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkRlcHJlY2F0ZWQgYWxpYXMgZm9yIG9wZW4uIFdoZXRoZXIgdG8gcmV2ZWFsIHRoZSB0aHJlYWQtYm91bmQgaW5saW5lIHByZXZpZXcgdG8gdGhlIGh1bWFuLlwiLFxuICAgIH0pLFxuICApLFxuICByZXVzZUV4aXN0aW5nVGFiOiBTY2hlbWEub3B0aW9uYWwoXG4gICAgU2NoZW1hLkJvb2xlYW4uYW5ub3RhdGUoe1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUmV1c2UgdGFiSWQgd2hlbiBzdXBwbGllZCwgb3RoZXJ3aXNlIHRoaXMgYWdlbnQgc2Vzc2lvbidzIGN1cnJlbnQgdGFiLiBEZWZhdWx0cyB0byB0cnVlOyBzZXQgZmFsc2UgdG8gY3JlYXRlIGEgbmV3IHRhYi5cIixcbiAgICB9KSxcbiAgKSxcbiAgcHJvZmlsZUlkOiBTY2hlbWEub3B0aW9uYWwoXG4gICAgVHJpbW1lZE5vbkVtcHR5U3RyaW5nLmNoZWNrKFNjaGVtYS5pc01heExlbmd0aCg2NCkpLmFubm90YXRlKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBQUk9GSUxFX0dVSURBTkNFLFxuICAgIH0pLFxuICApLmFubm90YXRlKHsgZGVzY3JpcHRpb246IFBST0ZJTEVfR1VJREFOQ0UgfSksXG59KVxuICAuY2hlY2soXG4gICAgU2NoZW1hLm1ha2VGaWx0ZXIoXG4gICAgICAoaW5wdXQpID0+XG4gICAgICAgICEoaW5wdXQudGFiSWQgIT09IHVuZGVmaW5lZCAmJiBpbnB1dC5yZXVzZUV4aXN0aW5nVGFiID09PSBmYWxzZSkgfHxcbiAgICAgICAgXCJ0YWJJZCBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCByZXVzZUV4aXN0aW5nVGFiPWZhbHNlLlwiLFxuICAgICksXG4gIClcbiAgLmFubm90YXRlKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiT3BlbnMgdGhlIGNvbGxhYm9yYXRpdmUgYnJvd3NlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLiBVc2UgcHJldmlld19uYXZpZ2F0ZSBhZnRlcndhcmQgd2hlbiByZWFkaW5lc3Mgd2FpdGluZyBtYXR0ZXJzLlwiLFxuICB9KTtcbmV4cG9ydCB0eXBlIFByZXZpZXdBdXRvbWF0aW9uT3BlbklucHV0ID0gdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uT3BlbklucHV0LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBCcm93c2VyTmF2aWdhdGlvblRhcmdldCA9IFNjaGVtYS5VbmlvbihbXG4gIFNjaGVtYS5TdHJ1Y3Qoe1xuICAgIGtpbmQ6IFNjaGVtYS5MaXRlcmFsKFwidXJsXCIpLmFubm90YXRlKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlNlbGVjdHMgZGlyZWN0IFVSTCBuYXZpZ2F0aW9uLlwiLFxuICAgIH0pLFxuICAgIHVybDogQm91bmRlZFVybC5hbm5vdGF0ZSh7XG4gICAgICBkZXNjcmlwdGlvbjogYERpcmVjdCB3ZWJzaXRlIFVSTC4gJHtVUkxfR1VJREFOQ0V9YCxcbiAgICB9KSxcbiAgfSksXG4gIFNjaGVtYS5TdHJ1Y3Qoe1xuICAgIGtpbmQ6IFNjaGVtYS5MaXRlcmFsKFwiZW52aXJvbm1lbnQtcG9ydFwiKS5hbm5vdGF0ZSh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJTZWxlY3RzIGEgZGV2LXNlcnZlciBwb3J0IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBlbnZpcm9ubWVudC5cIixcbiAgICB9KSxcbiAgICBwb3J0OiBTY2hlbWEuSW50LmNoZWNrKFNjaGVtYS5pc0dyZWF0ZXJUaGFuKDApKVxuICAgICAgLmNoZWNrKFNjaGVtYS5pc0xlc3NUaGFuKDY1XzUzNikpXG4gICAgICAuYW5ub3RhdGUoeyBkZXNjcmlwdGlvbjogXCJEZXYtc2VydmVyIFRDUCBwb3J0IGluc2lkZSB0aGUgY3VycmVudCBlbnZpcm9ubWVudC5cIiB9KSxcbiAgICBwcm90b2NvbDogU2NoZW1hLm9wdGlvbmFsKFxuICAgICAgU2NoZW1hLkxpdGVyYWxzKFtcImh0dHBcIiwgXCJodHRwc1wiXSkuYW5ub3RhdGUoe1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJEZXYtc2VydmVyIHByb3RvY29sLiBEZWZhdWx0cyB0byBodHRwLlwiLFxuICAgICAgfSksXG4gICAgKSxcbiAgICBwYXRoOiBTY2hlbWEub3B0aW9uYWwoXG4gICAgICBTY2hlbWEuU3RyaW5nLmFubm90YXRlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiT3B0aW9uYWwgcGF0aCwgcXVlcnksIGFuZCBmcmFnbWVudCwgZm9yIGV4YW1wbGUgL3NldHRpbmdzP3RhYj1hY2NvdW50LlwiLFxuICAgICAgfSksXG4gICAgKSxcbiAgfSksXG5dKTtcbmV4cG9ydCB0eXBlIEJyb3dzZXJOYXZpZ2F0aW9uVGFyZ2V0ID0gdHlwZW9mIEJyb3dzZXJOYXZpZ2F0aW9uVGFyZ2V0LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBQcmV2aWV3QXV0b21hdGlvbk5hdmlnYXRlSW5wdXQgPSBTY2hlbWEuU3RydWN0KHtcbiAgLi4uUHJldmlld0F1dG9tYXRpb25UYWJUYXJnZXRGaWVsZHMsXG4gIHVybDogU2NoZW1hLm9wdGlvbmFsKEJvdW5kZWRVcmwpLmFubm90YXRlKHtcbiAgICBkZXNjcmlwdGlvbjogYFdlYnNpdGUgVVJMLiAke1VSTF9HVUlEQU5DRX0gVXNlIHRoaXMgZm9yIHB1YmxpYyBwYWdlcyBhbmQgZGlyZWN0bHkgcmVhY2hhYmxlIFVSTHMuYCxcbiAgfSksXG4gIHRhcmdldDogU2NoZW1hLm9wdGlvbmFsKFxuICAgIEJyb3dzZXJOYXZpZ2F0aW9uVGFyZ2V0LmFubm90YXRlKHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkVudmlyb25tZW50LXJlbGF0aXZlIHRhcmdldC4gUHJlZmVyIHtraW5kOidlbnZpcm9ubWVudC1wb3J0Jyxwb3J0OjUxNzN9IGZvciBhIGRldiBzZXJ2ZXIgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuXCIsXG4gICAgfSksXG4gICkuYW5ub3RhdGUoe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJFbnZpcm9ubWVudC1yZWxhdGl2ZSB0YXJnZXQuIFByZWZlciB7a2luZDonZW52aXJvbm1lbnQtcG9ydCcscG9ydDo1MTczfSBmb3IgYSBkZXYgc2VydmVyIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlwiLFxuICB9KSxcbiAgcmVhZGluZXNzOiBTY2hlbWEub3B0aW9uYWwoXG4gICAgU2NoZW1hLkxpdGVyYWxzKFtcImxvYWRcIiwgXCJkb21Db250ZW50TG9hZGVkXCIsIFwibm9uZVwiXSkuYW5ub3RhdGUoe1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUmVhZGluZXNzIG1pbGVzdG9uZSBiZWZvcmUgcmV0dXJuaW5nLiAnbG9hZCcgd2FpdHMgZm9yIGxvYWRpbmcgdG8gc3RvcCAoZGVmYXVsdCksICdkb21Db250ZW50TG9hZGVkJyB3YWl0cyBmb3IgYW4gaW50ZXJhY3RpdmUgZG9jdW1lbnQsIGFuZCAnbm9uZScgcmV0dXJucyBpbW1lZGlhdGVseS5cIixcbiAgICB9KSxcbiAgKS5hbm5vdGF0ZSh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlJlYWRpbmVzcyBtaWxlc3RvbmUgYmVmb3JlIHJldHVybmluZy4gJ2xvYWQnIGlzIHRoZSBkZWZhdWx0OyB1c2UgJ25vbmUnIG9ubHkgd2hlbiBhIGxhdGVyIHdhaXQgY2FsbCB3aWxsIHZlcmlmeSB0aGUgcGFnZS5cIixcbiAgfSksXG4gIHRpbWVvdXRNczogT3B0aW9uYWxUaW1lb3V0TXMsXG59KVxuICAuY2hlY2soXG4gICAgU2NoZW1hLm1ha2VGaWx0ZXIoXG4gICAgICAoaW5wdXQpID0+XG4gICAgICAgIE51bWJlcihpbnB1dC51cmwgIT09IHVuZGVmaW5lZCkgKyBOdW1iZXIoaW5wdXQudGFyZ2V0ICE9PSB1bmRlZmluZWQpID09PSAxIHx8XG4gICAgICAgIFwiUHJvdmlkZSBleGFjdGx5IG9uZSBvZiB1cmwgb3IgdGFyZ2V0LlwiLFxuICAgICksXG4gIClcbiAgLmFubm90YXRlKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiTmF2aWdhdGVzIHRoZSBhY3RpdmUgYnJvd3NlciB0YWIuIFByb3ZpZGUgZXhhY3RseSBvbmUgb2YgdXJsIG9yIHRhcmdldDsgZm9yIG1vc3QgcHVibGljIHBhZ2VzIHVzZSB1cmwuXCIsXG4gIH0pO1xuZXhwb3J0IHR5cGUgUHJldmlld0F1dG9tYXRpb25OYXZpZ2F0ZUlucHV0ID0gdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uTmF2aWdhdGVJbnB1dC5UeXBlO1xuXG5leHBvcnQgY29uc3QgUHJldmlld0F1dG9tYXRpb25SZXNpemVJbnB1dCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICAuLi5QcmV2aWV3QXV0b21hdGlvblRhYlRhcmdldEZpZWxkcyxcbiAgbW9kZTogU2NoZW1hLkxpdGVyYWxzKFtcImZpbGxcIiwgXCJmcmVlZm9ybVwiLCBcInByZXNldFwiXSkuYW5ub3RhdGUoe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJWaWV3cG9ydCBtb2RlOiBmaWxsIGZvbGxvd3MgdGhlIHByZXZpZXcgcGFuZWwsIGZyZWVmb3JtIHVzZXMgZXhhY3QgaW5kZXBlbmRlbnRseSByZXNpemFibGUgZGltZW5zaW9ucywgYW5kIHByZXNldCB1c2VzIGEgbmFtZWQgZGV2aWNlIHNpemUuXCIsXG4gIH0pLFxuICBwcmVzZXQ6IFNjaGVtYS5vcHRpb25hbChcbiAgICBQcmV2aWV3Vmlld3BvcnRQcmVzZXRJZC5hbm5vdGF0ZSh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJOYW1lZCB2aWV3cG9ydCBmcm9tIENocm9tZSBEZXZUb29scycgc3RhbmRhcmQgZGV2aWNlIGNhdGFsb2cuXCIsXG4gICAgfSksXG4gICkuYW5ub3RhdGUoe1xuICAgIGRlc2NyaXB0aW9uOiBcIk5hbWVkIGRldmljZSBzaXplLiBSZXF1aXJlZCBvbmx5IHdoZW4gbW9kZSBpcyBwcmVzZXQuXCIsXG4gIH0pLFxuICB3aWR0aDogU2NoZW1hLm9wdGlvbmFsKFxuICAgIFByZXZpZXdWaWV3cG9ydFNpemUuZmllbGRzLndpZHRoLmFubm90YXRlKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkZyZWVmb3JtIHZpZXdwb3J0IHdpZHRoIGluIENTUyBwaXhlbHMuIFJlcXVpcmVkIG9ubHkgaW4gZnJlZWZvcm0gbW9kZS5cIixcbiAgICB9KSxcbiAgKS5hbm5vdGF0ZSh7XG4gICAgZGVzY3JpcHRpb246IFwiRnJlZWZvcm0gdmlld3BvcnQgd2lkdGggaW4gQ1NTIHBpeGVscy4gUmVxdWlyZWQgb25seSBpbiBmcmVlZm9ybSBtb2RlLlwiLFxuICB9KSxcbiAgaGVpZ2h0OiBTY2hlbWEub3B0aW9uYWwoXG4gICAgUHJldmlld1ZpZXdwb3J0U2l6ZS5maWVsZHMuaGVpZ2h0LmFubm90YXRlKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkZyZWVmb3JtIHZpZXdwb3J0IGhlaWdodCBpbiBDU1MgcGl4ZWxzLiBSZXF1aXJlZCBvbmx5IGluIGZyZWVmb3JtIG1vZGUuXCIsXG4gICAgfSksXG4gICkuYW5ub3RhdGUoe1xuICAgIGRlc2NyaXB0aW9uOiBcIkZyZWVmb3JtIHZpZXdwb3J0IGhlaWdodCBpbiBDU1MgcGl4ZWxzLiBSZXF1aXJlZCBvbmx5IGluIGZyZWVmb3JtIG1vZGUuXCIsXG4gIH0pLFxuICBvcmllbnRhdGlvbjogU2NoZW1hLm9wdGlvbmFsKFxuICAgIFNjaGVtYS5MaXRlcmFscyhbXCJwb3J0cmFpdFwiLCBcImxhbmRzY2FwZVwiXSkuYW5ub3RhdGUoe1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiT3JpZW50YXRpb24gZm9yIGEgZml4ZWQgZGV2aWNlIHByZXNldC4gRGVmYXVsdHMgdG8gdGhlIHByZXNldCdzIG5hdGl2ZSBvcmllbnRhdGlvbi5cIixcbiAgICB9KSxcbiAgKS5hbm5vdGF0ZSh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIk9yaWVudGF0aW9uIGZvciBhIG5hbWVkIGRldmljZSBwcmVzZXQuIEl0IGlzIG5vdCBhY2NlcHRlZCBpbiBmaWxsIG9yIGZyZWVmb3JtIG1vZGUuXCIsXG4gIH0pLFxuICB0aW1lb3V0TXM6IE9wdGlvbmFsVGltZW91dE1zLFxufSlcbiAgLmNoZWNrKFxuICAgIFNjaGVtYS5tYWtlRmlsdGVyKChpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgaGFzUHJlc2V0ID0gaW5wdXQucHJlc2V0ICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBoYXNXaWR0aCA9IGlucHV0LndpZHRoICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBoYXNIZWlnaHQgPSBpbnB1dC5oZWlnaHQgIT09IHVuZGVmaW5lZDtcbiAgICAgIGlmIChoYXNXaWR0aCAhPT0gaGFzSGVpZ2h0KSByZXR1cm4gXCJDdXN0b20gZGltZW5zaW9ucyByZXF1aXJlIGJvdGggd2lkdGggYW5kIGhlaWdodC5cIjtcbiAgICAgIGlmIChpbnB1dC5tb2RlID09PSBcImZpbGxcIikge1xuICAgICAgICByZXR1cm4gIWhhc1ByZXNldCAmJiAhaGFzV2lkdGggJiYgaW5wdXQub3JpZW50YXRpb24gPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgIDogXCJGaWxsIG1vZGUgZG9lcyBub3QgYWNjZXB0IGEgcHJlc2V0LCBkaW1lbnNpb25zLCBvciBvcmllbnRhdGlvbi5cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpbnB1dC5tb2RlID09PSBcImZyZWVmb3JtXCIpIHtcbiAgICAgICAgaWYgKCFoYXNXaWR0aCB8fCAhaGFzSGVpZ2h0IHx8IGhhc1ByZXNldCB8fCBpbnB1dC5vcmllbnRhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIFwiRnJlZWZvcm0gbW9kZSByZXF1aXJlcyB3aWR0aCBhbmQgaGVpZ2h0IGFuZCBkb2VzIG5vdCBhY2NlcHQgYSBwcmVzZXQgb3Igb3JpZW50YXRpb24uXCI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWhhc1ByZXNldCB8fCBoYXNXaWR0aCB8fCBoYXNIZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIFwiUHJlc2V0IG1vZGUgcmVxdWlyZXMgYSBwcmVzZXQgYW5kIGRvZXMgbm90IGFjY2VwdCBjdXN0b20gZGltZW5zaW9ucy5cIjtcbiAgICAgIH1cbiAgICAgIGlmIChoYXNXaWR0aCAmJiBoYXNIZWlnaHQgJiYgaW5wdXQud2lkdGghICogaW5wdXQuaGVpZ2h0ISA+IFBSRVZJRVdfVklFV1BPUlRfTUFYX0FSRUEpIHtcbiAgICAgICAgcmV0dXJuIGBDdXN0b20gdmlld3BvcnQgYXJlYSBtdXN0IG5vdCBleGNlZWQgJHtQUkVWSUVXX1ZJRVdQT1JUX01BWF9BUkVBfSBwaXhlbHMuYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pLFxuICApXG4gIC5hbm5vdGF0ZSh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlNldHMgdGhlIGFjdGl2ZSBicm93c2VyIHRhYiB0byBmaWxsLXBhbmVsLCBpbmRlcGVuZGVudGx5IHJlc2l6YWJsZSBmcmVlZm9ybSwgb3IgbmFtZWQgZGV2aWNlLXByZXNldCBzaXppbmcuXCIsXG4gIH0pO1xuZXhwb3J0IHR5cGUgUHJldmlld0F1dG9tYXRpb25SZXNpemVJbnB1dCA9IHR5cGVvZiBQcmV2aWV3QXV0b21hdGlvblJlc2l6ZUlucHV0LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBQcmV2aWV3QXV0b21hdGlvblJlc2l6ZVJlc3VsdCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICB0YWJJZDogUHJldmlld1RhYklkLFxuICBzZXR0aW5nOiBQcmV2aWV3Vmlld3BvcnRTZXR0aW5nLFxuICB2aWV3cG9ydDogUHJldmlld1JlbmRlcmVkVmlld3BvcnRTaXplLFxufSk7XG5leHBvcnQgdHlwZSBQcmV2aWV3QXV0b21hdGlvblJlc2l6ZVJlc3VsdCA9IHR5cGVvZiBQcmV2aWV3QXV0b21hdGlvblJlc2l6ZVJlc3VsdC5UeXBlO1xuXG4vLyBNaXJyb3JzIERlc2t0b3BQcmV2aWV3Q29sb3JTY2hlbWUgd2l0aG91dCBpbXBvcnRpbmcgaXBjLnRzLlxuZXhwb3J0IGNvbnN0IFByZXZpZXdBdXRvbWF0aW9uQ29sb3JTY2hlbWUgPSBTY2hlbWEuTGl0ZXJhbHMoW1wic3lzdGVtXCIsIFwibGlnaHRcIiwgXCJkYXJrXCJdKTtcbmV4cG9ydCB0eXBlIFByZXZpZXdBdXRvbWF0aW9uQ29sb3JTY2hlbWUgPSB0eXBlb2YgUHJldmlld0F1dG9tYXRpb25Db2xvclNjaGVtZS5UeXBlO1xuXG5leHBvcnQgY29uc3QgUHJldmlld0F1dG9tYXRpb25TZXRDb2xvclNjaGVtZUlucHV0ID0gU2NoZW1hLlN0cnVjdCh7XG4gIC4uLlByZXZpZXdBdXRvbWF0aW9uVGFiVGFyZ2V0RmllbGRzLFxuICBjb2xvclNjaGVtZTogUHJldmlld0F1dG9tYXRpb25Db2xvclNjaGVtZS5hbm5vdGF0ZSh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkVtdWxhdGVkIHByZWZlcnMtY29sb3Itc2NoZW1lIGZvciB0aGUgcGFnZTogbGlnaHQsIGRhcmssIG9yIHN5c3RlbSB0byBmb2xsb3cgdGhlIE9TIGFwcGVhcmFuY2UuXCIsXG4gIH0pLFxufSkuYW5ub3RhdGUoe1xuICBkZXNjcmlwdGlvbjpcbiAgICBcIkVtdWxhdGVzIHByZWZlcnMtY29sb3Itc2NoZW1lIGluIHRoZSBhY3RpdmUgYnJvd3NlciB0YWIgd2l0aG91dCBjaGFuZ2luZyB0aGUgT1Mgb3IgYXBwIHRoZW1lLlwiLFxufSk7XG5leHBvcnQgdHlwZSBQcmV2aWV3QXV0b21hdGlvblNldENvbG9yU2NoZW1lSW5wdXQgPSB0eXBlb2YgUHJldmlld0F1dG9tYXRpb25TZXRDb2xvclNjaGVtZUlucHV0LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBQcmV2aWV3QXV0b21hdGlvblNldENvbG9yU2NoZW1lUmVzdWx0ID0gU2NoZW1hLlN0cnVjdCh7XG4gIHRhYklkOiBQcmV2aWV3VGFiSWQsXG4gIGNvbG9yU2NoZW1lOiBQcmV2aWV3QXV0b21hdGlvbkNvbG9yU2NoZW1lLFxufSk7XG5leHBvcnQgdHlwZSBQcmV2aWV3QXV0b21hdGlvblNldENvbG9yU2NoZW1lUmVzdWx0ID1cbiAgdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uU2V0Q29sb3JTY2hlbWVSZXN1bHQuVHlwZTtcblxuY29uc3QgTG9jYXRvciA9IFRyaW1tZWROb25FbXB0eVN0cmluZy5hbm5vdGF0ZSh7XG4gIGRlc2NyaXB0aW9uOlxuICAgIFwiVXNlIGxvY2F0b3I9J2FyaWEtcmVmPTxyZWY+JyB3aXRoIGEgcmVmIGZyb20gdGhlIGxhdGVzdCBzZXJ2ZXIgc25hcHNob3QgKGluY2x1ZGluZyBpZnJhbWUgZWxlbWVudHMpLCBvciBhIHVuaXF1ZSBQbGF5d3JpZ2h0IHJvbGUvdGV4dCBzZWxlY3Rvci4gUmVmcyBleHBpcmUgb24gbmF2aWdhdGlvbiwgYSBuZXcgc25hcHNob3QsIG9yIGNvbnRyb2wgaGFuZG9mZjsgcmVmcmVzaCB0aGUgc25hcHNob3QgYWZ0ZXIgYSBzdGFsZS1yZWYgZXJyb3IuXCIsXG59KTtcblxuY29uc3QgTGVnYWN5U2VsZWN0b3IgPSBUcmltbWVkTm9uRW1wdHlTdHJpbmcuYW5ub3RhdGUoe1xuICBkZXNjcmlwdGlvbjpcbiAgICBcIkxlZ2FjeSBDU1Mgc2VsZWN0b3Igc3VjaCBhcyBidXR0b25bdHlwZT0nc3VibWl0J10uIFByZWZlciBsb2NhdG9yIGZvciByZXNpbGllbnQgcm9sZS90ZXh0IHRhcmdldGluZy5cIixcbn0pO1xuXG5jb25zdCBQb2ludGVyVGFyZ2V0RmllbGRzID0ge1xuICAuLi5QcmV2aWV3QXV0b21hdGlvblRhYlRhcmdldEZpZWxkcyxcbiAgc2VsZWN0b3I6IFNjaGVtYS5vcHRpb25hbChMZWdhY3lTZWxlY3RvcikuYW5ub3RhdGUoe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJMZWdhY3kgQ1NTIHNlbGVjdG9yIHN1Y2ggYXMgYnV0dG9uW3R5cGU9J3N1Ym1pdCddLiBQcmVmZXIgbG9jYXRvciBmb3IgcmVzaWxpZW50IHJvbGUvdGV4dCB0YXJnZXRpbmcuXCIsXG4gIH0pLFxuICBsb2NhdG9yOiBTY2hlbWEub3B0aW9uYWwoTG9jYXRvcikuYW5ub3RhdGUoe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJVc2UgbG9jYXRvcj0nYXJpYS1yZWY9PHJlZj4nIHdpdGggYSByZWYgZnJvbSB0aGUgbGF0ZXN0IHNlcnZlciBzbmFwc2hvdCAoaW5jbHVkaW5nIGlmcmFtZSBlbGVtZW50cyksIG9yIGEgdW5pcXVlIFBsYXl3cmlnaHQgcm9sZS90ZXh0IHNlbGVjdG9yLiBSZWZzIGV4cGlyZSBvbiBuYXZpZ2F0aW9uLCBhIG5ldyBzbmFwc2hvdCwgb3IgY29udHJvbCBoYW5kb2ZmOyByZWZyZXNoIHRoZSBzbmFwc2hvdCBhZnRlciBhIHN0YWxlLXJlZiBlcnJvci5cIixcbiAgfSksXG4gIHg6IFNjaGVtYS5vcHRpb25hbChcbiAgICBTY2hlbWEuRmluaXRlLmFubm90YXRlKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlZpZXdwb3J0LXJlbGF0aXZlIFggY29vcmRpbmF0ZSBpbiBDU1MgcGl4ZWxzLiBNdXN0IGJlIHBhaXJlZCB3aXRoIHkuXCIsXG4gICAgfSksXG4gICksXG4gIHk6IFNjaGVtYS5vcHRpb25hbChcbiAgICBTY2hlbWEuRmluaXRlLmFubm90YXRlKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlZpZXdwb3J0LXJlbGF0aXZlIFkgY29vcmRpbmF0ZSBpbiBDU1MgcGl4ZWxzLiBNdXN0IGJlIHBhaXJlZCB3aXRoIHguXCIsXG4gICAgfSksXG4gICksXG4gIHRpbWVvdXRNczogT3B0aW9uYWxUaW1lb3V0TXMsXG59O1xuXG5jb25zdCBzaW5nbGVQb2ludGVyVGFyZ2V0ID0gU2NoZW1hLm1ha2VGaWx0ZXIoXG4gIChpbnB1dDoge1xuICAgIHJlYWRvbmx5IHNlbGVjdG9yPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHJlYWRvbmx5IGxvY2F0b3I/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcmVhZG9ubHkgeD86IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICByZWFkb25seSB5PzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICB9KSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0b3JNb2RlcyA9XG4gICAgICBOdW1iZXIoaW5wdXQuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCkgKyBOdW1iZXIoaW5wdXQubG9jYXRvciAhPT0gdW5kZWZpbmVkKTtcbiAgICBjb25zdCBoYXNYID0gaW5wdXQueCAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGhhc1kgPSBpbnB1dC55ICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKGhhc1ggIT09IGhhc1kpIHJldHVybiBcIkNvb3JkaW5hdGVzIHJlcXVpcmUgYm90aCB4IGFuZCB5LlwiO1xuICAgIGNvbnN0IGNvb3JkaW5hdGVNb2RlcyA9IGhhc1ggJiYgaGFzWSA/IDEgOiAwO1xuICAgIHJldHVybiBzZWxlY3Rvck1vZGVzICsgY29vcmRpbmF0ZU1vZGVzID09PSAxIHx8IFwiUHJvdmlkZSBleGFjdGx5IG9uZSB0YXJnZXQuXCI7XG4gIH0sXG4pO1xuXG5leHBvcnQgY29uc3QgUHJldmlld0F1dG9tYXRpb25DbGlja0lucHV0ID0gU2NoZW1hLlN0cnVjdCh7XG4gIC4uLlBvaW50ZXJUYXJnZXRGaWVsZHMsXG4gIGJ1dHRvbjogU2NoZW1hLm9wdGlvbmFsKFxuICAgIFNjaGVtYS5MaXRlcmFscyhbXCJsZWZ0XCIsIFwicmlnaHRcIiwgXCJtaWRkbGVcIl0pLmFubm90YXRlKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIk1vdXNlIGJ1dHRvbi4gRGVmYXVsdHMgdG8gbGVmdDsgcmlnaHQgb3BlbnMgdGhlIHBhZ2UncyBjb250ZXh0IG1lbnUuXCIsXG4gICAgfSksXG4gICksXG4gIGNsaWNrQ291bnQ6IFNjaGVtYS5vcHRpb25hbChcbiAgICBTY2hlbWEuSW50LmNoZWNrKFNjaGVtYS5pc0JldHdlZW4oeyBtaW5pbXVtOiAxLCBtYXhpbXVtOiAzIH0pKS5hbm5vdGF0ZSh7XG4gICAgICBkZXNjcmlwdGlvbjogXCIxIGZvciBhIGNsaWNrLCAyIGZvciBhIGRvdWJsZS1jbGljaywgMyBmb3IgYSB0cmlwbGUtY2xpY2suIERlZmF1bHRzIHRvIDEuXCIsXG4gICAgfSksXG4gICksXG59KVxuICAuY2hlY2soc2luZ2xlUG9pbnRlclRhcmdldClcbiAgLmFubm90YXRlKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiQ2xpY2tzIG9uZSB0YXJnZXQuIFByb3ZpZGUgZXhhY3RseSBvbmUgb2YgbG9jYXRvciwgc2VsZWN0b3IsIG9yIHRoZSB4L3kgY29vcmRpbmF0ZSBwYWlyLlwiLFxuICB9KTtcbmV4cG9ydCB0eXBlIFByZXZpZXdBdXRvbWF0aW9uQ2xpY2tJbnB1dCA9IHR5cGVvZiBQcmV2aWV3QXV0b21hdGlvbkNsaWNrSW5wdXQuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFByZXZpZXdBdXRvbWF0aW9uSG92ZXJJbnB1dCA9IFNjaGVtYS5TdHJ1Y3QoUG9pbnRlclRhcmdldEZpZWxkcylcbiAgLmNoZWNrKHNpbmdsZVBvaW50ZXJUYXJnZXQpXG4gIC5hbm5vdGF0ZSh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIk1vdmVzIHRoZSBtb3VzZSBvdmVyIG9uZSB0YXJnZXQuIFByb3ZpZGUgZXhhY3RseSBvbmUgb2YgbG9jYXRvciwgc2VsZWN0b3IsIG9yIHRoZSB4L3kgY29vcmRpbmF0ZSBwYWlyLlwiLFxuICB9KTtcbmV4cG9ydCB0eXBlIFByZXZpZXdBdXRvbWF0aW9uSG92ZXJJbnB1dCA9IHR5cGVvZiBQcmV2aWV3QXV0b21hdGlvbkhvdmVySW5wdXQuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFByZXZpZXdBdXRvbWF0aW9uU2VsZWN0SW5wdXQgPSBTY2hlbWEuU3RydWN0KHtcbiAgLi4uUHJldmlld0F1dG9tYXRpb25UYWJUYXJnZXRGaWVsZHMsXG4gIHNlbGVjdG9yOiBTY2hlbWEub3B0aW9uYWwoTGVnYWN5U2VsZWN0b3IpLmFubm90YXRlKHtcbiAgICBkZXNjcmlwdGlvbjogXCJMZWdhY3kgQ1NTIHNlbGVjdG9yIGZvciBhIDxzZWxlY3Q+LiBQcmVmZXIgbG9jYXRvci5cIixcbiAgfSksXG4gIGxvY2F0b3I6IFNjaGVtYS5vcHRpb25hbChMb2NhdG9yKS5hbm5vdGF0ZSh7XG4gICAgZGVzY3JpcHRpb246IFwiVGhlIDxzZWxlY3Q+IGVsZW1lbnQsIGZvciBleGFtcGxlIGFyaWEtcmVmPTxyZWY+IG9yIHJvbGU9Y29tYm9ib3hbbmFtZT0nU2l6ZSddLlwiLFxuICB9KSxcbiAgdmFsdWVzOiBTY2hlbWEuQXJyYXkoU2NoZW1hLlN0cmluZykuY2hlY2soU2NoZW1hLmlzTWF4TGVuZ3RoKDEwMCkpLmFubm90YXRlKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiT3B0aW9uIHZhbHVlcyBvciB2aXNpYmxlIGxhYmVscyB0byBzZWxlY3QuIFBhc3Mgc2V2ZXJhbCBmb3IgYSBtdWx0aXBsZSBzZWxlY3QsIG9yIGFuIGVtcHR5IGxpc3QgdG8gY2xlYXIgaXQuXCIsXG4gIH0pLFxuICB0aW1lb3V0TXM6IE9wdGlvbmFsVGltZW91dE1zLFxufSlcbiAgLmNoZWNrKFxuICAgIFNjaGVtYS5tYWtlRmlsdGVyKFxuICAgICAgKGlucHV0KSA9PlxuICAgICAgICBOdW1iZXIoaW5wdXQuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCkgKyBOdW1iZXIoaW5wdXQubG9jYXRvciAhPT0gdW5kZWZpbmVkKSA9PT0gMSB8fFxuICAgICAgICBcIlByb3ZpZGUgZXhhY3RseSBvbmUgb2Ygc2VsZWN0b3Igb3IgbG9jYXRvci5cIixcbiAgICApLFxuICApXG4gIC5hbm5vdGF0ZSh7IGRlc2NyaXB0aW9uOiBcIkNob29zZXMgb3B0aW9ucyBpbiBvbmUgbmF0aXZlIDxzZWxlY3Q+IGVsZW1lbnQuXCIgfSk7XG5leHBvcnQgdHlwZSBQcmV2aWV3QXV0b21hdGlvblNlbGVjdElucHV0ID0gdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uU2VsZWN0SW5wdXQuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFByZXZpZXdBdXRvbWF0aW9uU2VsZWN0UmVzdWx0ID0gU2NoZW1hLlN0cnVjdCh7XG4gIHNlbGVjdGVkOiBTY2hlbWEuQXJyYXkoU2NoZW1hLlN0cmluZykuYW5ub3RhdGUoe1xuICAgIGRlc2NyaXB0aW9uOiBcIlRoZSB2YWx1ZXMgb2YgdGhlIG9wdGlvbnMgbm93IHNlbGVjdGVkLlwiLFxuICB9KSxcbn0pO1xuZXhwb3J0IHR5cGUgUHJldmlld0F1dG9tYXRpb25TZWxlY3RSZXN1bHQgPSB0eXBlb2YgUHJldmlld0F1dG9tYXRpb25TZWxlY3RSZXN1bHQuVHlwZTtcblxuLyoqIEl0cyBKU09OIHNjaGVtYSBrZWVwcyBvbmx5IHRoZSBkZXNjcmlwdGlvbiBvbiBpdHMgbGFzdCBjaGVjay4gKi9cbmNvbnN0IERlc2NyaWJlZExvY2F0b3IgPSAoZGVzY3JpcHRpb246IHN0cmluZykgPT5cbiAgU2NoZW1hLlN0cmluZy5jaGVjayhTY2hlbWEuaXNUcmltbWVkKCkpXG4gICAgLmNoZWNrKFNjaGVtYS5pc05vbkVtcHR5KHsgZGVzY3JpcHRpb24gfSkpXG4gICAgLmFubm90YXRlS2V5KHsgZGVzY3JpcHRpb24gfSk7XG5cbmV4cG9ydCBjb25zdCBQcmV2aWV3QXV0b21hdGlvbkRyYWdJbnB1dCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICAuLi5QcmV2aWV3QXV0b21hdGlvblRhYlRhcmdldEZpZWxkcyxcbiAgc291cmNlOiBEZXNjcmliZWRMb2NhdG9yKFxuICAgIFwiTG9jYXRvciBvZiB0aGUgZWxlbWVudCB0byBkcmFnLCBmb3IgZXhhbXBsZSBhcmlhLXJlZj08cmVmPiBmcm9tIHRoZSBsYXRlc3Qgc25hcHNob3QuXCIsXG4gICksXG4gIHRhcmdldDogRGVzY3JpYmVkTG9jYXRvcihcIkxvY2F0b3Igb2YgdGhlIGVsZW1lbnQgdG8gZHJvcCBvbnRvLCBmb3IgZXhhbXBsZSBhcmlhLXJlZj08cmVmPi5cIiksXG4gIHRpbWVvdXRNczogT3B0aW9uYWxUaW1lb3V0TXMsXG59KS5hbm5vdGF0ZSh7IGRlc2NyaXB0aW9uOiBcIkRyYWdzIG9uZSBlbGVtZW50IGFuZCBkcm9wcyBpdCBvbnRvIGFub3RoZXIuXCIgfSk7XG5leHBvcnQgdHlwZSBQcmV2aWV3QXV0b21hdGlvbkRyYWdJbnB1dCA9IHR5cGVvZiBQcmV2aWV3QXV0b21hdGlvbkRyYWdJbnB1dC5UeXBlO1xuXG5leHBvcnQgY29uc3QgUHJldmlld0F1dG9tYXRpb25VcGxvYWRJbnB1dCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICAuLi5QcmV2aWV3QXV0b21hdGlvblRhYlRhcmdldEZpZWxkcyxcbiAgcGF0aHM6IFNjaGVtYS5BcnJheShUcmltbWVkTm9uRW1wdHlTdHJpbmcpLmNoZWNrKFNjaGVtYS5pc01heExlbmd0aCgyMCkpLmFubm90YXRlKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiQWJzb2x1dGUgcGF0aHMgb2YgZmlsZXMgb24gdGhlIGVudmlyb25tZW50IHRvIGdpdmUgdGhlIHBhZ2UuIEFuIGVtcHR5IGxpc3QgY2FuY2VscyB0aGUgb3BlbiBmaWxlIHBpY2tlci5cIixcbiAgfSksXG4gIHNlbGVjdG9yOiBTY2hlbWEub3B0aW9uYWwoTGVnYWN5U2VsZWN0b3IpLmFubm90YXRlKHtcbiAgICBkZXNjcmlwdGlvbjogXCJMZWdhY3kgQ1NTIHNlbGVjdG9yIGZvciBhbiA8aW5wdXQgdHlwZT1maWxlPi4gUHJlZmVyIGxvY2F0b3IuXCIsXG4gIH0pLFxuICBsb2NhdG9yOiBTY2hlbWEub3B0aW9uYWwoTG9jYXRvcikuYW5ub3RhdGUoe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJTZXQgZmlsZXMgZGlyZWN0bHkgb24gdGhpcyA8aW5wdXQgdHlwZT1maWxlPiBpbnN0ZWFkIG9mIGFuc3dlcmluZyB0aGUgb3BlbiBmaWxlIHBpY2tlci5cIixcbiAgfSksXG4gIHRpbWVvdXRNczogT3B0aW9uYWxUaW1lb3V0TXMsXG59KVxuICAuY2hlY2soXG4gICAgU2NoZW1hLm1ha2VGaWx0ZXIoXG4gICAgICAoaW5wdXQpID0+XG4gICAgICAgICEoaW5wdXQuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCAmJiBpbnB1dC5sb2NhdG9yICE9PSB1bmRlZmluZWQpIHx8XG4gICAgICAgIFwiUHJvdmlkZSBhdCBtb3N0IG9uZSBvZiBzZWxlY3RvciBvciBsb2NhdG9yLlwiLFxuICAgICksXG4gIClcbiAgLmFubm90YXRlKHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiQW5zd2VycyB0aGUgcGFnZSdzIG9wZW4gZmlsZSBwaWNrZXIsIG9yIHNldHMgZmlsZXMgb24gYSBmaWxlIGlucHV0IHdoZW4gbG9jYXRvci9zZWxlY3RvciBpcyBnaXZlbi5cIixcbiAgfSk7XG5leHBvcnQgdHlwZSBQcmV2aWV3QXV0b21hdGlvblVwbG9hZElucHV0ID0gdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uVXBsb2FkSW5wdXQuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFByZXZpZXdBdXRvbWF0aW9uVHlwZUlucHV0ID0gU2NoZW1hLlN0cnVjdCh7XG4gIC4uLlByZXZpZXdBdXRvbWF0aW9uVGFiVGFyZ2V0RmllbGRzLFxuICB0ZXh0OiBTY2hlbWEuU3RyaW5nLmFubm90YXRlKHsgZGVzY3JpcHRpb246IFwiTGl0ZXJhbCB0ZXh0IHRvIGluc2VydC5cIiB9KSxcbiAgc2VsZWN0b3I6IFNjaGVtYS5vcHRpb25hbChMZWdhY3lTZWxlY3RvcikuYW5ub3RhdGUoe1xuICAgIGRlc2NyaXB0aW9uOiBcIkxlZ2FjeSBDU1Mgc2VsZWN0b3IgZm9yIHRoZSBpbnB1dC4gUHJlZmVyIGxvY2F0b3IuXCIsXG4gIH0pLFxuICBsb2NhdG9yOiBTY2hlbWEub3B0aW9uYWwoTG9jYXRvcikuYW5ub3RhdGUoe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJQbGF5d3JpZ2h0IHNlbGVjdG9yIGZvciB0aGUgaW5wdXQsIGZvciBleGFtcGxlIHJvbGU9dGV4dGJveFtuYW1lPSdNZXNzYWdlJ10gb3IgdGV4dGFyZWFbcGxhY2Vob2xkZXIqPSdNZXNzYWdlJ10uXCIsXG4gIH0pLFxuICBjbGVhcjogU2NoZW1hLm9wdGlvbmFsKFxuICAgIFNjaGVtYS5Cb29sZWFuLmFubm90YXRlKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkNsZWFyIHRoZSBleGlzdGluZyBpbnB1dCB2YWx1ZSBiZWZvcmUgaW5zZXJ0aW5nIHRleHQuIERlZmF1bHRzIHRvIGZhbHNlLlwiLFxuICAgIH0pLFxuICApLFxuICB0aW1lb3V0TXM6IE9wdGlvbmFsVGltZW91dE1zLFxufSlcbiAgLmNoZWNrKFxuICAgIFNjaGVtYS5tYWtlRmlsdGVyKFxuICAgICAgKGlucHV0KSA9PlxuICAgICAgICAhKGlucHV0LnNlbGVjdG9yICE9PSB1bmRlZmluZWQgJiYgaW5wdXQubG9jYXRvciAhPT0gdW5kZWZpbmVkKSB8fFxuICAgICAgICBcIlByb3ZpZGUgYXQgbW9zdCBvbmUgb2Ygc2VsZWN0b3Igb3IgbG9jYXRvci5cIixcbiAgICApLFxuICApXG4gIC5hbm5vdGF0ZSh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlR5cGVzIGludG8gbG9jYXRvci9zZWxlY3Rvciwgb3IgaW50byB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudCB3aGVuIG5laXRoZXIgdGFyZ2V0IGlzIHByb3ZpZGVkLlwiLFxuICB9KTtcbmV4cG9ydCB0eXBlIFByZXZpZXdBdXRvbWF0aW9uVHlwZUlucHV0ID0gdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uVHlwZUlucHV0LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBQcmV2aWV3QXV0b21hdGlvblByZXNzSW5wdXQgPSBTY2hlbWEuU3RydWN0KHtcbiAgLi4uUHJldmlld0F1dG9tYXRpb25UYWJUYXJnZXRGaWVsZHMsXG4gIGtleTogU2NoZW1hLlN0cmluZy5jaGVjayhTY2hlbWEuaXNUcmltbWVkKCkpXG4gICAgLmNoZWNrKFxuICAgICAgU2NoZW1hLmlzTm9uRW1wdHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICBcIktleWJvYXJkIGtleSBuYW1lIHN1Y2ggYXMgRW50ZXIsIEVzY2FwZSwgVGFiLCBBcnJvd0Rvd24sIEJhY2tzcGFjZSwgb3IgYSBzaW5nbGUgY2hhcmFjdGVyLlwiLFxuICAgICAgfSksXG4gICAgKVxuICAgIC5hbm5vdGF0ZUtleSh7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJLZXlib2FyZCBrZXkgbmFtZSBzdWNoIGFzIEVudGVyLCBFc2NhcGUsIFRhYiwgQXJyb3dEb3duLCBCYWNrc3BhY2UsIG9yIGEgc2luZ2xlIGNoYXJhY3Rlci5cIixcbiAgICB9KSxcbiAgbW9kaWZpZXJzOiBTY2hlbWEub3B0aW9uYWwoXG4gICAgU2NoZW1hLkFycmF5KFNjaGVtYS5MaXRlcmFscyhbXCJBbHRcIiwgXCJDb250cm9sXCIsIFwiTWV0YVwiLCBcIlNoaWZ0XCJdKSkuYW5ub3RhdGUoe1xuICAgICAgZGVzY3JpcHRpb246IFwiTW9kaWZpZXIga2V5cyBoZWxkIHdoaWxlIHByZXNzaW5nIGtleS5cIixcbiAgICB9KSxcbiAgKSxcbn0pLmFubm90YXRlKHsgZGVzY3JpcHRpb246IFwiUHJlc3NlcyBvbmUga2V5Ym9hcmQga2V5IGluIHRoZSBhY3RpdmUgYnJvd3NlciB0YWIuXCIgfSk7XG5leHBvcnQgdHlwZSBQcmV2aWV3QXV0b21hdGlvblByZXNzSW5wdXQgPSB0eXBlb2YgUHJldmlld0F1dG9tYXRpb25QcmVzc0lucHV0LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBQcmV2aWV3QXV0b21hdGlvblNjcm9sbElucHV0ID0gU2NoZW1hLlN0cnVjdCh7XG4gIC4uLlByZXZpZXdBdXRvbWF0aW9uVGFiVGFyZ2V0RmllbGRzLFxuICBkZWx0YVg6IFNjaGVtYS5vcHRpb25hbChcbiAgICBTY2hlbWEuRmluaXRlLmFubm90YXRlKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkhvcml6b250YWwgc2Nyb2xsIGRlbHRhIGluIENTUyBwaXhlbHMuIFBvc2l0aXZlIHNjcm9sbHMgcmlnaHQuIERlZmF1bHRzIHRvIDAuXCIsXG4gICAgfSksXG4gICksXG4gIGRlbHRhWTogU2NoZW1hLm9wdGlvbmFsKFxuICAgIFNjaGVtYS5GaW5pdGUuYW5ub3RhdGUoe1xuICAgICAgZGVzY3JpcHRpb246IFwiVmVydGljYWwgc2Nyb2xsIGRlbHRhIGluIENTUyBwaXhlbHMuIFBvc2l0aXZlIHNjcm9sbHMgZG93bi4gRGVmYXVsdHMgdG8gMC5cIixcbiAgICB9KSxcbiAgKSxcbiAgc2VsZWN0b3I6IFNjaGVtYS5vcHRpb25hbChMZWdhY3lTZWxlY3RvcikuYW5ub3RhdGUoe1xuICAgIGRlc2NyaXB0aW9uOiBcIkxlZ2FjeSBDU1Mgc2VsZWN0b3IgZm9yIGEgc2Nyb2xsYWJsZSBjb250YWluZXIuIE9taXQgdG8gc2Nyb2xsIHRoZSB2aWV3cG9ydC5cIixcbiAgfSksXG4gIGxvY2F0b3I6IFNjaGVtYS5vcHRpb25hbChMb2NhdG9yKS5hbm5vdGF0ZSh7XG4gICAgZGVzY3JpcHRpb246IFwiUGxheXdyaWdodCBzZWxlY3RvciBmb3IgYSBzY3JvbGxhYmxlIGNvbnRhaW5lci4gT21pdCB0byBzY3JvbGwgdGhlIHZpZXdwb3J0LlwiLFxuICB9KSxcbn0pXG4gIC5jaGVjayhcbiAgICBTY2hlbWEubWFrZUZpbHRlcigoaW5wdXQpID0+IHtcbiAgICAgIGlmIChpbnB1dC5zZWxlY3RvciAhPT0gdW5kZWZpbmVkICYmIGlucHV0LmxvY2F0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gXCJQcm92aWRlIGF0IG1vc3Qgb25lIG9mIHNlbGVjdG9yIG9yIGxvY2F0b3IuXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBpbnB1dC5kZWx0YVggIT09IHVuZGVmaW5lZCB8fCBpbnB1dC5kZWx0YVkgIT09IHVuZGVmaW5lZCB8fCBcIlByb3ZpZGUgZGVsdGFYIG9yIGRlbHRhWS5cIlxuICAgICAgKTtcbiAgICB9KSxcbiAgKVxuICAuYW5ub3RhdGUoe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJTY3JvbGxzIHRoZSB2aWV3cG9ydCwgb3IgYSBsb2NhdG9yL3NlbGVjdG9yIGNvbnRhaW5lci4gUHJvdmlkZSBkZWx0YVgsIGRlbHRhWSwgb3IgYm90aC5cIixcbiAgfSk7XG5leHBvcnQgdHlwZSBQcmV2aWV3QXV0b21hdGlvblNjcm9sbElucHV0ID0gdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uU2Nyb2xsSW5wdXQuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFByZXZpZXdBdXRvbWF0aW9uRXZhbHVhdGVJbnB1dCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICAuLi5QcmV2aWV3QXV0b21hdGlvblRhYlRhcmdldEZpZWxkcyxcbiAgZXhwcmVzc2lvbjogU2NoZW1hLlN0cmluZy5jaGVjayhTY2hlbWEuaXNUcmltbWVkKCkpXG4gICAgLmNoZWNrKFxuICAgICAgU2NoZW1hLmlzTm9uRW1wdHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICBcIkphdmFTY3JpcHQgZXhwcmVzc2lvbiBldmFsdWF0ZWQgaW4gdGhlIHBhZ2UncyBtYWluIGZyYW1lLCBmb3IgZXhhbXBsZSBkb2N1bWVudC50aXRsZSBvciAoKCkgPT4gKHtocmVmOiBsb2NhdGlvbi5ocmVmfSkpKCkuXCIsXG4gICAgICB9KSxcbiAgICApXG4gICAgLmNoZWNrKFNjaGVtYS5pc01heExlbmd0aCg2NF8wMDApKVxuICAgIC5hbm5vdGF0ZUtleSh7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJKYXZhU2NyaXB0IGV4cHJlc3Npb24gZXZhbHVhdGVkIGluIHRoZSBwYWdlJ3MgbWFpbiBmcmFtZSwgZm9yIGV4YW1wbGUgZG9jdW1lbnQudGl0bGUgb3IgKCgpID0+ICh7aHJlZjogbG9jYXRpb24uaHJlZn0pKSgpLlwiLFxuICAgIH0pLFxuICBhd2FpdFByb21pc2U6IFNjaGVtYS5vcHRpb25hbChcbiAgICBTY2hlbWEuQm9vbGVhbi5hbm5vdGF0ZSh7IGRlc2NyaXB0aW9uOiBcIkF3YWl0IGEgcmV0dXJuZWQgUHJvbWlzZS4gRGVmYXVsdHMgdG8gdHJ1ZS5cIiB9KSxcbiAgKSxcbiAgcmV0dXJuQnlWYWx1ZTogU2NoZW1hLm9wdGlvbmFsKFxuICAgIFNjaGVtYS5Cb29sZWFuLmFubm90YXRlKHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlNlcmlhbGl6ZSBhbmQgcmV0dXJuIHRoZSB2YWx1ZSBpbnN0ZWFkIG9mIGEgcmVtb3RlIG9iamVjdCByZWZlcmVuY2UuIERlZmF1bHRzIHRvIHRydWUuXCIsXG4gICAgfSksXG4gICksXG59KS5hbm5vdGF0ZSh7XG4gIGRlc2NyaXB0aW9uOlxuICAgIFwiRXZhbHVhdGVzIEphdmFTY3JpcHQgaW4gdGhlIHBhZ2UuIFByZWZlciBzbmFwc2hvdCBhbmQgc2VtYW50aWMgYWN0aW9uczsgdXNlIGV2YWx1YXRlIGZvciBpbnNwZWN0aW9uIG9yIHVuc3VwcG9ydGVkIGludGVyYWN0aW9ucy5cIixcbn0pO1xuZXhwb3J0IHR5cGUgUHJldmlld0F1dG9tYXRpb25FdmFsdWF0ZUlucHV0ID0gdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uRXZhbHVhdGVJbnB1dC5UeXBlO1xuXG5leHBvcnQgY29uc3QgUHJldmlld0F1dG9tYXRpb25XYWl0Rm9ySW5wdXQgPSBTY2hlbWEuU3RydWN0KHtcbiAgLi4uUHJldmlld0F1dG9tYXRpb25UYWJUYXJnZXRGaWVsZHMsXG4gIHNlbGVjdG9yOiBTY2hlbWEub3B0aW9uYWwoTGVnYWN5U2VsZWN0b3IpLmFubm90YXRlKHtcbiAgICBkZXNjcmlwdGlvbjogXCJMZWdhY3kgQ1NTIHNlbGVjdG9yIHRoYXQgbXVzdCBtYXRjaCBhbiBlbGVtZW50LiBQcmVmZXIgbG9jYXRvci5cIixcbiAgfSksXG4gIGxvY2F0b3I6IFNjaGVtYS5vcHRpb25hbChMb2NhdG9yKS5hbm5vdGF0ZSh7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlBsYXl3cmlnaHQgc2VsZWN0b3IgdGhhdCBtdXN0IG1hdGNoIGFuIGVsZW1lbnQsIGZvciBleGFtcGxlIHJvbGU9YnV0dG9uW25hbWU9J1NlbmQnXS5cIixcbiAgfSksXG4gIHRleHQ6IFNjaGVtYS5vcHRpb25hbChcbiAgICBUcmltbWVkTm9uRW1wdHlTdHJpbmcuYW5ub3RhdGUoe1xuICAgICAgZGVzY3JpcHRpb246IFwiQ2FzZS1zZW5zaXRpdmUgc3Vic3RyaW5nIHRoYXQgbXVzdCBhcHBlYXIgaW4gdmlzaWJsZSBkb2N1bWVudCB0ZXh0LlwiLFxuICAgIH0pLFxuICApLmFubm90YXRlKHtcbiAgICBkZXNjcmlwdGlvbjogXCJDYXNlLXNlbnNpdGl2ZSBzdWJzdHJpbmcgdGhhdCBtdXN0IGFwcGVhciBpbiB2aXNpYmxlIGRvY3VtZW50IHRleHQuXCIsXG4gIH0pLFxuICB1cmxJbmNsdWRlczogU2NoZW1hLm9wdGlvbmFsKFxuICAgIFRyaW1tZWROb25FbXB0eVN0cmluZy5hbm5vdGF0ZSh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJTdWJzdHJpbmcgdGhhdCBtdXN0IGFwcGVhciBpbiB0aGUgY3VycmVudCBhYnNvbHV0ZSBVUkwuXCIsXG4gICAgfSksXG4gICkuYW5ub3RhdGUoeyBkZXNjcmlwdGlvbjogXCJTdWJzdHJpbmcgdGhhdCBtdXN0IGFwcGVhciBpbiB0aGUgY3VycmVudCBhYnNvbHV0ZSBVUkwuXCIgfSksXG4gIHRpbWVvdXRNczogT3B0aW9uYWxUaW1lb3V0TXMsXG59KVxuICAuY2hlY2soXG4gICAgU2NoZW1hLm1ha2VGaWx0ZXIoKGlucHV0KSA9PiB7XG4gICAgICBpZiAoaW5wdXQuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCAmJiBpbnB1dC5sb2NhdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFwiUHJvdmlkZSBhdCBtb3N0IG9uZSBvZiBzZWxlY3RvciBvciBsb2NhdG9yLlwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgaW5wdXQuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBpbnB1dC5sb2NhdG9yICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgaW5wdXQudGV4dCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIGlucHV0LnVybEluY2x1ZGVzICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgXCJQcm92aWRlIGF0IGxlYXN0IG9uZSB3YWl0IGNvbmRpdGlvbi5cIlxuICAgICAgKTtcbiAgICB9KSxcbiAgKVxuICAuYW5ub3RhdGUoe1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJXYWl0cyB1bnRpbCBhbGwgcHJvdmlkZWQgY29uZGl0aW9ucyBtYXRjaC4gVXNlIGFmdGVyIGNsaWNrL3R5cGUgd2hlbiB0aGUgcGFnZSBjaGFuZ2VzIGFzeW5jaHJvbm91c2x5LlwiLFxuICB9KTtcbmV4cG9ydCB0eXBlIFByZXZpZXdBdXRvbWF0aW9uV2FpdEZvcklucHV0ID0gdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uV2FpdEZvcklucHV0LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBQcmV2aWV3QXV0b21hdGlvbkVsZW1lbnQgPSBTY2hlbWEuU3RydWN0KHtcbiAgdGFnOiBTY2hlbWEuU3RyaW5nLFxuICByb2xlOiBTY2hlbWEuTnVsbE9yKFNjaGVtYS5TdHJpbmcpLFxuICBuYW1lOiBTY2hlbWEuU3RyaW5nLFxuICBzZWxlY3RvcjogU2NoZW1hLlN0cmluZyxcbiAgeDogU2NoZW1hLk51bWJlcixcbiAgeTogU2NoZW1hLk51bWJlcixcbiAgd2lkdGg6IFNjaGVtYS5OdW1iZXIsXG4gIGhlaWdodDogU2NoZW1hLk51bWJlcixcbn0pO1xuZXhwb3J0IHR5cGUgUHJldmlld0F1dG9tYXRpb25FbGVtZW50ID0gdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uRWxlbWVudC5UeXBlO1xuXG5leHBvcnQgY29uc3QgUHJldmlld0F1dG9tYXRpb25Db25zb2xlRW50cnkgPSBTY2hlbWEuU3RydWN0KHtcbiAgbGV2ZWw6IFNjaGVtYS5TdHJpbmcsXG4gIHRleHQ6IFNjaGVtYS5TdHJpbmcsXG4gIHRpbWVzdGFtcDogU2NoZW1hLlN0cmluZyxcbiAgc291cmNlOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLlN0cmluZyksXG59KTtcbmV4cG9ydCB0eXBlIFByZXZpZXdBdXRvbWF0aW9uQ29uc29sZUVudHJ5ID0gdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uQ29uc29sZUVudHJ5LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBQcmV2aWV3QXV0b21hdGlvbk5ldHdvcmtFbnRyeSA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICB1cmw6IFNjaGVtYS5TdHJpbmcsXG4gIG1ldGhvZDogU2NoZW1hLlN0cmluZyxcbiAgc3RhdHVzOiBTY2hlbWEuTnVsbE9yKFNjaGVtYS5OdW1iZXIpLFxuICBmYWlsZWQ6IFNjaGVtYS5Cb29sZWFuLFxuICBlcnJvclRleHQ6IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuU3RyaW5nKSxcbiAgdGltZXN0YW1wOiBTY2hlbWEuU3RyaW5nLFxufSk7XG5leHBvcnQgdHlwZSBQcmV2aWV3QXV0b21hdGlvbk5ldHdvcmtFbnRyeSA9IHR5cGVvZiBQcmV2aWV3QXV0b21hdGlvbk5ldHdvcmtFbnRyeS5UeXBlO1xuXG5leHBvcnQgY29uc3QgUHJldmlld0F1dG9tYXRpb25BY3Rpb25FdmVudCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBpZDogU2NoZW1hLlN0cmluZyxcbiAgYWN0aW9uOiBTY2hlbWEuU3RyaW5nLFxuICBzdGF0dXM6IFNjaGVtYS5MaXRlcmFscyhbXCJydW5uaW5nXCIsIFwic3VjY2VlZGVkXCIsIFwiZmFpbGVkXCIsIFwiaW50ZXJydXB0ZWRcIl0pLFxuICBzdGFydGVkQXQ6IFNjaGVtYS5TdHJpbmcsXG4gIGNvbXBsZXRlZEF0OiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLlN0cmluZyksXG4gIGVycm9yOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLlN0cmluZyksXG59KTtcbmV4cG9ydCB0eXBlIFByZXZpZXdBdXRvbWF0aW9uQWN0aW9uRXZlbnQgPSB0eXBlb2YgUHJldmlld0F1dG9tYXRpb25BY3Rpb25FdmVudC5UeXBlO1xuXG5leHBvcnQgY29uc3QgUHJldmlld0F1dG9tYXRpb25TbmFwc2hvdCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICB1cmw6IFNjaGVtYS5TdHJpbmcsXG4gIHRpdGxlOiBTY2hlbWEuU3RyaW5nLFxuICBsb2FkaW5nOiBTY2hlbWEuQm9vbGVhbixcbiAgdmlzaWJsZVRleHQ6IFNjaGVtYS5TdHJpbmcsXG4gIGludGVyYWN0aXZlRWxlbWVudHM6IFNjaGVtYS5BcnJheShQcmV2aWV3QXV0b21hdGlvbkVsZW1lbnQpLFxuICBhY2Nlc3NpYmlsaXR5VHJlZTogU2NoZW1hLlVua25vd24sXG4gIGNvbnNvbGVFbnRyaWVzOiBTY2hlbWEuQXJyYXkoUHJldmlld0F1dG9tYXRpb25Db25zb2xlRW50cnkpLFxuICBuZXR3b3JrRW50cmllczogU2NoZW1hLkFycmF5KFByZXZpZXdBdXRvbWF0aW9uTmV0d29ya0VudHJ5KSxcbiAgYWN0aW9uVGltZWxpbmU6IFNjaGVtYS5BcnJheShQcmV2aWV3QXV0b21hdGlvbkFjdGlvbkV2ZW50KSxcbiAgc2NyZWVuc2hvdDogU2NoZW1hLlN0cnVjdCh7XG4gICAgbWltZVR5cGU6IFNjaGVtYS5MaXRlcmFsKFwiaW1hZ2UvcG5nXCIpLFxuICAgIGRhdGE6IFNjaGVtYS5TdHJpbmcsXG4gICAgd2lkdGg6IFNjaGVtYS5JbnQsXG4gICAgaGVpZ2h0OiBTY2hlbWEuSW50LFxuICB9KSxcbn0pO1xuZXhwb3J0IHR5cGUgUHJldmlld0F1dG9tYXRpb25TbmFwc2hvdCA9IHR5cGVvZiBQcmV2aWV3QXV0b21hdGlvblNuYXBzaG90LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBQcmV2aWV3QXV0b21hdGlvblJlY29yZGluZ1N0YXR1cyA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICB0YWJJZDogUHJldmlld1RhYklkLFxuICByZWNvcmRpbmc6IFNjaGVtYS5Cb29sZWFuLFxuICBzdGFydGVkQXQ6IFNjaGVtYS5OdWxsT3IoU2NoZW1hLlN0cmluZyksXG59KTtcbmV4cG9ydCB0eXBlIFByZXZpZXdBdXRvbWF0aW9uUmVjb3JkaW5nU3RhdHVzID0gdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uUmVjb3JkaW5nU3RhdHVzLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBQUkVWSUVXX1JFQ09SRElOR19TVE9QX1RJTUVPVVRfTVMgPSAxMjBfMDAwO1xuXG5leHBvcnQgY29uc3QgUHJldmlld0F1dG9tYXRpb25SZWNvcmRpbmdBcnRpZmFjdCA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBpZDogU2NoZW1hLlN0cmluZyxcbiAgdGFiSWQ6IFByZXZpZXdUYWJJZCxcbiAgcGF0aDogU2NoZW1hLlN0cmluZyxcbiAgbWltZVR5cGU6IFNjaGVtYS5TdHJpbmcsXG4gIHNpemVCeXRlczogU2NoZW1hLkludCxcbiAgY3JlYXRlZEF0OiBTY2hlbWEuU3RyaW5nLFxufSk7XG5leHBvcnQgdHlwZSBQcmV2aWV3QXV0b21hdGlvblJlY29yZGluZ0FydGlmYWN0ID0gdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uUmVjb3JkaW5nQXJ0aWZhY3QuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFByZXZpZXdBdXRvbWF0aW9uQ2xpZW50SWQgPSBUcmltbWVkTm9uRW1wdHlTdHJpbmcuY2hlY2soU2NoZW1hLmlzTWF4TGVuZ3RoKDEyOCkpO1xuZXhwb3J0IHR5cGUgUHJldmlld0F1dG9tYXRpb25DbGllbnRJZCA9IHR5cGVvZiBQcmV2aWV3QXV0b21hdGlvbkNsaWVudElkLlR5cGU7XG5leHBvcnQgY29uc3QgUHJldmlld0F1dG9tYXRpb25Db25uZWN0aW9uSWQgPSBUcmltbWVkTm9uRW1wdHlTdHJpbmcuY2hlY2soU2NoZW1hLmlzTWF4TGVuZ3RoKDY0KSk7XG5leHBvcnQgdHlwZSBQcmV2aWV3QXV0b21hdGlvbkNvbm5lY3Rpb25JZCA9IHR5cGVvZiBQcmV2aWV3QXV0b21hdGlvbkNvbm5lY3Rpb25JZC5UeXBlO1xuXG5leHBvcnQgY29uc3QgUHJldmlld0F1dG9tYXRpb25Ib3N0SWRlbnRpdHkgPSBTY2hlbWEuU3RydWN0KHtcbiAgY2xpZW50SWQ6IFByZXZpZXdBdXRvbWF0aW9uQ2xpZW50SWQsXG4gIGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQsXG59KTtcbmV4cG9ydCB0eXBlIFByZXZpZXdBdXRvbWF0aW9uSG9zdElkZW50aXR5ID0gdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uSG9zdElkZW50aXR5LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBQcmV2aWV3QXV0b21hdGlvbkhvc3QgPSBTY2hlbWEuU3RydWN0KHtcbiAgLi4uUHJldmlld0F1dG9tYXRpb25Ib3N0SWRlbnRpdHkuZmllbGRzLFxuICAvKiogTWlzc2luZyBtZWFucyB0aGUgVjEgb3BlcmF0aW9uIHNldCBmcm9tIGJlZm9yZSBjYXBhYmlsaXR5IG5lZ290aWF0aW9uLiAqL1xuICBzdXBwb3J0ZWRPcGVyYXRpb25zOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLkFycmF5KFByZXZpZXdBdXRvbWF0aW9uT3BlcmF0aW9uKSksXG59KTtcbmV4cG9ydCB0eXBlIFByZXZpZXdBdXRvbWF0aW9uSG9zdCA9IHR5cGVvZiBQcmV2aWV3QXV0b21hdGlvbkhvc3QuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFByZXZpZXdBdXRvbWF0aW9uSG9zdEZvY3VzID0gU2NoZW1hLlN0cnVjdCh7XG4gIC4uLlByZXZpZXdBdXRvbWF0aW9uSG9zdElkZW50aXR5LmZpZWxkcyxcbiAgY29ubmVjdGlvbklkOiBQcmV2aWV3QXV0b21hdGlvbkNvbm5lY3Rpb25JZCxcbiAgZm9jdXNlZDogU2NoZW1hLkJvb2xlYW4sXG4gIGxpdmVUYWJzOiBTY2hlbWEub3B0aW9uYWwoXG4gICAgU2NoZW1hLkFycmF5KFxuICAgICAgU2NoZW1hLlN0cnVjdCh7XG4gICAgICAgIHRocmVhZElkOiBUaHJlYWRJZCxcbiAgICAgICAgdGFiSWQ6IFByZXZpZXdUYWJJZCxcbiAgICAgICAgdmlzaWJsZTogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5Cb29sZWFuKSxcbiAgICAgIH0pLFxuICAgICksXG4gICksXG59KTtcbmV4cG9ydCB0eXBlIFByZXZpZXdBdXRvbWF0aW9uSG9zdEZvY3VzID0gdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uSG9zdEZvY3VzLlR5cGU7XG5cbmV4cG9ydCBjb25zdCBQcmV2aWV3QXV0b21hdGlvblJlcXVlc3QgPSBTY2hlbWEuU3RydWN0KHtcbiAgcmVxdWVzdElkOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIHRocmVhZElkOiBUaHJlYWRJZCxcbiAgdGFiSWQ6IFNjaGVtYS5vcHRpb25hbChQcmV2aWV3VGFiSWQpLFxuICB0YWJJZEV4cGxpY2l0OiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLkJvb2xlYW4pLFxuICAvKiogU3VwcGxpZWQgYnkgdGhlIGJyb2tlciBmcm9tIGF1dGhlbnRpY2F0ZWQgc2NvcGUsIG5ldmVyIGZyb20gdG9vbCBpbnB1dC4gKi9cbiAgYWdlbnRTZXNzaW9uSWQ6IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuU3RyaW5nKSxcbiAgb3BlcmF0aW9uOiBQcmV2aWV3QXV0b21hdGlvbk9wZXJhdGlvbixcbiAgaW5wdXQ6IFNjaGVtYS5Vbmtub3duLFxuICB0aW1lb3V0TXM6IFNjaGVtYS5JbnQuY2hlY2soU2NoZW1hLmlzR3JlYXRlclRoYW4oMCkpLFxufSk7XG5leHBvcnQgdHlwZSBQcmV2aWV3QXV0b21hdGlvblJlcXVlc3QgPSB0eXBlb2YgUHJldmlld0F1dG9tYXRpb25SZXF1ZXN0LlR5cGU7XG5cbmV4cG9ydCBjb25zdCBQcmV2aWV3QXV0b21hdGlvblN0cmVhbUV2ZW50ID0gU2NoZW1hLlVuaW9uKFtcbiAgU2NoZW1hLlN0cnVjdCh7XG4gICAgdHlwZTogU2NoZW1hLkxpdGVyYWwoXCJjb25uZWN0ZWRcIiksXG4gICAgY29ubmVjdGlvbklkOiBQcmV2aWV3QXV0b21hdGlvbkNvbm5lY3Rpb25JZCxcbiAgfSksXG4gIFNjaGVtYS5TdHJ1Y3Qoe1xuICAgIHR5cGU6IFNjaGVtYS5MaXRlcmFsKFwicmVxdWVzdFwiKSxcbiAgICBjb25uZWN0aW9uSWQ6IFByZXZpZXdBdXRvbWF0aW9uQ29ubmVjdGlvbklkLFxuICAgIHJlcXVlc3Q6IFByZXZpZXdBdXRvbWF0aW9uUmVxdWVzdCxcbiAgfSksXG5dKTtcbmV4cG9ydCB0eXBlIFByZXZpZXdBdXRvbWF0aW9uU3RyZWFtRXZlbnQgPSB0eXBlb2YgUHJldmlld0F1dG9tYXRpb25TdHJlYW1FdmVudC5UeXBlO1xuXG5leHBvcnQgY29uc3QgUHJldmlld0F1dG9tYXRpb25SZXNwb25zZSA9IFNjaGVtYS5TdHJ1Y3Qoe1xuICBjbGllbnRJZDogUHJldmlld0F1dG9tYXRpb25DbGllbnRJZCxcbiAgY29ubmVjdGlvbklkOiBQcmV2aWV3QXV0b21hdGlvbkNvbm5lY3Rpb25JZCxcbiAgcmVxdWVzdElkOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIG9rOiBTY2hlbWEuQm9vbGVhbixcbiAgcmVzdWx0OiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLlVua25vd24pLFxuICBlcnJvcjogU2NoZW1hLm9wdGlvbmFsKFxuICAgIFNjaGVtYS5TdHJ1Y3Qoe1xuICAgICAgX3RhZzogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICAgICAgbWVzc2FnZTogU2NoZW1hLlN0cmluZyxcbiAgICAgIGRldGFpbDogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5Vbmtub3duKSxcbiAgICB9KSxcbiAgKSxcbn0pO1xuZXhwb3J0IHR5cGUgUHJldmlld0F1dG9tYXRpb25SZXNwb25zZSA9IHR5cGVvZiBQcmV2aWV3QXV0b21hdGlvblJlc3BvbnNlLlR5cGU7XG5cbmNvbnN0IE1jcENhcGFiaWxpdHlFcnJvckZpZWxkcyA9IHtcbiAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCxcbiAgdGhyZWFkSWQ6IFNjaGVtYS5vcHRpb25hbChUaHJlYWRJZCksXG4gIHByb3ZpZGVyU2Vzc2lvbklkOiBTY2hlbWEub3B0aW9uYWwoVHJpbW1lZE5vbkVtcHR5U3RyaW5nKSxcbiAgcHJvdmlkZXJJbnN0YW5jZUlkOiBTY2hlbWEub3B0aW9uYWwoUHJvdmlkZXJJbnN0YW5jZUlkKSxcbn07XG5cbmV4cG9ydCBjbGFzcyBQcmV2aWV3QXV0b21hdGlvblVuYXZhaWxhYmxlRXJyb3IgZXh0ZW5kcyBTY2hlbWEuVGFnZ2VkRXJyb3I8UHJldmlld0F1dG9tYXRpb25VbmF2YWlsYWJsZUVycm9yPigpKFxuICBcIlByZXZpZXdBdXRvbWF0aW9uVW5hdmFpbGFibGVFcnJvclwiLFxuICB7XG4gICAgY2FwYWJpbGl0eTogU2NoZW1hLkxpdGVyYWwoXCJwcmV2aWV3XCIpLFxuICAgIC4uLk1jcENhcGFiaWxpdHlFcnJvckZpZWxkcyxcbiAgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTUNQIGNyZWRlbnRpYWwgZG9lcyBub3QgZ3JhbnQgdGhlICR7dGhpcy5jYXBhYmlsaXR5fSBjYXBhYmlsaXR5OiBicm93c2VyIHByZXZpZXcgdG9vbHMgYXJlIG9mZiBmb3IgdGhpcyB0aHJlYWQuIERvIG5vdCByZXRyeSB0aGVtLiBUbyBjaGVjayBhIHBhZ2UsIHVzZSBhIGhlYWRsZXNzIGJyb3dzZXIgZnJvbSB0aGUgc2hlbGwsIHN1Y2ggYXMgUGxheXdyaWdodCwgb3IgY3VybC4gVGhlIHVzZXIgY2FuIHR1cm4gb24gXCJBZ2VudCBicm93c2VyIGFjY2Vzc1wiIGluIFNldHRpbmdzOyBpdCBhcHBsaWVzIHdoZW4gdGhlIGFnZW50IHNlc3Npb24gbmV4dCBzdGFydHMuYDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWNwQ2FwYWJpbGl0eVVuYXZhaWxhYmxlRXJyb3IgZXh0ZW5kcyBTY2hlbWEuVGFnZ2VkRXJyb3I8TWNwQ2FwYWJpbGl0eVVuYXZhaWxhYmxlRXJyb3I+KCkoXG4gIFwiTWNwQ2FwYWJpbGl0eVVuYXZhaWxhYmxlRXJyb3JcIixcbiAge1xuICAgIGNhcGFiaWxpdHk6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgICAuLi5NY3BDYXBhYmlsaXR5RXJyb3JGaWVsZHMsXG4gIH0sXG4pIHtcbiAgb3ZlcnJpZGUgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE1DUCBjcmVkZW50aWFsIGRvZXMgbm90IGdyYW50IHRoZSAke3RoaXMuY2FwYWJpbGl0eX0gY2FwYWJpbGl0eS5gO1xuICB9XG59XG5cbmNvbnN0IFByZXZpZXdBdXRvbWF0aW9uU2NvcGVFcnJvckZpZWxkcyA9IHtcbiAgb3BlcmF0aW9uOiBQcmV2aWV3QXV0b21hdGlvbk9wZXJhdGlvbixcbiAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZCxcbiAgdGhyZWFkSWQ6IFRocmVhZElkLFxuICBwcm92aWRlclNlc3Npb25JZDogVHJpbW1lZE5vbkVtcHR5U3RyaW5nLFxuICBwcm92aWRlckluc3RhbmNlSWQ6IFByb3ZpZGVySW5zdGFuY2VJZCxcbn07XG5cbmV4cG9ydCBjb25zdCBTRVJWRVJfQlJPV1NFUl9BVVRPTUFUSU9OX0NMSUVOVF9JRCA9IFwic2VydmVyLWJyb3dzZXJcIjtcblxuY29uc3QgUHJldmlld0F1dG9tYXRpb25SZXF1ZXN0RXJyb3JGaWVsZHMgPSB7XG4gIC4uLlByZXZpZXdBdXRvbWF0aW9uU2NvcGVFcnJvckZpZWxkcyxcbiAgY2xpZW50SWQ6IFRyaW1tZWROb25FbXB0eVN0cmluZyxcbiAgY29ubmVjdGlvbklkOiBQcmV2aWV3QXV0b21hdGlvbkNvbm5lY3Rpb25JZCxcbiAgcmVxdWVzdElkOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIHRhYklkOiBTY2hlbWEub3B0aW9uYWwoUHJldmlld1RhYklkKSxcbiAgdGltZW91dE1zOiBTY2hlbWEuSW50LmNoZWNrKFNjaGVtYS5pc0dyZWF0ZXJUaGFuKDApKSxcbn07XG5cbmNvbnN0IFByZXZpZXdBdXRvbWF0aW9uUmVtb3RlRGlhZ25vc3RpY0ZpZWxkcyA9IHtcbiAgcmVtb3RlVGFnOiBUcmltbWVkTm9uRW1wdHlTdHJpbmcsXG4gIHJlbW90ZU1lc3NhZ2VMZW5ndGg6IFNjaGVtYS5JbnQuY2hlY2soU2NoZW1hLmlzR3JlYXRlclRoYW5PckVxdWFsVG8oMCkpLFxuICByZW1vdGVEZXRhaWxLaW5kOiBTY2hlbWEub3B0aW9uYWwoXG4gICAgU2NoZW1hLkxpdGVyYWxzKFtcIm51bGxcIiwgXCJhcnJheVwiLCBcIm9iamVjdFwiLCBcInN0cmluZ1wiLCBcIm51bWJlclwiLCBcImJvb2xlYW5cIl0pLFxuICApLFxuICBjYXVzZTogU2NoZW1hLkRlZmVjdCgpLFxufTtcblxuY29uc3QgUHJldmlld0F1dG9tYXRpb25PcHRpb25hbFJlbW90ZURpYWdub3N0aWNGaWVsZHMgPSB7XG4gIHJlbW90ZVRhZzogU2NoZW1hLm9wdGlvbmFsKFRyaW1tZWROb25FbXB0eVN0cmluZyksXG4gIHJlbW90ZU1lc3NhZ2VMZW5ndGg6IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuSW50LmNoZWNrKFNjaGVtYS5pc0dyZWF0ZXJUaGFuT3JFcXVhbFRvKDApKSksXG4gIHJlbW90ZURldGFpbEtpbmQ6IFNjaGVtYS5vcHRpb25hbChcbiAgICBTY2hlbWEuTGl0ZXJhbHMoW1wibnVsbFwiLCBcImFycmF5XCIsIFwib2JqZWN0XCIsIFwic3RyaW5nXCIsIFwibnVtYmVyXCIsIFwiYm9vbGVhblwiXSksXG4gICksXG4gIGNhdXNlOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLkRlZmVjdCgpKSxcbn07XG5cbmV4cG9ydCBjbGFzcyBQcmV2aWV3QXV0b21hdGlvbk5vQXZhaWxhYmxlSG9zdEVycm9yIGV4dGVuZHMgU2NoZW1hLlRhZ2dlZEVycm9yPFByZXZpZXdBdXRvbWF0aW9uTm9BdmFpbGFibGVIb3N0RXJyb3I+KCkoXG4gIFwiUHJldmlld0F1dG9tYXRpb25Ob0F2YWlsYWJsZUhvc3RFcnJvclwiLFxuICB7XG4gICAgLi4uUHJldmlld0F1dG9tYXRpb25TY29wZUVycm9yRmllbGRzLFxuICAgIGNsaWVudElkOiBTY2hlbWEub3B0aW9uYWwoVHJpbW1lZE5vbkVtcHR5U3RyaW5nKSxcbiAgICBjb25uZWN0aW9uSWQ6IFNjaGVtYS5vcHRpb25hbChQcmV2aWV3QXV0b21hdGlvbkNvbm5lY3Rpb25JZCksXG4gICAgcmVxdWVzdElkOiBTY2hlbWEub3B0aW9uYWwoVHJpbW1lZE5vbkVtcHR5U3RyaW5nKSxcbiAgICB0YWJJZDogU2NoZW1hLm9wdGlvbmFsKFByZXZpZXdUYWJJZCksXG4gICAgdGltZW91dE1zOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLkludC5jaGVjayhTY2hlbWEuaXNHcmVhdGVyVGhhbigwKSkpLFxuICAgIC4uLlByZXZpZXdBdXRvbWF0aW9uT3B0aW9uYWxSZW1vdGVEaWFnbm9zdGljRmllbGRzLFxuICB9LFxuKSB7XG4gIG92ZXJyaWRlIGdldCBtZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBObyBwcmV2aWV3IGF1dG9tYXRpb24gaG9zdCBpcyBhdmFpbGFibGUgZm9yICR7dGhpcy5vcGVyYXRpb259IGluIGVudmlyb25tZW50ICR7dGhpcy5lbnZpcm9ubWVudElkfS4gVGhlIHNlcnZlci1vd25lZCBicm93c2VyIG1heSBiZSBzdGFydGluZyBvciByZWNvbm5lY3RpbmcuIFJldHJ5IHByZXZpZXdfc3RhdHVzLCB0aGVuIGNhbGwgcHJldmlld19vcGVuIGlmIG5vIHRhYiBpcyBhdmFpbGFibGUuIElmIGl0IHJlbWFpbnMgdW5hdmFpbGFibGUsIHJlcG9ydCB0aGUgYnJvd3NlciBjb25uZWN0aW9uIGZhaWx1cmUuYDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJldmlld0F1dG9tYXRpb25VbnN1cHBvcnRlZENsaWVudEVycm9yIGV4dGVuZHMgU2NoZW1hLlRhZ2dlZEVycm9yPFByZXZpZXdBdXRvbWF0aW9uVW5zdXBwb3J0ZWRDbGllbnRFcnJvcj4oKShcbiAgXCJQcmV2aWV3QXV0b21hdGlvblVuc3VwcG9ydGVkQ2xpZW50RXJyb3JcIixcbiAge1xuICAgIC4uLlByZXZpZXdBdXRvbWF0aW9uUmVxdWVzdEVycm9yRmllbGRzLFxuICAgIC4uLlByZXZpZXdBdXRvbWF0aW9uUmVtb3RlRGlhZ25vc3RpY0ZpZWxkcyxcbiAgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUHJldmlldyBhdXRvbWF0aW9uIGNsaWVudCAke3RoaXMuY2xpZW50SWR9IGRvZXMgbm90IHN1cHBvcnQgJHt0aGlzLm9wZXJhdGlvbn0uYDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJldmlld0F1dG9tYXRpb25UYWJOb3RGb3VuZEVycm9yIGV4dGVuZHMgU2NoZW1hLlRhZ2dlZEVycm9yPFByZXZpZXdBdXRvbWF0aW9uVGFiTm90Rm91bmRFcnJvcj4oKShcbiAgXCJQcmV2aWV3QXV0b21hdGlvblRhYk5vdEZvdW5kRXJyb3JcIixcbiAge1xuICAgIC4uLlByZXZpZXdBdXRvbWF0aW9uUmVxdWVzdEVycm9yRmllbGRzLFxuICAgIC4uLlByZXZpZXdBdXRvbWF0aW9uUmVtb3RlRGlhZ25vc3RpY0ZpZWxkcyxcbiAgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRhYklkXG4gICAgICA/IGBQcmV2aWV3IHRhYiAke3RoaXMudGFiSWR9IHdhcyBub3QgZm91bmQgZm9yICR7dGhpcy5vcGVyYXRpb259LiBPbWl0IHRhYklkIHRvIHVzZSB0aGUgY3VycmVudCB0YWIsIG9yIGNhbGwgcHJldmlld19vcGVuLmBcbiAgICAgIDogYE5vIGFjdGl2ZSBwcmV2aWV3IHRhYiB3YXMgZm91bmQgZm9yICR7dGhpcy5vcGVyYXRpb259LiBDYWxsIHByZXZpZXdfb3BlbiBmaXJzdC5gO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcmV2aWV3QXV0b21hdGlvblRpbWVvdXRFcnJvciBleHRlbmRzIFNjaGVtYS5UYWdnZWRFcnJvcjxQcmV2aWV3QXV0b21hdGlvblRpbWVvdXRFcnJvcj4oKShcbiAgXCJQcmV2aWV3QXV0b21hdGlvblRpbWVvdXRFcnJvclwiLFxuICB7XG4gICAgLi4uUHJldmlld0F1dG9tYXRpb25SZXF1ZXN0RXJyb3JGaWVsZHMsXG4gICAgLi4uUHJldmlld0F1dG9tYXRpb25PcHRpb25hbFJlbW90ZURpYWdub3N0aWNGaWVsZHMsXG4gIH0sXG4pIHtcbiAgb3ZlcnJpZGUgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gYFByZXZpZXcgYXV0b21hdGlvbiAke3RoaXMub3BlcmF0aW9ufSB0aW1lZCBvdXQgYWZ0ZXIgJHt0aGlzLnRpbWVvdXRNc31tcy5gO1xuICAgIHJldHVybiBzdW1tYXJ5O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBQcmV2aWV3QXV0b21hdGlvbkNvbnRyb2xSZWFzb24gPSBTY2hlbWEuTGl0ZXJhbHMoW1xuICBcImFnZW50TWlzbWF0Y2hcIixcbiAgXCJodW1hbkNvbnRyb2xcIixcbiAgXCJ0YWJSZXF1aXJlZFwiLFxuICBcImNsb3NlZFwiLFxuICBcImludGVycnVwdGVkXCIsXG4gIFwiZGlhbG9nUGVuZGluZ1wiLFxuICBcInRhYkxpbWl0XCIsXG5dKTtcbmV4cG9ydCB0eXBlIFByZXZpZXdBdXRvbWF0aW9uQ29udHJvbFJlYXNvbiA9IHR5cGVvZiBQcmV2aWV3QXV0b21hdGlvbkNvbnRyb2xSZWFzb24uVHlwZTtcblxuZXhwb3J0IGNsYXNzIFByZXZpZXdBdXRvbWF0aW9uQ29udHJvbEludGVycnVwdGVkRXJyb3IgZXh0ZW5kcyBTY2hlbWEuVGFnZ2VkRXJyb3I8UHJldmlld0F1dG9tYXRpb25Db250cm9sSW50ZXJydXB0ZWRFcnJvcj4oKShcbiAgXCJQcmV2aWV3QXV0b21hdGlvbkNvbnRyb2xJbnRlcnJ1cHRlZEVycm9yXCIsXG4gIHtcbiAgICAuLi5QcmV2aWV3QXV0b21hdGlvblJlcXVlc3RFcnJvckZpZWxkcyxcbiAgICAuLi5QcmV2aWV3QXV0b21hdGlvblJlbW90ZURpYWdub3N0aWNGaWVsZHMsXG4gICAgcmVhc29uOiBTY2hlbWEub3B0aW9uYWwoUHJldmlld0F1dG9tYXRpb25Db250cm9sUmVhc29uKSxcbiAgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnJlYXNvbiA9PT0gXCJhZ2VudE1pc21hdGNoXCIpXG4gICAgICByZXR1cm4gXCJUaGlzIGJyb3dzZXIgdGFiIGJlbG9uZ3MgdG8gYW5vdGhlciBhZ2VudCBzZXNzaW9uIG9yIGEgaHVtYW4uIE9wZW4geW91ciBvd24gdGFiLlwiO1xuICAgIGlmICh0aGlzLnJlYXNvbiA9PT0gXCJodW1hbkNvbnRyb2xcIilcbiAgICAgIHJldHVybiBcIkEgaHVtYW4gY29udHJvbHMgdGhpcyBicm93c2VyIHRhYi4gV2FpdCB1bnRpbCB0aGV5IHJlbGVhc2UgY29udHJvbC5cIjtcbiAgICBpZiAodGhpcy5yZWFzb24gPT09IFwidGFiUmVxdWlyZWRcIilcbiAgICAgIHJldHVybiBcIk11bHRpcGxlIGJyb3dzZXIgdGFicyBiZWxvbmcgdG8gdGhpcyBzZXNzaW9uLiBQYXNzIGEgdGFiSWQgZnJvbSBwcmV2aWV3X29wZW4gb3IgZnJvbSB0aGUgdGFicyBsaXN0ZWQgYnkgcHJldmlld19zdGF0dXMuXCI7XG4gICAgaWYgKHRoaXMucmVhc29uID09PSBcImRpYWxvZ1BlbmRpbmdcIilcbiAgICAgIHJldHVybiBcIkEgYnJvd3NlciBkaWFsb2cgaXMgcGVuZGluZy4gUmVhZCBwcmV2aWV3X3N0YXR1cyBhbmQgcmVzb2x2ZSBpdCB3aXRoIHByZXZpZXdfZGlhbG9nLlwiO1xuICAgIGlmICh0aGlzLnJlYXNvbiA9PT0gXCJ0YWJMaW1pdFwiKVxuICAgICAgcmV0dXJuIFwiVG9vIG1hbnkgc2VydmVyIGJyb3dzZXIgdGFicyBhcmUgb3Blbi4gQ2xvc2Ugb25lIHdpdGggdDNfcHJldmlld19jbG9zZSwgb3IgcmV1c2UgYSB0YWJJZCBmcm9tIHByZXZpZXdfc3RhdHVzIHRhYnMuXCI7XG4gICAgaWYgKHRoaXMucmVhc29uID09PSBcImNsb3NlZFwiKSByZXR1cm4gXCJUaGlzIGJyb3dzZXIgdGFiIGlzIGNsb3NlZC4gQ2FsbCBwcmV2aWV3X29wZW4uXCI7XG4gICAgaWYgKHRoaXMucmVhc29uID09PSBcImludGVycnVwdGVkXCIpXG4gICAgICByZXR1cm4gXCJCcm93c2VyIGNvbnRyb2wgY2hhbmdlZC4gVGFrZSBhIGZyZXNoIHNuYXBzaG90IGJlZm9yZSB0cnlpbmcgYWdhaW4uXCI7XG4gICAgcmV0dXJuIGBQcmV2aWV3IGF1dG9tYXRpb24gJHt0aGlzLm9wZXJhdGlvbn0gd2FzIGludGVycnVwdGVkIG9uIGNsaWVudCAke3RoaXMuY2xpZW50SWR9LmA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFByZXZpZXdBdXRvbWF0aW9uRXhlY3V0aW9uRXJyb3IgZXh0ZW5kcyBTY2hlbWEuVGFnZ2VkRXJyb3I8UHJldmlld0F1dG9tYXRpb25FeGVjdXRpb25FcnJvcj4oKShcbiAgXCJQcmV2aWV3QXV0b21hdGlvbkV4ZWN1dGlvbkVycm9yXCIsXG4gIHtcbiAgICAuLi5QcmV2aWV3QXV0b21hdGlvblJlcXVlc3RFcnJvckZpZWxkcyxcbiAgICAuLi5QcmV2aWV3QXV0b21hdGlvblJlbW90ZURpYWdub3N0aWNGaWVsZHMsXG4gICAgcmVhc29uOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLlN0cmluZyksXG4gIH0sXG4pIHtcbiAgb3ZlcnJpZGUgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZWFzb24gPT09IHVuZGVmaW5lZFxuICAgICAgPyBgUHJldmlldyBhdXRvbWF0aW9uICR7dGhpcy5vcGVyYXRpb259IGZhaWxlZCBvbiBjbGllbnQgJHt0aGlzLmNsaWVudElkfS5gXG4gICAgICA6IGBQcmV2aWV3IGF1dG9tYXRpb24gJHt0aGlzLm9wZXJhdGlvbn0gZmFpbGVkOiAke3RoaXMucmVhc29ufWA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFByZXZpZXdBdXRvbWF0aW9uSW52YWxpZFNlbGVjdG9yRXJyb3IgZXh0ZW5kcyBTY2hlbWEuVGFnZ2VkRXJyb3I8UHJldmlld0F1dG9tYXRpb25JbnZhbGlkU2VsZWN0b3JFcnJvcj4oKShcbiAgXCJQcmV2aWV3QXV0b21hdGlvbkludmFsaWRTZWxlY3RvckVycm9yXCIsXG4gIHtcbiAgICAuLi5QcmV2aWV3QXV0b21hdGlvblJlcXVlc3RFcnJvckZpZWxkcyxcbiAgICAuLi5QcmV2aWV3QXV0b21hdGlvblJlbW90ZURpYWdub3N0aWNGaWVsZHMsXG4gICAgc2VsZWN0b3JLaW5kOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLkxpdGVyYWxzKFtcImxvY2F0b3JcIiwgXCJzZWxlY3RvclwiXSkpLFxuICAgIHNlbGVjdG9yTGVuZ3RoOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLkludC5jaGVjayhTY2hlbWEuaXNHcmVhdGVyVGhhbk9yRXF1YWxUbygwKSkpLFxuICAgIHN0YWxlUmVmOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLkJvb2xlYW4pLFxuICB9LFxuKSB7XG4gIG92ZXJyaWRlIGdldCBtZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuc3RhbGVSZWYpXG4gICAgICByZXR1cm4gXCJUaGlzIGVsZW1lbnQgcmVmIGlzIHN0YWxlLiBOYXZpZ2F0aW9uLCBkaWFsb2dzLCBhbmQgbmV3IHNuYXBzaG90cyByZXBsYWNlIHJlZnM7IHRha2UgYSBmcmVzaCBzbmFwc2hvdCBhbmQgdXNlIGl0cyByZWZzLlwiO1xuICAgIGlmICh0aGlzLnNlbGVjdG9yS2luZCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuc2VsZWN0b3JMZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGBQcmV2aWV3IGF1dG9tYXRpb24gJHt0aGlzLm9wZXJhdGlvbn0gcmVjZWl2ZWQgYW4gaW52YWxpZCAke3RoaXMuc2VsZWN0b3JLaW5kfSAoJHt0aGlzLnNlbGVjdG9yTGVuZ3RofSBjaGFyYWN0ZXJzKS5gO1xuICAgIH1cbiAgICByZXR1cm4gYFByZXZpZXcgYXV0b21hdGlvbiAke3RoaXMub3BlcmF0aW9ufSByZWNlaXZlZCBhbiBpbnZhbGlkIHNlbGVjdG9yLmA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFByZXZpZXdBdXRvbWF0aW9uVGFyZ2V0Tm90RWRpdGFibGVFcnJvciBleHRlbmRzIFNjaGVtYS5UYWdnZWRFcnJvcjxQcmV2aWV3QXV0b21hdGlvblRhcmdldE5vdEVkaXRhYmxlRXJyb3I+KCkoXG4gIFwiUHJldmlld0F1dG9tYXRpb25UYXJnZXROb3RFZGl0YWJsZUVycm9yXCIsXG4gIHtcbiAgICAuLi5QcmV2aWV3QXV0b21hdGlvblJlcXVlc3RFcnJvckZpZWxkcyxcbiAgICAuLi5QcmV2aWV3QXV0b21hdGlvblJlbW90ZURpYWdub3N0aWNGaWVsZHMsXG4gICAgc2VsZWN0b3JLaW5kOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLkxpdGVyYWxzKFtcImZvY3VzZWQtZWxlbWVudFwiLCBcImxvY2F0b3JcIiwgXCJzZWxlY3RvclwiXSkpLFxuICAgIHNlbGVjdG9yTGVuZ3RoOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLkludC5jaGVjayhTY2hlbWEuaXNHcmVhdGVyVGhhbk9yRXF1YWxUbygwKSkpLFxuICB9LFxuKSB7XG4gIG92ZXJyaWRlIGdldCBtZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuc2VsZWN0b3JLaW5kID09PSBcImZvY3VzZWQtZWxlbWVudFwiKSB7XG4gICAgICByZXR1cm4gYFByZXZpZXcgYXV0b21hdGlvbiAke3RoaXMub3BlcmF0aW9ufSByZXF1aXJlcyBhbiBlZGl0YWJsZSBmb2N1c2VkIGVsZW1lbnQuYDtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0b3JLaW5kICE9PSB1bmRlZmluZWQgJiYgdGhpcy5zZWxlY3Rvckxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYFByZXZpZXcgYXV0b21hdGlvbiAke3RoaXMub3BlcmF0aW9ufSByZXF1aXJlcyBhbiBlZGl0YWJsZSAke3RoaXMuc2VsZWN0b3JLaW5kfSAoJHt0aGlzLnNlbGVjdG9yTGVuZ3RofSBjaGFyYWN0ZXJzKS5gO1xuICAgIH1cbiAgICByZXR1cm4gYFByZXZpZXcgYXV0b21hdGlvbiAke3RoaXMub3BlcmF0aW9ufSByZXF1aXJlcyBhbiBlZGl0YWJsZSB0YXJnZXQuYDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJldmlld0F1dG9tYXRpb25SZXN1bHRUb29MYXJnZUVycm9yIGV4dGVuZHMgU2NoZW1hLlRhZ2dlZEVycm9yPFByZXZpZXdBdXRvbWF0aW9uUmVzdWx0VG9vTGFyZ2VFcnJvcj4oKShcbiAgXCJQcmV2aWV3QXV0b21hdGlvblJlc3VsdFRvb0xhcmdlRXJyb3JcIixcbiAge1xuICAgIC4uLlByZXZpZXdBdXRvbWF0aW9uUmVxdWVzdEVycm9yRmllbGRzLFxuICAgIC4uLlByZXZpZXdBdXRvbWF0aW9uUmVtb3RlRGlhZ25vc3RpY0ZpZWxkcyxcbiAgICBtYXhpbXVtQnl0ZXM6IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuSW50LmNoZWNrKFNjaGVtYS5pc0dyZWF0ZXJUaGFuKDApKSksXG4gIH0sXG4pIHtcbiAgb3ZlcnJpZGUgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdW1tYXJ5ID1cbiAgICAgIHRoaXMubWF4aW11bUJ5dGVzID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBgUHJldmlldyBhdXRvbWF0aW9uICR7dGhpcy5vcGVyYXRpb259IHByb2R1Y2VkIGEgcmVzdWx0IHRoYXQgaXMgdG9vIGxhcmdlLmBcbiAgICAgICAgOiBgUHJldmlldyBhdXRvbWF0aW9uICR7dGhpcy5vcGVyYXRpb259IHByb2R1Y2VkIGEgcmVzdWx0IGxhcmdlciB0aGFuICR7dGhpcy5tYXhpbXVtQnl0ZXN9IGJ5dGVzLmA7XG4gICAgcmV0dXJuIHN1bW1hcnk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFByZXZpZXdBdXRvbWF0aW9uQ2xpZW50RGlzY29ubmVjdGVkRXJyb3IgZXh0ZW5kcyBTY2hlbWEuVGFnZ2VkRXJyb3I8UHJldmlld0F1dG9tYXRpb25DbGllbnREaXNjb25uZWN0ZWRFcnJvcj4oKShcbiAgXCJQcmV2aWV3QXV0b21hdGlvbkNsaWVudERpc2Nvbm5lY3RlZEVycm9yXCIsXG4gIFByZXZpZXdBdXRvbWF0aW9uUmVxdWVzdEVycm9yRmllbGRzLFxuKSB7XG4gIG92ZXJyaWRlIGdldCBtZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQcmV2aWV3IGF1dG9tYXRpb24gY2xpZW50ICR7dGhpcy5jbGllbnRJZH0gZGlzY29ubmVjdGVkIGR1cmluZyAke3RoaXMub3BlcmF0aW9ufS5gO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcmV2aWV3QXV0b21hdGlvblJlcXVlc3RRdWV1ZUNsb3NlZEVycm9yIGV4dGVuZHMgU2NoZW1hLlRhZ2dlZEVycm9yPFByZXZpZXdBdXRvbWF0aW9uUmVxdWVzdFF1ZXVlQ2xvc2VkRXJyb3I+KCkoXG4gIFwiUHJldmlld0F1dG9tYXRpb25SZXF1ZXN0UXVldWVDbG9zZWRFcnJvclwiLFxuICBQcmV2aWV3QXV0b21hdGlvblJlcXVlc3RFcnJvckZpZWxkcyxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUHJldmlldyBhdXRvbWF0aW9uIGNsaWVudCAke3RoaXMuY2xpZW50SWR9IHN0b3BwZWQgYWNjZXB0aW5nICR7dGhpcy5vcGVyYXRpb259IHJlcXVlc3RzLmA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFByZXZpZXdBdXRvbWF0aW9uUmVtb3RlVW5hdmFpbGFibGVFcnJvciBleHRlbmRzIFNjaGVtYS5UYWdnZWRFcnJvcjxQcmV2aWV3QXV0b21hdGlvblJlbW90ZVVuYXZhaWxhYmxlRXJyb3I+KCkoXG4gIFwiUHJldmlld0F1dG9tYXRpb25SZW1vdGVVbmF2YWlsYWJsZUVycm9yXCIsXG4gIHtcbiAgICAuLi5QcmV2aWV3QXV0b21hdGlvblJlcXVlc3RFcnJvckZpZWxkcyxcbiAgICAuLi5QcmV2aWV3QXV0b21hdGlvblJlbW90ZURpYWdub3N0aWNGaWVsZHMsXG4gIH0sXG4pIHtcbiAgb3ZlcnJpZGUgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFByZXZpZXcgYXV0b21hdGlvbiAke3RoaXMub3BlcmF0aW9ufSBpcyB1bmF2YWlsYWJsZSBvbiBjbGllbnQgJHt0aGlzLmNsaWVudElkfS5gO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcmV2aWV3QXV0b21hdGlvbk1hbGZvcm1lZFJlc3BvbnNlRXJyb3IgZXh0ZW5kcyBTY2hlbWEuVGFnZ2VkRXJyb3I8UHJldmlld0F1dG9tYXRpb25NYWxmb3JtZWRSZXNwb25zZUVycm9yPigpKFxuICBcIlByZXZpZXdBdXRvbWF0aW9uTWFsZm9ybWVkUmVzcG9uc2VFcnJvclwiLFxuICBQcmV2aWV3QXV0b21hdGlvblJlcXVlc3RFcnJvckZpZWxkcyxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUHJldmlldyBhdXRvbWF0aW9uIGNsaWVudCAke3RoaXMuY2xpZW50SWR9IHJldHVybmVkIGEgbWFsZm9ybWVkIHJlc3BvbnNlIGZvciAke3RoaXMub3BlcmF0aW9ufS5gO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcmV2aWV3QXV0b21hdGlvblJlY29yZGluZ1RyYW5zZmVyRXJyb3IgZXh0ZW5kcyBTY2hlbWEuVGFnZ2VkRXJyb3I8UHJldmlld0F1dG9tYXRpb25SZWNvcmRpbmdUcmFuc2ZlckVycm9yPigpKFxuICBcIlByZXZpZXdBdXRvbWF0aW9uUmVjb3JkaW5nVHJhbnNmZXJFcnJvclwiLFxuICB7XG4gICAgdGhyZWFkSWQ6IFRocmVhZElkLFxuICAgIGNhdXNlOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLkRlZmVjdCgpKSxcbiAgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIlByZXZpZXcgcmVjb3JkaW5nIGNvdWxkIG5vdCBiZSBzYXZlZCB0byB0aGUgYWdlbnQgZW52aXJvbm1lbnQuXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFByZXZpZXdBdXRvbWF0aW9uUmVjb3JkaW5nRGVza3RvcFVwZGF0ZVJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBTY2hlbWEuVGFnZ2VkRXJyb3I8UHJldmlld0F1dG9tYXRpb25SZWNvcmRpbmdEZXNrdG9wVXBkYXRlUmVxdWlyZWRFcnJvcj4oKShcbiAgXCJQcmV2aWV3QXV0b21hdGlvblJlY29yZGluZ0Rlc2t0b3BVcGRhdGVSZXF1aXJlZEVycm9yXCIsXG4gIHsgdGhyZWFkSWQ6IFRocmVhZElkLCBjYXVzZTogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5EZWZlY3QoKSkgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIlVwZGF0ZSB0aGUgZGVza3RvcCBhcHAgdG8gdHJhbnNmZXIgcmVjb3JkaW5ncy4gVGhlIHJlY29yZGluZyByZW1haW5zIG9uIHRoZSBkZXNrdG9wLlwiO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcmV2aWV3QXV0b21hdGlvblJlY29yZGluZ1Rvb0xhcmdlRXJyb3IgZXh0ZW5kcyBTY2hlbWEuVGFnZ2VkRXJyb3I8UHJldmlld0F1dG9tYXRpb25SZWNvcmRpbmdUb29MYXJnZUVycm9yPigpKFxuICBcIlByZXZpZXdBdXRvbWF0aW9uUmVjb3JkaW5nVG9vTGFyZ2VFcnJvclwiLFxuICB7IHRocmVhZElkOiBUaHJlYWRJZCwgY2F1c2U6IFNjaGVtYS5vcHRpb25hbChTY2hlbWEuRGVmZWN0KCkpIH0sXG4pIHtcbiAgb3ZlcnJpZGUgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJUaGUgcmVjb3JkaW5nIGV4Y2VlZHMgNTAgTWlCLiBNYWtlIGEgc2hvcnRlciByZWNvcmRpbmcuXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFByZXZpZXdBdXRvbWF0aW9uUmVjb3JkaW5nRGVhZGxpbmVFeHBpcmVkRXJyb3IgZXh0ZW5kcyBTY2hlbWEuVGFnZ2VkRXJyb3I8UHJldmlld0F1dG9tYXRpb25SZWNvcmRpbmdEZWFkbGluZUV4cGlyZWRFcnJvcj4oKShcbiAgXCJQcmV2aWV3QXV0b21hdGlvblJlY29yZGluZ0RlYWRsaW5lRXhwaXJlZEVycm9yXCIsXG4gIHsgdGhyZWFkSWQ6IFRocmVhZElkLCBjYXVzZTogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5EZWZlY3QoKSkgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIlRoZSByZWNvcmRpbmcgdHJhbnNmZXIgZGVhZGxpbmUgZXhwaXJlZC5cIjtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUHJldmlld0F1dG9tYXRpb25FcnJvciA9IFNjaGVtYS5VbmlvbihbXG4gIFByZXZpZXdBdXRvbWF0aW9uUmVjb3JkaW5nVHJhbnNmZXJFcnJvcixcbiAgUHJldmlld0F1dG9tYXRpb25SZWNvcmRpbmdEZXNrdG9wVXBkYXRlUmVxdWlyZWRFcnJvcixcbiAgUHJldmlld0F1dG9tYXRpb25SZWNvcmRpbmdUb29MYXJnZUVycm9yLFxuICBQcmV2aWV3QXV0b21hdGlvblJlY29yZGluZ0RlYWRsaW5lRXhwaXJlZEVycm9yLFxuICBQcmV2aWV3QXV0b21hdGlvblVuYXZhaWxhYmxlRXJyb3IsXG4gIFByZXZpZXdBdXRvbWF0aW9uTm9BdmFpbGFibGVIb3N0RXJyb3IsXG4gIFByZXZpZXdBdXRvbWF0aW9uVW5zdXBwb3J0ZWRDbGllbnRFcnJvcixcbiAgUHJldmlld0F1dG9tYXRpb25UYWJOb3RGb3VuZEVycm9yLFxuICBQcmV2aWV3QXV0b21hdGlvblRpbWVvdXRFcnJvcixcbiAgUHJldmlld0F1dG9tYXRpb25Db250cm9sSW50ZXJydXB0ZWRFcnJvcixcbiAgUHJldmlld0F1dG9tYXRpb25FeGVjdXRpb25FcnJvcixcbiAgUHJldmlld0F1dG9tYXRpb25JbnZhbGlkU2VsZWN0b3JFcnJvcixcbiAgUHJldmlld0F1dG9tYXRpb25UYXJnZXROb3RFZGl0YWJsZUVycm9yLFxuICBQcmV2aWV3QXV0b21hdGlvblJlc3VsdFRvb0xhcmdlRXJyb3IsXG4gIFByZXZpZXdBdXRvbWF0aW9uQ2xpZW50RGlzY29ubmVjdGVkRXJyb3IsXG4gIFByZXZpZXdBdXRvbWF0aW9uUmVxdWVzdFF1ZXVlQ2xvc2VkRXJyb3IsXG4gIFByZXZpZXdBdXRvbWF0aW9uUmVtb3RlVW5hdmFpbGFibGVFcnJvcixcbiAgUHJldmlld0F1dG9tYXRpb25NYWxmb3JtZWRSZXNwb25zZUVycm9yLFxuXSk7XG5leHBvcnQgdHlwZSBQcmV2aWV3QXV0b21hdGlvbkVycm9yID0gdHlwZW9mIFByZXZpZXdBdXRvbWF0aW9uRXJyb3IuVHlwZTtcblxuZXhwb3J0IGNvbnN0IFByZXZpZXdVcmxSZXNvbHV0aW9uID0gU2NoZW1hLlN0cnVjdCh7XG4gIHJlcXVlc3RlZFVybDogU2NoZW1hLlN0cmluZyxcbiAgcmVzb2x2ZWRVcmw6IFNjaGVtYS5TdHJpbmcsXG4gIHJlc29sdXRpb25LaW5kOiBTY2hlbWEuTGl0ZXJhbHMoW1wiZGlyZWN0XCIsIFwiZGlyZWN0LXByaXZhdGUtbmV0d29ya1wiXSksXG4gIGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQsXG59KTtcbmV4cG9ydCB0eXBlIFByZXZpZXdVcmxSZXNvbHV0aW9uID0gdHlwZW9mIFByZXZpZXdVcmxSZXNvbHV0aW9uLlR5cGU7XG4iXSwiZmlsZSI6Ii9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY29udHJhY3RzL3NyYy9wcmV2aWV3QXV0b21hdGlvbi50cyJ9

//# vitestCache=W3siZmlsZSI6IjEiLCJpZCI6IjEiLCJ1cmwiOiIyIiwiaW1wb3J0cyI6IjMiLCJtYXBwaW5ncyI6ZmFsc2UsImRlcHMiOiI0IiwiZHluYW1pY0RlcHMiOiI1Iiwic3RhdGljTW9ja3MiOm51bGx9LCIvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY29udHJhY3RzL3NyYy9wcmV2aWV3QXV0b21hdGlvbi50cyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY29udHJhY3RzL3NyYy9wcmV2aWV3QXV0b21hdGlvbi50cyIseyJ1cmxzIjoiNiIsImlkcyI6IjcifSxbIjgiLCI5IiwiMTAiLCIxMSIsIjEyIl0sW10sWyI4IiwiOSIsIjEwIiwiMTEiLCIxMiJdLHt9LCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L2luZGV4LmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9jb250cmFjdHMvc3JjL2Jhc2VTY2hlbWFzLnRzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9jb250cmFjdHMvc3JjL3ByZXZpZXcudHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NvbnRyYWN0cy9zcmMvcHJvdmlkZXJJbnN0YW5jZS50cyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY29udHJhY3RzL3NyYy9icm93c2VyUHJvZmlsZS50cyJd