diff --git a/docs/web/docs/guides/how_to_use/worker_quality/using_screen_units.md b/docs/web/docs/guides/how_to_use/worker_quality/using_screen_units.md deleted file mode 100644 index f13246edc..000000000 --- a/docs/web/docs/guides/how_to_use/worker_quality/using_screen_units.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -sidebar_position: 3 ---- - -import Link from '@docusaurus/Link'; - -# Check worker quality with Screening Units - -Screening units help filter out low-quality work, generally by hiding parts of the validation you're paying attention to behind the Mephisto server. To support this we provide the `ScreenTaskRequired` blueprint mixin. - -Screening units are a heuristic-based way to determine, on the first task completion, if a worker has understood the instructions of a task. They can be run either on real data you want annotated (for cases where your heuristics can be run whenever) or on specific 'test' data you believe it's easier to validate on. - - -## Basic configuration - -There are a few primary configuration parts for using screening units: -- Hydra args - - `blueprint.passed_qualification_name`: A string qualification to mark people who have passed screening. Those who fail will be assigned `blueprint.block_qualification`. - - `blueprint.use_screening_task`: Set to `True` to enable the feature. - - `max_screening_units`: An int for the maximum number of screening tasks you're willing to launch with this batch. Used to limit how much you will pay out for units that aren't annotating your desired data. -- `ScreenTaskSharedState`: - - `screening_data_factory`: `False` if you want to validate on real data. Otherwise, a factory that generates input data for a screening unit for a worker. Explained in-depth below. - -With these set up, you'll also need to provide additional arguments to your `SharedTaskState` to register the required qualifications and the gold validation function. For example, your run script main may look something like like: -```python -... - -def validate_screening_unit(unit: "Unit"): - agent = unit.get_assigned_agent() - data = agent.state.get_data() - return my_heuristic_validation(data['outputs']) - -shared_state = SharedTaskState( - ... - screening_data_factory=False - on_unit_submitted=ScreenTaskRequired.create_validation_function(cfg.mephisto, validate_screening_unit) -) -shared_state.qualifications += ScreenTaskRequired.get_mixin_qualifications(cfg.mephisto, shared_state) -... -``` - -### `screening_data_factory` - -The core functionality to provide to your `SharedTaskState` to enable screening units to run on test data before moving to the real data you want annotated. If you want to validate using heuristics on your real data, you can set this to `False`. - -These should take the form of a generator that returns an object of `Dict[str, Any]` which will be used to populate the screening Unit's data. The most basic example would be: -```python -def my_screening_unit_generator(): - while True: - yield {'task_data': 'some screening data', 'is_screen': True} -``` - -## Additional Questions? - -You can find more information on using screening units in the reference documentation for `ScreenTaskRequired`. diff --git a/docs/web/docs/guides/how_to_use/worker_quality/using_screen_units.mdx b/docs/web/docs/guides/how_to_use/worker_quality/using_screen_units.mdx new file mode 100644 index 000000000..6c9f9b027 --- /dev/null +++ b/docs/web/docs/guides/how_to_use/worker_quality/using_screen_units.mdx @@ -0,0 +1,106 @@ +--- +sidebar_position: 3 +--- + +import ReactPlayer from "react-player"; +import Link from "@docusaurus/Link"; + +# Check worker quality with Screening Units + +Screening units help filter out low-quality work, generally by hiding parts of the validation you're paying attention to behind the Mephisto server. To support this we provide the `ScreenTaskRequired` blueprint mixin. + +Screening units are a heuristic-based way to determine, on the first task completion, if a worker has understood the instructions of a task. They can be run either on real data you want annotated (for cases where your heuristics can be run whenever) or on specific 'test' data you believe it's easier to validate on. + +## Showcase + + + +### Things to note in the showcase: + +- The `remote_procedure/mnist` example is ran with the `screening_example` configuration enabled to ensure that screening units are generated. +- When a worker goes to an assignment for the first time they see a screening unit. +- Drawing a "3" gives the worker the passing qualification +- Drawing any number other than "3" gives the worker the blocked qualification +- Going to a different assignment when you have a blocked qualification shows you a not qualified screen. +- Going to a different assignment when you have a passing qualification allows you to see the real unit + +## Basic configuration + +There are a few required configuration parts for using screening units: + +- Hydra args + - `blueprint.passed_qualification_name`: A string qualification to mark people who have passed screening. + - `blueprint.block_qualification`: A string qualification to mark people who have failed screening. + - `blueprint.use_screening_task`: Determines if the screening units feature will be enabled. Set to **true to enable screening units** and set to **false to disable screening units**. + - `blueprint.max_screening_units`: An int for the maximum number of screening tasks you're willing to launch with this batch. Used to limit how much you will pay out for units that aren't annotating your desired data. + - Must be set to 0 if `screening_data_factory` is set to False + - Must be greater than 0 if `screening_data_factory` is not False + - `task.allowed_concurrent:` An int for the number of allowed concurrent units at a time per worker. This value **must be set to 1**. + - Screening units can only run this task type with one allowed concurrent unit at a time per worker, to ensure screening before moving into real units. +- `ScreenTaskSharedState`: + - `screening_data_factory`: `False` if you want to validate on real data. Otherwise, a factory that generates input data for a screening unit for a worker. Explained in-depth below. + +## Setting up SharedTaskState + +With the basic configuration done, you'll also need to provide additional arguments to your `SharedTaskState` to register the required qualifications and the screening validation function. + +A shortened version of the run script for the video above looks like: + +```python +# run_task.py + +def my_screening_unit_generator(): + """ + The frontend react webapp reads in + isScreeningUnit using the initialTaskData + prop + """ + while True: + yield {"isScreeningUnit": True} + +def validate_screening_unit(unit: Unit): + """Checking if the drawn number is 3""" + agent = unit.get_assigned_agent() + if agent is not None: + data = agent.state.get_data() + annotation = data["final_submission"]["annotations"][0] + if annotation["isCorrect"] and annotation["currentAnnotation"] == 3: + return True + return False + +@task_script(default_config_file="example.yaml") +def main(operator: Operator, cfg: DictConfig) -> None: + is_using_screening_units = cfg.mephisto.blueprint["use_screening_task"] + tasks: List[Dict[str, Any]] = [{"isScreeningUnit": False}] * cfg.num_tasks + ... + shared_state = SharedRemoteProcedureTaskState( + static_task_data=tasks, + function_registry=function_registry, + ) + + if is_using_screening_units: + """You have to defined a few more properties to enable screening units""" + shared_state.on_unit_submitted = ScreenTaskRequired.create_validation_function( + cfg.mephisto, + validate_screening_unit, + ) + shared_state.screening_data_factory = my_screening_unit_generator() + shared_state.qualifications += ScreenTaskRequired.get_mixin_qualifications( + cfg.mephisto, shared_state + ) + ... +``` + +### See the full code [here](https://github.com/facebookresearch/Mephisto/blob/main/examples/remote_procedure/mnist/run_task.py) + +### See hydra configuration [here](https://github.com/facebookresearch/Mephisto/blob/main/examples/remote_procedure/mnist/hydra_configs/conf/screening_example.yaml) + +## Additional Questions? + +You can find more information on using screening units in the reference documentation for `ScreenTaskRequired`. diff --git a/docs/web/package.json b/docs/web/package.json index 963140896..c5d7b4b3c 100644 --- a/docs/web/package.json +++ b/docs/web/package.json @@ -25,6 +25,7 @@ "prism-react-renderer": "^1.2.1", "react": "^17.0.1", "react-dom": "^17.0.1", + "react-player": "^2.10.1", "url-loader": "^4.1.1" }, "browserslist": { diff --git a/examples/remote_procedure/mnist/hydra_configs/conf/screening_example.yaml b/examples/remote_procedure/mnist/hydra_configs/conf/screening_example.yaml new file mode 100644 index 000000000..32190f6d3 --- /dev/null +++ b/examples/remote_procedure/mnist/hydra_configs/conf/screening_example.yaml @@ -0,0 +1,26 @@ +#@package _global_ +defaults: + - /mephisto/blueprint: remote_procedure + - /mephisto/architect: local + - /mephisto/provider: mock +mephisto: + blueprint: + task_source: ${task_dir}/webapp/build/bundle.js + link_task_source: false + units_per_assignment: 1 + passed_qualification_name: "test-mnist-passed-qualification" + block_qualification: "test-mnist-blocked-qualification" + use_screening_task: true + max_screening_units: 3 + task: + task_name: remote-procedure-test-task + task_title: "Provide feedback on our MNIST model" + # NOTE you'll want to update your task description + task_description: "You will draw digits. Try to fool our MNIST model, and provide us the correct label." + # NOTE set a reasonable reward + task_reward: 0.05 + # NOTE will want real tags + task_tags: "mnist,drawing,models,correction" + # We expect to handle 25 people using the MNIST model at once + max_num_concurrent_units: 25 + allowed_concurrent: 1 diff --git a/examples/remote_procedure/mnist/run_task.py b/examples/remote_procedure/mnist/run_task.py index d50122fc5..9dc6c96b5 100644 --- a/examples/remote_procedure/mnist/run_task.py +++ b/examples/remote_procedure/mnist/run_task.py @@ -16,6 +16,10 @@ import os import base64 from io import BytesIO +from mephisto.abstractions.blueprints.mixins.screen_task_required import ( + ScreenTaskRequired, +) +from mephisto.data_model.unit import Unit from model import mnist from mephisto.operations.operator import Operator @@ -30,12 +34,35 @@ from omegaconf import DictConfig from typing import List, Any, Dict +from rich import print + + +def my_screening_unit_generator(): + """ + The frontend react webapp reads in + isScreeningUnit using the initialTaskData + prop + """ + while True: + yield {"isScreeningUnit": True} + + +def validate_screening_unit(unit: Unit): + """Checking if the drawn number is 3""" + agent = unit.get_assigned_agent() + if agent is not None: + data = agent.state.get_data() + annotation = data["final_submission"]["annotations"][0] + if annotation["isCorrect"] and annotation["currentAnnotation"] == 3: + return True + return False @task_script(default_config_file="launch_with_local") def main(operator: Operator, cfg: DictConfig) -> None: - tasks: List[Dict[str, Any]] = [{}] * cfg.num_tasks + tasks: List[Dict[str, Any]] = [{"isScreeningUnit": False}] * cfg.num_tasks mnist_model = mnist(pretrained=True) + is_using_screening_units = cfg.mephisto.blueprint["use_screening_task"] def handle_with_model( _request_id: str, args: Dict[str, Any], agent_state: RemoteProcedureAgentState @@ -58,12 +85,22 @@ def handle_with_model( function_registry = { "classify_digit": handle_with_model, } - shared_state = SharedRemoteProcedureTaskState( static_task_data=tasks, function_registry=function_registry, ) + if is_using_screening_units: + """You have to defined a few more properties to enable screening units""" + shared_state.on_unit_submitted = ScreenTaskRequired.create_validation_function( + cfg.mephisto, + validate_screening_unit, + ) + shared_state.screening_data_factory = my_screening_unit_generator() + shared_state.qualifications += ScreenTaskRequired.get_mixin_qualifications( + cfg.mephisto, shared_state + ) + task_dir = cfg.task_dir build_custom_bundle( diff --git a/examples/remote_procedure/mnist/webapp/package-lock.json b/examples/remote_procedure/mnist/webapp/package-lock.json index c2505fb5c..7561f005d 100644 --- a/examples/remote_procedure/mnist/webapp/package-lock.json +++ b/examples/remote_procedure/mnist/webapp/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.1", "dependencies": { "bootstrap": "^4.6.0", - "mephisto-task": "^2.0.1", + "mephisto-task": "2.0.2", "rc-slider": "^8.6.3", "react": "16.13.1", "react-bootstrap": "^1.6.0", @@ -1861,7 +1861,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", - "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -1881,7 +1880,6 @@ "version": "13.12.1", "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", - "dev": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -1896,7 +1894,6 @@ "version": "0.9.5", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", - "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -1909,8 +1906,7 @@ "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.2", @@ -2565,7 +2561,6 @@ "version": "8.7.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -2577,7 +2572,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -2604,7 +2598,6 @@ }, "node_modules/ajv": { "version": "6.12.6", - "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -2665,7 +2658,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -2716,8 +2708,7 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/aria-query": { "version": "4.2.2", @@ -3032,7 +3023,6 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "dev": true, "license": "MIT" }, "node_modules/base64-js": { @@ -3112,7 +3102,6 @@ }, "node_modules/brace-expansion": { "version": "1.1.11", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -3213,7 +3202,6 @@ }, "node_modules/callsites": { "version": "3.1.0", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -3440,7 +3428,6 @@ }, "node_modules/concat-map": { "version": "0.0.1", - "dev": true, "license": "MIT" }, "node_modules/confusing-browser-globals": { @@ -3518,7 +3505,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3853,8 +3839,7 @@ "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "node_modules/define-properties": { "version": "1.1.3", @@ -3897,7 +3882,6 @@ }, "node_modules/doctrine": { "version": "3.0.0", - "dev": true, "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" @@ -4072,7 +4056,6 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz", "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==", - "dev": true, "dependencies": { "@eslint/eslintrc": "^1.2.1", "@humanwhocodes/config-array": "^0.9.2", @@ -4418,7 +4401,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, "dependencies": { "eslint-visitor-keys": "^2.0.0" }, @@ -4436,7 +4418,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, "engines": { "node": ">=10" } @@ -4452,7 +4433,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -4467,7 +4447,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4483,7 +4462,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -4494,14 +4472,12 @@ "node_modules/eslint/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" }, @@ -4513,7 +4489,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -4526,7 +4501,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -4535,7 +4509,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -4547,7 +4520,6 @@ "version": "13.12.1", "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", - "dev": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -4562,7 +4534,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -4571,7 +4542,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -4583,7 +4553,6 @@ "version": "9.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", - "dev": true, "dependencies": { "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", @@ -4597,14 +4566,12 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/esquery": { "version": "1.4.0", - "dev": true, "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" @@ -4615,7 +4582,6 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -4626,7 +4592,6 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -4634,7 +4599,6 @@ }, "node_modules/esutils": { "version": "2.0.3", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -4749,7 +4713,6 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "dev": true, "license": "MIT" }, "node_modules/fast-glob": { @@ -4770,14 +4733,12 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "node_modules/fastest-levenshtein": { "version": "1.0.12", @@ -4821,7 +4782,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, "dependencies": { "flat-cache": "^3.0.4" }, @@ -4885,7 +4845,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, "dependencies": { "flatted": "^3.1.0", "rimraf": "^3.0.2" @@ -4897,8 +4856,7 @@ "node_modules/flatted": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" }, "node_modules/follow-redirects": { "version": "1.14.9", @@ -4964,7 +4922,6 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", - "dev": true, "license": "ISC" }, "node_modules/fsevents": { @@ -4985,7 +4942,6 @@ }, "node_modules/functional-red-black-tree": { "version": "1.0.1", - "dev": true, "license": "MIT" }, "node_modules/gensync": { @@ -5055,7 +5011,6 @@ }, "node_modules/glob": { "version": "7.2.0", - "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -5252,14 +5207,12 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { "version": "3.3.0", - "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -5292,7 +5245,6 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" @@ -5309,7 +5261,6 @@ }, "node_modules/inflight": { "version": "1.0.6", - "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -5318,7 +5269,6 @@ }, "node_modules/inherits": { "version": "2.0.4", - "dev": true, "license": "ISC" }, "node_modules/ini": { @@ -5451,7 +5401,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5468,7 +5417,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -5640,8 +5588,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "node_modules/isobject": { "version": "3.0.1", @@ -5692,6 +5639,12 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==", + "peer": true + }, "node_modules/js-tokens": { "version": "4.0.0", "license": "MIT" @@ -5700,7 +5653,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -5743,12 +5695,10 @@ }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "dev": true, "license": "MIT" }, "node_modules/json-stringify-safe": { @@ -5848,7 +5798,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -5947,8 +5896,7 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/lodash.once": { "version": "4.1.1", @@ -6167,9 +6115,9 @@ } }, "node_modules/mephisto-task": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mephisto-task/-/mephisto-task-2.0.1.tgz", - "integrity": "sha512-kH38qzk/6zkCWb8TUw23S4MwHBQdClm6k0PS37xkHUzsAIy9CYiRvkhWQ3Tu0zJn3Vhe6T4rC6NIzAK9PmCwaA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mephisto-task/-/mephisto-task-2.0.2.tgz", + "integrity": "sha512-t4vVVAeT7cHMZfTK/eUiZ8otfEJ209TwboWKmDXhsKkRYBw/A5R8Bidb1yS/3lNy7xakTH2f1XK0+jIYbLHWhg==", "dependencies": { "axios": "^0.21.1", "babel-eslint": "10.x", @@ -6236,7 +6184,6 @@ }, "node_modules/minimatch": { "version": "3.1.2", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -6269,7 +6216,6 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "dev": true, "license": "MIT" }, "node_modules/neo-async": { @@ -6401,7 +6347,6 @@ }, "node_modules/once": { "version": "1.4.0", - "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -6425,7 +6370,6 @@ "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -6491,7 +6435,6 @@ }, "node_modules/parent-module": { "version": "1.0.1", - "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -6528,7 +6471,6 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6538,7 +6480,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -6665,6 +6606,17 @@ "node": ">=8" } }, + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/postcss": { "version": "8.4.8", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz", @@ -6765,7 +6717,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, "engines": { "node": ">= 0.8.0" } @@ -6826,7 +6777,6 @@ }, "node_modules/punycode": { "version": "2.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -7132,7 +7082,6 @@ }, "node_modules/regexpp": { "version": "3.2.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7229,7 +7178,6 @@ }, "node_modules/resolve-from": { "version": "4.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -7268,7 +7216,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -7388,7 +7335,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -7400,7 +7346,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -7608,7 +7553,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -7634,7 +7578,6 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7786,7 +7729,6 @@ }, "node_modules/text-table": { "version": "0.2.0", - "dev": true, "license": "MIT" }, "node_modules/throttleit": { @@ -7907,7 +7849,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -7919,7 +7860,6 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, "engines": { "node": ">=10" }, @@ -7927,6 +7867,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/unbox-primitive": { "version": "1.0.1", "dev": true, @@ -8010,7 +7964,6 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -8089,7 +8042,6 @@ }, "node_modules/v8-compile-cache": { "version": "2.3.0", - "dev": true, "license": "MIT" }, "node_modules/verror": { @@ -8270,7 +8222,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -8305,7 +8256,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -8362,7 +8312,6 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "dev": true, "license": "ISC" }, "node_modules/yallist": { @@ -9509,7 +9458,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", - "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -9526,7 +9474,6 @@ "version": "13.12.1", "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", - "dev": true, "requires": { "type-fest": "^0.20.2" } @@ -9537,7 +9484,6 @@ "version": "0.9.5", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", - "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -9547,8 +9493,7 @@ "@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, "@jridgewell/gen-mapping": { "version": "0.3.2", @@ -9630,7 +9575,8 @@ "version": "2.11.2" }, "@restart/context": { - "version": "2.1.4" + "version": "2.1.4", + "requires": {} }, "@restart/hooks": { "version": "0.3.27", @@ -9988,7 +9934,8 @@ }, "@webpack-cli/configtest": { "version": "1.1.1", - "dev": true + "dev": true, + "requires": {} }, "@webpack-cli/info": { "version": "1.4.1", @@ -9999,7 +9946,8 @@ }, "@webpack-cli/serve": { "version": "1.6.1", - "dev": true + "dev": true, + "requires": {} }, "@xtuc/ieee754": { "version": "1.2.0", @@ -10012,14 +9960,13 @@ "acorn": { "version": "8.7.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "requires": {} }, "add-dom-event-listener": { "version": "1.1.0", @@ -10039,7 +9986,6 @@ }, "ajv": { "version": "6.12.6", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -10049,7 +9995,8 @@ }, "ajv-keywords": { "version": "3.5.2", - "dev": true + "dev": true, + "requires": {} }, "ansi-colors": { "version": "4.1.3", @@ -10077,8 +10024,7 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "3.2.1", @@ -10104,8 +10050,7 @@ "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "aria-query": { "version": "4.2.2", @@ -10336,8 +10281,7 @@ } }, "balanced-match": { - "version": "1.0.2", - "dev": true + "version": "1.0.2" }, "base64-js": { "version": "1.5.1", @@ -10376,7 +10320,8 @@ "dev": true }, "bootstrap": { - "version": "4.6.1" + "version": "4.6.1", + "requires": {} }, "bowser": { "version": "2.11.0", @@ -10385,7 +10330,6 @@ }, "brace-expansion": { "version": "1.1.11", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -10444,8 +10388,7 @@ } }, "callsites": { - "version": "3.1.0", - "dev": true + "version": "3.1.0" }, "caniuse-lite": { "version": "1.0.30001314", @@ -10598,8 +10541,7 @@ "version": "0.0.3" }, "concat-map": { - "version": "0.0.1", - "dev": true + "version": "0.0.1" }, "confusing-browser-globals": { "version": "1.0.11", @@ -10656,7 +10598,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -10899,8 +10840,7 @@ "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "define-properties": { "version": "1.1.3", @@ -10929,7 +10869,6 @@ }, "doctrine": { "version": "3.0.0", - "dev": true, "requires": { "esutils": "^2.0.2" } @@ -11055,7 +10994,6 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz", "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==", - "dev": true, "requires": { "@eslint/eslintrc": "^1.2.1", "@humanwhocodes/config-array": "^0.9.2", @@ -11098,7 +11036,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -11107,7 +11044,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11117,7 +11053,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -11125,20 +11060,17 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "eslint-scope": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -11147,14 +11079,12 @@ "eslint-visitor-keys": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==" }, "glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "requires": { "is-glob": "^4.0.3" } @@ -11163,7 +11093,6 @@ "version": "13.12.1", "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", - "dev": true, "requires": { "type-fest": "^0.20.2" } @@ -11171,14 +11100,12 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -11367,7 +11294,8 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz", "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==", - "dev": true + "dev": true, + "requires": {} }, "eslint-plugin-testing-library": { "version": "5.1.0", @@ -11396,7 +11324,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, "requires": { "eslint-visitor-keys": "^2.0.0" }, @@ -11404,8 +11331,7 @@ "eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" } } }, @@ -11416,7 +11342,6 @@ "version": "9.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", - "dev": true, "requires": { "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", @@ -11426,32 +11351,27 @@ "eslint-visitor-keys": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==" } } }, "esquery": { "version": "1.4.0", - "dev": true, "requires": { "estraverse": "^5.1.0" } }, "esrecurse": { "version": "4.3.0", - "dev": true, "requires": { "estraverse": "^5.2.0" } }, "estraverse": { - "version": "5.3.0", - "dev": true + "version": "5.3.0" }, "esutils": { - "version": "2.0.3", - "dev": true + "version": "2.0.3" }, "eventemitter2": { "version": "6.4.5", @@ -11531,8 +11451,7 @@ "dev": true }, "fast-deep-equal": { - "version": "3.1.3", - "dev": true + "version": "3.1.3" }, "fast-glob": { "version": "3.2.11", @@ -11548,14 +11467,12 @@ } }, "fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true + "version": "2.1.0" }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fastest-levenshtein": { "version": "1.0.12", @@ -11592,7 +11509,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, "requires": { "flat-cache": "^3.0.4" } @@ -11633,7 +11549,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" @@ -11642,8 +11557,7 @@ "flatted": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" }, "follow-redirects": { "version": "1.14.9", @@ -11684,8 +11598,7 @@ "dev": true }, "fs.realpath": { - "version": "1.0.0", - "dev": true + "version": "1.0.0" }, "fsevents": { "version": "2.3.2", @@ -11696,8 +11609,7 @@ "version": "1.1.1" }, "functional-red-black-tree": { - "version": "1.0.1", - "dev": true + "version": "1.0.1" }, "gensync": { "version": "1.0.0-beta.2", @@ -11744,7 +11656,6 @@ }, "glob": { "version": "7.2.0", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11846,7 +11757,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true + "dev": true, + "requires": {} }, "ieee754": { "version": "1.2.1", @@ -11857,12 +11769,10 @@ "ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" }, "import-fresh": { "version": "3.3.0", - "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -11877,8 +11787,7 @@ } }, "imurmurhash": { - "version": "0.1.4", - "dev": true + "version": "0.1.4" }, "indent-string": { "version": "4.0.0", @@ -11888,15 +11797,13 @@ }, "inflight": { "version": "1.0.6", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { - "version": "2.0.4", - "dev": true + "version": "2.0.4" }, "ini": { "version": "2.0.0", @@ -11979,8 +11886,7 @@ } }, "is-extglob": { - "version": "2.1.1", - "dev": true + "version": "2.1.1" }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -11990,7 +11896,6 @@ }, "is-glob": { "version": "4.0.3", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -12085,8 +11990,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", @@ -12120,6 +12024,12 @@ } } }, + "jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==", + "peer": true + }, "js-tokens": { "version": "4.0.0" }, @@ -12127,7 +12037,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "requires": { "argparse": "^2.0.1" } @@ -12158,12 +12067,10 @@ "dev": true }, "json-schema-traverse": { - "version": "0.4.1", - "dev": true + "version": "0.4.1" }, "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true + "version": "1.0.1" }, "json-stringify-safe": { "version": "5.0.1", @@ -12236,7 +12143,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, "requires": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -12305,8 +12211,7 @@ "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "lodash.once": { "version": "4.1.1", @@ -12465,9 +12370,9 @@ } }, "mephisto-task": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mephisto-task/-/mephisto-task-2.0.1.tgz", - "integrity": "sha512-kH38qzk/6zkCWb8TUw23S4MwHBQdClm6k0PS37xkHUzsAIy9CYiRvkhWQ3Tu0zJn3Vhe6T4rC6NIzAK9PmCwaA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mephisto-task/-/mephisto-task-2.0.2.tgz", + "integrity": "sha512-t4vVVAeT7cHMZfTK/eUiZ8otfEJ209TwboWKmDXhsKkRYBw/A5R8Bidb1yS/3lNy7xakTH2f1XK0+jIYbLHWhg==", "requires": { "axios": "^0.21.1", "babel-eslint": "10.x", @@ -12511,7 +12416,6 @@ }, "minimatch": { "version": "3.1.2", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -12532,8 +12436,7 @@ "dev": true }, "natural-compare": { - "version": "1.4.0", - "dev": true + "version": "1.4.0" }, "neo-async": { "version": "2.6.2", @@ -12613,7 +12516,6 @@ }, "once": { "version": "1.4.0", - "dev": true, "requires": { "wrappy": "1" } @@ -12629,7 +12531,6 @@ "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, "requires": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -12674,7 +12575,6 @@ }, "parent-module": { "version": "1.0.1", - "dev": true, "requires": { "callsites": "^3.0.0" } @@ -12696,14 +12596,12 @@ "dev": true }, "path-is-absolute": { - "version": "1.0.1", - "dev": true + "version": "1.0.1" }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { "version": "1.0.7" @@ -12781,6 +12679,12 @@ } } }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "peer": true + }, "postcss": { "version": "8.4.8", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz", @@ -12796,7 +12700,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true + "dev": true, + "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -12846,8 +12751,7 @@ "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" }, "pretty-bytes": { "version": "5.6.0", @@ -12893,8 +12797,7 @@ } }, "punycode": { - "version": "2.1.1", - "dev": true + "version": "2.1.1" }, "qs": { "version": "6.5.3", @@ -13114,8 +13017,7 @@ } }, "regexpp": { - "version": "3.2.0", - "dev": true + "version": "3.2.0" }, "regexpu-core": { "version": "5.0.1", @@ -13180,8 +13082,7 @@ } }, "resolve-from": { - "version": "4.0.0", - "dev": true + "version": "4.0.0" }, "restore-cursor": { "version": "3.1.0", @@ -13209,7 +13110,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -13291,7 +13191,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "requires": { "shebang-regex": "^3.0.0" } @@ -13299,8 +13198,7 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "side-channel": { "version": "1.0.4", @@ -13455,7 +13353,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -13469,8 +13366,7 @@ "dev": true }, "strip-json-comments": { - "version": "3.1.1", - "dev": true + "version": "3.1.1" }, "style-loader": { "version": "1.3.0", @@ -13549,8 +13445,7 @@ } }, "text-table": { - "version": "0.2.0", - "dev": true + "version": "0.2.0" }, "throttleit": { "version": "1.0.0", @@ -13642,7 +13537,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, "requires": { "prelude-ls": "^1.2.1" } @@ -13650,8 +13544,14 @@ "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + }, + "typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "peer": true }, "unbox-primitive": { "version": "1.0.1", @@ -13706,7 +13606,6 @@ }, "uri-js": { "version": "4.4.1", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -13753,8 +13652,7 @@ "dev": true }, "v8-compile-cache": { - "version": "2.3.0", - "dev": true + "version": "2.3.0" }, "verror": { "version": "1.10.0", @@ -13813,7 +13711,8 @@ "dependencies": { "acorn-import-assertions": { "version": "1.8.0", - "dev": true + "dev": true, + "requires": {} }, "schema-utils": { "version": "3.1.1", @@ -13866,7 +13765,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -13889,8 +13787,7 @@ "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "wrap-ansi": { "version": "7.0.0", @@ -13930,8 +13827,7 @@ } }, "wrappy": { - "version": "1.0.2", - "dev": true + "version": "1.0.2" }, "yallist": { "version": "4.0.0", diff --git a/examples/remote_procedure/mnist/webapp/src/app.jsx b/examples/remote_procedure/mnist/webapp/src/app.jsx index 826168a1e..af8e786b8 100644 --- a/examples/remote_procedure/mnist/webapp/src/app.jsx +++ b/examples/remote_procedure/mnist/webapp/src/app.jsx @@ -45,6 +45,7 @@ function RemoteProcedureApp() { remoteProcedure, isOnboarding, handleFatalError, + initialTaskData, } = mephistoProps; const classifyDigit = remoteProcedure("classify_digit"); @@ -65,7 +66,6 @@ function RemoteProcedureApp() { if (isPreview) { return ; } - return ( @@ -73,6 +73,7 @@ function RemoteProcedureApp() { diff --git a/examples/remote_procedure/mnist/webapp/src/components/core_components.jsx b/examples/remote_procedure/mnist/webapp/src/components/core_components.jsx index f86fcc5d3..dd480bd8a 100644 --- a/examples/remote_procedure/mnist/webapp/src/components/core_components.jsx +++ b/examples/remote_procedure/mnist/webapp/src/components/core_components.jsx @@ -123,24 +123,26 @@ function AnnotationCanvas({ onUpdate, classifyDigit, index }) { ); } -function Instructions() { +function Instructions({ taskData }) { return (

MNIST Model Evaluator

- To submit this task, you'll need to draw 3 (single) digits in the boxes - below. Our model will try to provide an annotation for each. + {taskData.isScreeningUnit + ? "Screening Unit:" + : "To submit this task, you'll need to draw 3 (single) digits in the boxes below. Our model will try to provide an annotation for each."}

- You can confirm or reject each of the annotations. Provide a correction - if the annotation is wrong. + {taskData.isScreeningUnit + ? 'To submit this task you will have to correctly draw the number 3 in the box below and check the "Annotation Correct" checkbox' + : "You can confirm or reject each of the annotations. Provide a correction if the annotation is wrong."}

); } -function TaskFrontend({ classifyDigit, handleSubmit }) { - const NUM_ANNOTATIONS = 3; +function TaskFrontend({ taskData, classifyDigit, handleSubmit }) { + const NUM_ANNOTATIONS = taskData.isScreeningUnit ? 1 : 3; const [annotations, updateAnnotations] = React.useReducer( (currentAnnotation, { updateIdx, updatedAnnotation }) => { return currentAnnotation.map((val, idx) => @@ -159,7 +161,7 @@ function TaskFrontend({ classifyDigit, handleSubmit }) { return (
- +
{annotations.map((_d, idx) => ( None: - def onboarding_always_valid(onboarding_data): - return True +def my_screening_unit_generator(): + while True: + yield {"text": "SCREENING UNIT: Press the red button", "is_screen": True} + + +def validate_screening_unit(unit: Unit): + agent = unit.get_assigned_agent() + if agent is not None: + data = agent.state.get_data() + print(data) + if ( + data["outputs"] is not None + and "rating" in data["outputs"] + and data["outputs"]["rating"] == "bad" + ): + # User pressed the red button + return True + return False + +def onboarding_always_valid(onboarding_data): + return True + + +@task_script(default_config_file="example.yaml") +def main(operator: Operator, cfg: DictConfig) -> None: + is_using_screening_units = cfg.mephisto.blueprint["use_screening_task"] shared_state = SharedStaticTaskState( static_task_data=[ {"text": "This text is good text!"}, @@ -26,6 +52,20 @@ def onboarding_always_valid(onboarding_data): validate_onboarding=onboarding_always_valid, ) + if is_using_screening_units: + """ + When using screening units there has to be a + few more properties set on shared_state + """ + shared_state.on_unit_submitted = ScreenTaskRequired.create_validation_function( + cfg.mephisto, + validate_screening_unit, + ) + shared_state.screening_data_factory = my_screening_unit_generator() + shared_state.qualifications += ScreenTaskRequired.get_mixin_qualifications( + cfg.mephisto, shared_state + ) + task_dir = cfg.task_dir build_custom_bundle( diff --git a/examples/static_react_task/webapp/src/components/core_components.jsx b/examples/static_react_task/webapp/src/components/core_components.jsx index c4ed46e0c..db399dd83 100644 --- a/examples/static_react_task/webapp/src/components/core_components.jsx +++ b/examples/static_react_task/webapp/src/components/core_components.jsx @@ -16,12 +16,21 @@ function OnboardingComponent({ onSubmit }) { qualification for your task. Click the button to move on to the main task. - + +
); } diff --git a/mephisto/abstractions/blueprint.py b/mephisto/abstractions/blueprint.py index 81ba89485..cc788c973 100644 --- a/mephisto/abstractions/blueprint.py +++ b/mephisto/abstractions/blueprint.py @@ -8,6 +8,7 @@ import csv from genericpath import exists import os +from rich import print from typing import ( ClassVar, List, @@ -148,14 +149,20 @@ def extract_unique_mixins(blueprint_class: Type["Blueprint"]): for clazz in removed_locals if clazz != BlueprintMixin and clazz != target_class ) + + # Remaining "Blueprints" should be dropped at this point. + filtered_out_blueprints = set( + clazz for clazz in filtered_subclasses if not issubclass(clazz, Blueprint) + ) + # we also want to make sure that we don't double-count extensions of mixins, so remove classes that other classes are subclasses of def is_subclassed(clazz): return True in [ - issubclass(x, clazz) and x != clazz for x in filtered_subclasses + issubclass(x, clazz) and x != clazz for x in filtered_out_blueprints ] unique_subclasses = [ - clazz for clazz in filtered_subclasses if not is_subclassed(clazz) + clazz for clazz in filtered_out_blueprints if not is_subclassed(clazz) ] return unique_subclasses diff --git a/mephisto/abstractions/blueprints/abstract/static_task/static_blueprint.py b/mephisto/abstractions/blueprints/abstract/static_task/static_blueprint.py index 17cc3074c..d45c7e533 100644 --- a/mephisto/abstractions/blueprints/abstract/static_task/static_blueprint.py +++ b/mephisto/abstractions/blueprints/abstract/static_task/static_blueprint.py @@ -16,6 +16,11 @@ ) from dataclasses import dataclass, field from omegaconf import MISSING, DictConfig +from mephisto.abstractions.blueprints.mixins.screen_task_required import ( + ScreenTaskRequired, + ScreenTaskRequiredArgs, + ScreenTaskSharedState, +) from mephisto.data_model.assignment import InitializationData from mephisto.abstractions.blueprints.abstract.static_task.static_agent_state import ( StaticAgentState, @@ -26,15 +31,13 @@ from mephisto.abstractions.blueprints.abstract.static_task.empty_task_builder import ( EmptyStaticTaskBuilder, ) -from mephisto.operations.registry import register_mephisto_abstraction import os -import time import csv import json import types -from typing import ClassVar, List, Type, Any, Dict, Iterable, TYPE_CHECKING +from typing import ClassVar, Type, Any, Dict, Iterable, TYPE_CHECKING if TYPE_CHECKING: from mephisto.data_model.task_run import TaskRun @@ -42,18 +45,16 @@ AgentState, TaskRunner, TaskBuilder, - OnboardingAgent, ) - from mephisto.data_model.assignment import Assignment - from mephisto.data_model.worker import Worker - from mephisto.data_model.unit import Unit BLUEPRINT_TYPE_STATIC = "abstract_static" @dataclass -class SharedStaticTaskState(OnboardingSharedState, SharedTaskState): +class SharedStaticTaskState( + ScreenTaskSharedState, OnboardingSharedState, SharedTaskState +): static_task_data: Iterable[Any] = field( default_factory=list, metadata={ @@ -69,7 +70,9 @@ class SharedStaticTaskState(OnboardingSharedState, SharedTaskState): @dataclass -class StaticBlueprintArgs(OnboardingRequiredArgs, BlueprintArgs): +class StaticBlueprintArgs( + ScreenTaskRequiredArgs, OnboardingRequiredArgs, BlueprintArgs +): _blueprint_type: str = BLUEPRINT_TYPE_STATIC _group: str = field( default="StaticBlueprint", @@ -104,7 +107,7 @@ class StaticBlueprintArgs(OnboardingRequiredArgs, BlueprintArgs): ) -class StaticBlueprint(OnboardingRequired, Blueprint): +class StaticBlueprint(ScreenTaskRequired, OnboardingRequired, Blueprint): """ Abstract blueprint for a task that runs without any extensive backend. These are generally one-off tasks sending data to the frontend and then diff --git a/mephisto/abstractions/blueprints/remote_procedure/remote_procedure_blueprint.py b/mephisto/abstractions/blueprints/remote_procedure/remote_procedure_blueprint.py index c7b48ad75..4a9b57dc4 100644 --- a/mephisto/abstractions/blueprints/remote_procedure/remote_procedure_blueprint.py +++ b/mephisto/abstractions/blueprints/remote_procedure/remote_procedure_blueprint.py @@ -15,6 +15,11 @@ OnboardingRequiredArgs, ) from dataclasses import dataclass, field +from mephisto.abstractions.blueprints.mixins.screen_task_required import ( + ScreenTaskRequired, + ScreenTaskRequiredArgs, + ScreenTaskSharedState, +) from mephisto.data_model.assignment import InitializationData from mephisto.abstractions.blueprints.remote_procedure.remote_procedure_agent_state import ( RemoteProcedureAgentState, @@ -53,7 +58,9 @@ @dataclass -class SharedRemoteProcedureTaskState(OnboardingSharedState, SharedTaskState): +class SharedRemoteProcedureTaskState( + ScreenTaskSharedState, OnboardingSharedState, SharedTaskState +): function_registry: Optional[ Mapping[ str, @@ -67,7 +74,9 @@ class SharedRemoteProcedureTaskState(OnboardingSharedState, SharedTaskState): @dataclass -class RemoteProcedureBlueprintArgs(OnboardingRequiredArgs, BlueprintArgs): +class RemoteProcedureBlueprintArgs( + ScreenTaskRequiredArgs, OnboardingRequiredArgs, BlueprintArgs +): _blueprint_type: str = BLUEPRINT_TYPE_REMOTE_PROCEDURE _group: str = field( default="RemoteProcedureBlueprintArgs", @@ -105,7 +114,7 @@ class RemoteProcedureBlueprintArgs(OnboardingRequiredArgs, BlueprintArgs): @register_mephisto_abstraction() -class RemoteProcedureBlueprint(OnboardingRequired, Blueprint): +class RemoteProcedureBlueprint(ScreenTaskRequired, OnboardingRequired, Blueprint): """Blueprint for a task that runs a parlai chat""" AgentStateClass: ClassVar[Type["AgentState"]] = RemoteProcedureAgentState diff --git a/mephisto/operations/worker_pool.py b/mephisto/operations/worker_pool.py index e38205248..b1a945b4f 100644 --- a/mephisto/operations/worker_pool.py +++ b/mephisto/operations/worker_pool.py @@ -470,6 +470,7 @@ async def register_agent( function="get_valid_units_for_worker" ).time(): units = task_run.get_valid_units_for_worker(worker) + if len(units) == 0: AGENT_DETAILS_COUNT.labels(response="no_available_units").inc() live_run.client_io.enqueue_agent_details( @@ -483,7 +484,6 @@ async def register_agent( f"agent_registration_id {agent_registration_id}, had no valid units." ) return - with EXTERNAL_FUNCTION_LATENCY.labels( function="filter_units_for_worker" ).time(): @@ -491,7 +491,6 @@ async def register_agent( None, partial(live_run.task_runner.filter_units_for_worker, units, worker), ) - # If there's onboarding, see if this worker has already been disqualified blueprint = live_run.blueprint if isinstance(blueprint, OnboardingRequired) and blueprint.use_onboarding: @@ -561,6 +560,7 @@ async def cleanup_onboarding(): onboard_agent, cleanup_onboarding ) return + if isinstance(blueprint, ScreenTaskRequired) and blueprint.use_screening_task: if ( blueprint.worker_needs_screening(worker) diff --git a/yarn.lock b/yarn.lock index b4797c111..a36263104 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22619,7 +22619,7 @@ __metadata: languageName: node linkType: hard -"react-player@npm:^2.9.0": +"react-player@npm:^2.10.1, react-player@npm:^2.9.0": version: 2.10.1 resolution: "react-player@npm:2.10.1" dependencies: @@ -27163,6 +27163,7 @@ __metadata: prism-react-renderer: ^1.2.1 react: ^17.0.1 react-dom: ^17.0.1 + react-player: ^2.10.1 url-loader: ^4.1.1 languageName: unknown linkType: soft