diff --git a/README.md b/README.md index 0b7151078..227585d6e 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ TestContainers (https://github.com/testcontainers/testcontainers-node) serves to Following tools are required to run the test suite - [NodeJS](https://nodejs.org/en/) as a runtime environment - - recommended version is 16, in other versions you can get errors like `Unable to detect compiler type` + - recommended version is 22. - [Node Version Manager (nvm)](https://github.com/nvm-sh/nvm) is recommended optional tool to install & manage multiple Node environments - [npx](https://github.com/npm/npx) CLI tool used to exeute binaries from project's `node_modules` directly (instead of providing absolute/relative path to the commannds). It is used in multiple build steps. - [Podman](https://podman.io) | [Docker](https://www.docker.com) as a container runtime used by TestContainers. Note that when using Podman as container runtime you may need to export following environment variables and start podman socket: diff --git a/config/containers/database.ts b/config/containers/database.ts new file mode 100644 index 000000000..c89e4af55 --- /dev/null +++ b/config/containers/database.ts @@ -0,0 +1,28 @@ +import { PullPolicy, GenericContainer, StartedTestContainer, Wait } from "testcontainers"; +import { DatabaseConfig } from "../interfaces"; +import { handleContainerError } from "../helpers"; + +export function startDatabaseContainer( + config: DatabaseConfig, + startedContainersMap: Map, +): Promise { + const containerBuilder = new GenericContainer(config.image) + .withPullPolicy(PullPolicy.alwaysPull()) + .withName(config.name) + .withNetworkAliases(config.name) + .withNetworkMode(config.networkName) + .withExposedPorts(config.port) + .withEnvironment(config.environmentProperties) + .withWaitStrategy(Wait.forLogMessage(new RegExp(config.waitLogMessage))); + + return containerBuilder + .start() + .then((container) => { + console.log(config.successMessage); + startedContainersMap.set(config.containerMapKey, container); + return container; + }) + .catch((err: unknown) => { + throw handleContainerError(err); + }); +} diff --git a/config/containers/index.ts b/config/containers/index.ts new file mode 100644 index 000000000..221b6bd02 --- /dev/null +++ b/config/containers/index.ts @@ -0,0 +1,2 @@ +export * from "./database"; +export * from "./wildfly"; diff --git a/config/containers/wildfly.ts b/config/containers/wildfly.ts new file mode 100644 index 000000000..c98fa9cac --- /dev/null +++ b/config/containers/wildfly.ts @@ -0,0 +1,126 @@ +import axios from "axios"; +import { GenericContainer, StartedTestContainer } from "testcontainers"; +import { findAPortNotInUse } from "portscanner"; +import { + WILDFLY_MANAGEMENT_PORT, + WILDFLY_PORT_RANGE, + DEFAULT_WILDFLY_CONFIG, + WILDFLY_READY_TIMEOUT_MS, + WILDFLY_POLL_INTERVAL_MS, + JBOSS_CLI_PATH, + MANAGEMENT_INTERFACE_ADDRESS, +} from "../../cypress.config"; +import { WildflyManagementResponse } from "../interfaces"; +import { buildLocalhostUrl } from "../helpers"; + +export function pollWildflyState(managementApi: string, container: StartedTestContainer): Promise { + const startTime = new Date().getTime(); + return new Promise((resolve, reject) => { + const interval = setInterval(() => { + if (new Date().getTime() - startTime > WILDFLY_READY_TIMEOUT_MS) { + clearInterval(interval); + reject(new Error("Timeout waiting for WildFly to start")); + } + axios + .post(managementApi, { + operation: "read-attribute", + name: "server-state", + }) + .then((response: WildflyManagementResponse) => { + if (response.data.result === "running") { + clearInterval(interval); + const wildflyServer = buildLocalhostUrl(container.getMappedPort(WILDFLY_MANAGEMENT_PORT)); + resolve(wildflyServer); + } + }) + .catch(() => { + console.log("WildFly server is not ready yet"); + }); + }, WILDFLY_POLL_INTERVAL_MS); + }); +} + +export function executeJBossCLI( + container: StartedTestContainer, + managementPort: number, + command: string, +): Promise { + return container + .exec([ + `/bin/sh`, + `-c`, + `${JBOSS_CLI_PATH} --connect --controller=localhost:${managementPort} --command="${command}"`, + ]) + .then((result) => result.output); +} + +export function configureWildflyNetworkMode( + wildfly: GenericContainer, + configuration: string, + useHostMode: boolean, + networkName?: string, +): Promise<{ portOffset: number }> { + if (useHostMode) { + console.log("host mode"); + return findAPortNotInUse(WILDFLY_PORT_RANGE.min, WILDFLY_PORT_RANGE.max).then((freePort) => { + const portOffset = freePort - WILDFLY_PORT_RANGE.min; + wildfly + .withNetworkMode("host") + .withCommand([ + "-c", + configuration || DEFAULT_WILDFLY_CONFIG, + `-Djboss.socket.binding.port-offset=${portOffset.toString()}`, + "-Djboss.node.name=localhost", + ] as string[]); + return { portOffset }; + }); + } else { + console.log(`default network mode, network name: ${networkName}`); + wildfly + .withNetworkMode(networkName!) + .withNetworkAliases("wildfly") + .withExposedPorts(WILDFLY_MANAGEMENT_PORT) + .withCommand(["-c", configuration || DEFAULT_WILDFLY_CONFIG] as string[]); + return Promise.resolve({ portOffset: 0 }); + } +} + +export function configureWildflyPostStart( + container: StartedTestContainer, + halPort: string, + useHostMode: boolean, + managementPort?: number, +): Promise { + if (useHostMode) { + const effectiveManagementPort = managementPort!; + return executeJBossCLI( + container, + effectiveManagementPort, + `/core-service=management/management-interface=http-interface:list-add(name=allowed-origins,value=${buildLocalhostUrl(Number(halPort))}`, + ) + .then(() => executeJBossCLI(container, effectiveManagementPort, "reload")) + .then(() => executeJBossCLI(container, effectiveManagementPort, "read-attribute server-state")) + .then((output) => { + if (output.includes("running")) { + return buildLocalhostUrl(effectiveManagementPort); + } + throw new Error("WildFly did not reach running state"); + }); + } else { + const managementApi = buildLocalhostUrl(container.getMappedPort(WILDFLY_MANAGEMENT_PORT), "/management"); + + return axios + .post(managementApi, { + operation: "list-add", + address: MANAGEMENT_INTERFACE_ADDRESS, + name: "allowed-origins", + value: buildLocalhostUrl(Number(halPort)), + }) + .then(() => + axios.post(managementApi, { + operation: "reload", + }), + ) + .then(() => pollWildflyState(managementApi, container)); + } +} diff --git a/config/helpers/container-helpers.ts b/config/helpers/container-helpers.ts new file mode 100644 index 000000000..f117a62cb --- /dev/null +++ b/config/helpers/container-helpers.ts @@ -0,0 +1,14 @@ +import { hostname } from "os"; +import { WILDFLY_MANAGEMENT_PORT, LOCALHOST_IP } from "../../cypress.config"; + +export function calculateManagementPort(portOffset: number): number { + return portOffset + WILDFLY_MANAGEMENT_PORT; +} + +export function getHostnameMapping(): Array<{ host: string; ipAddress: string }> { + return [{ host: hostname(), ipAddress: LOCALHOST_IP }]; +} + +export function buildKeycloakStartCommand(port: number): string[] { + return ["start-dev", "--db=dev-mem", `--http-port=${port.toString()}`, "--import-realm"]; +} diff --git a/config/helpers/error-handler.ts b/config/helpers/error-handler.ts new file mode 100644 index 000000000..41ab2fec0 --- /dev/null +++ b/config/helpers/error-handler.ts @@ -0,0 +1,4 @@ +export function handleContainerError(err: unknown): Error { + console.log(err); + return err instanceof Error ? err : new Error(JSON.stringify(err)); +} diff --git a/config/helpers/index.ts b/config/helpers/index.ts new file mode 100644 index 000000000..973ceb0ee --- /dev/null +++ b/config/helpers/index.ts @@ -0,0 +1,3 @@ +export * from "./error-handler"; +export * from "./url-builder"; +export * from "./container-helpers"; diff --git a/config/helpers/url-builder.ts b/config/helpers/url-builder.ts new file mode 100644 index 000000000..d912e118e --- /dev/null +++ b/config/helpers/url-builder.ts @@ -0,0 +1,4 @@ +export function buildLocalhostUrl(port: number, path?: string): string { + const baseUrl = `http://localhost:${port}`; + return path ? `${baseUrl}${path}` : baseUrl; +} diff --git a/config/interfaces.ts b/config/interfaces.ts new file mode 100644 index 000000000..5a5935dcf --- /dev/null +++ b/config/interfaces.ts @@ -0,0 +1,51 @@ +import { Environment } from "testcontainers/build/types"; + +export interface DatabaseConfig { + name: string; + image: string; + port: number; + waitLogMessage: string; + environmentProperties: Environment; + networkName: string; + containerMapKey: string; + successMessage: string; +} + +export interface WildflyManagementResponse { + data: { + result: string; + }; +} + +export interface AxiosErrorResponse { + response: { + data: string; + }; +} + +export interface StartWildflyContainerParams { + name: string; + configuration: string; + useNetworkHostMode?: boolean; +} + +export interface StartKeycloakContainerParams { + name: string; +} + +export interface StartDatabaseContainerParams { + name: string; + environmentProperties: Environment; +} + +export interface ExecuteInContainerParams { + containerName: string; + command: string; +} + +export interface ExecuteCliParams { + managementApi: string; + operation: string; + address: string[]; + [key: string]: unknown; +} diff --git a/config/tasks/cli-tasks.ts b/config/tasks/cli-tasks.ts new file mode 100644 index 000000000..c197bf7df --- /dev/null +++ b/config/tasks/cli-tasks.ts @@ -0,0 +1,18 @@ +import axios from "axios"; +import { ExecuteCliParams, AxiosErrorResponse } from "../interfaces"; + +export function createExecuteCli() { + return ({ managementApi, operation, address, ...args }: ExecuteCliParams) => { + return axios + .post(managementApi, { + operation, + address, + ...args, + }) + .then((response) => response.data as unknown) + .catch((err: AxiosErrorResponse) => { + console.log(err); + throw new Error(err.response.data); + }); + }; +} diff --git a/config/tasks/database-tasks.ts b/config/tasks/database-tasks.ts new file mode 100644 index 000000000..0b204eefb --- /dev/null +++ b/config/tasks/database-tasks.ts @@ -0,0 +1,89 @@ +import { StartedTestContainer } from "testcontainers"; +import { + DEFAULT_POSTGRES_IMAGE, + DEFAULT_MYSQL_IMAGE, + DEFAULT_MARIADB_IMAGE, + DEFAULT_SQLSERVER_IMAGE, + POSTGRES_PORT, + MYSQL_PORT, + MARIADB_PORT, + SQLSERVER_PORT, + POSTGRES_STARTED_MSG, + MYSQL_STARTED_MSG, + MARIADB_STARTED_MSG, + SQLSERVER_STARTED_MSG, +} from "../../cypress.config"; +import { StartDatabaseContainerParams } from "../interfaces"; +import { startDatabaseContainer } from "../containers"; + +export function createPostgresContainer(startedContainers: Map, networkName: string) { + return ({ name, environmentProperties }: StartDatabaseContainerParams) => { + return startDatabaseContainer( + { + name, + image: process.env.POSTGRES_IMAGE || DEFAULT_POSTGRES_IMAGE, + port: POSTGRES_PORT, + waitLogMessage: POSTGRES_STARTED_MSG, + environmentProperties, + networkName, + containerMapKey: "postgres", + successMessage: "PostgreSQL started successfully", + }, + startedContainers, + ); + }; +} + +export function createMysqlContainer(startedContainers: Map, networkName: string) { + return ({ name, environmentProperties }: StartDatabaseContainerParams) => { + return startDatabaseContainer( + { + name, + image: process.env.MYSQL_IMAGE || DEFAULT_MYSQL_IMAGE, + port: MYSQL_PORT, + waitLogMessage: MYSQL_STARTED_MSG, + environmentProperties, + networkName, + containerMapKey: "mysql", + successMessage: "MySQL started successfully", + }, + startedContainers, + ); + }; +} + +export function createMariadbContainer(startedContainers: Map, networkName: string) { + return ({ name, environmentProperties }: StartDatabaseContainerParams) => { + return startDatabaseContainer( + { + name, + image: process.env.MARIADB_IMAGE || DEFAULT_MARIADB_IMAGE, + port: MARIADB_PORT, + waitLogMessage: MARIADB_STARTED_MSG, + environmentProperties, + networkName, + containerMapKey: "mariadb", + successMessage: "Mariadb started successfully", + }, + startedContainers, + ); + }; +} + +export function createSqlserverContainer(startedContainers: Map, networkName: string) { + return ({ name, environmentProperties }: StartDatabaseContainerParams) => { + return startDatabaseContainer( + { + name, + image: process.env.MSSQL_IMAGE || DEFAULT_SQLSERVER_IMAGE, + port: SQLSERVER_PORT, + waitLogMessage: SQLSERVER_STARTED_MSG, + environmentProperties, + networkName, + containerMapKey: "sqlserver", + successMessage: "SQL server started successfully", + }, + startedContainers, + ); + }; +} diff --git a/config/tasks/index.ts b/config/tasks/index.ts new file mode 100644 index 000000000..2d1d46c6d --- /dev/null +++ b/config/tasks/index.ts @@ -0,0 +1,4 @@ +export * from "./wildfly-tasks"; +export * from "./keycloak-tasks"; +export * from "./database-tasks"; +export * from "./cli-tasks"; diff --git a/config/tasks/keycloak-tasks.ts b/config/tasks/keycloak-tasks.ts new file mode 100644 index 000000000..acd23f573 --- /dev/null +++ b/config/tasks/keycloak-tasks.ts @@ -0,0 +1,46 @@ +import { GenericContainer, StartedTestContainer, Wait } from "testcontainers"; +import { findAPortNotInUse } from "portscanner"; +import { + DEFAULT_KEYCLOAK_IMAGE, + KEYCLOAK_PORT_RANGE, + KEYCLOAK_STARTED_MSG, + KEYCLOAK_ADMIN_USER, + KEYCLOAK_ADMIN_PASSWORD, + FIXTURES_PATH, +} from "../../cypress.config"; +import { StartKeycloakContainerParams } from "../interfaces"; +import { buildLocalhostUrl, buildKeycloakStartCommand, handleContainerError } from "../helpers"; + +export function createKeycloakContainer(startedContainers: Map) { + return ({ name }: StartKeycloakContainerParams) => { + return findAPortNotInUse(KEYCLOAK_PORT_RANGE.min, KEYCLOAK_PORT_RANGE.max).then((freePort: number) => { + const keycloak = new GenericContainer(process.env.KEYCLOAK_IMAGE || DEFAULT_KEYCLOAK_IMAGE) + .withName(name) + .withNetworkMode("host") + .withWaitStrategy(Wait.forLogMessage(KEYCLOAK_STARTED_MSG)) + .withEnvironment({ + KEYCLOAK_ADMIN: KEYCLOAK_ADMIN_USER, + KEYCLOAK_ADMIN_PASSWORD: KEYCLOAK_ADMIN_PASSWORD, + }) + .withBindMounts([ + { + source: FIXTURES_PATH + "/realm-configuration.json", + target: "/opt/keycloak/data/import/realm-configuration.json", + mode: "z", + }, + ]) + .withCommand(buildKeycloakStartCommand(freePort)); + return keycloak + .start() + .then((keycloakContainer) => { + startedContainers.set(name, keycloakContainer); + const keycloakServer = buildLocalhostUrl(freePort); + console.log(`Keycloak is ready: ${keycloakServer}`); + return keycloakServer; + }) + .catch((err: unknown) => { + throw handleContainerError(err); + }); + }); + }; +} diff --git a/config/tasks/wildfly-tasks.ts b/config/tasks/wildfly-tasks.ts new file mode 100644 index 000000000..e8a20fc50 --- /dev/null +++ b/config/tasks/wildfly-tasks.ts @@ -0,0 +1,97 @@ +import { PullPolicy, GenericContainer, StartedTestContainer, Wait } from "testcontainers"; +import { + DEFAULT_WILDFLY_IMAGE, + WILDFLY_STARTED_MSG, + WILDFLY_STARTUP_TIMEOUT, + FIXTURES_PATH, + FIXTURES_DIRECTORY_MODE, + WILDFLY_MANAGEMENT_PORT, + JBOSS_CLI_PATH, +} from "../../cypress.config"; +import { StartWildflyContainerParams, ExecuteInContainerParams, AxiosErrorResponse } from "../interfaces"; +import { getHostnameMapping, handleContainerError, calculateManagementPort } from "../helpers"; +import { configureWildflyNetworkMode, configureWildflyPostStart } from "../containers"; + +export function createWildflyContainer( + startedContainers: Map, + startedContainersManagementPorts: Map, + networkName: string, + halContainerPort: string, +) { + return ({ name, configuration, useNetworkHostMode }: StartWildflyContainerParams) => { + let portOffset = 0; + const wildfly = new GenericContainer(process.env.WILDFLY_IMAGE || DEFAULT_WILDFLY_IMAGE) + .withPullPolicy(PullPolicy.alwaysPull()) + .withName(name) + .withCopyDirectoriesToContainer([ + { + source: FIXTURES_PATH, + target: "/home/fixtures", + mode: FIXTURES_DIRECTORY_MODE, + }, + ]) + .withWaitStrategy(Wait.forLogMessage(WILDFLY_STARTED_MSG)) + .withStartupTimeout(WILDFLY_STARTUP_TIMEOUT) + .withExtraHosts(getHostnameMapping()); + + return configureWildflyNetworkMode(wildfly, configuration, useNetworkHostMode === true, networkName) + .then((result) => { + portOffset = result.portOffset; + return wildfly.start(); + }) + .then((wildflyContainer) => { + startedContainers.set(name, wildflyContainer); + const managementPort = useNetworkHostMode === true ? calculateManagementPort(portOffset) : undefined; + if (managementPort !== undefined) { + startedContainersManagementPorts.set(name, managementPort); + } + return configureWildflyPostStart( + wildflyContainer, + halContainerPort, + useNetworkHostMode === true, + managementPort, + ); + }) + .then((wildflyServer) => { + console.log(`WildFly server is ready: ${wildflyServer}`); + return wildflyServer; + }) + .catch((err: unknown) => { + throw handleContainerError(err); + }); + }; +} + +export function createExecuteInContainer( + startedContainers: Map, + startedContainersManagementPorts: Map, +) { + return ({ containerName, command }: ExecuteInContainerParams) => { + console.log(`CLI commands: ${command}`); + const containerToExec = startedContainers.get(containerName); + let managementPort = startedContainersManagementPorts.get(containerName); + managementPort = managementPort ?? WILDFLY_MANAGEMENT_PORT; + + if (!containerToExec) { + return Promise.reject(new Error(`Container ${containerName} not found`)); + } + + return containerToExec + .exec([ + "/bin/sh", + "-c", + `${JBOSS_CLI_PATH} --connect --controller=localhost:${managementPort} --commands=${command}`, + ]) + .then((value) => { + if (value.exitCode === 0) { + return value; + } else { + console.log(value); + throw new Error(`Command failed with exit code ${value.exitCode}: ${value.output || ""}`); + } + }) + .catch((err: AxiosErrorResponse) => { + throw new Error(err.response.data); + }); + }; +} diff --git a/cypress.config.ts b/cypress.config.ts index ba68a3d8c..40730b855 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -1,9 +1,64 @@ -import axios from "axios"; import { defineConfig } from "cypress"; -import { PullPolicy, GenericContainer, StartedTestContainer, StoppedTestContainer, Wait } from "testcontainers"; -import { Environment } from "testcontainers/build/types"; -import { findAPortNotInUse } from "portscanner"; -import * as fs from "fs"; +import { StartedTestContainer, StoppedTestContainer } from "testcontainers"; +import { existsSync, unlinkSync } from "fs"; +import { + createWildflyContainer, + createExecuteInContainer, + createKeycloakContainer, + createPostgresContainer, + createMysqlContainer, + createMariadbContainer, + createSqlserverContainer, + createExecuteCli, +} from "./config/tasks"; + +// WildFly configuration +export const DEFAULT_WILDFLY_CONFIG = "standalone-insecure.xml"; +export const WILDFLY_MANAGEMENT_PORT = 9990; +export const WILDFLY_STARTUP_TIMEOUT = 333000; +export const WILDFLY_PORT_RANGE = { min: 8080, max: 8180 }; +export const WILDFLY_READY_TIMEOUT_MS = 10000; +export const WILDFLY_POLL_INTERVAL_MS = 500; + +// Keycloak configuration +export const KEYCLOAK_PORT_RANGE = { min: 8888, max: 8988 }; +export const KEYCLOAK_ADMIN_USER = "admin"; +export const KEYCLOAK_ADMIN_PASSWORD = "admin"; + +// Database ports +export const POSTGRES_PORT = 5432; +export const MYSQL_PORT = 3306; +export const MARIADB_PORT = 3306; +export const SQLSERVER_PORT = 1433; + +// Default Docker images +export const DEFAULT_WILDFLY_IMAGE = "quay.io/halconsole/wildfly-development:latest"; +export const DEFAULT_KEYCLOAK_IMAGE = "quay.io/keycloak/keycloak:latest"; +export const DEFAULT_POSTGRES_IMAGE = "postgres"; +export const DEFAULT_MYSQL_IMAGE = "mysql"; +export const DEFAULT_MARIADB_IMAGE = "mariadb"; +export const DEFAULT_SQLSERVER_IMAGE = "mcr.microsoft.com/mssql/server:2022-latest"; + +// Wait strategy log messages +export const WILDFLY_STARTED_MSG = /.*(WildFly.*|JBoss EAP.*)started in.*/; +export const KEYCLOAK_STARTED_MSG = /.*(Keycloak.*) started in.*/; +export const POSTGRES_STARTED_MSG = ".*PostgreSQL init process complete; ready for start up.*"; +export const MYSQL_STARTED_MSG = ".*MySQL init process done. Ready for start up.*"; +export const MARIADB_STARTED_MSG = ".*MariaDB init process done. Ready for start up.*"; +export const SQLSERVER_STARTED_MSG = ".*SQL Server is now ready for client connections.*"; + +// Paths +export const FIXTURES_PATH = __dirname + "/packages/testsuite/cypress/fixtures"; +export const JBOSS_CLI_PATH = "$JBOSS_HOME/bin/jboss-cli.sh"; + +// File permissions +export const FIXTURES_DIRECTORY_MODE = parseInt("0777", 8); + +// Management interface address +export const MANAGEMENT_INTERFACE_ADDRESS = ["core-service", "management", "management-interface", "http-interface"]; + +// Network +export const LOCALHOST_IP = "127.0.0.1"; export default defineConfig({ defaultCommandTimeout: 16000, @@ -19,317 +74,21 @@ export default defineConfig({ setupNodeEvents(on, config) { const startedContainers: Map = new Map(); const startedContainersManagementPorts: Map = new Map(); + on("task", { - "start:wildfly:container": ({ name, configuration, useNetworkHostMode }) => { - return new Promise((resolve, reject) => { - let portOffset = 0; - const wildfly = new GenericContainer( - process.env.WILDFLY_IMAGE || "quay.io/halconsole/wildfly-development:latest", - ) - .withPullPolicy(PullPolicy.alwaysPull()) - .withName(name as string) - .withCopyDirectoriesToContainer([ - { - source: __dirname + "/packages/testsuite/cypress/fixtures", - target: "/home/fixtures", - mode: parseInt("0777", 8), - }, - ]) - .withWaitStrategy(Wait.forLogMessage(new RegExp(".*(WildFly.*|JBoss EAP.*)started in.*"))) - .withStartupTimeout(333000); - if (useNetworkHostMode === true) { - console.log("host mode"); - findAPortNotInUse(8080, 8180) - .then((freePort) => { - portOffset = freePort - 8080; - wildfly - .withNetworkMode("host") - .withCommand([ - "-c", - configuration || "standalone-insecure.xml", - `-Djboss.socket.binding.port-offset=${portOffset.toString()}`, - ] as string[]); - }) - .catch((error) => { - console.log(error); - }); - } else { - console.log(`default network mode, network name: ${config.env.NETWORK_NAME as string}`); - wildfly - .withNetworkMode(config.env.NETWORK_NAME as string) - .withNetworkAliases("wildfly") - .withExposedPorts(9990) - .withCommand(["-c", configuration || "standalone-insecure.xml"] as string[]); - } - wildfly - .start() - .then((wildflyContainer) => { - const managementPortWithOffset = portOffset + 9990; - startedContainers.set(name as string, wildflyContainer); - if (useNetworkHostMode === true) { - startedContainersManagementPorts.set(name as string, portOffset + 9990); - return wildflyContainer - .exec([ - `/bin/bash`, - `-c`, - `$JBOSS_HOME/bin/jboss-cli.sh --connect --controller=localhost:${managementPortWithOffset} --command="/core-service=management/management-interface=http-interface:list-add(name=allowed-origins,value=http://localhost:${ - config.env.HAL_CONTAINER_PORT as string - }"`, - ]) - .then((result) => { - console.log(result.output); - return wildflyContainer.exec([ - `/bin/bash`, - `-c`, - `$JBOSS_HOME/bin/jboss-cli.sh --connect --controller=localhost:${managementPortWithOffset} --command="reload"`, - ]); - }) - .then((result) => { - console.log(result.output); - wildflyContainer - .exec([ - `/bin/bash`, - `-c`, - `$JBOSS_HOME/bin/jboss-cli.sh --connect --controller=localhost:${managementPortWithOffset} --command="read-attribute server-state"`, - ]) - .then((response) => { - console.log(response.output); - if (response.output.includes("running")) { - const wildflyServer = `http://localhost:${managementPortWithOffset}`; - console.log(`WildFly server is ready: ${wildflyServer}`); - resolve(wildflyServer); - } - }) - .catch((error) => { - console.log(error); - }); - }); - } else { - const managementApi = `http://localhost:${wildflyContainer.getMappedPort(9990)}/management`; - return axios - .post(managementApi, { - operation: "list-add", - address: ["core-service", "management", "management-interface", "http-interface"], - name: "allowed-origins", - value: `http://localhost:${config.env.HAL_CONTAINER_PORT as string}`, - }) - .then(() => { - return axios.post(managementApi, { - operation: "reload", - }); - }) - .then(() => { - const startTime = new Date().getTime(); - const interval = setInterval(() => { - if (new Date().getTime() - startTime > 10000) { - clearInterval(interval); - reject(new Error("Timeout waiting for WildFly to start")); - } - axios - .post(managementApi, { - operation: "read-attribute", - name: "server-state", - }) - .then((response) => { - if ((response as { data: { result: string } }).data.result == "running") { - clearInterval(interval); - const wildflyServer = `http://localhost:${wildflyContainer.getMappedPort(9990)}`; - console.log(`WildFly server is ready: ${wildflyServer}`); - resolve(wildflyServer); - } - }) - .catch(() => { - console.log("WildFly server is not ready yet"); - }); - }, 500); - }); - } - }) - .catch((err: unknown) => { - console.log(err); - reject(err instanceof Error ? err : new Error(JSON.stringify(err))); - }); - }); - }, - "start:keycloak:container": ({ name }) => { - return findAPortNotInUse(8888, 8988).then((freePort: number) => { - const keycloak = new GenericContainer(process.env.KEYCLOAK_IMAGE || "quay.io/keycloak/keycloak:latest") - .withName(name as string) - .withNetworkMode("host") - .withWaitStrategy(Wait.forLogMessage(new RegExp(".*(Keycloak.*) started in.*"))) - .withEnvironment({ - KEYCLOAK_ADMIN: "admin", - KEYCLOAK_ADMIN_PASSWORD: "admin", - }) - .withBindMounts([ - { - source: __dirname + "/packages/testsuite/cypress/fixtures/realm-configuration.json", - target: "/opt/keycloak/data/import/realm-configuration.json", - mode: "z", - }, - ]) - .withCommand([ - "start-dev", - "--db=dev-mem", - `--http-port=${freePort.toString()}`, - "--import-realm", - ] as string[]); - return new Promise((resolve, reject) => { - keycloak - .start() - .then((keycloakContainer) => { - startedContainers.set(name as string, keycloakContainer); - const keycloakServer = `http://localhost:${freePort ?? "unknown port"}`; - console.log(`Keycloak is ready: ${keycloakServer}`); - resolve(keycloakServer); - }) - .catch((err: unknown) => { - console.log(err); - reject(err instanceof Error ? err : new Error(JSON.stringify(err))); - }); - }); - }); - }, - "start:postgres:container": ({ name, environmentProperties }) => { - const postgreContainerBuilder = new GenericContainer(process.env.POSTGRES_IMAGE || "postgres") - .withPullPolicy(PullPolicy.alwaysPull()) - .withName(name as string) - .withNetworkAliases(name as string) - .withNetworkMode(config.env.NETWORK_NAME as string) - .withWaitStrategy( - Wait.forLogMessage(new RegExp(".*PostgreSQL init process complete; ready for start up.*")), - ) - .withExposedPorts(5432) - .withEnvironment(environmentProperties as Environment); - return new Promise((resolve, reject) => { - postgreContainerBuilder - .start() - .then((postgreContainer) => { - console.log("PostgreSQL started successfully"); - startedContainers.set("postgres", postgreContainer); - resolve(postgreContainer); - }) - .catch((err: unknown) => { - console.log(err); - reject(err instanceof Error ? err : new Error(JSON.stringify(err))); - }); - }); - }, - "start:mysql:container": ({ name, environmentProperties }) => { - const mysqlContainerBuilder = new GenericContainer(process.env.MYSQL_IMAGE || "mysql") - .withPullPolicy(PullPolicy.alwaysPull()) - .withName(name as string) - .withNetworkAliases(name as string) - .withExposedPorts(3306) - .withEnvironment(environmentProperties as Environment) - .withNetworkMode(config.env.NETWORK_NAME as string) - .withWaitStrategy(Wait.forLogMessage(new RegExp(".*MySQL init process done. Ready for start up.*"))); - return new Promise((resolve, reject) => { - mysqlContainerBuilder - .start() - .then((mysqlContainer) => { - console.log("MySQL started successfully"); - startedContainers.set("mysql", mysqlContainer); - resolve(mysqlContainer); - }) - .catch((err: unknown) => { - console.log(err); - reject(err instanceof Error ? err : new Error(JSON.stringify(err))); - }); - }); - }, - "start:mariadb:container": ({ name, environmentProperties }) => { - const mariadbContainerBuilder = new GenericContainer(process.env.MARIADB_IMAGE || "mariadb") - .withPullPolicy(PullPolicy.alwaysPull()) - .withName(name as string) - .withNetworkAliases(name as string) - .withExposedPorts(3306) - .withNetworkMode(config.env.NETWORK_NAME as string) - .withEnvironment(environmentProperties as Environment) - .withWaitStrategy(Wait.forLogMessage(new RegExp(".*MariaDB init process done. Ready for start up.*"))); - return new Promise((resolve, reject) => { - mariadbContainerBuilder - .start() - .then((mariadbContainer) => { - console.log("Mariadb started successfully"); - startedContainers.set("mariadb", mariadbContainer); - resolve(mariadbContainer); - }) - .catch((err: unknown) => { - console.log(err); - reject(err instanceof Error ? err : new Error(JSON.stringify(err))); - }); - }); - }, - "start:sqlserver:container": ({ name, environmentProperties }) => { - const sqlserverContainerBuilder = new GenericContainer( - process.env.MSSQL_IMAGE || "mcr.microsoft.com/mssql/server:2022-latest", - ) - .withPullPolicy(PullPolicy.alwaysPull()) - .withName(name as string) - .withNetworkAliases(name as string) - .withNetworkMode(config.env.NETWORK_NAME as string) - .withExposedPorts(1433) - .withEnvironment(environmentProperties as Environment) - .withWaitStrategy(Wait.forLogMessage(new RegExp(".*SQL Server is now ready for client connections.*"))); - return new Promise((resolve, reject) => { - sqlserverContainerBuilder - .start() - .then((sqlServerContainer) => { - console.log("SQL server started successfully"); - startedContainers.set("sqlserver", sqlServerContainer); - resolve(sqlServerContainer); - }) - .catch((err: unknown) => { - console.log(err); - reject(err instanceof Error ? err : new Error(JSON.stringify(err))); - }); - }); - }, - "execute:in:container": ({ containerName, command }) => { - return new Promise((resolve, reject) => { - console.log(`CLI commands: ${command as string}`); - const containerToExec = startedContainers.get(containerName as string); - let managementPort = startedContainersManagementPorts.get(containerName as string); - managementPort = managementPort ?? 9990; - containerToExec - ?.exec([ - "/bin/sh", - "-c", - `$JBOSS_HOME/bin/jboss-cli.sh --connect --controller=localhost:${managementPort} --commands=${ - command as string - }`, - ]) - .then((value) => { - if (value.exitCode === 0) { - resolve(value); - } else { - console.log(value); - reject(new Error(`Command failed with exit code ${value.exitCode}: ${value.output || ""}`)); - } - }) - .catch((err: { response: { data: string } }) => reject(new Error(err.response.data))); - }); - }, - "execute:cli": ({ managementApi, operation, address, ...args }) => { - return new Promise((resolve, reject) => { - axios - .post(managementApi as string, { - operation: operation as string, - address: address as string[], - ...args, - }) - .then((response) => { - resolve(response.data); - }) - .catch((err: { response: { data: string } }) => { - reject(new Error(err.response.data)); - }); - }).catch((error) => { - console.log(error); - throw new Error(JSON.stringify(error)); - }); - }, + "start:wildfly:container": createWildflyContainer( + startedContainers, + startedContainersManagementPorts, + config.env.NETWORK_NAME as string, + config.env.HAL_CONTAINER_PORT as string, + ), + "start:keycloak:container": createKeycloakContainer(startedContainers), + "start:postgres:container": createPostgresContainer(startedContainers, config.env.NETWORK_NAME as string), + "start:mysql:container": createMysqlContainer(startedContainers, config.env.NETWORK_NAME as string), + "start:mariadb:container": createMariadbContainer(startedContainers, config.env.NETWORK_NAME as string), + "start:sqlserver:container": createSqlserverContainer(startedContainers, config.env.NETWORK_NAME as string), + "execute:in:container": createExecuteInContainer(startedContainers, startedContainersManagementPorts), + "execute:cli": createExecuteCli(), "stop:containers": () => { const promises: Promise[] = []; startedContainers.forEach((container, key) => { @@ -341,12 +100,14 @@ export default defineConfig({ return Promise.all(promises); }, }); + on("after:spec", (spec: Cypress.Spec, results: CypressCommandLine.RunResult) => { // Keep videos only for failed specs - if (results && results.video && results.stats.failures === 0 && fs.existsSync(results.video)) { - fs.unlinkSync(results.video); + if (results && results.video && results.stats.failures === 0 && existsSync(results.video)) { + unlinkSync(results.video); } }); + return config; }, }, diff --git a/eslint.config.mjs b/eslint.config.mjs index b3dc6421a..ee673d6cd 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -12,9 +12,7 @@ export default [ { languageOptions: { parserOptions: { - projectService: { - allowDefaultProject: ["cypress.config.ts"], - }, + projectService: true, tsconfigRootDir: import.meta.dirname, }, }, diff --git a/package.json b/package.json index 6e016170e..1011bde63 100644 --- a/package.json +++ b/package.json @@ -31,29 +31,29 @@ "license": "ISC", "devDependencies": { "@cypress/xvfb": "1.2.4", - "@types/command-line-args": "5.2.0", - "@types/mochawesome": "6.2.1", - "@types/portscanner": "2.1.1", - "@typescript-eslint/eslint-plugin": "^8.45.0", - "@typescript-eslint/parser": "^8.45.0", + "@types/command-line-args": "5.2.3", + "@types/mochawesome": "6.2.4", + "@types/portscanner": "2.1.4", + "@typescript-eslint/eslint-plugin": "^8.46.1", + "@typescript-eslint/parser": "^8.46.1", "command-line-args": "^6.0.1", "cpy-cli": "^6.0.0", "cypress-multi-reporters": "^2.0.5", "del-cli": "^7.0.0", "eslint": "^9.37.0", "eslint-config-prettier": "^10.1.8", - "mocha-junit-reporter": "2.2.0", - "mochawesome": "7.1.3", + "mocha-junit-reporter": "2.2.1", + "mochawesome": "^7.1.4", "mochawesome-merge": "^5.0.0", "mochawesome-report-generator": "^6.3.0", "prettier": "^3.6.2", - "typedoc": "^0.28.13", + "typedoc": "^0.28.14", "typescript": "^5.9.3", - "typescript-eslint": "^8.45.0" + "typescript-eslint": "^8.46.1" }, "dependencies": { "axios": "^1.12.2", - "cypress": "15.3.0", + "cypress": "15.4.0", "portscanner": "^2.2.0", "testcontainers": "^11.7.1" } diff --git a/packages/resources/src/index.ts b/packages/resources/src/index.ts index 0333b34a3..98342ff77 100644 --- a/packages/resources/src/index.ts +++ b/packages/resources/src/index.ts @@ -15,4 +15,4 @@ const mavenInstance = maven.create({ "jdbc.drivers.copy.dependencies.output.directory": jdbcDriversDirectory, "modules.copy.dependencies.output.directory": modulesDirectory, }); -})(); \ No newline at end of file +})(); diff --git a/packages/testsuite/cypress/e2e/elytron-oidc-client/test-oidc-security-rbac.cy.ts b/packages/testsuite/cypress/e2e/elytron-oidc-client/test-oidc-security-rbac.cy.ts index 40110b19b..e0ae267ec 100644 --- a/packages/testsuite/cypress/e2e/elytron-oidc-client/test-oidc-security-rbac.cy.ts +++ b/packages/testsuite/cypress/e2e/elytron-oidc-client/test-oidc-security-rbac.cy.ts @@ -102,8 +102,12 @@ describe("TESTS: Access secured by Elytron OIDC client with RBAC", () => { function verifyNotLoggedIn(keycloak: string): void { cy.url().should("include", keycloak); - cy.get("#username").should("exist"); - cy.get("#password").should("exist"); - cy.get("#kc-login").should("exist"); + cy.origin(keycloak, () => { + // Wait for Keycloak login page to fully load + cy.wait(1000); + cy.get("#username").should("exist"); + cy.get("#password").should("exist"); + cy.get("#kc-login").should("exist"); + }); } }); diff --git a/packages/testsuite/cypress/e2e/elytron-oidc-client/test-oidc-security.cy.ts b/packages/testsuite/cypress/e2e/elytron-oidc-client/test-oidc-security.cy.ts index bab4fb860..ce56f83b1 100644 --- a/packages/testsuite/cypress/e2e/elytron-oidc-client/test-oidc-security.cy.ts +++ b/packages/testsuite/cypress/e2e/elytron-oidc-client/test-oidc-security.cy.ts @@ -48,9 +48,13 @@ describe("TESTS: Access secured by Elytron OIDC client", () => { } function verifyNotLoggedIn(keycloak: string): void { - cy.url().should(`include`, keycloak); - cy.get("#username").should("exist"); - cy.get("#password").should("exist"); - cy.get("#kc-login").should("exist"); + cy.url().should("include", keycloak); + cy.origin(keycloak, () => { + // Wait for Keycloak login page to fully load + cy.wait(1000); + cy.get("#username").should("exist"); + cy.get("#password").should("exist"); + cy.get("#kc-login").should("exist"); + }); } }); diff --git a/packages/testsuite/cypress/support/resource-utils.ts b/packages/testsuite/cypress/support/resource-utils.ts index b2915fa4d..adc152865 100644 --- a/packages/testsuite/cypress/support/resource-utils.ts +++ b/packages/testsuite/cypress/support/resource-utils.ts @@ -321,4 +321,4 @@ declare global { isEAP(managementEndpoint: string): Chainable; } } -} \ No newline at end of file +} diff --git a/packages/testsuite/cypress/support/verification-utils.ts b/packages/testsuite/cypress/support/verification-utils.ts index e659f886b..ca1d2def7 100644 --- a/packages/testsuite/cypress/support/verification-utils.ts +++ b/packages/testsuite/cypress/support/verification-utils.ts @@ -218,4 +218,4 @@ declare global { closeAllPopUpNotifications(): void; } } -} \ No newline at end of file +} diff --git a/packages/testsuite/open-cypress.ts b/packages/testsuite/open-cypress.ts index 40162fe93..7110dbe01 100644 --- a/packages/testsuite/open-cypress.ts +++ b/packages/testsuite/open-cypress.ts @@ -20,4 +20,4 @@ import { Berg } from "@berg/berg"; }, }); await berg.stop(); -})(); \ No newline at end of file +})(); diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index 6ed04b946..4413ddcb4 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -1,6 +1,6 @@ { // extend your base config to share compilerOptions, etc - "extends": "./tsconfig.json", + "extends": "./tsconfig.base.json", "compilerOptions": { // ensure that nobody can accidentally use this config for a build "noEmit": true @@ -10,6 +10,7 @@ "src", "test", "cypress", - "cypress.config.ts" + "cypress.config.ts", + "config" ] } diff --git a/tsconfig.json b/tsconfig.json index 13e302f7a..d5f8767b3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,7 @@ { "files": [], "references": [ + { "path": "tsconfig.root.json" }, { "path": "packages/resources" }, { "path": "packages/commands" }, { "path": "packages/berg" }, diff --git a/tsconfig.root.json b/tsconfig.root.json new file mode 100644 index 000000000..46de79445 --- /dev/null +++ b/tsconfig.root.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "types": ["cypress", "node"], + "outDir": "dist", + "rootDir": "." + }, + "include": ["cypress.config.ts", "config/**/*.ts"] +} diff --git a/tsconfig.root.tsbuildinfo b/tsconfig.root.tsbuildinfo new file mode 100644 index 000000000..193471d71 --- /dev/null +++ b/tsconfig.root.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.es2016.full.d.ts","./node_modules/blob-util/dist/blob-util.d.ts","./node_modules/cypress/types/cy-blob-util.d.ts","./node_modules/cypress/types/bluebird/index.d.ts","./node_modules/cypress/types/cy-bluebird.d.ts","./node_modules/cypress/types/cy-minimatch.d.ts","./node_modules/cypress/types/chai/index.d.ts","./node_modules/cypress/types/cy-chai.d.ts","./node_modules/cypress/types/lodash/common/common.d.ts","./node_modules/cypress/types/lodash/common/array.d.ts","./node_modules/cypress/types/lodash/common/collection.d.ts","./node_modules/cypress/types/lodash/common/date.d.ts","./node_modules/cypress/types/lodash/common/function.d.ts","./node_modules/cypress/types/lodash/common/lang.d.ts","./node_modules/cypress/types/lodash/common/math.d.ts","./node_modules/cypress/types/lodash/common/number.d.ts","./node_modules/cypress/types/lodash/common/object.d.ts","./node_modules/cypress/types/lodash/common/seq.d.ts","./node_modules/cypress/types/lodash/common/string.d.ts","./node_modules/cypress/types/lodash/common/util.d.ts","./node_modules/cypress/types/lodash/index.d.ts","./node_modules/@types/sinonjs__fake-timers/index.d.ts","./node_modules/cypress/types/sinon/index.d.ts","./node_modules/cypress/types/sinon-chai/index.d.ts","./node_modules/cypress/types/mocha/index.d.ts","./node_modules/cypress/types/jquery/JQueryStatic.d.ts","./node_modules/cypress/types/jquery/JQuery.d.ts","./node_modules/cypress/types/jquery/misc.d.ts","./node_modules/cypress/types/jquery/legacy.d.ts","./node_modules/@types/sizzle/index.d.ts","./node_modules/cypress/types/jquery/index.d.ts","./node_modules/cypress/types/chai-jquery/index.d.ts","./node_modules/cypress/types/cypress-npm-api.d.ts","./node_modules/cypress/types/net-stubbing.d.ts","./node_modules/eventemitter2/eventemitter2.d.ts","./node_modules/buffer/index.d.ts","./node_modules/cypress/types/cypress-eventemitter.d.ts","./node_modules/cypress/types/cypress-type-helpers.d.ts","./node_modules/cypress/types/cypress-automation.d.ts","./node_modules/cypress/types/cypress.d.ts","./node_modules/cypress/types/cypress-global-vars.d.ts","./node_modules/cypress/types/cypress-expect.d.ts","./node_modules/cypress/types/index.d.ts","./node_modules/testcontainers/build/common/file-lock.d.ts","./node_modules/testcontainers/build/common/hash.d.ts","./node_modules/testcontainers/build/common/logger.d.ts","./node_modules/testcontainers/build/common/clock.d.ts","./node_modules/testcontainers/build/common/retry.d.ts","./node_modules/testcontainers/build/common/streams.d.ts","./node_modules/testcontainers/build/common/time.d.ts","./node_modules/testcontainers/build/common/type-guards.d.ts","./node_modules/testcontainers/build/common/uuid.d.ts","./node_modules/testcontainers/build/common/index.d.ts","./node_modules/testcontainers/build/container-runtime/auth/types.d.ts","./node_modules/testcontainers/build/container-runtime/auth/get-auth-config.d.ts","./node_modules/testcontainers/build/container-runtime/clients/compose/types.d.ts","./node_modules/testcontainers/build/container-runtime/clients/compose/compose-client.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/crypto.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/utility.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client-stats.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/h2c-client.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-call-history.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/snapshot-agent.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/cache-interceptor.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/ssh2/index.d.ts","./node_modules/@types/docker-modem/index.d.ts","./node_modules/@types/dockerode/index.d.ts","./node_modules/testcontainers/build/container-runtime/clients/container/types.d.ts","./node_modules/testcontainers/build/container-runtime/clients/container/container-client.d.ts","./node_modules/testcontainers/build/container-runtime/image-name.d.ts","./node_modules/testcontainers/build/container-runtime/clients/image/image-client.d.ts","./node_modules/testcontainers/build/container-runtime/clients/network/network-client.d.ts","./node_modules/testcontainers/build/container-runtime/clients/types.d.ts","./node_modules/testcontainers/build/container-runtime/clients/client.d.ts","./node_modules/testcontainers/build/container-runtime/clients/compose/parse-compose-container-name.d.ts","./node_modules/testcontainers/build/container-runtime/index.d.ts","./node_modules/testcontainers/build/types.d.ts","./node_modules/testcontainers/build/utils/pull-policy.d.ts","./node_modules/testcontainers/build/utils/port.d.ts","./node_modules/testcontainers/build/utils/bound-ports.d.ts","./node_modules/testcontainers/build/wait-strategies/wait-strategy.d.ts","./node_modules/testcontainers/build/network/network.d.ts","./node_modules/testcontainers/build/test-container.d.ts","./node_modules/testcontainers/build/generic-container/started-generic-container.d.ts","./node_modules/testcontainers/build/docker-compose-environment/downed-docker-compose-environment.d.ts","./node_modules/testcontainers/build/docker-compose-environment/stopped-docker-compose-environment.d.ts","./node_modules/testcontainers/build/docker-compose-environment/started-docker-compose-environment.d.ts","./node_modules/testcontainers/build/docker-compose-environment/docker-compose-environment.d.ts","./node_modules/testcontainers/build/generic-container/abstract-started-container.d.ts","./node_modules/testcontainers/build/generic-container/abstract-stopped-container.d.ts","./node_modules/testcontainers/build/generic-container/generic-container-builder.d.ts","./node_modules/testcontainers/build/generic-container/generic-container.d.ts","./node_modules/testcontainers/build/reaper/reaper.d.ts","./node_modules/testcontainers/build/socat/socat-container.d.ts","./node_modules/testcontainers/build/test-containers.d.ts","./node_modules/testcontainers/build/utils/labels.d.ts","./node_modules/testcontainers/build/utils/port-generator.d.ts","./node_modules/testcontainers/build/wait-strategies/http-wait-strategy.d.ts","./node_modules/testcontainers/build/wait-strategies/startup-check-strategy.d.ts","./node_modules/testcontainers/build/wait-strategies/composite-wait-strategy.d.ts","./node_modules/testcontainers/build/wait-strategies/log-wait-strategy.d.ts","./node_modules/testcontainers/build/wait-strategies/shell-wait-strategy.d.ts","./node_modules/testcontainers/build/wait-strategies/wait.d.ts","./node_modules/testcontainers/build/wait-strategies/wait-for-container.d.ts","./node_modules/testcontainers/build/index.d.ts","./config/interfaces.ts","./config/helpers/error-handler.ts","./config/helpers/url-builder.ts","./config/helpers/container-helpers.ts","./config/helpers/index.ts","./config/containers/database.ts","./node_modules/axios/index.d.ts","./node_modules/@types/portscanner/index.d.ts","./config/containers/wildfly.ts","./config/containers/index.ts","./config/tasks/wildfly-tasks.ts","./config/tasks/keycloak-tasks.ts","./config/tasks/database-tasks.ts","./config/tasks/cli-tasks.ts","./config/tasks/index.ts","./cypress.config.ts"],"fileIdsList":[[111,165,182,183,256,257,261],[111,165,182,183,262,265],[111,165,182,183,256,257,261,263,264,272],[111,165,182,183,186,272],[111,165,182,183],[111,165,182,183,258,259,260],[111,165,182,183,228],[111,165,182,183,257,263],[111,165,182,183,256,257,266,272],[111,165,182,183,267,268,269,270],[111,165,182,183,256,257,261,264,272],[111,165,182,183,256,257,261,266,272],[84,111,165,177,182,183,256,271],[111,165,179,182,183,185,197,215,216],[111,165,176,182,183,197,215,216,217],[111,162,163,165,182,183],[111,164,165,182,183],[165,182,183],[111,165,170,182,183,200],[111,165,166,171,176,182,183,185,197,208],[111,165,166,167,176,182,183,185],[111,165,168,182,183,209],[111,165,169,170,177,182,183,186],[111,165,170,182,183,197,205],[111,165,171,173,176,182,183,185],[111,164,165,172,182,183],[111,165,173,174,182,183],[111,165,175,176,182,183],[111,164,165,176,182,183],[111,165,176,177,178,182,183,197,208],[111,165,176,177,178,182,183,192,197,200],[111,157,165,173,176,179,182,183,185,197,208],[111,165,176,177,179,180,182,183,185,197,205,208],[111,165,179,181,182,183,197,205,208],[109,110,111,112,113,114,115,116,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214],[111,165,176,182,183],[111,165,182,183,184,208],[111,165,173,176,182,183,185,197],[111,165,182,183,186],[111,165,182,183,187],[111,164,165,182,183,188],[111,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214],[111,165,182,183,190],[111,165,182,183,191],[111,165,176,182,183,192,193],[111,165,182,183,192,194,209,211],[111,165,176,182,183,197,198,200],[111,165,182,183,199,200],[111,165,182,183,197,198],[111,165,182,183,200],[111,165,182,183,201],[111,162,165,182,183,197,202],[111,165,176,182,183,203,204],[111,165,182,183,203,204],[111,165,170,182,183,185,197,205],[111,165,182,183,206],[111,165,182,183,185,207],[111,165,179,182,183,191,208],[111,165,170,182,183,209],[111,165,182,183,197,210],[111,165,182,183,184,211],[111,165,182,183,212],[111,165,170,182,183],[111,157,165,182,183],[111,165,182,183,213],[111,157,165,176,178,182,183,188,197,200,208,210,211,213],[111,165,182,183,197,214],[111,165,176,179,181,182,183,185,197,215],[58,82,111,165,182,183],[53,111,165,182,183],[55,111,165,182,183],[58,111,165,182,183],[86,87,111,165,182,183],[84,88,89,90,111,165,182,183],[54,56,57,59,72,74,75,76,82,83,84,85,89,91,92,93,111,165,182,183],[77,78,79,80,81,111,165,182,183],[60,62,63,64,65,66,67,68,69,70,71,72,111,165,182,183],[60,61,63,64,65,66,67,68,69,70,71,72,111,165,182,183],[61,62,63,64,65,66,67,68,69,70,71,72,111,165,182,183],[60,61,62,64,65,66,67,68,69,70,71,72,111,165,182,183],[60,61,62,63,65,66,67,68,69,70,71,72,111,165,182,183],[60,61,62,63,64,66,67,68,69,70,71,72,111,165,182,183],[60,61,62,63,64,65,67,68,69,70,71,72,111,165,182,183],[60,61,62,63,64,65,66,68,69,70,71,72,111,165,182,183],[60,61,62,63,64,65,66,67,69,70,71,72,111,165,182,183],[60,61,62,63,64,65,66,67,68,70,71,72,111,165,182,183],[60,61,62,63,64,65,66,67,68,69,71,72,111,165,182,183],[60,61,62,63,64,65,66,67,68,69,70,72,111,165,182,183],[60,61,62,63,64,65,66,67,68,69,70,71,111,165,182,183],[58,74,111,165,182,183],[73,111,165,182,183],[95,96,97,99,100,101,102,103,111,165,182,183],[98,111,165,182,183],[111,165,182,183,197],[105,111,165,182,183],[108,111,165,182,183,220,222,223,224],[107,111,165,182,183],[104,111,165,182,183],[111,165,182,183,197,218,219],[111,165,182,183,218,221],[111,165,182,183,218],[106,107,111,165,182,183,221,224,225,226],[104,111,165,182,183,227,228,229,232,238],[111,165,182,183,227,235,236,237],[111,165,182,183,227,236],[111,165,182,183,197,228,234],[111,165,182,183,234],[104,111,165,182,183,228,229,243],[111,165,182,183,197,218,227,228,229,230,232,233,234,242],[111,165,182,183,197,218,228,231,232,234],[104,111,165,182,183,227,228,229,230,231,232,233,234,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,254,255],[104,111,165,182,183,218,227],[111,165,182,183,227],[111,165,182,183,234,240,243],[111,165,182,183,197,228,229,230,232,233],[111,165,182,183,197,219],[111,165,182,183,227,228,230],[111,165,182,183,218,231,232],[111,165,182,183,218,232],[111,165,182,183,218,227,231,232],[111,165,182,183,218,231],[111,165,182,183,232,249,251,252,253],[111,123,126,129,130,165,182,183,208],[111,126,165,182,183,197,208],[111,126,130,165,182,183,208],[111,120,165,182,183],[111,124,165,182,183],[111,122,123,126,165,182,183,208],[111,165,182,183,185,205],[111,165,182,183,215],[111,120,165,182,183,215],[111,122,126,165,182,183,185,208],[111,117,118,119,121,125,165,176,182,183,197,208],[111,126,134,142,165,182,183],[111,118,124,165,182,183],[111,126,151,152,165,182,183],[111,118,121,126,165,182,183,200,208,215],[111,126,165,182,183],[111,122,126,165,182,183,208],[111,117,165,182,183],[111,120,121,122,124,125,126,127,128,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,152,153,154,155,156,165,182,183],[111,126,144,147,165,173,182,183],[111,126,134,135,136,165,182,183],[111,124,126,135,137,165,182,183],[111,125,165,182,183],[111,118,120,126,165,182,183],[111,126,130,135,137,165,182,183],[111,130,165,182,183],[111,124,126,129,165,182,183,208],[111,118,122,126,134,165,182,183],[111,126,144,165,182,183],[111,137,165,182,183],[111,120,126,151,165,182,183,200,213,215]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"807e0e0bdc67605dd28efe18f20ab5fcd75d944ef95936120702335f9379094b","impliedFormat":1},{"version":"bc90fb5b7ac9532ac8bbe8181112e58b9df8daa3b85a44c5122323ee4ecbc2bd","impliedFormat":1},{"version":"9261ae542670cb581169afafa421aeeaf0f6ccd6c8f2d97b8a97ee4be9986c3e","impliedFormat":1},{"version":"6247a016129906c76ba4012d2d77773c919ea33a96830b0a8d522a9790fc7efe","impliedFormat":1},{"version":"01e24df7c7f6c1dabd80333bdd4e61f996b70edec78cc8c372cc1de13d67cfa5","impliedFormat":1},{"version":"f4742762590497b770af445215e3a7cf1965664b39257dba4ce2a4317fc949d8","impliedFormat":1},{"version":"ceeda631f23bd41ca5326b665a2f078199e5e190ab29a9a139e10c9564773042","affectsGlobalScope":true,"impliedFormat":1},{"version":"1b43d676651f4548af6a6ebd0e0d4a9d7583a3d478770ef5207a2931988fe4e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"3594c022901a1c8993b0f78a3f534cfb81e7b619ed215348f7f6882f3db02abc","impliedFormat":1},{"version":"438284c7c455a29b9c0e2d1e72abc62ee93d9a163029ffe918a34c5db3b92da2","impliedFormat":1},{"version":"0c75b204aed9cf6ff1c7b4bed87a3ece0d9d6fc857a6350c0c95ed0c38c814e8","impliedFormat":1},{"version":"187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","impliedFormat":1},{"version":"c9f396e71966bd3a890d8a36a6a497dbf260e9b868158ea7824d4b5421210afe","impliedFormat":1},{"version":"509235563ea2b939e1bbe92aae17e71e6a82ceab8f568b45fb4fce7d72523a32","impliedFormat":1},{"version":"9364c7566b0be2f7b70ff5285eb34686f83ccb01bda529b82d23b2a844653bfb","impliedFormat":1},{"version":"00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","impliedFormat":1},{"version":"c311349ec71bb69399ffc4092853e7d8a86c1ca39ddb4cd129e775c19d985793","impliedFormat":1},{"version":"3c92b6dfd43cc1c2485d9eba5ff0b74a19bb8725b692773ef1d66dac48cda4bd","impliedFormat":1},{"version":"4908e4c00832b26ce77a629de8501b0e23a903c094f9e79a7fec313a15da796a","impliedFormat":1},{"version":"2630a7cbb597e85d713b7ef47f2946d4280d3d4c02733282770741d40672b1a5","impliedFormat":1},{"version":"0714e2046df66c0e93c3330d30dbc0565b3e8cd3ee302cf99e4ede6220e5fec8","affectsGlobalScope":true,"impliedFormat":1},{"version":"550650516d34048712520ffb1fce4a02f2d837761ee45c7d9868a7a35e7b0343","impliedFormat":1},{"version":"11aba3fa22da1d81bc86ab9e551c72267d217d0a480d3dda5cada8549597c5e4","impliedFormat":1},{"version":"c66593f9dd5b7e24da87f3bc76eacf9da83541e8dce5fec4c7bbe28b0a415ea0","affectsGlobalScope":true,"impliedFormat":1},{"version":"060f0636cb83057f9a758cafc817b7be1e8612c4387dfe3fbadda865958cf8c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"84c8e0dfd0d885abd37c1d213ef0b949dd8ef795291e7e7b1baadbbe4bc0f8a9","affectsGlobalScope":true,"impliedFormat":1},{"version":"9d21da8939908dafa89d693c3e22aabeef28c075b68bb863257e631deef520f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"5261e21f183c6c1c3b65784cdab8c2a912b6f4cd5f8044a1421466a8c894f832","affectsGlobalScope":true,"impliedFormat":1},{"version":"8c4a3355af2c490a8af67c4ec304e970424a15ef648a3c3fbb3ee6634461e2cc","affectsGlobalScope":true,"impliedFormat":1},{"version":"6537313aa6bd137e046dd52f48698d4075dd511886f17ee70bc1dda1b9fe1066","impliedFormat":1},{"version":"6739393f79c9a48ec82c6faa0d6b25d556daf3b6871fc4e5131f5445a13e7d15","impliedFormat":1},{"version":"66a11cff774f91be73e9c9890fe16bcc4bce171d5d7bd47b19a0d3e396c5f4ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"0b9ef3d2c7ea6e6b4c4f5634cfccd609b4c164067809c2da007bf56f52d98647","affectsGlobalScope":true,"impliedFormat":1},{"version":"1d0830a20a9030f638012fc67537c99dbfc14f9a0928a3c6e733195f03558bfc","affectsGlobalScope":true,"impliedFormat":1},{"version":"452234c0b8169349b658a4b5e2b271608879b3914fcc325735ed21b9cb88d58d","impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"eb0a79b91cda3b1bd685c17805cc7a734669b983826f18cc75eeb6266b1eb7cb","affectsGlobalScope":true,"impliedFormat":1},{"version":"326d76935bfa6ffe5b62a6807a59c123629032bd15a806e15103fd255ea0922b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d0b5f88c0f6cf3758977b7589159e067acd3d8be1b2ca50e74f6f1ad6f79a146","affectsGlobalScope":true,"impliedFormat":1},{"version":"87c59801390242c812a1013cf853cf2a5106e5b7f728fb37661ec5f9d479edb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"d0f7e7733d00981d550d8d78722634f27d13b063e8fef6d66ee444efc06d687f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6757e50adf5370607dcfbcc179327b12bdfdd7e1ff19ea14a2bffb1bbeadf900","affectsGlobalScope":true,"impliedFormat":1},{"version":"5cb567a1cf0c8416be35fe600fc71f98c2eb370b3122d189267ca2fde7a2bb34","impliedFormat":1},{"version":"06fdbe25e9708ee8c154147d4130547116feb7538905e4a0ddd3897747f00c7a","impliedFormat":1},{"version":"4722fd74708636c5ccae96096d2e8105481d8054b1e9f2ba586380d8beae46e9","impliedFormat":1},{"version":"165b1e657a2e782586d02365c6e647625d1f83b0f86434e223e5ae79c961c413","impliedFormat":1},{"version":"6c92284a2b4829e9ae995011130e1577d383073220af9b1b3b10a875e6dc476c","impliedFormat":1},{"version":"7cc5cca50c261857fe6d0a8e16583c25bbe9b7f3edbb31df83cf7e8f0ac25907","impliedFormat":1},{"version":"5c356da2c84f4878800c653c500dd9532330f0759cc47f8ff3f4371c27598073","impliedFormat":1},{"version":"49598095930a8dadf9c462bf2a408f1aad78146409f223b9ee0a5f89a4e382cd","impliedFormat":1},{"version":"45b3baf59d4817d5691ecd36268fd65154edabfb07befd66e24875b59d0fb4b5","impliedFormat":1},{"version":"01f77442e53ce5e94687cf71eb41da6d9bfc38c8559f96cc08b85d5074fe964f","impliedFormat":1},{"version":"85affae5f55f168321490535b401fd910702cd8903f4d40a3c65942ce6482a5d","impliedFormat":1},{"version":"c33985ae643458a14ef8a90347c135c67ad20042ae6f707ac5d81155d06f791f","impliedFormat":1},{"version":"6146c6200c43a0eca96e4c65fc666b37f4db80846217701c8e855217ff924ed7","impliedFormat":1},{"version":"afb5d4e43959a9e5bd99903a6e55db6e33b58570cd33bb46574fa7c64f252ea0","impliedFormat":1},{"version":"abdf8aa11c0105e515fbe6049a8cbe96d58873b1577aa4a7f4c8cb59d9f69486","impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0671b50bb99cc7ad46e9c68fa0e7f15ba4bc898b59c31a17ea4611fab5095da","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"aa83e100f0c74a06c9d24f40a096c9e9cc3c02704250d01541e22c0ae9264eda","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"387a023d363f755eb63450a66c28b14cdd7bc30a104565e2dbf0a8988bb4a56c","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"3c8e93af4d6ce21eb4c8d005ad6dc02e7b5e6781f429d52a35290210f495a674","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"00b21ef538da5a2bbe419e2144f3be50661768e1e039ef2b57bb89f96aff9b18","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"e843e840f484f7e59b2ef9488501a301e3300a8e3e56aa84a02ddf915c7ce07d","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"78b29846349d4dfdd88bd6650cc5d2baaa67f2e89dc8a80c8e26ef7995386583","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"18f8cfbb14ba9405e67d30968ae67b8d19133867d13ebc49c8ed37ec64ce9bdb","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"830171b27c5fdf9bcbe4cf7d428fcf3ae2c67780fb7fbdccdf70d1623d938bc4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"f68328826a275104d92bd576c796c570f66365f25ea8bbaaa208727bce132d5f","impliedFormat":1},{"version":"7cf69dd5502c41644c9e5106210b5da7144800670cbe861f66726fa209e231c4","impliedFormat":1},{"version":"72c1f5e0a28e473026074817561d1bc9647909cf253c8d56c41d1df8d95b85f7","impliedFormat":1},{"version":"18334defc3d0a0e1966f5f3c23c7c83b62c77811e51045c5a7ff3883b446f81f","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b17fcd63aa13734bf1d01419f4d6031b1c6a5fb2cbdb45e9839fb1762bdf0df","impliedFormat":1},{"version":"c4e8e8031808b158cfb5ac5c4b38d4a26659aec4b57b6a7e2ba0a141439c208c","impliedFormat":1},{"version":"2c91d8366ff2506296191c26fd97cc1990bab3ee22576275d28b654a21261a44","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"beb77fcd86c8cee62c32b2fb82753f5bc0e171d938e20af3cb0b8925db78d60b","impliedFormat":1},{"version":"289e9894a4668c61b5ffed09e196c1f0c2f87ca81efcaebdf6357cfb198dac14","impliedFormat":1},{"version":"25a1105595236f09f5bce42398be9f9ededc8d538c258579ab662d509aa3b98e","impliedFormat":1},{"version":"aa9224557befad144262c85b463c0a7ba8a3a0ad2a7c907349f8bb8bc3fe4abc","impliedFormat":1},{"version":"a2e2bbde231b65c53c764c12313897ffdfb6c49183dd31823ee2405f2f7b5378","impliedFormat":1},{"version":"ad1cc0ed328f3f708771272021be61ab146b32ecf2b78f3224959ff1e2cd2a5c","impliedFormat":1},{"version":"8d86c8d8c43e04cc3dde9953e571656812c8964a3651203af7b3a1df832a34df","affectsGlobalScope":true,"impliedFormat":1},{"version":"0121911fcc364eb821d058cf4c3b9339f197eccbe298098a4c6be0396b607d90","impliedFormat":1},{"version":"c6176c7b9f3769ba7f076c7a791588562c653cc0ba08fb2184f87bf78db2a87c","impliedFormat":1},{"version":"6def204d0b267101d3a42300a7363f53406c5d86b932e76e2365bf89689a85c4","impliedFormat":1},{"version":"4f766affd1281935fe5f7fd5d7af693a7c26d81adef7c1aefb84b9cd573a9cbb","impliedFormat":1},{"version":"165a0c1f95bc939c72f18a280fc707fba6f2f349539246b050cfc09eb1d9f446","impliedFormat":1},{"version":"bbf42f98a5819f4f06e18c8b669a994afe9a17fe520ae3454a195e6eabf7700d","impliedFormat":1},{"version":"c0bb1b65757c72bbf8ddf7eaa532223bacf58041ff16c883e76f45506596e925","impliedFormat":1},{"version":"c8b85f7aed29f8f52b813f800611406b0bfe5cf3224d20a4bdda7c7f73ce368e","affectsGlobalScope":true,"impliedFormat":1},{"version":"7baae9bf5b50e572e7742c886c73c6f8fa50b34190bc5f0fd20dd7e706fda832","impliedFormat":1},{"version":"e99b0e71f07128fc32583e88ccd509a1aaa9524c290efb2f48c22f9bf8ba83b1","impliedFormat":1},{"version":"76957a6d92b94b9e2852cf527fea32ad2dc0ef50f67fe2b14bd027c9ceef2d86","impliedFormat":1},{"version":"5e9f8c1e042b0f598a9be018fc8c3cb670fe579e9f2e18e3388b63327544fe16","affectsGlobalScope":true,"impliedFormat":1},{"version":"a8a99a5e6ed33c4a951b67cc1fd5b64fd6ad719f5747845c165ca12f6c21ba16","affectsGlobalScope":true,"impliedFormat":1},{"version":"a58a15da4c5ba3df60c910a043281256fa52d36a0fcdef9b9100c646282e88dd","impliedFormat":1},{"version":"b36beffbf8acdc3ebc58c8bb4b75574b31a2169869c70fc03f82895b93950a12","impliedFormat":1},{"version":"de263f0089aefbfd73c89562fb7254a7468b1f33b61839aafc3f035d60766cb4","impliedFormat":1},{"version":"70b57b5529051497e9f6482b76d91c0dcbb103d9ead8a0549f5bab8f65e5d031","impliedFormat":1},{"version":"8c81fd4a110490c43d7c578e8c6f69b3af01717189196899a6a44f93daa57a3a","impliedFormat":1},{"version":"1013eb2e2547ad8c100aca52ef9df8c3f209edee32bb387121bb3227f7c00088","impliedFormat":1},{"version":"b827f8800f42858f0a751a605c003b7ab571ff7af184436f36cef9bdfebae808","impliedFormat":1},{"version":"363eedb495912790e867da6ff96e81bf792c8cfe386321e8163b71823a35719a","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"6b306cd4282bbb54d4a6bb23cfb7a271160983dfc38c67b5a132504cfcc34896","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea713aa14a670b1ea0fbaaca4fd204e645f71ca7653a834a8ec07ee889c45de6","impliedFormat":1},{"version":"450172a56b944c2d83f45cc11c9a388ea967cd301a21202aa0a23c34c7506a18","impliedFormat":1},{"version":"9705cd157ffbb91c5cab48bdd2de5a437a372e63f870f8a8472e72ff634d47c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae86f30d5d10e4f75ce8dcb6e1bd3a12ecec3d071a21e8f462c5c85c678efb41","impliedFormat":1},{"version":"3af7d02e5d6ecbf363e61fb842ee55d3518a140fd226bdfb24a3bca6768c58df","impliedFormat":1},{"version":"e03460fe72b259f6d25ad029f085e4bedc3f90477da4401d8fbc1efa9793230e","impliedFormat":1},{"version":"4286a3a6619514fca656089aee160bb6f2e77f4dd53dc5a96b26a0b4fc778055","impliedFormat":1},{"version":"7dfa742c23851808a77ec27062fbbd381c8c36bb3cfdff46cb8af6c6c233bfc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb078cfcd14dc0b1700a48272958f803f30f13f99111c5978c75c3a0aa07e40e","affectsGlobalScope":true,"impliedFormat":1},{"version":"784490137935e1e38c49b9289110e74a1622baf8a8907888dcbe9e476d7c5e44","impliedFormat":1},{"version":"420fdd37c51263be9db3fcac35ffd836216c71e6000e6a9740bb950fb0540654","impliedFormat":1},{"version":"73b0bff83ee76e3a9320e93c7fc15596e858b33c687c39a57567e75c43f2a324","impliedFormat":1},{"version":"3c947600f6f5664cca690c07fcf8567ca58d029872b52c31c2f51d06fbdb581b","affectsGlobalScope":true,"impliedFormat":1},{"version":"493c64d062139b1849b0e9c4c3a6465e1227d2b42be9e26ec577ca728984c041","impliedFormat":1},{"version":"d7e9ab1b0996639047c61c1e62f85c620e4382206b3abb430d9a21fb7bc23c77","impliedFormat":1},{"version":"4371055bb001f40596e2e236b27583e13bf11e75d937962f8947d56519237fb8","impliedFormat":1},{"version":"89189df027e8910200a4b65af1e29a996225cf25975f5c438fbe9361c008fc6b","impliedFormat":1},{"version":"6fefe3027c6aca4d26a735e27e1fd34c77a3033b5a6fb1b6983237a78adfd787","impliedFormat":1},{"version":"0b000f734fad76dcc87c70c90158d691ee409680eceb20e531a133de740f2324","impliedFormat":1},{"version":"1102259c5a03f6e15b27b4d259f0822dd931a6153c99d011ea5e32255eb37074","impliedFormat":1},{"version":"900c6d7b342ed29604a346d6f680a912f7ef60ba97f44e8cb8d5205041969dec","impliedFormat":1},{"version":"8cae686f3bf9ffdc5fad65592f348a37e2ed743a632a1b605000a2431bc7eaf8","impliedFormat":1},{"version":"8d6b7b77814d3beda2224c9d32ab4e77d373a5225f15573b77eae05f03926ed0","impliedFormat":1},{"version":"1c3a0e3abac99928fb5dec8f42d23b8ad1ebd5f26df08cd0a8dcb0c9d43a503d","impliedFormat":1},{"version":"2cb76131ee7c1b849d730d266f49ad5617a285d7b8ad7ebc1ac2749ae454e222","impliedFormat":1},{"version":"34bf6d81c6b9e84f1d53c2465d521277bea994f8612a0d80417fcdaad37cfbcd","impliedFormat":1},{"version":"f489d5e1bd45c038e9355267b9fa20b2298a372c2a4efcfd5cbf9f0fd7e40627","impliedFormat":1},{"version":"2ba451e07c8d97ad210282aa75f56253be2180e5e5f2cd8772ba2f750a9604e1","impliedFormat":1},{"version":"2e59c8382b469370e5c7f60648be896285300a54e25acfb75007422c805c1cc6","impliedFormat":1},{"version":"1729f008e7761ea42cb17aee825ab171ec515cf564ace589685f56114d68f2ab","impliedFormat":1},{"version":"85f7a89a18d98bd7c68cda1289a19a3f7bce2166f0f7c2b9030d8a3eb4f427fb","impliedFormat":1},{"version":"a87fa100939aa190bc186945ab7293b5434e91fe3b137d43f5011adc47ecebf9","impliedFormat":1},{"version":"e560695e9bd123be74cd97ea2070204e15bf437dc7e38277f62e9013f09d0314","impliedFormat":1},{"version":"484241dff6f84192e2e4ad4e736a4d6bffc264f0fed17b756f5013ba04bb047c","impliedFormat":1},{"version":"093fca9e529d42c4525657c296e34812983b55930883b925c2ead884558105a8","impliedFormat":1},{"version":"c7798f43272b09de550520ead6df45f0ddf81bd97000784351d764df923e08d8","impliedFormat":1},{"version":"bb7973ee7b12dc2d956a74a68d589d2ec72209266509f88edabdfaddfb7ab712","impliedFormat":1},{"version":"fb47996d1fde69f078a79dda6a61c025dad9123d5fe1fdfc6bc2681fed5b9ae6","impliedFormat":1},{"version":"aa0ffe835ce8f876d53cabc57a2c464abb122c050d23cff484930e4368eb5a48","impliedFormat":1},{"version":"d40ab6876f305b14dc6e009a7a2eefb6285effbd07fe5c41be27d014cf3e5dbc","impliedFormat":1},{"version":"f065153d3b9e0f22d4a4dcddfd6fd902c73af666fd7350979525788e15590533","impliedFormat":1},{"version":"fec5c915e8a25765edc8fbc6f19a57da5bc4809b9191b79ce467fe84b1c43511","impliedFormat":1},{"version":"304f414094380566d57a7f3e4628d4d12b14341431a1957f6dc4b6112f422d53","impliedFormat":1},{"version":"876112a26ad2bb14c5ecf0ef16e3ae963397c771a2e293173b5704c8aee4441e","impliedFormat":1},{"version":"21136f25b4d5a59b94bbb519552a7114f055dcf5736db41c20967dedce6768e1","impliedFormat":1},{"version":"1bdf93cfb8b270ca905a8dfd106ff88277aef6c70cb72077db4faf75b30b94e3","impliedFormat":1},{"version":"c30b233f5f9c1caf20b0e34e90aba73a631e0ed49cdb1f4f93b6a9fc52ea700d","impliedFormat":1},{"version":"6ac9e5eeb91f4e33a6c9440fad06b6ec59a3b9089f69e192eb3702daf92a41cb","impliedFormat":1},{"version":"c449c814cf771b723f4d747f27e4bebe1ffdf236e86fa2812e781753c39452fa","impliedFormat":1},{"version":"31813f5d800846efe3400b7bdeb442fcaee27915efea787d1f50b8edecca34a5","impliedFormat":1},{"version":"b0d558b2e806df3758ee259b14d9b247c967fb7950b598d19459ab5dce263e54","impliedFormat":1},{"version":"244f1dfd6f31217ab2bf572c8c1083c5c20ae1c7252276649b0104288bd6d053","impliedFormat":1},{"version":"82af965d0bbe372b7cea4ee17c2a96ecbbfe0eecca081c4aeaf63e102affcd88","impliedFormat":1},{"version":"af763fbd7007bf8ea62e6ef71a47ea19ebacf8561f1321b7d53347fb2afbaefd","impliedFormat":1},{"version":"dd54b0c1cc6cbe7b8d11e1802bc8cf7b9fda48a46a11ad20b09304b7f2c7321c","impliedFormat":1},{"version":"a041aefaba5456223281c051ef0efefacadb0cdfc7a5501e328cd0b11cac7c64","impliedFormat":1},"3d95b94f4edc41493a5a045c38dc1f33909e59c026d398368f2a5cef9e844b1d","2ce26fb7f1bbed05d6949f1a9bb92379d852a0d01a5e9a66f44047abb015723d","4f8e5f7225a52bb0d7da0944cf2ec2a027881d549441f748072c3a23ff443d95","e9cdbe3ff3dba4846ef40ab1afa44023cbc8e7694ab289444f2605143e1d48df","27f03585393ee3dea0f9599f2cc7dfe3f822513373e3ab3127adc7c362003f1e","fce99cb7796c4056a1b9d274d31d6ef70cd0634b82cd07dc8f3cbdf956cdf59c",{"version":"7584239b853f690c6629ae8bb683ded6ff33104e7835778bbca5ee1b1d9a0a91","impliedFormat":99},{"version":"b476c961700dd070b644f1d7b0855325b0812ea355c962803519a6fbbfb4f1db","impliedFormat":1},"757a6aac4d31a5757c5a03f78eedd5f302f7565457bc231f468f5c465ab572ea","0bb148d523d3fbdeb0cf6aa1075a26ef050594120460dfbc70c04b829dfd2e8b","8df0ace2ff83979f73f26180c68d3b22bbe41c6f10cbf035df14d61f641399ca","0b4698c388478f7b2cadd3d888ebf613ef4afbb9db9fffdf9f2374f93111e227","d87e20a36c2fe40b5da667e6583980f5f28d3b21075ad5a0bb126c062a785cf4","91b2a44dcf0911efe87623b9965d5cf90652a406f712c5b2a3467b8df3ca7e53","4073207340c11cbd40fdb6be67fd381e12e5c44ac708dbd48ecb216338769d31","bd11197a07d672ac0f472d7e74fafbbed2a5e3a7f2da70647e173234c101b52a"],"root":[[257,262],[265,272]],"options":{"composite":true,"esModuleInterop":true,"module":1,"skipLibCheck":true,"strict":true,"target":3},"referencedMap":[[262,1],[266,2],[265,3],[260,4],[258,5],[261,6],[259,5],[257,7],[270,8],[269,9],[271,10],[268,11],[267,12],[272,13],[217,14],[218,15],[162,16],[163,16],[164,17],[111,18],[165,19],[166,20],[167,21],[109,5],[168,22],[169,23],[170,24],[171,25],[172,26],[173,27],[174,27],[175,28],[176,29],[177,30],[178,31],[112,5],[110,5],[179,32],[180,33],[181,34],[215,35],[182,36],[183,5],[184,37],[185,38],[186,39],[187,40],[188,41],[189,42],[190,43],[191,44],[192,45],[193,45],[194,46],[195,5],[196,5],[197,47],[199,48],[198,49],[200,50],[201,51],[202,52],[203,53],[204,54],[205,55],[206,56],[207,57],[208,58],[209,59],[210,60],[211,61],[212,62],[113,5],[114,63],[115,5],[116,5],[158,64],[159,65],[160,5],[161,50],[213,66],[214,67],[264,5],[73,5],[81,5],[216,68],[263,5],[53,5],[87,5],[55,5],[83,69],[58,5],[54,70],[56,71],[59,72],[57,5],[90,5],[88,73],[93,5],[92,5],[84,5],[89,5],[91,74],[94,75],[78,5],[77,5],[82,76],[80,5],[79,5],[61,77],[62,78],[60,79],[63,80],[64,81],[65,82],[66,83],[67,84],[68,85],[69,86],[70,87],[71,88],[72,89],[76,5],[85,5],[75,90],[74,91],[86,5],[98,5],[95,5],[96,5],[104,92],[97,5],[99,93],[100,94],[101,5],[102,5],[103,5],[106,95],[105,5],[225,96],[108,97],[226,5],[107,98],[220,99],[219,5],[222,100],[223,101],[224,5],[221,5],[227,102],[239,103],[236,5],[238,104],[237,105],[240,106],[241,107],[242,108],[243,109],[235,110],[256,111],[233,112],[244,113],[245,114],[234,115],[246,5],[228,116],[231,117],[247,5],[248,5],[230,5],[229,5],[251,118],[249,118],[252,118],[253,119],[250,119],[255,120],[232,121],[254,122],[50,5],[51,5],[8,5],[9,5],[13,5],[12,5],[2,5],[14,5],[15,5],[16,5],[17,5],[18,5],[19,5],[20,5],[21,5],[3,5],[52,5],[22,5],[23,5],[4,5],[24,5],[28,5],[25,5],[26,5],[27,5],[29,5],[30,5],[31,5],[5,5],[32,5],[33,5],[34,5],[35,5],[6,5],[39,5],[36,5],[37,5],[38,5],[40,5],[7,5],[41,5],[46,5],[47,5],[42,5],[43,5],[44,5],[45,5],[1,5],[48,5],[49,5],[11,5],[10,5],[134,123],[146,124],[132,125],[147,94],[156,126],[123,127],[124,128],[122,129],[155,130],[150,131],[154,132],[126,133],[143,134],[125,135],[153,136],[120,137],[121,131],[127,138],[128,5],[133,139],[131,138],[118,140],[157,141],[148,142],[137,143],[136,138],[138,144],[141,145],[135,146],[139,147],[151,130],[129,148],[130,149],[142,150],[119,94],[145,151],[144,138],[140,152],[149,5],[117,5],[152,153]],"affectedFilesPendingEmit":[[262,17],[266,17],[265,17],[260,17],[258,17],[261,17],[259,17],[257,17],[270,17],[269,17],[271,17],[268,17],[267,17],[272,17]],"emitSignatures":[257,258,259,260,261,262,265,266,267,268,269,270,271,272],"version":"5.9.3"} \ No newline at end of file