Refactor (#18)

* Modified configuration files and added example of list of topics into general configuration

* Refactored main.star into different star files

* Deleted unnecesary files from previous module

* Moved and changed .star files

* Moved config files

* Added parser and small topology as file

* Updated README.md

* Modified imports to have them in a more clean structure.

* Removed unnecessary information in topology files

* Number of Test messages and delay between message added as variable

* Updated README.md
This commit is contained in:
Alberto Soutullo 2022-12-23 13:21:42 +01:00 committed by GitHub
parent 8c7ca9a827
commit fb3dc3c38f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
27 changed files with 493 additions and 1736 deletions

View File

@ -3,29 +3,65 @@ Wakurtosis
Starting version for Waku network simulations (https://github.com/waku-org/pm/issues/2)
Kurtosis: https://docs.kurtosis.com/
More info about Kurtosis: https://docs.kurtosis.com/
### How to use:
#### Before using this repository make sure that:
#### Before using this repository note that:
- **You are using Kurtosis version 0.62.0**. This is important, as they are working on it and changes can be huge depending on different versions. You can find all Kurtosis versions [here](https://github.com/kurtosis-tech/kurtosis-cli-release-artifacts/releases).
- The topology that will be instantiated is defined in `kurtosis-module/starlark/waku_test_topology.json`. This topology is created with https://github.com/logos-co/Waku-topology-test
- Each node will need its own configuration file in `kurtosis-module/starlark/config_files/waku_X.toml` being `waku_X` the same name that is defined in the topology.
- The topology files that will be used by default are defined in `config/network_topology/`. This topology is created with https://github.com/logos-co/Waku-topology-test
- Each node will need its own configuration file in `config/waku_config_files/waku_X.toml` being `waku_X` the same name that is defined in the topology.
- Only `kurtosis` and `docker` are needed to run this.
If you want to use the same configuration for every node, you can use:
#### How to run
`kurtosis run --enclave-id wakurtosis . '{"same_toml_configuration": true}'`
If you want to run it with default arguments, if you are in the root of this repository, you can simply run:
This will use the file `kurtosis-module/starlark/config_files/waku_general.toml` for every node.
`kurtosis run .`
In order to access to Prometheus or Graphana, run:
There are arguments that can be modified:
- _same_toml_configuration_: boolean. Default: **true**. If **true**, the some `.toml` file will be applied to every Waku node. If **false*, every node will use its own `.toml` file.
- _topology_file_: string. Default: **waku_test_topology_small.json**. If defines the network topology that will be created.
`kurtosis enclave inspect wakurtosis'`
Example modifying arguments:
`kurtosis run . '{"same_toml_configuration": false, "topology_file": "waku_test_topology_big.json"}'`
The enclaves that will be created have randon names, that can be checked with:
`kurtosis enclave ls`
You can set up a pre-defined enclave name, for example:
`kurtosis run --enclave-id wakurtosis .`
Note that, if you try to run the same kurtosis module again, you will have clashes. You can clean previous enclaves with:
`kurtosis clean -a`
#### What will happen
Kurtosis will automatically add one Waku node as container inside the enclave. The way that nodes are interconnected is given by the topology.
The configuration of each node is given by the configuration files. Services are being instantiated SEQUENTIALLY. After each node is set up,
there are 5 seconds (defined in `system_variables`) of waiting time for that node to be ready, and then the ID is requested and saved.
Once all nodes are ready, prometheus and grafana will be set up and connected to all waku nodes.
All nodes are then interconnected.
A predefined number of test messages with specific delay (defined in `system_variables`) are sent by every node to the same topic.
Peers from one node are requested, just for testing.
#### Check Prometheus+Grafana
In order to know how to access to Prometheus or Grafana, run:
`kurtosis enclave inspect <enclave-name>`
With this, you will be able to see the ports exposed to your local machine.
Note that if you decide to set the `--enclave-id`, you may need to run `kurtosis clean -a` before re-run the same enclave again, to not have problems with ports and volumes that are already mounter under that enclave.
This will not happen if `--enclave-id` is not used, but then if you want to inspect it, while the enclave is being created you should check the id with `kurtosis enclave ls`, since the enclave id will not be shown until the process is finished.
Please, any improvements/bugs that you see, create an issue, and we will work on it.
Please, any improvements/bugs that you see, create an issue, and we will work on it.

View File

@ -1,7 +1,5 @@
{
"waku_0": {
"ports_shift": 0,
"topics": "test",
"static_nodes": [
"waku_23",
"waku_39",
@ -10,8 +8,6 @@
]
},
"waku_1": {
"ports_shift": 1,
"topics": "test",
"static_nodes": [
"waku_9",
"waku_42",
@ -21,8 +17,6 @@
]
},
"waku_2": {
"ports_shift": 2,
"topics": "test",
"static_nodes": [
"waku_38",
"waku_4",
@ -34,8 +28,6 @@
]
},
"waku_3": {
"ports_shift": 3,
"topics": "test",
"static_nodes": [
"waku_2",
"waku_44",
@ -46,8 +38,6 @@
]
},
"waku_4": {
"ports_shift": 4,
"topics": "test",
"static_nodes": [
"waku_2",
"waku_33",
@ -60,16 +50,12 @@
]
},
"waku_5": {
"ports_shift": 5,
"topics": "test",
"static_nodes": [
"waku_47",
"waku_40"
]
},
"waku_6": {
"ports_shift": 6,
"topics": "test",
"static_nodes": [
"waku_13",
"waku_21",
@ -77,8 +63,6 @@
]
},
"waku_7": {
"ports_shift": 7,
"topics": "test",
"static_nodes": [
"waku_1",
"waku_18",
@ -87,15 +71,11 @@
]
},
"waku_8": {
"ports_shift": 8,
"topics": "test",
"static_nodes": [
"waku_37"
]
},
"waku_9": {
"ports_shift": 9,
"topics": "test",
"static_nodes": [
"waku_1",
"waku_27",
@ -104,8 +84,6 @@
]
},
"waku_10": {
"ports_shift": 10,
"topics": "test",
"static_nodes": [
"waku_32",
"waku_46",
@ -115,15 +93,11 @@
]
},
"waku_11": {
"ports_shift": 11,
"topics": "test",
"static_nodes": [
"waku_35"
]
},
"waku_12": {
"ports_shift": 12,
"topics": "test",
"static_nodes": [
"waku_4",
"waku_30",
@ -135,8 +109,6 @@
]
},
"waku_13": {
"ports_shift": 13,
"topics": "test",
"static_nodes": [
"waku_6",
"waku_22",
@ -144,8 +116,6 @@
]
},
"waku_14": {
"ports_shift": 14,
"topics": "test",
"static_nodes": [
"waku_39",
"waku_29",
@ -157,16 +127,12 @@
]
},
"waku_15": {
"ports_shift": 15,
"topics": "test",
"static_nodes": [
"waku_14",
"waku_26"
]
},
"waku_16": {
"ports_shift": 16,
"topics": "test",
"static_nodes": [
"waku_7",
"waku_10",
@ -176,15 +142,11 @@
]
},
"waku_17": {
"ports_shift": 17,
"topics": "test",
"static_nodes": [
"waku_22"
]
},
"waku_18": {
"ports_shift": 18,
"topics": "test",
"static_nodes": [
"waku_7",
"waku_35",
@ -194,8 +156,6 @@
]
},
"waku_19": {
"ports_shift": 19,
"topics": "test",
"static_nodes": [
"waku_2",
"waku_4",
@ -207,16 +167,12 @@
]
},
"waku_20": {
"ports_shift": 20,
"topics": "test",
"static_nodes": [
"waku_3",
"waku_23"
]
},
"waku_21": {
"ports_shift": 21,
"topics": "test",
"static_nodes": [
"waku_0",
"waku_3",
@ -228,8 +184,6 @@
]
},
"waku_22": {
"ports_shift": 22,
"topics": "test",
"static_nodes": [
"waku_12",
"waku_13",
@ -243,8 +197,6 @@
]
},
"waku_23": {
"ports_shift": 23,
"topics": "test",
"static_nodes": [
"waku_0",
"waku_2",
@ -255,8 +207,6 @@
]
},
"waku_24": {
"ports_shift": 24,
"topics": "test",
"static_nodes": [
"waku_33",
"waku_44",
@ -264,16 +214,12 @@
]
},
"waku_25": {
"ports_shift": 25,
"topics": "test",
"static_nodes": [
"waku_3",
"waku_48"
]
},
"waku_26": {
"ports_shift": 26,
"topics": "test",
"static_nodes": [
"waku_4",
"waku_12",
@ -285,8 +231,6 @@
]
},
"waku_27": {
"ports_shift": 27,
"topics": "test",
"static_nodes": [
"waku_9",
"waku_12",
@ -296,8 +240,6 @@
]
},
"waku_28": {
"ports_shift": 28,
"topics": "test",
"static_nodes": [
"waku_19",
"waku_29",
@ -306,8 +248,6 @@
]
},
"waku_29": {
"ports_shift": 29,
"topics": "test",
"static_nodes": [
"waku_1",
"waku_4",
@ -319,8 +259,6 @@
]
},
"waku_30": {
"ports_shift": 30,
"topics": "test",
"static_nodes": [
"waku_7",
"waku_12",
@ -331,24 +269,18 @@
]
},
"waku_31": {
"ports_shift": 31,
"topics": "test",
"static_nodes": [
"waku_46",
"waku_38"
]
},
"waku_32": {
"ports_shift": 32,
"topics": "test",
"static_nodes": [
"waku_10",
"waku_23"
]
},
"waku_33": {
"ports_shift": 33,
"topics": "test",
"static_nodes": [
"waku_4",
"waku_23",
@ -356,8 +288,6 @@
]
},
"waku_34": {
"ports_shift": 34,
"topics": "test",
"static_nodes": [
"waku_9",
"waku_22",
@ -366,16 +296,12 @@
]
},
"waku_35": {
"ports_shift": 35,
"topics": "test",
"static_nodes": [
"waku_11",
"waku_18"
]
},
"waku_36": {
"ports_shift": 36,
"topics": "test",
"static_nodes": [
"waku_12",
"waku_18",
@ -385,8 +311,6 @@
]
},
"waku_37": {
"ports_shift": 37,
"topics": "test",
"static_nodes": [
"waku_4",
"waku_8",
@ -395,8 +319,6 @@
]
},
"waku_38": {
"ports_shift": 38,
"topics": "test",
"static_nodes": [
"waku_2",
"waku_4",
@ -409,8 +331,6 @@
]
},
"waku_39": {
"ports_shift": 39,
"topics": "test",
"static_nodes": [
"waku_0",
"waku_14",
@ -420,8 +340,6 @@
]
},
"waku_40": {
"ports_shift": 40,
"topics": "test",
"static_nodes": [
"waku_2",
"waku_5",
@ -431,15 +349,11 @@
]
},
"waku_41": {
"ports_shift": 41,
"topics": "test",
"static_nodes": [
"waku_10"
]
},
"waku_42": {
"ports_shift": 42,
"topics": "test",
"static_nodes": [
"waku_1",
"waku_3",
@ -449,8 +363,6 @@
]
},
"waku_43": {
"ports_shift": 43,
"topics": "test",
"static_nodes": [
"waku_0",
"waku_14",
@ -459,8 +371,6 @@
]
},
"waku_44": {
"ports_shift": 44,
"topics": "test",
"static_nodes": [
"waku_3",
"waku_14",
@ -470,8 +380,6 @@
]
},
"waku_45": {
"ports_shift": 45,
"topics": "test",
"static_nodes": [
"waku_19",
"waku_28",
@ -480,8 +388,6 @@
]
},
"waku_46": {
"ports_shift": 46,
"topics": "test",
"static_nodes": [
"waku_1",
"waku_10",
@ -489,8 +395,6 @@
]
},
"waku_47": {
"ports_shift": 47,
"topics": "test",
"static_nodes": [
"waku_5",
"waku_30",
@ -498,8 +402,6 @@
]
},
"waku_48": {
"ports_shift": 48,
"topics": "test",
"static_nodes": [
"waku_14",
"waku_18",
@ -510,8 +412,6 @@
]
},
"waku_49": {
"ports_shift": 49,
"topics": "test",
"static_nodes": [
"waku_2",
"waku_34"

View File

@ -0,0 +1,18 @@
{
"waku_0": {
"static_nodes": [
"waku_1"
]
},
"waku_1": {
"static_nodes": [
"waku_0"
]
},
"waku_2": {
"static_nodes": [
"waku_0",
"waku_1"
]
}
}

View File

@ -0,0 +1,4 @@
topics="test"
rpc-admin=true
keep-alive=true
metrics-server=true

View File

@ -0,0 +1,4 @@
topics="test test2"
rpc-admin=true
keep-alive=true
metrics-server=true

View File

@ -1,44 +0,0 @@
# ============================ Base ============================
FROM alpine:3.15 AS base
# Unfortunately Alpine packages are updated in-place, and old versions are discarded so there's no way to use older versions and pin the NodeJS version
RUN apk add --no-cache nodejs-current
WORKDIR /build
COPY package.json .
COPY yarn.lock .
# ============================ Build ============================
FROM base AS build
RUN apk add --no-cache yarn
# Install production packages
RUN yarn install --frozen-lockfile --production=true
# Use node-prune to further reduce unnecessary files: https://github.com/tj/node-prune
RUN curl -sf https://gobinaries.com/tj/node-prune | sh
# Set aside these production dependencies for use later
RUN cp -R node_modules prod_node_modules
# Now install ALL node_modules, including 'devDependencies'
RUN yarn install --frozen-lockfile
COPY . .
# Run tests & compile
RUN yarn build
#
# ============================ Run ============================
FROM base AS run
WORKDIR /run
# copy production node_modules
COPY --from=build /build/prod_node_modules ./node_modules
# copy app sources
COPY --from=build /build/build ./build
CMD node build/main.js

View File

@ -1,80 +0,0 @@
import { EnclaveContext } from "kurtosis-sdk";
import { Result, ok, err } from "neverthrow";
import * as log from "loglevel";
import { ExecutableKurtosisModule } from "kurtosis-module-api-lib";
const TIPS_REPOSITORY: string[] = [
"Everything not saved will be lost.",
"Don't pet a burning dog.",
"Even a broken clock is right twice a day.",
"If no one comes from the future to stop you from doing it, then how bad of a decision can it really be?",
"Never fall in love with a tennis player. Love means nothing to them.",
"If you ever get caught sleeping on the job, slowly raise your head and say 'In Jesus' name, Amen'",
"Never trust in an electrician with no eyebrows",
"If you sleep until lunch time, you can save the breakfast money.",
];
// Parameters that the execute command accepts, serialized as JSON
interface ExecuteParams {
iWantATip: boolean;
}
// Result that the execute command returns, serialized as JSON
class ExecuteResult {
readonly tip: string
constructor(tip: string) {
this.tip = tip;
}
}
export class ExampleExecutableKurtosisModule implements ExecutableKurtosisModule {
constructor() {}
async execute(networkCtx: EnclaveContext, serializedParams: string): Promise<Result<string, Error>> {
log.info(`Received serialized execute params:\n${serializedParams}`);
let params: ExecuteParams;
try {
params = JSON.parse(serializedParams)
} catch (e: any) {
// Sadly, we have to do this because there's no great way to enforce the caught thing being an error
// See: https://stackoverflow.com/questions/30469261/checking-for-typeof-error-in-js
if (e && e.stack && e.message) {
return err(e as Error);
}
return err(new Error("Parsing params string '" + serializedParams + "' threw an exception, but " +
"it's not an Error so we can't report any more information than this"));
}
const resultObj: ExecuteResult = new ExecuteResult(
ExampleExecutableKurtosisModule.getRandomTip(params.iWantATip)
);
let stringResult;
try {
stringResult = JSON.stringify(resultObj);
} catch (e: any) {
// Sadly, we have to do this because there's no great way to enforce the caught thing being an error
// See: https://stackoverflow.com/questions/30469261/checking-for-typeof-error-in-js
if (e && e.stack && e.message) {
return err(e as Error);
}
return err(new Error("Serializing the Kurtosis module result threw an exception, but " +
"it's not an Error so we can't report any more information than this"));
}
log.info("Execution successful")
return ok(stringResult);
}
private static getRandomTip(shouldGiveAdvice: boolean): string {
let tip: string;
if (shouldGiveAdvice) {
// This gives a random number between [0, length)
tip = TIPS_REPOSITORY[Math.floor(Math.random() * TIPS_REPOSITORY.length)];
} else {
tip = "The module won't enlighten you today."
}
return tip
}
}

View File

@ -1,49 +0,0 @@
import { Result, err, ok } from 'neverthrow';
import * as log from 'loglevel';
import { ExampleExecutableKurtosisModule } from './example_executable_kurtosis_module';
import { ExecutableKurtosisModule, KurtosisModuleConfigurator } from 'kurtosis-module-api-lib';
const DEFAULT_LOG_LEVEL: string = "info";
// Parameters that the module accepts when loaded, serializeda as JSON
interface LoadModuleParams {
logLevel: string;
}
type LoglevelAcceptableLevelStrs = log.LogLevelDesc
export class ExampleExecutableKurtosisModuleConfigurator implements KurtosisModuleConfigurator {
public parseParamsAndCreateExecutableModule(serializedCustomParamsStr: string): Result<ExecutableKurtosisModule, Error> {
let args: LoadModuleParams;
try {
args = JSON.parse(serializedCustomParamsStr);
} catch (e: any) {
// Sadly, we have to do this because there's no great way to enforce the caught thing being an error
// See: https://stackoverflow.com/questions/30469261/checking-for-typeof-error-in-js
if (e && e.stack && e.message) {
return err(e as Error);
}
return err(new Error("Parsing params string '" + serializedCustomParamsStr + "' threw an exception, but " +
"it's not an Error so we can't report any more information than this"));
}
const setLogLevelResult: Result<null, Error> = ExampleExecutableKurtosisModuleConfigurator.setLogLevel(args.logLevel)
if (setLogLevelResult.isErr()) {
console.log("Error in setting the log level")
return err(setLogLevelResult.error);
}
const module: ExampleExecutableKurtosisModule = new ExampleExecutableKurtosisModule();
return ok(module);
}
private static setLogLevel(logLevelStr: string): Result<null, Error> {
let logLevelDescStr: string = logLevelStr;
if (logLevelStr === null || logLevelStr === undefined || logLevelStr === "") {
logLevelDescStr = DEFAULT_LOG_LEVEL;
}
const logLevelDesc: log.LogLevelDesc = logLevelDescStr as log.LogLevelDesc
log.setLevel(logLevelDesc);
return ok(null);
}
}

View File

@ -1,25 +0,0 @@
import { ExampleExecutableKurtosisModuleConfigurator } from "./impl/example_executable_kurtosis_module_configurator";
import * as log from "loglevel";
import { KurtosisModuleConfigurator, KurtosisModuleExecutor } from "kurtosis-module-api-lib";
const SUCCESS_EXIT_CODE: number = 0;
const FAILURE_EXIT_CODE: number = 1;
// >>>>>>>>>>>>>>>>>>> REPLACE WITH YOUR OWN CONFIGURATOR <<<<<<<<<<<<<<<<<<<<<<<<
const configurator: KurtosisModuleConfigurator = new ExampleExecutableKurtosisModuleConfigurator();
// >>>>>>>>>>>>>>>>>>> REPLACE WITH YOUR OWN CONFIGURATOR <<<<<<<<<<<<<<<<<<<<<<<<
const executor: KurtosisModuleExecutor = new KurtosisModuleExecutor(configurator)
executor.run().then(runModuleResult => {
let exitCode: number = SUCCESS_EXIT_CODE;
if (runModuleResult.isErr()) {
console.log("A non-exception error occurred running the Kurtosis module executor:");
console.log(runModuleResult.error);
exitCode = FAILURE_EXIT_CODE;
}
process.exit(exitCode);
}).catch(reason => {
console.log("An uncaught exception occurred running the Kurtosis module executor:");
console.log(reason);
process.exit(FAILURE_EXIT_CODE);
});

View File

@ -1,3 +0,0 @@
topics="test"
rpc-admin=true
keep-alive=true

View File

@ -1,3 +0,0 @@
topics="test"
rpc-admin=true
keep-alive=true

View File

@ -1 +0,0 @@
// TODO add tests here

379
main.star
View File

@ -1,372 +1,31 @@
# Waku Configuration
WAKU_IMAGE = "statusteam/nim-waku:deploy-status-prod"
WAKU_RPC_PORT_ID = "rpc"
WAKU_TCP_PORT = 8545
WAKU_LIBP2P_PORT_ID = "libp2p"
WAKU_LIBP2P_PORT = 60000
WAKU_SETUP_WAIT_TIME = "5"
# Prometheus Configuration
PROMETHEUS_IMAGE = "prom/prometheus:latest"
PROMETHEUS_PORT_ID = "prometheus"
PROMETHEUS_TCP_PORT = 8008
PROMETHEUS_CONFIGURATION_PATH = "github.com/logos-co/wakurtosis/prometheus.yml"
# Grafana Configuration
GRAFANA_IMAGE = "grafana/grafana:latest"
GRAFANA_CONFIGURATION_PATH = "github.com/logos-co/wakurtosis/monitoring/configuration/config/"
GRAFANA_CUSTOMIZATION_PATH = "github.com/logos-co/wakurtosis/monitoring/configuration/customizations/"
GRAFANA_DASHBOARD_PATH = "github.com/logos-co/wakurtosis/monitoring/configuration/dashboards/"
GRAFANA_PORT_ID = "grafana"
GRAFANA_TCP_PORT = 3000
# Waku RPC methods
POST_RELAY_MESSAGE = "post_waku_v2_relay_v1_message"
GET_WAKU_INFO_METHOD = "get_waku_v2_debug_v1_info"
CONNECT_TO_PEER_METHOD = "post_waku_v2_admin_v1_peers"
GET_PEERS_METHOD = "get_waku_v2_admin_v1_peers"
GENERAL_TOML_CONFIGURATION_PATH = "github.com/logos-co/wakurtosis/kurtosis-module/starlark/config_files/waku_general.toml"
GENERAL_TOML_CONFIGURATION_NAME = "waku_general.toml"
def create_waku_id(other_node_info):
ip = other_node_info["service"].ip_address
port = other_node_info["service"].ports[WAKU_LIBP2P_PORT_ID].number
node_id = other_node_info["id"]
return '"/ip4/' + str(ip) + '/tcp/' + str(port) + '/p2p/' + node_id + '"'
def merge_peer_ids(peer_ids):
return "[" + ",".join(peer_ids) + "]"
def connect_wakunode_to_peers(service_id, port_id, peer_ids):
method = CONNECT_TO_PEER_METHOD
params = merge_peer_ids(peer_ids)
print(params)
response = send_json_rpc(service_id, port_id, method, params)
print(response)
def send_waku_message(service_id, topic):
topic = topic
waku_message = '{"payload": "0x1a2b3c4d5e6f", "timestamp": 1626813243}'
params = '"' + topic + '"' + ", " + waku_message
response = send_json_rpc(service_id, WAKU_RPC_PORT_ID, POST_RELAY_MESSAGE, params)
print(response)
def send_json_rpc(service_id, port_id, method, params, extract={}):
recipe = struct(
service_id=service_id,
port_id=port_id,
endpoint="",
method="POST",
content_type="application/json",
body='{ "jsonrpc": "2.0", "method": "' + method + '", "params": [' + params + '], "id": 1}',
extract=extract
)
response = request(recipe=recipe)
return response
def get_wakunode_id(service_id, port_id):
extract = {"waku_id": '.result.listenAddresses | .[0] | split("/") | .[-1]'}
response = send_json_rpc(service_id, port_id, GET_WAKU_INFO_METHOD, "", extract)
print(response)
return response["extract.waku_id"]
def get_toml_configuration_artifact(wakunode_name, same_toml_configuration):
if same_toml_configuration:
artifact_id = upload_files(
src=GENERAL_TOML_CONFIGURATION_PATH
)
file_name = GENERAL_TOML_CONFIGURATION_NAME
else:
artifact_id = upload_files(
src="github.com/logos-co/wakurtosis/kurtosis-module/starlark/config_files/" + wakunode_name + ".toml"
)
file_name = wakunode_name + ".toml"
return artifact_id, file_name
def instantiate_waku_nodes(waku_topology, same_toml_configuration):
services = {}
# Get up all waku nodes
for wakunode_name in waku_topology.keys():
CONFIG_LOCATION = "/tmp" # todo maybe not good idea to use /tmp
artifact_id, configuration_file = get_toml_configuration_artifact(wakunode_name, same_toml_configuration)
print("configuration file is " + configuration_file)
waku_service = add_service(
service_id=wakunode_name,
config=struct(
image=WAKU_IMAGE,
ports={
WAKU_RPC_PORT_ID: PortSpec(number=WAKU_TCP_PORT, transport_protocol="TCP"),
PROMETHEUS_PORT_ID: PortSpec(number=PROMETHEUS_TCP_PORT, transport_protocol="TCP"),
WAKU_LIBP2P_PORT_ID: PortSpec(number=WAKU_LIBP2P_PORT,
transport_protocol="TCP"),
},
files={
CONFIG_LOCATION: artifact_id
},
entrypoint=[
"/usr/bin/wakunode", "--rpc-address=0.0.0.0",
"--metrics-server-address=0.0.0.0"
],
cmd=[
"--topics=" + waku_topology[wakunode_name]["topics"],
"--metrics-server=True",
"--config-file=" + CONFIG_LOCATION + "/" + configuration_file
]
)
)
waku_info = {}
exec_recipe = struct(
service_id=wakunode_name,
command=["sleep", WAKU_SETUP_WAIT_TIME]
)
exec(exec_recipe)
id = get_wakunode_id(wakunode_name, WAKU_RPC_PORT_ID)
waku_info["id"] = id
waku_info["service"] = waku_service
services[wakunode_name] = waku_info
return services
def ask_connected_nodes(topology):
for wakunode_name in topology.keys():
response = send_json_rpc(wakunode_name, WAKU_RPC_PORT_ID, GET_PEERS_METHOD, "")
# result = extract(response.body, '.result.listenAddresses | .[0] | split("/") | .[-1]')
print(response)
def interconnect_waku_nodes(topology_information, services):
# Interconnect them
for wakunode_name in topology_information.keys():
peers = topology_information[wakunode_name]["static_nodes"]
peer_ids = []
for peer in peers:
# Get all Ids
peer_id = create_waku_id(services[peer])
peer_ids.append(peer_id)
connect_wakunode_to_peers(wakunode_name, WAKU_RPC_PORT_ID, peer_ids)
def send_test_messages(topology_information):
for wakunode_name in topology_information.keys():
# send message in topic
for i in range(50):
exec_recipe = struct(
service_id=wakunode_name,
command=["sleep", "0.5"]
)
exec(exec_recipe)
send_waku_message(wakunode_name, "test")
def generate_template_data(services):
template_data = {}
node_data = []
for wakunode_name in services.keys():
node_data.append(
'"' + services[wakunode_name]["service"].ip_address + ":" + str(services[wakunode_name]["service"].ports[
PROMETHEUS_PORT_ID].number) + '"')
data_as_string = ",".join(node_data)
test = "[" + data_as_string + "]"
template_data["targets"] = test
return template_data
def create_prometheus_targets(services):
# get ip and ports of all nodes
template_data = generate_template_data(services)
# template
template = """
[
{
"labels": {
"job":
"wakurtosis"
},
"targets" : {{.targets}}
}
]
"""
artifact_id = render_templates(
config={
"targets.json": struct(
template=template,
data=template_data,
)
}
)
return artifact_id
def set_up_prometheus(services):
# Create targets.json
targets_artifact_id = create_prometheus_targets(services)
# Set up prometheus
CONFIG_LOCATION = "/test"
CONFIG_LOCATION2 = "/tmp"
artifact_id = upload_files(
src=PROMETHEUS_CONFIGURATION_PATH
)
prometheus_service = add_service(
service_id="prometheus",
config=struct(
image=PROMETHEUS_IMAGE,
ports={
PROMETHEUS_PORT_ID: PortSpec(number=9090, transport_protocol="TCP")
},
files={
CONFIG_LOCATION: artifact_id,
CONFIG_LOCATION2: targets_artifact_id
},
cmd=[
"--config.file=" + CONFIG_LOCATION + "/prometheus.yml"
]
)
)
return prometheus_service
def set_up_graphana(prometheus_service):
# Set up grafana
CONFIGURATION_GRAFANA = "/etc/grafana/"
DASHBOARDS_GRAFANA = "/var/lib/grafana/dashboards/"
CUSTOMIZATION_GRAFANA = "/usr/share/grafana/"
config_id = upload_files(
src=GRAFANA_CONFIGURATION_PATH
)
customization_id = upload_files(
src=GRAFANA_CUSTOMIZATION_PATH
)
dashboard_id = upload_files(
src=GRAFANA_DASHBOARD_PATH
)
prometheus_url = prometheus_service.ip_address + ":" + str(prometheus_service.ports[PROMETHEUS_PORT_ID].number)
prometheus_info = {"prometheus_url": prometheus_url}
# template
template = """
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
org_id: 1
url: http://{{.prometheus_url}}
is_default: true
version: 1
editable: true
"""
artifact_id = render_templates(
config={
"datasources.yaml": struct(
template=template,
data=prometheus_info,
)
}
)
grafana_service = add_service(
service_id="grafana",
config=struct(
image=GRAFANA_IMAGE,
ports={
GRAFANA_PORT_ID: PortSpec(number=GRAFANA_TCP_PORT, transport_protocol="TCP")
},
files={
CONFIGURATION_GRAFANA: config_id,
# customization_id: CUSTOMIZATION_GRAFANA,
DASHBOARDS_GRAFANA: dashboard_id,
"/etc/grafana/provisioning/datasources/": artifact_id
}
)
)
return grafana_service
# System Imports
system_variables = import_module("github.com/logos-co/wakurtosis/src/system_variables.star")
# Module Imports
waku = import_module(system_variables.WAKU_MODULE)
prometheus = import_module(system_variables.PROMETHEUS_MODULE)
grafana = import_module(system_variables.GRAFANA_MODULE)
parser = import_module(system_variables.ARGUMENT_PARSER_MODULE)
def run(args):
waku_topology = read_file(src="github.com/logos-co/wakurtosis/kurtosis-module/starlark/waku_test_topology.json")
args = parser.apply_default_to_input_args(args)
same_toml_configuration = args.same_toml_configuration
waku_topology = read_file(src=system_variables.TOPOLOGIES_LOCATION + args.topology_file)
waku_topology = json.decode(waku_topology)
# decoded = {
# "waku_0": {
# "ports_shift": 0,
# "topics": "test",
# "static_nodes": [
# "waku_1",
# ]
# },
# "waku_1": {
# "ports_shift": 1,
# "topics": "test",
# "static_nodes": [
# "waku_0"
# ]
# },
# "waku_2": {
# "ports_shift": 1,
# "topics": "test",
# "static_nodes": [
# "waku_0",
# "waku_1"
# ]
# }
# }
services = instantiate_waku_nodes(waku_topology, same_toml_configuration)
# Set up nodes
services = waku.instantiate_waku_nodes(waku_topology, same_toml_configuration)
# Set up prometheus + graphana
prometheus_service = set_up_prometheus(services)
set_up_graphana(prometheus_service)
prometheus_service = prometheus.set_up_prometheus(services)
grafana_service = grafana.set_up_graphana(prometheus_service)
interconnect_waku_nodes(waku_topology, services)
waku.interconnect_waku_nodes(waku_topology, services)
send_test_messages(waku_topology)
ask_connected_nodes(waku_topology)
waku.send_test_messages(waku_topology, system_variables.NUMBER_TEST_MESSAGES,
system_variables.DELAY_BETWEEN_TEST_MESSAGE)
waku.get_waku_peers(waku_topology.keys()[1])

View File

@ -1,13 +0,0 @@
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
- job_name: 'warkurtosis'
scrape_interval: 1s
file_sd_configs:
- files:
- '/tmp/targets.json'

View File

@ -1,21 +0,0 @@
{
"scripts": {
"build": "ts-mocha -p tsconfig.json 'kurtosis-module/test/**/*.ts' && tsc"
},
"files": [
"build"
],
"dependencies": {
"kurtosis-module-api-lib": "0.23.0",
"kurtosis-sdk": "0.49.6",
"loglevel": "^1.7.1"
},
"devDependencies": {
"@types/chai": "^4.2.21",
"@types/mocha": "^9.0.0",
"chai": "^4.3.4",
"mocha": "^9.1.0",
"ts-mocha": "^9.0.2",
"typescript": "^4.3.5"
}
}

View File

@ -1,28 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail # Bash "strict mode"
script_dirpath="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
root_dirpath="$(dirname "${script_dirpath}")"
# ==================================================================================================
# Constants
# ==================================================================================================
IMAGE_NAME="kurtosis_module_test"
MODULE_DIRNAME="kurtosis-module"
# =============================================================================
# Main Code
# =============================================================================
# Checks if dockerignore file is in the root path
if ! [ -f "${root_dirpath}"/.dockerignore ]; then
echo "Error: No .dockerignore file found in language root '${root_dirpath}'; this is required so Docker caching is enabled and your Kurtosis module builds remain quick" >&2
exit 1
fi
# Build Docker image
dockerfile_filepath="${root_dirpath}/${MODULE_DIRNAME}/Dockerfile"
echo "Building Kurtosis module into a Docker image named '${IMAGE_NAME}'..."
if ! docker build -t "${IMAGE_NAME}" -f "${dockerfile_filepath}" "${root_dirpath}"; then
echo "Error: Docker build of the Kurtosis module failed" >&2
exit 1
fi
echo "Successfully built Docker image '${IMAGE_NAME}' containing the Kurtosis module"

15
src/arguments_parser.star Normal file
View File

@ -0,0 +1,15 @@
# System Imports
system_variables = import_module("github.com/logos-co/wakurtosis/src/system_variables.star")
def apply_default_to_input_args(input_args):
same_config = system_variables.SAME_TOML_CONFIGURATION
topology_file = system_variables.DEFAULT_TOPOLOGY_FILE
if hasattr(input_args, system_variables.SAME_TOML_CONFIGURATION_NAME):
same_config = input_args.same_toml_configuration
if hasattr(input_args, system_variables.TOPOLOGY_FILE_NAME):
topology_file = input_args.topology
return struct(same_toml_configuration=same_config, topology_file=topology_file)

34
src/file_helpers.star Normal file
View File

@ -0,0 +1,34 @@
# System Imports
system_variables = import_module("github.com/logos-co/wakurtosis/src/system_variables.star")
def get_toml_configuration_artifact(wakunode_name, same_toml_configuration):
if same_toml_configuration:
artifact_id = upload_files(
src=system_variables.GENERAL_TOML_CONFIGURATION_PATH
)
file_name = system_variables.GENERAL_TOML_CONFIGURATION_NAME
else:
artifact_id = upload_files(
src="github.com/logos-co/wakurtosis/config/waku_config_files/" + wakunode_name + ".toml"
)
file_name = wakunode_name + ".toml"
return artifact_id, file_name
def generate_template_data(services):
template_data = {}
node_data = []
for wakunode_name in services.keys():
node_data.append(
'"' + services[wakunode_name]["service_info"].ip_address + ":" + str(
services[wakunode_name]["service_info"].ports[
system_variables.PROMETHEUS_PORT_ID].number) + '"')
data_as_string = ",".join(node_data)
test = "[" + data_as_string + "]"
template_data["targets"] = test
return template_data

65
src/grafana.star Normal file
View File

@ -0,0 +1,65 @@
# System Imports
system_variables = import_module("github.com/logos-co/wakurtosis/src/system_variables.star")
def set_up_graphana(prometheus_service):
# Set up grafana
CONFIGURATION_GRAFANA = "/etc/grafana/"
DASHBOARDS_GRAFANA = "/var/lib/grafana/dashboards/"
CUSTOMIZATION_GRAFANA = "/usr/share/grafana/"
config_id = upload_files(
src=system_variables.GRAFANA_CONFIGURATION_PATH
)
customization_id = upload_files(
src=system_variables.GRAFANA_CUSTOMIZATION_PATH
)
dashboard_id = upload_files(
src=system_variables.GRAFANA_DASHBOARD_PATH
)
prometheus_url = prometheus_service.ip_address + ":" + str(
prometheus_service.ports[system_variables.PROMETHEUS_PORT_ID].number)
prometheus_info = {"prometheus_url": prometheus_url}
# template
template = """
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
org_id: 1
url: http://{{.prometheus_url}}
is_default: true
version: 1
editable: true
"""
artifact_id = render_templates(
config={
"datasources.yaml": struct(
template=template,
data=prometheus_info,
)
}
)
grafana_service = add_service(
service_id="grafana",
config=struct(
image=system_variables.GRAFANA_IMAGE,
ports={
system_variables.GRAFANA_PORT_ID: PortSpec(number=system_variables.GRAFANA_TCP_PORT,
transport_protocol="TCP")
},
files={
CONFIGURATION_GRAFANA: config_id,
# customization_id: CUSTOMIZATION_GRAFANA,
DASHBOARDS_GRAFANA: dashboard_id,
"/etc/grafana/provisioning/datasources/": artifact_id
}
)
)
return grafana_service

65
src/prometheus.star Normal file
View File

@ -0,0 +1,65 @@
# System Imports
system_variables = import_module("github.com/logos-co/wakurtosis/src/system_variables.star")
# Module Imports
files = import_module(system_variables.FILE_HELPERS_MODULE)
def set_up_prometheus(services):
# Create targets.json
targets_artifact_id = create_prometheus_targets(services)
# Set up prometheus
CONFIG_LOCATION = "/test"
CONFIG_LOCATION2 = "/tmp"
artifact_id = upload_files(
src=system_variables.PROMETHEUS_CONFIGURATION_PATH
)
prometheus_service = add_service(
service_id="prometheus",
config=struct(
image=system_variables.PROMETHEUS_IMAGE,
ports={
system_variables.PROMETHEUS_PORT_ID: PortSpec(number=9090, transport_protocol="TCP")
},
files={
CONFIG_LOCATION: artifact_id,
CONFIG_LOCATION2: targets_artifact_id
},
cmd=[
"--config.file=" + CONFIG_LOCATION + "/prometheus.yml"
]
)
)
return prometheus_service
def create_prometheus_targets(services):
# get ip and ports of all nodes
template_data = files.generate_template_data(services)
# template
template = """
[
{
"labels": {
"job":
"wakurtosis"
},
"targets" : {{.targets}}
}
]
"""
artifact_id = render_templates(
config={
"targets.json": struct(
template=template,
data=template_data,
)
}
)
return artifact_id

52
src/system_variables.star Normal file
View File

@ -0,0 +1,52 @@
# Waku Configuration
WAKU_IMAGE = "statusteam/nim-waku:019f357d"
WAKU_RPC_PORT_ID = "rpc"
WAKU_TCP_PORT = 8545
WAKU_LIBP2P_PORT_ID = "libp2p"
WAKU_LIBP2P_PORT = 60000
WAKU_SETUP_WAIT_TIME = "5"
WAKU_CONFIG_FILE_LOCATION = "/waku/configuration_file"
WAKU_ENTRYPOINT = ["/usr/bin/wakunode", "--rpc-address=0.0.0.0", "--metrics-server-address=0.0.0.0"]
# Prometheus Configuration
PROMETHEUS_IMAGE = "prom/prometheus:latest"
PROMETHEUS_PORT_ID = "prometheus"
PROMETHEUS_TCP_PORT = 8008
PROMETHEUS_CONFIGURATION_PATH = "github.com/logos-co/wakurtosis/monitoring/prometheus.yml"
# Grafana Configuration
GRAFANA_IMAGE = "grafana/grafana:latest"
GRAFANA_CONFIGURATION_PATH = "github.com/logos-co/wakurtosis/monitoring/configuration/config/"
GRAFANA_CUSTOMIZATION_PATH = "github.com/logos-co/wakurtosis/monitoring/configuration/customizations/"
GRAFANA_DASHBOARD_PATH = "github.com/logos-co/wakurtosis/monitoring/configuration/dashboards/"
GRAFANA_PORT_ID = "grafana"
GRAFANA_TCP_PORT = 3000
# Waku RPC methods
POST_RELAY_MESSAGE = "post_waku_v2_relay_v1_message"
GET_WAKU_INFO_METHOD = "get_waku_v2_debug_v1_info"
CONNECT_TO_PEER_METHOD = "post_waku_v2_admin_v1_peers"
GET_PEERS_METHOD = "get_waku_v2_admin_v1_peers"
GENERAL_TOML_CONFIGURATION_PATH = "github.com/logos-co/wakurtosis/config/waku_config_files/waku_general.toml"
GENERAL_TOML_CONFIGURATION_NAME = "waku_general.toml"
# Import locations
WAKU_MODULE = "github.com/logos-co/wakurtosis/src/waku_methods.star"
PROMETHEUS_MODULE = "github.com/logos-co/wakurtosis/src/prometheus.star"
GRAFANA_MODULE = "github.com/logos-co/wakurtosis/src/grafana.star"
ARGUMENT_PARSER_MODULE = "github.com/logos-co/wakurtosis/src/arguments_parser.star"
FILE_HELPERS_MODULE = "github.com/logos-co/wakurtosis/src/file_helpers.star"
# Default main starlark arguments
SAME_TOML_CONFIGURATION_NAME = "same_toml_configuration"
SAME_TOML_CONFIGURATION = True
TOPOLOGY_FILE_NAME = "topology"
TOPOLOGIES_LOCATION = "github.com/logos-co/wakurtosis/config/network_topology/"
DEFAULT_TOPOLOGY_FILE = "waku_test_topology_small.json"
NUMBER_TEST_MESSAGES = 50
DELAY_BETWEEN_TEST_MESSAGE = "0.5"

168
src/waku_methods.star Normal file
View File

@ -0,0 +1,168 @@
# System Imports
system_variables = import_module("github.com/logos-co/wakurtosis/src/system_variables.star")
# Module Imports
files = import_module(system_variables.FILE_HELPERS_MODULE)
def send_waku_json_rpc(service_id, port_id, method, params, extract={}):
recipe = struct(
service_id=service_id,
port_id=port_id,
endpoint="",
method="POST",
content_type="application/json",
body='{ "jsonrpc": "2.0", "method": "' + method + '", "params": [' + params + '], "id": 1}',
extract=extract
)
response = request(recipe=recipe)
return response
def create_waku_id(waku_service_information):
waku_service = waku_service_information["service_info"]
ip = waku_service.ip_address
port = waku_service.ports[system_variables.WAKU_LIBP2P_PORT_ID].number
waku_node_id = waku_service_information["id"]
return '"/ip4/' + str(ip) + '/tcp/' + str(port) + '/p2p/' + waku_node_id + '"'
def _merge_peer_ids(peer_ids):
return "[" + ",".join(peer_ids) + "]"
def connect_wakunode_to_peers(service_id, port_id, peer_ids):
method = system_variables.CONNECT_TO_PEER_METHOD
params = _merge_peer_ids(peer_ids)
response = send_waku_json_rpc(service_id, port_id, method, params)
print(response)
def post_waku_v2_relay_v1_message(service_id, topic):
waku_message = '{"payload": "0x1a2b3c4d5e6f", "timestamp": 1626813243}'
params = '"' + topic + '"' + ", " + waku_message
response = send_waku_json_rpc(service_id, system_variables.WAKU_RPC_PORT_ID, system_variables.POST_RELAY_MESSAGE, params)
print(response)
def get_wakunode_id(service_id, port_id):
extract = {"waku_id": '.result.listenAddresses | .[0] | split("/") | .[-1]'}
response = send_waku_json_rpc(service_id, port_id, system_variables.GET_WAKU_INFO_METHOD, "", extract)
return response["extract.waku_id"]
def add_waku_service(wakunode_name, use_general_configuration):
artifact_id, configuration_file = files.get_toml_configuration_artifact(wakunode_name, use_general_configuration)
print("Configuration being used file is " + configuration_file)
waku_service = add_service(
service_id=wakunode_name,
config=struct(
image=system_variables.WAKU_IMAGE,
ports={
system_variables.WAKU_RPC_PORT_ID: PortSpec(number=system_variables.WAKU_TCP_PORT,
transport_protocol="TCP"),
system_variables.PROMETHEUS_PORT_ID: PortSpec(number=system_variables.PROMETHEUS_TCP_PORT,
transport_protocol="TCP"),
system_variables.WAKU_LIBP2P_PORT_ID: PortSpec(number=system_variables.WAKU_LIBP2P_PORT,
transport_protocol="TCP"),
},
files={
system_variables.WAKU_CONFIG_FILE_LOCATION: artifact_id
},
entrypoint=system_variables.WAKU_ENTRYPOINT,
cmd=[
"--config-file=" + system_variables.WAKU_CONFIG_FILE_LOCATION + "/" + configuration_file
]
)
)
return waku_service
def make_service_wait(service_id, time):
exec_recipe = struct(
service_id=service_id,
command=["sleep", time]
)
exec(exec_recipe)
def add_waku_service_information(services, waku_service_id, waku_service):
"""
As we will need to access for the service information later, the structure is the following:
services = {
"waku_0": {
"id" : id of the node, as string,
"service_info": Kurtosis service struct, that has
"ip": ip of the node,
"ports": Kurtosis PortSpec, that you can access with their respective identifier
},
"waku_1": {...}
}
Example:
node_id = services["waku_0"]["id"]
node_ip = services["waku_0"]["service_info"].ip_address
rpc_node_number = services["waku_0"]["service_info"].ports["your_rpc_identifier"].number
rpc_node_protocol = services["waku_0"]["service_info"].ports["your_rpc_identifier"].protocol
"""
waku_info = {}
waku_node_id = get_wakunode_id(waku_service_id, system_variables.WAKU_RPC_PORT_ID)
waku_info["id"] = waku_node_id
waku_info["service_info"] = waku_service
services[waku_service_id] = waku_info
def instantiate_waku_nodes(network_topology, use_general_configuration):
waku_services_information = {}
# Get up all waku nodes
for waku_service_id in network_topology.keys():
waku_service = add_waku_service(waku_service_id, use_general_configuration)
make_service_wait(waku_service_id, system_variables.WAKU_SETUP_WAIT_TIME)
add_waku_service_information(waku_services_information, waku_service_id, waku_service)
return waku_services_information
def get_waku_peers(waku_service_id):
response = send_waku_json_rpc(waku_service_id, system_variables.WAKU_RPC_PORT_ID,
system_variables.GET_PEERS_METHOD, "")
print(response)
return response
def send_test_messages(topology_information, number_of_messages, time_between_message):
for wakunode_name in topology_information.keys():
for i in range(number_of_messages):
make_service_wait(wakunode_name, time_between_message) # todo check if this stops wakunode
post_waku_v2_relay_v1_message(wakunode_name, "test")
def interconnect_waku_nodes(topology_information, services):
# Interconnect them
for waku_service_id in topology_information.keys():
peers = topology_information[waku_service_id]["static_nodes"]
peer_ids = [create_waku_id(services[peer]) for peer in peers]
connect_wakunode_to_peers(waku_service_id, system_variables.WAKU_RPC_PORT_ID, peer_ids)

View File

@ -1,11 +0,0 @@
{
"compilerOptions": {
"module": "commonjs",
"outDir": "build",
"downlevelIteration": true,
"strict": true
},
"include": [
"kurtosis-module/**/*"
]
}

985
yarn.lock
View File

@ -1,985 +0,0 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@grpc/grpc-js@^1.4.4":
version "1.4.4"
resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.4.4.tgz#59336f13d77bc446bbdf2161564a32639288dc5b"
integrity sha512-a6222b7Dl6fIlMgzVl7e+NiRoLiZFbpcwvBH2Oli56Bn7W4/3Ld+86hK4ffPn5rx2DlDidmIcvIJiOQXyhv9gA==
dependencies:
"@grpc/proto-loader" "^0.6.4"
"@types/node" ">=12.12.47"
"@grpc/proto-loader@^0.6.4":
version "0.6.7"
resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.6.7.tgz#e62a202f4cf5897bdd0e244dec1dbc80d84bdfa1"
integrity sha512-QzTPIyJxU0u+r2qGe8VMl3j/W2ryhEvBv7hc42OjYfthSj370fUrb7na65rG6w3YLZS/fb8p89iTBobfWGDgdw==
dependencies:
"@types/long" "^4.0.1"
lodash.camelcase "^4.3.0"
long "^4.0.0"
protobufjs "^6.10.0"
yargs "^16.1.1"
"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf"
integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78=
"@protobufjs/base64@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735"
integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==
"@protobufjs/codegen@^2.0.4":
version "2.0.4"
resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb"
integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==
"@protobufjs/eventemitter@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70"
integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A=
"@protobufjs/fetch@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45"
integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=
dependencies:
"@protobufjs/aspromise" "^1.1.1"
"@protobufjs/inquire" "^1.1.0"
"@protobufjs/float@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1"
integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=
"@protobufjs/inquire@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089"
integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=
"@protobufjs/path@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d"
integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=
"@protobufjs/pool@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54"
integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=
"@protobufjs/utf8@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=
"@types/chai@^4.2.21":
version "4.2.21"
resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.21.tgz#9f35a5643129df132cf3b5c1ec64046ea1af0650"
integrity "sha1-nzWlZDEp3xMs87XB7GQEbqGvBlA= sha512-yd+9qKmJxm496BOV9CMNaey8TWsikaZOwMRwPHQIjcOJM9oV+fi9ZMNw3JsVnbEEbo2gRTDnGEBv8pjyn67hNg=="
"@types/google-protobuf@^3.15.5":
version "3.15.5"
resolved "https://registry.yarnpkg.com/@types/google-protobuf/-/google-protobuf-3.15.5.tgz#644b2be0f5613b1f822c70c73c6b0e0b5b5fa2ad"
integrity "sha1-ZEsr4PVhOx+CLHDHPGsOC1tfoq0= sha512-6bgv24B+A2bo9AfzReeg5StdiijKzwwnRflA8RLd1V4Yv995LeTmo0z69/MPbBDFSiZWdZHQygLo/ccXhMEDgw=="
"@types/json5@^0.0.29":
version "0.0.29"
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
integrity "sha1-7ihweulOEdK4J7y+UnC86n8+ce4= sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="
"@types/long@^4.0.1":
version "4.0.1"
resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9"
integrity "sha1-RZxl+hhn2v5qjzIsTFFpVmPMVek= sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w=="
"@types/mocha@^9.0.0":
version "9.0.0"
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.0.0.tgz#3205bcd15ada9bc681ac20bef64e9e6df88fd297"
integrity "sha1-MgW80Vram8aBrCC+9k6ebfiP0pc= sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA=="
"@types/node@>=12.12.47", "@types/node@>=13.7.0":
version "16.11.11"
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.11.tgz#6ea7342dfb379ea1210835bada87b3c512120234"
integrity sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==
"@types/path-browserify@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@types/path-browserify/-/path-browserify-1.0.0.tgz#294ec6e88b6b0d340a3897b7120e5b393f16690e"
integrity sha512-XMCcyhSvxcch8b7rZAtFAaierBYdeHXVvg2iYnxOV0MCQHmPuRRmGZPFDRzPayxcGiiSL1Te9UIO+f3cuj0tfw==
"@types/semver@^7.3.9":
version "7.3.12"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.12.tgz#920447fdd78d76b19de0438b7f60df3c4a80bf1c"
integrity sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==
"@ungap/promise-all-settled@1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44"
integrity "sha1-qlgEJxHW4ydd033Fl+XTHowpCkQ= sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q=="
ansi-colors@4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
integrity "sha1-y7muJWv3UK8eqzRPIpqif+lLo0g= sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="
ansi-regex@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
integrity "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= sha512-wFUFA5bg5dviipbQQ32yOQhl6gcJaJXiHE7dvR8VYPG97+J/GNC5FKGepKdEDUFeXRzDxPF1X/Btc8L+v7oqIQ=="
ansi-regex@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
integrity "sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U= sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
ansi-styles@^4.0.0, ansi-styles@^4.1.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
integrity "sha1-7dgDYornHATIWuegkG7a00tkiTc= sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="
dependencies:
color-convert "^2.0.1"
anymatch@~3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
integrity "sha1-wFV8CWrzLxBhmPT04qODU343hxY= sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg=="
dependencies:
normalize-path "^3.0.0"
picomatch "^2.0.4"
argparse@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
integrity "sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg= sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
arrify@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
integrity "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA=="
assertion-error@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
integrity "sha1-5gtrDo8wG9l+U3UhW9pAbIURjAs= sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw=="
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4= sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
integrity "sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0= sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
integrity "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0= sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="
dependencies:
balanced-match "^1.0.0"
concat-map "0.0.1"
braces@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
integrity "sha1-NFThpGLujVmeI23zNs2epPiv4Qc= sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A=="
dependencies:
fill-range "^7.0.1"
browser-or-node@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/browser-or-node/-/browser-or-node-2.0.0.tgz#808ea90282a670931cdc0ea98166538a50dd0d89"
integrity sha512-3Lrks/Okgof+/cRguUNG+qRXSeq79SO3hY4QrXJayJofwJwHiGC0qi99uDjsfTwULUFSr1OGVsBkdIkygKjTUA==
browser-stdout@1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
integrity "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA= sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw=="
buffer-from@^1.0.0, buffer-from@^1.1.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
integrity "sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U= sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
camelcase@^6.0.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809"
integrity "sha1-kkr4gcnVJaydh/QNlk5c6pgqGAk= sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg=="
chai@^4.3.4:
version "4.3.4"
resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49"
integrity "sha1-tV5lWzHh6scJm+TAjCGWT84ubEk= sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA=="
dependencies:
assertion-error "^1.1.0"
check-error "^1.0.2"
deep-eql "^3.0.1"
get-func-name "^2.0.0"
pathval "^1.1.1"
type-detect "^4.0.5"
chalk@^4.1.0:
version "4.1.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
integrity "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE= sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="
dependencies:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
check-error@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
integrity "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA=="
chokidar@3.5.2:
version "3.5.2"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75"
integrity "sha1-26OXb8rbAW9m/TZQIdkWANAcHnU= sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ=="
dependencies:
anymatch "~3.1.2"
braces "~3.0.2"
glob-parent "~5.1.2"
is-binary-path "~2.1.0"
is-glob "~4.0.1"
normalize-path "~3.0.0"
readdirp "~3.6.0"
optionalDependencies:
fsevents "~2.3.2"
chownr@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
cliui@^7.0.2:
version "7.0.4"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
integrity "sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08= sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="
dependencies:
string-width "^4.2.0"
strip-ansi "^6.0.0"
wrap-ansi "^7.0.0"
color-convert@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
integrity "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM= sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="
dependencies:
color-name "~1.1.4"
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI= sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
debug@4.3.1:
version "4.3.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
integrity "sha1-8NIpxQXgxtjEmsVT0bE9wYP2su4= sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ=="
dependencies:
ms "2.1.2"
decamelize@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
integrity "sha1-qkcte/Zg6xXzSU79UxyrfypwmDc= sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ=="
deep-eql@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df"
integrity "sha1-38lARACtHI/gI+faHfHBR8S0RN8= sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw=="
dependencies:
type-detect "^4.0.0"
diff@5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
integrity "sha1-ftatdthZ0DB4fsNYVfWx2vMdhSs= sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w=="
diff@^3.1.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
integrity "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI= sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
emoji-regex@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc= sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
escalade@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
integrity "sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA= sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
escape-string-regexp@4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity "sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ= sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
integrity "sha1-GRmmp8df44ssfHflGYU12prN2kA= sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ=="
dependencies:
to-regex-range "^5.0.1"
find-up@5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
integrity "sha1-TJKBnstwg1YeT0okCoa+UZj1Nvw= sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="
dependencies:
locate-path "^6.0.0"
path-exists "^4.0.0"
flat@^5.0.2:
version "5.0.2"
resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
integrity "sha1-jKb+MyBp/6nTJMMnGYxZglnOskE= sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ=="
fs-minipass@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
dependencies:
minipass "^3.0.0"
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity "sha1-FQStJSMVjKpA20onh8sBQRmU6k8= sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
fsevents@~2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
integrity "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro= sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="
get-caller-file@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34= sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
get-func-name@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
integrity "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig=="
glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
integrity "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ= sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="
dependencies:
is-glob "^4.0.1"
glob@7.1.7:
version "7.1.7"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
integrity "sha1-Oxk+kjPwHULQs/eClLvutBj5SpA= sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ=="
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.0.4"
once "^1.3.0"
path-is-absolute "^1.0.0"
google-protobuf@^3.17.3:
version "3.21.0"
resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.0.tgz#8dfa3fca16218618d373d414d3c1139e28034d6e"
integrity sha512-byR7MBTK4tZ5PZEb+u5ZTzpt4SfrTxv5682MjPlHN16XeqgZE2/8HOIWeiXe8JKnT9OVbtBGhbq8mtvkK8cd5g==
growl@1.10.5:
version "1.10.5"
resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
integrity "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4= sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA=="
grpc-web@^1.3.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/grpc-web/-/grpc-web-1.3.1.tgz#6d8affe75a103790b7ad570824e765a1d6a418e4"
integrity sha512-VxyYEAGsatecAFY3xieRDzsuhm92yQBsJD7fd5Z3MY150hZWPwkrUWetzJ0QK5W0uym4+VedPQrei38wk0eIjQ==
has-flag@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s= sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
he@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity "sha1-hK5l+n6vsWX922FWauFLrwVmTw8= sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
integrity "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="
dependencies:
once "^1.3.0"
wrappy "1"
inherits@2:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w= sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
is-binary-path@~2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
integrity "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk= sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="
dependencies:
binary-extensions "^2.0.0"
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
is-fullwidth-code-point@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
integrity "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w=="
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0= sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
is-glob@^4.0.1, is-glob@~4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
integrity "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw= sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg=="
dependencies:
is-extglob "^2.1.1"
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss= sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
is-plain-obj@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
integrity "sha1-ReQuN/zPH0Dajl927iFRWEDAkoc= sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="
is-unicode-supported@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
integrity "sha1-PybHaoCVk7Ur+i7LVxDtJ3m1Iqc= sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
js-yaml@4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
integrity "sha1-wftl+PUBeQHN0slRhkuhhFihBgI= sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="
dependencies:
argparse "^2.0.1"
json5@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
integrity "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4= sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow=="
dependencies:
minimist "^1.2.0"
kurtosis-module-api-lib@0.23.0:
version "0.23.0"
resolved "https://registry.yarnpkg.com/kurtosis-module-api-lib/-/kurtosis-module-api-lib-0.23.0.tgz#3865d4e0d6dc2b782a94ec3b6bcef24c24568482"
integrity sha512-9PwLrgRPHZhODQmSihnxQJe/glhG+0aEprNI3Su5e3eDjgK2SCvcFlzonm6qL16a0eBx/03eWZHHvtAK//9VEQ==
dependencies:
kurtosis-sdk "0.49.6"
loglevel "^1.7.1"
minimal-grpc-server "0.6.0"
neverthrow "^4.2.2"
kurtosis-sdk@0.49.6:
version "0.49.6"
resolved "https://registry.yarnpkg.com/kurtosis-sdk/-/kurtosis-sdk-0.49.6.tgz#f79dc27c2ccdd8df968f19ade805160ca103c79c"
integrity sha512-ZBhE9KsjbjU3q8dQUUpwCB2uSqTfsttT2uYi2YHRXgRm/n8PVNR40M8/RnASE0OXNU45Bt3Ep8iyewtPn8pgoQ==
dependencies:
"@grpc/grpc-js" "^1.4.4"
"@types/google-protobuf" "^3.15.5"
"@types/path-browserify" "^1.0.0"
"@types/semver" "^7.3.9"
browser-or-node "^2.0.0"
google-protobuf "^3.17.3"
grpc-web "^1.3.0"
loglevel "^1.7.1"
neverthrow "^4.2.2"
path-browserify "^1.0.1"
semver "^7.3.5"
tar "^6.1.11"
locate-path@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
integrity "sha1-VTIeswn+u8WcSAHZMackUqaB0oY= sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="
dependencies:
p-locate "^5.0.0"
lodash.camelcase@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
integrity "sha1-soqmKIorn8ZRA1x3EfZathkDMaY= sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
log-symbols@4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
integrity "sha1-P727lbRoOsn8eFER55LlWNSr1QM= sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="
dependencies:
chalk "^4.1.0"
is-unicode-supported "^0.1.0"
loglevel@^1.7.1:
version "1.7.1"
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197"
integrity "sha1-AF/eL15uRwaPk1/yhXPhJe9y8Zc= sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw=="
long@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==
lru-cache@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
dependencies:
yallist "^4.0.0"
make-error@^1.1.1:
version "1.3.6"
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
integrity "sha1-LrLjfqm2fEiR9oShOUeZr0hM96I= sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
minimal-grpc-server@0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/minimal-grpc-server/-/minimal-grpc-server-0.6.0.tgz#d0f03db957ad066f74e3d9f910654037f7d71dbe"
integrity sha512-1EL4cJbyW/h9dfzQ9g6eNhkl7/O6Yz6HOfMZHcYnH0NUIRSfXHpPj27FpeX4Mwdcp2Qi5yDCtBllmt4D//19PQ==
dependencies:
"@grpc/grpc-js" "^1.4.4"
loglevel "^1.7.1"
neverthrow "^4.2.2"
minimatch@3.0.4, minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM= sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA=="
dependencies:
brace-expansion "^1.1.7"
minimist@^1.2.0, minimist@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI= sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
minipass@^3.0.0:
version "3.3.4"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae"
integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==
dependencies:
yallist "^4.0.0"
minizlib@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
dependencies:
minipass "^3.0.0"
yallist "^4.0.0"
mkdirp@^0.5.1:
version "0.5.5"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
integrity "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8= sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ=="
dependencies:
minimist "^1.2.5"
mkdirp@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
mocha@^9.1.0:
version "9.1.0"
resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.1.0.tgz#0a7aa6fc4f59d1015d4e11747d9104b752553c67"
integrity "sha1-Cnqm/E9Z0QFdThF0fZEEt1JVPGc= sha512-Kjg/XxYOFFUi0h/FwMOeb6RoroiZ+P1yOfya6NK7h3dNhahrJx1r2XIT3ge4ZQvJM86mdjNA+W5phqRQh7DwCg=="
dependencies:
"@ungap/promise-all-settled" "1.1.2"
ansi-colors "4.1.1"
browser-stdout "1.3.1"
chokidar "3.5.2"
debug "4.3.1"
diff "5.0.0"
escape-string-regexp "4.0.0"
find-up "5.0.0"
glob "7.1.7"
growl "1.10.5"
he "1.2.0"
js-yaml "4.1.0"
log-symbols "4.1.0"
minimatch "3.0.4"
ms "2.1.3"
nanoid "3.1.23"
serialize-javascript "6.0.0"
strip-json-comments "3.1.1"
supports-color "8.1.1"
which "2.0.2"
wide-align "1.1.3"
workerpool "6.1.5"
yargs "16.2.0"
yargs-parser "20.2.4"
yargs-unparser "2.0.0"
ms@2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk= sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
ms@2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI= sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
nanoid@3.1.23:
version "3.1.23"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81"
integrity "sha1-90QIbOfCvEfuCoRyV01ceOQYOoE= sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw=="
neverthrow@^4.2.2:
version "4.2.2"
resolved "https://registry.yarnpkg.com/neverthrow/-/neverthrow-4.2.2.tgz#cf333a8ab37398bc0c7a0349b9ea3c67de0ff880"
integrity "sha1-zzM6irNzmLwMegNJueo8Z94P+IA= sha512-zmJ1Oo368VlI7Fp2p+uD3ekkEEYzHr4ZlTE/4vfjA+TPtstftvJ3meIS2EReKy604wVXb+N+8XtwN98Mc1jJsA=="
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU= sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
once@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity "sha1-WDsap3WWHUsROsF9nFC6753Xa9E= sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="
dependencies:
wrappy "1"
p-limit@^3.0.2:
version "3.1.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
integrity "sha1-4drMvnjQ0TiMoYxk/qOOPlfjcGs= sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="
dependencies:
yocto-queue "^0.1.0"
p-locate@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
integrity "sha1-g8gxXGeFAF470CGDlBHJ4RDm2DQ= sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="
dependencies:
p-limit "^3.0.2"
path-browserify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd"
integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==
path-exists@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
integrity "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM= sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity "sha1-F0uSaHNVNP+8es5r9TpanhtcX18= sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
pathval@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d"
integrity "sha1-hTTnenfOesWiUS6iHg/bj89sPY0= sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ=="
picomatch@^2.0.4, picomatch@^2.2.1:
version "2.3.0"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
integrity "sha1-8fBh3o9qS/AiiS4tEoI0+5gwKXI= sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw=="
protobufjs@^6.10.0:
version "6.11.2"
resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.2.tgz#de39fabd4ed32beaa08e9bb1e30d08544c1edf8b"
integrity sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==
dependencies:
"@protobufjs/aspromise" "^1.1.2"
"@protobufjs/base64" "^1.1.2"
"@protobufjs/codegen" "^2.0.4"
"@protobufjs/eventemitter" "^1.1.0"
"@protobufjs/fetch" "^1.1.0"
"@protobufjs/float" "^1.0.2"
"@protobufjs/inquire" "^1.1.0"
"@protobufjs/path" "^1.1.2"
"@protobufjs/pool" "^1.1.0"
"@protobufjs/utf8" "^1.1.0"
"@types/long" "^4.0.1"
"@types/node" ">=13.7.0"
long "^4.0.0"
randombytes@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
integrity "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo= sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="
dependencies:
safe-buffer "^5.1.0"
readdirp@~3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
integrity "sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc= sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="
dependencies:
picomatch "^2.2.1"
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity "sha1-jGStX9MNqxyXbiNE/+f3kqam30I= sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="
safe-buffer@^5.1.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
semver@^7.3.5:
version "7.3.7"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
dependencies:
lru-cache "^6.0.0"
serialize-javascript@6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
integrity "sha1-765diPRdeSQUHai1w6en5mP+/rg= sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag=="
dependencies:
randombytes "^2.1.0"
source-map-support@^0.5.6:
version "0.5.19"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
integrity "sha1-qYti+G3K9PZzmWSMCFKRq56P7WE= sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw=="
dependencies:
buffer-from "^1.0.0"
source-map "^0.6.0"
source-map@^0.6.0:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity "sha1-dHIq8y6WFOnCh6jQu95IteLxomM= sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
"string-width@^1.0.2 || 2":
version "2.1.1"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
integrity "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4= sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw=="
dependencies:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^4.0.0"
string-width@^4.1.0, string-width@^4.2.0:
version "4.2.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
integrity "sha1-2v1PlVmnWFz7pSnGoKT3NIjr1MU= sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA=="
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.0"
strip-ansi@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
integrity "sha1-qEeQIusaw2iocTibY1JixQXuNo8= sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow=="
dependencies:
ansi-regex "^3.0.0"
strip-ansi@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
integrity "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI= sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w=="
dependencies:
ansi-regex "^5.0.0"
strip-bom@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
integrity "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="
strip-json-comments@3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY= sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
supports-color@8.1.1:
version "8.1.1"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
integrity "sha1-zW/BfihQDP9WwbhsCn/UpUpzAFw= sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="
dependencies:
has-flag "^4.0.0"
supports-color@^7.1.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
integrity "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo= sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="
dependencies:
has-flag "^4.0.0"
tar@^6.1.11:
version "6.1.11"
resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==
dependencies:
chownr "^2.0.0"
fs-minipass "^2.0.0"
minipass "^3.0.0"
minizlib "^2.1.1"
mkdirp "^1.0.3"
yallist "^4.0.0"
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
integrity "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ= sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="
dependencies:
is-number "^7.0.0"
ts-mocha@^9.0.2:
version "9.0.2"
resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-9.0.2.tgz#c1ef0248874d04a0f26dd9bd8d88e617a8d82ab1"
integrity sha512-WyQjvnzwrrubl0JT7EC1yWmNpcsU3fOuBFfdps30zbmFBgKniSaSOyZMZx+Wq7kytUs5CY+pEbSYEbGfIKnXTw==
dependencies:
ts-node "7.0.1"
optionalDependencies:
tsconfig-paths "^3.5.0"
ts-node@7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf"
integrity "sha1-lWLcLR5tJI0kvFX3c+P2FDN9m68= sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw=="
dependencies:
arrify "^1.0.0"
buffer-from "^1.1.0"
diff "^3.1.0"
make-error "^1.1.1"
minimist "^1.2.0"
mkdirp "^0.5.1"
source-map-support "^0.5.6"
yn "^2.0.0"
tsconfig-paths@^3.5.0:
version "3.11.0"
resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz#954c1fe973da6339c78e06b03ce2e48810b65f36"
integrity "sha1-lUwf6XPaYznHjgawPOLkiBC2XzY= sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA=="
dependencies:
"@types/json5" "^0.0.29"
json5 "^1.0.1"
minimist "^1.2.0"
strip-bom "^3.0.0"
type-detect@^4.0.0, type-detect@^4.0.5:
version "4.0.8"
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
integrity "sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw= sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="
typescript@^4.3.5:
version "4.3.5"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4"
integrity "sha1-TRw3zBbok5c8RaBohrcRMjTxGfQ= sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA=="
which@2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
integrity "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE= sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="
dependencies:
isexe "^2.0.0"
wide-align@1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
integrity "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc= sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA=="
dependencies:
string-width "^1.0.2 || 2"
workerpool@6.1.5:
version "6.1.5"
resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.5.tgz#0f7cf076b6215fd7e1da903ff6f22ddd1886b581"
integrity "sha1-D3zwdrYhX9fh2pA/9vIt3RiGtYE= sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw=="
wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM= sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
y18n@^5.0.5:
version "5.0.8"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
integrity "sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU= sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
yallist@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
yargs-parser@20.2.4:
version "20.2.4"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54"
integrity "sha1-tCiQ8UVmeW+Fro46JSkNIF8VSlQ= sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA=="
yargs-parser@^20.2.2:
version "20.2.9"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
integrity "sha1-LrfcOwKJcY/ClfNidThFxBoMlO4= sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="
yargs-unparser@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb"
integrity "sha1-8TH5ImkRrl2a04xDL+gJNmwjJes= sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA=="
dependencies:
camelcase "^6.0.0"
decamelize "^4.0.0"
flat "^5.0.2"
is-plain-obj "^2.1.0"
yargs@16.2.0, yargs@^16.1.1:
version "16.2.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
integrity "sha1-HIK/D2tqZur85+8w43b0mhJHf2Y= sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw=="
dependencies:
cliui "^7.0.2"
escalade "^3.1.1"
get-caller-file "^2.0.5"
require-directory "^2.1.1"
string-width "^4.2.0"
y18n "^5.0.5"
yargs-parser "^20.2.2"
yn@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a"
integrity "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo= sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ=="
yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
integrity "sha1-ApTrPe4FAo0x7hpfosVWpqrxChs= sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="