From 15cf0ebd49167262868019b626294fed2bf350b0 Mon Sep 17 00:00:00 2001 From: Jonas Plum Date: Mon, 13 Dec 2021 00:39:15 +0100 Subject: [PATCH] Release catalyst --- .github/workflows/ci.yml | 93 + .gitignore | 86 + Dockerfile | 12 + LICENSE.md | 104 + NOTICE | 16 + README.md | 78 + VERSION | 1 + auth.go | 403 + automation/automation.go | 26 + automation/docker.go | 186 + automation/job.go | 116 + automation/result.go | 38 + backup.go | 149 + bus/bus.go | 139 + caql/blevebuilder.go | 182 + caql/blevebuilder_test.go | 50 + caql/builder.go | 317 + caql/errors.go | 8 + caql/function.go | 750 + caql/function_test.go | 380 + caql/interpreter.go | 355 + caql/operations.go | 497 + caql/parser.go | 120 + caql/rql_test.go | 352 + caql/set.go | 154 + caql/set_test.go | 96 + caql/unquote.go | 79 + caql/unquote_test.go | 125 + caql/wildcard.go | 155 + caql/wildcard_test.go | 50 + cmd/catalyst-dev/main.go | 65 + cmd/catalyst/main.go | 27 + cmd/cmd.go | 151 + dag/dag.go | 164 + dag/dag_test.go | 238 + database/artifact.go | 101 + database/automation.go | 99 + database/busdb/busdb.go | 182 + database/busdb/context.go | 34 + database/busdb/keyed.go | 25 + database/busdb/log.go | 92 + database/db.go | 177 + database/job.go | 256 + database/migrations/automations/comment.py | 25 + database/migrations/automations/hash.sha1.py | 13 + database/migrations/automations/thehive.py | 630 + database/migrations/automations/vt.hash.py | 22 + database/migrations/content.go | 27 + database/migrations/migrations.go | 217 + database/migrations/playbooks/malware.yml | 63 + database/migrations/playbooks/phishing.yml | 85 + database/migrations/playbooks/simple.yaml | 37 + database/migrations/templates/advanced.json | 208 + database/migrations/templates/default.json | 79 + database/migrations/templates/veris.json | 3644 ++++ database/playbook.go | 152 + database/playbookutils.go | 182 + database/playbookutils_test.go | 135 + database/relationships.go | 48 + database/settings.go | 86 + database/settings_test.go | 159 + database/statistics.go | 43 + database/task.go | 68 + database/template.go | 88 + database/template_test.go | 182 + database/ticket.go | 604 + database/ticket_field.go | 291 + database/ticket_task.go | 186 + database/tickettype.go | 101 + database/user.go | 201 + definition/CAQLLexer.g4 | 160 + definition/CAQLParser.g4 | 109 + definition/artifacts.yaml | 29 + definition/automation.yaml | 165 + definition/enterprise/graph.yaml | 52 + definition/enterprise/groups.yaml | 84 + definition/enterprise/rules.yaml | 110 + definition/jobs.yaml | 130 + definition/logs.yaml | 30 + definition/playbooks.yaml | 202 + definition/settings.yaml | 59 + definition/statistics.yaml | 31 + definition/swagger.yaml | 18 + definition/tasks.yaml | 107 + definition/templates.yaml | 104 + definition/tickets.yaml | 1094 ++ definition/tickettype.yaml | 121 + definition/userdata.yaml | 94 + definition/users.yaml | 122 + dev/docker-compose.yml | 49 + dev/keycloak/realm.json | 1997 +++ dev/nginx.conf | 89 + docs/screenshots/automation.png | Bin 0 -> 254191 bytes docs/screenshots/cond_custom_1.png | Bin 0 -> 203852 bytes docs/screenshots/cond_custom_2.png | Bin 0 -> 202465 bytes .../conditional_custom_field_a.png | Bin 0 -> 9476 bytes .../conditional_custom_field_b.png | Bin 0 -> 8801 bytes docs/screenshots/details.png | Bin 0 -> 40432 bytes docs/screenshots/phishing_playbook.png | Bin 0 -> 25747 bytes docs/screenshots/playbooks.png | Bin 0 -> 201614 bytes docs/screenshots/playbooks_focus.png | Bin 0 -> 46562 bytes docs/screenshots/roles.png | Bin 0 -> 28104 bytes docs/screenshots/script.png | Bin 0 -> 83534 bytes docs/screenshots/template.png | Bin 0 -> 264037 bytes docs/screenshots/ticket.png | Bin 0 -> 254383 bytes docs/screenshots/user.png | Bin 0 -> 195282 bytes file.go | 95 + generate.sh | 37 + generated/caql/parser/caql_lexer.go | 517 + generated/caql/parser/caql_parser.go | 2526 +++ .../caql/parser/caqlparser_base_listener.go | 88 + generated/caql/parser/caqlparser_listener.go | 76 + generated/catalyst.json | 6646 ++++++++ generated/catalyst.yml | 7058 ++++++++ generated/community.json | 6067 +++++++ generated/community.yml | 6646 ++++++++ generated/models/models.go | 643 + generated/restapi/api.go | 252 + generated/restapi/api/response.go | 6 + generated/restapi/embedded_spec.go | 14076 ++++++++++++++++ .../create_automation_parameters.go | 90 + .../delete_automation_parameters.go | 87 + .../automations/get_automation_parameters.go | 87 + .../list_automations_parameters.go | 55 + .../update_automation_parameters.go | 111 + .../operations/jobs/get_job_parameters.go | 87 + .../operations/jobs/list_jobs_parameters.go | 55 + .../operations/jobs/run_job_parameters.go | 90 + .../operations/jobs/update_job_parameters.go | 111 + .../operations/logs/get_logs_parameters.go | 87 + .../playbooks/create_playbook_parameters.go | 90 + .../playbooks/delete_playbook_parameters.go | 87 + .../playbooks/get_playbook_parameters.go | 87 + .../playbooks/list_playbooks_parameters.go | 55 + .../playbooks/update_playbook_parameters.go | 111 + .../settings/get_settings_parameters.go | 55 + .../statistics/get_statistics_parameters.go | 55 + .../operations/tasks/list_tasks_parameters.go | 55 + .../templates/create_template_parameters.go | 90 + .../templates/delete_template_parameters.go | 87 + .../templates/get_template_parameters.go | 87 + .../templates/list_templates_parameters.go | 55 + .../templates/update_template_parameters.go | 111 + .../tickets/add_artifact_parameters.go | 116 + .../tickets/add_comment_parameters.go | 116 + .../tickets/add_ticket_playbook_parameters.go | 116 + .../tickets/complete_task_parameters.go | 157 + .../tickets/create_ticket_batch_parameters.go | 90 + .../tickets/create_ticket_parameters.go | 90 + .../tickets/delete_ticket_parameters.go | 92 + .../tickets/enrich_artifact_parameters.go | 137 + .../tickets/get_artifact_parameters.go | 113 + .../tickets/get_ticket_parameters.go | 92 + .../tickets/link_files_parameters.go | 116 + .../tickets/link_ticket_parameters.go | 115 + .../tickets/list_tickets_parameters.go | 269 + .../tickets/remove_artifact_parameters.go | 113 + .../tickets/remove_comment_parameters.go | 117 + .../remove_ticket_playbook_parameters.go | 113 + .../tickets/run_artifact_parameters.go | 134 + .../operations/tickets/run_task_parameters.go | 134 + .../tickets/set_artifact_parameters.go | 137 + .../tickets/set_references_parameters.go | 116 + .../tickets/set_schema_parameters.go | 106 + .../operations/tickets/set_task_parameters.go | 158 + .../tickets/unlink_ticket_parameters.go | 115 + .../tickets/update_ticket_parameters.go | 116 + .../create_ticket_type_parameters.go | 90 + .../delete_ticket_type_parameters.go | 87 + .../tickettypes/get_ticket_type_parameters.go | 87 + .../list_ticket_types_parameters.go | 55 + .../update_ticket_type_parameters.go | 111 + .../userdata/current_user_data_parameters.go | 55 + .../userdata/get_user_data_parameters.go | 87 + .../userdata/list_user_data_parameters.go | 55 + .../update_current_user_data_parameters.go | 90 + .../userdata/update_user_data_parameters.go | 111 + .../users/create_user_parameters.go | 90 + .../users/current_user_parameters.go | 55 + .../users/delete_user_parameters.go | 87 + .../operations/users/get_user_parameters.go | 87 + .../operations/users/list_users_parameters.go | 55 + .../users/update_user_parameters.go | 111 + generated/test/api_server_test.go | 675 + generator/generator.go | 342 + generator/swagger.go | 61 + generator/templates/api.gotmpl | 124 + generator/templates/api_server_test.gotmpl | 184 + generator/templates/parameter.gotmpl | 347 + generator/templates/response.gotmpl | 6 + generator/templates/simplemodel.gotmpl | 64 + go.mod | 66 + go.sum | 1724 ++ hooks/hooks.go | 52 + index/index.go | 80 + index/index_test.go | 83 + pointer/pointer.go | 19 + restore.go | 169 + role/role.go | 179 + server.go | 143 + service/artifact.go | 34 + service/automation.go | 28 + service/job.go | 29 + service/log.go | 14 + service/playbook.go | 53 + service/service.go | 51 + service/statistics.go | 11 + service/task.go | 11 + service/template.go | 28 + service/ticket.go | 52 + service/ticket_field.go | 74 + service/tickettype.go | 28 + service/uisettings.go | 46 + service/user.go | 38 + service/userdata.go | 39 + start_dev.sh | 20 + static.go | 24 + storage/storage.go | 71 + test/data.go | 93 + test/server_test.go | 104 + test/test.go | 213 + ui/.browserslistrc | 3 + ui/.eslintrc.js | 30 + ui/README.md | 27 + ui/babel.config.js | 5 + ui/jest.config.js | 3 + ui/package.json | 82 + ui/public/favicon.ico | Bin 0 -> 33310 bytes ui/public/flask.svg | 125 + ui/public/flask_white.svg | 130 + .../img/icons/android-chrome-192x192.png | Bin 0 -> 9609 bytes .../img/icons/android-chrome-512x512.png | Bin 0 -> 33814 bytes .../icons/android-chrome-maskable-192x192.png | Bin 0 -> 9609 bytes .../icons/android-chrome-maskable-512x512.png | Bin 0 -> 33814 bytes .../img/icons/apple-touch-icon-120x120.png | Bin 0 -> 5631 bytes .../img/icons/apple-touch-icon-152x152.png | Bin 0 -> 7497 bytes .../img/icons/apple-touch-icon-180x180.png | Bin 0 -> 9004 bytes .../img/icons/apple-touch-icon-60x60.png | Bin 0 -> 2473 bytes .../img/icons/apple-touch-icon-76x76.png | Bin 0 -> 3285 bytes ui/public/img/icons/apple-touch-icon.png | Bin 0 -> 9004 bytes ui/public/img/icons/favicon-16x16.png | Bin 0 -> 601 bytes ui/public/img/icons/favicon-32x32.png | Bin 0 -> 1273 bytes .../img/icons/msapplication-icon-144x144.png | Bin 0 -> 7043 bytes ui/public/img/icons/mstile-150x150.png | Bin 0 -> 7326 bytes ui/public/img/icons/safari-pinned-tab.svg | 130 + ui/public/index.html | 19 + ui/public/manifest.json | 76 + ui/public/silent-renew-oidc.html | 9 + ui/src/App.vue | 248 + ui/src/client/.npmignore | 1 + ui/src/client/api.ts | 8104 +++++++++ ui/src/client/base.ts | 71 + ui/src/client/common.ts | 138 + ui/src/client/configuration.ts | 101 + ui/src/client/index.ts | 18 + .../components/AdvancedJSONSchemaEditor.vue | 195 + ui/src/components/AppLink.vue | 64 + ui/src/components/Editor.vue | 115 + ui/src/components/JSONHTML.vue | 20 + ui/src/components/List.vue | 153 + ui/src/components/TicketList.vue | 325 + ui/src/components/Timeline.vue | 139 + ui/src/components/UserDataEditor.vue | 173 + ui/src/components/VJsfCropImg.vue | 85 + ui/src/components/charts/Bar.ts | 20 + ui/src/components/charts/Doughnut.ts | 20 + ui/src/components/charts/Line.ts | 20 + ui/src/components/icons/ArangoIcon.vue | 34 + ui/src/components/icons/EmitterIcon.vue | 31 + ui/src/components/icons/MinioIcon.vue | 22 + ui/src/components/icons/NodeRedIcon.vue | 43 + .../components/snippets/ArtifactSnippet.vue | 64 + ui/src/components/snippets/IDSnippet.vue | 60 + ui/src/components/snippets/TicketSnippet.vue | 91 + ui/src/main.ts | 86 + ui/src/plugins/vuetify.ts | 90 + ui/src/registerServiceWorker.ts | 34 + ui/src/router/index.ts | 236 + ui/src/sass/variables.scss.bak | 29 + ui/src/services/api.ts | 78 + ui/src/shims-tsx.d.ts | 13 + ui/src/shims-vue.d.ts | 22 + ui/src/store/index.ts | 104 + ui/src/store/modules/socket.ts | 64 + ui/src/store/modules/templates.ts | 75 + ui/src/suggestions/grammar/CAQLLexer.interp | 282 + ui/src/suggestions/grammar/CAQLLexer.js | 607 + ui/src/suggestions/grammar/CAQLLexer.tokens | 103 + ui/src/suggestions/grammar/CAQLParser.interp | 178 + ui/src/suggestions/grammar/CAQLParser.js | 1866 ++ ui/src/suggestions/grammar/CAQLParser.tokens | 103 + .../suggestions/grammar/CAQLParserListener.js | 108 + ui/src/suggestions/grammar/RQLLexer.interp | 282 + ui/src/suggestions/grammar/RQLLexer.js | 607 + ui/src/suggestions/grammar/RQLLexer.tokens | 103 + ui/src/suggestions/grammar/RQLParser.interp | 178 + ui/src/suggestions/grammar/RQLParser.js | 1866 ++ ui/src/suggestions/grammar/RQLParser.tokens | 103 + .../suggestions/grammar/RQLParserListener.js | 108 + ui/src/suggestions/suggestions.ts | 46 + ui/src/types/types.ts | 17 + ui/src/views/API.vue | 48 + ui/src/views/ArtifactPopup.vue | 264 + ui/src/views/Automation.vue | 131 + ui/src/views/AutomationList.vue | 64 + ui/src/views/Dashboard.vue | 219 + ui/src/views/Graph.vue | 217 + ui/src/views/Group.vue | 13 + ui/src/views/GroupList.vue | 62 + ui/src/views/Job.vue | 186 + ui/src/views/JobList.vue | 61 + ui/src/views/Playbook.vue | 311 + ui/src/views/PlaybookList.vue | 66 + ui/src/views/Profile.vue | 47 + ui/src/views/Rule.vue | 89 + ui/src/views/RuleList.vue | 63 + ui/src/views/TaskList.vue | 85 + ui/src/views/Template.vue | 87 + ui/src/views/TemplateList.vue | 50 + ui/src/views/Ticket.vue | 1626 ++ ui/src/views/TicketList.vue | 30 + ui/src/views/TicketNew.vue | 170 + ui/src/views/TicketType.vue | 126 + ui/src/views/TicketTypeList.vue | 64 + ui/src/views/User.vue | 105 + ui/src/views/UserData.vue | 44 + ui/src/views/UserDataList.vue | 60 + ui/src/views/UserList.vue | 66 + ui/src/views/embed/Arango.vue | 21 + ui/src/views/embed/Emitter.vue | 21 + ui/src/views/embed/Minio.vue | 21 + ui/src/views/embed/Nodered.vue | 21 + ui/tsconfig.json | 49 + ui/ui.go | 6 + ui/ui_test.go | 21 + ui/vue.config.js | 29 + ui/yarn.lock | 13107 ++++++++++++++ version.go | 13 + websocket.go | 84 + 339 files changed, 111677 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 LICENSE.md create mode 100644 NOTICE create mode 100644 README.md create mode 100644 VERSION create mode 100644 auth.go create mode 100644 automation/automation.go create mode 100644 automation/docker.go create mode 100644 automation/job.go create mode 100644 automation/result.go create mode 100644 backup.go create mode 100644 bus/bus.go create mode 100644 caql/blevebuilder.go create mode 100644 caql/blevebuilder_test.go create mode 100644 caql/builder.go create mode 100644 caql/errors.go create mode 100644 caql/function.go create mode 100644 caql/function_test.go create mode 100644 caql/interpreter.go create mode 100644 caql/operations.go create mode 100644 caql/parser.go create mode 100644 caql/rql_test.go create mode 100644 caql/set.go create mode 100644 caql/set_test.go create mode 100644 caql/unquote.go create mode 100644 caql/unquote_test.go create mode 100644 caql/wildcard.go create mode 100644 caql/wildcard_test.go create mode 100644 cmd/catalyst-dev/main.go create mode 100644 cmd/catalyst/main.go create mode 100644 cmd/cmd.go create mode 100644 dag/dag.go create mode 100644 dag/dag_test.go create mode 100644 database/artifact.go create mode 100644 database/automation.go create mode 100644 database/busdb/busdb.go create mode 100644 database/busdb/context.go create mode 100644 database/busdb/keyed.go create mode 100644 database/busdb/log.go create mode 100644 database/db.go create mode 100644 database/job.go create mode 100644 database/migrations/automations/comment.py create mode 100755 database/migrations/automations/hash.sha1.py create mode 100644 database/migrations/automations/thehive.py create mode 100644 database/migrations/automations/vt.hash.py create mode 100644 database/migrations/content.go create mode 100644 database/migrations/migrations.go create mode 100644 database/migrations/playbooks/malware.yml create mode 100644 database/migrations/playbooks/phishing.yml create mode 100644 database/migrations/playbooks/simple.yaml create mode 100644 database/migrations/templates/advanced.json create mode 100644 database/migrations/templates/default.json create mode 100644 database/migrations/templates/veris.json create mode 100644 database/playbook.go create mode 100644 database/playbookutils.go create mode 100644 database/playbookutils_test.go create mode 100644 database/relationships.go create mode 100644 database/settings.go create mode 100644 database/settings_test.go create mode 100644 database/statistics.go create mode 100644 database/task.go create mode 100644 database/template.go create mode 100644 database/template_test.go create mode 100644 database/ticket.go create mode 100644 database/ticket_field.go create mode 100644 database/ticket_task.go create mode 100644 database/tickettype.go create mode 100644 database/user.go create mode 100644 definition/CAQLLexer.g4 create mode 100644 definition/CAQLParser.g4 create mode 100644 definition/artifacts.yaml create mode 100644 definition/automation.yaml create mode 100644 definition/enterprise/graph.yaml create mode 100644 definition/enterprise/groups.yaml create mode 100644 definition/enterprise/rules.yaml create mode 100644 definition/jobs.yaml create mode 100644 definition/logs.yaml create mode 100644 definition/playbooks.yaml create mode 100644 definition/settings.yaml create mode 100644 definition/statistics.yaml create mode 100644 definition/swagger.yaml create mode 100644 definition/tasks.yaml create mode 100644 definition/templates.yaml create mode 100644 definition/tickets.yaml create mode 100644 definition/tickettype.yaml create mode 100644 definition/userdata.yaml create mode 100644 definition/users.yaml create mode 100644 dev/docker-compose.yml create mode 100644 dev/keycloak/realm.json create mode 100644 dev/nginx.conf create mode 100644 docs/screenshots/automation.png create mode 100644 docs/screenshots/cond_custom_1.png create mode 100644 docs/screenshots/cond_custom_2.png create mode 100644 docs/screenshots/conditional_custom_field_a.png create mode 100644 docs/screenshots/conditional_custom_field_b.png create mode 100644 docs/screenshots/details.png create mode 100644 docs/screenshots/phishing_playbook.png create mode 100644 docs/screenshots/playbooks.png create mode 100644 docs/screenshots/playbooks_focus.png create mode 100644 docs/screenshots/roles.png create mode 100644 docs/screenshots/script.png create mode 100644 docs/screenshots/template.png create mode 100644 docs/screenshots/ticket.png create mode 100644 docs/screenshots/user.png create mode 100644 file.go create mode 100644 generate.sh create mode 100644 generated/caql/parser/caql_lexer.go create mode 100644 generated/caql/parser/caql_parser.go create mode 100644 generated/caql/parser/caqlparser_base_listener.go create mode 100644 generated/caql/parser/caqlparser_listener.go create mode 100644 generated/catalyst.json create mode 100644 generated/catalyst.yml create mode 100644 generated/community.json create mode 100644 generated/community.yml create mode 100755 generated/models/models.go create mode 100644 generated/restapi/api.go create mode 100644 generated/restapi/api/response.go create mode 100644 generated/restapi/embedded_spec.go create mode 100644 generated/restapi/operations/automations/create_automation_parameters.go create mode 100644 generated/restapi/operations/automations/delete_automation_parameters.go create mode 100644 generated/restapi/operations/automations/get_automation_parameters.go create mode 100644 generated/restapi/operations/automations/list_automations_parameters.go create mode 100644 generated/restapi/operations/automations/update_automation_parameters.go create mode 100644 generated/restapi/operations/jobs/get_job_parameters.go create mode 100644 generated/restapi/operations/jobs/list_jobs_parameters.go create mode 100644 generated/restapi/operations/jobs/run_job_parameters.go create mode 100644 generated/restapi/operations/jobs/update_job_parameters.go create mode 100644 generated/restapi/operations/logs/get_logs_parameters.go create mode 100644 generated/restapi/operations/playbooks/create_playbook_parameters.go create mode 100644 generated/restapi/operations/playbooks/delete_playbook_parameters.go create mode 100644 generated/restapi/operations/playbooks/get_playbook_parameters.go create mode 100644 generated/restapi/operations/playbooks/list_playbooks_parameters.go create mode 100644 generated/restapi/operations/playbooks/update_playbook_parameters.go create mode 100644 generated/restapi/operations/settings/get_settings_parameters.go create mode 100644 generated/restapi/operations/statistics/get_statistics_parameters.go create mode 100644 generated/restapi/operations/tasks/list_tasks_parameters.go create mode 100644 generated/restapi/operations/templates/create_template_parameters.go create mode 100644 generated/restapi/operations/templates/delete_template_parameters.go create mode 100644 generated/restapi/operations/templates/get_template_parameters.go create mode 100644 generated/restapi/operations/templates/list_templates_parameters.go create mode 100644 generated/restapi/operations/templates/update_template_parameters.go create mode 100644 generated/restapi/operations/tickets/add_artifact_parameters.go create mode 100644 generated/restapi/operations/tickets/add_comment_parameters.go create mode 100644 generated/restapi/operations/tickets/add_ticket_playbook_parameters.go create mode 100644 generated/restapi/operations/tickets/complete_task_parameters.go create mode 100644 generated/restapi/operations/tickets/create_ticket_batch_parameters.go create mode 100644 generated/restapi/operations/tickets/create_ticket_parameters.go create mode 100644 generated/restapi/operations/tickets/delete_ticket_parameters.go create mode 100644 generated/restapi/operations/tickets/enrich_artifact_parameters.go create mode 100644 generated/restapi/operations/tickets/get_artifact_parameters.go create mode 100644 generated/restapi/operations/tickets/get_ticket_parameters.go create mode 100644 generated/restapi/operations/tickets/link_files_parameters.go create mode 100644 generated/restapi/operations/tickets/link_ticket_parameters.go create mode 100644 generated/restapi/operations/tickets/list_tickets_parameters.go create mode 100644 generated/restapi/operations/tickets/remove_artifact_parameters.go create mode 100644 generated/restapi/operations/tickets/remove_comment_parameters.go create mode 100644 generated/restapi/operations/tickets/remove_ticket_playbook_parameters.go create mode 100644 generated/restapi/operations/tickets/run_artifact_parameters.go create mode 100644 generated/restapi/operations/tickets/run_task_parameters.go create mode 100644 generated/restapi/operations/tickets/set_artifact_parameters.go create mode 100644 generated/restapi/operations/tickets/set_references_parameters.go create mode 100644 generated/restapi/operations/tickets/set_schema_parameters.go create mode 100644 generated/restapi/operations/tickets/set_task_parameters.go create mode 100644 generated/restapi/operations/tickets/unlink_ticket_parameters.go create mode 100644 generated/restapi/operations/tickets/update_ticket_parameters.go create mode 100644 generated/restapi/operations/tickettypes/create_ticket_type_parameters.go create mode 100644 generated/restapi/operations/tickettypes/delete_ticket_type_parameters.go create mode 100644 generated/restapi/operations/tickettypes/get_ticket_type_parameters.go create mode 100644 generated/restapi/operations/tickettypes/list_ticket_types_parameters.go create mode 100644 generated/restapi/operations/tickettypes/update_ticket_type_parameters.go create mode 100644 generated/restapi/operations/userdata/current_user_data_parameters.go create mode 100644 generated/restapi/operations/userdata/get_user_data_parameters.go create mode 100644 generated/restapi/operations/userdata/list_user_data_parameters.go create mode 100644 generated/restapi/operations/userdata/update_current_user_data_parameters.go create mode 100644 generated/restapi/operations/userdata/update_user_data_parameters.go create mode 100644 generated/restapi/operations/users/create_user_parameters.go create mode 100644 generated/restapi/operations/users/current_user_parameters.go create mode 100644 generated/restapi/operations/users/delete_user_parameters.go create mode 100644 generated/restapi/operations/users/get_user_parameters.go create mode 100644 generated/restapi/operations/users/list_users_parameters.go create mode 100644 generated/restapi/operations/users/update_user_parameters.go create mode 100644 generated/test/api_server_test.go create mode 100644 generator/generator.go create mode 100644 generator/swagger.go create mode 100644 generator/templates/api.gotmpl create mode 100644 generator/templates/api_server_test.gotmpl create mode 100644 generator/templates/parameter.gotmpl create mode 100644 generator/templates/response.gotmpl create mode 100644 generator/templates/simplemodel.gotmpl create mode 100644 go.mod create mode 100644 go.sum create mode 100644 hooks/hooks.go create mode 100644 index/index.go create mode 100644 index/index_test.go create mode 100644 pointer/pointer.go create mode 100644 restore.go create mode 100644 role/role.go create mode 100644 server.go create mode 100644 service/artifact.go create mode 100644 service/automation.go create mode 100644 service/job.go create mode 100644 service/log.go create mode 100644 service/playbook.go create mode 100644 service/service.go create mode 100644 service/statistics.go create mode 100644 service/task.go create mode 100644 service/template.go create mode 100644 service/ticket.go create mode 100644 service/ticket_field.go create mode 100644 service/tickettype.go create mode 100644 service/uisettings.go create mode 100644 service/user.go create mode 100644 service/userdata.go create mode 100644 start_dev.sh create mode 100644 static.go create mode 100644 storage/storage.go create mode 100644 test/data.go create mode 100644 test/server_test.go create mode 100644 test/test.go create mode 100644 ui/.browserslistrc create mode 100644 ui/.eslintrc.js create mode 100644 ui/README.md create mode 100644 ui/babel.config.js create mode 100644 ui/jest.config.js create mode 100644 ui/package.json create mode 100644 ui/public/favicon.ico create mode 100644 ui/public/flask.svg create mode 100644 ui/public/flask_white.svg create mode 100644 ui/public/img/icons/android-chrome-192x192.png create mode 100644 ui/public/img/icons/android-chrome-512x512.png create mode 100644 ui/public/img/icons/android-chrome-maskable-192x192.png create mode 100644 ui/public/img/icons/android-chrome-maskable-512x512.png create mode 100644 ui/public/img/icons/apple-touch-icon-120x120.png create mode 100644 ui/public/img/icons/apple-touch-icon-152x152.png create mode 100644 ui/public/img/icons/apple-touch-icon-180x180.png create mode 100644 ui/public/img/icons/apple-touch-icon-60x60.png create mode 100644 ui/public/img/icons/apple-touch-icon-76x76.png create mode 100644 ui/public/img/icons/apple-touch-icon.png create mode 100644 ui/public/img/icons/favicon-16x16.png create mode 100644 ui/public/img/icons/favicon-32x32.png create mode 100644 ui/public/img/icons/msapplication-icon-144x144.png create mode 100644 ui/public/img/icons/mstile-150x150.png create mode 100644 ui/public/img/icons/safari-pinned-tab.svg create mode 100644 ui/public/index.html create mode 100644 ui/public/manifest.json create mode 100644 ui/public/silent-renew-oidc.html create mode 100644 ui/src/App.vue create mode 100644 ui/src/client/.npmignore create mode 100644 ui/src/client/api.ts create mode 100644 ui/src/client/base.ts create mode 100644 ui/src/client/common.ts create mode 100644 ui/src/client/configuration.ts create mode 100644 ui/src/client/index.ts create mode 100644 ui/src/components/AdvancedJSONSchemaEditor.vue create mode 100644 ui/src/components/AppLink.vue create mode 100644 ui/src/components/Editor.vue create mode 100644 ui/src/components/JSONHTML.vue create mode 100644 ui/src/components/List.vue create mode 100644 ui/src/components/TicketList.vue create mode 100644 ui/src/components/Timeline.vue create mode 100644 ui/src/components/UserDataEditor.vue create mode 100644 ui/src/components/VJsfCropImg.vue create mode 100644 ui/src/components/charts/Bar.ts create mode 100644 ui/src/components/charts/Doughnut.ts create mode 100644 ui/src/components/charts/Line.ts create mode 100644 ui/src/components/icons/ArangoIcon.vue create mode 100644 ui/src/components/icons/EmitterIcon.vue create mode 100644 ui/src/components/icons/MinioIcon.vue create mode 100644 ui/src/components/icons/NodeRedIcon.vue create mode 100644 ui/src/components/snippets/ArtifactSnippet.vue create mode 100644 ui/src/components/snippets/IDSnippet.vue create mode 100644 ui/src/components/snippets/TicketSnippet.vue create mode 100644 ui/src/main.ts create mode 100644 ui/src/plugins/vuetify.ts create mode 100644 ui/src/registerServiceWorker.ts create mode 100644 ui/src/router/index.ts create mode 100644 ui/src/sass/variables.scss.bak create mode 100644 ui/src/services/api.ts create mode 100644 ui/src/shims-tsx.d.ts create mode 100644 ui/src/shims-vue.d.ts create mode 100644 ui/src/store/index.ts create mode 100644 ui/src/store/modules/socket.ts create mode 100644 ui/src/store/modules/templates.ts create mode 100644 ui/src/suggestions/grammar/CAQLLexer.interp create mode 100644 ui/src/suggestions/grammar/CAQLLexer.js create mode 100644 ui/src/suggestions/grammar/CAQLLexer.tokens create mode 100644 ui/src/suggestions/grammar/CAQLParser.interp create mode 100644 ui/src/suggestions/grammar/CAQLParser.js create mode 100644 ui/src/suggestions/grammar/CAQLParser.tokens create mode 100644 ui/src/suggestions/grammar/CAQLParserListener.js create mode 100644 ui/src/suggestions/grammar/RQLLexer.interp create mode 100644 ui/src/suggestions/grammar/RQLLexer.js create mode 100644 ui/src/suggestions/grammar/RQLLexer.tokens create mode 100644 ui/src/suggestions/grammar/RQLParser.interp create mode 100644 ui/src/suggestions/grammar/RQLParser.js create mode 100644 ui/src/suggestions/grammar/RQLParser.tokens create mode 100644 ui/src/suggestions/grammar/RQLParserListener.js create mode 100644 ui/src/suggestions/suggestions.ts create mode 100644 ui/src/types/types.ts create mode 100644 ui/src/views/API.vue create mode 100644 ui/src/views/ArtifactPopup.vue create mode 100644 ui/src/views/Automation.vue create mode 100644 ui/src/views/AutomationList.vue create mode 100644 ui/src/views/Dashboard.vue create mode 100644 ui/src/views/Graph.vue create mode 100644 ui/src/views/Group.vue create mode 100644 ui/src/views/GroupList.vue create mode 100644 ui/src/views/Job.vue create mode 100644 ui/src/views/JobList.vue create mode 100644 ui/src/views/Playbook.vue create mode 100644 ui/src/views/PlaybookList.vue create mode 100644 ui/src/views/Profile.vue create mode 100644 ui/src/views/Rule.vue create mode 100644 ui/src/views/RuleList.vue create mode 100644 ui/src/views/TaskList.vue create mode 100644 ui/src/views/Template.vue create mode 100644 ui/src/views/TemplateList.vue create mode 100644 ui/src/views/Ticket.vue create mode 100644 ui/src/views/TicketList.vue create mode 100644 ui/src/views/TicketNew.vue create mode 100644 ui/src/views/TicketType.vue create mode 100644 ui/src/views/TicketTypeList.vue create mode 100644 ui/src/views/User.vue create mode 100644 ui/src/views/UserData.vue create mode 100644 ui/src/views/UserDataList.vue create mode 100644 ui/src/views/UserList.vue create mode 100644 ui/src/views/embed/Arango.vue create mode 100644 ui/src/views/embed/Emitter.vue create mode 100644 ui/src/views/embed/Minio.vue create mode 100644 ui/src/views/embed/Nodered.vue create mode 100644 ui/tsconfig.json create mode 100644 ui/ui.go create mode 100644 ui/ui_test.go create mode 100644 ui/vue.config.js create mode 100644 ui/yarn.lock create mode 100644 version.go create mode 100644 websocket.go diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..6dcc315 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,93 @@ +name: CI +on: + push: { branches: [ main ] } + pull_request: + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + test: + name: Test + runs-on: ubuntu-latest + env: { GIN_MODE: test } + steps: + - uses: actions/setup-go@v2 + with: { go-version: '1.17' } + - uses: actions/setup-node@v2 + with: { node-version: '14' } + - uses: actions/checkout@v2 + - run: | + mkdir -p ui/dist/img + touch ui/dist/index.html ui/dist/favicon.ico ui/dist/manifest.json ui/dist/img/fake.png + - run: docker-compose up -d + working-directory: dev + - name: Install ArangoDB + run: | + curl -OL https://download.arangodb.com/arangodb34/DEBIAN/Release.key + sudo apt-key add Release.key + sudo apt-add-repository 'deb https://download.arangodb.com/arangodb34/DEBIAN/ /' + sudo apt-get update -y && sudo apt-get -y install arangodb3 + - run: go test -coverprofile=cover.out -coverpkg=./... ./... + - run: go tool cover -func=cover.out + + build-npm: + name: Build npm + runs-on: ubuntu-latest + steps: + - uses: actions/setup-node@v2 + with: { node-version: '14' } + - uses: actions/checkout@v2 + - run: yarn install && yarn build + working-directory: ui + - uses: actions/upload-artifact@v2 + with: { name: ui, path: ui/dist, retention-days: 1 } + + build: + name: Build + runs-on: ubuntu-latest + needs: [ build-npm, test ] + steps: + - uses: actions/setup-go@v2 + with: { go-version: '1.17' } + - uses: actions/checkout@v2 + - uses: actions/download-artifact@v2 + with: { name: ui, path: ui/dist } + - run: go build -o catalyst ./cmd/catalyst/. + - uses: docker/login-action@v1 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Version + if: ${{ github.ref != '' }} + run: | + echo ${{ github.ref }} + echo ${{ github.ref }} > VERSION + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v3 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + - uses: docker/build-push-action@v2 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + + # deploy: + # name: Deploy + # runs-on: self-hosted + # needs: [ build ] + # steps: + # - uses: actions/checkout@v2 + # - uses: docker/login-action@v1 + # with: + # registry: ${{ env.REGISTRY }} + # username: ${{ github.actor }} + # password: ${{ secrets.GITHUB_TOKEN }} + # - run: docker-compose -f docker-compose.yml -f docker-compose.demo.yml pull + # - run: docker-compose -f docker-compose.yml -f docker-compose.demo.yml up -d --remove-orphans --force-recreate + # - run: docker-compose -f docker-compose.yml -f docker-compose.demo.yml restart diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..db5a5bf --- /dev/null +++ b/.gitignore @@ -0,0 +1,86 @@ +.idea +.antlr + +.DS_Store +uploads +gen + +*.bleve + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*,cover +.hypothesis/ +venv/ +.venv/ +.python-version +.pytest_cache + +# Translations +*.mo +*.pot + +# Django stuff: +*.log + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +#Ipython Notebook +.ipynb_checkpoints + +# npm +wwwroot/*.js +typings +dist +node_modules + +profile.cov + +generated/caql/parser/*.interp +generated/caql/parser/*.tokens diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0215c30 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +FROM ubuntu:18.04 + +RUN apt-get update -y && apt-get -y install curl gnupg2 software-properties-common +RUN curl -OL https://download.arangodb.com/arangodb34/DEBIAN/Release.key +RUN apt-key add Release.key +RUN apt-add-repository 'deb https://download.arangodb.com/arangodb34/DEBIAN/ /' +RUN apt-get update -y && apt-get -y install arangodb3 + +COPY catalyst /app/catalyst +CMD /app/catalyst + +EXPOSE 8000 diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..f2e44fe --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,104 @@ +Copyright (c) 2021-present Jonas Plum + +Portions of this software are licensed as follows: + +* All third party components incorporated into Catalyst are licensed under the + original license provided by the owner of the applicable component. Those + files contain a license notice on top of the file and are listed in the + [NOTICE](NOTICE) file. +* Content outside of the above mentioned files above is + available under the "Elastic License 2.0" license as defined below. + +# Elastic License 2.0 + +URL: https://www.elastic.co/licensing/elastic-license + +## Acceptance + +By using the software, you agree to all of the terms and conditions below. + +## Copyright License + +The licensor grants you a non-exclusive, royalty-free, worldwide, +non-sublicensable, non-transferable license to use, copy, distribute, make +available, and prepare derivative works of the software, in each case subject to +the limitations and conditions below. + +## Limitations + +You may not provide the software to third parties as a hosted or managed +service, where the service provides users with access to any substantial set of +the features or functionality of the software. + +You may not move, change, disable, or circumvent the license key functionality +in the software, and you may not remove or obscure any functionality in the +software that is protected by the license key. + +You may not alter, remove, or obscure any licensing, copyright, or other notices +of the licensor in the software. Any use of the licensor’s trademarks is subject +to applicable law. + +## Patents + +The licensor grants you a license, under any patent claims the licensor can +license, or becomes able to license, to make, have made, use, sell, offer for +sale, import and have imported the software, in each case subject to the +limitations and conditions in this license. This license does not cover any +patent claims that you cause to be infringed by modifications or additions to +the software. If you or your company make any written claim that the software +infringes or contributes to infringement of any patent, your patent license for +the software granted under these terms ends immediately. If your company makes +such a claim, your patent license ends immediately for work on behalf of your +company. + +## Notices + +You must ensure that anyone who gets a copy of any part of the software from you +also gets a copy of these terms. + +If you modify the software, you must include in any modified copies of the +software prominent notices stating that you have modified the software. + +## No Other Rights + +These terms do not imply any licenses other than those expressly granted in +these terms. + +## Termination + +If you use the software in violation of these terms, such use is not licensed, +and your licenses will automatically terminate. If the licensor provides you +with a notice of your violation, and you cease all violation of this license no +later than 30 days after you receive that notice, your licenses will be +reinstated retroactively. However, if you violate these terms after such +reinstatement, any additional violation of these terms will cause your licenses +to terminate automatically and permanently. + +## No Liability + +*As far as the law allows, the software comes as is, without any warranty or +condition, and the licensor will not be liable to you for any damages arising +out of these terms or the use or nature of the software, under any kind of +legal claim.* + +## Definitions + +The **licensor** is the entity offering these terms, and the **software** is the +software the licensor makes available under these terms, including any portion +of it. + +**you** refers to the individual or entity agreeing to these terms. + +**your company** is any legal entity, sole proprietorship, or other kind of +organization that you work for, plus all organizations that have control over, +are under the control of, or are under common control with that +organization. **control** means ownership of substantially all the assets of an +entity, or the power to direct its management and policies by vote, contract, or +otherwise. Control can be direct or indirect. + +**your licenses** are all the licenses granted to you for the software under +these terms. + +**use** means anything you do with the software requiring one of your licenses. + +**trademark** means trademarks, service marks, and similar rights. diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..3172bf2 --- /dev/null +++ b/NOTICE @@ -0,0 +1,16 @@ +The following components are included in this product: + +Badgerodon Collections +https://github.com/badgerodon/collections +Copyright (c) 2012 Caleb Doxsey +Licensed under the MIT License + +go-toposort +https://github.com/philopon/go-toposort +Copyright (c) 2017 Hirotomo Moriwaki +Licensed under the MIT License + +The Go programming language +https://go.dev/ +Copyright (c) 2009 The Go Authors +See https://go.dev/LICENSE for license details. diff --git a/README.md b/README.md new file mode 100644 index 0000000..7f02e7c --- /dev/null +++ b/README.md @@ -0,0 +1,78 @@ +

+ Screenshot of the playbook part of a ticket + Catalyst

+

Speed up your reactions

+

+Website +- +The Catalyst Handbook (Documentation) +- +Try online (user: bob, password: bob) +

+ +Catalyst is an incident response platform or SOAR (Security Orchestration, Automation and Response) system. It can help +you to automate your alert handling and incident response procedures. + +## Features + +### Ticket (Alert & Incident) Management + +![Screenshot of a ticket](docs/screenshots/ticket.png) + +Tickets are the core of Catalyst. They represent alerts, incidents, forensics +investigations, threat hunts or any other event you want to handle in your +organisation. + +## Ticket Templates + +
+ Screenshot of the playbook part of a ticket +
+ +Templates define the custom information for tickets. The core information for +tickets like title, creation date or closing status is kept quite minimal and other +information like criticality, description or MITRE ATT&CK information can be +added individually. + +## Conditional Custom Fields + +
+ Screenshot of the playbook part of a ticket + Screenshot of the playbook part of a ticket +
+ +Custom Fields can be dependent on each other. So if you, for example choose +"malware" as an incident type a custom field ask you to define it further as +ransomware, worm, etc. which a "phishing" incident would ask for the number +of received mails in that campaign. + +## Playbooks + +
+ Screenshot of the playbook part of a ticket +
+ +Playbooks represent processes that can be attached to tickets. Playbooks can +contain manual and automated tasks. Complex workflows with different workflow +branches, parallel tasks and task dependencies can be modeled. + +## Automations + +
+ Screenshot of the playbook part of a ticket +
+ +Automations are scripts that automate tasks or enrich artifacts. Automations are +run in their own Docker containers. This enables them to be created in different +scripting languages and run securely in their own environment. + +## Users + +
+ Screenshot of the playbook part of a ticket +
+ +Catalyst has two different types of users, normal users accessing the platform +via OIDC authentication and API keys for external script. A +fine-grained access model is available for both types and allows to define +possible actions for each user. diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..cb676de --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.0.0-dev diff --git a/auth.go b/auth.go new file mode 100644 index 0000000..be32591 --- /dev/null +++ b/auth.go @@ -0,0 +1,403 @@ +package catalyst + +import ( + "context" + "crypto/sha256" + "encoding/base64" + "fmt" + "log" + "math/rand" + "net/http" + "strings" + "time" + + "github.com/coreos/go-oidc/v3/oidc" + "github.com/gin-contrib/sessions" + "github.com/gin-gonic/gin" + "golang.org/x/oauth2" + + "github.com/SecurityBrewery/catalyst/database" + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/hooks" + "github.com/SecurityBrewery/catalyst/role" +) + +type AuthConfig struct { + OIDCIssuer string + OAuth2 *oauth2.Config + + OIDCClaimUsername string + OIDCClaimEmail string + // OIDCClaimGroups string + OIDCClaimName string + AuthBlockNew bool + AuthDefaultRoles []role.Role + + provider *oidc.Provider +} + +func (c *AuthConfig) Verifier(ctx context.Context) (*oidc.IDTokenVerifier, error) { + if c.provider == nil { + err := c.Load(ctx) + if err != nil { + return nil, err + } + } + return c.provider.Verifier(&oidc.Config{SkipClientIDCheck: true}), nil +} + +func (c *AuthConfig) Load(ctx context.Context) error { + provider, err := oidc.NewProvider(ctx, c.OIDCIssuer) + if err != nil { + return err + } + c.provider = provider + c.OAuth2.Endpoint = provider.Endpoint() + + return nil +} + +const ( + SessionName = "catalyst-session" + stateSession = "state" + userSession = "user" +) + +func Authenticate(db *database.Database, config *AuthConfig) gin.HandlerFunc { + return func(ctx *gin.Context) { + iss := config.OIDCIssuer + + keyHeader := ctx.Request.Header.Get("PRIVATE-TOKEN") + if keyHeader != "" { + keyAuth(db, keyHeader)(ctx) + return + } + + authHeader := ctx.Request.Header.Get("User") + + if authHeader != "" { + bearerAuth(db, authHeader, iss, config)(ctx) + return + } + sessionAuth(db, config)(ctx) + } +} + +func oidcCtx(ctx *gin.Context) (context.Context, context.CancelFunc) { + /* + if config.TLSCertFile != "" && config.TLSKeyFile != "" { + cert, err := tls.LoadX509KeyPair(config.TLSCertFile, config.TLSKeyFile) + if err != nil { + return nil, err + } + + rootCAs, _ := x509.SystemCertPool() + if rootCAs == nil { + rootCAs = x509.NewCertPool() + } + for _, c := range cert.Certificate { + rootCAs.AppendCertsFromPEM(c) + } + + return oidc.ClientContext(ctx, &http.Client{ + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{ + RootCAs: rootCAs, + InsecureSkipVerify: true, + }, + }, + }), nil + } + */ + cctx, cancel := context.WithTimeout(ctx, time.Minute) + return cctx, cancel +} + +func bearerAuth(db *database.Database, authHeader string, iss string, config *AuthConfig) func(ctx *gin.Context) { + return func(ctx *gin.Context) { + if !strings.HasPrefix(authHeader, "Bearer ") { + ctx.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "no bearer token"}) + return + } + + oidcCtx, cancel := oidcCtx(ctx) + defer cancel() + + verifier, err := config.Verifier(oidcCtx) + if err != nil { + ctx.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "could not verify: " + err.Error()}) + return + } + authToken, err := verifier.Verify(oidcCtx, authHeader[7:]) + if err != nil { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("could not verify bearer token: %v", err)}) + return + } + + var claims map[string]interface{} + if err := authToken.Claims(&claims); err != nil { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("failed to parse claims: %v", err)}) + return + } + + // if claims.Iss != iss { + // ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "wrong issuer"}) + // return + // } + + session := sessions.Default(ctx) + session.Set(userSession, claims) + if err = session.Save(); err != nil { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, fmt.Sprintf("could not set session: %v", err)) + return + } + + if err = setContextClaims(ctx, db, claims, config); err != nil { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("could not load user: %s", err)}) + return + } + ctx.Next() + } +} + +func keyAuth(db *database.Database, keyHeader string) func(ctx *gin.Context) { + return func(ctx *gin.Context) { + h := fmt.Sprintf("%x", sha256.Sum256([]byte(keyHeader))) + + key, err := db.UserByHash(ctx, h) + if err != nil { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("could not verify private token: %v", err)}) + return + } + + setContextUser(ctx, key, db.Hooks) + + ctx.Next() + } +} + +func sessionAuth(db *database.Database, config *AuthConfig) func(ctx *gin.Context) { + return func(ctx *gin.Context) { + session := sessions.Default(ctx) + + user := session.Get(userSession) + if user == nil { + redirectToLogin(ctx, session, config.OAuth2) + + return + } + + claims, ok := user.(map[string]interface{}) + if !ok { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "claims not in session"}) + return + } + + if err := setContextClaims(ctx, db, claims, config); err != nil { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("could not load user: %s", err)}) + return + } + + ctx.Next() + } +} + +func setContextClaims(ctx *gin.Context, db *database.Database, claims map[string]interface{}, config *AuthConfig) error { + newUser, newSetting, err := mapUserAndSettings(claims, config) + if err != nil { + return err + } + + if _, ok := busdb.UserFromContext(ctx); !ok { + busdb.SetContext(ctx, &models.UserResponse{ID: "auth", Roles: []string{role.Admin}, Apikey: false, Blocked: false}) + } + + user, err := db.UserGetOrCreate(ctx, newUser) + if err != nil { + return err + } + + _, err = db.UserDataGetOrCreate(ctx, newUser.ID, newSetting) + if err != nil { + return err + } + + setContextUser(ctx, user, db.Hooks) + return nil +} + +func setContextUser(ctx *gin.Context, user *models.UserResponse, hooks *hooks.Hooks) { + groups, err := hooks.GetGroups(ctx, user.ID) + if err == nil { + busdb.SetGroupContext(ctx, groups) + } + + busdb.SetContext(ctx, user) +} + +func mapUserAndSettings(claims map[string]interface{}, config *AuthConfig) (*models.UserForm, *models.UserData, error) { + // handle Bearer tokens + // if typ, ok := claims["typ"]; ok && typ == "Bearer" { + // return &models.User{ + // Username: "bot", + // Blocked: false, + // Email: pointer.String("bot@example.org"), + // Roles: []string{"user:read", "settings:read", "ticket", "backup:read", "backup:restore"}, + // Name: pointer.String("Bot"), + // }, nil + // } + + username, err := getString(claims, config.OIDCClaimUsername) + if err != nil { + return nil, nil, err + } + email, err := getString(claims, config.OIDCClaimEmail) + if err != nil { + email = "" + } + + name, err := getString(claims, config.OIDCClaimName) + if err != nil { + name = "" + } + + return &models.UserForm{ + ID: username, + Blocked: config.AuthBlockNew, + Roles: role.Strings(config.AuthDefaultRoles), + }, &models.UserData{ + Email: &email, + Name: &name, + }, nil +} + +func getString(m map[string]interface{}, key string) (string, error) { + if v, ok := m[key]; ok { + if s, ok := v.(string); ok { + return s, nil + } + return "", fmt.Errorf("mapping of %s failed, wrong type (%T)", key, v) + } + + return "", fmt.Errorf("mapping of %s failed, missing value", key) +} + +func redirectToLogin(ctx *gin.Context, session sessions.Session, oauth2Config *oauth2.Config) { + state, err := state() + if err != nil { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "generating state failed"}) + return + } + session.Set(stateSession, state) + err = session.Save() + if err != nil { + log.Println(err) + } + + ctx.Redirect(http.StatusFound, oauth2Config.AuthCodeURL(state)) + log.Println("abort", ctx.Request.URL.String()) + ctx.Abort() +} + +func AuthorizeBlockedUser(ctx *gin.Context) { + user, ok := busdb.UserFromContext(ctx) + if !ok { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "no user in context"}) + return + } + + if user.Blocked { + ctx.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": "user is blocked"}) + return + } + + ctx.Next() +} + +func AuthorizeRole(roles []role.Role) gin.HandlerFunc { + return func(ctx *gin.Context) { + user, ok := busdb.UserFromContext(ctx) + if !ok { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "no user in context"}) + return + } + + if !role.UserHasRoles(user, roles) { + ctx.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": fmt.Sprintf("missing role %s has %s", roles, user.Roles)}) + return + } + + ctx.Next() + } +} + +func callback(config *AuthConfig) gin.HandlerFunc { + return func(ctx *gin.Context) { + session := sessions.Default(ctx) + + state := session.Get(stateSession) + if state == "" { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "state missing"}) + return + } + + if state != ctx.Query("state") { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "state mismatch"}) + return + } + + oauth2Token, err := config.OAuth2.Exchange(ctx, ctx.Query("code")) + if err != nil { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": gin.H{"error": fmt.Sprintf("oauth2 exchange failed: %s", err)}}) + return + } + + // Extract the ID Token from OAuth2 token. + rawIDToken, ok := oauth2Token.Extra("id_token").(string) + if !ok { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "missing id token"}) + return + } + + oidcCtx, cancel := oidcCtx(ctx) + defer cancel() + + verifier, err := config.Verifier(oidcCtx) + if err != nil { + ctx.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "could not verify: " + err.Error()}) + return + } + + // Parse and verify ID Token payload. + idToken, err := verifier.Verify(oidcCtx, rawIDToken) + if err != nil { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "token verification failed: " + err.Error()}) + return + } + + // Extract custom claims + var claims map[string]interface{} + if err := idToken.Claims(&claims); err != nil { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "claim extraction failed"}) + return + } + + session.Set(userSession, claims) + err = session.Save() + if err != nil { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("could not save session %s", err)}) + return + } + + ctx.Redirect(http.StatusFound, "/") + } +} + +func state() (string, error) { + rnd := make([]byte, 32) + if _, err := rand.Read(rnd); err != nil { + return "", err + } + return base64.URLEncoding.EncodeToString(rnd), nil +} diff --git a/automation/automation.go b/automation/automation.go new file mode 100644 index 0000000..1cd2053 --- /dev/null +++ b/automation/automation.go @@ -0,0 +1,26 @@ +package automation + +import ( + "context" + "log" + + "github.com/SecurityBrewery/catalyst/bus" + "github.com/SecurityBrewery/catalyst/database" + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/role" +) + +func New(apiurl, apikey string, bus *bus.Bus, db *database.Database) error { + if err := jobAutomation(jobContext(), apiurl, apikey, bus, db); err != nil { + log.Fatal(err) + } + + return resultAutomation(bus, db) +} + +func jobContext() context.Context { + // TODO: change roles? + bot := &models.UserResponse{ID: "bot", Roles: []string{role.Admin}} + return busdb.UserContext(context.Background(), bot) +} diff --git a/automation/docker.go b/automation/docker.go new file mode 100644 index 0000000..c92b223 --- /dev/null +++ b/automation/docker.go @@ -0,0 +1,186 @@ +package automation + +import ( + "archive/tar" + "bufio" + "bytes" + "context" + "fmt" + "io" + "log" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/client" + "github.com/docker/docker/pkg/stdcopy" + + "github.com/SecurityBrewery/catalyst/database" +) + +func createContainer(ctx context.Context, image, script, data string) (string, string, error) { + cli, err := client.NewClientWithOpts(client.FromEnv) + if err != nil { + return "", "", err + } + + logs, err := pullImage(ctx, cli, image) + if err != nil { + return "", logs, err + } + + config := &container.Config{ + Image: image, Cmd: []string{"/script", data}, WorkingDir: "/home", + AttachStderr: true, AttachStdout: true, + } + resp, err := cli.ContainerCreate(ctx, config, nil, nil, "") + if err != nil { + return "", logs, err + } + + if err := copyFile(ctx, cli, "/script", script, resp.ID); err != nil { + return "", logs, err + } + + return resp.ID, logs, nil +} + +func pullImage(ctx context.Context, cli *client.Client, image string) (string, error) { + reader, err := cli.ImagePull(ctx, image, types.ImagePullOptions{}) + if err != nil { + return "", err + } + defer reader.Close() + + buf := &bytes.Buffer{} + _, err = io.Copy(buf, reader) + return buf.String(), err +} + +func copyFile(ctx context.Context, cli *client.Client, path string, contentString string, id string) error { + tarBuf := &bytes.Buffer{} + tw := tar.NewWriter(tarBuf) + if err := tw.WriteHeader(&tar.Header{Name: path, Mode: 0755, Size: int64(len(contentString))}); err != nil { + return err + } + + if _, err := tw.Write([]byte(contentString)); err != nil { + return err + } + + if err := tw.Close(); err != nil { + return err + } + + if err := cli.CopyToContainer(ctx, id, "/", tarBuf, types.CopyToContainerOptions{}); err != nil { + return err + } + + return nil +} + +func runDocker(ctx context.Context, jobID, containerID string, db *database.Database) (stdout []byte, stderr []byte, err error) { + cli, err := client.NewClientWithOpts(client.FromEnv) + if err != nil { + return nil, nil, err + } + + defer cli.ContainerRemove(ctx, containerID, types.ContainerRemoveOptions{Force: true}) + + if err := cli.ContainerStart(ctx, containerID, types.ContainerStartOptions{}); err != nil { + return nil, nil, err + } + + stderrBuf, err := streamStdErr(ctx, cli, jobID, containerID, db) + if err != nil { + return nil, nil, err + } + + if err := waitForContainer(ctx, cli, containerID, stderrBuf); err != nil { + return nil, nil, err + } + + output, err := getStdOut(ctx, cli, containerID) + if err != nil { + log.Println(err) + } + + return output.Bytes(), stderrBuf.Bytes(), nil +} + +func streamStdErr(ctx context.Context, cli *client.Client, jobID, containerID string, db *database.Database) (*bytes.Buffer, error) { + stderrBuf := &bytes.Buffer{} + containerLogs, err := cli.ContainerLogs(ctx, containerID, types.ContainerLogsOptions{ShowStderr: true, Follow: true}) + if err != nil { + return nil, err + } + go func() { + err := scanLines(ctx, jobID, containerLogs, stderrBuf, db) + if err != nil { + log.Println(err) + return + } + if err := containerLogs.Close(); err != nil { + log.Println(err) + return + } + }() + return stderrBuf, nil +} + +func scanLines(ctx context.Context, jobID string, input io.ReadCloser, output io.Writer, db *database.Database) error { + r, w := io.Pipe() + go func() { + _, err := stdcopy.StdCopy(w, w, input) + if err != nil { + log.Println(err) + return + } + if err := w.Close(); err != nil { + log.Println(err) + return + } + }() + s := bufio.NewScanner(r) + for s.Scan() { + b := s.Bytes() + output.Write(b) + output.Write([]byte("\n")) + + if err := db.JobLogAppend(ctx, jobID, string(b)+"\n"); err != nil { + log.Println(err) + continue + } + } + return s.Err() +} + +func waitForContainer(ctx context.Context, cli *client.Client, containerID string, stderrBuf *bytes.Buffer) error { + statusCh, errCh := cli.ContainerWait(ctx, containerID, container.WaitConditionNotRunning) + select { + case err := <-errCh: + if err != nil { + return err + } + case exitStatus := <-statusCh: + if exitStatus.StatusCode != 0 { + return fmt.Errorf("container returned status code %d: stderr: %s", exitStatus.StatusCode, stderrBuf.String()) + } + } + return nil +} + +func getStdOut(ctx context.Context, cli *client.Client, containerID string) (*bytes.Buffer, error) { + output := &bytes.Buffer{} + containerLogs, err := cli.ContainerLogs(ctx, containerID, types.ContainerLogsOptions{ShowStdout: true, Follow: true}) + if err != nil { + return nil, err + } + defer containerLogs.Close() + + _, err = stdcopy.StdCopy(output, output, containerLogs) + if err != nil { + return nil, err + } + + return output, nil +} diff --git a/automation/job.go b/automation/job.go new file mode 100644 index 0000000..fe98daa --- /dev/null +++ b/automation/job.go @@ -0,0 +1,116 @@ +package automation + +import ( + "encoding/json" + "fmt" + "log" + + "golang.org/x/net/context" + + "github.com/SecurityBrewery/catalyst/bus" + "github.com/SecurityBrewery/catalyst/database" + "github.com/SecurityBrewery/catalyst/generated/models" +) + +func jobAutomation(ctx context.Context, apiurl, apikey string, catalystBus *bus.Bus, db *database.Database) error { + return catalystBus.SubscribeJob(func(automationMsg *bus.JobMsg) { + job, err := db.JobCreate(ctx, automationMsg.ID, &models.JobForm{ + Automation: automationMsg.Automation, + Payload: automationMsg.Message.Payload, + Origin: automationMsg.Origin, + }) + if err != nil { + log.Println(err) + return + } + + automation, err := db.AutomationGet(ctx, automationMsg.Automation) + if err != nil { + log.Println(err) + return + } + + if automation.Script == "" { + log.Println("automation is empty") + return + } + + if automationMsg.Message.Secrets == nil { + automationMsg.Message.Secrets = map[string]string{} + } + automationMsg.Message.Secrets["catalyst_apikey"] = apikey + automationMsg.Message.Secrets["catalyst_apiurl"] = apiurl + + scriptMessage, _ := json.Marshal(automationMsg.Message) + + containerID, logs, err := createContainer(ctx, automation.Image, automation.Script, string(scriptMessage)) + if err != nil { + log.Println(err) + return + } + + if _, err := db.JobUpdate(ctx, automationMsg.ID, &models.Job{ + Automation: job.Automation, + Container: &containerID, + Origin: job.Origin, + Output: job.Output, + Log: &logs, + Payload: job.Payload, + Status: job.Status, + }); err != nil { + log.Println(err) + return + } + + var result map[string]interface{} + + stdout, _, err := runDocker(ctx, automationMsg.ID, containerID, db) + if err != nil { + result = map[string]interface{}{"error": fmt.Sprintf("error running script %s %s", err, string(stdout))} + } else { + var data map[string]interface{} + if err := json.Unmarshal(stdout, &data); err != nil { + result = map[string]interface{}{"error": string(stdout)} + } else { + result = data + } + } + + if err := catalystBus.PublishResult(automationMsg.Automation, result, automationMsg.Origin); err != nil { + log.Println(err) + } + + if err := db.JobComplete(ctx, automationMsg.ID, result); err != nil { + log.Println(err) + return + } + }) +} + +/* +func getAutomation(automationID string, config *Config) (*models.AutomationResponse, error) { + req, err := http.NewRequest(http.MethodGet, config.CatalystAPIUrl+"/automations/"+automationID, nil) + if err != nil { + return nil, err + } + + req.Header.Set("PRIVATE-TOKEN", config.CatalystAPIKey) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + b, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + var automation models.AutomationResponse + if err := json.Unmarshal(b, &automation); err != nil { + return nil, err + } + return &automation, nil +} +*/ diff --git a/automation/result.go b/automation/result.go new file mode 100644 index 0000000..a7e5ff6 --- /dev/null +++ b/automation/result.go @@ -0,0 +1,38 @@ +package automation + +import ( + "log" + + "github.com/SecurityBrewery/catalyst/bus" + "github.com/SecurityBrewery/catalyst/database" + "github.com/SecurityBrewery/catalyst/generated/models" +) + +func resultAutomation(catalystBus *bus.Bus, db *database.Database) error { + return catalystBus.SubscribeResult(func(resultMsg *bus.ResultMsg) { + if resultMsg.Target != nil { + ctx := jobContext() + switch { + case resultMsg.Target.TaskOrigin != nil: + if _, err := db.TaskComplete( + ctx, + resultMsg.Target.TaskOrigin.TicketId, + resultMsg.Target.TaskOrigin.PlaybookId, + resultMsg.Target.TaskOrigin.TaskId, + resultMsg.Data, + ); err != nil { + log.Println(err) + } + case resultMsg.Target.ArtifactOrigin != nil: + enrichment := &models.EnrichmentForm{ + Data: resultMsg.Data, + Name: resultMsg.Automation, + } + _, err := db.EnrichArtifact(ctx, resultMsg.Target.ArtifactOrigin.TicketId, resultMsg.Target.ArtifactOrigin.Artifact, enrichment) + if err != nil { + log.Println(err) + } + } + } + }) +} diff --git a/backup.go b/backup.go new file mode 100644 index 0000000..141994c --- /dev/null +++ b/backup.go @@ -0,0 +1,149 @@ +package catalyst + +import ( + "archive/zip" + "bytes" + "io" + "io/fs" + "log" + "net/http" + "os" + "os/exec" + "path" + "strings" + + "github.com/aws/aws-sdk-go/service/s3" + "github.com/gin-gonic/gin" + + "github.com/SecurityBrewery/catalyst/database" + "github.com/SecurityBrewery/catalyst/storage" +) + +func BackupHandler(catalystStorage *storage.Storage, c *database.Config) gin.HandlerFunc { + return func(context *gin.Context) { + context.Header("Content-Disposition", "attachment; filename=backup.zip") + context.Header("Content-Type", "application/zip") + err := Backup(catalystStorage, c, context.Writer) + if err != nil { + log.Println(err) + context.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + } + } +} + +type WriterAtBuffer struct { + bytes.Buffer +} + +func (fw WriterAtBuffer) WriteAt(p []byte, offset int64) (n int, err error) { + return fw.Write(p) +} + +func Backup(catalystStorage *storage.Storage, c *database.Config, writer io.Writer) error { + archive := zip.NewWriter(writer) + defer archive.Close() + + archive.SetComment(GetVersion()) + + // S3 + if err := backupS3(catalystStorage, archive); err != nil { + return err + } + + // Arango + return backupArango(c, archive) +} + +func backupS3(catalystStorage *storage.Storage, archive *zip.Writer) error { + buckets, err := catalystStorage.S3().ListBuckets(nil) + if err != nil { + return err + } + for _, bucket := range buckets.Buckets { + objects, err := catalystStorage.S3().ListObjectsV2(&s3.ListObjectsV2Input{ + Bucket: bucket.Name, + }) + if err != nil { + return err + } + + for _, content := range objects.Contents { + rbuf := &WriterAtBuffer{} + _, err := catalystStorage.Downloader().Download(rbuf, &s3.GetObjectInput{ + Bucket: bucket.Name, + Key: content.Key, + }) + if err != nil { + return err + } + + a, err := archive.Create(path.Join("minio", *bucket.Name, *content.Key)) + if err != nil { + return err + } + + if _, err := io.Copy(a, rbuf); err != nil { + return err + } + } + } + return nil +} + +func backupArango(c *database.Config, archive *zip.Writer) error { + dir, err := os.MkdirTemp("", "catalyst-backup") + if err != nil { + return err + } + defer os.RemoveAll(dir) + + if err := arangodump(dir, c); err != nil { + return err + } + + return zipDump(dir, archive) +} + +func zipDump(dir string, archive *zip.Writer) error { + fsys := os.DirFS(dir) + return fs.WalkDir(fsys, ".", func(p string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + + if d.IsDir() { + return nil + } + + a, err := archive.Create(path.Join("arango", p)) + if err != nil { + return err + } + + f, err := fsys.Open(p) + if err != nil { + return err + } + + if _, err := io.Copy(a, f); err != nil { + return err + } + return nil + }) +} + +func arangodump(dir string, config *database.Config) error { + host := strings.Replace(config.Host, "http", "tcp", 1) + + name := config.Name + if config.Name == "" { + name = database.Name + } + args := []string{ + "--output-directory", dir, "--server.endpoint", host, + "--server.username", config.User, "--server.password", config.Password, + "--server.database", name, + } + cmd := exec.Command("arangodump", args...) + return cmd.Run() +} diff --git a/bus/bus.go b/bus/bus.go new file mode 100644 index 0000000..6492552 --- /dev/null +++ b/bus/bus.go @@ -0,0 +1,139 @@ +package bus + +import ( + "encoding/json" + "log" + + "github.com/arangodb/go-driver" + emitter "github.com/emitter-io/go/v2" + + "github.com/SecurityBrewery/catalyst/generated/models" +) + +const ( + channelUpdate = "data" + channelJob = "job" + channelResult = "result" +) + +type Bus struct { + config *Config + client *emitter.Client +} + +type Config struct { + Host string + Key string + resultBusKey string + jobBusKey string + dataBusKey string + APIUrl string +} + +type JobMsg struct { + ID string `json:"id"` + Automation string `json:"automation"` + Origin *models.Origin `json:"origin"` + Message *models.Message `json:"message"` +} + +type ResultMsg struct { + Automation string `json:"automation"` + Data map[string]interface{} `json:"data,omitempty"` + Target *models.Origin `json:"target"` +} + +func New(c *Config) (*Bus, error) { + client, err := emitter.Connect(c.Host, func(_ *emitter.Client, msg emitter.Message) { + log.Printf("received: '%s' topic: '%s'\n", msg.Payload(), msg.Topic()) + }) + if err != nil { + return nil, err + } + + c.dataBusKey, err = client.GenerateKey(c.Key, channelUpdate+"/", "rwls", 0) + if err != nil { + return nil, err + } + c.jobBusKey, err = client.GenerateKey(c.Key, channelJob+"/", "rwls", 0) + if err != nil { + return nil, err + } + c.resultBusKey, err = client.GenerateKey(c.Key, channelResult+"/", "rwls", 0) + if err != nil { + return nil, err + } + + return &Bus{config: c, client: client}, err +} + +func (b *Bus) PublishUpdate(ids []driver.DocumentID) error { + return b.jsonPublish(ids, channelUpdate, b.config.dataBusKey) +} + +func (b *Bus) PublishJob(id, automation string, payload interface{}, context *models.Context, origin *models.Origin) error { + return b.jsonPublish(&JobMsg{ + ID: id, + Automation: automation, + Origin: origin, + Message: &models.Message{ + Context: context, + Payload: payload, + }, + }, channelJob, b.config.jobBusKey) +} + +func (b *Bus) PublishResult(automation string, data map[string]interface{}, target *models.Origin) error { + return b.jsonPublish(&ResultMsg{Automation: automation, Data: data, Target: target}, channelResult, b.config.resultBusKey) +} + +func (b *Bus) jsonPublish(msg interface{}, channel, key string) error { + payload, err := json.Marshal(msg) + if err != nil { + return err + } + + return b.client.Publish(key, channel, payload) +} + +func (b *Bus) SubscribeUpdate(f func(ids []driver.DocumentID)) error { + return b.safeSubscribe(b.config.dataBusKey, channelUpdate, func(c *emitter.Client, m emitter.Message) { + var msg []driver.DocumentID + if err := json.Unmarshal(m.Payload(), &msg); err != nil { + log.Println(err) + return + } + go f(msg) + }) +} + +func (b *Bus) SubscribeJob(f func(msg *JobMsg)) error { + return b.safeSubscribe(b.config.jobBusKey, channelJob, func(c *emitter.Client, m emitter.Message) { + var msg JobMsg + if err := json.Unmarshal(m.Payload(), &msg); err != nil { + log.Println(err) + return + } + go f(&msg) + }) +} + +func (b *Bus) SubscribeResult(f func(msg *ResultMsg)) error { + return b.safeSubscribe(b.config.resultBusKey, channelResult, func(c *emitter.Client, m emitter.Message) { + var msg ResultMsg + if err := json.Unmarshal(m.Payload(), &msg); err != nil { + log.Println(err) + return + } + go f(&msg) + }) +} + +func (b *Bus) safeSubscribe(key, channel string, handler func(c *emitter.Client, m emitter.Message)) error { + defer func() { + if r := recover(); r != nil { + log.Printf("Recovered %s in channel %s\n", r, channel) + } + }() + return b.client.Subscribe(key, channel, handler) +} diff --git a/caql/blevebuilder.go b/caql/blevebuilder.go new file mode 100644 index 0000000..4faf1f8 --- /dev/null +++ b/caql/blevebuilder.go @@ -0,0 +1,182 @@ +package caql + +import ( + "errors" + "fmt" + "strconv" + + "github.com/SecurityBrewery/catalyst/generated/caql/parser" +) + +var TooComplexError = errors.New("unsupported features for index queries, use advanced search instead") + +type bleveBuilder struct { + *parser.BaseCAQLParserListener + stack []string + err error +} + +// push is a helper function for pushing new node to the listener Stack. +func (s *bleveBuilder) push(i string) { + s.stack = append(s.stack, i) +} + +// pop is a helper function for poping a node from the listener Stack. +func (s *bleveBuilder) pop() (n string) { + // Check that we have nodes in the stack. + size := len(s.stack) + if size < 1 { + panic(ErrStack) + } + + // Pop the last value from the Stack. + n, s.stack = s.stack[size-1], s.stack[:size-1] + + return +} + +func (s *bleveBuilder) binaryPop() (interface{}, interface{}) { + right, left := s.pop(), s.pop() + return left, right +} + +// ExitExpression is called when production expression is exited. +func (s *bleveBuilder) ExitExpression(ctx *parser.ExpressionContext) { + switch { + case ctx.Value_literal() != nil: + // pass + case ctx.Reference() != nil: + // pass + case ctx.Operator_unary() != nil: + s.err = TooComplexError + return + + case ctx.T_PLUS() != nil: + fallthrough + case ctx.T_MINUS() != nil: + fallthrough + case ctx.T_TIMES() != nil: + fallthrough + case ctx.T_DIV() != nil: + fallthrough + case ctx.T_MOD() != nil: + s.err = TooComplexError + return + + case ctx.T_RANGE() != nil: + s.err = TooComplexError + return + + case ctx.T_LT() != nil && ctx.GetEq_op() == nil: + left, right := s.binaryPop() + s.push(fmt.Sprintf("%s:<%s", left, right)) + case ctx.T_GT() != nil && ctx.GetEq_op() == nil: + left, right := s.binaryPop() + s.push(fmt.Sprintf("%s:>%s", left, right)) + case ctx.T_LE() != nil && ctx.GetEq_op() == nil: + left, right := s.binaryPop() + s.push(fmt.Sprintf("%s:<=%s", left, right)) + case ctx.T_GE() != nil && ctx.GetEq_op() == nil: + left, right := s.binaryPop() + s.push(fmt.Sprintf("%s:>=%s", left, right)) + + case ctx.T_IN() != nil && ctx.GetEq_op() == nil: + s.err = TooComplexError + return + + case ctx.T_EQ() != nil && ctx.GetEq_op() == nil: + left, right := s.binaryPop() + s.push(fmt.Sprintf("%s:%s", left, right)) + case ctx.T_NE() != nil && ctx.GetEq_op() == nil: + left, right := s.binaryPop() + s.push(fmt.Sprintf("-%s:%s", left, right)) + + case ctx.T_ALL() != nil && ctx.GetEq_op() != nil: + fallthrough + case ctx.T_ANY() != nil && ctx.GetEq_op() != nil: + fallthrough + case ctx.T_NONE() != nil && ctx.GetEq_op() != nil: + s.err = TooComplexError + return + + case ctx.T_ALL() != nil && ctx.T_NOT() != nil && ctx.T_IN() != nil: + fallthrough + case ctx.T_ANY() != nil && ctx.T_NOT() != nil && ctx.T_IN() != nil: + fallthrough + case ctx.T_NONE() != nil && ctx.T_NOT() != nil && ctx.T_IN() != nil: + s.err = TooComplexError + return + + case ctx.T_LIKE() != nil: + s.err = errors.New("index queries are like queries by default") + return + + case ctx.T_REGEX_MATCH() != nil: + left, right := s.binaryPop() + if ctx.T_NOT() != nil { + s.err = TooComplexError + return + } else { + s.push(fmt.Sprintf("%s:/%s/", left, right)) + } + case ctx.T_REGEX_NON_MATCH() != nil: + s.err = errors.New("index query cannot contain regex non matches, use advanced search instead") + return + + case ctx.T_AND() != nil: + left, right := s.binaryPop() + s.push(fmt.Sprintf("%s %s", left, right)) + case ctx.T_OR() != nil: + s.err = errors.New("index query cannot contain OR, use advanced search instead") + return + + case ctx.T_QUESTION() != nil && len(ctx.AllExpression()) == 3: + s.err = errors.New("index query cannot contain ternary operations, use advanced search instead") + return + case ctx.T_QUESTION() != nil && len(ctx.AllExpression()) == 2: + s.err = errors.New("index query cannot contain ternary operations, use advanced search instead") + return + + default: + panic("unknown expression") + } +} + +// ExitReference is called when production reference is exited. +func (s *bleveBuilder) ExitReference(ctx *parser.ReferenceContext) { + switch { + case ctx.DOT() != nil: + reference := s.pop() + + s.push(fmt.Sprintf("%s.%s", reference, ctx.T_STRING().GetText())) + case ctx.T_STRING() != nil: + s.push(ctx.T_STRING().GetText()) + case ctx.Compound_value() != nil: + s.err = TooComplexError + return + case ctx.Function_call() != nil: + s.err = TooComplexError + return + case ctx.T_OPEN() != nil: + s.err = TooComplexError + return + case ctx.T_ARRAY_OPEN() != nil: + s.err = TooComplexError + return + default: + panic(fmt.Sprintf("unexpected value: %s", ctx.GetText())) + } +} + +// ExitValue_literal is called when production value_literal is exited. +func (s *bleveBuilder) ExitValue_literal(ctx *parser.Value_literalContext) { + if ctx.T_QUOTED_STRING() != nil { + st, err := unquote(ctx.GetText()) + if err != nil { + panic(err) + } + s.push(strconv.Quote(st)) + } else { + s.push(ctx.GetText()) + } +} diff --git a/caql/blevebuilder_test.go b/caql/blevebuilder_test.go new file mode 100644 index 0000000..edc453e --- /dev/null +++ b/caql/blevebuilder_test.go @@ -0,0 +1,50 @@ +package caql + +import ( + "testing" +) + +func TestBleveBuilder(t *testing.T) { + tests := []struct { + name string + saql string + wantBleve string + wantParseErr bool + wantRebuildErr bool + }{ + {name: "Search 1", saql: `"Bob"`, wantBleve: `"Bob"`}, + {name: "Search 2", saql: `"Bob" AND title == 'Name'`, wantBleve: `"Bob" title:"Name"`}, + {name: "Search 3", saql: `"Bob" OR title == 'Name'`, wantRebuildErr: true}, + {name: "Search 4", saql: `title == 'malware' AND 'wannacry'`, wantBleve: `title:"malware" "wannacry"`}, + } + for _, tt := range tests { + parser := &Parser{} + + t.Run(tt.name, func(t *testing.T) { + expr, err := parser.Parse(tt.saql) + if (err != nil) != tt.wantParseErr { + t.Errorf("Parse() error = %v, wantErr %v", err, tt.wantParseErr) + if expr != nil { + t.Error(expr.String()) + } + return + } + if err != nil { + return + } + + got, err := expr.BleveString() + if (err != nil) != tt.wantRebuildErr { + t.Error(expr.String()) + t.Errorf("String() error = %v, wantErr %v", err, tt.wantParseErr) + return + } + if err != nil { + return + } + if got != tt.wantBleve { + t.Errorf("String() got = %v, want %v", got, tt.wantBleve) + } + }) + } +} diff --git a/caql/builder.go b/caql/builder.go new file mode 100644 index 0000000..e31c9c8 --- /dev/null +++ b/caql/builder.go @@ -0,0 +1,317 @@ +package caql + +import ( + "fmt" + "strconv" + "strings" + + "github.com/SecurityBrewery/catalyst/generated/caql/parser" +) + +type Searcher interface { + Search(term string) (ids []string, err error) +} + +type aqlBuilder struct { + *parser.BaseCAQLParserListener + searcher Searcher + stack []string + prefix string +} + +// push is a helper function for pushing new node to the listener Stack. +func (s *aqlBuilder) push(i string) { + s.stack = append(s.stack, i) +} + +// pop is a helper function for poping a node from the listener Stack. +func (s *aqlBuilder) pop() (n string) { + // Check that we have nodes in the stack. + size := len(s.stack) + if size < 1 { + panic(ErrStack) + } + + // Pop the last value from the Stack. + n, s.stack = s.stack[size-1], s.stack[:size-1] + + return +} + +func (s *aqlBuilder) binaryPop() (string, string) { + right, left := s.pop(), s.pop() + return left, right +} + +// ExitExpression is called when production expression is exited. +func (s *aqlBuilder) ExitExpression(ctx *parser.ExpressionContext) { + switch { + case ctx.Value_literal() != nil: + if ctx.GetParent().GetParent() == nil { + s.push(s.toBoolString(s.pop())) + } + case ctx.Reference() != nil: + ref := s.pop() + if ref == "d.id" { + s.push("d._key") + } else { + s.push(ref) + } + // pass + case ctx.Operator_unary() != nil: + s.push(s.toBoolString(s.pop())) + + case ctx.T_PLUS() != nil: + left, right := s.binaryPop() + s.push(fmt.Sprintf("%s + %s", left, right)) + case ctx.T_MINUS() != nil: + left, right := s.binaryPop() + s.push(fmt.Sprintf("%s - %s", left, right)) + case ctx.T_TIMES() != nil: + left, right := s.binaryPop() + s.push(fmt.Sprintf("%s * %s", left, right)) + case ctx.T_DIV() != nil: + left, right := s.binaryPop() + s.push(fmt.Sprintf("%s / %s", left, right)) + case ctx.T_MOD() != nil: + left, right := s.binaryPop() + s.push(fmt.Sprintf("%s %% %s", left, right)) + + case ctx.T_RANGE() != nil: + left, right := s.binaryPop() + s.push(fmt.Sprintf("%s..%s", left, right)) + + case ctx.T_LT() != nil && ctx.GetEq_op() == nil: + left, right := s.binaryPop() + s.push(fmt.Sprintf("%s < %s", left, right)) + case ctx.T_GT() != nil && ctx.GetEq_op() == nil: + left, right := s.binaryPop() + s.push(fmt.Sprintf("%s > %s", left, right)) + case ctx.T_LE() != nil && ctx.GetEq_op() == nil: + left, right := s.binaryPop() + s.push(fmt.Sprintf("%s <= %s", left, right)) + case ctx.T_GE() != nil && ctx.GetEq_op() == nil: + left, right := s.binaryPop() + s.push(fmt.Sprintf("%s >= %s", left, right)) + + case ctx.T_IN() != nil && ctx.GetEq_op() == nil: + left, right := s.binaryPop() + if ctx.T_NOT() != nil { + s.push(fmt.Sprintf("%s NOT IN %s", left, right)) + } else { + s.push(fmt.Sprintf("%s IN %s", left, right)) + } + + case ctx.T_EQ() != nil && ctx.GetEq_op() == nil: + left, right := s.binaryPop() + s.push(fmt.Sprintf("%s == %s", left, right)) + case ctx.T_NE() != nil && ctx.GetEq_op() == nil: + left, right := s.binaryPop() + s.push(fmt.Sprintf("%s != %s", left, right)) + + case ctx.T_ALL() != nil && ctx.GetEq_op() != nil: + right, left := s.pop(), s.pop() + s.push(fmt.Sprintf("%s ALL %s %s", left, ctx.GetEq_op().GetText(), right)) + case ctx.T_ANY() != nil && ctx.GetEq_op() != nil: + right, left := s.pop(), s.pop() + s.push(fmt.Sprintf("%s ANY %s %s", left, ctx.GetEq_op().GetText(), right)) + case ctx.T_NONE() != nil && ctx.GetEq_op() != nil: + right, left := s.pop(), s.pop() + s.push(fmt.Sprintf("%s NONE %s %s", left, ctx.GetEq_op().GetText(), right)) + + case ctx.T_ALL() != nil && ctx.T_NOT() != nil && ctx.T_IN() != nil: + right, left := s.pop(), s.pop() + s.push(fmt.Sprintf("%s ALL IN %s", left, right)) + case ctx.T_ANY() != nil && ctx.T_NOT() != nil && ctx.T_IN() != nil: + right, left := s.pop(), s.pop() + s.push(fmt.Sprintf("%s ANY IN %s", left, right)) + case ctx.T_NONE() != nil && ctx.T_NOT() != nil && ctx.T_IN() != nil: + right, left := s.pop(), s.pop() + s.push(fmt.Sprintf("%s NONE IN %s", left, right)) + + case ctx.T_LIKE() != nil: + left, right := s.binaryPop() + if ctx.T_NOT() != nil { + s.push(fmt.Sprintf("%s NOT LIKE %s", left, right)) + } else { + s.push(fmt.Sprintf("%s LIKE %s", left, right)) + } + case ctx.T_REGEX_MATCH() != nil: + left, right := s.binaryPop() + if ctx.T_NOT() != nil { + s.push(fmt.Sprintf("%s NOT =~ %s", left, right)) + } else { + s.push(fmt.Sprintf("%s =~ %s", left, right)) + } + case ctx.T_REGEX_NON_MATCH() != nil: + left, right := s.binaryPop() + if ctx.T_NOT() != nil { + s.push(fmt.Sprintf("%s NOT !~ %s", left, right)) + } else { + s.push(fmt.Sprintf("%s !~ %s", left, right)) + } + + case ctx.T_AND() != nil: + left, right := s.binaryPop() + left = s.toBoolString(left) + right = s.toBoolString(right) + s.push(fmt.Sprintf("%s AND %s", left, right)) + case ctx.T_OR() != nil: + left, right := s.binaryPop() + left = s.toBoolString(left) + right = s.toBoolString(right) + s.push(fmt.Sprintf("%s OR %s", left, right)) + + case ctx.T_QUESTION() != nil && len(ctx.AllExpression()) == 3: + right, middle, left := s.pop(), s.pop(), s.pop() + s.push(fmt.Sprintf("%s ? %s : %s", left, middle, right)) + case ctx.T_QUESTION() != nil && len(ctx.AllExpression()) == 2: + right, left := s.pop(), s.pop() + s.push(fmt.Sprintf("%s ? : %s", left, right)) + + default: + panic("unknown expression") + } +} + +func (s *aqlBuilder) toBoolString(v string) string { + _, err := unquote(v) + if err == nil { + ids, err := s.searcher.Search(v) + if err != nil { + panic("invalid search " + err.Error()) + } + return fmt.Sprintf(`d._key IN ["%s"]`, strings.Join(ids, `","`)) + } + return v +} + +// ExitOperator_unary is called when production operator_unary is exited. +func (s *aqlBuilder) ExitOperator_unary(ctx *parser.Operator_unaryContext) { + value := s.pop() + switch { + case ctx.T_PLUS() != nil: + s.push(value) + case ctx.T_MINUS() != nil: + s.push(fmt.Sprintf("-%s", value)) + case ctx.T_NOT() != nil: + s.push(fmt.Sprintf("NOT %s", value)) + default: + panic(fmt.Sprintf("unexpected operation: %s", ctx.GetText())) + } +} + +// ExitReference is called when production reference is exited. +func (s *aqlBuilder) ExitReference(ctx *parser.ReferenceContext) { + switch { + case ctx.DOT() != nil: + reference := s.pop() + if s.prefix != "" && !strings.HasPrefix(reference, s.prefix) { + reference = s.prefix + reference + } + s.push(fmt.Sprintf("%s.%s", reference, ctx.T_STRING().GetText())) + case ctx.T_STRING() != nil: + reference := ctx.T_STRING().GetText() + if s.prefix != "" && !strings.HasPrefix(reference, s.prefix) { + reference = s.prefix + reference + } + s.push(reference) + case ctx.Compound_value() != nil: + // pass + case ctx.Function_call() != nil: + // pass + case ctx.T_OPEN() != nil: + s.push(fmt.Sprintf("(%s)", s.pop())) + case ctx.T_ARRAY_OPEN() != nil: + key := s.pop() + reference := s.pop() + + s.push(fmt.Sprintf("%s[%s]", reference, key)) + default: + panic(fmt.Sprintf("unexpected value: %s", ctx.GetText())) + } +} + +// ExitCompound_value is called when production compound_value is exited. +func (s *aqlBuilder) ExitCompound_value(ctx *parser.Compound_valueContext) { + // pass +} + +// ExitFunction_call is called when production function_call is exited. +func (s *aqlBuilder) ExitFunction_call(ctx *parser.Function_callContext) { + var array []string + for range ctx.AllExpression() { + // prepend element + array = append([]string{s.pop()}, array...) + } + parameter := strings.Join(array, ", ") + + if !stringSliceContains(functionNames, strings.ToUpper(ctx.T_STRING().GetText())) { + panic("unknown function") + } + + s.push(fmt.Sprintf("%s(%s)", strings.ToUpper(ctx.T_STRING().GetText()), parameter)) +} + +// ExitValue_literal is called when production value_literal is exited. +func (s *aqlBuilder) ExitValue_literal(ctx *parser.Value_literalContext) { + if ctx.T_QUOTED_STRING() != nil { + st, err := unquote(ctx.GetText()) + if err != nil { + panic(err) + } + s.push(strconv.Quote(st)) + } else { + s.push(ctx.GetText()) + } +} + +// ExitArray is called when production array is exited. +func (s *aqlBuilder) ExitArray(ctx *parser.ArrayContext) { + var elements []string + for range ctx.AllExpression() { + // elements = append(elements, s.pop()) + elements = append([]string{s.pop()}, elements...) + } + s.push("[" + strings.Join(elements, ", ") + "]") +} + +// ExitObject is called when production object is exited. +func (s *aqlBuilder) ExitObject(ctx *parser.ObjectContext) { + var elements []string + for range ctx.AllObject_element() { + key, value := s.pop(), s.pop() + + elements = append([]string{fmt.Sprintf("%s: %v", key, value)}, elements...) + } + // s.push(object) + s.push("{" + strings.Join(elements, ", ") + "}") +} + +// ExitObject_element is called when production object_element is exited. +func (s *aqlBuilder) ExitObject_element(ctx *parser.Object_elementContext) { + switch { + case ctx.T_STRING() != nil: + s.push(ctx.GetText()) + s.push(ctx.GetText()) + case ctx.Object_element_name() != nil, ctx.T_ARRAY_OPEN() != nil: + key, value := s.pop(), s.pop() + + s.push(key) + s.push(value) + default: + panic(fmt.Sprintf("unexpected value: %s", ctx.GetText())) + } +} + +// ExitObject_element_name is called when production object_element_name is exited. +func (s *aqlBuilder) ExitObject_element_name(ctx *parser.Object_element_nameContext) { + switch { + case ctx.T_STRING() != nil: + s.push(ctx.T_STRING().GetText()) + case ctx.T_QUOTED_STRING() != nil: + s.push(ctx.T_QUOTED_STRING().GetText()) + default: + panic(fmt.Sprintf("unexpected value: %s", ctx.GetText())) + } +} diff --git a/caql/errors.go b/caql/errors.go new file mode 100644 index 0000000..40acff6 --- /dev/null +++ b/caql/errors.go @@ -0,0 +1,8 @@ +package caql + +import "errors" + +var ( + ErrStack = errors.New("unexpected operator stack") + ErrUndefined = errors.New("variable not defined") +) diff --git a/caql/function.go b/caql/function.go new file mode 100644 index 0000000..88b4216 --- /dev/null +++ b/caql/function.go @@ -0,0 +1,750 @@ +package caql + +import ( + "errors" + "fmt" + "math" + "math/rand" + "sort" + "strings" + "unicode/utf8" + + "github.com/imdario/mergo" + + "github.com/SecurityBrewery/catalyst/generated/caql/parser" +) + +func (s *aqlInterpreter) function(ctx *parser.Function_callContext) { + switch strings.ToUpper(ctx.T_STRING().GetText()) { + + default: + s.appendErrors(errors.New("unknown function")) + + // Array https://www.arangodb.com/docs/stable/aql/functions-array.html + case "APPEND": + u := false + if len(ctx.AllExpression()) == 3 { + u = s.pop().(bool) + } + seen := map[interface{}]bool{} + values, anyArray := s.pop().([]interface{}), s.pop().([]interface{}) + + if u { + for _, e := range anyArray { + seen[e] = true + } + } + + for _, e := range values { + _, ok := seen[e] + if !ok || !u { + seen[e] = true + anyArray = append(anyArray, e) + } + } + s.push(anyArray) + case "COUNT_DISTINCT", "COUNT_UNIQUE": + count := 0 + seen := map[interface{}]bool{} + array := s.pop().([]interface{}) + for _, e := range array { + _, ok := seen[e] + if !ok { + seen[e] = true + count += 1 + } + } + s.push(float64(count)) + case "FIRST": + array := s.pop().([]interface{}) + if len(array) == 0 { + s.push(nil) + } else { + s.push(array[0]) + } + // case "FLATTEN": + // case "INTERLEAVE": + case "INTERSECTION": + iset := New(s.pop().([]interface{})...) + + for i := 1; i < len(ctx.AllExpression()); i++ { + iset = iset.Intersection(New(s.pop().([]interface{})...)) + } + + s.push(iset.Values()) + // case "JACCARD": + case "LAST": + array := s.pop().([]interface{}) + if len(array) == 0 { + s.push(nil) + } else { + s.push(array[len(array)-1]) + } + case "COUNT", "LENGTH": + switch v := s.pop().(type) { + case nil: + s.push(float64(0)) + case bool: + if v { + s.push(float64(1)) + } else { + s.push(float64(0)) + } + case float64: + s.push(float64(len(fmt.Sprint(v)))) + case string: + s.push(float64(utf8.RuneCountInString(v))) + case []interface{}: + s.push(float64(len(v))) + case map[string]interface{}: + s.push(float64(len(v))) + default: + panic("unknown type") + } + case "MINUS": + var sets []*Set + for i := 0; i < len(ctx.AllExpression()); i++ { + sets = append(sets, New(s.pop().([]interface{})...)) + } + + iset := sets[len(sets)-1] + // for i := len(sets)-1; i > 0; i-- { + for i := 0; i < len(sets)-1; i++ { + iset = iset.Minus(sets[i]) + } + + s.push(iset.Values()) + case "NTH": + pos := s.pop().(float64) + array := s.pop().([]interface{}) + if int(pos) >= len(array) || pos < 0 { + s.push(nil) + } else { + s.push(array[int64(pos)]) + } + // case "OUTERSECTION": + // array := s.pop().([]interface{}) + // union := New(array...) + // intersection := New(s.pop().([]interface{})...) + // for i := 1; i < len(ctx.AllExpression()); i++ { + // array = s.pop().([]interface{}) + // union = union.Union(New(array...)) + // intersection = intersection.Intersection(New(array...)) + // } + // s.push(union.Minus(intersection).Values()) + case "POP": + array := s.pop().([]interface{}) + s.push(array[:len(array)-1]) + case "POSITION", "CONTAINS_ARRAY": + returnIndex := false + if len(ctx.AllExpression()) == 3 { + returnIndex = s.pop().(bool) + } + search := s.pop() + array := s.pop().([]interface{}) + + for idx, e := range array { + if e == search { + if returnIndex { + s.push(float64(idx)) + } else { + s.push(true) + } + } + } + + if returnIndex { + s.push(float64(-1)) + } else { + s.push(false) + } + case "PUSH": + u := false + if len(ctx.AllExpression()) == 3 { + u = s.pop().(bool) + } + element := s.pop() + array := s.pop().([]interface{}) + + if u && contains(array, element) { + s.push(array) + } else { + s.push(append(array, element)) + } + case "REMOVE_NTH": + position := s.pop().(float64) + anyArray := s.pop().([]interface{}) + + if position < 0 { + position = float64(len(anyArray) + int(position)) + } + + result := []interface{}{} + for idx, e := range anyArray { + if idx != int(position) { + result = append(result, e) + } + } + s.push(result) + case "REPLACE_NTH": + defaultPaddingValue := "" + if len(ctx.AllExpression()) == 4 { + defaultPaddingValue = s.pop().(string) + } + replaceValue := s.pop().(string) + position := s.pop().(float64) + anyArray := s.pop().([]interface{}) + + if position < 0 { + position = float64(len(anyArray) + int(position)) + if position < 0 { + position = 0 + } + } + + switch { + case int(position) < len(anyArray): + anyArray[int(position)] = replaceValue + case int(position) == len(anyArray): + anyArray = append(anyArray, replaceValue) + default: + if defaultPaddingValue == "" { + panic("missing defaultPaddingValue") + } + for len(anyArray) < int(position) { + anyArray = append(anyArray, defaultPaddingValue) + } + anyArray = append(anyArray, replaceValue) + } + + s.push(anyArray) + case "REMOVE_VALUE": + limit := math.Inf(1) + if len(ctx.AllExpression()) == 3 { + limit = s.pop().(float64) + } + value := s.pop() + array := s.pop().([]interface{}) + result := []interface{}{} + for idx, e := range array { + if e != value || float64(idx) > limit { + result = append(result, e) + } + } + s.push(result) + case "REMOVE_VALUES": + values := s.pop().([]interface{}) + array := s.pop().([]interface{}) + result := []interface{}{} + for _, e := range array { + if !contains(values, e) { + result = append(result, e) + } + } + s.push(result) + case "REVERSE": + array := s.pop().([]interface{}) + var reverse []interface{} + for _, e := range array { + reverse = append([]interface{}{e}, reverse...) + } + s.push(reverse) + case "SHIFT": + s.push(s.pop().([]interface{})[1:]) + case "SLICE": + length := float64(-1) + full := true + if len(ctx.AllExpression()) == 3 { + length = s.pop().(float64) + full = false + } + start := int64(s.pop().(float64)) + array := s.pop().([]interface{}) + + if start < 0 { + start = int64(len(array)) + start + } + if full { + length = float64(int64(len(array)) - start) + } + + end := int64(0) + if length < 0 { + end = int64(len(array)) + int64(length) + } else { + end = start + int64(length) + } + s.push(array[start:end]) + case "SORTED": + array := s.pop().([]interface{}) + sort.Slice(array, func(i, j int) bool { return lt(array[i], array[j]) }) + s.push(array) + case "SORTED_UNIQUE": + array := s.pop().([]interface{}) + sort.Slice(array, func(i, j int) bool { return lt(array[i], array[j]) }) + s.push(unique(array)) + case "UNION": + array := s.pop().([]interface{}) + + for i := 1; i < len(ctx.AllExpression()); i++ { + array = append(array, s.pop().([]interface{})...) + } + + sort.Slice(array, func(i, j int) bool { return lt(array[i], array[j]) }) + s.push(array) + case "UNION_DISTINCT": + iset := New(s.pop().([]interface{})...) + + for i := 1; i < len(ctx.AllExpression()); i++ { + iset = iset.Union(New(s.pop().([]interface{})...)) + } + + s.push(unique(iset.Values())) + case "UNIQUE": + s.push(unique(s.pop().([]interface{}))) + case "UNSHIFT": + u := false + if len(ctx.AllExpression()) == 3 { + u = s.pop().(bool) + } + element := s.pop() + array := s.pop().([]interface{}) + if u && contains(array, element) { + s.push(array) + } else { + s.push(append([]interface{}{element}, array...)) + } + + // Bit https://www.arangodb.com/docs/stable/aql/functions-bit.html + // case "BIT_AND": + // case "BIT_CONSTRUCT": + // case "BIT_DECONSTRUCT": + // case "BIT_FROM_STRING": + // case "BIT_NEGATE": + // case "BIT_OR": + // case "BIT_POPCOUNT": + // case "BIT_SHIFT_LEFT": + // case "BIT_SHIFT_RIGHT": + // case "BIT_TEST": + // case "BIT_TO_STRING": + // case "BIT_XOR": + + // Date https://www.arangodb.com/docs/stable/aql/functions-date.html + // case "DATE_NOW": + // case "DATE_ISO8601": + // case "DATE_TIMESTAMP": + // case "IS_DATESTRING": + + // case "DATE_DAYOFWEEK": + // case "DATE_YEAR": + // case "DATE_MONTH": + // case "DATE_DAY": + // case "DATE_HOUR": + // case "DATE_MINUTE": + // case "DATE_SECOND": + // case "DATE_MILLISECOND": + + // case "DATE_DAYOFYEAR": + // case "DATE_ISOWEEK": + // case "DATE_LEAPYEAR": + // case "DATE_QUARTER": + // case "DATE_DAYS_IN_MONTH": + // case "DATE_TRUNC": + // case "DATE_ROUND": + // case "DATE_FORMAT": + + // case "DATE_ADD": + // case "DATE_SUBTRACT": + // case "DATE_DIFF": + // case "DATE_COMPARE": + + // Document https://www.arangodb.com/docs/stable/aql/functions-document.html + case "ATTRIBUTES": + if len(ctx.AllExpression()) == 3 { + s.pop() // always sort + } + removeInternal := false + if len(ctx.AllExpression()) >= 2 { + removeInternal = s.pop().(bool) + } + var keys []interface{} + for k := range s.pop().(map[string]interface{}) { + isInternalKey := strings.HasPrefix(k, "_") + if !removeInternal || !isInternalKey { + keys = append(keys, k) + } + } + sort.Slice(keys, func(i, j int) bool { return lt(keys[i], keys[j]) }) + s.push(keys) + // case "COUNT": + case "HAS": + right, left := s.pop(), s.pop() + _, ok := left.(map[string]interface{})[right.(string)] + s.push(ok) + // case "KEEP": + // case "LENGTH": + // case "MATCHES": + case "MERGE": + var docs []map[string]interface{} + if len(ctx.AllExpression()) == 1 { + for _, doc := range s.pop().([]interface{}) { + docs = append([]map[string]interface{}{doc.(map[string]interface{})}, docs...) + } + } else { + for i := 0; i < len(ctx.AllExpression()); i++ { + docs = append(docs, s.pop().(map[string]interface{})) + } + } + + doc := docs[len(docs)-1] + for i := len(docs) - 2; i >= 0; i-- { + for k, v := range docs[i] { + doc[k] = v + } + } + s.push(doc) + case "MERGE_RECURSIVE": + var doc map[string]interface{} + for i := 0; i < len(ctx.AllExpression()); i++ { + err := mergo.Merge(&doc, s.pop().(map[string]interface{})) + if err != nil { + panic(err) + } + } + s.push(doc) + // case "PARSE_IDENTIFIER": + // case "TRANSLATE": + // case "UNSET": + // case "UNSET_RECURSIVE": + case "VALUES": + removeInternal := false + if len(ctx.AllExpression()) == 2 { + removeInternal = s.pop().(bool) + } + var values []interface{} + for k, v := range s.pop().(map[string]interface{}) { + isInternalKey := strings.HasPrefix(k, "_") + if !removeInternal || !isInternalKey { + values = append(values, v) + } + } + sort.Slice(values, func(i, j int) bool { return lt(values[i], values[j]) }) + s.push(values) + // case "ZIP": + + // Numeric https://www.arangodb.com/docs/stable/aql/functions-numeric.html + case "ABS": + s.push(math.Abs(s.pop().(float64))) + case "ACOS": + v := s.pop().(float64) + asin := math.Acos(v) + if v > 1 || v < -1 { + s.push(nil) + } else { + s.push(asin) + } + case "ASIN": + v := s.pop().(float64) + asin := math.Asin(v) + if v > 1 || v < -1 { + s.push(nil) + } else { + s.push(asin) + } + case "ATAN": + s.push(math.Atan(s.pop().(float64))) + case "ATAN2": + s.push(math.Atan2(s.pop().(float64), s.pop().(float64))) + case "AVERAGE", "AVG": + count := 0 + sum := float64(0) + array := s.pop().([]interface{}) + for _, element := range array { + if element != nil { + count += 1 + sum += toNumber(element) + } + } + if count == 0 { + s.push(nil) + } else { + s.push(sum / float64(count)) + } + case "CEIL": + s.push(math.Ceil(s.pop().(float64))) + case "COS": + s.push(math.Cos(s.pop().(float64))) + case "DEGREES": + s.push(s.pop().(float64) * 180 / math.Pi) + case "EXP": + s.push(math.Exp(s.pop().(float64))) + case "EXP2": + s.push(math.Exp2(s.pop().(float64))) + case "FLOOR": + s.push(math.Floor(s.pop().(float64))) + case "LOG": + l := math.Log(s.pop().(float64)) + if l <= 0 { + s.push(nil) + } else { + s.push(l) + } + case "LOG2": + l := math.Log2(s.pop().(float64)) + if l <= 0 { + s.push(nil) + } else { + s.push(l) + } + case "LOG10": + l := math.Log10(s.pop().(float64)) + if l <= 0 { + s.push(nil) + } else { + s.push(l) + } + case "MAX": + var set bool + var max float64 + array := s.pop().([]interface{}) + for _, element := range array { + if element != nil { + if !set || toNumber(element) > max { + max = toNumber(element) + set = true + } + } + } + if set { + s.push(max) + } else { + s.push(nil) + } + case "MEDIAN": + array := s.pop().([]interface{}) + var numbers []float64 + for _, element := range array { + if f, ok := element.(float64); ok { + numbers = append(numbers, f) + } + } + + sort.Float64s(numbers) // sort the numbers + + middlePos := len(numbers) / 2 + + switch { + case len(numbers) == 0: + s.push(nil) + case len(numbers)%2 == 1: + s.push(numbers[middlePos]) + default: + s.push((numbers[middlePos-1] + numbers[middlePos]) / 2) + } + case "MIN": + var set bool + var min float64 + array := s.pop().([]interface{}) + for _, element := range array { + if element != nil { + if !set || toNumber(element) < min { + min = toNumber(element) + set = true + } + } + } + if set { + s.push(min) + } else { + s.push(nil) + } + // case "PERCENTILE": + case "PI": + s.push(math.Pi) + case "POW": + right, left := s.pop(), s.pop() + s.push(math.Pow(left.(float64), right.(float64))) + case "PRODUCT": + product := float64(1) + array := s.pop().([]interface{}) + for _, element := range array { + if element != nil { + product *= toNumber(element) + } + } + s.push(product) + case "RADIANS": + s.push(s.pop().(float64) * math.Pi / 180) + case "RAND": + s.push(rand.Float64()) + case "RANGE": + var array []interface{} + var start, end, step float64 + if len(ctx.AllExpression()) == 2 { + right, left := s.pop(), s.pop() + start = math.Trunc(left.(float64)) + end = math.Trunc(right.(float64)) + step = 1 + } else { + middle, right, left := s.pop(), s.pop(), s.pop() + start = left.(float64) + end = right.(float64) + step = middle.(float64) + } + for i := start; i <= end; i += step { + array = append(array, i) + } + s.push(array) + case "ROUND": + x := s.pop().(float64) + t := math.Trunc(x) + if math.Abs(x-t) == 0.5 { + s.push(x + 0.5) + } else { + s.push(math.Round(x)) + } + case "SIN": + s.push(math.Sin(s.pop().(float64))) + case "SQRT": + s.push(math.Sqrt(s.pop().(float64))) + // case "STDDEV_POPULATION": + // case "STDDEV_SAMPLE": + // case "STDDEV": + case "SUM": + sum := float64(0) + array := s.pop().([]interface{}) + for _, element := range array { + sum += toNumber(element) + } + s.push(sum) + case "TAN": + s.push(math.Tan(s.pop().(float64))) + // case "VARIANCE_POPULATION", "VARIANCE": + // case "VARIANCE_SAMPLE": + + // String https://www.arangodb.com/docs/stable/aql/functions-string.html + // case "CHAR_LENGTH": + // case "CONCAT": + // case "CONCAT_SEPARATOR": + // case "CONTAINS": + // case "CRC32": + // case "ENCODE_URI_COMPONENT": + // case "FIND_FIRST": + // case "FIND_LAST": + // case "FNV64": + // case "IPV4_FROM_NUMBER": + // case "IPV4_TO_NUMBER": + // case "IS_IPV4": + // case "JSON_PARSE": + // case "JSON_STRINGIFY": + // case "LEFT": + // case "LENGTH": + // case "LEVENSHTEIN_DISTANCE": + // case "LIKE": + case "LOWER": + s.push(strings.ToLower(s.pop().(string))) + // case "LTRIM": + // case "MD5": + // case "NGRAM_POSITIONAL_SIMILARITY": + // case "NGRAM_SIMILARITY": + // case "RANDOM_TOKEN": + // case "REGEX_MATCHES": + // case "REGEX_SPLIT": + // case "REGEX_TEST": + // case "REGEX_REPLACE": + // case "REVERSE": + // case "RIGHT": + // case "RTRIM": + // case "SHA1": + // case "SHA512": + // case "SOUNDEX": + // case "SPLIT": + // case "STARTS_WITH": + // case "SUBSTITUTE": + // case "SUBSTRING": + // case "TOKENS": + // case "TO_BASE64": + // case "TO_HEX": + // case "TRIM": + case "UPPER": + s.push(strings.ToUpper(s.pop().(string))) + // case "UUID": + + // Type cast https://www.arangodb.com/docs/stable/aql/functions-type-cast.html + case "TO_BOOL": + s.push(toBool(s.pop())) + case "TO_NUMBER": + s.push(toNumber(s.pop())) + // case "TO_STRING": + // case "TO_ARRAY": + // case "TO_LIST": + + // case "IS_NULL": + // case "IS_BOOL": + // case "IS_NUMBER": + // case "IS_STRING": + // case "IS_ARRAY": + // case "IS_LIST": + // case "IS_OBJECT": + // case "IS_DOCUMENT": + // case "IS_DATESTRING": + // case "IS_IPV4": + // case "IS_KEY": + // case "TYPENAME": + + } +} + +func unique(array []interface{}) []interface{} { + seen := map[interface{}]bool{} + var filtered []interface{} + for _, e := range array { + _, ok := seen[e] + if !ok { + seen[e] = true + filtered = append(filtered, e) + } + } + return filtered +} + +func contains(values []interface{}, e interface{}) bool { + for _, v := range values { + if e == v { + return true + } + } + return false +} + +func stringSliceContains(values []string, e string) bool { + for _, v := range values { + if e == v { + return true + } + } + return false +} + +var functionNames = []string{ + "APPEND", "COUNT_DISTINCT", "COUNT_UNIQUE", "FIRST", "FLATTEN", "INTERLEAVE", "INTERSECTION", "JACCARD", "LAST", + "COUNT", "LENGTH", "MINUS", "NTH", "OUTERSECTION", "POP", "POSITION", "CONTAINS_ARRAY", "PUSH", "REMOVE_NTH", + "REPLACE_NTH", "REMOVE_VALUE", "REMOVE_VALUES", "REVERSE", "SHIFT", "SLICE", "SORTED", "SORTED_UNIQUE", "UNION", + "UNION_DISTINCT", "UNIQUE", "UNSHIFT", "BIT_AND", "BIT_CONSTRUCT", "BIT_DECONSTRUCT", "BIT_FROM_STRING", + "BIT_NEGATE", "BIT_OR", "BIT_POPCOUNT", "BIT_SHIFT_LEFT", "BIT_SHIFT_RIGHT", "BIT_TEST", "BIT_TO_STRING", + "BIT_XOR", "DATE_NOW", "DATE_ISO8601", "DATE_TIMESTAMP", "IS_DATESTRING", "DATE_DAYOFWEEK", "DATE_YEAR", + "DATE_MONTH", "DATE_DAY", "DATE_HOUR", "DATE_MINUTE", "DATE_SECOND", "DATE_MILLISECOND", "DATE_DAYOFYEAR", + "DATE_ISOWEEK", "DATE_LEAPYEAR", "DATE_QUARTER", "DATE_DAYS_IN_MONTH", "DATE_TRUNC", "DATE_ROUND", "DATE_FORMAT", + "DATE_ADD", "DATE_SUBTRACT", "DATE_DIFF", "DATE_COMPARE", "ATTRIBUTES", "COUNT", "HAS", "KEEP", "LENGTH", + "MATCHES", "MERGE", "MERGE_RECURSIVE", "PARSE_IDENTIFIER", "TRANSLATE", "UNSET", "UNSET_RECURSIVE", "VALUES", + "ZIP", "ABS", "ACOS", "ASIN", "ATAN", "ATAN2", "AVERAGE", "AVG", "CEIL", "COS", "DEGREES", "EXP", "EXP2", "FLOOR", + "LOG", "LOG2", "LOG10", "MAX", "MEDIAN", "MIN", "PERCENTILE", "PI", "POW", "PRODUCT", "RADIANS", "RAND", "RANGE", + "ROUND", "SIN", "SQRT", "STDDEV_POPULATION", "STDDEV_SAMPLE", "STDDEV", "SUM", "TAN", "VARIANCE_POPULATION", + "VARIANCE", "VARIANCE_SAMPLE", "CHAR_LENGTH", "CONCAT", "CONCAT_SEPARATOR", "CONTAINS", "CRC32", + "ENCODE_URI_COMPONENT", "FIND_FIRST", "FIND_LAST", "FNV64", "IPV4_FROM_NUMBER", "IPV4_TO_NUMBER", "IS_IPV4", + "JSON_PARSE", "JSON_STRINGIFY", "LEFT", "LENGTH", "LEVENSHTEIN_DISTANCE", "LIKE", "LOWER", "LTRIM", "MD5", + "NGRAM_POSITIONAL_SIMILARITY", "NGRAM_SIMILARITY", "RANDOM_TOKEN", "REGEX_MATCHES", "REGEX_SPLIT", "REGEX_TEST", + "REGEX_REPLACE", "REVERSE", "RIGHT", "RTRIM", "SHA1", "SHA512", "SOUNDEX", "SPLIT", "STARTS_WITH", "SUBSTITUTE", + "SUBSTRING", "TOKENS", "TO_BASE64", "TO_HEX", "TRIM", "UPPER", "UUID", "TO_BOOL", "TO_NUMBER", "TO_STRING", + "TO_ARRAY", "TO_LIST", "IS_NULL", "IS_BOOL", "IS_NUMBER", "IS_STRING", "IS_ARRAY", "IS_LIST", "IS_OBJECT", + "IS_DOCUMENT", "IS_DATESTRING", "IS_IPV4", "IS_KEY", "TYPENAME"} diff --git a/caql/function_test.go b/caql/function_test.go new file mode 100644 index 0000000..dcbea87 --- /dev/null +++ b/caql/function_test.go @@ -0,0 +1,380 @@ +package caql + +import ( + "encoding/json" + "math" + "reflect" + "testing" +) + +func TestFunctions(t *testing.T) { + tests := []struct { + name string + saql string + wantRebuild string + wantValue interface{} + wantParseErr bool + wantRebuildErr bool + wantEvalErr bool + values string + }{ + // https://www.arangodb.com/docs/3.7/aql/functions-array.html + {name: "APPEND", saql: `APPEND([1, 2, 3], [5, 6, 9])`, wantRebuild: `APPEND([1, 2, 3], [5, 6, 9])`, wantValue: jsonParse(`[1, 2, 3, 5, 6, 9]`)}, + {name: "APPEND", saql: `APPEND([1, 2, 3], [3, 4, 5, 2, 9], true)`, wantRebuild: `APPEND([1, 2, 3], [3, 4, 5, 2, 9], true)`, wantValue: jsonParse(`[1, 2, 3, 4, 5, 9]`)}, + {name: "COUNT_DISTINCT", saql: `COUNT_DISTINCT([1, 2, 3])`, wantRebuild: `COUNT_DISTINCT([1, 2, 3])`, wantValue: 3}, + {name: "COUNT_DISTINCT", saql: `COUNT_DISTINCT(["yes", "no", "yes", "sauron", "no", "yes"])`, wantRebuild: `COUNT_DISTINCT(["yes", "no", "yes", "sauron", "no", "yes"])`, wantValue: 3}, + {name: "FIRST", saql: `FIRST([1, 2, 3])`, wantRebuild: `FIRST([1, 2, 3])`, wantValue: 1}, + {name: "FIRST", saql: `FIRST([])`, wantRebuild: `FIRST([])`, wantValue: nil}, + // {name: "FLATTEN", saql: `FLATTEN([1, 2, [3, 4], 5, [6, 7], [8, [9, 10]]])`, wantRebuild: `FLATTEN([1, 2, [3, 4], 5, [6, 7], [8, [9, 10]]])`, wantValue:}, + // {name: "FLATTEN", saql: `FLATTEN([1, 2, [3, 4], 5, [6, 7], [8, [9, 10]]], 2)`, wantRebuild: `FLATTEN([1, 2, [3, 4], 5, [6, 7], [8, [9, 10]]], 2)`, wantValue:}, + // {name: "INTERLEAVE", saql: `INTERLEAVE([1, 1, 1], [2, 2, 2], [3, 3, 3])`, wantRebuild: `INTERLEAVE([1, 1, 1], [2, 2, 2], [3, 3, 3])`, wantValue:}, + // {name: "INTERLEAVE", saql: `INTERLEAVE([1], [2, 2], [3, 3, 3])`, wantRebuild: `INTERLEAVE([1], [2, 2], [3, 3, 3])`, wantValue:}, + {name: "INTERSECTION", saql: `INTERSECTION([1,2,3,4,5], [2,3,4,5,6], [3,4,5,6,7])`, wantRebuild: `INTERSECTION([1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7])`, wantValue: jsonParse(`[3, 4, 5]`)}, + {name: "INTERSECTION", saql: `INTERSECTION([2,4,6], [8,10,12], [14,16,18])`, wantRebuild: `INTERSECTION([2, 4, 6], [8, 10, 12], [14, 16, 18])`, wantValue: jsonParse(`[]`)}, + // {name: "JACCARD", saql: `JACCARD([1,2,3,4], [3,4,5,6])`, wantRebuild: `JACCARD([1,2,3,4], [3,4,5,6])`, wantValue: 0.3333333333333333}, + // {name: "JACCARD", saql: `JACCARD([1,1,2,2,2,3], [2,2,3,4])`, wantRebuild: `JACCARD([1,1,2,2,2,3], [2,2,3,4])`, wantValue: 0.5}, + // {name: "JACCARD", saql: `JACCARD([1,2,3], [])`, wantRebuild: `JACCARD([1, 2, 3], [])`, wantValue: 0}, + // {name: "JACCARD", saql: `JACCARD([], [])`, wantRebuild: `JACCARD([], [])`, wantValue: 1}, + {name: "LAST", saql: `LAST([1,2,3,4,5])`, wantRebuild: `LAST([1, 2, 3, 4, 5])`, wantValue: 5}, + {name: "LENGTH", saql: `LENGTH("🥑")`, wantRebuild: `LENGTH("🥑")`, wantValue: 1}, + {name: "LENGTH", saql: `LENGTH(1234)`, wantRebuild: `LENGTH(1234)`, wantValue: 4}, + {name: "LENGTH", saql: `LENGTH([1,2,3,4,5,6,7])`, wantRebuild: `LENGTH([1, 2, 3, 4, 5, 6, 7])`, wantValue: 7}, + {name: "LENGTH", saql: `LENGTH(false)`, wantRebuild: `LENGTH(false)`, wantValue: 0}, + {name: "LENGTH", saql: `LENGTH({a:1, b:2, c:3, d:4, e:{f:5,g:6}})`, wantRebuild: `LENGTH({a: 1, b: 2, c: 3, d: 4, e: {f: 5, g: 6}})`, wantValue: 5}, + {name: "MINUS", saql: `MINUS([1,2,3,4], [3,4,5,6], [5,6,7,8])`, wantRebuild: `MINUS([1, 2, 3, 4], [3, 4, 5, 6], [5, 6, 7, 8])`, wantValue: jsonParse(`[1, 2]`)}, + {name: "NTH", saql: `NTH(["foo", "bar", "baz"], 2)`, wantRebuild: `NTH(["foo", "bar", "baz"], 2)`, wantValue: "baz"}, + {name: "NTH", saql: `NTH(["foo", "bar", "baz"], 3)`, wantRebuild: `NTH(["foo", "bar", "baz"], 3)`, wantValue: nil}, + {name: "NTH", saql: `NTH(["foo", "bar", "baz"], -1)`, wantRebuild: `NTH(["foo", "bar", "baz"], -1)`, wantValue: nil}, + // {name: "OUTERSECTION", saql: `OUTERSECTION([1, 2, 3], [2, 3, 4], [3, 4, 5])`, wantRebuild: `OUTERSECTION([1, 2, 3], [2, 3, 4], [3, 4, 5])`, wantValue: jsonParse(`[1, 5]`)}, + {name: "POP", saql: `POP([1, 2, 3, 4])`, wantRebuild: `POP([1, 2, 3, 4])`, wantValue: jsonParse(`[1, 2, 3]`)}, + {name: "POP", saql: `POP([1])`, wantRebuild: `POP([1])`, wantValue: jsonParse(`[]`)}, + {name: "POSITION", saql: `POSITION([2,4,6,8], 4)`, wantRebuild: `POSITION([2, 4, 6, 8], 4)`, wantValue: true}, + {name: "POSITION", saql: `POSITION([2,4,6,8], 4, true)`, wantRebuild: `POSITION([2, 4, 6, 8], 4, true)`, wantValue: 1}, + {name: "PUSH", saql: `PUSH([1, 2, 3], 4)`, wantRebuild: `PUSH([1, 2, 3], 4)`, wantValue: jsonParse(`[1, 2, 3, 4]`)}, + {name: "PUSH", saql: `PUSH([1, 2, 2, 3], 2, true)`, wantRebuild: `PUSH([1, 2, 2, 3], 2, true)`, wantValue: jsonParse(`[1, 2, 2, 3]`)}, + {name: "REMOVE_NTH", saql: `REMOVE_NTH(["a", "b", "c", "d", "e"], 1)`, wantRebuild: `REMOVE_NTH(["a", "b", "c", "d", "e"], 1)`, wantValue: jsonParse(`["a", "c", "d", "e"]`)}, + {name: "REMOVE_NTH", saql: `REMOVE_NTH(["a", "b", "c", "d", "e"], -2)`, wantRebuild: `REMOVE_NTH(["a", "b", "c", "d", "e"], -2)`, wantValue: jsonParse(`["a", "b", "c", "e"]`)}, + {name: "REPLACE_NTH", saql: `REPLACE_NTH(["a", "b", "c"], 1 , "z")`, wantRebuild: `REPLACE_NTH(["a", "b", "c"], 1, "z")`, wantValue: jsonParse(`["a", "z", "c"]`)}, + {name: "REPLACE_NTH", saql: `REPLACE_NTH(["a", "b", "c"], 3 , "z")`, wantRebuild: `REPLACE_NTH(["a", "b", "c"], 3, "z")`, wantValue: jsonParse(`["a", "b", "c", "z"]`)}, + {name: "REPLACE_NTH", saql: `REPLACE_NTH(["a", "b", "c"], 6, "z", "y")`, wantRebuild: `REPLACE_NTH(["a", "b", "c"], 6, "z", "y")`, wantValue: jsonParse(`["a", "b", "c", "y", "y", "y", "z"]`)}, + {name: "REPLACE_NTH", saql: `REPLACE_NTH(["a", "b", "c"], -1, "z")`, wantRebuild: `REPLACE_NTH(["a", "b", "c"], -1, "z")`, wantValue: jsonParse(`["a", "b", "z"]`)}, + {name: "REPLACE_NTH", saql: `REPLACE_NTH(["a", "b", "c"], -9, "z")`, wantRebuild: `REPLACE_NTH(["a", "b", "c"], -9, "z")`, wantValue: jsonParse(`["z", "b", "c"]`)}, + {name: "REMOVE_VALUE", saql: `REMOVE_VALUE(["a", "b", "b", "a", "c"], "a")`, wantRebuild: `REMOVE_VALUE(["a", "b", "b", "a", "c"], "a")`, wantValue: jsonParse(`["b", "b", "c"]`)}, + {name: "REMOVE_VALUE", saql: `REMOVE_VALUE(["a", "b", "b", "a", "c"], "a", 1)`, wantRebuild: `REMOVE_VALUE(["a", "b", "b", "a", "c"], "a", 1)`, wantValue: jsonParse(`["b", "b", "a", "c"]`)}, + {name: "REMOVE_VALUES", saql: `REMOVE_VALUES(["a", "a", "b", "c", "d", "e", "f"], ["a", "f", "d"])`, wantRebuild: `REMOVE_VALUES(["a", "a", "b", "c", "d", "e", "f"], ["a", "f", "d"])`, wantValue: jsonParse(`["b", "c", "e"]`)}, + {name: "REVERSE", saql: `REVERSE ([2,4,6,8,10])`, wantRebuild: `REVERSE([2, 4, 6, 8, 10])`, wantValue: jsonParse(`[10, 8, 6, 4, 2]`)}, + {name: "SHIFT", saql: `SHIFT([1, 2, 3, 4])`, wantRebuild: `SHIFT([1, 2, 3, 4])`, wantValue: jsonParse(`[2, 3, 4]`)}, + {name: "SHIFT", saql: `SHIFT([1])`, wantRebuild: `SHIFT([1])`, wantValue: jsonParse(`[]`)}, + {name: "SLICE", saql: `SLICE([1, 2, 3, 4, 5], 0, 1)`, wantRebuild: `SLICE([1, 2, 3, 4, 5], 0, 1)`, wantValue: jsonParse(`[1]`)}, + {name: "SLICE", saql: `SLICE([1, 2, 3, 4, 5], 1, 2)`, wantRebuild: `SLICE([1, 2, 3, 4, 5], 1, 2)`, wantValue: jsonParse(`[2, 3]`)}, + {name: "SLICE", saql: `SLICE([1, 2, 3, 4, 5], 3)`, wantRebuild: `SLICE([1, 2, 3, 4, 5], 3)`, wantValue: jsonParse(`[4, 5]`)}, + {name: "SLICE", saql: `SLICE([1, 2, 3, 4, 5], 1, -1)`, wantRebuild: `SLICE([1, 2, 3, 4, 5], 1, -1)`, wantValue: jsonParse(`[2, 3, 4]`)}, + {name: "SLICE", saql: `SLICE([1, 2, 3, 4, 5], 0, -2)`, wantRebuild: `SLICE([1, 2, 3, 4, 5], 0, -2)`, wantValue: jsonParse(`[1, 2, 3]`)}, + {name: "SLICE", saql: `SLICE([1, 2, 3, 4, 5], -3, 2)`, wantRebuild: `SLICE([1, 2, 3, 4, 5], -3, 2)`, wantValue: jsonParse(`[3, 4]`)}, + {name: "SORTED", saql: `SORTED([8,4,2,10,6])`, wantRebuild: `SORTED([8, 4, 2, 10, 6])`, wantValue: jsonParse(`[2, 4, 6, 8, 10]`)}, + {name: "SORTED_UNIQUE", saql: `SORTED_UNIQUE([8,4,2,10,6,2,8,6,4])`, wantRebuild: `SORTED_UNIQUE([8, 4, 2, 10, 6, 2, 8, 6, 4])`, wantValue: jsonParse(`[2, 4, 6, 8, 10]`)}, + {name: "UNION", saql: `UNION([1, 2, 3], [1, 2])`, wantRebuild: `UNION([1, 2, 3], [1, 2])`, wantValue: jsonParse(`[1, 1, 2, 2, 3]`)}, + {name: "UNION_DISTINCT", saql: `UNION_DISTINCT([1, 2, 3], [1, 2])`, wantRebuild: `UNION_DISTINCT([1, 2, 3], [1, 2])`, wantValue: jsonParse(`[1, 2, 3]`)}, + {name: "UNIQUE", saql: `UNIQUE([1,2,2,3,3,3,4,4,4,4,5,5,5,5,5])`, wantRebuild: `UNIQUE([1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5])`, wantValue: jsonParse(`[1, 2, 3, 4, 5]`)}, + {name: "UNSHIFT", saql: `UNSHIFT([1, 2, 3], 4)`, wantRebuild: `UNSHIFT([1, 2, 3], 4)`, wantValue: jsonParse(`[4, 1, 2, 3]`)}, + {name: "UNSHIFT", saql: `UNSHIFT([1, 2, 3], 2, true)`, wantRebuild: `UNSHIFT([1, 2, 3], 2, true)`, wantValue: jsonParse(`[1, 2, 3]`)}, + + // https://www.arangodb.com/docs/3.7/aql/functions-bit.html + // {name: "BIT_CONSTRUCT", saql: `BIT_CONSTRUCT([1, 2, 3])`, wantRebuild: `BIT_CONSTRUCT([1, 2, 3])`, wantValue: 14}, + // {name: "BIT_CONSTRUCT", saql: `BIT_CONSTRUCT([0, 4, 8])`, wantRebuild: `BIT_CONSTRUCT([0, 4, 8])`, wantValue: 273}, + // {name: "BIT_CONSTRUCT", saql: `BIT_CONSTRUCT([0, 1, 10, 31])`, wantRebuild: `BIT_CONSTRUCT([0, 1, 10, 31])`, wantValue: 2147484675}, + // {name: "BIT_DECONSTRUCT", saql: `BIT_DECONSTRUCT(14)`, wantRebuild: `BIT_DECONSTRUCT(14) `, wantValue: []interface{}{1, 2, 3}}, + // {name: "BIT_DECONSTRUCT", saql: `BIT_DECONSTRUCT(273)`, wantRebuild: `BIT_DECONSTRUCT(273)`, wantValue: []interface{}{0, 4, 8}}, + // {name: "BIT_DECONSTRUCT", saql: `BIT_DECONSTRUCT(2147484675)`, wantRebuild: `BIT_DECONSTRUCT(2147484675)`, wantValue: []interface{}{0, 1, 10, 31}}, + // {name: "BIT_FROM_STRING", saql: `BIT_FROM_STRING("0111")`, wantRebuild: `BIT_FROM_STRING("0111")`, wantValue: 7}, + // {name: "BIT_FROM_STRING", saql: `BIT_FROM_STRING("000000000000010")`, wantRebuild: `BIT_FROM_STRING("000000000000010")`, wantValue: 2}, + // {name: "BIT_FROM_STRING", saql: `BIT_FROM_STRING("11010111011101")`, wantRebuild: `BIT_FROM_STRING("11010111011101")`, wantValue: 13789}, + // {name: "BIT_FROM_STRING", saql: `BIT_FROM_STRING("100000000000000000000")`, wantRebuild: `BIT_FROM_STRING("100000000000000000000")`, wantValue: 1048756}, + // {name: "BIT_NEGATE", saql: `BIT_NEGATE(0, 8)`, wantRebuild: `BIT_NEGATE(0, 8)`, wantValue: 255}, + // {name: "BIT_NEGATE", saql: `BIT_NEGATE(0, 10)`, wantRebuild: `BIT_NEGATE(0, 10)`, wantValue: 1023}, + // {name: "BIT_NEGATE", saql: `BIT_NEGATE(3, 4)`, wantRebuild: `BIT_NEGATE(3, 4)`, wantValue: 12}, + // {name: "BIT_NEGATE", saql: `BIT_NEGATE(446359921, 32)`, wantRebuild: `BIT_NEGATE(446359921, 32)`, wantValue: 3848607374}, + // {name: "BIT_OR", saql: `BIT_OR([1, 4, 8, 16])`, wantRebuild: `BIT_OR([1, 4, 8, 16])`, wantValue: 29}, + // {name: "BIT_OR", saql: `BIT_OR([3, 7, 63])`, wantRebuild: `BIT_OR([3, 7, 63])`, wantValue: 63}, + // {name: "BIT_OR", saql: `BIT_OR([255, 127, null, 63])`, wantRebuild: `BIT_OR([255, 127, null, 63])`, wantValue: 255}, + // {name: "BIT_OR", saql: `BIT_OR(255, 127)`, wantRebuild: `BIT_OR(255, 127)`, wantValue: 255}, + // {name: "BIT_OR", saql: `BIT_OR("foo")`, wantRebuild: `BIT_OR("foo")`, wantValue: nil}, + // {name: "BIT_POPCOUNT", saql: `BIT_POPCOUNT(0)`, wantRebuild: `BIT_POPCOUNT(0)`, wantValue: 0}, + // {name: "BIT_POPCOUNT", saql: `BIT_POPCOUNT(255)`, wantRebuild: `BIT_POPCOUNT(255)`, wantValue: 8}, + // {name: "BIT_POPCOUNT", saql: `BIT_POPCOUNT(69399252)`, wantRebuild: `BIT_POPCOUNT(69399252)`, wantValue: 12}, + // {name: "BIT_POPCOUNT", saql: `BIT_POPCOUNT("foo")`, wantRebuild: `BIT_POPCOUNT("foo")`, wantValue: nil}, + // {name: "BIT_SHIFT_LEFT", saql: `BIT_SHIFT_LEFT(0, 1, 8)`, wantRebuild: `BIT_SHIFT_LEFT(0, 1, 8)`, wantValue: 0}, + // {name: "BIT_SHIFT_LEFT", saql: `BIT_SHIFT_LEFT(7, 1, 16)`, wantRebuild: `BIT_SHIFT_LEFT(7, 1, 16)`, wantValue: 14}, + // {name: "BIT_SHIFT_LEFT", saql: `BIT_SHIFT_LEFT(2, 10, 16)`, wantRebuild: `BIT_SHIFT_LEFT(2, 10, 16)`, wantValue: 2048}, + // {name: "BIT_SHIFT_LEFT", saql: `BIT_SHIFT_LEFT(878836, 16, 32)`, wantRebuild: `BIT_SHIFT_LEFT(878836, 16, 32)`, wantValue: 1760821248}, + // {name: "BIT_SHIFT_RIGHT", saql: `BIT_SHIFT_RIGHT(0, 1, 8)`, wantRebuild: `BIT_SHIFT_RIGHT(0, 1, 8)`, wantValue: 0}, + // {name: "BIT_SHIFT_RIGHT", saql: `BIT_SHIFT_RIGHT(33, 1, 16)`, wantRebuild: `BIT_SHIFT_RIGHT(33, 1, 16)`, wantValue: 16}, + // {name: "BIT_SHIFT_RIGHT", saql: `BIT_SHIFT_RIGHT(65536, 13, 16)`, wantRebuild: `BIT_SHIFT_RIGHT(65536, 13, 16)`, wantValue: 8}, + // {name: "BIT_SHIFT_RIGHT", saql: `BIT_SHIFT_RIGHT(878836, 4, 32)`, wantRebuild: `BIT_SHIFT_RIGHT(878836, 4, 32)`, wantValue: 54927}, + // {name: "BIT_TEST", saql: `BIT_TEST(0, 3)`, wantRebuild: `BIT_TEST(0, 3)`, wantValue: false}, + // {name: "BIT_TEST", saql: `BIT_TEST(255, 0)`, wantRebuild: `BIT_TEST(255, 0)`, wantValue: true}, + // {name: "BIT_TEST", saql: `BIT_TEST(7, 2)`, wantRebuild: `BIT_TEST(7, 2)`, wantValue: true}, + // {name: "BIT_TEST", saql: `BIT_TEST(255, 8)`, wantRebuild: `BIT_TEST(255, 8)`, wantValue: false}, + // {name: "BIT_TO_STRING", saql: `BIT_TO_STRING(7, 4)`, wantRebuild: `BIT_TO_STRING(7, 4)`, wantValue: "0111"}, + // {name: "BIT_TO_STRING", saql: `BIT_TO_STRING(255, 8)`, wantRebuild: `BIT_TO_STRING(255, 8)`, wantValue: "11111111"}, + // {name: "BIT_TO_STRING", saql: `BIT_TO_STRING(60, 8)`, wantRebuild: `BIT_TO_STRING(60, 8)`, wantValue: "00011110"}, + // {name: "BIT_TO_STRING", saql: `BIT_TO_STRING(1048576, 32)`, wantRebuild: `BIT_TO_STRING(1048576, 32)`, wantValue: "00000000000100000000000000000000"}, + // {name: "BIT_XOR", saql: `BIT_XOR([1, 4, 8, 16])`, wantRebuild: `BIT_XOR([1, 4, 8, 16])`, wantValue: 29}, + // {name: "BIT_XOR", saql: `BIT_XOR([3, 7, 63])`, wantRebuild: `BIT_XOR([3, 7, 63])`, wantValue: 59}, + // {name: "BIT_XOR", saql: `BIT_XOR([255, 127, null, 63])`, wantRebuild: `BIT_XOR([255, 127, null, 63])`, wantValue: 191}, + // {name: "BIT_XOR", saql: `BIT_XOR(255, 257)`, wantRebuild: `BIT_XOR(255, 257)`, wantValue: 510}, + // {name: "BIT_XOR", saql: `BIT_XOR("foo")`, wantRebuild: `BIT_XOR("foo")`, wantValue: nil}, + + // https://www.arangodb.com/docs/3.7/aql/functions-date.html + // DATE_TIMESTAMP("2014-05-07T14:19:09.522") + // DATE_TIMESTAMP("2014-05-07T14:19:09.522Z") + // DATE_TIMESTAMP("2014-05-07 14:19:09.522") + // DATE_TIMESTAMP("2014-05-07 14:19:09.522Z") + // DATE_TIMESTAMP(2014, 5, 7, 14, 19, 9, 522) + // DATE_TIMESTAMP(1399472349522) + // DATE_ISO8601("2014-05-07T14:19:09.522Z") + // DATE_ISO8601("2014-05-07 14:19:09.522Z") + // DATE_ISO8601(2014, 5, 7, 14, 19, 9, 522) + // DATE_ISO8601(1399472349522) + // {name: "DATE_TIMESTAMP", saql: `DATE_TIMESTAMP(2016, 12, -1)`, wantRebuild: `DATE_TIMESTAMP(2016, 12, -1)`, wantValue: nil}, + // {name: "DATE_TIMESTAMP", saql: `DATE_TIMESTAMP(2016, 2, 32)`, wantRebuild: `DATE_TIMESTAMP(2016, 2, 32)`, wantValue: 1456963200000}, + // {name: "DATE_TIMESTAMP", saql: `DATE_TIMESTAMP(1970, 1, 1, 26)`, wantRebuild: `DATE_TIMESTAMP(1970, 1, 1, 26)`, wantValue: 93600000}, + // {name: "DATE_TRUNC", saql: `DATE_TRUNC('2017-02-03', 'month')`, wantRebuild: `DATE_TRUNC('2017-02-03', 'month')`, wantValue: "2017-02-01T00:00:00.000Z"}, + // {name: "DATE_TRUNC", saql: `DATE_TRUNC('2017-02-03 04:05:06', 'hours')`, wantRebuild: `DATE_TRUNC('2017-02-03 04:05:06', 'hours')`, wantValue: "2017-02-03 04:00:00.000Z"}, + // {name: "DATE_ROUND", saql: `DATE_ROUND('2000-04-28T11:11:11.111Z', 1, 'day')`, wantRebuild: `DATE_ROUND('2000-04-28T11:11:11.111Z', 1, 'day')`, wantValue: "2000-04-28T00:00:00.000Z"}, + // {name: "DATE_ROUND", saql: `DATE_ROUND('2000-04-10T11:39:29Z', 15, 'minutes')`, wantRebuild: `DATE_ROUND('2000-04-10T11:39:29Z', 15, 'minutes')`, wantValue: "2000-04-10T11:30:00.000Z"}, + // {name: "DATE_FORMAT", saql: `DATE_FORMAT(DATE_NOW(), "%q/%yyyy")`, wantRebuild: `DATE_FORMAT(DATE_NOW(), "%q/%yyyy")`}, + // {name: "DATE_FORMAT", saql: `DATE_FORMAT(DATE_NOW(), "%dd.%mm.%yyyy %hh:%ii:%ss,%fff")`, wantRebuild: `DATE_FORMAT(DATE_NOW(), "%dd.%mm.%yyyy %hh:%ii:%ss,%fff")`, wantValue: "18.09.2015 15:30:49,374"}, + // {name: "DATE_FORMAT", saql: `DATE_FORMAT("1969", "Summer of '%yy")`, wantRebuild: `DATE_FORMAT("1969", "Summer of '%yy")`, wantValue: "Summer of '69"}, + // {name: "DATE_FORMAT", saql: `DATE_FORMAT("2016", "%%l = %l")`, wantRebuild: `DATE_FORMAT("2016", "%%l = %l")`, wantValue: "%l = 1"}, + // {name: "DATE_FORMAT", saql: `DATE_FORMAT("2016-03-01", "%xxx%")`, wantRebuild: `DATE_FORMAT("2016-03-01", "%xxx%")`, wantValue: "063, trailing % ignored"}, + // {name: "DATE_ADD", saql: `DATE_ADD(DATE_NOW(), -1, "day")`, wantRebuild: `DATE_ADD(DATE_NOW(), -1, "day")`, wantValue: "yesterday; also see DATE_SUBTRACT()"}, + // {name: "DATE_ADD", saql: `DATE_ADD(DATE_NOW(), 3, "months")`, wantRebuild: `DATE_ADD(DATE_NOW(), 3, "months")`, wantValue: "in three months"}, + // {name: "DATE_ADD", saql: `DATE_ADD(DATE_ADD("2015-04-01", 5, "years"), 1, "month")`, wantRebuild: `DATE_ADD(DATE_ADD("2015-04-01", 5, "years"), 1, "month")`, wantValue: "May 1st 2020"}, + // {name: "DATE_ADD", saql: `DATE_ADD("2015-04-01", 12*5 + 1, "months")`, wantRebuild: `DATE_ADD("2015-04-01", 12*5 + 1, "months")`, wantValue: "also May 1st 2020"}, + // {name: "DATE_ADD", saql: `DATE_ADD(DATE_TIMESTAMP(DATE_YEAR(DATE_NOW()), 12, 24), -4, "years")`, wantRebuild: `DATE_ADD(DATE_TIMESTAMP(DATE_YEAR(DATE_NOW()), 12, 24), -4, "years")`, wantValue: "Christmas four years ago"}, + // {name: "DATE_ADD", saql: `DATE_ADD(DATE_ADD("2016-02", "month", 1), -1, "day")`, wantRebuild: `DATE_ADD(DATE_ADD("2016-02", "month", 1), -1, "day")`, wantValue: "last day of February (29th, because 2016 is a leap year!)"}, + // {name: "DATE_ADD", saql: `DATE_ADD(DATE_NOW(), "P1Y")`, wantRebuild: `DATE_ADD(DATE_NOW(), "P1Y")`}, + // {name: "DATE_ADD", saql: `DATE_ADD(DATE_NOW(), "P3M2W")`, wantRebuild: `DATE_ADD(DATE_NOW(), "P3M2W")`}, + // {name: "DATE_ADD", saql: `DATE_ADD(DATE_NOW(), "P5DT26H")`, wantRebuild: `DATE_ADD(DATE_NOW(), "P5DT26H")`}, + // {name: "DATE_ADD", saql: `DATE_ADD("2000-01-01", "PT4H")`, wantRebuild: `DATE_ADD("2000-01-01", "PT4H")`}, + // {name: "DATE_ADD", saql: `DATE_ADD("2000-01-01", "PT30M44.4S"`, wantRebuild: `DATE_ADD("2000-01-01", "PT30M44.4S"`}, + // {name: "DATE_ADD", saql: `DATE_ADD("2000-01-01", "P1Y2M3W4DT5H6M7.89S"`, wantRebuild: `DATE_ADD("2000-01-01", "P1Y2M3W4DT5H6M7.89S"`}, + // {name: "DATE_SUBTRACT", saql: `DATE_SUBTRACT(DATE_NOW(), 1, "day")`, wantRebuild: `DATE_SUBTRACT(DATE_NOW(), 1, "day")`}, + // {name: "DATE_SUBTRACT", saql: `DATE_SUBTRACT(DATE_TIMESTAMP(DATE_YEAR(DATE_NOW()), 12, 24), 4, "years")`, wantRebuild: `DATE_SUBTRACT(DATE_TIMESTAMP(DATE_YEAR(DATE_NOW()), 12, 24), 4, "years")`}, + // {name: "DATE_SUBTRACT", saql: `DATE_SUBTRACT(DATE_ADD("2016-02", "month", 1), 1, "day")`, wantRebuild: `DATE_SUBTRACT(DATE_ADD("2016-02", "month", 1), 1, "day")`}, + // {name: "DATE_SUBTRACT", saql: `DATE_SUBTRACT(DATE_NOW(), "P4D")`, wantRebuild: `DATE_SUBTRACT(DATE_NOW(), "P4D")`}, + // {name: "DATE_SUBTRACT", saql: `DATE_SUBTRACT(DATE_NOW(), "PT1H3M")`, wantRebuild: `DATE_SUBTRACT(DATE_NOW(), "PT1H3M")`}, + // DATE_COMPARE("1985-04-04", DATE_NOW(), "months", "days") + // DATE_COMPARE("1984-02-29", DATE_NOW(), "months", "days") + // DATE_COMPARE("2001-01-01T15:30:45.678Z", "2001-01-01T08:08:08.008Z", "years", "days") + + // https://www.arangodb.com/docs/3.7/aql/functions-document.html + {name: "ATTRIBUTES", saql: `ATTRIBUTES({"foo": "bar", "_key": "123", "_custom": "yes"})`, wantRebuild: `ATTRIBUTES({"foo": "bar", "_key": "123", "_custom": "yes"})`, wantValue: jsonParse(`["_custom", "_key", "foo"]`)}, + {name: "ATTRIBUTES", saql: `ATTRIBUTES({"foo": "bar", "_key": "123", "_custom": "yes"}, true)`, wantRebuild: `ATTRIBUTES({"foo": "bar", "_key": "123", "_custom": "yes"}, true)`, wantValue: jsonParse(`["foo"]`)}, + {name: "ATTRIBUTES", saql: `ATTRIBUTES({"foo": "bar", "_key": "123", "_custom": "yes"}, false, true)`, wantRebuild: `ATTRIBUTES({"foo": "bar", "_key": "123", "_custom": "yes"}, false, true)`, wantValue: jsonParse(`["_custom", "_key", "foo"]`)}, + {name: "HAS", saql: `HAS({name: "Jane"}, "name")`, wantRebuild: `HAS({name: "Jane"}, "name")`, wantValue: true}, + {name: "HAS", saql: `HAS({name: "Jane"}, "age")`, wantRebuild: `HAS({name: "Jane"}, "age")`, wantValue: false}, + {name: "HAS", saql: `HAS({name: null}, "name")`, wantRebuild: `HAS({name: null}, "name")`, wantValue: true}, + // KEEP(doc, "firstname", "name", "likes") + // KEEP(doc, ["firstname", "name", "likes"]) + // MATCHES({name: "jane", age: 27, active: true}, {age: 27, active: true}) + // MATCHES({"test": 1}, [{"test": 1, "foo": "bar"}, {"foo": 1}, {"test": 1}], true) + {name: "MERGE", saql: `MERGE({"user1": {"name": "Jane"}}, {"user2": {"name": "Tom"}})`, wantRebuild: `MERGE({"user1": {"name": "Jane"}}, {"user2": {"name": "Tom"}})`, wantValue: jsonParse(`{"user1": {"name": "Jane"}, "user2": {"name": "Tom"}}`)}, + {name: "MERGE", saql: `MERGE({"users": {"name": "Jane"}}, {"users": {"name": "Tom"}})`, wantRebuild: `MERGE({"users": {"name": "Jane"}}, {"users": {"name": "Tom"}})`, wantValue: jsonParse(`{"users": {"name": "Tom"}}`)}, + {name: "MERGE", saql: `MERGE([{foo: "bar"}, {quux: "quetzalcoatl", ruled: true}, {bar: "baz", foo: "done"}])`, wantRebuild: `MERGE([{foo: "bar"}, {quux: "quetzalcoatl", ruled: true}, {bar: "baz", foo: "done"}])`, wantValue: jsonParse(`{"foo": "done", "quux": "quetzalcoatl", "ruled": true, "bar": "baz"}`)}, + {name: "MERGE_RECURSIVE", saql: `MERGE_RECURSIVE({"user-1": {"name": "Jane", "livesIn": {"city": "LA"}}}, {"user-1": {"age": 42, "livesIn": {"state": "CA"}}})`, wantRebuild: `MERGE_RECURSIVE({"user-1": {"name": "Jane", "livesIn": {"city": "LA"}}}, {"user-1": {"age": 42, "livesIn": {"state": "CA"}}})`, wantValue: jsonParse(`{"user-1": {"name": "Jane", "livesIn": {"city": "LA", "state": "CA"}, "age": 42}}`)}, + // {name: "TRANSLATE", saql: `TRANSLATE("FR", {US: "United States", UK: "United Kingdom", FR: "France"})`, wantRebuild: `TRANSLATE("FR", {US: "United States", UK: "United Kingdom", FR: "France"})`, wantValue: "France"}, + // {name: "TRANSLATE", saql: `TRANSLATE(42, {foo: "bar", bar: "baz"})`, wantRebuild: `TRANSLATE(42, {foo: "bar", bar: "baz"})`, wantValue: 42}, + // {name: "TRANSLATE", saql: `TRANSLATE(42, {foo: "bar", bar: "baz"}, "not found!")`, wantRebuild: `TRANSLATE(42, {foo: "bar", bar: "baz"}, "not found!")`, wantValue: "not found!"}, + // UNSET(doc, "_id", "_key", "foo", "bar") + // UNSET(doc, ["_id", "_key", "foo", "bar"]) + // UNSET_RECURSIVE(doc, "_id", "_key", "foo", "bar") + // UNSET_RECURSIVE(doc, ["_id", "_key", "foo", "bar"]) + {name: "VALUES", saql: `VALUES({"_key": "users/jane", "name": "Jane", "age": 35})`, wantRebuild: `VALUES({"_key": "users/jane", "name": "Jane", "age": 35})`, wantValue: jsonParse(`[35, "Jane", "users/jane"]`)}, + {name: "VALUES", saql: `VALUES({"_key": "users/jane", "name": "Jane", "age": 35}, true)`, wantRebuild: `VALUES({"_key": "users/jane", "name": "Jane", "age": 35}, true)`, wantValue: jsonParse(`[35, "Jane"]`)}, + // {name: "ZIP", saql: `ZIP(["name", "active", "hobbies"], ["some user", true, ["swimming", "riding"]])`, wantRebuild: `ZIP(["name", "active", "hobbies"], ["some user", true, ["swimming", "riding"]])`, wantValue: jsonParse(`{"name": "some user", "active": true, "hobbies": ["swimming", "riding"]}`)}, + + // https://www.arangodb.com/docs/3.7/aql/functions-numeric.html + {name: "ABS", saql: `ABS(-5)`, wantRebuild: `ABS(-5)`, wantValue: 5}, + {name: "ABS", saql: `ABS(+5)`, wantRebuild: `ABS(5)`, wantValue: 5}, + {name: "ABS", saql: `ABS(3.5)`, wantRebuild: `ABS(3.5)`, wantValue: 3.5}, + {name: "ACOS", saql: `ACOS(-1)`, wantRebuild: `ACOS(-1)`, wantValue: 3.141592653589793}, + {name: "ACOS", saql: `ACOS(0)`, wantRebuild: `ACOS(0)`, wantValue: 1.5707963267948966}, + {name: "ACOS", saql: `ACOS(1)`, wantRebuild: `ACOS(1)`, wantValue: 0}, + {name: "ACOS", saql: `ACOS(2)`, wantRebuild: `ACOS(2)`, wantValue: nil}, + {name: "ASIN", saql: `ASIN(1)`, wantRebuild: `ASIN(1)`, wantValue: 1.5707963267948966}, + {name: "ASIN", saql: `ASIN(0)`, wantRebuild: `ASIN(0)`, wantValue: 0}, + {name: "ASIN", saql: `ASIN(-1)`, wantRebuild: `ASIN(-1)`, wantValue: -1.5707963267948966}, + {name: "ASIN", saql: `ASIN(2)`, wantRebuild: `ASIN(2)`, wantValue: nil}, + {name: "ATAN", saql: `ATAN(-1)`, wantRebuild: `ATAN(-1)`, wantValue: -0.7853981633974483}, + {name: "ATAN", saql: `ATAN(0)`, wantRebuild: `ATAN(0)`, wantValue: 0}, + {name: "ATAN", saql: `ATAN(10)`, wantRebuild: `ATAN(10)`, wantValue: 1.4711276743037347}, + {name: "AVERAGE", saql: `AVERAGE([5, 2, 9, 2])`, wantRebuild: `AVERAGE([5, 2, 9, 2])`, wantValue: 4.5}, + {name: "AVERAGE", saql: `AVERAGE([-3, -5, 2])`, wantRebuild: `AVERAGE([-3, -5, 2])`, wantValue: -2}, + {name: "AVERAGE", saql: `AVERAGE([999, 80, 4, 4, 4, 3, 3, 3])`, wantRebuild: `AVERAGE([999, 80, 4, 4, 4, 3, 3, 3])`, wantValue: 137.5}, + {name: "CEIL", saql: `CEIL(2.49)`, wantRebuild: `CEIL(2.49)`, wantValue: 3}, + {name: "CEIL", saql: `CEIL(2.50)`, wantRebuild: `CEIL(2.50)`, wantValue: 3}, + {name: "CEIL", saql: `CEIL(-2.50)`, wantRebuild: `CEIL(-2.50)`, wantValue: -2}, + {name: "CEIL", saql: `CEIL(-2.51)`, wantRebuild: `CEIL(-2.51)`, wantValue: -2}, + {name: "COS", saql: `COS(1)`, wantRebuild: `COS(1)`, wantValue: 0.5403023058681398}, + {name: "COS", saql: `COS(0)`, wantRebuild: `COS(0)`, wantValue: 1}, + {name: "COS", saql: `COS(-3.141592653589783)`, wantRebuild: `COS(-3.141592653589783)`, wantValue: -1}, + {name: "COS", saql: `COS(RADIANS(45))`, wantRebuild: `COS(RADIANS(45))`, wantValue: 0.7071067811865476}, + {name: "DEGREES", saql: `DEGREES(0.7853981633974483)`, wantRebuild: `DEGREES(0.7853981633974483)`, wantValue: 45}, + {name: "DEGREES", saql: `DEGREES(0)`, wantRebuild: `DEGREES(0)`, wantValue: 0}, + {name: "DEGREES", saql: `DEGREES(3.141592653589793)`, wantRebuild: `DEGREES(3.141592653589793)`, wantValue: 180}, + {name: "EXP", saql: `EXP(1)`, wantRebuild: `EXP(1)`, wantValue: 2.718281828459045}, + {name: "EXP", saql: `EXP(10)`, wantRebuild: `EXP(10)`, wantValue: 22026.46579480671}, + {name: "EXP", saql: `EXP(0)`, wantRebuild: `EXP(0)`, wantValue: 1}, + {name: "EXP2", saql: `EXP2(16)`, wantRebuild: `EXP2(16)`, wantValue: 65536}, + {name: "EXP2", saql: `EXP2(1)`, wantRebuild: `EXP2(1)`, wantValue: 2}, + {name: "EXP2", saql: `EXP2(0)`, wantRebuild: `EXP2(0)`, wantValue: 1}, + {name: "FLOOR", saql: `FLOOR(2.49)`, wantRebuild: `FLOOR(2.49)`, wantValue: 2}, + {name: "FLOOR", saql: `FLOOR(2.50)`, wantRebuild: `FLOOR(2.50)`, wantValue: 2}, + {name: "FLOOR", saql: `FLOOR(-2.50)`, wantRebuild: `FLOOR(-2.50)`, wantValue: -3}, + {name: "FLOOR", saql: `FLOOR(-2.51)`, wantRebuild: `FLOOR(-2.51)`, wantValue: -3}, + {name: "LOG", saql: `LOG(2.718281828459045)`, wantRebuild: `LOG(2.718281828459045)`, wantValue: 1}, + {name: "LOG", saql: `LOG(10)`, wantRebuild: `LOG(10)`, wantValue: 2.302585092994046}, + {name: "LOG", saql: `LOG(0)`, wantRebuild: `LOG(0)`, wantValue: nil}, + {name: "LOG2", saql: `LOG2(1024)`, wantRebuild: `LOG2(1024)`, wantValue: 10}, + {name: "LOG2", saql: `LOG2(8)`, wantRebuild: `LOG2(8)`, wantValue: 3}, + {name: "LOG2", saql: `LOG2(0)`, wantRebuild: `LOG2(0)`, wantValue: nil}, + {name: "LOG10", saql: `LOG10(10000)`, wantRebuild: `LOG10(10000)`, wantValue: 4}, + {name: "LOG10", saql: `LOG10(10)`, wantRebuild: `LOG10(10)`, wantValue: 1}, + {name: "LOG10", saql: `LOG10(0)`, wantRebuild: `LOG10(0)`, wantValue: nil}, + {name: "MAX", saql: `MAX([5, 9, -2, null, 1])`, wantRebuild: `MAX([5, 9, -2, null, 1])`, wantValue: 9}, + {name: "MAX", saql: `MAX([null, null])`, wantRebuild: `MAX([null, null])`, wantValue: nil}, + {name: "MEDIAN", saql: `MEDIAN([1, 2, 3])`, wantRebuild: `MEDIAN([1, 2, 3])`, wantValue: 2}, + {name: "MEDIAN", saql: `MEDIAN([1, 2, 3, 4])`, wantRebuild: `MEDIAN([1, 2, 3, 4])`, wantValue: 2.5}, + {name: "MEDIAN", saql: `MEDIAN([4, 2, 3, 1])`, wantRebuild: `MEDIAN([4, 2, 3, 1])`, wantValue: 2.5}, + {name: "MEDIAN", saql: `MEDIAN([999, 80, 4, 4, 4, 3, 3, 3])`, wantRebuild: `MEDIAN([999, 80, 4, 4, 4, 3, 3, 3])`, wantValue: 4}, + {name: "MIN", saql: `MIN([5, 9, -2, null, 1])`, wantRebuild: `MIN([5, 9, -2, null, 1])`, wantValue: -2}, + {name: "MIN", saql: `MIN([null, null])`, wantRebuild: `MIN([null, null])`, wantValue: nil}, + // {name: "PERCENTILE", saql: `PERCENTILE([1, 2, 3, 4], 50)`, wantRebuild: `PERCENTILE([1, 2, 3, 4], 50)`, wantValue: 2}, + // {name: "PERCENTILE", saql: `PERCENTILE([1, 2, 3, 4], 50, "rank")`, wantRebuild: `PERCENTILE([1, 2, 3, 4], 50, "rank")`, wantValue: 2}, + // {name: "PERCENTILE", saql: `PERCENTILE([1, 2, 3, 4], 50, "interpolation")`, wantRebuild: `PERCENTILE([1, 2, 3, 4], 50, "interpolation")`, wantValue: 2.5}, + {name: "PI", saql: `PI()`, wantRebuild: `PI()`, wantValue: 3.141592653589793}, + {name: "POW", saql: `POW(2, 4)`, wantRebuild: `POW(2, 4)`, wantValue: 16}, + {name: "POW", saql: `POW(5, -1)`, wantRebuild: `POW(5, -1)`, wantValue: 0.2}, + {name: "POW", saql: `POW(5, 0)`, wantRebuild: `POW(5, 0)`, wantValue: 1}, + {name: "PRODUCT", saql: `PRODUCT([1, 2, 3, 4])`, wantRebuild: `PRODUCT([1, 2, 3, 4])`, wantValue: 24}, + {name: "PRODUCT", saql: `PRODUCT([null, -5, 6])`, wantRebuild: `PRODUCT([null, -5, 6])`, wantValue: -30}, + {name: "PRODUCT", saql: `PRODUCT([])`, wantRebuild: `PRODUCT([])`, wantValue: 1}, + {name: "RADIANS", saql: `RADIANS(180)`, wantRebuild: `RADIANS(180)`, wantValue: 3.141592653589793}, + {name: "RADIANS", saql: `RADIANS(90)`, wantRebuild: `RADIANS(90)`, wantValue: 1.5707963267948966}, + {name: "RADIANS", saql: `RADIANS(0)`, wantRebuild: `RADIANS(0)`, wantValue: 0}, + // {name: "RAND", saql: `RAND()`, wantRebuild: `RAND()`, wantValue: 0.3503170117504508}, + // {name: "RAND", saql: `RAND()`, wantRebuild: `RAND()`, wantValue: 0.6138226173882478}, + {name: "RANGE", saql: `RANGE(1, 4)`, wantRebuild: `RANGE(1, 4)`, wantValue: []interface{}{float64(1), float64(2), float64(3), float64(4)}}, + {name: "RANGE", saql: `RANGE(1, 4, 2)`, wantRebuild: `RANGE(1, 4, 2)`, wantValue: []interface{}{float64(1), float64(3)}}, + {name: "RANGE", saql: `RANGE(1, 4, 3)`, wantRebuild: `RANGE(1, 4, 3)`, wantValue: []interface{}{float64(1), float64(4)}}, + {name: "RANGE", saql: `RANGE(1.5, 2.5)`, wantRebuild: `RANGE(1.5, 2.5)`, wantValue: []interface{}{float64(1), float64(2)}}, + {name: "RANGE", saql: `RANGE(1.5, 2.5, 1)`, wantRebuild: `RANGE(1.5, 2.5, 1)`, wantValue: []interface{}{1.5, 2.5}}, + {name: "RANGE", saql: `RANGE(1.5, 2.5, 0.5)`, wantRebuild: `RANGE(1.5, 2.5, 0.5)`, wantValue: []interface{}{1.5, 2.0, 2.5}}, + {name: "RANGE", saql: `RANGE(-0.75, 1.1, 0.5)`, wantRebuild: `RANGE(-0.75, 1.1, 0.5)`, wantValue: []interface{}{-0.75, -0.25, 0.25, 0.75}}, + {name: "ROUND", saql: `ROUND(2.49)`, wantRebuild: `ROUND(2.49)`, wantValue: 2}, + {name: "ROUND", saql: `ROUND(2.50)`, wantRebuild: `ROUND(2.50)`, wantValue: 3}, + {name: "ROUND", saql: `ROUND(-2.50)`, wantRebuild: `ROUND(-2.50)`, wantValue: -2}, + {name: "ROUND", saql: `ROUND(-2.51)`, wantRebuild: `ROUND(-2.51)`, wantValue: -3}, + {name: "SQRT", saql: `SQRT(9)`, wantRebuild: `SQRT(9)`, wantValue: 3}, + {name: "SQRT", saql: `SQRT(2)`, wantRebuild: `SQRT(2)`, wantValue: 1.4142135623730951}, + {name: "POW", saql: `POW(4096, 1/4)`, wantRebuild: `POW(4096, 1 / 4)`, wantValue: 8}, + {name: "POW", saql: `POW(27, 1/3)`, wantRebuild: `POW(27, 1 / 3)`, wantValue: 3}, + {name: "POW", saql: `POW(9, 1/2)`, wantRebuild: `POW(9, 1 / 2)`, wantValue: 3}, + // {name: "STDDEV_POPULATION", saql: `STDDEV_POPULATION([1, 3, 6, 5, 2])`, wantRebuild: `STDDEV_POPULATION([1, 3, 6, 5, 2])`, wantValue: 1.854723699099141}, + // {name: "STDDEV_SAMPLE", saql: `STDDEV_SAMPLE([1, 3, 6, 5, 2])`, wantRebuild: `STDDEV_SAMPLE([1, 3, 6, 5, 2])`, wantValue: 2.0736441353327724}, + {name: "SUM", saql: `SUM([1, 2, 3, 4])`, wantRebuild: `SUM([1, 2, 3, 4])`, wantValue: 10}, + {name: "SUM", saql: `SUM([null, -5, 6])`, wantRebuild: `SUM([null, -5, 6])`, wantValue: 1}, + {name: "SUM", saql: `SUM([])`, wantRebuild: `SUM([])`, wantValue: 0}, + {name: "TAN", saql: `TAN(10)`, wantRebuild: `TAN(10)`, wantValue: 0.6483608274590866}, + {name: "TAN", saql: `TAN(5)`, wantRebuild: `TAN(5)`, wantValue: -3.380515006246586}, + {name: "TAN", saql: `TAN(0)`, wantRebuild: `TAN(0)`, wantValue: 0}, + // {name: "VARIANCE_POPULATION", saql: `VARIANCE_POPULATION([1, 3, 6, 5, 2])`, wantRebuild: `VARIANCE_POPULATION([1, 3, 6, 5, 2])`, wantValue: 3.4400000000000004}, + // {name: "VARIANCE_SAMPLE", saql: `VARIANCE_SAMPLE([1, 3, 6, 5, 2])`, wantRebuild: `VARIANCE_SAMPLE([1, 3, 6, 5, 2])`, wantValue: 4.300000000000001}, + + // Errors + {name: "Function Error 1", saql: "UNKNOWN(value)", wantRebuild: "UNKNOWN(value)", wantRebuildErr: true, wantEvalErr: true, values: `{"value": true}`}, + {name: "Function Error 2", saql: "ABS(value, value2)", wantRebuild: "ABS(value, value2)", wantEvalErr: true, values: `{"value": true, "value2": false}`}, + {name: "Function Error 3", saql: `ABS("abs")`, wantRebuild: `ABS("abs")`, wantEvalErr: true}, + } + for _, tt := range tests { + parser := &Parser{} + + t.Run(tt.name, func(t *testing.T) { + expr, err := parser.Parse(tt.saql) + if (err != nil) != tt.wantParseErr { + t.Errorf("Parse() error = %v, wantErr %v", err, tt.wantParseErr) + if expr != nil { + t.Error(expr.String()) + } + return + } + if err != nil { + return + } + + got, err := expr.String() + if (err != nil) != tt.wantRebuildErr { + t.Error(expr.String()) + t.Errorf("String() error = %v, wantErr %v", err, tt.wantParseErr) + return + } + if err != nil { + return + } + if got != tt.wantRebuild { + t.Errorf("String() got = %v, want %v", got, tt.wantRebuild) + } + + var myJson map[string]interface{} + if tt.values != "" { + err = json.Unmarshal([]byte(tt.values), &myJson) + if err != nil { + t.Fatal(err) + } + } + + value, err := expr.Eval(myJson) + if (err != nil) != tt.wantEvalErr { + t.Error(expr.String()) + t.Errorf("Parse() error = %v, wantErr %v", err, tt.wantParseErr) + return + } + if err != nil { + return + } + + wantValue := tt.wantValue + if i, ok := wantValue.(int); ok { + wantValue = float64(i) + } + + valueFloat, ok := value.(float64) + wantValueFloat, ok2 := wantValue.(float64) + if ok && ok2 { + if math.Abs(valueFloat-wantValueFloat) > 0.0001 { + t.Error(expr.String()) + t.Errorf("Eval() got = %T %#v, want %T %#v", value, value, wantValue, wantValue) + } + } else { + if !reflect.DeepEqual(value, wantValue) { + t.Error(expr.String()) + t.Errorf("Eval() got = %T %#v, want %T %#v", value, value, wantValue, wantValue) + } + } + }) + } +} + +func jsonParse(s string) interface{} { + if s == "" { + return nil + } + var j interface{} + err := json.Unmarshal([]byte(s), &j) + if err != nil { + panic(s + err.Error()) + } + return j +} diff --git a/caql/interpreter.go b/caql/interpreter.go new file mode 100644 index 0000000..fce3685 --- /dev/null +++ b/caql/interpreter.go @@ -0,0 +1,355 @@ +package caql + +import ( + "fmt" + "strconv" + "strings" + + "github.com/SecurityBrewery/catalyst/generated/caql/parser" +) + +type aqlInterpreter struct { + *parser.BaseCAQLParserListener + values map[string]interface{} + stack []interface{} + errs []error +} + +// push is a helper function for pushing new node to the listener Stack. +func (s *aqlInterpreter) push(i interface{}) { + s.stack = append(s.stack, i) +} + +// pop is a helper function for poping a node from the listener Stack. +func (s *aqlInterpreter) pop() (n interface{}) { + // Check that we have nodes in the stack. + size := len(s.stack) + if size < 1 { + s.appendErrors(ErrStack) + return + } + + // Pop the last value from the Stack. + n, s.stack = s.stack[size-1], s.stack[:size-1] + + return +} + +func (s *aqlInterpreter) binaryPop() (interface{}, interface{}) { + right, left := s.pop(), s.pop() + return left, right +} + +// ExitExpression is called when production expression is exited. +func (s *aqlInterpreter) ExitExpression(ctx *parser.ExpressionContext) { + switch { + case ctx.Value_literal() != nil: + // pass + case ctx.Reference() != nil: + // pass + case ctx.Operator_unary() != nil: + // pass + + case ctx.T_PLUS() != nil: + s.push(plus(s.binaryPop())) + case ctx.T_MINUS() != nil: + s.push(minus(s.binaryPop())) + + case ctx.T_TIMES() != nil: + s.push(times(s.binaryPop())) + case ctx.T_DIV() != nil: + s.push(div(s.binaryPop())) + case ctx.T_MOD() != nil: + s.push(mod(s.binaryPop())) + + case ctx.T_RANGE() != nil: + s.push(aqlrange(s.binaryPop())) + + case ctx.T_LT() != nil && ctx.GetEq_op() == nil: + s.push(lt(s.binaryPop())) + case ctx.T_GT() != nil && ctx.GetEq_op() == nil: + s.push(gt(s.binaryPop())) + case ctx.T_LE() != nil && ctx.GetEq_op() == nil: + s.push(le(s.binaryPop())) + case ctx.T_GE() != nil && ctx.GetEq_op() == nil: + s.push(ge(s.binaryPop())) + + case ctx.T_IN() != nil && ctx.GetEq_op() == nil: + s.push(maybeNot(ctx, in(s.binaryPop()))) + + case ctx.T_EQ() != nil && ctx.GetEq_op() == nil: + s.push(eq(s.binaryPop())) + case ctx.T_NE() != nil && ctx.GetEq_op() == nil: + s.push(ne(s.binaryPop())) + + case ctx.T_ALL() != nil && ctx.GetEq_op() != nil: + right, left := s.pop(), s.pop() + s.push(all(left.([]interface{}), getOp(ctx.GetEq_op().GetTokenType()), right)) + case ctx.T_ANY() != nil && ctx.GetEq_op() != nil: + right, left := s.pop(), s.pop() + s.push(any(left.([]interface{}), getOp(ctx.GetEq_op().GetTokenType()), right)) + case ctx.T_NONE() != nil && ctx.GetEq_op() != nil: + right, left := s.pop(), s.pop() + s.push(none(left.([]interface{}), getOp(ctx.GetEq_op().GetTokenType()), right)) + + case ctx.T_ALL() != nil && ctx.T_NOT() != nil && ctx.T_IN() != nil: + right, left := s.pop(), s.pop() + s.push(all(left.([]interface{}), in, right)) + case ctx.T_ANY() != nil && ctx.T_NOT() != nil && ctx.T_IN() != nil: + right, left := s.pop(), s.pop() + s.push(any(left.([]interface{}), in, right)) + case ctx.T_NONE() != nil && ctx.T_NOT() != nil && ctx.T_IN() != nil: + right, left := s.pop(), s.pop() + s.push(none(left.([]interface{}), in, right)) + + case ctx.T_LIKE() != nil: + m, err := like(s.binaryPop()) + s.appendErrors(err) + s.push(maybeNot(ctx, m)) + case ctx.T_REGEX_MATCH() != nil: + m, err := regexMatch(s.binaryPop()) + s.appendErrors(err) + s.push(maybeNot(ctx, m)) + case ctx.T_REGEX_NON_MATCH() != nil: + m, err := regexNonMatch(s.binaryPop()) + s.appendErrors(err) + s.push(maybeNot(ctx, m)) + + case ctx.T_AND() != nil: + s.push(and(s.binaryPop())) + case ctx.T_OR() != nil: + s.push(or(s.binaryPop())) + + case ctx.T_QUESTION() != nil && len(ctx.AllExpression()) == 3: + right, middle, left := s.pop(), s.pop(), s.pop() + s.push(ternary(left, middle, right)) + case ctx.T_QUESTION() != nil && len(ctx.AllExpression()) == 2: + right, left := s.pop(), s.pop() + s.push(ternary(left, nil, right)) + + default: + panic("unkown expression") + } +} + +func (s *aqlInterpreter) appendErrors(err error) { + if err != nil { + s.errs = append(s.errs, err) + } +} + +// ExitOperator_unary is called when production operator_unary is exited. +func (s *aqlInterpreter) ExitOperator_unary(ctx *parser.Operator_unaryContext) { + value := s.pop() + switch { + case ctx.T_PLUS() != nil: + s.push(value.(float64)) + case ctx.T_MINUS() != nil: + s.push(-value.(float64)) + case ctx.T_NOT() != nil: + s.push(!toBool(value)) + default: + panic(fmt.Sprintf("unexpected operation: %s", ctx.GetText())) + } +} + +// ExitReference is called when production reference is exited. +func (s *aqlInterpreter) ExitReference(ctx *parser.ReferenceContext) { + switch { + case ctx.DOT() != nil: + reference := s.pop() + + s.push(reference.(map[string]interface{})[ctx.T_STRING().GetText()]) + case ctx.T_STRING() != nil: + s.push(s.getVar(ctx.T_STRING().GetText())) + case ctx.Compound_value() != nil: + // pass + case ctx.Function_call() != nil: + // pass + case ctx.T_OPEN() != nil: + // pass + case ctx.T_ARRAY_OPEN() != nil: + key := s.pop() + reference := s.pop() + + if f, ok := key.(float64); ok { + index := int(f) + if index < 0 { + index = len(reference.([]interface{})) + index + } + + s.push(reference.([]interface{})[index]) + return + } + + s.push(reference.(map[string]interface{})[key.(string)]) + default: + panic(fmt.Sprintf("unexpected value: %s", ctx.GetText())) + } +} + +// ExitCompound_value is called when production compound_value is exited. +func (s *aqlInterpreter) ExitCompound_value(ctx *parser.Compound_valueContext) { + // pass +} + +// ExitFunction_call is called when production function_call is exited. +func (s *aqlInterpreter) ExitFunction_call(ctx *parser.Function_callContext) { + s.function(ctx) +} + +// ExitValue_literal is called when production value_literal is exited. +func (s *aqlInterpreter) ExitValue_literal(ctx *parser.Value_literalContext) { + switch { + case ctx.T_QUOTED_STRING() != nil: + st, err := unquote(ctx.GetText()) + s.appendErrors(err) + s.push(st) + case ctx.T_INT() != nil: + t := ctx.GetText() + + switch { + case strings.HasPrefix(strings.ToLower(t), "0b"): + i64, err := strconv.ParseInt(t[2:], 2, 64) + s.appendErrors(err) + s.push(float64(i64)) + case strings.HasPrefix(strings.ToLower(t), "0x"): + i64, err := strconv.ParseInt(t[2:], 16, 64) + s.appendErrors(err) + s.push(float64(i64)) + default: + i, err := strconv.Atoi(t) + s.appendErrors(err) + s.push(float64(i)) + } + case ctx.T_FLOAT() != nil: + i, err := strconv.ParseFloat(ctx.GetText(), 64) + s.appendErrors(err) + s.push(i) + case ctx.T_NULL() != nil: + s.push(nil) + case ctx.T_TRUE() != nil: + s.push(true) + case ctx.T_FALSE() != nil: + s.push(false) + default: + panic(fmt.Sprintf("unexpected value: %s", ctx.GetText())) + } +} + +// ExitArray is called when production array is exited. +func (s *aqlInterpreter) ExitArray(ctx *parser.ArrayContext) { + array := []interface{}{} + for range ctx.AllExpression() { + // prepend element + array = append([]interface{}{s.pop()}, array...) + } + s.push(array) +} + +// ExitObject is called when production object is exited. +func (s *aqlInterpreter) ExitObject(ctx *parser.ObjectContext) { + object := map[string]interface{}{} + for range ctx.AllObject_element() { + key, value := s.pop(), s.pop() + + object[key.(string)] = value + } + s.push(object) +} + +// ExitObject_element is called when production object_element is exited. +func (s *aqlInterpreter) ExitObject_element(ctx *parser.Object_elementContext) { + switch { + case ctx.T_STRING() != nil: + s.push(ctx.GetText()) + s.push(s.getVar(ctx.GetText())) + case ctx.Object_element_name() != nil, ctx.T_ARRAY_OPEN() != nil: + key, value := s.pop(), s.pop() + + s.push(key) + s.push(value) + default: + panic(fmt.Sprintf("unexpected value: %s", ctx.GetText())) + } +} + +// ExitObject_element_name is called when production object_element_name is exited. +func (s *aqlInterpreter) ExitObject_element_name(ctx *parser.Object_element_nameContext) { + switch { + case ctx.T_STRING() != nil: + s.push(ctx.T_STRING().GetText()) + case ctx.T_QUOTED_STRING() != nil: + st, err := unquote(ctx.T_QUOTED_STRING().GetText()) + if err != nil { + s.appendErrors(fmt.Errorf("%w: %s", err, ctx.GetText())) + } + s.push(st) + default: + panic(fmt.Sprintf("unexpected value: %s", ctx.GetText())) + } +} + +func (s *aqlInterpreter) getVar(identifier string) interface{} { + v, ok := s.values[identifier] + if !ok { + s.appendErrors(ErrUndefined) + } + + return v +} + +func maybeNot(ctx *parser.ExpressionContext, m bool) bool { + if ctx.T_NOT() != nil { + return !m + } + return m +} + +func getOp(tokenType int) func(left, right interface{}) bool { + switch tokenType { + case parser.CAQLLexerT_EQ: + return eq + case parser.CAQLLexerT_NE: + return ne + case parser.CAQLLexerT_LT: + return lt + case parser.CAQLLexerT_GT: + return gt + case parser.CAQLLexerT_LE: + return le + case parser.CAQLLexerT_GE: + return ge + case parser.CAQLLexerT_IN: + return in + default: + panic("unkown token type") + } +} + +func all(slice []interface{}, op func(interface{}, interface{}) bool, expr interface{}) bool { + for _, e := range slice { + if !op(e, expr) { + return false + } + } + return true +} + +func any(slice []interface{}, op func(interface{}, interface{}) bool, expr interface{}) bool { + for _, e := range slice { + if op(e, expr) { + return true + } + } + return false +} + +func none(slice []interface{}, op func(interface{}, interface{}) bool, expr interface{}) bool { + for _, e := range slice { + if op(e, expr) { + return false + } + } + return true +} diff --git a/caql/operations.go b/caql/operations.go new file mode 100644 index 0000000..e7e2ae9 --- /dev/null +++ b/caql/operations.go @@ -0,0 +1,497 @@ +package caql + +import ( + "math" + "regexp" + "sort" + "strconv" + "strings" +) + +// Logical operators https://www.arangodb.com/docs/3.7/aql/operators.html#logical-operators + +func or(left, right interface{}) interface{} { + if toBool(left) { + return left + } + return right +} + +func and(left, right interface{}) interface{} { + if !toBool(left) { + return left + } + return right +} + +func toBool(i interface{}) bool { + switch v := i.(type) { + case nil: + return false + case bool: + return v + case int: + return v != 0 + case float64: + return v != 0 + case string: + return v != "" + case []interface{}: + return true + case map[string]interface{}: + return true + default: + panic("bool conversion failed") + } +} + +// Arithmetic operators https://www.arangodb.com/docs/3.7/aql/operators.html#arithmetic-operators + +func plus(left, right interface{}) float64 { + return toNumber(left) + toNumber(right) +} + +func minus(left, right interface{}) float64 { + return toNumber(left) - toNumber(right) +} + +func times(left, right interface{}) float64 { + return round(toNumber(left) * toNumber(right)) +} + +func round(r float64) float64 { + return math.Round(r*100000) / 100000 +} + +func div(left, right interface{}) float64 { + b := toNumber(right) + if b == 0 { + return 0 + } + return round(toNumber(left) / b) +} + +func mod(left, right interface{}) float64 { + return math.Mod(toNumber(left), toNumber(right)) +} + +func toNumber(i interface{}) float64 { + switch v := i.(type) { + case nil: + return 0 + case bool: + if v { + return 1 + } + return 0 + case float64: + switch { + case math.IsNaN(v): + return 0 + case math.IsInf(v, 0): + return 0 + } + return v + case string: + f, err := strconv.ParseFloat(strings.TrimSpace(v), 64) + if err != nil { + return 0 + } + return f + case []interface{}: + if len(v) == 0 { + return 0 + } + if len(v) == 1 { + return toNumber(v[0]) + } + return 0 + case map[string]interface{}: + return 0 + default: + panic("number conversion error") + } +} + +// Logical operators https://www.arangodb.com/docs/3.7/aql/operators.html#logical-operators +// Order https://www.arangodb.com/docs/3.7/aql/fundamentals-type-value-order.html + +func eq(left, right interface{}) bool { + leftV, rightV := typeValue(left), typeValue(right) + if leftV != rightV { + return false + } + switch l := left.(type) { + case nil: + return true + case bool, float64, string: + return left == right + case []interface{}: + ra := right.([]interface{}) + max := len(l) + if len(ra) > max { + max = len(ra) + } + for i := 0; i < max; i++ { + var li interface{} = nil + var rai interface{} = nil + if len(l) > i { + li = l[i] + } + if len(ra) > i { + rai = ra[i] + } + + if !eq(li, rai) { + return false + } + } + return true + case map[string]interface{}: + ro := right.(map[string]interface{}) + + for _, key := range keys(l, ro) { + var li interface{} = nil + var rai interface{} = nil + if lv, ok := l[key]; ok { + li = lv + } + if rv, ok := ro[key]; ok { + rai = rv + } + + if !eq(li, rai) { + return false + } + } + return true + default: + panic("unknown type") + } +} + +func ne(left, right interface{}) bool { + return !eq(left, right) +} + +func lt(left, right interface{}) bool { + leftV, rightV := typeValue(left), typeValue(right) + if leftV != rightV { + return leftV < rightV + } + switch l := left.(type) { + case nil: + return false + case bool: + return toNumber(l) < toNumber(right) + case int: + return l < right.(int) + case float64: + return l < right.(float64) + case string: + return l < right.(string) + case []interface{}: + ra := right.([]interface{}) + max := len(l) + if len(ra) > max { + max = len(ra) + } + for i := 0; i < max; i++ { + var li interface{} = nil + var rai interface{} = nil + if len(l) > i { + li = l[i] + } + if len(ra) > i { + rai = ra[i] + } + + if !eq(li, rai) { + return lt(li, rai) + } + } + return false + case map[string]interface{}: + ro := right.(map[string]interface{}) + + for _, key := range keys(l, ro) { + var li interface{} = nil + var rai interface{} = nil + if lv, ok := l[key]; ok { + li = lv + } + if rv, ok := ro[key]; ok { + rai = rv + } + + if !eq(li, rai) { + return lt(li, rai) + } + } + return false + default: + panic("unknown type") + } +} + +func keys(l map[string]interface{}, ro map[string]interface{}) []string { + var keys []string + seen := map[string]bool{} + for _, a := range []map[string]interface{}{l, ro} { + for k := range a { + if _, ok := seen[k]; !ok { + seen[k] = true + keys = append(keys, k) + } + } + } + sort.Strings(keys) + return keys +} + +func gt(left, right interface{}) bool { + leftV, rightV := typeValue(left), typeValue(right) + if leftV != rightV { + return leftV > rightV + } + switch l := left.(type) { + case nil: + return false + case bool: + return toNumber(l) > toNumber(right) + case int: + return l > right.(int) + case float64: + return l > right.(float64) + case string: + return l > right.(string) + case []interface{}: + ra := right.([]interface{}) + max := len(l) + if len(ra) > max { + max = len(ra) + } + for i := 0; i < max; i++ { + var li interface{} = nil + var rai interface{} = nil + if len(l) > i { + li = l[i] + } + if len(ra) > i { + rai = ra[i] + } + + if !eq(li, rai) { + return gt(li, rai) + } + } + return false + case map[string]interface{}: + ro := right.(map[string]interface{}) + + for _, key := range keys(l, ro) { + var li interface{} = nil + var rai interface{} = nil + if lv, ok := l[key]; ok { + li = lv + } + if rv, ok := ro[key]; ok { + rai = rv + } + + if !eq(li, rai) { + return gt(li, rai) + } + } + return false + default: + panic("unknown type") + } +} + +func le(left, right interface{}) bool { + leftV, rightV := typeValue(left), typeValue(right) + if leftV != rightV { + return leftV <= rightV + } + switch l := left.(type) { + case nil: + return false + case bool: + return toNumber(l) <= toNumber(right) + case int: + return l <= right.(int) + case float64: + return l <= right.(float64) + case string: + return l <= right.(string) + case []interface{}: + ra := right.([]interface{}) + max := len(l) + if len(ra) > max { + max = len(ra) + } + for i := 0; i < max; i++ { + var li interface{} = nil + var rai interface{} = nil + if len(l) > i { + li = l[i] + } + if len(ra) > i { + rai = ra[i] + } + + if !eq(li, rai) { + return le(li, rai) + } + } + return true + case map[string]interface{}: + ro := right.(map[string]interface{}) + + for _, key := range keys(l, ro) { + var li interface{} = nil + var rai interface{} = nil + if lv, ok := l[key]; ok { + li = lv + } + if rv, ok := ro[key]; ok { + rai = rv + } + + if !eq(li, rai) { + return lt(li, rai) + } + } + return true + default: + panic("unknown type") + } +} + +func ge(left, right interface{}) bool { + leftV, rightV := typeValue(left), typeValue(right) + if leftV != rightV { + return leftV >= rightV + } + switch l := left.(type) { + case nil: + return false + case bool: + return toNumber(l) >= toNumber(right) + case int: + return l >= right.(int) + case float64: + return l >= right.(float64) + case string: + return l >= right.(string) + case []interface{}: + ra := right.([]interface{}) + max := len(l) + if len(ra) > max { + max = len(ra) + } + for i := 0; i < max; i++ { + var li interface{} = nil + var rai interface{} = nil + if len(l) > i { + li = l[i] + } + if len(ra) > i { + rai = ra[i] + } + + if !eq(li, rai) { + return ge(li, rai) + } + } + return true + case map[string]interface{}: + ro := right.(map[string]interface{}) + + for _, key := range keys(l, ro) { + var li interface{} = nil + var rai interface{} = nil + if lv, ok := l[key]; ok { + li = lv + } + if rv, ok := ro[key]; ok { + rai = rv + } + + if !eq(li, rai) { + return gt(li, rai) + } + } + return true + default: + panic("unknown type") + } +} + +func in(left, right interface{}) bool { + a, ok := right.([]interface{}) + if !ok { + return false + } + for _, v := range a { + if left == v { + return true + } + } + return false +} + +func like(left, right interface{}) (bool, error) { + return match(right.(string), left.(string)) +} + +func regexMatch(left, right interface{}) (bool, error) { + return regexp.Match(right.(string), []byte(left.(string))) +} + +func regexNonMatch(left, right interface{}) (bool, error) { + m, err := regexp.Match(right.(string), []byte(left.(string))) + return !m, err +} + +func typeValue(v interface{}) int { + switch v.(type) { + case nil: + return 0 + case bool: + return 1 + case float64, int: + return 2 + case string: + return 3 + case []interface{}: + return 4 + case map[string]interface{}: + return 5 + default: + panic("unknown type") + } +} + +// Ternary operator https://www.arangodb.com/docs/3.7/aql/operators.html#ternary-operator + +func ternary(left, middle, right interface{}) interface{} { + if toBool(left) { + if middle != nil { + return middle + } + return left + } + return right +} + +// Range operators https://www.arangodb.com/docs/3.7/aql/operators.html#range-operator + +func aqlrange(left, right interface{}) []float64 { + var v []float64 + for i := int(left.(float64)); i <= int(right.(float64)); i++ { + v = append(v, float64(i)) + } + return v +} diff --git a/caql/parser.go b/caql/parser.go new file mode 100644 index 0000000..05cc93c --- /dev/null +++ b/caql/parser.go @@ -0,0 +1,120 @@ +package caql + +import ( + "errors" + "fmt" + "strconv" + + "github.com/antlr/antlr4/runtime/Go/antlr" + + "github.com/SecurityBrewery/catalyst/generated/caql/parser" +) + +type Parser struct { + Searcher Searcher + Prefix string +} + +func (p *Parser) Parse(aql string) (t *Tree, err error) { + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("%s", r) + } + }() + // Setup the input + inputStream := antlr.NewInputStream(aql) + + errorListener := &errorListener{} + + // Create the Lexer + lexer := parser.NewCAQLLexer(inputStream) + lexer.RemoveErrorListeners() + lexer.AddErrorListener(errorListener) + stream := antlr.NewCommonTokenStream(lexer, antlr.TokenDefaultChannel) + + // Create the Parser + aqlParser := parser.NewCAQLParser(stream) + + aqlParser.RemoveErrorListeners() + aqlParser.AddErrorListener(errorListener) + aqlParser.SetErrorHandler(antlr.NewBailErrorStrategy()) + if errorListener.errs != nil { + err = errorListener.errs[0] + } + + return &Tree{aqlParser: aqlParser, parseContext: aqlParser.Parse(), searcher: p.Searcher, prefix: p.Prefix}, err +} + +type Tree struct { + parseContext parser.IParseContext + aqlParser *parser.CAQLParser + searcher Searcher + prefix string +} + +func (t *Tree) Eval(values map[string]interface{}) (i interface{}, err error) { + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("%s", r) + } + }() + interpreter := aqlInterpreter{values: values} + + antlr.ParseTreeWalkerDefault.Walk(&interpreter, t.parseContext) + + if interpreter.errs != nil { + return nil, interpreter.errs[0] + } + return interpreter.stack[0], nil +} + +func (t *Tree) String() (s string, err error) { + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("%s", r) + } + }() + builder := aqlBuilder{searcher: t.searcher, prefix: t.prefix} + + antlr.ParseTreeWalkerDefault.Walk(&builder, t.parseContext) + + return builder.stack[0], err +} + +func (t *Tree) BleveString() (s string, err error) { + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("%s", r) + } + }() + builder := bleveBuilder{} + + antlr.ParseTreeWalkerDefault.Walk(&builder, t.parseContext) + + if builder.err != nil { + return "", builder.err + } + + return builder.stack[0], err +} + +type errorListener struct { + *antlr.DefaultErrorListener + errs []error +} + +func (el *errorListener) SyntaxError(recognizer antlr.Recognizer, offendingSymbol interface{}, line, column int, msg string, e antlr.RecognitionException) { + el.errs = append(el.errs, fmt.Errorf("line "+strconv.Itoa(line)+":"+strconv.Itoa(column)+" "+msg)) +} + +func (el *errorListener) ReportAmbiguity(recognizer antlr.Parser, dfa *antlr.DFA, startIndex, stopIndex int, exact bool, ambigAlts *antlr.BitSet, configs antlr.ATNConfigSet) { + el.errs = append(el.errs, errors.New("ReportAmbiguity")) +} + +func (el *errorListener) ReportAttemptingFullContext(recognizer antlr.Parser, dfa *antlr.DFA, startIndex, stopIndex int, conflictingAlts *antlr.BitSet, configs antlr.ATNConfigSet) { + el.errs = append(el.errs, errors.New("ReportAttemptingFullContext")) +} + +func (el *errorListener) ReportContextSensitivity(recognizer antlr.Parser, dfa *antlr.DFA, startIndex, stopIndex, prediction int, configs antlr.ATNConfigSet) { + el.errs = append(el.errs, errors.New("ReportContextSensitivity")) +} diff --git a/caql/rql_test.go b/caql/rql_test.go new file mode 100644 index 0000000..fe05fce --- /dev/null +++ b/caql/rql_test.go @@ -0,0 +1,352 @@ +package caql + +import ( + "encoding/json" + "reflect" + "testing" +) + +type MockSearcher struct{} + +func (m MockSearcher) Search(_ string) (ids []string, err error) { + return []string{"1", "2", "3"}, nil +} + +func TestParseSAQLEval(t *testing.T) { + tests := []struct { + name string + saql string + wantRebuild string + wantValue interface{} + wantParseErr bool + wantRebuildErr bool + wantEvalErr bool + values string + }{ + // Custom + {name: "Compare 1", saql: "1 <= 2", wantRebuild: "1 <= 2", wantValue: true}, + {name: "Compare 2", saql: "1 >= 2", wantRebuild: "1 >= 2", wantValue: false}, + {name: "Compare 3", saql: "1 == 2", wantRebuild: "1 == 2", wantValue: false}, + {name: "Compare 4", saql: "1 > 2", wantRebuild: "1 > 2", wantValue: false}, + {name: "Compare 5", saql: "1 < 2", wantRebuild: "1 < 2", wantValue: true}, + {name: "Compare 6", saql: "1 != 2", wantRebuild: "1 != 2", wantValue: true}, + + {name: "SymbolRef 1", saql: "name", wantRebuild: "name", wantValue: false, values: `{"name": false}`}, + {name: "SymbolRef 2", saql: "d.name", wantRebuild: "d.name", wantValue: false, values: `{"d": {"name": false}}`}, + {name: "SymbolRef 3", saql: "name == false", wantRebuild: "name == false", wantValue: true, values: `{"name": false}`}, + {name: "SymbolRef Error 1", saql: "name, title", wantParseErr: true}, + {name: "SymbolRef Error 2", saql: "unknown", wantRebuild: "unknown", wantValue: false, wantEvalErr: true, values: `{}`}, + + {name: "Misc 1", saql: `active == true && age < 39`, wantRebuild: `active == true AND age < 39`, wantValue: true, values: `{"active": true, "age": 2}`}, + {name: "Misc 2", saql: `(attr == 10) AND foo == 'bar' OR NOT baz`, wantRebuild: `(attr == 10) AND foo == "bar" OR NOT baz`, wantValue: false, values: `{"attr": 2, "foo": "bar", "baz": true}`}, + {name: "Misc 3", saql: `attr == 10 AND (foo == 'bar' OR foo == 'baz')`, wantRebuild: `attr == 10 AND (foo == "bar" OR foo == "baz")`, wantValue: false, values: `{"attr": 2, "foo": "bar", "baz": true}`}, + {name: "Misc 4", saql: `5 > 1 AND "a" != "b"`, wantRebuild: `5 > 1 AND "a" != "b"`, wantValue: true}, + + {name: "LIKE 1", saql: `"foo" LIKE "%f%"`, wantRebuild: `"foo" LIKE "%f%"`, wantValue: true}, + {name: "LIKE 2", saql: `"foo" NOT LIKE "%f%"`, wantRebuild: `"foo" NOT LIKE "%f%"`, wantValue: false}, + {name: "LIKE 3", saql: `NOT "foo" LIKE "%f%"`, wantRebuild: `NOT "foo" LIKE "%f%"`, wantValue: false}, + + {name: "Summand 1", saql: "1 + 2", wantRebuild: "1 + 2", wantValue: 3}, + {name: "Summand 2", saql: "1 - 2", wantRebuild: "1 - 2", wantValue: -1}, + + {name: "Factor 1", saql: "1 * 2", wantRebuild: "1 * 2", wantValue: 2}, + {name: "Factor 2", saql: "1 / 2", wantRebuild: "1 / 2", wantValue: 0.5}, + {name: "Factor 3", saql: "1.0 / 2.0", wantRebuild: "1.0 / 2.0", wantValue: 0.5}, + {name: "Factor 4", saql: "1 % 2", wantRebuild: "1 % 2", wantValue: 1}, + + {name: "Term 1", saql: "(1 + 2) * 2", wantRebuild: "(1 + 2) * 2", wantValue: 6}, + {name: "Term 2", saql: "2 * (1 + 2)", wantRebuild: "2 * (1 + 2)", wantValue: 6}, + + // https://www.arangodb.com/docs/3.7/aql/fundamentals-data-types.html + {name: "Null 1", saql: `null`, wantRebuild: "null"}, + {name: "Bool 1", saql: `true`, wantRebuild: "true", wantValue: true}, + {name: "Bool 2", saql: `false`, wantRebuild: "false", wantValue: false}, + {name: "Numeric 1", saql: "1", wantRebuild: "1", wantValue: 1}, + {name: "Numeric 2", saql: "+1", wantRebuild: "1", wantValue: 1}, + {name: "Numeric 3", saql: "42", wantRebuild: "42", wantValue: 42}, + {name: "Numeric 4", saql: "-1", wantRebuild: "-1", wantValue: -1}, + {name: "Numeric 5", saql: "-42", wantRebuild: "-42", wantValue: -42}, + {name: "Numeric 6", saql: "1.23", wantRebuild: "1.23", wantValue: 1.23}, + {name: "Numeric 7", saql: "-99.99", wantRebuild: "-99.99", wantValue: -99.99}, + {name: "Numeric 8", saql: "0.5", wantRebuild: "0.5", wantValue: 0.5}, + {name: "Numeric 9", saql: ".5", wantRebuild: ".5", wantValue: 0.5}, + {name: "Numeric 10", saql: "-4.87e103", wantRebuild: "-4.87e103", wantValue: -4.87e+103}, + {name: "Numeric 11", saql: "0b10", wantRebuild: "0b10", wantValue: 2}, + {name: "Numeric 12", saql: "0x10", wantRebuild: "0x10", wantValue: 16}, + {name: "Numeric Error 1", saql: "1.", wantParseErr: true}, + {name: "Numeric Error 2", saql: "01.23", wantParseErr: true}, + {name: "Numeric Error 3", saql: "00.23", wantParseErr: true}, + {name: "Numeric Error 4", saql: "00", wantParseErr: true}, + + // {name: "String 1", saql: `"yikes!"`, wantRebuild: `"yikes!"`, wantValue: "yikes!"}, + // {name: "String 2", saql: `"don't know"`, wantRebuild: `"don't know"`, wantValue: "don't know"}, + // {name: "String 3", saql: `"this is a \"quoted\" word"`, wantRebuild: `"this is a \"quoted\" word"`, wantValue: "this is a \"quoted\" word"}, + // {name: "String 4", saql: `"this is a longer string."`, wantRebuild: `"this is a longer string."`, wantValue: "this is a longer string."}, + // {name: "String 5", saql: `"the path separator on Windows is \\"`, wantRebuild: `"the path separator on Windows is \\"`, wantValue: "the path separator on Windows is \\"}, + // {name: "String 6", saql: `'yikes!'`, wantRebuild: `"yikes!"`, wantValue: "yikes!"}, + // {name: "String 7", saql: `'don\'t know'`, wantRebuild: `"don't know"`, wantValue: "don't know"}, + // {name: "String 8", saql: `'this is a "quoted" word'`, wantRebuild: `"this is a \"quoted\" word"`, wantValue: "this is a \"quoted\" word"}, + // {name: "String 9", saql: `'this is a longer string.'`, wantRebuild: `"this is a longer string."`, wantValue: "this is a longer string."}, + // {name: "String 10", saql: `'the path separator on Windows is \\'`, wantRebuild: `"the path separator on Windows is \\"`, wantValue: `the path separator on Windows is \`}, + + {name: "Array 1", saql: "[]", wantRebuild: "[]", wantValue: []interface{}{}}, + {name: "Array 2", saql: `[true]`, wantRebuild: `[true]`, wantValue: []interface{}{true}}, + {name: "Array 3", saql: `[1, 2, 3]`, wantRebuild: `[1, 2, 3]`, wantValue: []interface{}{float64(1), float64(2), float64(3)}}, + { + name: "Array 4", saql: `[-99, "yikes!", [false, ["no"], []], 1]`, wantRebuild: `[-99, "yikes!", [false, ["no"], []], 1]`, + wantValue: []interface{}{-99.0, "yikes!", []interface{}{false, []interface{}{"no"}, []interface{}{}}, float64(1)}, + }, + {name: "Array 5", saql: `[["fox", "marshal"]]`, wantRebuild: `[["fox", "marshal"]]`, wantValue: []interface{}{[]interface{}{"fox", "marshal"}}}, + {name: "Array 6", saql: `[1, 2, 3,]`, wantRebuild: `[1, 2, 3]`, wantValue: []interface{}{float64(1), float64(2), float64(3)}}, + + {name: "Array Error 1", saql: "(1,2,3)", wantParseErr: true}, + {name: "Array Access 1", saql: "u.friends[0]", wantRebuild: "u.friends[0]", wantValue: 7, values: `{"u": {"friends": [7,8,9]}}`}, + {name: "Array Access 2", saql: "u.friends[2]", wantRebuild: "u.friends[2]", wantValue: 9, values: `{"u": {"friends": [7,8,9]}}`}, + {name: "Array Access 3", saql: "u.friends[-1]", wantRebuild: "u.friends[-1]", wantValue: 9, values: `{"u": {"friends": [7,8,9]}}`}, + {name: "Array Access 4", saql: "u.friends[-2]", wantRebuild: "u.friends[-2]", wantValue: 8, values: `{"u": {"friends": [7,8,9]}}`}, + + {name: "Object 1", saql: "{}", wantRebuild: "{}", wantValue: map[string]interface{}{}}, + {name: "Object 2", saql: `{a: 1}`, wantRebuild: "{a: 1}", wantValue: map[string]interface{}{"a": float64(1)}}, + {name: "Object 3", saql: `{'a': 1}`, wantRebuild: `{'a': 1}`, wantValue: map[string]interface{}{"a": float64(1)}}, + {name: "Object 4", saql: `{"a": 1}`, wantRebuild: `{"a": 1}`, wantValue: map[string]interface{}{"a": float64(1)}}, + {name: "Object 5", saql: `{'return': 1}`, wantRebuild: `{'return': 1}`, wantValue: map[string]interface{}{"return": float64(1)}}, + {name: "Object 6", saql: `{"return": 1}`, wantRebuild: `{"return": 1}`, wantValue: map[string]interface{}{"return": float64(1)}}, + {name: "Object 9", saql: `{a: 1,}`, wantRebuild: "{a: 1}", wantValue: map[string]interface{}{"a": float64(1)}}, + {name: "Object 10", saql: `{"a": 1,}`, wantRebuild: `{"a": 1}`, wantValue: map[string]interface{}{"a": float64(1)}}, + // {"Object 8", "{`return`: 1}", `{"return": 1}`, true}, + // {"Object 7", "{´return´: 1}", `{"return": 1}`, true}, + {name: "Object Error 1: return is a keyword", saql: `{like: 1}`, wantParseErr: true}, + + {name: "Object Access 1", saql: "u.address.city.name", wantRebuild: "u.address.city.name", wantValue: "Munich", values: `{"u": {"address": {"city": {"name": "Munich"}}}}`}, + {name: "Object Access 2", saql: "u.friends[0].name.first", wantRebuild: "u.friends[0].name.first", wantValue: "Kevin", values: `{"u": {"friends": [{"name": {"first": "Kevin"}}]}}`}, + {name: "Object Access 3", saql: `u["address"]["city"]["name"]`, wantRebuild: `u["address"]["city"]["name"]`, wantValue: "Munich", values: `{"u": {"address": {"city": {"name": "Munich"}}}}`}, + {name: "Object Access 4", saql: `u["friends"][0]["name"]["first"]`, wantRebuild: `u["friends"][0]["name"]["first"]`, wantValue: "Kevin", values: `{"u": {"friends": [{"name": {"first": "Kevin"}}]}}`}, + {name: "Object Access 5", saql: "u._key", wantRebuild: "u._key", wantValue: false, values: `{"u": {"_key": false}}`}, + + // This query language does not support binds + // https://www.arangodb.com/docs/3.7/aql/fundamentals-bind-parameters.html + // {name: "Bind 1", saql: "u.id == @id && u.name == @name", wantRebuild: `u.id == @id AND u.name == @name`, wantValue: true}, + // {name: "Bind 2", saql: "u.id == CONCAT('prefix', @id, 'suffix') && u.name == @name", wantRebuild: `u.id == CONCAT('prefix', @id, 'suffix') AND u.name == @name`, wantValue: false}, + // {name: "Bind 3", saql: "doc.@attr.@subattr", wantRebuild: `doc.@attr.@subattr`, wantValue: true, values: `{"doc": {"@attr": {"@subattr": true}}}`}, + // {name: "Bind 4", saql: "doc[@attr][@subattr]", wantRebuild: `doc[@attr][@subattr]`, wantValue: true, values: `{"doc": {"@attr": {"@subattr": true}}}`}, + + // https://www.arangodb.com/docs/3.7/aql/fundamentals-type-value-order.html + {name: "Compare 7", saql: `null < false`, wantRebuild: `null < false`, wantValue: true}, + {name: "Compare 8", saql: `null < true`, wantRebuild: `null < true`, wantValue: true}, + {name: "Compare 9", saql: `null < 1`, wantRebuild: `null < 1`, wantValue: true}, + {name: "Compare 10", saql: `null < ''`, wantRebuild: `null < ""`, wantValue: true}, + {name: "Compare 11", saql: `null < ' '`, wantRebuild: `null < " "`, wantValue: true}, + {name: "Compare 12", saql: `null < '3'`, wantRebuild: `null < "3"`, wantValue: true}, + {name: "Compare 13", saql: `null < 'abc'`, wantRebuild: `null < "abc"`, wantValue: true}, + {name: "Compare 14", saql: `null < []`, wantRebuild: `null < []`, wantValue: true}, + {name: "Compare 15", saql: `null < {}`, wantRebuild: `null < {}`, wantValue: true}, + {name: "Compare 16", saql: `false < true`, wantRebuild: `false < true`, wantValue: true}, + {name: "Compare 17", saql: `false < 5`, wantRebuild: `false < 5`, wantValue: true}, + {name: "Compare 18", saql: `false < ''`, wantRebuild: `false < ""`, wantValue: true}, + {name: "Compare 19", saql: `false < ' '`, wantRebuild: `false < " "`, wantValue: true}, + {name: "Compare 20", saql: `false < '7'`, wantRebuild: `false < "7"`, wantValue: true}, + {name: "Compare 21", saql: `false < 'abc'`, wantRebuild: `false < "abc"`, wantValue: true}, + {name: "Compare 22", saql: `false < []`, wantRebuild: `false < []`, wantValue: true}, + {name: "Compare 23", saql: `false < {}`, wantRebuild: `false < {}`, wantValue: true}, + {name: "Compare 24", saql: `true < 9`, wantRebuild: `true < 9`, wantValue: true}, + {name: "Compare 25", saql: `true < ''`, wantRebuild: `true < ""`, wantValue: true}, + {name: "Compare 26", saql: `true < ' '`, wantRebuild: `true < " "`, wantValue: true}, + {name: "Compare 27", saql: `true < '11'`, wantRebuild: `true < "11"`, wantValue: true}, + {name: "Compare 28", saql: `true < 'abc'`, wantRebuild: `true < "abc"`, wantValue: true}, + {name: "Compare 29", saql: `true < []`, wantRebuild: `true < []`, wantValue: true}, + {name: "Compare 30", saql: `true < {}`, wantRebuild: `true < {}`, wantValue: true}, + {name: "Compare 31", saql: `13 < ''`, wantRebuild: `13 < ""`, wantValue: true}, + {name: "Compare 32", saql: `15 < ' '`, wantRebuild: `15 < " "`, wantValue: true}, + {name: "Compare 33", saql: `17 < '18'`, wantRebuild: `17 < "18"`, wantValue: true}, + {name: "Compare 34", saql: `21 < 'abc'`, wantRebuild: `21 < "abc"`, wantValue: true}, + {name: "Compare 35", saql: `23 < []`, wantRebuild: `23 < []`, wantValue: true}, + {name: "Compare 36", saql: `25 < {}`, wantRebuild: `25 < {}`, wantValue: true}, + {name: "Compare 37", saql: `'' < ' '`, wantRebuild: `"" < " "`, wantValue: true}, + {name: "Compare 38", saql: `'' < '27'`, wantRebuild: `"" < "27"`, wantValue: true}, + {name: "Compare 39", saql: `'' < 'abc'`, wantRebuild: `"" < "abc"`, wantValue: true}, + {name: "Compare 40", saql: `'' < []`, wantRebuild: `"" < []`, wantValue: true}, + {name: "Compare 41", saql: `'' < {}`, wantRebuild: `"" < {}`, wantValue: true}, + {name: "Compare 42", saql: `[] < {}`, wantRebuild: `[] < {}`, wantValue: true}, + {name: "Compare 43", saql: `[] < [29]`, wantRebuild: `[] < [29]`, wantValue: true}, + {name: "Compare 44", saql: `[1] < [2]`, wantRebuild: `[1] < [2]`, wantValue: true}, + {name: "Compare 45", saql: `[1, 2] < [2]`, wantRebuild: `[1, 2] < [2]`, wantValue: true}, + {name: "Compare 46", saql: `[99, 99] < [100]`, wantRebuild: `[99, 99] < [100]`, wantValue: true}, + {name: "Compare 47", saql: `[false] < [true]`, wantRebuild: `[false] < [true]`, wantValue: true}, + {name: "Compare 48", saql: `[false, 1] < [false, '']`, wantRebuild: `[false, 1] < [false, ""]`, wantValue: true}, + {name: "Compare 49", saql: `{} < {"a": 1}`, wantRebuild: `{} < {"a": 1}`, wantValue: true}, + {name: "Compare 50", saql: `{} == {"a": null}`, wantRebuild: `{} == {"a": null}`, wantValue: true}, + {name: "Compare 51", saql: `{"a": 1} < {"a": 2}`, wantRebuild: `{"a": 1} < {"a": 2}`, wantValue: true}, + {name: "Compare 52", saql: `{"b": 1} < {"a": 0}`, wantRebuild: `{"b": 1} < {"a": 0}`, wantValue: true}, + {name: "Compare 53", saql: `{"a": {"c": true}} < {"a": {"c": 0}}`, wantRebuild: `{"a": {"c": true}} < {"a": {"c": 0}}`, wantValue: true}, + {name: "Compare 54", saql: `{"a": {"c": true, "a": 0}} < {"a": {"c": false, "a": 1}}`, wantRebuild: `{"a": {"c": true, "a": 0}} < {"a": {"c": false, "a": 1}}`, wantValue: true}, + {name: "Compare 55", saql: `{"a": 1, "b": 2} == {"b": 2, "a": 1}`, wantRebuild: `{"a": 1, "b": 2} == {"b": 2, "a": 1}`, wantValue: true}, + + // https://www.arangodb.com/docs/3.7/aql/operators.html + {name: "Compare 56", saql: `0 == null`, wantRebuild: `0 == null`, wantValue: false}, + {name: "Compare 57", saql: `1 > 0`, wantRebuild: `1 > 0`, wantValue: true}, + {name: "Compare 58", saql: `true != null`, wantRebuild: `true != null`, wantValue: true}, + {name: "Compare 59", saql: `45 <= "yikes!"`, wantRebuild: `45 <= "yikes!"`, wantValue: true}, + {name: "Compare 60", saql: `65 != "65"`, wantRebuild: `65 != "65"`, wantValue: true}, + {name: "Compare 61", saql: `65 == 65`, wantRebuild: `65 == 65`, wantValue: true}, + {name: "Compare 62", saql: `1.23 > 1.32`, wantRebuild: `1.23 > 1.32`, wantValue: false}, + {name: "Compare 63", saql: `1.5 IN [2, 3, 1.5]`, wantRebuild: `1.5 IN [2, 3, 1.5]`, wantValue: true}, + {name: "Compare 64", saql: `"foo" IN null`, wantRebuild: `"foo" IN null`, wantValue: false}, + {name: "Compare 65", saql: `42 NOT IN [17, 40, 50]`, wantRebuild: `42 NOT IN [17, 40, 50]`, wantValue: true}, + {name: "Compare 66", saql: `"abc" == "abc"`, wantRebuild: `"abc" == "abc"`, wantValue: true}, + {name: "Compare 67", saql: `"abc" == "ABC"`, wantRebuild: `"abc" == "ABC"`, wantValue: false}, + {name: "Compare 68", saql: `"foo" LIKE "f%"`, wantRebuild: `"foo" LIKE "f%"`, wantValue: true}, + {name: "Compare 69", saql: `"foo" NOT LIKE "f%"`, wantRebuild: `"foo" NOT LIKE "f%"`, wantValue: false}, + {name: "Compare 70", saql: `"foo" =~ "^f[o].$"`, wantRebuild: `"foo" =~ "^f[o].$"`, wantValue: true}, + {name: "Compare 71", saql: `"foo" !~ "[a-z]+bar$"`, wantRebuild: `"foo" !~ "[a-z]+bar$"`, wantValue: true}, + + {name: "Compare 72", saql: `"abc" LIKE "a%"`, wantRebuild: `"abc" LIKE "a%"`, wantValue: true}, + {name: "Compare 73", saql: `"abc" LIKE "_bc"`, wantRebuild: `"abc" LIKE "_bc"`, wantValue: true}, + {name: "Compare 74", saql: `"a_b_foo" LIKE "a\\_b\\_foo"`, wantRebuild: `"a_b_foo" LIKE "a\\_b\\_foo"`, wantValue: true}, + + // https://www.arangodb.com/docs/3.7/aql/operators.html#array-comparison-operators + {name: "Compare Array 1", saql: `[1, 2, 3] ALL IN [2, 3, 4]`, wantRebuild: `[1, 2, 3] ALL IN [2, 3, 4]`, wantValue: false}, + {name: "Compare Array 2", saql: `[1, 2, 3] ALL IN [1, 2, 3]`, wantRebuild: `[1, 2, 3] ALL IN [1, 2, 3]`, wantValue: true}, + {name: "Compare Array 3", saql: `[1, 2, 3] NONE IN [3]`, wantRebuild: `[1, 2, 3] NONE IN [3]`, wantValue: false}, + {name: "Compare Array 4", saql: `[1, 2, 3] NONE IN [23, 42]`, wantRebuild: `[1, 2, 3] NONE IN [23, 42]`, wantValue: true}, + {name: "Compare Array 5", saql: `[1, 2, 3] ANY IN [4, 5, 6]`, wantRebuild: `[1, 2, 3] ANY IN [4, 5, 6]`, wantValue: false}, + {name: "Compare Array 6", saql: `[1, 2, 3] ANY IN [1, 42]`, wantRebuild: `[1, 2, 3] ANY IN [1, 42]`, wantValue: true}, + {name: "Compare Array 7", saql: `[1, 2, 3] ANY == 2`, wantRebuild: `[1, 2, 3] ANY == 2`, wantValue: true}, + {name: "Compare Array 8", saql: `[1, 2, 3] ANY == 4`, wantRebuild: `[1, 2, 3] ANY == 4`, wantValue: false}, + {name: "Compare Array 9", saql: `[1, 2, 3] ANY > 0`, wantRebuild: `[1, 2, 3] ANY > 0`, wantValue: true}, + {name: "Compare Array 10", saql: `[1, 2, 3] ANY <= 1`, wantRebuild: `[1, 2, 3] ANY <= 1`, wantValue: true}, + {name: "Compare Array 11", saql: `[1, 2, 3] NONE < 99`, wantRebuild: `[1, 2, 3] NONE < 99`, wantValue: false}, + {name: "Compare Array 12", saql: `[1, 2, 3] NONE > 10`, wantRebuild: `[1, 2, 3] NONE > 10`, wantValue: true}, + {name: "Compare Array 13", saql: `[1, 2, 3] ALL > 2`, wantRebuild: `[1, 2, 3] ALL > 2`, wantValue: false}, + {name: "Compare Array 14", saql: `[1, 2, 3] ALL > 0`, wantRebuild: `[1, 2, 3] ALL > 0`, wantValue: true}, + {name: "Compare Array 15", saql: `[1, 2, 3] ALL >= 3`, wantRebuild: `[1, 2, 3] ALL >= 3`, wantValue: false}, + {name: "Compare Array 16", saql: `["foo", "bar"] ALL != "moo"`, wantRebuild: `["foo", "bar"] ALL != "moo"`, wantValue: true}, + {name: "Compare Array 17", saql: `["foo", "bar"] NONE == "bar"`, wantRebuild: `["foo", "bar"] NONE == "bar"`, wantValue: false}, + {name: "Compare Array 18", saql: `["foo", "bar"] ANY == "foo"`, wantRebuild: `["foo", "bar"] ANY == "foo"`, wantValue: true}, + + // https://www.arangodb.com/docs/3.7/aql/operators.html#logical-operators + {name: "Logical 1", saql: "active == true OR age < 39", wantRebuild: "active == true OR age < 39", wantValue: true, values: `{"active": true, "age": 4}`}, + {name: "Logical 2", saql: "active == true || age < 39", wantRebuild: "active == true OR age < 39", wantValue: true, values: `{"active": true, "age": 4}`}, + {name: "Logical 3", saql: "active == true AND age < 39", wantRebuild: "active == true AND age < 39", wantValue: true, values: `{"active": true, "age": 4}`}, + {name: "Logical 4", saql: "active == true && age < 39", wantRebuild: "active == true AND age < 39", wantValue: true, values: `{"active": true, "age": 4}`}, + {name: "Logical 5", saql: "!active", wantRebuild: "NOT active", wantValue: false, values: `{"active": true}`}, + {name: "Logical 6", saql: "NOT active", wantRebuild: "NOT active", wantValue: false, values: `{"active": true}`}, + {name: "Logical 7", saql: "not active", wantRebuild: "NOT active", wantValue: false, values: `{"active": true}`}, + {name: "Logical 8", saql: "NOT NOT active", wantRebuild: "NOT NOT active", wantValue: true, values: `{"active": true}`}, + + {name: "Logical 9", saql: `u.age > 15 && u.address.city != ""`, wantRebuild: `u.age > 15 AND u.address.city != ""`, wantValue: false, values: `{"u": {"age": 2, "address": {"city": "Munich"}}}`}, + {name: "Logical 10", saql: `true || false`, wantRebuild: `true OR false`, wantValue: true}, + {name: "Logical 11", saql: `NOT u.isInvalid`, wantRebuild: `NOT u.isInvalid`, wantValue: false, values: `{"u": {"isInvalid": true}}`}, + {name: "Logical 12", saql: `1 || ! 0`, wantRebuild: `1 OR NOT 0`, wantValue: 1}, + + {name: "Logical 13", saql: `25 > 1 && 42 != 7`, wantRebuild: `25 > 1 AND 42 != 7`, wantValue: true}, + {name: "Logical 14", saql: `22 IN [23, 42] || 23 NOT IN [22, 7]`, wantRebuild: `22 IN [23, 42] OR 23 NOT IN [22, 7]`, wantValue: true}, + {name: "Logical 15", saql: `25 != 25`, wantRebuild: `25 != 25`, wantValue: false}, + + {name: "Logical 16", saql: `1 || 7`, wantRebuild: `1 OR 7`, wantValue: 1}, + // {name: "Logical 17", saql: `null || "foo"`, wantRebuild: `null OR "foo"`, wantValue: "foo"}, + {name: "Logical 17", saql: `null || "foo"`, wantRebuild: `null OR d._key IN ["1","2","3"]`, wantValue: "foo", values: `{"d": {"_key": "1"}}`}, // eval != rebuild + {name: "Logical 18", saql: `null && true`, wantRebuild: `null AND true`, wantValue: nil}, + {name: "Logical 19", saql: `true && 23`, wantRebuild: `true AND 23`, wantValue: 23}, + + {name: "Logical 20", saql: "true == (6 < 8)", wantRebuild: "true == (6 < 8)", wantValue: true}, + {name: "Logical 21", saql: "true == 6 < 8", wantRebuild: "true == 6 < 8", wantValue: true}, // does not work in go + + // https://www.arangodb.com/docs/3.7/aql/operators.html#arithmetic-operators + {name: "Arithmetic 1", saql: `1 + 1`, wantRebuild: `1 + 1`, wantValue: 2}, + {name: "Arithmetic 2", saql: `33 - 99`, wantRebuild: `33 - 99`, wantValue: -66}, + {name: "Arithmetic 3", saql: `12.4 * 4.5`, wantRebuild: `12.4 * 4.5`, wantValue: 55.8}, + {name: "Arithmetic 4", saql: `13.0 / 0.1`, wantRebuild: `13.0 / 0.1`, wantValue: 130.0}, + {name: "Arithmetic 5", saql: `23 % 7`, wantRebuild: `23 % 7`, wantValue: 2}, + {name: "Arithmetic 6", saql: `-15`, wantRebuild: `-15`, wantValue: -15}, + {name: "Arithmetic 7", saql: `+9.99`, wantRebuild: `9.99`, wantValue: 9.99}, + + {name: "Arithmetic 8", saql: `1 + "a"`, wantRebuild: `1 + "a"`, wantValue: 1}, + {name: "Arithmetic 9", saql: `1 + "99"`, wantRebuild: `1 + "99"`, wantValue: 100}, + {name: "Arithmetic 10", saql: `1 + null`, wantRebuild: `1 + null`, wantValue: 1}, + {name: "Arithmetic 11", saql: `null + 1`, wantRebuild: `null + 1`, wantValue: 1}, + {name: "Arithmetic 12", saql: `3 + []`, wantRebuild: `3 + []`, wantValue: 3}, + {name: "Arithmetic 13", saql: `24 + [2]`, wantRebuild: `24 + [2]`, wantValue: 26}, + {name: "Arithmetic 14", saql: `24 + [2, 4]`, wantRebuild: `24 + [2, 4]`, wantValue: 24}, + {name: "Arithmetic 15", saql: `25 - null`, wantRebuild: `25 - null`, wantValue: 25}, + {name: "Arithmetic 16", saql: `17 - true`, wantRebuild: `17 - true`, wantValue: 16}, + {name: "Arithmetic 17", saql: `23 * {}`, wantRebuild: `23 * {}`, wantValue: 0}, + {name: "Arithmetic 18", saql: `5 * [7]`, wantRebuild: `5 * [7]`, wantValue: 35}, + {name: "Arithmetic 19", saql: `24 / "12"`, wantRebuild: `24 / "12"`, wantValue: 2}, + {name: "Arithmetic Error 1: Divison by zero", saql: `1 / 0`, wantRebuild: `1 / 0`, wantValue: 0}, + + // https://www.arangodb.com/docs/3.7/aql/operators.html#ternary-operator + {name: "Ternary 1", saql: `u.age > 15 || u.active == true ? u.userId : null`, wantRebuild: `u.age > 15 OR u.active == true ? u.userId : null`, wantValue: 45, values: `{"u": {"active": true, "age": 2, "userId": 45}}`}, + {name: "Ternary 2", saql: `u.value ? : 'value is null, 0 or not present'`, wantRebuild: `u.value ? : "value is null, 0 or not present"`, wantValue: "value is null, 0 or not present", values: `{"u": {"value": 0}}`}, + + // https://www.arangodb.com/docs/3.7/aql/operators.html#range-operator + {name: "Range 1", saql: `2010..2013`, wantRebuild: `2010..2013`, wantValue: []float64{2010, 2011, 2012, 2013}}, + // {"Array operators 1", `u.friends[*].name`, `u.friends[*].name`, false}, + + // Security + {name: "Security 1", saql: `doc.value == 1 || true REMOVE doc IN collection //`, wantParseErr: true}, + {name: "Security 2", saql: `doc.value == 1 || true INSERT {foo: "bar"} IN collection //`, wantParseErr: true}, + + // https://www.arangodb.com/docs/3.7/aql/operators.html#operator-precedence + {name: "Precendence", saql: `2 > 15 && "a" != ""`, wantRebuild: `2 > 15 AND "a" != ""`, wantValue: false}, + } + for _, tt := range tests { + parser := &Parser{ + Searcher: &MockSearcher{}, + } + + t.Run(tt.name, func(t *testing.T) { + expr, err := parser.Parse(tt.saql) + if (err != nil) != tt.wantParseErr { + t.Errorf("Parse() error = %v, wantErr %v", err, tt.wantParseErr) + if expr != nil { + t.Error(expr.String()) + } + return + } + if err != nil { + return + } + + got, err := expr.String() + if (err != nil) != tt.wantRebuildErr { + t.Error(expr.String()) + t.Errorf("String() error = %v, wantErr %v", err, tt.wantParseErr) + return + } + if err != nil { + return + } + if got != tt.wantRebuild { + t.Errorf("String() got = %v, want %v", got, tt.wantRebuild) + } + + var myJson map[string]interface{} + if tt.values != "" { + err = json.Unmarshal([]byte(tt.values), &myJson) + if err != nil { + t.Fatal(err) + } + } + + value, err := expr.Eval(myJson) + if (err != nil) != tt.wantEvalErr { + t.Error(expr.String()) + t.Errorf("Parse() error = %v, wantErr %v", err, tt.wantParseErr) + return + } + if err != nil { + return + } + + wantValue := tt.wantValue + if i, ok := wantValue.(int); ok { + wantValue = float64(i) + } + + if !reflect.DeepEqual(value, wantValue) { + t.Error(expr.String()) + t.Errorf("Eval() got = %T %#v, want %T %#v", value, value, wantValue, wantValue) + } + }) + } +} diff --git a/caql/set.go b/caql/set.go new file mode 100644 index 0000000..b703d35 --- /dev/null +++ b/caql/set.go @@ -0,0 +1,154 @@ +// Adapted from https://github.com/badgerodon/collections under the MIT License +// Original License: +// +// Copyright (c) 2012 Caleb Doxsey +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +package caql + +import "sort" + +type ( + Set struct { + hash map[interface{}]nothing + } + + nothing struct{} +) + +// Create a new set +func New(initial ...interface{}) *Set { + s := &Set{make(map[interface{}]nothing)} + + for _, v := range initial { + s.Insert(v) + } + + return s +} + +// Find the difference between two sets +func (s *Set) Difference(set *Set) *Set { + n := make(map[interface{}]nothing) + + for k := range s.hash { + if _, exists := set.hash[k]; !exists { + n[k] = nothing{} + } + } + + return &Set{n} +} + +// Call f for each item in the set +func (s *Set) Do(f func(interface{})) { + for k := range s.hash { + f(k) + } +} + +// Test to see whether or not the element is in the set +func (s *Set) Has(element interface{}) bool { + _, exists := s.hash[element] + return exists +} + +// Add an element to the set +func (s *Set) Insert(element interface{}) { + s.hash[element] = nothing{} +} + +// Find the intersection of two sets +func (s *Set) Intersection(set *Set) *Set { + n := make(map[interface{}]nothing) + + for k := range s.hash { + if _, exists := set.hash[k]; exists { + n[k] = nothing{} + } + } + + return &Set{n} +} + +// Return the number of items in the set +func (s *Set) Len() int { + return len(s.hash) +} + +// Test whether or not this set is a proper subset of "set" +func (s *Set) ProperSubsetOf(set *Set) bool { + return s.SubsetOf(set) && s.Len() < set.Len() +} + +// Remove an element from the set +func (s *Set) Remove(element interface{}) { + delete(s.hash, element) +} + +func (s *Set) Minus(set *Set) *Set { + n := make(map[interface{}]nothing) + for k := range s.hash { + n[k] = nothing{} + } + + for _, v := range set.Values() { + delete(n, v) + } + + return &Set{n} +} + +// Test whether or not this set is a subset of "set" +func (s *Set) SubsetOf(set *Set) bool { + if s.Len() > set.Len() { + return false + } + for k := range s.hash { + if _, exists := set.hash[k]; !exists { + return false + } + } + return true +} + +// Find the union of two sets +func (s *Set) Union(set *Set) *Set { + n := make(map[interface{}]nothing) + + for k := range s.hash { + n[k] = nothing{} + } + for k := range set.hash { + n[k] = nothing{} + } + + return &Set{n} +} + +func (s *Set) Values() []interface{} { + values := []interface{}{} + + for k := range s.hash { + values = append(values, k) + } + sort.Slice(values, func(i, j int) bool { return lt(values[i], values[j]) }) + + return values +} diff --git a/caql/set_test.go b/caql/set_test.go new file mode 100644 index 0000000..f4b56ef --- /dev/null +++ b/caql/set_test.go @@ -0,0 +1,96 @@ +// Adapted from https://github.com/badgerodon/collections under the MIT License +// Original License: +// +// Copyright (c) 2012 Caleb Doxsey +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +package caql + +import ( + "testing" +) + +func Test(t *testing.T) { + s := New() + + s.Insert(5) + + if s.Len() != 1 { + t.Errorf("Length should be 1") + } + + if !s.Has(5) { + t.Errorf("Membership test failed") + } + + s.Remove(5) + + if s.Len() != 0 { + t.Errorf("Length should be 0") + } + + if s.Has(5) { + t.Errorf("The set should be empty") + } + + // Difference + s1 := New(1, 2, 3, 4, 5, 6) + s2 := New(4, 5, 6) + s3 := s1.Difference(s2) + + if s3.Len() != 3 { + t.Errorf("Length should be 3") + } + + if !(s3.Has(1) && s3.Has(2) && s3.Has(3)) { + t.Errorf("Set should only contain 1, 2, 3") + } + + // Intersection + s3 = s1.Intersection(s2) + if s3.Len() != 3 { + t.Errorf("Length should be 3 after intersection") + } + + if !(s3.Has(4) && s3.Has(5) && s3.Has(6)) { + t.Errorf("Set should contain 4, 5, 6") + } + + // Union + s4 := New(7, 8, 9) + s3 = s2.Union(s4) + + if s3.Len() != 6 { + t.Errorf("Length should be 6 after union") + } + + if !(s3.Has(7)) { + t.Errorf("Set should contain 4, 5, 6, 7, 8, 9") + } + + // Subset + if !s1.SubsetOf(s1) { + t.Errorf("set should be a subset of itself") + } + // Proper Subset + if s1.ProperSubsetOf(s1) { + t.Errorf("set should not be a subset of itself") + } + +} diff --git a/caql/unquote.go b/caql/unquote.go new file mode 100644 index 0000000..efbe0b4 --- /dev/null +++ b/caql/unquote.go @@ -0,0 +1,79 @@ +// Adapted from https://github.com/golang/go +// Original License: +// +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the https://go.dev/LICENSE file. + +package caql + +import ( + "strconv" + "strings" + "unicode/utf8" +) + +// unquote interprets s as a single-quoted, double-quoted, +// or backquoted string literal, returning the string value +// that s quotes. +func unquote(s string) (string, error) { + n := len(s) + if n < 2 { + return "", strconv.ErrSyntax + } + quote := s[0] + if quote != s[n-1] { + return "", strconv.ErrSyntax + } + s = s[1 : n-1] + + if quote == '`' { + if strings.ContainsRune(s, '`') { + return "", strconv.ErrSyntax + } + if strings.ContainsRune(s, '\r') { + // -1 because we know there is at least one \r to remove. + buf := make([]byte, 0, len(s)-1) + for i := 0; i < len(s); i++ { + if s[i] != '\r' { + buf = append(buf, s[i]) + } + } + return string(buf), nil + } + return s, nil + } + if quote != '"' && quote != '\'' { + return "", strconv.ErrSyntax + } + if strings.ContainsRune(s, '\n') { + return "", strconv.ErrSyntax + } + + // Is it trivial? Avoid allocation. + if !strings.ContainsRune(s, '\\') && !strings.ContainsRune(s, rune(quote)) { + switch quote { + case '"', '\'': + if utf8.ValidString(s) { + return s, nil + } + } + } + + var runeTmp [utf8.UTFMax]byte + buf := make([]byte, 0, 3*len(s)/2) // Try to avoid more allocations. + for len(s) > 0 { + c, multibyte, ss, err := strconv.UnquoteChar(s, quote) + if err != nil { + return "", err + } + s = ss + if c < utf8.RuneSelf || !multibyte { + buf = append(buf, byte(c)) + } else { + n := utf8.EncodeRune(runeTmp[:], c) + buf = append(buf, runeTmp[:n]...) + } + } + return string(buf), nil +} diff --git a/caql/unquote_test.go b/caql/unquote_test.go new file mode 100644 index 0000000..2044a0e --- /dev/null +++ b/caql/unquote_test.go @@ -0,0 +1,125 @@ +// Adapted from https://github.com/golang/go +// Original License: +// +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the https://go.dev/LICENSE file. + +package caql + +import ( + "strconv" + "testing" +) + +type quoteTest struct { + in string + out string + ascii string + graphic string +} + +var quotetests = []quoteTest{ + {in: "\a\b\f\r\n\t\v", out: `"\a\b\f\r\n\t\v"`, ascii: `"\a\b\f\r\n\t\v"`, graphic: `"\a\b\f\r\n\t\v"`}, + {"\\", `"\\"`, `"\\"`, `"\\"`}, + {"abc\xffdef", `"abc\xffdef"`, `"abc\xffdef"`, `"abc\xffdef"`}, + {"\u263a", `"☺"`, `"\u263a"`, `"☺"`}, + {"\U0010ffff", `"\U0010ffff"`, `"\U0010ffff"`, `"\U0010ffff"`}, + {"\x04", `"\x04"`, `"\x04"`, `"\x04"`}, + // Some non-printable but graphic runes. Final column is double-quoted. + {"!\u00a0!\u2000!\u3000!", `"!\u00a0!\u2000!\u3000!"`, `"!\u00a0!\u2000!\u3000!"`, "\"!\u00a0!\u2000!\u3000!\""}, +} + +type unQuoteTest struct { + in string + out string +} + +var unquotetests = []unQuoteTest{ + {`""`, ""}, + {`"a"`, "a"}, + {`"abc"`, "abc"}, + {`"☺"`, "☺"}, + {`"hello world"`, "hello world"}, + {`"\xFF"`, "\xFF"}, + {`"\377"`, "\377"}, + {`"\u1234"`, "\u1234"}, + {`"\U00010111"`, "\U00010111"}, + {`"\U0001011111"`, "\U0001011111"}, + {`"\a\b\f\n\r\t\v\\\""`, "\a\b\f\n\r\t\v\\\""}, + {`"'"`, "'"}, + + {`'a'`, "a"}, + {`'☹'`, "☹"}, + {`'\a'`, "\a"}, + {`'\x10'`, "\x10"}, + {`'\377'`, "\377"}, + {`'\u1234'`, "\u1234"}, + {`'\U00010111'`, "\U00010111"}, + {`'\t'`, "\t"}, + {`' '`, " "}, + {`'\''`, "'"}, + {`'"'`, "\""}, + + {"``", ``}, + {"`a`", `a`}, + {"`abc`", `abc`}, + {"`☺`", `☺`}, + {"`hello world`", `hello world`}, + {"`\\xFF`", `\xFF`}, + {"`\\377`", `\377`}, + {"`\\`", `\`}, + {"`\n`", "\n"}, + {"` `", ` `}, + {"` `", ` `}, + {"`a\rb`", "ab"}, +} + +var misquoted = []string{ + ``, + `"`, + `"a`, + `"'`, + `b"`, + `"\"`, + `"\9"`, + `"\19"`, + `"\129"`, + `'\'`, + `'\9'`, + `'\19'`, + `'\129'`, + // `'ab'`, + `"\x1!"`, + `"\U12345678"`, + `"\z"`, + "`", + "`xxx", + "`\"", + `"\'"`, + `'\"'`, + "\"\n\"", + "\"\\n\n\"", + "'\n'", +} + +func TestUnquote(t *testing.T) { + for _, tt := range unquotetests { + if out, err := unquote(tt.in); err != nil || out != tt.out { + t.Errorf("unquote(%#q) = %q, %v want %q, nil", tt.in, out, err, tt.out) + } + } + + // run the quote tests too, backward + for _, tt := range quotetests { + if in, err := unquote(tt.out); in != tt.in { + t.Errorf("unquote(%#q) = %q, %v, want %q, nil", tt.out, in, err, tt.in) + } + } + + for _, s := range misquoted { + if out, err := unquote(s); out != "" || err != strconv.ErrSyntax { + t.Errorf("unquote(%#q) = %q, %v want %q, %v", s, out, err, "", strconv.ErrSyntax) + } + } +} diff --git a/caql/wildcard.go b/caql/wildcard.go new file mode 100644 index 0000000..1eca811 --- /dev/null +++ b/caql/wildcard.go @@ -0,0 +1,155 @@ +// Adapted from https://github.com/golang/go +// Original License: +// +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the https://go.dev/LICENSE file. + +package caql + +import ( + "errors" + "strings" + "unicode/utf8" +) + +// ErrBadPattern indicates a pattern was malformed. +var ErrBadPattern = errors.New("syntax error in pattern") + +// match reports whether name matches the shell pattern. +// The pattern syntax is: +// +// pattern: +// { term } +// term: +// '%' matches any sequence of non-/ characters +// '_' matches any single non-/ character +// c matches character c (c != '%', '_', '\\') +// '\\' c matches character c +// +// match requires pattern to match all of name, not just a substring. +// The only possible returned error is ErrBadPattern, when pattern +// is malformed. +// +func match(pattern, name string) (matched bool, err error) { +Pattern: + for len(pattern) > 0 { + var star bool + var chunk string + star, chunk, pattern = scanChunk(pattern) + if star && chunk == "" { + // Trailing * matches rest of string unless it has a /. + return !strings.ContainsRune(name, '/'), nil + } + // Look for match at current position. + t, ok, err := matchChunk(chunk, name) + // if we're the last chunk, make sure we've exhausted the name + // otherwise we'll give a false result even if we could still match + // using the star + if ok && (len(t) == 0 || len(pattern) > 0) { + name = t + continue + } + if err != nil { + return false, err + } + if star { + // Look for match skipping i+1 bytes. + // Cannot skip /. + for i := 0; i < len(name) && name[i] != '/'; i++ { + t, ok, err := matchChunk(chunk, name[i+1:]) + if ok { + // if we're the last chunk, make sure we exhausted the name + if len(pattern) == 0 && len(t) > 0 { + continue + } + name = t + continue Pattern + } + if err != nil { + return false, err + } + } + } + // Before returning false with no error, + // check that the remainder of the pattern is syntactically valid. + for len(pattern) > 0 { + _, chunk, pattern = scanChunk(pattern) + if _, _, err := matchChunk(chunk, ""); err != nil { + return false, err + } + } + return false, nil + } + return len(name) == 0, nil +} + +// scanChunk gets the next segment of pattern, which is a non-star string +// possibly preceded by a star. +func scanChunk(pattern string) (star bool, chunk, rest string) { + for len(pattern) > 0 && pattern[0] == '%' { + pattern = pattern[1:] + star = true + } + var i int +Scan: + for i = 0; i < len(pattern); i++ { + switch pattern[i] { + case '\\': + // error check handled in matchChunk: bad pattern. + if i+1 < len(pattern) { + i++ + } + case '%': + break Scan + } + } + return star, pattern[0:i], pattern[i:] +} + +// matchChunk checks whether chunk matches the beginning of s. +// If so, it returns the remainder of s (after the match). +// Chunk is all single-character operators: literals, char classes, and ?. +func matchChunk(chunk, s string) (rest string, ok bool, err error) { + // failed records whether the match has failed. + // After the match fails, the loop continues on processing chunk, + // checking that the pattern is well-formed but no longer reading s. + failed := false + for len(chunk) > 0 { + if !failed && len(s) == 0 { + failed = true + } + switch chunk[0] { + + case '_': + if !failed { + if s[0] == '/' { + failed = true + } + _, n := utf8.DecodeRuneInString(s) + s = s[n:] + } + chunk = chunk[1:] + + case '\\': + chunk = chunk[1:] + if len(chunk) == 0 { + return "", false, ErrBadPattern + } + fallthrough + + default: + if !failed { + if chunk[0] != s[0] { + failed = true + } + s = s[1:] + } + chunk = chunk[1:] + } + } + if failed { + return "", false, nil + } + return s, true, nil +} diff --git a/caql/wildcard_test.go b/caql/wildcard_test.go new file mode 100644 index 0000000..e74536b --- /dev/null +++ b/caql/wildcard_test.go @@ -0,0 +1,50 @@ +// Adapted from https://github.com/golang/go +// Original License: +// +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the https://go.dev/LICENSE file. + +package caql + +import "testing" + +type MatchTest struct { + pattern, s string + match bool + err error +} + +var matchTests = []MatchTest{ + {"abc", "abc", true, nil}, + {"%", "abc", true, nil}, + {"%c", "abc", true, nil}, + {"a%", "a", true, nil}, + {"a%", "abc", true, nil}, + {"a%", "ab/c", false, nil}, + {"a%/b", "abc/b", true, nil}, + {"a%/b", "a/c/b", false, nil}, + {"a%b%c%d%e%/f", "axbxcxdxe/f", true, nil}, + {"a%b%c%d%e%/f", "axbxcxdxexxx/f", true, nil}, + {"a%b%c%d%e%/f", "axbxcxdxe/xxx/f", false, nil}, + {"a%b%c%d%e%/f", "axbxcxdxexxx/fff", false, nil}, + {"a%b_c%x", "abxbbxdbxebxczzx", true, nil}, + {"a%b_c%x", "abxbbxdbxebxczzy", false, nil}, + {"a\\%b", "a%b", true, nil}, + {"a\\%b", "ab", false, nil}, + {"a_b", "a☺b", true, nil}, + {"a___b", "a☺b", false, nil}, + {"a_b", "a/b", false, nil}, + {"a%b", "a/b", false, nil}, + {"\\", "a", false, ErrBadPattern}, + {"%x", "xxx", true, nil}, +} + +func TestMatch(t *testing.T) { + for _, tt := range matchTests { + ok, err := match(tt.pattern, tt.s) + if ok != tt.match || err != tt.err { + t.Errorf("match(%#q, %#q) = %v, %v want %v, %v", tt.pattern, tt.s, ok, err, tt.match, tt.err) + } + } +} diff --git a/cmd/catalyst-dev/main.go b/cmd/catalyst-dev/main.go new file mode 100644 index 0000000..a42f795 --- /dev/null +++ b/cmd/catalyst-dev/main.go @@ -0,0 +1,65 @@ +package main + +import ( + "context" + "log" + "net/http/httputil" + "net/url" + + "github.com/arangodb/go-driver" + "github.com/gin-contrib/sessions" + "github.com/gin-contrib/sessions/cookie" + "github.com/gin-gonic/gin" + + "github.com/SecurityBrewery/catalyst" + "github.com/SecurityBrewery/catalyst/cmd" + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/hooks" + "github.com/SecurityBrewery/catalyst/role" + "github.com/SecurityBrewery/catalyst/test" +) + +func main() { + log.SetFlags(log.LstdFlags | log.Lshortfile) + + config, err := cmd.ParseCatalystConfig() + if err != nil { + log.Fatal(err) + } + + // create app and clear db after start + theCatalyst, err := catalyst.New(&hooks.Hooks{ + DatabaseAfterConnectFuncs: []func(ctx context.Context, client driver.Client, name string){test.Clear}, + }, config) + if err != nil { + log.Fatal(err) + } + + demoUser := &models.UserResponse{ID: "demo", Roles: []string{role.Admin}} + ctx := busdb.UserContext(context.Background(), demoUser) + if err := test.SetupTestData(ctx, theCatalyst.DB); err != nil { + log.Fatal(err) + } + + // proxy static requests + theCatalyst.Server.NoRoute( + sessions.Sessions(catalyst.SessionName, cookie.NewStore(config.Secret)), + catalyst.Authenticate(theCatalyst.DB, config.Auth), + catalyst.AuthorizeBlockedUser, + proxy, + ) + + if err = theCatalyst.Server.RunWithSigHandler(); err != nil { + log.Fatal(err) + } +} + +func proxy(ctx *gin.Context) { + u, _ := url.Parse("http://localhost:8080") + proxy := httputil.NewSingleHostReverseProxy(u) + + ctx.Request.Host = ctx.Request.URL.Host + + proxy.ServeHTTP(ctx.Writer, ctx.Request) +} diff --git a/cmd/catalyst/main.go b/cmd/catalyst/main.go new file mode 100644 index 0000000..e2f3f02 --- /dev/null +++ b/cmd/catalyst/main.go @@ -0,0 +1,27 @@ +package main + +import ( + "log" + + "github.com/SecurityBrewery/catalyst" + "github.com/SecurityBrewery/catalyst/cmd" + "github.com/SecurityBrewery/catalyst/hooks" +) + +func main() { + log.SetFlags(log.LstdFlags | log.Lshortfile) + + config, err := cmd.ParseCatalystConfig() + if err != nil { + log.Fatal(err) + } + + theCatalyst, err := catalyst.New(&hooks.Hooks{}, config) + if err != nil { + log.Fatal(err) + } + + if err = theCatalyst.Server.RunWithSigHandler(); err != nil { + log.Fatal(err) + } +} diff --git a/cmd/cmd.go b/cmd/cmd.go new file mode 100644 index 0000000..f5dc6e5 --- /dev/null +++ b/cmd/cmd.go @@ -0,0 +1,151 @@ +package cmd + +import ( + "fmt" + + "github.com/alecthomas/kong" + kongyaml "github.com/alecthomas/kong-yaml" + "github.com/coreos/go-oidc/v3/oidc" + "golang.org/x/oauth2" + + "github.com/SecurityBrewery/catalyst" + "github.com/SecurityBrewery/catalyst/bus" + "github.com/SecurityBrewery/catalyst/database" + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/pointer" + "github.com/SecurityBrewery/catalyst/role" + "github.com/SecurityBrewery/catalyst/storage" +) + +type CLI struct { + Secret string `env:"SECRET" required:"" help:"A random secret value (can be created with 'openssl rand -hex 32')"` + ExternalAddress string `env:"EXTERNAL_ADDRESS" required:""` + CatalystAddress string `env:"CATALYST_ADDRESS" default:"http://catalyst"` + + OIDCIssuer string `env:"OIDC_ISSUER" required:""` + OIDCClientID string `env:"OIDC_CLIENT_ID" default:"catalyst"` + OIDCClientSecret string `env:"OIDC_CLIENT_SECRET" required:""` + OIDCScopes []string `env:"OIDC_SCOPES" help:"Additional scopes, ['oidc', 'profile', 'email'] are always added." placeholder:"customscopes"` + OIDCClaimUsername string `env:"OIDC_CLAIM_USERNAME" default:"preferred_username" help:"username field in the OIDC claim"` + OIDCClaimEmail string `env:"OIDC_CLAIM_EMAIL" default:"email" help:"email field in the OIDC claim"` + OIDCClaimName string `env:"OIDC_CLAIM_NAME" default:"name" help:"name field in the OIDC claim"` + AuthBlockNew bool `env:"AUTH_BLOCK_NEW" default:"true" help:"Block newly created users"` + AuthDefaultRoles []string `env:"AUTH_DEFAULT_ROLES" help:"Default roles for new users"` + + IndexPath string `env:"INDEX_PATH" default:"index.bleve" help:"Path for the bleve index"` + + ArangoDBHost string `env:"ARANGO_DB_HOST" default:"http://arangodb:8529"` + ArangoDBUser string `env:"ARANGO_DB_USER" default:"root"` + ArangoDBPassword string `env:"ARANGO_DB_PASSWORD" required:""` + + S3Host string `env:"S3_HOST" default:"http://minio:9000" name:"s3-host"` + S3User string `env:"S3_USER" default:"minio" name:"s3-user"` + S3Password string `env:"S3_PASSWORD" required:"" name:"s3-password"` + + EmitterIOHost string `env:"EMITTER_IO_HOST" default:"tcp://emitter:8080"` + EmitterIORKey string `env:"EMITTER_IO_KEY" required:""` + + Timeformat string `env:"TIMEFORMAT" default:"yyyy-MM-dd HH:mm:ss" help:""` + ArtifactStates []map[string]string `env:"ARTIFACT_STATES"` + InitialAPIKey string `env:"INITIAL_API_KEY"` +} + +func ParseCatalystConfig() (*catalyst.Config, error) { + var cli CLI + kong.Parse( + &cli, + kong.Configuration(kong.JSON, "/etc/catalyst.json", ".catalyst.json"), + kong.Configuration(kongyaml.Loader, "/etc/catalyst.yaml", ".catalyst.yaml"), + ) + + return MapConfig(cli) +} + +func MapConfig(cli CLI) (*catalyst.Config, error) { + roles := role.Explode(role.Analyst) + roles = append(roles, role.Explodes(cli.AuthDefaultRoles)...) + roles = role.Explodes(role.Strings(roles)) + + artifactStates, err := toTypes(cli.ArtifactStates) + if err != nil { + return nil, err + } + + if len(artifactStates) == 0 { + artifactStates = []*models.Type{ + {Icon: "mdi-help-circle-outline", ID: "unknown", Name: "Unknown", Color: pointer.String(models.TypeColorInfo)}, + {Icon: "mdi-skull", ID: "malicious", Name: "Malicious", Color: pointer.String(models.TypeColorError)}, + {Icon: "mdi-check", ID: "clean", Name: "Clean", Color: pointer.String(models.TypeColorSuccess)}, + } + } + + scopes := unique(append([]string{oidc.ScopeOpenID, "profile", "email"}, cli.OIDCScopes...)) + config := &catalyst.Config{ + IndexPath: cli.IndexPath, + DB: &database.Config{Host: cli.ArangoDBHost, User: cli.ArangoDBUser, Password: cli.ArangoDBPassword}, + Storage: &storage.Config{Host: cli.S3Host, User: cli.S3User, Password: cli.S3Password}, + Secret: []byte(cli.Secret), + ExternalAddress: cli.ExternalAddress, + Auth: &catalyst.AuthConfig{ + OIDCIssuer: cli.OIDCIssuer, + OAuth2: &oauth2.Config{ClientID: cli.OIDCClientID, ClientSecret: cli.OIDCClientSecret, RedirectURL: cli.ExternalAddress + "/callback", Scopes: scopes}, + OIDCClaimUsername: cli.OIDCClaimUsername, + OIDCClaimEmail: cli.OIDCClaimEmail, + OIDCClaimName: cli.OIDCClaimName, + AuthBlockNew: cli.AuthBlockNew, + AuthDefaultRoles: roles, + }, + Bus: &bus.Config{Host: cli.EmitterIOHost, Key: cli.EmitterIORKey, APIUrl: cli.CatalystAddress + "/api"}, + UISettings: &models.Settings{ + ArtifactStates: artifactStates, + Timeformat: cli.Timeformat, + Version: catalyst.GetVersion(), + Tier: models.SettingsTierCommunity, + }, + InitialAPIKey: cli.InitialAPIKey, + } + return config, nil +} + +func toTypes(params []map[string]string) ([]*models.Type, error) { + var types []*models.Type + for _, param := range params { + t := &models.Type{} + + icon, iconOK := param["icon"] + if iconOK { + t.Icon = icon + } + id, idOK := param["id"] + if idOK { + t.ID = id + } + name, nameOK := param["name"] + if nameOK { + t.Name = name + } + color, ok := param["color"] + if ok { + t.Color = pointer.String(color) + } + + if iconOK && idOK && nameOK { + types = append(types, t) + } else { + return nil, fmt.Errorf("incomplete type: icon, id and name need to be provided (%s)", params) + } + } + return types, nil +} + +func unique(l []string) []string { + keys := make(map[string]bool) + var list []string + for _, entry := range l { + if _, value := keys[entry]; !value { + keys[entry] = true + list = append(list, entry) + } + } + return list +} diff --git a/dag/dag.go b/dag/dag.go new file mode 100644 index 0000000..b002545 --- /dev/null +++ b/dag/dag.go @@ -0,0 +1,164 @@ +// Adapted from https://github.com/philopon/go-toposort under the MIT License +// Original License: +// +// Copyright (c) 2017 Hirotomo Moriwaki +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +package dag + +import ( + "errors" + "sort" +) + +type Graph struct { + nodes []string + + outputs map[string]map[string]struct{} + + // node: number of parents + inputs map[string]int +} + +func NewGraph() *Graph { + return &Graph{ + nodes: []string{}, + inputs: make(map[string]int), + outputs: make(map[string]map[string]struct{}), + } +} + +func (g *Graph) AddNode(name string) error { + g.nodes = append(g.nodes, name) + + if _, ok := g.outputs[name]; ok { + return errors.New("duplicate detected") + } + g.outputs[name] = make(map[string]struct{}) + g.inputs[name] = 0 + return nil +} + +func (g *Graph) AddNodes(names ...string) error { + for _, name := range names { + if err := g.AddNode(name); err != nil { + return err + } + } + return nil +} + +func (g *Graph) AddEdge(from, to string) error { + m, ok := g.outputs[from] + if !ok { + return errors.New("node does not exist") + } + + m[to] = struct{}{} + g.inputs[to]++ + + return nil +} + +func (g *Graph) Toposort() ([]string, error) { + outputs := map[string]map[string]struct{}{} + for key, value := range g.outputs { + outputs[key] = map[string]struct{}{} + for k, v := range value { + outputs[key][k] = v + } + } + + L := make([]string, 0, len(g.nodes)) + S := make([]string, 0, len(g.nodes)) + + sort.Strings(g.nodes) + for _, n := range g.nodes { + if g.inputs[n] == 0 { + S = append(S, n) + } + } + + for len(S) > 0 { + var n string + n, S = S[0], S[1:] + L = append(L, n) + + ms := make([]string, len(outputs[n])) + for _, k := range keys(outputs[n]) { + m := k + // i := outputs[n][m] + // ms[i-1] = m + ms = append(ms, m) + } + + for _, m := range ms { + delete(outputs[n], m) + g.inputs[m]-- + + if g.inputs[m] == 0 { + S = append(S, m) + } + } + } + + N := 0 + for _, v := range g.inputs { + N += v + } + + if N > 0 { + return L, errors.New("cycle detected") + } + + return L, nil +} + +func keys(m map[string]struct{}) []string { + var keys []string + for k := range m { + keys = append(keys, k) + } + sort.Strings(keys) + return keys +} + +func (g *Graph) GetParents(id string) []string { + var parents []string + for node, targets := range g.outputs { + if _, ok := targets[id]; ok { + parents = append(parents, node) + } + } + sort.Strings(parents) + return parents +} + +func (g *Graph) GetRoot() (string, error) { + var roots []string + for n, parents := range g.inputs { + if parents == 0 { + roots = append(roots, n) + } + } + if len(roots) != 1 { + return "", errors.New("more than one root") + } + return roots[0], nil +} diff --git a/dag/dag_test.go b/dag/dag_test.go new file mode 100644 index 0000000..c13cd0f --- /dev/null +++ b/dag/dag_test.go @@ -0,0 +1,238 @@ +// Adapted from https://github.com/philopon/go-toposort under the MIT License +// Original License: +// +// Copyright (c) 2017 Hirotomo Moriwaki +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +package dag + +import ( + "reflect" + "testing" + + "github.com/stretchr/testify/assert" +) + +func index(s []string, v string) int { + for i, s := range s { + if s == v { + return i + } + } + return -1 +} + +type Edge struct { + From string + To string +} + +func TestDuplicatedNode(t *testing.T) { + graph := NewGraph() + assert.NoError(t, graph.AddNode("a")) + assert.Error(t, graph.AddNode("a")) +} + +func TestWikipedia(t *testing.T) { + graph := NewGraph() + assert.NoError(t, graph.AddNodes("2", "3", "5", "7", "8", "9", "10", "11")) + + edges := []Edge{ + {"7", "8"}, + {"7", "11"}, + + {"5", "11"}, + + {"3", "8"}, + {"3", "10"}, + + {"11", "2"}, + {"11", "9"}, + {"11", "10"}, + + {"8", "9"}, + } + + for _, e := range edges { + assert.NoError(t, graph.AddEdge(e.From, e.To)) + } + + result, err := graph.Toposort() + if err != nil { + t.Errorf("closed path detected in no closed pathed graph") + } + + for _, e := range edges { + if i, j := index(result, e.From), index(result, e.To); i > j { + t.Errorf("dependency failed: not satisfy %v(%v) > %v(%v)", e.From, i, e.To, j) + } + } +} + +func TestCycle(t *testing.T) { + graph := NewGraph() + assert.NoError(t, graph.AddNodes("1", "2", "3")) + + assert.NoError(t, graph.AddEdge("1", "2")) + assert.NoError(t, graph.AddEdge("2", "3")) + assert.NoError(t, graph.AddEdge("3", "1")) + + _, err := graph.Toposort() + if err == nil { + t.Errorf("closed path not detected in closed pathed graph") + } +} + +func TestGraph_GetParents(t *testing.T) { + type fields struct { + nodes []string + edges map[string]string + } + type args struct { + id string + } + tests := []struct { + name string + fields fields + args args + want []string + }{ + {"parents 2", fields{nodes: []string{"1", "2", "3"}, edges: map[string]string{"1": "2", "2": "3"}}, args{id: "2"}, []string{"1"}}, + {"parents 3", fields{nodes: []string{"1", "2", "3"}, edges: map[string]string{"1": "3", "2": "3"}}, args{id: "3"}, []string{"1", "2"}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + g := NewGraph() + for _, node := range tt.fields.nodes { + assert.NoError(t, g.AddNode(node)) + } + for from, to := range tt.fields.edges { + assert.NoError(t, g.AddEdge(from, to)) + } + + if got := g.GetParents(tt.args.id); !reflect.DeepEqual(got, tt.want) { + t.Errorf("GetParents() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestDAG_AddNode(t *testing.T) { + dag := NewGraph() + + v := "1" + assert.NoError(t, dag.AddNode(v)) + + assert.Error(t, dag.AddNode(v)) +} + +func TestDAG_AddEdge(t *testing.T) { + dag := NewGraph() + assert.NoError(t, dag.AddNode("0")) + assert.NoError(t, dag.AddNode("1")) + assert.NoError(t, dag.AddNode("2")) + assert.NoError(t, dag.AddNode("3")) + + // add a single edge and inspect the graph + assert.NoError(t, dag.AddEdge("1", "2")) + + if parents := dag.GetParents("2"); len(parents) != 1 { + t.Errorf("GetParents(v2) = %d, want 1", len(parents)) + } + + assert.NoError(t, dag.AddEdge("2", "3")) + + _ = dag.AddEdge("0", "1") +} + +func TestDAG_GetParents(t *testing.T) { + dag := NewGraph() + assert.NoError(t, dag.AddNode("1")) + assert.NoError(t, dag.AddNode("2")) + assert.NoError(t, dag.AddNode("3")) + _ = dag.AddEdge("1", "3") + _ = dag.AddEdge("2", "3") + + parents := dag.GetParents("3") + if length := len(parents); length != 2 { + t.Errorf("GetParents(v3) = %d, want 2", length) + } +} + +func TestDAG_GetDescendants(t *testing.T) { + dag := NewGraph() + assert.NoError(t, dag.AddNode("1")) + assert.NoError(t, dag.AddNode("2")) + assert.NoError(t, dag.AddNode("3")) + assert.NoError(t, dag.AddNode("4")) + + assert.NoError(t, dag.AddEdge("1", "2")) + assert.NoError(t, dag.AddEdge("2", "3")) + assert.NoError(t, dag.AddEdge("2", "4")) +} + +func TestDAG_Topsort(t *testing.T) { + dag := NewGraph() + assert.NoError(t, dag.AddNode("1")) + assert.NoError(t, dag.AddNode("2")) + assert.NoError(t, dag.AddNode("3")) + assert.NoError(t, dag.AddNode("4")) + + assert.NoError(t, dag.AddEdge("1", "2")) + assert.NoError(t, dag.AddEdge("2", "3")) + assert.NoError(t, dag.AddEdge("2", "4")) + + desc, _ := dag.Toposort() + assert.Equal(t, desc, []string{"1", "2", "3", "4"}) +} + +func TestDAG_TopsortStable(t *testing.T) { + dag := NewGraph() + assert.NoError(t, dag.AddNode("1")) + assert.NoError(t, dag.AddNode("2")) + assert.NoError(t, dag.AddNode("3")) + + assert.NoError(t, dag.AddEdge("1", "2")) + assert.NoError(t, dag.AddEdge("1", "3")) + + desc, _ := dag.Toposort() + assert.Equal(t, desc, []string{"1", "2", "3"}) +} + +func TestDAG_TopsortStable2(t *testing.T) { + dag := NewGraph() + + assert.NoError(t, dag.AddNodes("block-ioc", "block-iocs", "block-sender", "board", "fetch-iocs", "escalate", "extract-iocs", "mail-available", "search-email-gateway")) + assert.NoError(t, dag.AddEdge("block-iocs", "block-ioc")) + assert.NoError(t, dag.AddEdge("block-sender", "extract-iocs")) + assert.NoError(t, dag.AddEdge("board", "escalate")) + assert.NoError(t, dag.AddEdge("board", "mail-available")) + assert.NoError(t, dag.AddEdge("fetch-iocs", "block-iocs")) + assert.NoError(t, dag.AddEdge("extract-iocs", "fetch-iocs")) + assert.NoError(t, dag.AddEdge("mail-available", "block-sender")) + assert.NoError(t, dag.AddEdge("mail-available", "extract-iocs")) + assert.NoError(t, dag.AddEdge("mail-available", "search-email-gateway")) + assert.NoError(t, dag.AddEdge("search-email-gateway", "extract-iocs")) + + sorted, err := dag.Toposort() + assert.NoError(t, err) + + want := []string{"board", "escalate", "mail-available", "block-sender", "search-email-gateway", "extract-iocs", "fetch-iocs", "block-iocs", "block-ioc"} + assert.Equal(t, want, sorted) +} diff --git a/database/artifact.go b/database/artifact.go new file mode 100644 index 0000000..42a0679 --- /dev/null +++ b/database/artifact.go @@ -0,0 +1,101 @@ +package database + +import ( + "context" + "fmt" + "time" + + "github.com/arangodb/go-driver" + + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" +) + +func (db *Database) ArtifactGet(ctx context.Context, id int64, name string) (*models.Artifact, error) { + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketWriteFilter(ctx) + if err != nil { + return nil, err + } + + query := `LET d = DOCUMENT(@@collection, @ID) + ` + ticketFilterQuery + ` + FOR a in NOT_NULL(d.artifacts, []) + FILTER a.name == @name + RETURN a` + cursor, _, err := db.Query(ctx, query, mergeMaps(ticketFilterVars, map[string]interface{}{ + "@collection": TicketCollectionName, + "ID": fmt.Sprint(id), + "name": name, + }), busdb.ReadOperation) + if err != nil { + return nil, err + } + defer cursor.Close() + + var doc models.Artifact + _, err = cursor.ReadDocument(ctx, &doc) + if err != nil { + return nil, err + } + + return &doc, nil +} + +func (db *Database) ArtifactUpdate(ctx context.Context, id int64, name string, artifact *models.Artifact) (*models.TicketWithTickets, error) { + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketWriteFilter(ctx) + if err != nil { + return nil, err + } + + query := `LET d = DOCUMENT(@@collection, @ID) + ` + ticketFilterQuery + ` + FOR a IN NOT_NULL(d.artifacts, []) + FILTER a.name == @name + LET newartifacts = APPEND(REMOVE_VALUE(d.artifacts, a), @artifact) + UPDATE d WITH { "artifacts": newartifacts } IN @@collection + RETURN NEW` + return db.ticketGetQuery(ctx, id, query, mergeMaps(map[string]interface{}{ + "@collection": TicketCollectionName, + "ID": id, + "name": name, + "artifact": artifact, + }, ticketFilterVars), &busdb.Operation{ + OperationType: busdb.Update, + Ids: []driver.DocumentID{ + driver.DocumentID(fmt.Sprintf("%s/%d", TicketCollectionName, id)), + }, + Msg: fmt.Sprintf("Update artifact %s", name), + }) +} + +func (db *Database) EnrichArtifact(ctx context.Context, id int64, name string, enrichmentForm *models.EnrichmentForm) (*models.TicketWithTickets, error) { + enrichment := models.Enrichment{time.Now().UTC(), enrichmentForm.Data, enrichmentForm.Name} + + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketWriteFilter(ctx) + if err != nil { + return nil, err + } + + query := `LET d = DOCUMENT(@@collection, @ID) + ` + ticketFilterQuery + ` + FOR a IN d.artifacts + FILTER a.name == @name + LET enrichments = NOT_NULL(a.enrichments, {}) + LET newenrichments = MERGE(enrichments, ZIP( [@enrichmentname], [@enrichment]) ) + LET newartifacts = APPEND(REMOVE_VALUE(d.artifacts, a), MERGE(a, { "enrichments": newenrichments })) + UPDATE d WITH { "artifacts": newartifacts } IN @@collection + RETURN NEW` + return db.ticketGetQuery(ctx, id, query, mergeMaps(map[string]interface{}{ + "@collection": TicketCollectionName, + "ID": id, + "name": name, + "enrichmentname": enrichment.Name, + "enrichment": enrichment, + }, ticketFilterVars), &busdb.Operation{ + OperationType: busdb.Update, + Ids: []driver.DocumentID{ + driver.DocumentID(fmt.Sprintf("%s/%d", TicketCollectionName, id)), + }, + Msg: fmt.Sprintf("Run %s on artifact", enrichment.Name), + }) +} diff --git a/database/automation.go b/database/automation.go new file mode 100644 index 0000000..287371a --- /dev/null +++ b/database/automation.go @@ -0,0 +1,99 @@ +package database + +import ( + "context" + "errors" + + "github.com/arangodb/go-driver" + + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" +) + +func toAutomation(doc *models.AutomationForm) interface{} { + return &models.Automation{ + Image: doc.Image, + Script: doc.Script, + Schema: doc.Schema, + Type: doc.Type, + } +} + +func toAutomationResponse(id string, doc models.Automation) *models.AutomationResponse { + return &models.AutomationResponse{ + ID: id, + Image: doc.Image, + Script: doc.Script, + Schema: doc.Schema, + Type: doc.Type, + } +} + +func (db *Database) AutomationCreate(ctx context.Context, automation *models.AutomationForm) (*models.AutomationResponse, error) { + if automation == nil { + return nil, errors.New("requires automation") + } + if automation.ID == "" { + return nil, errors.New("requires automation ID") + } + + var doc models.Automation + newctx := driver.WithReturnNew(ctx, &doc) + + meta, err := db.automationCollection.CreateDocument(ctx, newctx, automation.ID, toAutomation(automation)) + if err != nil { + return nil, err + } + + return toAutomationResponse(meta.Key, doc), nil +} + +func (db *Database) AutomationGet(ctx context.Context, id string) (*models.AutomationResponse, error) { + var doc models.Automation + meta, err := db.automationCollection.ReadDocument(ctx, id, &doc) + if err != nil { + return nil, err + } + + return toAutomationResponse(meta.Key, doc), nil +} + +func (db *Database) AutomationUpdate(ctx context.Context, id string, automation *models.AutomationForm) (*models.AutomationResponse, error) { + var doc models.Automation + ctx = driver.WithReturnNew(ctx, &doc) + + meta, err := db.automationCollection.ReplaceDocument(ctx, id, toAutomation(automation)) + if err != nil { + return nil, err + } + + return toAutomationResponse(meta.Key, doc), nil +} + +func (db *Database) AutomationDelete(ctx context.Context, id string) error { + _, err := db.automationCollection.RemoveDocument(ctx, id) + return err +} + +func (db *Database) AutomationList(ctx context.Context) ([]*models.AutomationResponse, error) { + query := "FOR d IN @@collection SORT d._key ASC RETURN UNSET(d, 'script')" + cursor, _, err := db.Query(ctx, query, map[string]interface{}{"@collection": AutomationCollectionName}, busdb.ReadOperation) + if err != nil { + return nil, err + } + defer cursor.Close() + var docs []*models.AutomationResponse + for { + var doc models.Automation + meta, err := cursor.ReadDocument(ctx, &doc) + if driver.IsNoMoreDocuments(err) { + break + } else if err != nil { + return nil, err + } + + docs = append(docs, toAutomationResponse(meta.Key, doc)) + } + + return docs, err +} diff --git a/database/busdb/busdb.go b/database/busdb/busdb.go new file mode 100644 index 0000000..b9680c2 --- /dev/null +++ b/database/busdb/busdb.go @@ -0,0 +1,182 @@ +package busdb + +import ( + "context" + + "github.com/arangodb/go-driver" + + "github.com/SecurityBrewery/catalyst/bus" + "github.com/SecurityBrewery/catalyst/generated/models" +) + +type Hook interface { + PublishAction(action string, context, msg map[string]interface{}) error + PublishUpdate(col, id string) error +} + +// BusDatabase +// 1. Save entry to log +// 2. Send update ticket to bus +// 3. Add document to index +type BusDatabase struct { + internal driver.Database + logCollection driver.Collection + bus *bus.Bus + // index *index.Index +} + +func NewDatabase(ctx context.Context, internal driver.Database, b *bus.Bus) (*BusDatabase, error) { + logCollection, err := internal.Collection(ctx, LogCollectionName) + if err != nil { + return nil, err + } + + return &BusDatabase{ + internal: internal, + logCollection: logCollection, + bus: b, + }, nil +} + +type OperationType int + +const ( + Create OperationType = iota + Read = iota + Update = iota +) + +type Operation struct { + OperationType OperationType + Ids []driver.DocumentID + Msg string +} + +var CreateOperation = &Operation{OperationType: Create} +var ReadOperation = &Operation{OperationType: Read} + +func (db BusDatabase) Query(ctx context.Context, query string, vars map[string]interface{}, operation *Operation) (driver.Cursor, *models.LogEntry, error) { + cur, err := db.internal.Query(ctx, query, vars) + if err != nil { + return nil, nil, err + } + + var logs *models.LogEntry + + switch { + case operation.OperationType == Update: + if err := db.LogAndNotify(ctx, operation.Ids, operation.Msg); err != nil { + return nil, nil, err + } + } + + return cur, logs, err +} + +func (db BusDatabase) LogAndNotify(ctx context.Context, ids []driver.DocumentID, msg string) error { + var logEntries []*models.LogEntry + for _, i := range ids { + logEntries = append(logEntries, &models.LogEntry{Reference: i.String(), Message: msg}) + } + + if err := db.LogBatchCreate(ctx, logEntries); err != nil { + return err + } + + return db.bus.PublishUpdate(ids) +} + +func (db BusDatabase) Remove(ctx context.Context) error { + return db.internal.Remove(ctx) +} + +func (db BusDatabase) Collection(ctx context.Context, name string) (driver.Collection, error) { + return db.internal.Collection(ctx, name) +} + +type Collection struct { + internal driver.Collection + db *BusDatabase +} + +func NewCollection(internal driver.Collection, db *BusDatabase) *Collection { + return &Collection{internal: internal, db: db} +} + +func (c Collection) CreateDocument(ctx, newctx context.Context, key string, document interface{}) (driver.DocumentMeta, error) { + meta, err := c.internal.CreateDocument(newctx, &Keyed{Key: key, Doc: document}) + if err != nil { + return meta, err + } + + err = c.db.LogAndNotify(ctx, []driver.DocumentID{meta.ID}, "Document created") + if err != nil { + return meta, err + } + return meta, nil +} + +func (c Collection) CreateEdge(ctx, newctx context.Context, edge *driver.EdgeDocument) (driver.DocumentMeta, error) { + meta, err := c.internal.CreateDocument(newctx, edge) + if err != nil { + return meta, err + } + + err = c.db.LogAndNotify(ctx, []driver.DocumentID{meta.ID}, "Document created") + if err != nil { + return meta, err + } + return meta, nil +} + +func (c Collection) CreateEdges(ctx context.Context, edges []*driver.EdgeDocument) (driver.DocumentMetaSlice, error) { + metas, errs, err := c.internal.CreateDocuments(ctx, edges) + if err != nil { + return nil, err + } + if errs.FirstNonNil() != nil { + return nil, errs.FirstNonNil() + } + + var ids []driver.DocumentID + for _, meta := range metas { + ids = append(ids, meta.ID) + } + + err = c.db.LogAndNotify(ctx, ids, "Document created") + if err != nil { + return metas, err + } + + return metas, nil +} + +func (c Collection) DocumentExists(ctx context.Context, id string) (bool, error) { + return c.internal.DocumentExists(ctx, id) +} + +func (c Collection) ReadDocument(ctx context.Context, key string, result interface{}) (driver.DocumentMeta, error) { + return c.internal.ReadDocument(ctx, key, result) +} + +func (c Collection) UpdateDocument(ctx context.Context, key string, update interface{}) (driver.DocumentMeta, error) { + meta, err := c.internal.UpdateDocument(ctx, key, update) + if err != nil { + return meta, err + } + + return meta, c.db.bus.PublishUpdate([]driver.DocumentID{meta.ID}) +} + +func (c Collection) ReplaceDocument(ctx context.Context, key string, document interface{}) (driver.DocumentMeta, error) { + meta, err := c.internal.ReplaceDocument(ctx, key, document) + if err != nil { + return meta, err + } + + return meta, c.db.bus.PublishUpdate([]driver.DocumentID{meta.ID}) +} + +func (c Collection) RemoveDocument(ctx context.Context, formatInt string) (driver.DocumentMeta, error) { + return c.internal.RemoveDocument(ctx, formatInt) +} diff --git a/database/busdb/context.go b/database/busdb/context.go new file mode 100644 index 0000000..206487f --- /dev/null +++ b/database/busdb/context.go @@ -0,0 +1,34 @@ +package busdb + +import ( + "context" + + "github.com/gin-gonic/gin" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/role" +) + +const ( + userContextKey = "user" + groupContextKey = "groups" +) + +func SetContext(ctx *gin.Context, user *models.UserResponse) { + user.Roles = role.Strings(role.Explodes(user.Roles)) + ctx.Set(userContextKey, user) +} + +func SetGroupContext(ctx *gin.Context, groups []string) { + ctx.Set(groupContextKey, groups) +} + +func UserContext(ctx context.Context, user *models.UserResponse) context.Context { + user.Roles = role.Strings(role.Explodes(user.Roles)) + return context.WithValue(ctx, userContextKey, user) +} + +func UserFromContext(ctx context.Context) (*models.UserResponse, bool) { + u, ok := ctx.Value(userContextKey).(*models.UserResponse) + return u, ok +} diff --git a/database/busdb/keyed.go b/database/busdb/keyed.go new file mode 100644 index 0000000..8bfef39 --- /dev/null +++ b/database/busdb/keyed.go @@ -0,0 +1,25 @@ +package busdb + +import "encoding/json" + +type Keyed struct { + Key string + Doc interface{} +} + +func (p Keyed) MarshalJSON() ([]byte, error) { + b, err := json.Marshal(p.Doc) + if err != nil { + panic(err) + } + + var m map[string]interface{} + err = json.Unmarshal(b, &m) + if err != nil { + panic(err) + } + + m["_key"] = p.Key + + return json.Marshal(m) +} diff --git a/database/busdb/log.go b/database/busdb/log.go new file mode 100644 index 0000000..6fab570 --- /dev/null +++ b/database/busdb/log.go @@ -0,0 +1,92 @@ +package busdb + +import ( + "context" + "errors" + "time" + + "github.com/arangodb/go-driver" + + "github.com/SecurityBrewery/catalyst/generated/models" +) + +const LogCollectionName = "logs" + +func (db *BusDatabase) LogCreate(ctx context.Context, id, message string) (*models.LogEntry, error) { + user, ok := UserFromContext(ctx) + if !ok { + return nil, errors.New("no user in context") + } + + logentry := &models.LogEntry{ + Reference: id, + Created: time.Now(), + Creator: user.ID, + Message: message, + } + + doc := models.LogEntry{} + _, err := db.logCollection.CreateDocument(driver.WithReturnNew(ctx, &doc), logentry) + if err != nil { + return nil, err + } + + return &doc, db.bus.PublishUpdate([]driver.DocumentID{driver.DocumentID(logentry.Reference)}) +} + +func (db *BusDatabase) LogBatchCreate(ctx context.Context, logEntryForms []*models.LogEntry) error { + user, ok := UserFromContext(ctx) + if !ok { + return errors.New("no user in context") + } + + var ids []driver.DocumentID + var logentries []*models.LogEntry + for _, logEntryForm := range logEntryForms { + logentry := &models.LogEntry{ + Reference: logEntryForm.Reference, + Created: time.Now(), + Creator: user.ID, + Message: logEntryForm.Message, + } + + logentries = append(logentries, logentry) + ids = append(ids, driver.DocumentID(logentry.Reference)) + } + + _, errs, err := db.logCollection.CreateDocuments(ctx, logentries) + if err != nil { + return err + } + err = errs.FirstNonNil() + if err != nil { + return err + } + + return db.bus.PublishUpdate(ids) +} + +func (db *BusDatabase) LogList(ctx context.Context, reference string) ([]*models.LogEntry, error) { + query := "FOR d IN @@collection FILTER d.reference == @reference SORT d.created DESC RETURN d" + cursor, err := db.internal.Query(ctx, query, map[string]interface{}{ + "@collection": LogCollectionName, + "reference": reference, + }) + if err != nil { + return nil, err + } + defer cursor.Close() + var docs []*models.LogEntry + for { + var doc models.LogEntry + _, err := cursor.ReadDocument(ctx, &doc) + if driver.IsNoMoreDocuments(err) { + break + } else if err != nil { + return nil, err + } + docs = append(docs, &doc) + } + + return docs, err +} diff --git a/database/db.go b/database/db.go new file mode 100644 index 0000000..079f6c7 --- /dev/null +++ b/database/db.go @@ -0,0 +1,177 @@ +package database + +import ( + "context" + "fmt" + "log" + + "github.com/arangodb/go-driver" + "github.com/arangodb/go-driver/http" + + "github.com/SecurityBrewery/catalyst/bus" + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/database/migrations" + "github.com/SecurityBrewery/catalyst/hooks" + "github.com/SecurityBrewery/catalyst/index" +) + +const ( + Name = "catalyst" + TicketCollectionName = "tickets" + TemplateCollectionName = "templates" + PlaybookCollectionName = "playbooks" + AutomationCollectionName = "automations" + UserDataCollectionName = "userdata" + UserCollectionName = "users" + TicketTypeCollectionName = "tickettypes" + JobCollectionName = "jobs" + + TicketArtifactsGraphName = "Graph" + RelatedTicketsCollectionName = "related" +) + +type Database struct { + *busdb.BusDatabase + Index *index.Index + bus *bus.Bus + Hooks *hooks.Hooks + + templateCollection *busdb.Collection + ticketCollection *busdb.Collection + playbookCollection *busdb.Collection + automationCollection *busdb.Collection + userdataCollection *busdb.Collection + userCollection *busdb.Collection + tickettypeCollection *busdb.Collection + jobCollection *busdb.Collection + + relatedCollection *busdb.Collection + containsCollection *busdb.Collection +} + +type Config struct { + Host string + User string + Password string + Name string +} + +func New(ctx context.Context, index *index.Index, bus *bus.Bus, hooks *hooks.Hooks, config *Config) (*Database, error) { + name := config.Name + if config.Name == "" { + name = Name + } + + conn, err := http.NewConnection(http.ConnectionConfig{Endpoints: []string{config.Host}}) + if err != nil { + return nil, err + } + client, err := driver.NewClient(driver.ClientConfig{ + Connection: conn, + Authentication: driver.BasicAuthentication(config.User, config.Password), + }) + if err != nil { + return nil, err + } + + hooks.DatabaseAfterConnect(ctx, client, name) + + db, err := setupDB(ctx, client, name) + if err != nil { + return nil, fmt.Errorf("DB setup failed: %w", err) + } + + if err = migrations.PerformMigrations(ctx, db); err != nil { + return nil, fmt.Errorf("migrations failed: %w", err) + } + + ticketCollection, err := db.Collection(ctx, TicketCollectionName) + if err != nil { + return nil, err + } + templateCollection, err := db.Collection(ctx, TemplateCollectionName) + if err != nil { + return nil, err + } + playbookCollection, err := db.Collection(ctx, PlaybookCollectionName) + if err != nil { + return nil, err + } + relatedCollection, err := db.Collection(ctx, RelatedTicketsCollectionName) + if err != nil { + return nil, err + } + automationCollection, err := db.Collection(ctx, AutomationCollectionName) + if err != nil { + return nil, err + } + userdataCollection, err := db.Collection(ctx, UserDataCollectionName) + if err != nil { + return nil, err + } + userCollection, err := db.Collection(ctx, UserCollectionName) + if err != nil { + return nil, err + } + tickettypeCollection, err := db.Collection(ctx, TicketTypeCollectionName) + if err != nil { + return nil, err + } + jobCollection, err := db.Collection(ctx, JobCollectionName) + if err != nil { + return nil, err + } + + hookedDB, err := busdb.NewDatabase(ctx, db, bus) + if err != nil { + return nil, err + } + + return &Database{ + BusDatabase: hookedDB, + bus: bus, + Index: index, + Hooks: hooks, + templateCollection: busdb.NewCollection(templateCollection, hookedDB), + ticketCollection: busdb.NewCollection(ticketCollection, hookedDB), + playbookCollection: busdb.NewCollection(playbookCollection, hookedDB), + automationCollection: busdb.NewCollection(automationCollection, hookedDB), + relatedCollection: busdb.NewCollection(relatedCollection, hookedDB), + userdataCollection: busdb.NewCollection(userdataCollection, hookedDB), + userCollection: busdb.NewCollection(userCollection, hookedDB), + tickettypeCollection: busdb.NewCollection(tickettypeCollection, hookedDB), + jobCollection: busdb.NewCollection(jobCollection, hookedDB), + }, nil +} + +func setupDB(ctx context.Context, client driver.Client, dbName string) (driver.Database, error) { + databaseExists, err := client.DatabaseExists(ctx, dbName) + if err != nil { + return nil, err + } + + var db driver.Database + if !databaseExists { + db, err = client.CreateDatabase(ctx, dbName, nil) + } else { + db, err = client.Database(ctx, dbName) + } + if err != nil { + return nil, err + } + + collectionExists, err := db.CollectionExists(ctx, migrations.MigrationCollection) + if err != nil { + return nil, err + } + + if !collectionExists { + if _, err := db.CreateCollection(ctx, migrations.MigrationCollection, &driver.CreateCollectionOptions{ + KeyOptions: &driver.CollectionKeyOptions{AllowUserKeys: true}, + }); err != nil { + log.Println(err) + } + } + + return db, nil +} diff --git a/database/job.go b/database/job.go new file mode 100644 index 0000000..5143ea3 --- /dev/null +++ b/database/job.go @@ -0,0 +1,256 @@ +package database + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "strings" + + "github.com/arangodb/go-driver" + "github.com/docker/docker/client" + "github.com/xeipuuv/gojsonschema" + + "github.com/SecurityBrewery/catalyst/caql" + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" +) + +func toJob(doc *models.JobForm) *models.Job { + return &models.Job{ + Automation: doc.Automation, + Payload: doc.Payload, + Origin: doc.Origin, + Running: true, + Status: "created", + } +} + +func (db *Database) toJobResponse(ctx context.Context, key string, doc *models.Job, update bool) (*models.JobResponse, error) { + cli, err := client.NewClientWithOpts(client.FromEnv) + if err != nil { + return nil, err + } + defer cli.Close() + + status := doc.Status + + if doc.Running { + inspect, err := cli.ContainerInspect(ctx, key) + if err != nil || inspect.State == nil { + doc.Running = false + if update { + db.JobUpdate(ctx, key, doc) + } + } else if doc.Status != inspect.State.Status { + status = inspect.State.Status + doc.Status = inspect.State.Status + if update { + db.JobUpdate(ctx, key, doc) + } + } + } + + return &models.JobResponse{ + Automation: doc.Automation, + ID: key, + Log: doc.Log, + Payload: doc.Payload, + Origin: doc.Origin, + Output: doc.Output, + Status: status, + Container: doc.Container, + }, nil +} + +func (db *Database) JobCreate(ctx context.Context, id string, job *models.JobForm) (*models.JobResponse, error) { + if job == nil { + return nil, errors.New("requires job") + } + + var doc models.Job + newctx := driver.WithReturnNew(ctx, &doc) + + /* Start validation */ + j := toJob(job) + b, _ := json.Marshal(j) + + r, err := models.JobSchema.Validate(gojsonschema.NewBytesLoader(b)) + if err != nil { + return nil, err + } + + if !r.Valid() { + var errs []string + for _, e := range r.Errors() { + errs = append(errs, e.String()) + } + return nil, errors.New(strings.Join(errs, ", ")) + } + /* End validation */ + + meta, err := db.jobCollection.CreateDocument(ctx, newctx, id, j) + if err != nil { + return nil, err + } + + return db.toJobResponse(ctx, meta.Key, &doc, true) +} + +func (db *Database) JobGet(ctx context.Context, id string) (*models.JobResponse, error) { + var doc models.Job + meta, err := db.jobCollection.ReadDocument(ctx, id, &doc) + if err != nil { + return nil, err + } + + return db.toJobResponse(ctx, meta.Key, &doc, true) +} + +func (db *Database) JobUpdate(ctx context.Context, id string, job *models.Job) (*models.JobResponse, error) { + var doc models.Job + ctx = driver.WithReturnNew(ctx, &doc) + + /* Start validation */ + b, _ := json.Marshal(job) + + r, err := models.JobSchema.Validate(gojsonschema.NewBytesLoader(b)) + if err != nil { + return nil, err + } + + if !r.Valid() { + var errs []string + for _, e := range r.Errors() { + errs = append(errs, e.String()) + } + return nil, errors.New(strings.Join(errs, ", ")) + } + /* End validation */ + + meta, err := db.jobCollection.ReplaceDocument(ctx, id, job) + if err != nil { + return nil, err + } + + return db.toJobResponse(ctx, meta.Key, &doc, true) +} + +func (db *Database) JobLogAppend(ctx context.Context, id string, logLine string) error { + query := `LET d = DOCUMENT(@@collection, @ID) + UPDATE d WITH { "log": CONCAT(NOT_NULL(d.log, ""), @logline) } IN @@collection` + cur, _, err := db.Query(ctx, query, map[string]interface{}{ + "@collection": JobCollectionName, + "ID": id, + "logline": logLine, + }, &busdb.Operation{ + OperationType: busdb.Update, + Ids: []driver.DocumentID{ + driver.DocumentID(fmt.Sprintf("%s/%s", JobCollectionName, id)), + }, + Msg: fmt.Sprintf("Append logline"), + }) + if err != nil { + return err + } + defer cur.Close() + + return nil +} + +func (db *Database) JobComplete(ctx context.Context, id string, out interface{}) error { + query := `LET d = DOCUMENT(@@collection, @ID) + UPDATE d WITH { "output": @out, "status": "completed", "running": false } IN @@collection` + cur, _, err := db.Query(ctx, query, map[string]interface{}{ + "@collection": JobCollectionName, + "ID": id, + "out": out, + }, &busdb.Operation{ + OperationType: busdb.Update, + Ids: []driver.DocumentID{ + driver.DocumentID(fmt.Sprintf("%s/%s", JobCollectionName, id)), + }, + Msg: fmt.Sprintf("Set output"), + }) + if err != nil { + return err + } + defer cur.Close() + + return nil +} + +func (db *Database) JobDelete(ctx context.Context, id string) error { + _, err := db.jobCollection.RemoveDocument(ctx, id) + return err +} + +func (db *Database) JobList(ctx context.Context) ([]*models.JobResponse, error) { + query := "FOR d IN @@collection RETURN d" + cursor, _, err := db.Query(ctx, query, map[string]interface{}{"@collection": JobCollectionName}, busdb.ReadOperation) + if err != nil { + return nil, err + } + defer cursor.Close() + var docs []*models.JobResponse + for { + var doc models.Job + meta, err := cursor.ReadDocument(ctx, &doc) + if driver.IsNoMoreDocuments(err) { + break + } else if err != nil { + return nil, err + } + + job, err := db.toJobResponse(ctx, meta.Key, &doc, false) + if err != nil { + return nil, err + } + + docs = append(docs, job) + } + + return docs, err +} + +func publishJobMapping(id, automation string, contextStructs *models.Context, origin *models.Origin, payloadMapping map[string]string, db *Database) error { + msg, err := generatePayload(payloadMapping, contextStructs) + if err != nil { + return fmt.Errorf("message generation failed: %w", err) + } + + return publishJob(id, automation, contextStructs, origin, msg, db) +} + +func publishJob(id, automation string, contextStructs *models.Context, origin *models.Origin, payload map[string]interface{}, db *Database) error { + return db.bus.PublishJob(id, automation, payload, contextStructs, origin) +} + +func generatePayload(msgMapping map[string]string, contextStructs *models.Context) (map[string]interface{}, error) { + contextJson, err := json.Marshal(contextStructs) + if err != nil { + return nil, err + } + + automationContext := map[string]interface{}{} + err = json.Unmarshal(contextJson, &automationContext) + if err != nil { + return nil, err + } + + parser := caql.Parser{} + msg := map[string]interface{}{} + for arg, expr := range msgMapping { + tree, err := parser.Parse(expr) + if err != nil { + return nil, err + } + + v, err := tree.Eval(automationContext) + if err != nil { + return nil, err + } + msg[arg] = v + } + return msg, nil +} diff --git a/database/migrations/automations/comment.py b/database/migrations/automations/comment.py new file mode 100644 index 0000000..6a5c9bf --- /dev/null +++ b/database/migrations/automations/comment.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +import subprocess +import sys + +subprocess.call( + [sys.executable, "-m", "pip", "install", "requests"], + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, +) + +import json +import requests + + +def run(msg): + if "ticket" in msg["context"]: + headers = {"PRIVATE-TOKEN": msg["secrets"]["catalyst_apikey"]} + url = "%s/tickets/%d/comments" % (msg["secrets"]["catalyst_apiurl"], msg["context"]["ticket"]["id"]) + data = {'message': msg["payload"]["default"], 'creator': 'automation'} + requests.post(url, json=data, headers=headers).json() + + return {"done": True} + + +print(json.dumps(run(json.loads(sys.argv[1])))) diff --git a/database/migrations/automations/hash.sha1.py b/database/migrations/automations/hash.sha1.py new file mode 100755 index 0000000..799ba06 --- /dev/null +++ b/database/migrations/automations/hash.sha1.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python + +import sys +import json +import hashlib + + +def run(msg): + sha1 = hashlib.sha1(msg['payload']['default'].encode('utf-8')) + return {"hash": sha1.hexdigest()} + + +print(json.dumps(run(json.loads(sys.argv[1])))) diff --git a/database/migrations/automations/thehive.py b/database/migrations/automations/thehive.py new file mode 100644 index 0000000..aa924d2 --- /dev/null +++ b/database/migrations/automations/thehive.py @@ -0,0 +1,630 @@ +#!/usr/bin/env python + +import subprocess +import sys +import json +from datetime import datetime +import io + +subprocess.check_call( + [sys.executable, "-m", "pip", "install", "thehive4py", "requests", "minio"], + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, +) + +defaultschema = { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Default", + "type": "object", + "required": [ + "severity", + "description", + "summary", + "tlp", + "pap" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Unknown", + "title": "Unknown", + "icon": "mdi-help" + }, + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + }, + { + "const": "Very High", + "title": "Very High", + "icon": "mdi-exclamation" + } + ] + }, + "flag": { + "title": "Flag", + "type": "boolean", + "x-cols": 6, + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "pap": { + "$id": "#root/pap", + "title": "PAP", + "type": "string", + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "tags": { + "$id": "#root/tags", + "title": "Tags", + "type": "array", + "items": { + "type": "string" + } + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + }, + "resolutionStatus": { + "$id": "#root/resolutionStatus", + "title": "Resolution Status", + "type": "string", + "x-cols": 6, + "x-class": "pr-2", + }, + "endDate": { + "$id": "#root/endDate", + "title": "End Data", + "type": "string", + "format": "date-time", + "x-cols": 6, + "x-class": "pr-2", + }, + "summary": { + "$id": "#root/summary", + "title": "Summary", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } +} + +defaultalertschema = { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Default", + "type": "object", + "required": [ + "severity", + "description", + "summary", + "tlp", + "pap" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Unknown", + "title": "Unknown", + "icon": "mdi-help" + }, + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + }, + { + "const": "Very High", + "title": "Very High", + "icon": "mdi-exclamation" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "source": { + "$id": "#root/source", + "title": "Source", + "type": "string", + "x-cols": 4, + "x-class": "pr-2", + }, + "sourceRef": { + "$id": "#root/sourceRef", + "title": "Source Ref", + "type": "string", + "x-cols": 4, + "x-class": "pr-2", + }, + "type": { + "$id": "#root/type", + "title": "Type", + "type": "string", + "x-cols": 4, + "x-class": "pr-2", + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } +} + + +class schema: + def __init__(self): + self.schema = defaultschema + + def add_string(self, title): + self.schema["properties"][title] = { "type": "string", "x-cols": 6, "x-class": "pr-2" } + + def add_boolean(self, title): + self.schema["properties"][title] = { "type": "boolean", "x-cols": 6, "x-class": "pr-2" } + + def add_date(self, title): + self.schema["properties"][title] = { "type": "string", "format": "date-time", "x-cols": 6, "x-class": "pr-2" } + + def add_integer(self, title): + self.schema["properties"][title] = { "type": "integer", "x-cols": 6, "x-class": "pr-2" } + + def add_float(self, title): + self.schema["properties"][title] = { "type": "number", "x-cols": 6, "x-class": "pr-2" } + + +class alertschema: + def __init__(self): + self.schema = defaultalertschema + + +def maptime(hivetime): + if hivetime is None: + return None + return datetime.fromtimestamp(hivetime/1000).isoformat() + "Z" + + +def mapstatus(hivestatus): + if hivestatus == "Open" or hivestatus == "New": + return "open" + return "closed" + + +def maptlp(hivetlp): + if hivetlp == 0: + return "White" + if hivetlp == 1: + return "Green" + if hivetlp == 2: + return "Amber" + if hivetlp == 3: + return "Red" + return "White" + + +def mapseverity(hiveseverity): + if hiveseverity == 1: + return "Low" + if hiveseverity == 2: + return "Medium" + if hiveseverity == 3: + return "High" + if hiveseverity == 4: + return "Very High" + return "Unknown" + +# { +# "_id": "~16416", +# "id": "~16416", +# "createdBy": "jonas@thehive.local", +# "updatedBy": "jonas@thehive.local", +# "createdAt": 1638704013583, +# "updatedAt": 1638704061151, +# "_type": "case", +# "caseId": 1, +# "title": "My Test 1", +# "description": "My Testcase", +# "severity": 2, +# "startDate": 1638703980000, +# "endDate": null, +# "impactStatus": null, +# "resolutionStatus": null, +# "tags": [], +# "flag": false, +# "tlp": 2, +# "pap": 2, +# "status": "Open", +# "summary": null, +# "owner": "jonas@thehive.local", +# "customFields": {}, +# "stats": {}, +# "permissions": [ "manageShare", "manageAnalyse", "manageTask", "manageCaseTemplate", "manageCase", "manageUser", "manageProcedure", "managePage", "manageObservable", "manageTag", "manageConfig", "manageAlert", "accessTheHiveFS", "manageAction" ] +# } +def mapcase(hivecase, url, keep_ids): + + s = schema() + details = {} + for name, data in hivecase["customFields"].items(): + if "string" in data and data["string"] is not None: + s.add_string(name) + details[name] = data["string"] + if "boolean" in data and data["boolean"] is not None: + s.add_boolean(name) + details[name] = data["boolean"] + if "date" in data and data["date"] is not None: + s.add_date(name) + details[name] = maptime(data["date"]) + if "integer" in data and data["integer"] is not None: + s.add_integer(name) + details[name] = data["integer"] + if "float" in data and data["float"] is not None: + s.add_float(name) + details[name] = data["float"] + + case = {} + if keep_ids: + case["id"] = hivecase["caseId"] + + return { + "name": hivecase["title"], + "type": "incident", + "status": mapstatus(hivecase["status"]), + + "owner": hivecase["owner"], + # "write": hivecase["write"], + # "read": hivecase["read"], + + "schema": json.dumps(s.schema), + "details": { + "tlp": maptlp(hivecase["tlp"]), + "pap": maptlp(hivecase["pap"]), + "severity": mapseverity(hivecase["severity"]), + "description": hivecase["description"], + "summary": hivecase["summary"], + "tags": hivecase["tags"], + "endDate": maptime(hivecase["endDate"]), + "resolutionStatus": hivecase["resolutionStatus"], + "flag": hivecase["flag"], + } | details, + "references": [ + { "name": "TheHive #%d" % hivecase["caseId"], "href": "%s/index.html#!/case/~%s/details" % (url, hivecase["id"]) } + ], + # + # "playbooks": hivecase["playbooks"], + # + "files": [], + "comments": [], + # creator, created, message + # + "artifacts": [], + # name, type, status, enrichment + # name, data + + "created": maptime(hivecase["createdAt"]), + "modified": maptime(hivecase["updatedAt"]), + } | case + +# { +# "_id": "ce2c00f17132359cb3c50dfbb1901810", +# "_type": "alert", +# "artifacts": [], +# "createdAt": 1495012062014, +# "createdBy": "myuser", +# "date": 1495012062016, +# "description": "N/A", +# "follow": true, +# "id": "ce2c00f17132359cb3c50dfbb1901810", +# "lastSyncDate": 1495012062016, +# "severity": 2, +# "source": "instance1", +# "sourceRef": "alert-ref", +# "status": "New", +# "title": "New Alert", +# "tlp": 2, +# "type": "external", +# "user": "myuser" +# } +def mapalert(hivealert, url): + s = alertschema() + details = {} + + return { + "name": hivealert["title"], + "type": "alert", + "status": mapstatus(hivealert["status"]), + "owner": hivealert["user"], + "schema": json.dumps(s.schema), + "details": { + "tlp": maptlp(hivealert["tlp"]), + "severity": mapseverity(hivealert["severity"]), + "description": hivealert["description"], + "source": hivealert["source"], + "sourceRef": hivealert["sourceRef"], + "type": hivealert["type"], + } | details, + "references": [ + { "name": "TheHive Alerts", "href": "%s/index.html#!/alert/list" % url } + ], + "files": [], + "comments": [], + "artifacts": [], + "created": maptime(hivealert["createdAt"]), + "modified": maptime(hivealert["lastSyncDate"]), + } + +# { +# "_id": "~41152", +# "id": "~41152", +# "createdBy": "jonas@thehive.local", +# "createdAt": 1638723814523, +# "_type": "case_artifact", +# "dataType": "ip", +# "data": "2.2.2.2", +# "startDate": 1638723814523, +# "tlp": 2, +# "tags": [], +# "ioc": false, +# "sighted": false, +# "message": ".", +# "reports": {}, +# "stats": {}, +# "ignoreSimilarity": false +# } +def mapobservable(hiveobservable): + status = "unknown" + if hiveobservable["ioc"]: + status = "malicious" + return { + "name": hiveobservable["data"], + "type": hiveobservable["dataType"], + "status": status, + } + +# { +# "id": "~12296", +# "_id": "~12296", +# "createdBy": "jonas@thehive.local", +# "createdAt": 1638704029800, +# "_type": "case_task", +# "title": "Start", +# "group": "MyTaskGroup1", +# "owner": "jonas@thehive.local", +# "status": "InProgress", +# "flag": false, +# "startDate": 1638704115667, +# "order": 0 +# } +# { +# "_id": "~24656", +# "id": "~24656", +# "createdBy": "jonas@thehive.local", +# "createdAt": 1638729992590, +# "_type": "case_task_log", +# "message": "asd", +# "startDate": 1638729992590, +# "attachment": { +# "name": "Chemistry Vector.eps", +# "hashes": [ +# "adf2d4cd72f4141fe7f8eb4af035596415a29c048d3039be6449008f291258e9", +# "180f66a6d22b1f09ed198afd814f701e42440e7c", +# "b28ae347371df003b76cbb8c6199c97e" +# ], +# "size": 3421842, +# "contentType": "application/postscript", +# "id": "adf2d4cd72f4141fe7f8eb4af035596415a29c048d3039be6449008f291258e9" +# }, +# "status": "Ok", +# "owner": "jonas@thehive.local" +# } +def maptasklog(hivetask, hivetasklog): + message = "**" + hivetask["group"] + ": " + hivetask["title"] + "** (" + hivetask["status"] + ")\n\n" + message += hivetasklog["message"] + if 'attachment' in hivetasklog: + message += "\n\n*Attachment*: " + hivetasklog['attachment']["name"] + return { + "creator": hivetasklog["createdBy"], + "created": maptime(hivetasklog["createdAt"]), + "message": message, + } + + +def run(msg): + skip_files = msg["payload"]["skip_files"] + keep_ids = msg["payload"]["keep_ids"] + + from thehive4py.api import TheHiveApi + import requests + from minio import Minio + + headers = {"PRIVATE-TOKEN": msg["secrets"]["catalyst_apikey"]} + # minioclient = Minio("try.catalyst-soar.com:9000", access_key="minio", secret_key="password") + if not skip_files: + minioclient = Minio( + msg["secrets"]["minio_host"], + access_key=msg["secrets"]["minio_access_key"], + secret_key=msg["secrets"]["minio_secret_key"]) + + # url = "http://localhost:9000" + url = msg["payload"]["thehiveurl"] + # api = TheHiveApi(url, "dtUCnzY4h291GIFHJKW/Z2I2SgjTRQqo") + api = TheHiveApi(url, msg["payload"]["thehivekey"]) + + print("find alerts", file=sys.stderr) + alerts = [] + resp = api.find_alerts(query={}, sort=['-createdAt'], range='all') + resp.raise_for_status() + for alert in resp.json(): + alerts.append(mapalert(alert, url)) + + if alerts: + print("create %s alerts" % len(alerts), file=sys.stderr) + response = requests.post(msg["secrets"]["catalyst_apiurl"] + "/tickets/batch", json=alerts, headers=headers) + response.raise_for_status() + + print("find incidents", file=sys.stderr) + incidents = [] + resp = api.find_cases(query={}, sort=['-createdAt'], range='all') + resp.raise_for_status() + for case in resp.json(): + incident = mapcase(case, url, keep_ids) + for observable in api.get_case_observables(case["id"]).json(): + incident["artifacts"].append(mapobservable(observable)) + for task in api.get_case_tasks(case["id"]).json(): + for log in api.get_task_logs(task["id"]).json(): + incident["comments"].append(maptasklog(task, log)) + if 'attachment' in log and not skip_files: + incident["files"].append({ "key": log['attachment']["id"], "name": log['attachment']["name"] }) + + bucket_name = "catalyst-%d" % incident["id"] + if not minioclient.bucket_exists(bucket_name): + minioclient.make_bucket(bucket_name) + + response = api.download_attachment(log["attachment"]["id"]) + data = io.BytesIO(response.content) + + minioclient.put_object(bucket_name, log["attachment"]["id"], data, length=-1, part_size=10*1024*1024) + incidents.append(incident) + + if incidents: + if keep_ids: + print("delete incidents", file=sys.stderr) + for incident in incidents: + requests.delete(msg["secrets"]["catalyst_apiurl"] + "/tickets/%d" % incident["id"], headers=headers) + print("create %d incidents" % len(incidents), file=sys.stderr) + response = requests.post(msg["secrets"]["catalyst_apiurl"] + "/tickets/batch", json=incidents, headers=headers) + response.raise_for_status() + + return {"done": True} + + +print(json.dumps(run(json.loads(sys.argv[1])))) diff --git a/database/migrations/automations/vt.hash.py b/database/migrations/automations/vt.hash.py new file mode 100644 index 0000000..270c605 --- /dev/null +++ b/database/migrations/automations/vt.hash.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +import subprocess +import sys + +subprocess.call( + [sys.executable, "-m", "pip", "install", "requests"], + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, +) + +import json +import requests + + +def run(msg): + api_key = msg['secrets']['vt_api_key'].encode('utf-8') + resource = msg['payload']['default'].encode('utf-8') + params = {'apikey': api_key, 'resource': resource} + return requests.get("https://www.virustotal.com/vtapi/v2/file/report", params=params).json() + + +print(json.dumps(run(json.loads(sys.argv[1])))) diff --git a/database/migrations/content.go b/database/migrations/content.go new file mode 100644 index 0000000..372431b --- /dev/null +++ b/database/migrations/content.go @@ -0,0 +1,27 @@ +package migrations + +import _ "embed" + +//go:embed templates/default.json +var DefaultTemplateSchema string + +//go:embed automations/hash.sha1.py +var SHA1HashAutomation string + +//go:embed automations/vt.hash.py +var VTHashAutomation string + +//go:embed automations/thehive.py +var TheHiveAutomation string + +//go:embed automations/comment.py +var CommentAutomation string + +//go:embed playbooks/malware.yml +var MalwarePlaybook string + +//go:embed playbooks/phishing.yml +var PhishingPlaybook string + +//go:embed playbooks/simple.yaml +var SimplePlaybook string diff --git a/database/migrations/migrations.go b/database/migrations/migrations.go new file mode 100644 index 0000000..5329717 --- /dev/null +++ b/database/migrations/migrations.go @@ -0,0 +1,217 @@ +package migrations + +import ( + "context" + "fmt" + + "github.com/arangodb/go-driver" + + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/pointer" +) + +const MigrationCollection string = "migrations" + +type Migration interface { + MID() string + Migrate(ctx context.Context, driver driver.Database) error +} + +func generateMigrations() ([]Migration, error) { + // content here should never change + return []Migration{ + &createCollection{ID: "create-log-collection", Name: "logs", DataType: "log", Schema: `{"properties":{"created":{"format":"date-time","type":"string"},"creator":{"type":"string"},"message":{"type":"string"},"reference":{"type":"string"}},"required":["created","creator","message","reference"],"type":"object"}`}, + &createCollection{ID: "create-ticket-collection", Name: "tickets", DataType: "ticket", Schema: `{"properties":{"artifacts":{"items":{"properties":{"enrichments":{"additionalProperties":{"properties":{"created":{"format":"date-time","type":"string"},"data":{"example":{"hash":"b7a067a742c20d07a7456646de89bc2d408a1153"},"properties":{},"type":"object"},"name":{"example":"hash.sha1","type":"string"}},"required":["created","data","name"],"type":"object"},"type":"object"},"name":{"example":"2.2.2.2","type":"string"},"status":{"example":"Unknown","type":"string"},"type":{"type":"string"}},"required":["name"],"type":"object"},"type":"array"},"comments":{"items":{"properties":{"created":{"format":"date-time","type":"string"},"creator":{"type":"string"},"message":{"type":"string"}},"required":["created","creator","message"],"type":"object"},"type":"array"},"created":{"format":"date-time","type":"string"},"details":{"example":{"description":"my little incident"},"properties":{},"type":"object"},"files":{"items":{"properties":{"key":{"example":"myfile","type":"string"},"name":{"example":"notes.docx","type":"string"}},"required":["key","name"],"type":"object"},"type":"array"},"modified":{"format":"date-time","type":"string"},"name":{"example":"WannyCry","type":"string"},"owner":{"example":"bob","type":"string"},"playbooks":{"additionalProperties":{"properties":{"name":{"example":"Phishing","type":"string"},"tasks":{"additionalProperties":{"properties":{"automation":{"type":"string"},"closed":{"format":"date-time","type":"string"},"created":{"format":"date-time","type":"string"},"data":{"properties":{},"type":"object"},"done":{"type":"boolean"},"join":{"example":false,"type":"boolean"},"payload":{"additionalProperties":{"type":"string"},"type":"object"},"name":{"example":"Inform user","type":"string"},"next":{"additionalProperties":{"type":"string"},"type":"object"},"owner":{"type":"string"},"schema":{"properties":{},"type":"object"},"type":{"enum":["task","input","automation"],"example":"task","type":"string"}},"required":["created","done","name","type"],"type":"object"},"type":"object"}},"required":["name","tasks"],"type":"object"},"type":"object"},"read":{"example":["bob"],"items":{"type":"string"},"type":"array"},"references":{"items":{"properties":{"href":{"example":"https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0144","type":"string"},"name":{"example":"CVE-2017-0144","type":"string"}},"required":["href","name"],"type":"object"},"type":"array"},"schema":{"example":"{}","type":"string"},"status":{"example":"open","type":"string"},"type":{"example":"incident","type":"string"},"write":{"example":["alice"],"items":{"type":"string"},"type":"array"}},"required":["created","modified","name","schema","status","type"],"type":"object"}`}, + &createCollection{ID: "create-template-collection", Name: "templates", DataType: "template", Schema: `{"properties":{"name":{"type":"string"},"schema":{"type":"string"}},"required":["name","schema"],"type":"object"}`}, + &createCollection{ID: "create-playbook-collection", Name: "playbooks", DataType: "playbook", Schema: `{"properties":{"name":{"type":"string"},"yaml":{"type":"string"}},"required":["name","yaml"],"type":"object"}`}, + &createCollection{ID: "create-automation-collection", Name: "automations", DataType: "automation", Schema: `{"properties":{"image":{"type":"string"},"script":{"type":"string"}},"required":["image","script"],"type":"object"}`}, + &createCollection{ID: "create-userdata-collection", Name: "userdata", DataType: "userdata", Schema: `{"properties":{"email":{"type":"string"},"image":{"type":"string"},"name":{"type":"string"},"timeformat":{"title":"Time Format (https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens)","type":"string"}},"type":"object"}`}, + &createCollection{ID: "create-tickettype-collection", Name: "tickettypes", DataType: "tickettype", Schema: `{"properties":{"default_groups":{"items":{"type":"string"},"type":"array"},"default_playbooks":{"items":{"type":"string"},"type":"array"},"default_template":{"type":"string"},"icon":{"type":"string"},"name":{"type":"string"}},"required":["default_playbooks","default_template","icon","name"],"type":"object"}`}, + &createCollection{ID: "create-user-collection", Name: "users", DataType: "user", Schema: `{"properties":{"apikey":{"type":"boolean"},"blocked":{"type":"boolean"},"roles":{"items":{"type":"string"},"type":"array"},"sha256":{"type":"string"}},"required":["apikey","blocked","roles"],"type":"object"}`}, + + &createGraph{ID: "create-ticket-graph", Name: "Graph", EdgeDefinitions: []driver.EdgeDefinition{{Collection: "related", From: []string{"tickets"}, To: []string{"tickets"}}}}, + + &createDocument{ID: "create-template-default", Collection: "templates", Document: &busdb.Keyed{Key: "default", Doc: models.TicketTemplate{Schema: DefaultTemplateSchema, Name: "Default"}}}, + &createDocument{ID: "create-automation-vt.hash", Collection: "automations", Document: &busdb.Keyed{Key: "vt.hash", Doc: models.Automation{Image: "docker.io/python:3", Script: VTHashAutomation}}}, + &createDocument{ID: "create-automation-comment", Collection: "automations", Document: &busdb.Keyed{Key: "comment", Doc: models.Automation{Image: "docker.io/python:3", Script: CommentAutomation}}}, + &createDocument{ID: "create-automation-thehive", Collection: "automations", Document: &busdb.Keyed{Key: "thehive", Doc: models.Automation{Image: "docker.io/python:3", Script: TheHiveAutomation}}}, + &createDocument{ID: "create-automation-hash.sha1", Collection: "automations", Document: &busdb.Keyed{Key: "hash.sha1", Doc: models.Automation{Image: "docker.io/python:3", Script: SHA1HashAutomation}}}, + &createDocument{ID: "create-playbook-malware", Collection: "playbooks", Document: &busdb.Keyed{Key: "malware", Doc: models.PlaybookTemplate{Name: "Malware", Yaml: MalwarePlaybook}}}, + &createDocument{ID: "create-playbook-phishing", Collection: "playbooks", Document: &busdb.Keyed{Key: "phishing", Doc: models.PlaybookTemplate{Name: "Phishing", Yaml: PhishingPlaybook}}}, + &createDocument{ID: "create-tickettype-alert", Collection: "tickettypes", Document: &busdb.Keyed{Key: "alert", Doc: models.TicketType{Name: "Alerts", Icon: "mdi-alert", DefaultTemplate: "default", DefaultPlaybooks: []string{}, DefaultGroups: nil}}}, + &createDocument{ID: "create-tickettype-incident", Collection: "tickettypes", Document: &busdb.Keyed{Key: "incident", Doc: models.TicketType{Name: "Incidents", Icon: "mdi-radioactive", DefaultTemplate: "default", DefaultPlaybooks: []string{}, DefaultGroups: nil}}}, + &createDocument{ID: "create-tickettype-investigation", Collection: "tickettypes", Document: &busdb.Keyed{Key: "investigation", Doc: models.TicketType{Name: "Forensic Investigations", Icon: "mdi-fingerprint", DefaultTemplate: "default", DefaultPlaybooks: []string{}, DefaultGroups: nil}}}, + &createDocument{ID: "create-tickettype-hunt", Collection: "tickettypes", Document: &busdb.Keyed{Key: "hunt", Doc: models.TicketType{Name: "Threat Hunting", Icon: "mdi-target", DefaultTemplate: "default", DefaultPlaybooks: []string{}, DefaultGroups: nil}}}, + + &updateSchema{ID: "update-automation-collection-1", Name: "automations", DataType: "automation", Schema: `{"properties":{"image":{"type":"string"},"script":{"type":"string"}},"required":["image","script"],"type":"object"}`}, + &updateDocument{ID: "update-automation-vt.hash-1", Collection: "automations", Key: "vt.hash", Document: models.Automation{Image: "docker.io/python:3", Script: VTHashAutomation, Schema: pointer.String(`{"title":"Input","type":"object","properties":{"default":{"type":"string","title":"Value"}},"required":["default"]}`), Type: []string{"global", "artifact", "playbook"}}}, + &updateDocument{ID: "update-automation-comment-1", Collection: "automations", Key: "comment", Document: models.Automation{Image: "docker.io/python:3", Script: CommentAutomation, Type: []string{"playbook"}}}, + &updateDocument{ID: "update-automation-thehive-1", Collection: "automations", Key: "thehive", Document: models.Automation{Image: "docker.io/python:3", Script: TheHiveAutomation, Schema: pointer.String(`{"title":"TheHive credentials","type":"object","properties":{"thehiveurl":{"type":"string","title":"TheHive URL (e.g. 'https://thehive.example.org')"},"thehivekey":{"type":"string","title":"TheHive API Key"},"skip_files":{"type":"boolean", "default": true, "title":"Skip Files (much faster)"},"keep_ids":{"type":"boolean", "default": true, "title":"Keep IDs and overwrite existing IDs"}},"required":["thehiveurl", "thehivekey", "skip_files", "keep_ids"]}`), Type: []string{"global"}}}, + &updateDocument{ID: "update-automation-hash.sha1-1", Collection: "automations", Key: "hash.sha1", Document: models.Automation{Image: "docker.io/python:3", Script: SHA1HashAutomation, Schema: pointer.String(`{"title":"Input","type":"object","properties":{"default":{"type":"string","title":"Value"}},"required":["default"]}`), Type: []string{"global", "artifact", "playbook"}}}, + + &createCollection{ID: "create-job-collection", Name: "jobs", DataType: "job", Schema: `{"properties":{"automation":{"type":"string"},"log":{"type":"string"},"payload":{},"origin":{"properties":{"artifact_origin":{"properties":{"artifact":{"type":"string"},"ticket_id":{"format":"int64","type":"integer"}},"required":["artifact","ticket_id"],"type":"object"},"task_origin":{"properties":{"playbook_id":{"type":"string"},"task_id":{"type":"string"},"ticket_id":{"format":"int64","type":"integer"}},"required":["playbook_id","task_id","ticket_id"],"type":"object"}},"type":"object"},"output":{"properties":{},"type":"object"},"running":{"type":"boolean"},"status":{"type":"string"}},"required":["automation","running","status"],"type":"object"}`}, + }, nil +} + +func loadSchema(dataType, jsonschema string) (*driver.CollectionSchemaOptions, error) { + ticketCollectionSchema := &driver.CollectionSchemaOptions{Level: driver.CollectionSchemaLevelStrict, Message: fmt.Sprintf("Validation of %s failed", dataType)} + + err := ticketCollectionSchema.LoadRule([]byte(jsonschema)) + return ticketCollectionSchema, err +} + +type migration struct { + Key string `json:"_key"` +} + +func PerformMigrations(ctx context.Context, db driver.Database) error { + collection, err := db.Collection(ctx, MigrationCollection) + if err != nil { + return err + } + + migrations, err := generateMigrations() + if err != nil { + return fmt.Errorf("could not generate migrations: %w", err) + } + + for _, m := range migrations { + migrationRan, err := collection.DocumentExists(ctx, m.MID()) + if err != nil { + return err + } + + if !migrationRan { + if err := m.Migrate(ctx, db); err != nil { + return fmt.Errorf("migration %s failed: %w", m.MID(), err) + } + + if _, err := collection.CreateDocument(ctx, &migration{Key: m.MID()}); err != nil { + return fmt.Errorf("could not save %s migration document: %w", m.MID(), err) + } + } + } + return nil +} + +type createCollection struct { + ID string + Name string + DataType string + Schema string +} + +func (m *createCollection) MID() string { + return m.ID +} + +func (m *createCollection) Migrate(ctx context.Context, db driver.Database) error { + schema, err := loadSchema(m.DataType, m.Schema) + if err != nil { + return err + } + + _, err = db.CreateCollection(ctx, m.Name, &driver.CreateCollectionOptions{ + Schema: schema, + }) + + return err +} + +type updateSchema struct { + ID string + Name string + DataType string + Schema string +} + +func (m *updateSchema) MID() string { + return m.ID +} + +func (m *updateSchema) Migrate(ctx context.Context, db driver.Database) error { + schema, err := loadSchema(m.DataType, m.Schema) + if err != nil { + return err + } + + col, err := db.Collection(ctx, m.Name) + if err != nil { + return err + } + + err = col.SetProperties(ctx, driver.SetCollectionPropertiesOptions{ + Schema: schema, + }) + + return err +} + +type createGraph struct { + ID string + Name string + EdgeDefinitions []driver.EdgeDefinition +} + +func (m *createGraph) MID() string { + return m.ID +} + +func (m *createGraph) Migrate(ctx context.Context, db driver.Database) error { + _, err := db.CreateGraph(ctx, m.Name, &driver.CreateGraphOptions{ + EdgeDefinitions: m.EdgeDefinitions, + }) + return err +} + +type createDocument struct { + ID string + Collection string + Document interface{} +} + +func (m *createDocument) MID() string { + return m.ID +} + +func (m *createDocument) Migrate(ctx context.Context, driver driver.Database) error { + collection, err := driver.Collection(ctx, m.Collection) + if err != nil { + return err + } + + _, err = collection.CreateDocument(ctx, m.Document) + return err +} + +type updateDocument struct { + ID string + Collection string + Key string + Document interface{} +} + +func (m *updateDocument) MID() string { + return m.ID +} + +func (m *updateDocument) Migrate(ctx context.Context, driver driver.Database) error { + collection, err := driver.Collection(ctx, m.Collection) + if err != nil { + return err + } + + exists, err := collection.DocumentExists(ctx, m.Key) + if err != nil { + return err + } + + if !exists { + _, err = collection.CreateDocument(ctx, m.Document) + return err + } + + _, err = collection.ReplaceDocument(ctx, m.Key, m.Document) + return err +} diff --git a/database/migrations/playbooks/malware.yml b/database/migrations/playbooks/malware.yml new file mode 100644 index 0000000..8bbb3c8 --- /dev/null +++ b/database/migrations/playbooks/malware.yml @@ -0,0 +1,63 @@ +name: Malware +tasks: + file-or-hash: + name: Do you have the file or the hash? + type: input + schema: + title: Malware + type: object + properties: + file: + type: string + title: "I have the" + enum: [ "File", "Hash" ] + next: + enter-hash: "file == 'Hash'" + upload: "file == 'File'" + + enter-hash: + name: Please enter the hash + type: input + schema: + title: Malware + type: object + properties: + hash: + type: string + title: Please enter the hash value + minlength: 32 + next: + virustotal: "hash != ''" + + upload: + name: Upload the malware + type: input + schema: + title: Malware + type: object + properties: + malware: + type: object + x-display: file + title: Please upload the malware + next: + hash: "malware" + + hash: + name: Hash the malware + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['upload'].data['malware']" + next: + virustotal: + + virustotal: + name: Send hash to VirusTotal + type: automation + automation: vt.hash + args: + hash: "playbook.tasks['enter-hash'].data['hash'] || playbook.tasks['hash'].data['hash']" + # next: + # known-malware: "score > 5" + # sandbox: "score < 6" # unknown-malware diff --git a/database/migrations/playbooks/phishing.yml b/database/migrations/playbooks/phishing.yml new file mode 100644 index 0000000..0934b95 --- /dev/null +++ b/database/migrations/playbooks/phishing.yml @@ -0,0 +1,85 @@ +name: Phishing +tasks: + board: + name: Board Involvement? + description: Is a board member involved? + type: input + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + next: + escalate: "boardInvolved == true" + mail-available: "boardInvolved == false" + + escalate: + name: Escalate to CISO + description: Please escalate the task to the CISO + type: task + + mail-available: + name: Mail available + type: input + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: 'yes' + type: string + required: + - mail + title: 'Yes' + - properties: + schemaKey: + const: 'no' + type: string + title: 'No' + title: Mail available + type: object + next: + block-sender: "schemaKey == 'yes'" + extract-iocs: "schemaKey == 'yes'" + search-email-gateway: "schemaKey == 'no'" + + search-email-gateway: + name: Search email gateway + description: Please search email-gateway for the phishing mail. + type: task + next: + extract-iocs: + + block-sender: + name: Block sender + type: task + next: + extract-iocs: + + extract-iocs: + name: Extract IOCs + description: Please insert the IOCs + type: input + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + next: + block-iocs: + + block-iocs: + name: Block IOCs + type: task diff --git a/database/migrations/playbooks/simple.yaml b/database/migrations/playbooks/simple.yaml new file mode 100644 index 0000000..5046453 --- /dev/null +++ b/database/migrations/playbooks/simple.yaml @@ -0,0 +1,37 @@ +name: Simple +tasks: + input: + name: Enter something to hash + type: input + schema: + title: Something + type: object + properties: + something: + type: string + title: Something + default: "" + next: + hash: "something != ''" + + hash: + name: Hash the something + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['input'].data['something']" + next: + comment: "hash != ''" + + comment: + name: Comment the hash + type: automation + automation: comment + payload: + default: "playbook.tasks['hash'].data['hash']" + next: + done: "done" + + done: + name: You can close this case now + type: task diff --git a/database/migrations/templates/advanced.json b/database/migrations/templates/advanced.json new file mode 100644 index 0000000..2dd7035 --- /dev/null +++ b/database/migrations/templates/advanced.json @@ -0,0 +1,208 @@ +{ + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Advanced", + "type": "object", + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + }, + + "type": { + "type": "object", + "title": "Select an incident type", + "oneOf": [ + { + "title": "Malware", + "properties": { + "schemaKey": { + "type": "string", + "const": "malware" + }, + "malware_type": { + "type": "string", + "title": "Malware Type", + "enum": ["Ransomware", "Worm", "Virus"] + } + } + }, + { + "title": "Phishing", + "properties": { + "schemaKey": { + "type": "string", + "const": "phishing" + }, + "phishing_type": { + "type": "string", + "title": "Phishing Type", + "enum": ["Normal", "Spear", "Whale"] + } + } + } + ], + "x-cols": 12 + }, + "apt": { + "type": "boolean", + "x-display": "switch", + "title": "APT involved?", + "x-cols": 6 + }, + "apt-group": { + "type": "string", + "title": "Select APT", + "enum": ["Lazarus Group", "Equation Group", "Fancy Bear (APT 28)", "OceanLotus (APT 32)", "Other"], + "x-if": "apt", + "x-cols": 6 + }, + "tactics": { + "type": "array", + "title": "MITRE Att&ck", + "description": "This description is used as a help message.", + "items": { + "type": "object", + "oneOf": [ + { + "title": "Reconnaissance", + "properties": { + "tactic": { + "type": "string", + "const": "reconnaissance", + "title": "Tactic", + "description": "The adversary is trying to gather information they can use to plan future operations." + }, + "techniques": { + "type": "array", + "title": "Techniques", + "items": { + "type": "string", + "oneOf": [ + { + "const": "T1595", + "title": "Active Scanning", + "description": "Adversaries may execute active reconnaissance scans to gather information that can be used during targeting. Active scans are those where the adversary probes victim infrastructure via network traffic, as opposed to other forms of reconnaissance that do not involve direct interaction." + }, + { + "const": "T1592", + "title": "Gather Victim Host Information" + } + ] + }, + "minItems": 1, + "uniqueItems": true + } + } + }, + { + "title": "Persistence", + "properties": { + "tactic": { + "type": "string", + "const": "persistence" + }, + "techniques": { + "type": "string", + "title": "Techniques", + "oneOf": [ + { + "const": "T1098", + "title": "Account Manipulation" + }, + { + "const": "T1197", + "title": "BITS Jobs" + } + ] + } + } + } + ] + }, + "uniqueItems": true + }, + "tags": { + "type": "array", + "title": "Tags", + "items": { + "type": "string", + "examples": [ + "misp", + "external report", + "internal report" + ] + } + } + }, + "required": ["severity", "description", "tactics", "type"] +} + diff --git a/database/migrations/templates/default.json b/database/migrations/templates/default.json new file mode 100644 index 0000000..20a186e --- /dev/null +++ b/database/migrations/templates/default.json @@ -0,0 +1,79 @@ +{ + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Default", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } +} diff --git a/database/migrations/templates/veris.json b/database/migrations/templates/veris.json new file mode 100644 index 0000000..c38f224 --- /dev/null +++ b/database/migrations/templates/veris.json @@ -0,0 +1,3644 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "properties": { + "security_incident": { + "title": "Incident confirmation", + "type": "string", + "description": "Was this a confirmed security incident?", + "enum": [ + "Confirmed", + "Suspected", + "Near miss", + "False positive" + ], + "x-cols": 6 + }, + "confidence": { + "title": "Confidence", + "type": "string", + "enum": [ + "High", + "Medium", + "Low", + "None" + ], + "x-cols": 6 + }, + "summary": { + "title": "Summary", + "type": "string", + "description": "Give a good descriptive summary of the incident in several sentences. Use natural language instead of VERIS notation, but we should be able to 'VERISize' the incident pretty well from just this description.", + "x-display": "textarea", + "x-cols": 12 + }, + "timeline": { + "title": "Timeline", + "additionalProperties": false, + "properties": { + "incident": { + "title": "Incident", + "description": "When did this incident initially occur?", + "additionalProperties": false, + "properties": { + "year": { + "title": "Year", + "type": "integer", + "maximum": 2022, + "minimum": 1950, + "x-cols": 3, + "x-class": "pr-1" + }, + "month": { + "title": "Month", + "type": "integer", + "maximum": 12, + "minimum": 1, + "x-cols": 3, + "x-class": "pr-1" + }, + "day": { + "title": "Day", + "type": "integer", + "maximum": 31, + "minimum": 1, + "x-cols": 3, + "x-class": "pr-1" + }, + "time": { + "title": "Time", + "description": "Use the format '05:45:00 PM'", + "type": "string", + "pattern": "^0[1-9]|1[0-2]:[0-5][0-9]:[0-5][0-9] [AP]M$", + "x-cols": 3 + } + }, + "required": [ + "year" + ], + "type": "object" + }, + "compromise": { + "title": "Compromise", + "description": "How long from the first action to the first compromise of an attribute?", + "additionalProperties": false, + "properties": { + "unit": { + "title": "Unit", + "x-cols": 6, + "type": "string", + "enum": [ + "Seconds", + "Minutes", + "Hours", + "Days", + "Weeks", + "Months", + "Years", + "Never", + "NA", + "Unknown" + ], + "x-class": "pr-2" + }, + "value": { + "title": "Value", + "x-cols": 6, + "type": "number" + } + }, + "required": [ + "unit" + ], + "type": "object" + }, + "exfiltration": { + "title": "Exfiltration", + "description": "How long from initial compromise to first known data exfiltration?", + "additionalProperties": false, + "properties": { + "unit": { + "title": "Unit", + "x-cols": 6, + "type": "string", + "enum": [ + "Seconds", + "Minutes", + "Hours", + "Days", + "Weeks", + "Months", + "Years", + "Never", + "NA", + "Unknown" + ], + "x-class": "pr-2" + }, + "value": { + "title": "Value", + "x-cols": 6, + "type": "number" + } + }, + "required": [ + "unit" + ], + "type": "object" + }, + "discovery": { + "title": "Discovery", + "description": "How long from compromise until the incident was discovered by the victim organization?", + "additionalProperties": false, + "properties": { + "unit": { + "title": "Unit", + "x-cols": 6, + "type": "string", + "enum": [ + "Seconds", + "Minutes", + "Hours", + "Days", + "Weeks", + "Months", + "Years", + "Never", + "NA", + "Unknown" + ], + "x-class": "pr-2" + }, + "value": { + "title": "Value", + "x-cols": 6, + "type": "number" + } + }, + "required": [ + "unit" + ], + "type": "object" + }, + "containment": { + "title": "Containment", + "description": "How long did it take the organization to contain the incident once it was discovered?", + "additionalProperties": false, + "properties": { + "unit": { + "title": "Unit", + "x-cols": 6, + "type": "string", + "enum": [ + "Seconds", + "Minutes", + "Hours", + "Days", + "Weeks", + "Months", + "Years", + "Never", + "NA", + "Unknown" + ], + "x-class": "pr-2" + }, + "value": { + "title": "Value", + "x-cols": 6, + "type": "number" + } + }, + "required": [ + "unit" + ], + "type": "object" + } + }, + "required": [ + "incident" + ], + "type": "object" + }, + "victim": { + "title": "Victim", + "description": "[More Info](http://veriscommunity.net/victim-demo.html)", + "additionalProperties": false, + "properties": { + "employee_count": { + "title": "Employee Count", + "description": "Number of employees. Only use the count of the individual instance of a business (e.g. franchise location vs entire company) if the action vector was explicitly something unique to this individual instance. (i.e. This franchisee used a non-standard POS system that was then compromised.)", + "type": "string", + "enum": [ + "Small", + "1 to 10", + "11 to 100", + "101 to 1000", + "Large", + "1001 to 10000", + "10001 to 25000", + "25001 to 50000", + "50001 to 100000", + "Over 100000", + "Unknown" + ], + "x-cols": 4 + }, + "industry": { + "title": "Industry", + "description": "Victim NAICS Code. You can look it up [here](http://www.farsmarterbids.com/reference/naics-list.php) or [here](http://www.naics.com/search).", + "maxLength": 6, + "minLength": 2, + "pattern": "(00|11|2[1-3]|3[1-3]|4[24589]|5[1-6]|6[1-2]|7[12]|81|92)-?\\d{0,4}", + "type": "string", + "x-cols": 4 + }, + "government": { + "title": "Government", + "description": "The level of government if industry starts with 92. Otherwise 'NA'", + "items": { + "type": "string", + "default": "NA", + "enum": [ + "Federal", + "Regional", + "Local", + "Unknown", + "Other", + "NA" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 4 + }, + "locations_affected": { + "title": "Location affected", + "description": "The number of victim locations, (stores, offices, etc), affected", + "type": "integer", + "x-cols": 3 + }, + "country": { + "title": "Country", + "description": "Victim country of operation", + "items": { + "type": "string", + "default": "Unknown", + "enum": [ + "Unknown", + "AD", + "AE", + "AF", + "AG", + "AI", + "AL", + "AM", + "AO", + "AQ", + "AR", + "AS", + "AT", + "AU", + "AW", + "AX", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BL", + "BM", + "BN", + "BO", + "BQ", + "BR", + "BS", + "BT", + "BV", + "BW", + "BY", + "BZ", + "CA", + "CC", + "CD", + "CF", + "CG", + "CH", + "CI", + "CK", + "CL", + "CM", + "CN", + "CO", + "CR", + "CU", + "CV", + "CW", + "CX", + "CY", + "CZ", + "DE", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EC", + "EE", + "EG", + "EH", + "ER", + "ES", + "ET", + "FI", + "FJ", + "FK", + "FM", + "FO", + "FR", + "GA", + "GB", + "GD", + "GE", + "GF", + "GG", + "GH", + "GI", + "GL", + "GM", + "GN", + "GP", + "GQ", + "GR", + "GS", + "GT", + "GU", + "GW", + "GY", + "HK", + "HM", + "HN", + "HR", + "HT", + "HU", + "ID", + "IE", + "IL", + "IM", + "IN", + "IO", + "IQ", + "IR", + "IS", + "IT", + "JE", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KP", + "KR", + "KW", + "KY", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MF", + "MG", + "MH", + "MK", + "ML", + "MM", + "MN", + "MO", + "MP", + "MQ", + "MR", + "MS", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NC", + "NE", + "NF", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NU", + "NZ", + "OM", + "PA", + "PE", + "PF", + "PG", + "PH", + "PK", + "PL", + "PM", + "PN", + "PR", + "PS", + "PT", + "PW", + "PY", + "QA", + "RE", + "RO", + "RS", + "RU", + "RW", + "SA", + "SB", + "SC", + "SD", + "SE", + "SG", + "SH", + "SI", + "SJ", + "SK", + "SL", + "SM", + "SN", + "SO", + "SR", + "SS", + "ST", + "SV", + "SX", + "SY", + "SZ", + "TC", + "TD", + "TF", + "TG", + "TH", + "TJ", + "TK", + "TL", + "TM", + "TN", + "TO", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "UM", + "US", + "UY", + "UZ", + "VA", + "VC", + "VE", + "VG", + "VI", + "VN", + "VU", + "WF", + "WS", + "YE", + "YT", + "ZA", + "ZM", + "ZW", + "XK", + "Other" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 3 + }, + "region": { + "title": "Region", + "description": "The [UN M.49](https://en.wikipedia.org/wiki/UN_M.49) super-region and sub-region joined together. e.g. North America: 019021. South America (Brazil): 019005, Asia: 142000, East Asia (includes China): 142030, West Asia (Middle East): 142145, South Asia (India): 142034, Eastern Europe: 150151, Western Europe: 150155. Use 000000 if you do not know and 000001 for 'other' (includes international waters and outer space). If you only know the super-region, use zero's for the region. (e.g. 019000 for Americas.)", + "items": { + "type": "string", + "maxLength": 6, + "minLength": 6, + "pattern": "\\d{6}" + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 3 + }, + "state": { + "title": "State", + "description": "ALL CAPS. For US states, you can use the [ISO_3166-2 2-character state code](https://en.wikipedia.org/wiki/ISO_3166-2:US), otherwise use the full [ISO_3166-2 Country subdivision code](https://en.wikipedia.org/wiki/ISO_3166-2)", + "type": "string", + "x-cols": 3 + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + } + }, + "required": [ + "country", + "employee_count", + "industry", + "government" + ], + "type": "object" + }, + "action": { + "title": "Action", + "description": "What threat actions were involved? [More Info](http://veriscommunity.net/actions.html)", + "oneOf": [ + { + "title": "Hacking", + "description": "Think things a person does at a keyboard (rather than by a program). [More Info](http://veriscommunity.net/actions.html#section-hacking)", + "additionalProperties": false, + "properties": { + "schemaKey": { + "type": "string", + "const": "subSchema1" + }, + "variety": { + "title": "Variety", + "items": { + "type": "string", + "enum": [ + "Abuse of functionality", + "Brute force", + "Buffer overflow", + "Cache poisoning", + "Cryptanalysis", + "CSRF", + "DoS", + "Exploit misconfig", + "Exploit vuln", + "Footprinting", + "Forced browsing", + "Format string attack", + "Fuzz testing", + "HTTP request smuggling", + "HTTP request splitting", + "HTTP response smuggling", + "HTTP Response Splitting", + "Insecure deserialization", + "Integer overflows", + "LDAP injection", + "Mail command injection", + "MitM", + "Null byte injection", + "Offline cracking", + "OS commanding", + "Pass-the-hash", + "Path traversal", + "Reverse engineering", + "RFI", + "Routing detour", + "Session fixation", + "Session prediction", + "Session replay", + "Soap array abuse", + "Special element injection", + "SQLi", + "SSI injection", + "URL redirector abuse", + "Use of backdoor or C2", + "Use of stolen creds", + "User breakout", + "Virtual machine escape", + "XML attribute blowup", + "XML entity expansion", + "XML external entities", + "XML injection", + "XPath injection", + "XQuery injection", + "XSS", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 6 + }, + "vector": { + "title": "Vector", + "items": { + "type": "string", + "enum": [ + "3rd party desktop", + "Backdoor or C2", + "Command shell", + "Desktop sharing", + "Desktop sharing software", + "Hypervisor", + "Inter-tenant", + "Other", + "Partner", + "Physical access", + "VPN", + "Web application", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 6 + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + }, + "result": { + "title": "Result", + "description": "The result of the action. If there's a difference between action result and actor intent, use the result not intent.", + "items": { + "type": "string", + "enum": [ + "Infiltrate", + "Exfiltrate", + "Elevate", + "Lateral movement", + "Deploy payload", + "Other", + "Unknown", + "NA" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "cve": { + "title": "CVE", + "description": "CVE(s) exploited through hacking", + "type": "string" + } + }, + "required": [ + "vector", + "variety" + ], + "type": "object" + }, + { + "title": "Malware", + "description": "Think things a program does (rather than a person on a keyboard) [More Info](http://veriscommunity.net/actions.html#section-malware)", + "additionalProperties": false, + "properties": { + "schemaKey": { + "type": "string", + "const": "subSchema2" + }, + "variety": { + "title": "Variety", + "items": { + "type": "string", + "enum": [ + "Adminware", + "Adware", + "Backdoor", + "Brute force", + "C2", + "Capture app data", + "Capture stored data", + "Click fraud", + "Click fraud and cryptocurrency mining", + "Client-side attack", + "Cryptocurrency mining", + "Destroy data", + "In-memory", + "Modify data", + "Disable controls", + "DoS", + "Downloader", + "Exploit misconfig", + "Exploit vuln", + "Export data", + "Packet sniffer", + "Password dumper", + "RAM scraper", + "Ransomware", + "RAT", + "Rootkit", + "Scan network", + "Spam", + "Spyware/Keylogger", + "SQL injection", + "Trojan", + "Worm", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 6 + }, + "vector": { + "title": "Vector", + "items": { + "type": "string", + "enum": [ + "Direct install", + "Download by malware", + "Email", + "Email attachment", + "Email autoexecute", + "Email link", + "Email unknown", + "Email other", + "Instant messaging", + "Network propagation", + "Remote injection", + "Removable media", + "Software update", + "Web application", + "Web application - download", + "Web application - drive-by", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 6 + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + }, + "result": { + "title": "Result", + "description": "The result of the action. If there's a difference between action result and actor intent, use the result not intent.", + "items": { + "type": "string", + "enum": [ + "Infiltrate", + "Exfiltrate", + "Elevate", + "Lateral movement", + "Deploy payload", + "Other", + "Unknown", + "NA" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "name": { + "title": "Name", + "description": "Common name(s) or strain(s) of malware", + "type": "string", + "x-cols": 6 + }, + "cve": { + "title": "CVE", + "description": "CVE(s) exploited by this malware", + "type": "string", + "x-cols": 6 + } + }, + "required": [ + "vector", + "variety" + ], + "type": "object" + }, + { + "title": "Social", + "description": "Actions done to a person. [More Info](http://veriscommunity.net/actions.html#section-social)", + "additionalProperties": false, + "properties": { + "schemaKey": { + "type": "string", + "const": "subSchema3" + }, + "variety": { + "title": "Variety", + "description": "Varities of social tactics", + "items": { + "type": "string", + "enum": [ + "Baiting", + "Bribery", + "Elicitation", + "Extortion", + "Forgery", + "Influence", + "Phishing", + "Pretexting", + "Propaganda", + "Scam", + "Spam", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 4 + }, + "vector": { + "title": "Vector", + "description": "Vectors of communication", + "items": { + "type": "string", + "enum": [ + "Documents", + "Email", + "IM", + "In-person", + "Phone", + "Removable media", + "SMS", + "Social media", + "Software", + "Website", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 4 + }, + "target": { + "title": "Target", + "description": "Target of social tactics", + "items": { + "type": "string", + "enum": [ + "Auditor", + "Call center", + "Cashier", + "Customer", + "Developer", + "End-user", + "End-user or employee", + "Executive", + "Finance", + "Former employee", + "Guard", + "Helpdesk", + "Human resources", + "Maintenance", + "Manager", + "Other employee", + "Partner", + "System admin", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 4 + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + }, + "result": { + "title": "Result", + "description": "The result of the action. If there's a difference between action result and actor intent, use the result not intent.", + "items": { + "type": "string", + "enum": [ + "Infiltrate", + "Exfiltrate", + "Elevate", + "Lateral movement", + "Deploy payload", + "Other", + "Unknown", + "NA" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + } + }, + "required": [ + "vector", + "variety", + "target" + ], + "type": "object" + }, + { + "title": "Error", + "description": "Unintentional actions. [More Info](http://veriscommunity.net/actions.html#section-error)", + "additionalProperties": false, + "properties": { + "schemaKey": { + "type": "string", + "const": "subSchema4" + }, + "variety": { + "title": "Variety", + "items": { + "type": "string", + "enum": [ + "Capacity shortage", + "Classification error", + "Data entry error", + "Disposal error", + "Gaffe", + "Loss", + "Maintenance error", + "Malfunction", + "Misconfiguration", + "Misdelivery", + "Misinformation", + "Omission", + "Physical accidents", + "Programming error", + "Publishing error", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 6 + }, + "vector": { + "title": "Vector", + "description": "Reasons errors occurred", + "items": { + "type": "string", + "enum": [ + "Carelessness", + "Inadequate personnel", + "Inadequate processes", + "Inadequate technology", + "Other", + "Random error", + "Web application", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 6 + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + } + }, + "required": [ + "variety", + "vector" + ], + "type": "object" + }, + { + "title": "Misuse", + "description": "Unapproved use of legitimate access or permissions. [More Info](http://veriscommunity.net/actions.html#section-misuse)", + "additionalProperties": false, + "properties": { + "schemaKey": { + "type": "string", + "const": "subSchema5" + }, + "variety": { + "title": "Variety", + "items": { + "type": "string", + "enum": [ + "Data mishandling", + "Email misuse", + "Illicit content", + "Knowledge abuse", + "Net misuse", + "Possession abuse", + "Privilege abuse", + "Snap picture", + "Unapproved hardware", + "Unapproved software", + "Unapproved workaround", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 6 + }, + "vector": { + "title": "Vector", + "description": "Vectors or access methods", + "items": { + "type": "string", + "enum": [ + "LAN access", + "Non-corporate", + "Physical access", + "Remote access", + "Web application", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 6 + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + }, + "result": { + "title": "Result", + "description": "The result of the action. If there's a difference between action result and actor intent, use the result not intent.", + "items": { + "type": "string", + "enum": [ + "Infiltrate", + "Exfiltrate", + "Elevate", + "Lateral movement", + "Deploy payload", + "Other", + "Unknown", + "NA" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + } + }, + "required": [ + "vector", + "variety" + ], + "type": "object" + }, + { + "title": "Physical", + "description": "Actions involving proximity and physical contact. [More Info](http://veriscommunity.net/actions.html#section-physical)", + "additionalProperties": false, + "properties": { + "schemaKey": { + "type": "string", + "const": "subSchema6" + }, + "variety": { + "title": "Variety", + "items": { + "type": "string", + "enum": [ + "Assault", + "Bypassed controls", + "Connection", + "Destruction", + "Disabled controls", + "Skimmer", + "Snooping", + "Surveillance", + "Tampering", + "Theft", + "Wiretapping", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 6 + }, + "vector": { + "title": "Vector", + "description": "Vector of physical access", + "items": { + "type": "string", + "enum": [ + "Partner facility", + "Partner vehicle", + "Personal residence", + "Personal vehicle", + "Public facility", + "Public vehicle", + "Victim grounds", + "Victim public area", + "Victim secure area", + "Victim work area", + "Unknown", + "Other" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 6 + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + }, + "result": { + "title": "Result", + "description": "The result of the action. If there's a difference between action result and actor intent, use the result not intent.", + "items": { + "type": "string", + "enum": [ + "Infiltrate", + "Exfiltrate", + "Elevate", + "Lateral movement", + "Deploy payload", + "Other", + "Unknown", + "NA" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + } + }, + "required": [ + "vector", + "variety" + ], + "type": "object" + }, + { + "title": "Environmental", + "description": "Forces of nature. Cannot include intentional actions. [More Info](http://veriscommunity.net/actions.html#section-environmental)", + "additionalProperties": false, + "properties": { + "schemaKey": { + "type": "string", + "const": "subSchema7" + }, + "variety": { + "title": "Variety", + "description": "Varieties of environmental events", + "items": { + "type": "string", + "enum": [ + "Deterioration", + "Earthquake", + "EMI", + "ESD", + "Fire", + "Flood", + "Hazmat", + "Humidity", + "Hurricane", + "Ice", + "Landslide", + "Leak", + "Lightning", + "Meteorite", + "Particulates", + "Pathogen", + "Power failure", + "Temperature", + "Tornado", + "Tsunami", + "Vermin", + "Volcano", + "Wind", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + } + }, + "required": [ + "variety" + ], + "type": "object" + }, + { + "title": "Unknown", + "description": "The action taken was unknown", + "properties": { + "schemaKey": { + "type": "string", + "const": "subSchema8" + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + }, + "result": { + "title": "Result", + "description": "The result of the action. If there's a difference between action result and actor intent, use the result not intent.", + "items": { + "type": "string", + "enum": [ + "Infiltrate", + "Exfiltrate", + "Elevate", + "Lateral movement", + "Deploy payload", + "Other", + "Unknown", + "NA" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + } + }, + "type": "object" + } + ], + "type": "object" + }, + "actor": { + "title": "Actor", + "description": "What entity did the threat action? [More Info](http://veriscommunity.net/actors.html)", + "oneOf": [ + { + "title": "External", + "description": "Unaffiliated with the victim. [More Info](http://veriscommunity.net/actors.html#section-external)", + "additionalProperties": false, + "properties": { + "schemaKey": { + "type": "string", + "const": "subSchema1" + }, + "variety": { + "title": "Variety", + "items": { + "type": "string", + "enum": [ + "Acquaintance", + "Activist", + "Auditor", + "Competitor", + "Customer", + "Force majeure", + "Former employee", + "Nation-state", + "Organized crime", + "State-affiliated", + "Terrorist", + "Unaffiliated", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 6 + }, + "motive": { + "title": "Motive", + "items": { + "type": "string", + "enum": [ + "Convenience", + "Espionage", + "Fear", + "Financial", + "Fun", + "Grudge", + "Ideology", + "NA", + "Secondary", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 6 + }, + "notes": { + "title": "Notes", + "description": "Misc external actor notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + }, + "country": { + "title": "Country", + "items": { + "type": "string", + "enum": [ + "Unknown", + "AD", + "AE", + "AF", + "AG", + "AI", + "AL", + "AM", + "AO", + "AQ", + "AR", + "AS", + "AT", + "AU", + "AW", + "AX", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BL", + "BM", + "BN", + "BO", + "BQ", + "BR", + "BS", + "BT", + "BV", + "BW", + "BY", + "BZ", + "CA", + "CC", + "CD", + "CF", + "CG", + "CH", + "CI", + "CK", + "CL", + "CM", + "CN", + "CO", + "CR", + "CU", + "CV", + "CW", + "CX", + "CY", + "CZ", + "DE", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EC", + "EE", + "EG", + "EH", + "ER", + "ES", + "ET", + "FI", + "FJ", + "FK", + "FM", + "FO", + "FR", + "GA", + "GB", + "GD", + "GE", + "GF", + "GG", + "GH", + "GI", + "GL", + "GM", + "GN", + "GP", + "GQ", + "GR", + "GS", + "GT", + "GU", + "GW", + "GY", + "HK", + "HM", + "HN", + "HR", + "HT", + "HU", + "ID", + "IE", + "IL", + "IM", + "IN", + "IO", + "IQ", + "IR", + "IS", + "IT", + "JE", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KP", + "KR", + "KW", + "KY", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MF", + "MG", + "MH", + "MK", + "ML", + "MM", + "MN", + "MO", + "MP", + "MQ", + "MR", + "MS", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NC", + "NE", + "NF", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NU", + "NZ", + "OM", + "PA", + "PE", + "PF", + "PG", + "PH", + "PK", + "PL", + "PM", + "PN", + "PR", + "PS", + "PT", + "PW", + "PY", + "QA", + "RE", + "RO", + "RS", + "RU", + "RW", + "SA", + "SB", + "SC", + "SD", + "SE", + "SG", + "SH", + "SI", + "SJ", + "SK", + "SL", + "SM", + "SN", + "SO", + "SR", + "SS", + "ST", + "SV", + "SX", + "SY", + "SZ", + "TC", + "TD", + "TF", + "TG", + "TH", + "TJ", + "TK", + "TL", + "TM", + "TN", + "TO", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "UM", + "US", + "UY", + "UZ", + "VA", + "VC", + "VE", + "VG", + "VI", + "VN", + "VU", + "WF", + "WS", + "YE", + "YT", + "ZA", + "ZM", + "ZW", + "XK", + "Other" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "region": { + "title": "Region", + "description": "The [UN M.49](https://en.wikipedia.org/wiki/UN_M.49) super-region and sub-region joined together. e.g. North America: 019021. South America (Brazil): 019005, Asia: 142000, East Asia (includes China): 142030, West Asia (Middle East): 142145, South Asia (India): 142034, Eastern Europe: 150151, Western Europe: 150155. Use 000000 if you do not know and 000001 for 'other' (includes international waters and outer space). If you only know the super-region, use zero's for the region. (e.g. 019000 for Americas.)", + "items": { + "type": "string", + "maxLength": 6, + "minLength": 6, + "pattern": "\\d{6}" + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "name": { + "title": "Name", + "description": "Actor name (if known). e.g. 'lizard squad'", + "items": { + "type": "string" + }, + "type": "array", + "uniqueItems": true + } + }, + "required": [ + "variety", + "motive" + ], + "type": "object" + }, + { + "title": "Interal", + "description": "The victim or a part thereof (such as an employee). [More Info](http://veriscommunity.net/actors.html#section-internal)", + "additionalProperties": false, + "properties": { + "schemaKey": { + "type": "string", + "const": "subSchema2" + }, + "variety": { + "title": "Variety", + "items": { + "type": "string", + "enum": [ + "Auditor", + "Call center", + "Cashier", + "Developer", + "End-user", + "Executive", + "Finance", + "Guard", + "Helpdesk", + "Human resources", + "Maintenance", + "Manager", + "System admin", + "Doctor or nurse", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 4 + }, + "motive": { + "title": "Motive", + "items": { + "type": "string", + "enum": [ + "Convenience", + "Espionage", + "Fear", + "Financial", + "Fun", + "Grudge", + "Ideology", + "Secondary", + "NA", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 4 + }, + "job_change": { + "title": "Job Change", + "description": "Recent job change PRIOR to incident? (i.e., not asking if 'let go' afterwards)", + "items": { + "type": "string", + "enum": [ + "Demoted", + "Hired", + "Job eval", + "Lateral move", + "Let go", + "Passed over", + "Personal issues", + "Promoted", + "Reprimanded", + "Resigned", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 4 + }, + "notes": { + "title": "Notes", + "description": "Misc internal actor notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + } + }, + "required": [ + "motive", + "variety" + ], + "type": "object" + }, + { + "title": "Partner", + "description": "An entity with an organizational relationship to the victim, but not the victim. [More Info](http://veriscommunity.net/actors.html#section-partner)", + "additionalProperties": false, + "properties": { + "schemaKey": { + "type": "string", + "const": "subSchema3" + }, + "motive": { + "title": "Motive", + "items": { + "type": "string", + "enum": [ + "Convenience", + "Espionage", + "Fear", + "Financial", + "Fun", + "Grudge", + "Ideology", + "Secondary", + "NA", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "notes": { + "title": "Notes", + "description": "Misc partner actor notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + }, + "industry": { + "title": "Industry", + "maxLength": 6, + "minLength": 2, + "pattern": "\\d{2}-?\\d{0,4}", + "type": "string", + "x-cols": 4 + }, + "country": { + "title": "Country", + "items": { + "type": "string", + "enum": [ + "Unknown", + "AD", + "AE", + "AF", + "AG", + "AI", + "AL", + "AM", + "AO", + "AQ", + "AR", + "AS", + "AT", + "AU", + "AW", + "AX", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BL", + "BM", + "BN", + "BO", + "BQ", + "BR", + "BS", + "BT", + "BV", + "BW", + "BY", + "BZ", + "CA", + "CC", + "CD", + "CF", + "CG", + "CH", + "CI", + "CK", + "CL", + "CM", + "CN", + "CO", + "CR", + "CU", + "CV", + "CW", + "CX", + "CY", + "CZ", + "DE", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EC", + "EE", + "EG", + "EH", + "ER", + "ES", + "ET", + "FI", + "FJ", + "FK", + "FM", + "FO", + "FR", + "GA", + "GB", + "GD", + "GE", + "GF", + "GG", + "GH", + "GI", + "GL", + "GM", + "GN", + "GP", + "GQ", + "GR", + "GS", + "GT", + "GU", + "GW", + "GY", + "HK", + "HM", + "HN", + "HR", + "HT", + "HU", + "ID", + "IE", + "IL", + "IM", + "IN", + "IO", + "IQ", + "IR", + "IS", + "IT", + "JE", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KP", + "KR", + "KW", + "KY", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MF", + "MG", + "MH", + "MK", + "ML", + "MM", + "MN", + "MO", + "MP", + "MQ", + "MR", + "MS", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NC", + "NE", + "NF", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NU", + "NZ", + "OM", + "PA", + "PE", + "PF", + "PG", + "PH", + "PK", + "PL", + "PM", + "PN", + "PR", + "PS", + "PT", + "PW", + "PY", + "QA", + "RE", + "RO", + "RS", + "RU", + "RW", + "SA", + "SB", + "SC", + "SD", + "SE", + "SG", + "SH", + "SI", + "SJ", + "SK", + "SL", + "SM", + "SN", + "SO", + "SR", + "SS", + "ST", + "SV", + "SX", + "SY", + "SZ", + "TC", + "TD", + "TF", + "TG", + "TH", + "TJ", + "TK", + "TL", + "TM", + "TN", + "TO", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "UM", + "US", + "UY", + "UZ", + "VA", + "VC", + "VE", + "VG", + "VI", + "VN", + "VU", + "WF", + "WS", + "YE", + "YT", + "ZA", + "ZM", + "ZW", + "XK", + "Other" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 4 + }, + "region": { + "title": "Region", + "description": "The [UN M.49](https://en.wikipedia.org/wiki/UN_M.49) super-region and sub-region joined together. e.g. North America: 019021. South America (Brazil): 019005, Asia: 142000, East Asia (includes China): 142030, West Asia (Middle East): 142145, South Asia (India): 142034, Eastern Europe: 150151, Western Europe: 150155. Use 000000 if you do not know and 000001 for 'other' (includes international waters and outer space). If you only know the super-region, use zero's for the region. (e.g. 019000 for Americas.)", + "items": { + "type": "string", + "maxLength": 6, + "minLength": 6, + "pattern": "\\d{6}" + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 4 + }, + "name": { + "title": "Name", + "items": { + "type": "string" + }, + "type": "array", + "uniqueItems": true + } + }, + "required": [ + "country", + "motive" + ], + "type": "object" + }, + { + "title": "Unknown", + "description": "If the actor is unknown, you *must* add a note of some type, otherwise the incident will not validate.", + "properties": { + "schemaKey": { + "type": "string", + "const": "subSchema4" + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + } + }, + "type": "object" + } + ], + "type": "object" + }, + "asset": { + "title": "Assets", + "description": "What assets were affected by the incident actions. Data types and record count will be covered in the attributes section. [More Info](http://veriscommunity.net/assets.html)", + "additionalProperties": false, + "minProperties": 1, + "properties": { + "total_amount": { + "title": "Total Amount", + "type": "number" + }, + "assets": { + "title": "Assets", + "items": { + "additionalProperties": false, + "properties": { + "variety": { + "title": "Variety", + "description": "What varieties of assets were compromised?", + "type": "string", + "enum": [ + "M - Disk drive", + "M - Disk media", + "M - Documents", + "M - Flash drive", + "M - Payment card", + "M - Smart card", + "M - Tapes", + "M - Other", + "M - Unknown", + "M - Fax", + "N - Access reader", + "N - Broadband", + "N - Camera", + "N - Firewall", + "N - HSM", + "N - IDS", + "N - LAN", + "N - NAS", + "N - PBX", + "N - PLC", + "N - Private WAN", + "N - Public WAN", + "N - Router or switch", + "N - RTU", + "N - SAN", + "N - Telephone", + "N - VoIP adapter", + "N - WLAN", + "N - Other", + "N - Unknown", + "P - Auditor", + "P - Call center", + "P - Cashier", + "P - Customer", + "P - Developer", + "P - End-user", + "P - End-user or employee", + "P - Executive", + "P - Finance", + "P - Former employee", + "P - Guard", + "P - Helpdesk", + "P - Human resources", + "P - Maintenance", + "P - Manager", + "P - Other employee", + "P - Partner", + "P - System admin", + "P - Other", + "P - Unknown", + "S - Authentication", + "S - Backup", + "S - Configuration or patch management", + "S - Code repository", + "S - Database", + "S - DCS", + "S - DHCP", + "S - Directory", + "S - DNS", + "S - File", + "S - ICS", + "S - Log", + "S - Mail", + "S - Mainframe", + "S - Payment switch", + "S - POS controller", + "S - Print", + "S - Proxy", + "S - Remote access", + "S - VM host", + "S - Web application", + "S - Other", + "S - Unknown", + "T - ATM", + "T - Gas terminal", + "T - Kiosk", + "T - PED pad", + "T - Other", + "T - Unknown", + "U - Auth token", + "U - Desktop", + "U - Desktop or laptop", + "U - Laptop", + "U - Media", + "U - Mobile phone", + "U - Peripheral", + "U - POS terminal", + "U - Tablet", + "U - Telephone", + "U - VoIP phone", + "U - Other", + "U - Unknown", + "E - Telemetry", + "E - Telematics", + "E - Other", + "E - Unknown", + "Unknown", + "Other" + ] + }, + "amount": { + "title": "Amount", + "description": "How many total systems were compromised?", + "type": "integer" + } + }, + "required": [ + "variety" + ], + "type": "object" + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "ownership": { + "title": "Ownership", + "description": "Who owns the affected asset? This can allow us to identify employee-owned (BYOD) assets.", + "items": { + "type": "string", + "enum": [ + "Customer", + "Employee", + "NA", + "Partner", + "Unknown", + "Victim", + "Other" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 6 + }, + "cloud": { + "title": "On-Premise or Cloud", + "description": "Only answer if you know for sure if the asset was hosted in a cloud service.", + "items": { + "type": "string", + "enum": [ + "On-Premise Asset(s)", + "External Cloud Asset(s)", + "Other", + "Unknown", + "NA" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 6 + }, + "hosting": { + "title": "Hosting Location", + "description": "Where is the affected asset hosted/located?", + "items": { + "type": "string", + "enum": [ + "External - unknown environment", + "External - dedicated environment", + "External - shared environment", + "Internal", + "NA", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 4 + }, + "management": { + "title": "Management", + "description": "Independent of physical location, who administers and maintains the affected asset?", + "items": { + "type": "string", + "enum": [ + "External", + "Internal", + "Co-managed", + "NA", + "Unknown", + "Other" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 4 + }, + "role": { + "title": "IT or OT", + "description": "Is the asset Information Technology (IT) such as email or the domain controller or Operational Technology (OT) such as rail-switching computers for a railroad or manufacturing robots for a manufacturing company.", + "items": { + "type": "string", + "enum": [ + "IT", + "OT", + "Unknown", + "Other", + "NA" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 4 + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + }, + "country": { + "title": "Country", + "description": "The country hosting the asset.", + "items": { + "type": "string", + "enum": [ + "Unknown", + "AD", + "AE", + "AF", + "AG", + "AI", + "AL", + "AM", + "AO", + "AQ", + "AR", + "AS", + "AT", + "AU", + "AW", + "AX", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BL", + "BM", + "BN", + "BO", + "BQ", + "BR", + "BS", + "BT", + "BV", + "BW", + "BY", + "BZ", + "CA", + "CC", + "CD", + "CF", + "CG", + "CH", + "CI", + "CK", + "CL", + "CM", + "CN", + "CO", + "CR", + "CU", + "CV", + "CW", + "CX", + "CY", + "CZ", + "DE", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EC", + "EE", + "EG", + "EH", + "ER", + "ES", + "ET", + "FI", + "FJ", + "FK", + "FM", + "FO", + "FR", + "GA", + "GB", + "GD", + "GE", + "GF", + "GG", + "GH", + "GI", + "GL", + "GM", + "GN", + "GP", + "GQ", + "GR", + "GS", + "GT", + "GU", + "GW", + "GY", + "HK", + "HM", + "HN", + "HR", + "HT", + "HU", + "ID", + "IE", + "IL", + "IM", + "IN", + "IO", + "IQ", + "IR", + "IS", + "IT", + "JE", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KP", + "KR", + "KW", + "KY", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MF", + "MG", + "MH", + "MK", + "ML", + "MM", + "MN", + "MO", + "MP", + "MQ", + "MR", + "MS", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NC", + "NE", + "NF", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NU", + "NZ", + "OM", + "PA", + "PE", + "PF", + "PG", + "PH", + "PK", + "PL", + "PM", + "PN", + "PR", + "PS", + "PT", + "PW", + "PY", + "QA", + "RE", + "RO", + "RS", + "RU", + "RW", + "SA", + "SB", + "SC", + "SD", + "SE", + "SG", + "SH", + "SI", + "SJ", + "SK", + "SL", + "SM", + "SN", + "SO", + "SR", + "SS", + "ST", + "SV", + "SX", + "SY", + "SZ", + "TC", + "TD", + "TF", + "TG", + "TH", + "TJ", + "TK", + "TL", + "TM", + "TN", + "TO", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "UM", + "US", + "UY", + "UZ", + "VA", + "VC", + "VE", + "VG", + "VI", + "VN", + "VU", + "WF", + "WS", + "YE", + "YT", + "ZA", + "ZM", + "ZW", + "XK", + "Other" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + } + }, + "type": "object", + "required": [ + "assets", + "cloud" + ] + }, + "attribute": { + "title": "Attribute", + "description": "What attributes were compromised? [More Info](http://veriscommunity.net/attributes.html)", + "additionalProperties": false, + "minProperties": 1, + "properties": { + "confidentiality": { + "title": "Confidentiality", + "description": "Was data (potentially) disclosed to an unauthorized party? [More Info](http://veriscommunity.net/attributes.html#section-confidentiality)", + "additionalProperties": false, + "properties": { + "data_disclosure": { + "title": "Data Disclosure", + "description": "Was data disclosed? This is the core determiner if this incident is a breach. If this is 'Yes', it will be considered a breach. If it is anything else, it will only be an incident.", + "type": "string", + "enum": [ + "No", + "Potentially", + "Yes", + "Unknown" + ], + "x-cols": 6 + }, + "data_total": { + "title": "Data Total", + "description": "Total records breached", + "type": "integer", + "x-cols": 6 + }, + "data": { + "title": "Compromised Data", + "description": "Varieties (and amount) of data compromised. Click the red \u2018Add\u2019 button to record multiple data varieties.", + "items": { + "additionalProperties": false, + "properties": { + "amount": { + "title": "Amount", + "type": "integer" + }, + "variety": { + "title": "Variety", + "type": "string", + "enum": [ + "Bank", + "Classified", + "Copyrighted", + "Credentials", + "Digital certificate", + "Internal", + "Medical", + "Payment", + "Personal", + "Secrets", + "Source code", + "System", + "Virtual currency", + "Other", + "Unknown" + ] + } + }, + "required": [ + "variety" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "data_victim": { + "title": "Data Victim", + "items": { + "type": "string", + "enum": [ + "Customer", + "Employee", + "Partner", + "Patient", + "Student", + "Victim organization", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 6 + }, + "state": { + "title": "State", + "items": { + "type": "string", + "enum": [ + "Processed", + "Stored", + "Stored encrypted", + "Stored unencrypted", + "Transmitted", + "Transmitted encrypted", + "Transmitted unencrypted", + "Other", + "Unknown", + "Printed" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 6 + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + } + }, + "required": [ + "data_disclosure" + ], + "type": "object" + }, + "integrity": { + "title": "Integrity", + "description": "Was a person manipulated or the state of a system changed? [More Info](http://veriscommunity.net/attributes.html#section-integrity)", + "additionalProperties": false, + "properties": { + "variety": { + "title": "Variety", + "items": { + "type": "string", + "enum": [ + "Alter behavior", + "Created account", + "Defacement", + "Fraudulent transaction", + "Hardware tampering", + "Log tampering", + "Misrepresentation", + "Modify configuration", + "Modify data", + "Modify privileges", + "Repurpose", + "Software installation", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + } + }, + "required": [ + "variety" + ], + "type": "object" + }, + "availability": { + "title": "Availability", + "description": "Was something rendered partially or wholly unavailable? [More Info](http://veriscommunity.net/attributes.html#section-availability)", + "properties": { + "variety": { + "title": "Variety", + "items": { + "type": "string", + "enum": [ + "Acceleration", + "Degradation", + "Destruction", + "Interruption", + "Loss", + "Obscuration", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + "x-cols": 6, + "x-class": "pr-2" + }, + "duration": { + "description": "Specific value of the specific selected unit, (i.e., # of 'days').", + "additionalProperties": false, + "properties": { + "unit": { + "title": "Unit", + "x-cols": 6, + "type": "string", + "enum": [ + "Seconds", + "Minutes", + "Hours", + "Days", + "Weeks", + "Months", + "Years", + "Never", + "NA", + "Unknown" + ], + "x-class": "pr-2" + }, + "value": { + "title": "Value", + "x-cols": 6, + "type": "number" + } + }, + "required": [ + "unit" + ], + "type": "object", + "x-cols": 6 + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + } + }, + "required": [ + "variety" + ], + "type": "object" + }, + "unknown": { + "title": "Unknown", + "properties": { + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + }, + "result": { + "title": "Result", + "description": "The result of the action. If there's a difference between action result and actor intent, use the result not intent.", + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + } + }, + "type": "object" + } + }, + "type": "object" + }, + "targeted": { + "title": "Targeted vs Opportunistic", + "description": "Was this a targeted or opportunistic attack? [More Info](http://veriscommunity.net/discovery.html#section-target-opportunistic)
N/A: Not an attack (e.g., unintentional actions)
Opportunistic: Victim was NOT pre-selected as a target; they were identified/attacked because they exhibited a weakness the attacker knew how to exploit.
Targeted: The victim is pre-selected as a target; the attacker(s) then determined what weaknesses exist within the target that could be exploited.", + "type": "string", + "enum": [ + "Opportunistic", + "Targeted", + "NA", + "Unknown" + ] + }, + "discovery_method": { + "title": "Discovery Method", + "description": "What discovery method was involved? [More Info](http://veriscommunity.net/discovery.html#section-discovery-method)", + "minProperties": 1, + "additionalProperties": false, + "oneOf": [ + { + "title": "External", + "description": "Discovered by an external entity.", + "additionalProperties": false, + "properties": { + "schemaKey": { + "type": "string", + "const": "subSchema1" + }, + "variety": { + "title": "Variety", + "items": { + "type": "string", + "enum": [ + "Actor disclosure", + "Audit", + "Customer", + "Emergency response team", + "Found documents", + "Fraud detection", + "Incident response", + "Law enforcement", + "Other", + "Security researcher", + "Suspicious traffic", + "Unknown", + "Unrelated 3rd party" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + } + }, + "required": [ + "variety" + ], + "type": "object" + }, + { + "title": "Internal", + "description": "Discovered by an external partner.", + "additionalProperties": false, + "properties": { + "schemaKey": { + "type": "string", + "const": "subSchema2" + }, + "variety": { + "title": "Variety", + "items": { + "type": "string", + "enum": [ + "Antivirus", + "Break in discovered", + "Data loss prevention", + "Financial audit", + "Fraud detection", + "Hids", + "Incident response", + "Infrastructure monitoring", + "It review", + "Log review", + "Nids", + "Other", + "Reported by employee", + "Security alarm", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + } + }, + "required": [ + "variety" + ], + "type": "object" + }, + { + "title": "Partner", + "description": "Discovered by a partner of the victim.", + "additionalProperties": false, + "properties": { + "schemaKey": { + "type": "string", + "const": "subSchema3" + }, + "variety": { + "title": "Variety", + "items": { + "type": "string", + "enum": [ + "Antivirus", + "Audit", + "Incident response", + "Monitoring service", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + } + }, + "required": [ + "variety" + ], + "type": "object" + }, + { + "title": "Other", + "type": "boolean", + "properties": { + "schemaKey": { + "type": "string", + "const": "subSchema4" + } + }, + "x-cols": 6 + }, + { + "title": "Unknown", + "type": "boolean", + "properties": { + "schemaKey": { + "type": "string", + "const": "subSchema5" + } + }, + "x-cols": 6 + } + ], + "type": "object" + }, + "discovery_notes": { + "title": "Discovery Notes", + "description": "How was the incident discovered? [More Info](http://veriscommunity.net/discovery.html#section-discovery-method)", + "minLength": 1, + "type": "string" + }, + "value_chain": { + "title": "Value Chain", + "description": "Capabilities and investments an attacker must aquire prior to the actions on target. May be internal to the actors organization (vertically integrated org), or external (purchased in a criminal market).", + "minProperties": 1, + "additionalProperties": false, + "properties": { + "development": { + "title": "Development", + "description": "Software that must be developed to accomplish the actions on target.", + "additionalProperties": false, + "properties": { + "variety": { + "title": "Variety", + "description": "Varieties of development investments", + "items": { + "type": "string", + "enum": [ + "Bot", + "Exploit", + "Exploit Kits", + "Payload", + "Persona", + "Ransomware", + "Trojan", + "Website", + "NA", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + } + }, + "required": [ + "variety" + ], + "type": "object" + }, + "non-distribution services": { + "title": "Non-Distribution Services", + "description": "Services provided and used by malicious actors other than those used for distribution of actor content", + "additionalProperties": false, + "properties": { + "variety": { + "title": "Variety", + "description": "Varieties of non-distribution service investments", + "items": { + "type": "string", + "enum": [ + "C2", + "Counter AV", + "DNS", + "Escrow", + "Hashcracking", + "Marketplace", + "Proxy", + "VPN", + "NA", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + } + }, + "required": [ + "variety" + ], + "type": "object" + }, + "targeting": { + "title": "Targeting", + "description": "Things that identify exploitable opportunities. These overlap heavily with data varieties that are compromised.", + "additionalProperties": false, + "properties": { + "variety": { + "title": "Variety", + "description": "Varieties of targeting investments", + "items": { + "type": "string", + "enum": [ + "Default credentials", + "Email addresses", + "Lost or stolen credentials", + "Misconfigurations", + "Partner", + "Personal Information", + "Organizational Information", + "Vulnerabilities", + "Weaknesses", + "NA", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + } + }, + "required": [ + "variety" + ], + "type": "object" + }, + "distribution": { + "title": "Distribution", + "description": "Services used to distribute actor content.", + "additionalProperties": false, + "properties": { + "variety": { + "title": "Variety", + "description": "Varieties of distribution investments", + "items": { + "type": "string", + "enum": [ + "Botnet", + "Compromised server", + "Direct", + "Email", + "Loader", + "Partner", + "Phone", + "Website", + "NA", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + } + }, + "required": [ + "variety" + ], + "type": "object" + }, + "cash-out": { + "title": "Cash Out", + "description": "Methods for converting something (likely the attribute compromised) into currency.", + "additionalProperties": false, + "properties": { + "variety": { + "title": "Variety", + "description": "Varieties of cash-out investments", + "items": { + "type": "string", + "enum": [ + "Cryptocurrency", + "Direct", + "Fraud", + "Hijacked rewards", + "Provide service", + "Sell stolen goods", + "NA", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + } + }, + "required": [ + "variety" + ], + "type": "object" + }, + "money laundering": { + "title": "Money Laundering", + "description": "Methods for concealing the origins of illegally obtained money.", + "additionalProperties": false, + "properties": { + "variety": { + "title": "Variety", + "description": "Varieties of money laundering", + "items": { + "type": "string", + "enum": [ + "Bank", + "Company", + "Cryptocurrency tumbling", + "Employment", + "Gambling", + "Physical", + "Provide service", + "Re-shipping", + "Smurfing", + "NA", + "Other", + "Unknown" + ] + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + } + }, + "required": [ + "variety" + ], + "type": "object" + }, + "NA": { + "type": "boolean" + } + }, + "type": "object" + }, + "impact": { + "title": "Impact", + "description": "[Impact Info](http://veriscommunity.net/impact.html)", + "additionalProperties": false, + "properties": { + "overall_rating": { + "title": "Overall Rating", + "type": "string", + "enum": [ + "Catastrophic", + "Damaging", + "Painful", + "Distracting", + "Insignificant", + "Unknown" + ] + }, + "iso_currency_code": { + "title": "ISO 4217 currency code", + "description": "ISO_4217 currency code. [More Info](https://en.wikipedia.org/wiki/ISO_4217)", + "type": "string", + "enum": [ + "AED", + "AFN", + "ALL", + "AMD", + "ANG", + "AOA", + "ARS", + "AUD", + "AWG", + "AZN", + "BAM", + "BBD", + "BDT", + "BGN", + "BHD", + "BIF", + "BMD", + "BND", + "BOB", + "BRL", + "BSD", + "BTN", + "BWP", + "BYR", + "BZD", + "CAD", + "CDF", + "CHF", + "CLP", + "CNY", + "COP", + "CRC", + "CUC", + "CUP", + "CVE", + "CZK", + "DJF", + "DKK", + "DOP", + "DZD", + "EGP", + "ERN", + "ETB", + "EUR", + "FJD", + "FKP", + "GBP", + "GEL", + "GGP", + "GHS", + "GIP", + "GMD", + "GNF", + "GTQ", + "GYD", + "HKD", + "HNL", + "HRK", + "HTG", + "HUF", + "IDR", + "ILS", + "IMP", + "INR", + "IQD", + "IRR", + "ISK", + "JEP", + "JMD", + "JOD", + "JPY", + "KES", + "KGS", + "KHR", + "KMF", + "KPW", + "KRW", + "KWD", + "KYD", + "KZT", + "LAK", + "LBP", + "LKR", + "LRD", + "LSL", + "LTL", + "LVL", + "LYD", + "MAD", + "MDL", + "MGA", + "MKD", + "MMK", + "MNT", + "MOP", + "MRO", + "MUR", + "MVR", + "MWK", + "MXN", + "MYR", + "MZN", + "NAD", + "NGN", + "NIO", + "NOK", + "NPR", + "NZD", + "OMR", + "PAB", + "PEN", + "PGK", + "PHP", + "PKR", + "PLN", + "PYG", + "QAR", + "RON", + "RSD", + "RUB", + "RWF", + "SAR", + "SBD", + "SCR", + "SDG", + "SEK", + "SGD", + "SHP", + "SLL", + "SOS", + "SPL", + "SRD", + "STD", + "SVC", + "SYP", + "SZL", + "THB", + "TJS", + "TMT", + "TND", + "TOP", + "TRY", + "TTD", + "TVD", + "TWD", + "TZS", + "UAH", + "UGX", + "USD", + "UYU", + "UZS", + "VEF", + "VND", + "VUV", + "WST", + "XAF", + "XCD", + "XDR", + "XOF", + "XPF", + "YER", + "ZAR", + "ZMK", + "ZWD", + "XBT", + "BCH", + "Ether", + "Litecoin", + "XMR", + "ZEC" + ] + }, + "overall_amount": { + "title": "Overall amount", + "description": "The total amount lost in the given ISO currency code.", + "type": "number", + "x-cols": 4 + }, + "overall_min_amount": { + "title": "Overall minimum account", + "description": "When 'overall_amount' would be a range, use this field for the minimum of that range. Note: Values here will not appear in searches for 'overall_amount'.", + "type": "number", + "x-cols": 4 + }, + "overall_max_amount": { + "title": "Overall maximum account", + "description": "When 'overall_amount' would be a range, use this field for the maximum of that range. Note: Values here will not appear in searches for 'overall_amount'.", + "type": "number", + "x-cols": 4 + }, + "loss": { + "title": "Reported Losses", + "description": "Were any losses or costs reported for this incident? (Definitions for loss varieties and ratings are [here](http://veriscommunity.net/impact.html#section-loss-estimation))", + "items": { + "additionalProperties": false, + "properties": { + "variety": { + "title": "Variety", + "type": "string", + "enum": [ + "Asset and fraud", + "Brand damage", + "Business disruption", + "Competitive advantage", + "Legal and regulatory", + "Operating costs", + "Response and recovery", + "Other" + ] + }, + "rating": { + "title": "Rating", + "type": "string", + "enum": [ + "Major", + "Moderate", + "Minor", + "None", + "Unknown" + ] + }, + "amount": { + "title": "Amount", + "type": "number" + }, + "min_amount": { + "title": "Min Amount", + "type": "number" + }, + "max_amount": { + "title": "Max Amount", + "type": "number" + } + }, + "required": [ + "variety" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "x-display": "textarea" + } + }, + "required": [ + "overall_rating" + ], + "type": "object" + }, + "notes": { + "title": "Notes", + "minLength": 1, + "type": "string", + "description": "Record notes about the incident.", + "x-display": "textarea" + }, + "corrective_action": { + "title": "Corrective Action", + "description": "What corrective action(s) are planned (or recommended) to prevent and/or detect similar incidents in the future?
This can include general recommendations, specific changes to policy, procedures, personnel, and technology, short-term and long-term strategies, etc. Don't simply copy what the investigator said. Tie to the root causes listed above, and focus on practical, effective corrective actions.", + "type": "string", + "x-cols": 6 + }, + "cost_corrective_action": { + "title": "Cost Corrective Action", + "type": "string", + "enum": [ + "Difficult and expensive", + "Something in-between", + "Simple and cheap", + "Unknown" + ], + "x-cols": 6 + }, + "control_failure": { + "title": "Control Failure", + "description": "What were the root control failures or weaknesses that allowed this incident to occur?
Obviously, there may be a multitude of factors that could be listed here. Include as many as you want, but focus on the issues most pertinent to why the incident occurred.", + "type": "string" + } + }, + "required": [ + "actor", + "action", + "discovery_method", + "schema_version", + "asset", + "timeline", + "incident_id", + "security_incident", + "summary" + ], + "type": "object" +} diff --git a/database/playbook.go b/database/playbook.go new file mode 100644 index 0000000..9c1b810 --- /dev/null +++ b/database/playbook.go @@ -0,0 +1,152 @@ +package database + +import ( + "context" + "errors" + "time" + + "github.com/arangodb/go-driver" + "github.com/iancoleman/strcase" + "github.com/icza/dyno" + "gopkg.in/yaml.v3" + + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" +) + +type PlaybookYAML struct { + Name string `yaml:"name"` + Tasks map[string]TaskYAML `yaml:"tasks"` +} + +type TaskYAML struct { + Name string `yaml:"name"` + Type string `yaml:"type"` + Schema interface{} `yaml:"schema"` + Automation string `yaml:"automation"` + Payload map[string]string `yaml:"payload"` + Next map[string]string `yaml:"next"` + Join bool `yaml:"join"` +} + +func toPlaybooks(docs []*models.PlaybookTemplateForm) (map[string]*models.Playbook, error) { + playbooks := map[string]*models.Playbook{} + for _, doc := range docs { + playbook, err := toPlaybook(doc) + if err != nil { + return nil, err + } + if doc.ID != nil { + playbooks[*doc.ID] = playbook + } else { + playbooks[strcase.ToKebab(playbook.Name)] = playbook + } + } + return playbooks, nil +} + +func toPlaybook(doc *models.PlaybookTemplateForm) (*models.Playbook, error) { + ticketPlaybook := &models.Playbook{} + err := yaml.Unmarshal([]byte(doc.Yaml), ticketPlaybook) + if err != nil { + return nil, err + } + for idx, task := range ticketPlaybook.Tasks { + if task.Schema != nil { + task.Schema = dyno.ConvertMapI2MapS(task.Schema.(map[string]interface{})) + } + task.Created = time.Now().UTC() + ticketPlaybook.Tasks[idx] = task + } + return ticketPlaybook, nil +} + +func toPlaybookTemplateResponse(key string, doc *models.PlaybookTemplate) *models.PlaybookTemplateResponse { + return &models.PlaybookTemplateResponse{ID: key, Name: doc.Name, Yaml: doc.Yaml} +} + +func (db *Database) PlaybookCreate(ctx context.Context, playbook *models.PlaybookTemplateForm) (*models.PlaybookTemplateResponse, error) { + if playbook == nil { + return nil, errors.New("requires playbook") + } + + var playbookYAML PlaybookYAML + err := yaml.Unmarshal([]byte(playbook.Yaml), &playbookYAML) + if err != nil { + return nil, err + } + + if playbookYAML.Name == "" { + return nil, errors.New("requires template name") + } + p := models.PlaybookTemplate{Name: playbookYAML.Name, Yaml: playbook.Yaml} + + var doc models.PlaybookTemplate + newctx := driver.WithReturnNew(ctx, &doc) + + meta, err := db.playbookCollection.CreateDocument(ctx, newctx, strcase.ToKebab(playbookYAML.Name), p) + if err != nil { + return nil, err + } + + return toPlaybookTemplateResponse(meta.Key, &doc), nil +} + +func (db *Database) PlaybookGet(ctx context.Context, id string) (*models.PlaybookTemplateResponse, error) { + doc := models.PlaybookTemplate{} + meta, err := db.playbookCollection.ReadDocument(ctx, id, &doc) + if err != nil { + return nil, err + } + + return toPlaybookTemplateResponse(meta.Key, &doc), nil +} + +func (db *Database) PlaybookDelete(ctx context.Context, id string) error { + _, err := db.playbookCollection.RemoveDocument(ctx, id) + return err +} + +func (db *Database) PlaybookUpdate(ctx context.Context, id string, playbook *models.PlaybookTemplateForm) (*models.PlaybookTemplateResponse, error) { + var pb PlaybookYAML + err := yaml.Unmarshal([]byte(playbook.Yaml), &pb) + if err != nil { + return nil, err + } + + if pb.Name == "" { + return nil, errors.New("requires template name") + } + + var doc models.PlaybookTemplate + ctx = driver.WithReturnNew(ctx, &doc) + + meta, err := db.playbookCollection.ReplaceDocument(ctx, id, models.PlaybookTemplate{Name: pb.Name, Yaml: playbook.Yaml}) + if err != nil { + return nil, err + } + + return toPlaybookTemplateResponse(meta.Key, &doc), nil +} + +func (db *Database) PlaybookList(ctx context.Context) ([]*models.PlaybookTemplateResponse, error) { + query := "FOR d IN @@collection RETURN d" + cursor, _, err := db.Query(ctx, query, map[string]interface{}{"@collection": PlaybookCollectionName}, busdb.ReadOperation) + if err != nil { + return nil, err + } + defer cursor.Close() + var docs []*models.PlaybookTemplateResponse + for { + var doc models.PlaybookTemplate + meta, err := cursor.ReadDocument(ctx, &doc) + if driver.IsNoMoreDocuments(err) { + break + } else if err != nil { + return nil, err + } + docs = append(docs, toPlaybookTemplateResponse(meta.Key, &doc)) + } + + return docs, err +} diff --git a/database/playbookutils.go b/database/playbookutils.go new file mode 100644 index 0000000..2df7eef --- /dev/null +++ b/database/playbookutils.go @@ -0,0 +1,182 @@ +package database + +import ( + "errors" + "fmt" + "log" + "sort" + + "github.com/SecurityBrewery/catalyst/caql" + "github.com/SecurityBrewery/catalyst/dag" + "github.com/SecurityBrewery/catalyst/generated/models" +) + +func playbookGraph(playbook *models.Playbook) (*dag.Graph, error) { + d := dag.NewGraph() + + var taskIDs []string + for taskID := range playbook.Tasks { + taskIDs = append(taskIDs, taskID) + } + sort.Strings(taskIDs) + + for _, taskID := range taskIDs { + if err := d.AddNode(taskID); err != nil { + return nil, errors.New("could not add node") + } + } + for _, taskID := range taskIDs { + task := playbook.Tasks[taskID] + for next := range task.Next { + if err := d.AddEdge(taskID, next); err != nil { + return nil, errors.New("could not add edge") + } + } + } + return d, nil +} + +func toTaskResponse(playbook *models.Playbook, taskID string, order int, graph *dag.Graph) (*models.TaskResponse, error) { + task, ok := playbook.Tasks[taskID] + if !ok { + return nil, fmt.Errorf("task %s not found", taskID) + } + + tr := &models.TaskResponse{ + Automation: task.Automation, + Closed: task.Closed, + Created: task.Created, + Data: task.Data, + Done: task.Done, + Join: task.Join, + Payload: task.Payload, + Name: task.Name, + Next: task.Next, + Owner: task.Owner, + Schema: task.Schema, + Type: task.Type, + // Active: active, + // Order: v.Order, + } + + tr.Order = int64(order) + + taskActive, _ := active(playbook, taskID, graph, task) + tr.Active = taskActive + + return tr, nil +} + +func activePlaybook(playbook *models.Playbook, taskID string) (bool, error) { + task, ok := playbook.Tasks[taskID] + if !ok { + return false, fmt.Errorf("playbook does not contain tasks %s", taskID) + } + + d, err := playbookGraph(playbook) + if err != nil { + return false, err + } + + return active(playbook, taskID, d, task) +} + +func active(playbook *models.Playbook, taskID string, d *dag.Graph, task *models.Task) (bool, error) { + if task.Done { + return false, nil + } + + parents := d.GetParents(taskID) + + if len(parents) == 0 { + return true, nil // valid(&task) + } + + if task.Join != nil && *task.Join { + for _, parent := range parents { + parentTask := playbook.Tasks[parent] + if !parentTask.Done { + return false, nil + } + requirement := parentTask.Next[taskID] + + b, err := evalRequirement(requirement, parentTask.Data) + if err != nil { + return false, err + } + + if !b { + return false, nil + } + } + return true, nil + } + + for _, parent := range parents { + parentTask := playbook.Tasks[parent] + if !parentTask.Done { + // return false, nil + continue + } + requirement := parentTask.Next[taskID] + + b, err := evalRequirement(requirement, parentTask.Data) + if err != nil { + continue + } + + if b { + return true, nil + } + } + return false, nil +} + +func evalRequirement(aql string, data interface{}) (bool, error) { + if aql == "" { + return true, nil + } + + parser := caql.Parser{} + tree, err := parser.Parse(aql) + if err != nil { + return false, err + } + + var dataMap map[string]interface{} + if data != nil { + if dataMapX, ok := data.(map[string]interface{}); ok { + dataMap = dataMapX + } else { + log.Println("wrong data type for task data") + } + } + + v, err := tree.Eval(dataMap) + if err != nil { + return false, err + } + + if b, ok := v.(bool); ok { + return b, nil + } + return false, err +} + +/* +// "github.com/qri-io/jsonschema" +func valid(task *models.Task) (bool, error) { + schema, err := json.Marshal(task.Schema) + if err != nil { + return false, err + } + + rs := &jsonschema.Schema{} + if err := json.Unmarshal(schema, rs); err != nil { + return false, err + } + + state := rs.Validate(context.Background(), task.Data) + return len(*state.Errs) > 0, nil +} +*/ diff --git a/database/playbookutils_test.go b/database/playbookutils_test.go new file mode 100644 index 0000000..25ed2bf --- /dev/null +++ b/database/playbookutils_test.go @@ -0,0 +1,135 @@ +package database + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/SecurityBrewery/catalyst/generated/models" +) + +var playbook2 = &models.Playbook{ + Name: "Phishing", + Tasks: map[string]*models.Task{ + "board": {Next: map[string]string{ + "escalate": "boardInvolved == true", + "aquire-mail": "boardInvolved == false", + }}, + "escalate": {}, + "aquire-mail": {Next: map[string]string{ + "extract-iocs": "schemaKey == 'yes'", + "block-sender": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'", + }}, + "extract-iocs": {Next: map[string]string{"fetch-iocs": ""}}, + "fetch-iocs": {Next: map[string]string{"block-iocs": ""}}, + "search-email-gateway": {Next: map[string]string{"block-iocs": ""}}, + "block-sender": {Next: map[string]string{"block-iocs": ""}}, + "block-iocs": {Next: map[string]string{"block-ioc": ""}}, + "block-ioc": {}, + }, +} + +var playbook3 = &models.Playbook{ + Name: "Phishing", + Tasks: map[string]*models.Task{ + "board": {Next: map[string]string{ + "escalate": "boardInvolved == true", + "aquire-mail": "boardInvolved == false", + }, Data: map[string]interface{}{"boardInvolved": true}, Done: true}, + "escalate": {}, + "aquire-mail": {Next: map[string]string{ + "extract-iocs": "schemaKey == 'yes'", + "block-sender": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'", + }}, + "extract-iocs": {Next: map[string]string{"fetch-iocs": ""}}, + "fetch-iocs": {Next: map[string]string{"block-iocs": ""}}, + "search-email-gateway": {Next: map[string]string{"block-iocs": ""}}, + "block-sender": {Next: map[string]string{"block-iocs": ""}}, + "block-iocs": {Next: map[string]string{"block-ioc": ""}}, + "block-ioc": {}, + }, +} + +var playbook4 = &models.Playbook{ + Name: "Malware", + Tasks: map[string]*models.Task{ + "file-or-hash": {Next: map[string]string{ + "enter-hash": "file == 'Hash'", + "upload": "file == 'File'", + }}, + "enter-hash": {Next: map[string]string{ + "virustotal": "hash != ''", + }}, + "upload": {Next: map[string]string{ + "hash": "malware", + }}, + "hash": {Next: map[string]string{"virustotal": ""}}, + "virustotal": {}, + }, +} + +func Test_canBeCompleted(t *testing.T) { + type args struct { + playbook *models.Playbook + taskID string + } + tests := []struct { + name string + args args + want bool + wantErr bool + }{ + {"playbook2 board", args{playbook: playbook2, taskID: "board"}, true, false}, + {"playbook2 escalate", args{playbook: playbook2, taskID: "escalate"}, false, false}, + {"playbook2 aquire-mail", args{playbook: playbook2, taskID: "aquire-mail"}, false, false}, + {"playbook2 block-ioc", args{playbook: playbook2, taskID: "block-ioc"}, false, false}, + {"playbook3 board", args{playbook: playbook3, taskID: "board"}, false, false}, + {"playbook3 escalate", args{playbook: playbook3, taskID: "escalate"}, true, false}, + {"playbook3 aquire-mail", args{playbook: playbook3, taskID: "aquire-mail"}, false, false}, + {"playbook3 block-ioc", args{playbook: playbook3, taskID: "block-ioc"}, false, false}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := activePlaybook(tt.args.playbook, tt.args.taskID) + if (err != nil) != tt.wantErr { + t.Errorf("activePlaybook() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("activePlaybook() got = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_playbookOrder(t *testing.T) { + type args struct { + playbook *models.Playbook + } + tests := []struct { + name string + args args + want []string + wantErr bool + }{ + {"playbook4", args{playbook: playbook4}, []string{"file-or-hash", "enter-hash", "upload", "hash", "virustotal"}, false}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := toPlaybookResponse(tt.args.playbook) + if (err != nil) != tt.wantErr { + t.Errorf("activePlaybook() error = %v, wantErr %v", err, tt.wantErr) + return + } + + names := make([]string, len(got.Tasks)) + for name, task := range got.Tasks { + names[task.Order] = name + } + + assert.Equal(t, tt.want, names) + }) + } +} diff --git a/database/relationships.go b/database/relationships.go new file mode 100644 index 0000000..95ff059 --- /dev/null +++ b/database/relationships.go @@ -0,0 +1,48 @@ +package database + +import ( + "context" + "errors" + "strconv" + + "github.com/arangodb/go-driver" + + "github.com/SecurityBrewery/catalyst/database/busdb" +) + +func (db *Database) RelatedCreate(ctx context.Context, id, id2 int64) error { + if id == id2 { + return errors.New("tickets cannot relate to themself") + } + + _, err := db.relatedCollection.CreateEdge(ctx, ctx, &driver.EdgeDocument{ + From: driver.DocumentID(TicketCollectionName + "/" + strconv.Itoa(int(id))), + To: driver.DocumentID(TicketCollectionName + "/" + strconv.Itoa(int(id2))), + }) + return err +} + +func (db *Database) RelatedBatchCreate(ctx context.Context, edges []*driver.EdgeDocument) error { + _, err := db.relatedCollection.CreateEdges(ctx, edges) + return err +} + +func (db *Database) RelatedRemove(ctx context.Context, id, id2 int64) error { + q := ` + FOR d in @@collection + FILTER (d._from == @id && d._to == @id2) || (d._to == @id && d._from == @id2) + REMOVE d in @@collection` + _, _, err := db.Query(ctx, q, map[string]interface{}{ + "@collection": RelatedTicketsCollectionName, + "id": driver.DocumentID(TicketCollectionName + "/" + strconv.Itoa(int(id))), + "id2": driver.DocumentID(TicketCollectionName + "/" + strconv.Itoa(int(id2))), + }, &busdb.Operation{ + OperationType: busdb.Update, + Ids: []driver.DocumentID{ + driver.DocumentID(TicketCollectionName + "/" + strconv.Itoa(int(id))), + driver.DocumentID(TicketCollectionName + "/" + strconv.Itoa(int(id2))), + }, + Msg: "Removed ticket/artifact relation", + }) + return err +} diff --git a/database/settings.go b/database/settings.go new file mode 100644 index 0000000..67136b7 --- /dev/null +++ b/database/settings.go @@ -0,0 +1,86 @@ +package database + +import ( + "context" + "errors" + + "github.com/arangodb/go-driver" + "github.com/gin-gonic/gin" + + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" +) + +func toUserDataResponse(key string, doc *models.UserData) *models.UserDataResponse { + return &models.UserDataResponse{ + Email: doc.Email, + ID: key, + Image: doc.Image, + Name: doc.Name, + Timeformat: doc.Timeformat, + } +} + +func (db *Database) UserDataCreate(ctx context.Context, id string, userdata *models.UserData) error { + if userdata == nil { + return errors.New("requires setting") + } + if id == "" { + return errors.New("requires username") + } + + _, err := db.userdataCollection.CreateDocument(ctx, ctx, id, userdata) + return err +} + +func (db *Database) UserDataGetOrCreate(ctx *gin.Context, id string, newUserData *models.UserData) (*models.UserDataResponse, error) { + setting, err := db.UserDataGet(ctx, id) + if err != nil { + return toUserDataResponse(id, newUserData), db.UserDataCreate(ctx, id, newUserData) + } + return setting, nil +} + +func (db *Database) UserDataGet(ctx context.Context, id string) (*models.UserDataResponse, error) { + var doc models.UserData + meta, err := db.userdataCollection.ReadDocument(ctx, id, &doc) + if err != nil { + return nil, err + } + + return toUserDataResponse(meta.Key, &doc), err +} + +func (db *Database) UserDataList(ctx context.Context) ([]*models.UserDataResponse, error) { + query := "FOR d IN @@collection SORT d.username ASC RETURN d" + cursor, _, err := db.Query(ctx, query, map[string]interface{}{"@collection": UserDataCollectionName}, busdb.ReadOperation) + if err != nil { + return nil, err + } + defer cursor.Close() + var docs []*models.UserDataResponse + for { + var doc models.UserData + meta, err := cursor.ReadDocument(ctx, &doc) + if driver.IsNoMoreDocuments(err) { + break + } else if err != nil { + return nil, err + } + docs = append(docs, toUserDataResponse(meta.Key, &doc)) + } + + return docs, err +} + +func (db *Database) UserDataUpdate(ctx context.Context, id string, userdata *models.UserData) (*models.UserDataResponse, error) { + var doc models.UserData + ctx = driver.WithReturnNew(ctx, &doc) + + meta, err := db.userdataCollection.ReplaceDocument(ctx, id, userdata) + if err != nil { + return nil, err + } + + return toUserDataResponse(meta.Key, &doc), nil +} diff --git a/database/settings_test.go b/database/settings_test.go new file mode 100644 index 0000000..52adc05 --- /dev/null +++ b/database/settings_test.go @@ -0,0 +1,159 @@ +package database_test + +import ( + "testing" + + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/pointer" + "github.com/SecurityBrewery/catalyst/test" +) + +func init() { + gin.SetMode(gin.TestMode) +} + +var bob = &models.UserData{ + Email: pointer.String("bob@example.org"), + Name: pointer.String("Bob"), +} + +var bobResponse = &models.UserDataResponse{ + ID: "bob", + Email: pointer.String("bob@example.org"), + Name: pointer.String("Bob"), +} + +func TestDatabase_UserDataCreate(t *testing.T) { + type args struct { + id string + setting *models.UserData + } + tests := []struct { + name string + args args + wantErr bool + }{ + {name: "Normal setting", args: args{id: "bob", setting: bob}, wantErr: false}, + {name: "Nil setting", args: args{id: "bob"}, wantErr: true}, + {name: "UserData without settingname", args: args{id: ""}, wantErr: true}, + {name: "Only settingname", args: args{id: "bob"}, wantErr: true}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, _, _, _, _, db, cleanup, err := test.DB(t) + if err != nil { + t.Fatal(err) + } + defer cleanup() + + if err := db.UserDataCreate(test.Context(), tt.args.id, tt.args.setting); (err != nil) != tt.wantErr { + t.Errorf("settingCreate() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestDatabase_UserDataGet(t *testing.T) { + type args struct { + id string + } + tests := []struct { + name string + args args + want *models.UserDataResponse + wantErr bool + }{ + {name: "Normal get", args: args{id: "bob"}, want: bobResponse}, + {name: "Not existing", args: args{id: "foo"}, wantErr: true}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, _, _, _, _, db, cleanup, err := test.DB(t) + if err != nil { + t.Fatal(err) + } + defer cleanup() + + if err := db.UserDataCreate(test.Context(), "bob", bob); err != nil { + t.Errorf("settingCreate() error = %v", err) + } + + got, err := db.UserDataGet(test.Context(), tt.args.id) + if (err != nil) != tt.wantErr { + t.Errorf("UserDataGet() error = %v, wantErr %v", err, tt.wantErr) + return + } + if err != nil { + return + } + + assert.Equal(t, tt.want, got) + }) + } +} + +func TestDatabase_UserDataList(t *testing.T) { + tests := []struct { + name string + want []*models.UserDataResponse + wantErr bool + }{ + {name: "Normal list", want: []*models.UserDataResponse{bobResponse}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, _, _, _, _, db, cleanup, err := test.DB(t) + if err != nil { + t.Fatal(err) + } + defer cleanup() + + if err := db.UserDataCreate(test.Context(), "bob", bob); err != nil { + t.Errorf("settingCreate() error = %v", err) + } + + got, err := db.UserDataList(test.Context()) + if (err != nil) != tt.wantErr { + t.Errorf("UserDataList() error = %v, wantErr %v", err, tt.wantErr) + return + } + + assert.Equal(t, tt.want, got) + }) + } +} + +func TestDatabase_UserDataUpdate(t *testing.T) { + type args struct { + id string + setting *models.UserData + } + tests := []struct { + name string + args args + wantErr bool + }{ + {name: "Normal", args: args{id: "bob", setting: bob}}, + {name: "Not existing", args: args{id: "foo"}, wantErr: true}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, _, _, _, _, db, cleanup, err := test.DB(t) + if err != nil { + t.Fatal(err) + } + defer cleanup() + + if err := db.UserDataCreate(test.Context(), "bob", bob); err != nil { + t.Errorf("settingCreate() error = %v", err) + } + + if _, err := db.UserDataUpdate(test.Context(), tt.args.id, tt.args.setting); (err != nil) != tt.wantErr { + t.Errorf("UserDataUpdate() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/database/statistics.go b/database/statistics.go new file mode 100644 index 0000000..3073f94 --- /dev/null +++ b/database/statistics.go @@ -0,0 +1,43 @@ +package database + +import ( + "context" + + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" +) + +func (db *Database) Statistics(ctx context.Context) (*models.Statistics, error) { + query := `RETURN { + tickets_per_type: MERGE(FOR d in tickets + COLLECT type = d.type WITH COUNT INTO typecount + RETURN ZIP([type], [typecount])), + + unassigned: FIRST(FOR d in tickets + FILTER d.status == "open" AND !d.owner + COLLECT WITH COUNT INTO length + RETURN length), + + open_tickets_per_user: MERGE(FOR d in tickets + FILTER d.status == "open" + COLLECT user = d.owner WITH COUNT INTO usercount + RETURN ZIP([user], [usercount])), + + tickets_per_week: MERGE(FOR d in tickets + COLLECT week = CONCAT(DATE_YEAR(d.created), "-", DATE_ISOWEEK(d.created) < 10 ? "0" : "", DATE_ISOWEEK(d.created)) WITH COUNT INTO weekcount + RETURN ZIP([week], [weekcount])), + }` + + cur, _, err := db.Query(ctx, query, nil, busdb.ReadOperation) + if err != nil { + return nil, err + } + defer cur.Close() + + statistics := models.Statistics{} + if _, err := cur.ReadDocument(ctx, &statistics); err != nil { + return nil, err + } + + return &statistics, nil +} diff --git a/database/task.go b/database/task.go new file mode 100644 index 0000000..b8b2d81 --- /dev/null +++ b/database/task.go @@ -0,0 +1,68 @@ +package database + +import ( + "context" + + "github.com/arangodb/go-driver" + + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" +) + +type playbookResponse struct { + PlaybookId string `json:"playbook_id"` + PlaybookName string `json:"playbook_name"` + Playbook models.Playbook `json:"playbook"` + TicketId int64 `json:"ticket_id"` + TicketName string `json:"ticket_name"` +} + +func (db *Database) TaskList(ctx context.Context) ([]*models.TaskWithContext, error) { + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketWriteFilter(ctx) + if err != nil { + return nil, err + } + + query := `FOR d IN @@collection + ` + ticketFilterQuery + ` + FILTER d.status == 'open' + FOR playbook IN NOT_NULL(VALUES(d.playbooks), []) + RETURN { ticket_id: TO_NUMBER(d._key), ticket_name: d.name, playbook_id: POSITION(d.playbooks, playbook, true), playbook_name: playbook.name, playbook: playbook }` + cursor, _, err := db.Query(ctx, query, mergeMaps(ticketFilterVars, map[string]interface{}{ + "@collection": TicketCollectionName, + }), busdb.ReadOperation) + if err != nil { + return nil, err + } + defer cursor.Close() + docs := []*models.TaskWithContext{} + for { + var doc playbookResponse + _, err := cursor.ReadDocument(ctx, &doc) + if driver.IsNoMoreDocuments(err) { + break + } else if err != nil { + return nil, err + } + + + playbook, err := toPlaybookResponse(&doc.Playbook) + if err != nil { + return nil, err + } + + for _, task := range playbook.Tasks { + if task.Active { + docs = append(docs, &models.TaskWithContext{ + PlaybookId: doc.PlaybookId, + PlaybookName: doc.PlaybookName, + Task: *task, + TicketId: doc.TicketId, + TicketName: doc.TicketName, + }) + } + } + } + + return docs, err +} diff --git a/database/template.go b/database/template.go new file mode 100644 index 0000000..5e33996 --- /dev/null +++ b/database/template.go @@ -0,0 +1,88 @@ +package database + +import ( + "context" + "errors" + + "github.com/arangodb/go-driver" + "github.com/iancoleman/strcase" + + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" +) + +func toTicketTemplate(doc *models.TicketTemplateForm) *models.TicketTemplate { + return &models.TicketTemplate{Name: doc.Name, Schema: doc.Schema} +} + +func toTicketTemplateResponse(key string, doc *models.TicketTemplate) *models.TicketTemplateResponse { + return &models.TicketTemplateResponse{ID: key, Name: doc.Name, Schema: doc.Schema} +} + +func (db *Database) TemplateCreate(ctx context.Context, template *models.TicketTemplateForm) (*models.TicketTemplateResponse, error) { + if template == nil { + return nil, errors.New("requires template") + } + if template.Name == "" { + return nil, errors.New("requires template name") + } + + var doc models.TicketTemplate + newctx := driver.WithReturnNew(ctx, &doc) + + meta, err := db.templateCollection.CreateDocument(ctx, newctx, strcase.ToKebab(template.Name), toTicketTemplate(template)) + if err != nil { + return nil, err + } + + return toTicketTemplateResponse(meta.Key, &doc), nil +} + +func (db *Database) TemplateGet(ctx context.Context, id string) (*models.TicketTemplateResponse, error) { + var doc models.TicketTemplate + meta, err := db.templateCollection.ReadDocument(ctx, id, &doc) + if err != nil { + return nil, err + } + + return toTicketTemplateResponse(meta.Key, &doc), nil +} + +func (db *Database) TemplateUpdate(ctx context.Context, id string, template *models.TicketTemplateForm) (*models.TicketTemplateResponse, error) { + var doc models.TicketTemplate + ctx = driver.WithReturnNew(ctx, &doc) + + meta, err := db.templateCollection.ReplaceDocument(ctx, id, toTicketTemplate(template)) + if err != nil { + return nil, err + } + + return toTicketTemplateResponse(meta.Key, &doc), nil +} + +func (db *Database) TemplateDelete(ctx context.Context, id string) error { + _, err := db.templateCollection.RemoveDocument(ctx, id) + return err +} + +func (db *Database) TemplateList(ctx context.Context) ([]*models.TicketTemplateResponse, error) { + query := "FOR d IN @@collection RETURN d" + cursor, _, err := db.Query(ctx, query, map[string]interface{}{"@collection": TemplateCollectionName}, busdb.ReadOperation) + if err != nil { + return nil, err + } + defer cursor.Close() + var docs []*models.TicketTemplateResponse + for { + var doc models.TicketTemplate + meta, err := cursor.ReadDocument(ctx, &doc) + if driver.IsNoMoreDocuments(err) { + break + } else if err != nil { + return nil, err + } + docs = append(docs, toTicketTemplateResponse(meta.Key, &doc)) + } + + return docs, err +} diff --git a/database/template_test.go b/database/template_test.go new file mode 100644 index 0000000..76fa1c6 --- /dev/null +++ b/database/template_test.go @@ -0,0 +1,182 @@ +package database_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/SecurityBrewery/catalyst/database/migrations" + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/test" +) + +var template1 = &models.TicketTemplateForm{ + Schema: migrations.DefaultTemplateSchema, + Name: "Template 1", +} +var default1 = &models.TicketTemplateForm{ + Schema: migrations.DefaultTemplateSchema, + Name: "Default", +} + +func TestDatabase_TemplateCreate(t *testing.T) { + type args struct { + template *models.TicketTemplateForm + } + tests := []struct { + name string + args args + wantErr bool + }{ + {name: "Normal", args: args{template: template1}}, + {name: "Duplicate", args: args{template: default1}, wantErr: true}, + {name: "Nil template", args: args{}, wantErr: true}, + {name: "Template without fields", args: args{template: &models.TicketTemplateForm{}}, wantErr: true}, + {name: "Only name", args: args{template: &models.TicketTemplateForm{Name: "name"}}, wantErr: false}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, _, _, _, _, db, cleanup, err := test.DB(t) + if err != nil { + t.Fatal(err) + } + defer cleanup() + + if _, err := db.TemplateCreate(test.Context(), tt.args.template); (err != nil) != tt.wantErr { + t.Errorf("TemplateCreate() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestDatabase_TemplateDelete(t *testing.T) { + type args struct { + id string + } + tests := []struct { + name string + args args + wantErr bool + }{ + {name: "Normal", args: args{"default"}}, + {name: "Not existing", args: args{"foobar"}, wantErr: true}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, _, _, _, _, db, cleanup, err := test.DB(t) + if err != nil { + t.Fatal(err) + } + defer cleanup() + + if _, err := db.TemplateCreate(test.Context(), template1); err != nil { + t.Errorf("TemplateCreate() error = %v", err) + } + + if err := db.TemplateDelete(test.Context(), tt.args.id); (err != nil) != tt.wantErr { + t.Errorf("TemplateDelete() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestDatabase_TemplateGet(t *testing.T) { + type args struct { + id string + } + tests := []struct { + name string + args args + want *models.TicketTemplateResponse + wantErr bool + }{ + {name: "Normal", args: args{id: "default"}, want: &models.TicketTemplateResponse{ID: "default", Name: "Default", Schema: migrations.DefaultTemplateSchema}}, + {name: "Not existing", args: args{id: "foobar"}, wantErr: true}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, _, _, _, _, db, cleanup, err := test.DB(t) + if err != nil { + t.Fatal(err) + } + defer cleanup() + + if _, err := db.TemplateCreate(test.Context(), template1); err != nil { + t.Errorf("TemplateCreate() error = %v", err) + } + + got, err := db.TemplateGet(test.Context(), tt.args.id) + if (err != nil) != tt.wantErr { + t.Errorf("TemplateGet() error = %v, wantErr %v", err, tt.wantErr) + return + } + if err != nil { + return + } + + assert.Equal(t, got, tt.want) + }) + } +} + +func TestDatabase_TemplateList(t *testing.T) { + tests := []struct { + name string + want []*models.TicketTemplateResponse + wantErr bool + }{ + {name: "Normal", want: []*models.TicketTemplateResponse{{ID: "default", Name: "Default", Schema: migrations.DefaultTemplateSchema}, {ID: "template-1", Name: template1.Name, Schema: template1.Schema}}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, _, _, _, _, db, cleanup, err := test.DB(t) + if err != nil { + t.Fatal(err) + } + defer cleanup() + + if _, err := db.TemplateCreate(test.Context(), template1); err != nil { + t.Errorf("TemplateCreate() error = %v", err) + } + + got, err := db.TemplateList(test.Context()) + if (err != nil) != tt.wantErr { + t.Errorf("TemplateList() error = %v, wantErr %v", err, tt.wantErr) + return + } + assert.Equal(t, got, tt.want) + }) + } +} + +func TestDatabase_TemplateUpdate(t *testing.T) { + type args struct { + id string + template *models.TicketTemplateForm + } + tests := []struct { + name string + args args + wantErr bool + }{ + {name: "Normal", args: args{"default", template1}}, + {name: "Not existing", args: args{"foobar", template1}, wantErr: true}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, _, _, _, _, db, cleanup, err := test.DB(t) + if err != nil { + t.Fatal(err) + } + defer cleanup() + + if _, err := db.TemplateCreate(test.Context(), template1); err != nil { + t.Errorf("TemplateCreate() error = %v", err) + } + + if _, err := db.TemplateUpdate(test.Context(), tt.args.id, tt.args.template); (err != nil) != tt.wantErr { + t.Errorf("TemplateUpdate() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/database/ticket.go b/database/ticket.go new file mode 100644 index 0000000..bb03c75 --- /dev/null +++ b/database/ticket.go @@ -0,0 +1,604 @@ +package database + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "sort" + "strconv" + "strings" + "sync" + "time" + + "github.com/arangodb/go-driver" + "github.com/xeipuuv/gojsonschema" + + "github.com/SecurityBrewery/catalyst/caql" + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/index" +) + +func toTicket(ticketForm *models.TicketForm) (interface{}, error) { + playbooks, err := toPlaybooks(ticketForm.Playbooks) + if err != nil { + return nil, err + } + + ticket := &models.Ticket{ + Artifacts: ticketForm.Artifacts, + Comments: ticketForm.Comments, + Details: ticketForm.Details, + Files: ticketForm.Files, + Name: ticketForm.Name, + Owner: ticketForm.Owner, + Playbooks: playbooks, + Read: ticketForm.Read, + References: ticketForm.References, + Status: ticketForm.Status, + Type: ticketForm.Type, + Write: ticketForm.Write, + // ID: ticketForm.ID, + // Created: ticketForm.Created, + // Modified: ticketForm.Modified, + // Schema: ticketForm.Schema, + } + + if ticketForm.Created != nil { + ticket.Created = *ticketForm.Created + } else { + ticket.Created = time.Now().UTC() + } + if ticketForm.Modified != nil { + ticket.Modified = *ticketForm.Modified + } else { + ticket.Modified = time.Now().UTC() + } + if ticketForm.Schema != nil { + ticket.Schema = *ticketForm.Schema + } else { + ticket.Schema = "{}" + } + if ticketForm.Status == "" { + ticket.Status = "open" + } + if ticketForm.ID != nil { + return &busdb.Keyed{Key: strconv.FormatInt(*ticketForm.ID, 10), Doc: ticket}, nil + } + return ticket, nil +} + +func toTicketResponses(tickets []*models.TicketSimpleResponse) ([]*models.TicketResponse, error) { + var extendedTickets []*models.TicketResponse + for _, simple := range tickets { + tr, err := toTicketResponse(simple) + if err != nil { + return nil, err + } + extendedTickets = append(extendedTickets, tr) + } + return extendedTickets, nil +} + +func toTicketResponse(ticket *models.TicketSimpleResponse) (*models.TicketResponse, error) { + playbooks, err := toPlaybookResponses(ticket.Playbooks) + if err != nil { + return nil, err + } + + return &models.TicketResponse{ + ID: ticket.ID, + Artifacts: ticket.Artifacts, + Comments: ticket.Comments, + Created: ticket.Created, + Details: ticket.Details, + Files: ticket.Files, + Modified: ticket.Modified, + Name: ticket.Name, + Owner: ticket.Owner, + Playbooks: playbooks, + Read: ticket.Read, + References: ticket.References, + Schema: ticket.Schema, + Status: ticket.Status, + Type: ticket.Type, + Write: ticket.Write, + }, nil +} + +func toTicketSimpleResponse(key string, ticket *models.Ticket) (*models.TicketSimpleResponse, error) { + id, err := strconv.ParseInt(key, 10, 64) + if err != nil { + return nil, err + } + + return &models.TicketSimpleResponse{ + Artifacts: ticket.Artifacts, + Comments: ticket.Comments, + Created: ticket.Created, + Details: ticket.Details, + Files: ticket.Files, + ID: id, + Modified: ticket.Modified, + Name: ticket.Name, + Owner: ticket.Owner, + Playbooks: ticket.Playbooks, + Read: ticket.Read, + References: ticket.References, + Schema: ticket.Schema, + Status: ticket.Status, + Type: ticket.Type, + Write: ticket.Write, + }, nil +} + +func toTicketWithTickets(ticketResponse *models.TicketResponse, tickets []*models.TicketSimpleResponse) *models.TicketWithTickets { + return &models.TicketWithTickets{ + Artifacts: ticketResponse.Artifacts, + Comments: ticketResponse.Comments, + Created: ticketResponse.Created, + Details: ticketResponse.Details, + Files: ticketResponse.Files, + ID: ticketResponse.ID, + Modified: ticketResponse.Modified, + Name: ticketResponse.Name, + Owner: ticketResponse.Owner, + Playbooks: ticketResponse.Playbooks, + Read: ticketResponse.Read, + References: ticketResponse.References, + Schema: ticketResponse.Schema, + Status: ticketResponse.Status, + Type: ticketResponse.Type, + Write: ticketResponse.Write, + + Tickets: tickets, + } +} + +func toPlaybookResponses(playbooks map[string]*models.Playbook) (map[string]*models.PlaybookResponse, error) { + pr := map[string]*models.PlaybookResponse{} + var err error + for k, v := range playbooks { + pr[k], err = toPlaybookResponse(v) + if err != nil { + return nil, err + } + } + return pr, nil +} + +func toPlaybookResponse(playbook *models.Playbook) (*models.PlaybookResponse, error) { + graph, err := playbookGraph(playbook) + if err != nil { + return nil, err + } + + re := &models.PlaybookResponse{ + Name: playbook.Name, + Tasks: map[string]*models.TaskResponse{}, + } + + results, err := graph.Toposort() + if err != nil { + return nil, err + } + + i := 0 + for _, taskID := range results { + rootTask, err := toTaskResponse(playbook, taskID, i, graph) + if err != nil { + return nil, err + } + re.Tasks[taskID] = rootTask + i++ + } + return re, nil +} + +func (db *Database) TicketBatchCreate(ctx context.Context, ticketForms []*models.TicketForm) ([]*models.TicketResponse, error) { + update, err := db.Hooks.IngestionFilter(ctx, db.Index) + if err != nil { + return nil, err + } + + var dbTickets []interface{} + for _, ticketForm := range ticketForms { + ticket, err := toTicket(ticketForm) + if err != nil { + return nil, err + } + + if err := validate(ticket, models.TicketSchema); err != nil { + return nil, err + } + + dbTickets = append(dbTickets, ticket) + } + + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketWriteFilter(ctx) + if err != nil { + return nil, err + } + + query := `FOR d IN @tickets + ` + ticketFilterQuery + ` + LET updates = ` + update + ` + LET newdoc = LENGTH(updates) != 0 ? APPLY("MERGE_RECURSIVE", APPEND([d], updates)) : d + LET keyeddoc = HAS(newdoc, "id") ? MERGE(newdoc, {"_key": TO_STRING(newdoc.id)}) : newdoc + LET noiddoc = UNSET(keyeddoc, "id") + INSERT noiddoc INTO @@collection + RETURN NEW` + apiTickets, _, err := db.ticketListQuery(ctx, query, mergeMaps(map[string]interface{}{ + "tickets": dbTickets, + }, ticketFilterVars), busdb.CreateOperation) + if err != nil { + return nil, err + } + + if err = batchIndex(db.Index, apiTickets); err != nil { + return nil, err + } + + var ids []driver.DocumentID + for _, apiTicket := range apiTickets { + ids = append(ids, driver.NewDocumentID(TicketCollectionName, fmt.Sprint(apiTicket.ID))) + } + if err := db.BusDatabase.LogAndNotify(ctx, ids, "Ticket created"); err != nil { + return nil, err + } + + ticketResponses, err := toTicketResponses(apiTickets) + if err != nil { + return nil, err + } + + for _, ticketResponse := range ticketResponses { + for playbookID := range ticketResponse.Playbooks { + if err := runRootTask(ticketResponse, playbookID, db); err != nil { + return nil, err + } + } + } + + return ticketResponses, nil +} + +func (db *Database) IndexRebuild(ctx context.Context) error { + if err := db.Index.Truncate(); err != nil { + return err + } + + tickets, _, err := db.ticketListQuery(ctx, "FOR d IN @@collection RETURN d", nil, busdb.ReadOperation) + if err != nil { + return err + } + + return batchIndex(db.Index, tickets) +} + +func batchIndex(index *index.Index, tickets []*models.TicketSimpleResponse) error { + var wg sync.WaitGroup + var batch []*models.TicketSimpleResponse + for _, ticket := range tickets { + batch = append(batch, ticket) + + if len(batch) > 100 { + wg.Add(1) + go func(docs []*models.TicketSimpleResponse) { + index.Index(docs) + wg.Done() + }(batch) + batch = []*models.TicketSimpleResponse{} + } + } + wg.Wait() + return nil +} + +func (db *Database) TicketGet(ctx context.Context, ticketID int64) (*models.TicketWithTickets, error) { + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketReadFilter(ctx) + if err != nil { + return nil, err + } + + return db.ticketGetQuery(ctx, ticketID, `LET d = DOCUMENT(@@collection, @ID) `+ticketFilterQuery+` RETURN d`, ticketFilterVars, busdb.ReadOperation) +} + +func (db *Database) ticketGetQuery(ctx context.Context, ticketID int64, query string, bindVars map[string]interface{}, operation *busdb.Operation) (*models.TicketWithTickets, error) { + if bindVars == nil { + bindVars = map[string]interface{}{} + } + bindVars["@collection"] = TicketCollectionName + if ticketID != 0 { + bindVars["ID"] = fmt.Sprint(ticketID) + } + + cur, _, err := db.Query(ctx, query, bindVars, operation) + if err != nil { + return nil, err + } + defer cur.Close() + + ticket := models.Ticket{} + meta, err := cur.ReadDocument(ctx, &ticket) + if err != nil { + return nil, err + } + + ticketSimpleResponse, err := toTicketSimpleResponse(meta.Key, &ticket) + if err != nil { + return nil, err + } + + // index + go db.Index.Index([]*models.TicketSimpleResponse{ticketSimpleResponse}) + + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketReadFilter(ctx) + if err != nil { + return nil, err + } + + // tickets + ticketsQuery := `FOR vertex, edge IN OUTBOUND + DOCUMENT(@@tickets, @ID) + GRAPH @graph + FILTER IS_SAME_COLLECTION(@@collection, vertex) + FILTER vertex != null + LET d = DOCUMENT(@@collection, edge["_to"]) + ` + ticketFilterQuery + ` + RETURN d` + + outTickets, _, err := db.ticketListQuery(ctx, ticketsQuery, mergeMaps(map[string]interface{}{ + "ID": fmt.Sprint(ticketID), + "graph": TicketArtifactsGraphName, + "@tickets": TicketCollectionName, + }, ticketFilterVars), busdb.ReadOperation) + if err != nil { + return nil, err + } + + ticketsQuery = `FOR vertex, edge IN INBOUND + DOCUMENT(@@tickets, @ID) + GRAPH @graph + FILTER IS_SAME_COLLECTION(@@collection, vertex) + FILTER vertex != null + LET d = DOCUMENT(@@collection, edge["_from"]) + ` + ticketFilterQuery + ` + RETURN d` + + inTickets, _, err := db.ticketListQuery(ctx, ticketsQuery, mergeMaps(map[string]interface{}{ + "ID": fmt.Sprint(ticketID), + "graph": TicketArtifactsGraphName, + "@tickets": TicketCollectionName, + }, ticketFilterVars), busdb.ReadOperation) + if err != nil { + return nil, err + } + + var artifactNames []string + for _, artifact := range ticketSimpleResponse.Artifacts { + artifactNames = append(artifactNames, artifact.Name) + } + ticketsQuery = `FOR d IN @@collection + FILTER d._key != @ID + ` + ticketFilterQuery + ` + FOR a IN NOT_NULL(d.artifacts, []) + FILTER POSITION(@artifacts, a.name) + RETURN d` + sameArtifactTickets, _, err := db.ticketListQuery(ctx, ticketsQuery, mergeMaps(map[string]interface{}{ + "ID": fmt.Sprint(ticketID), + "artifacts": artifactNames, + }, ticketFilterVars), busdb.ReadOperation) + if err != nil { + return nil, err + } + + tickets := append(outTickets, inTickets...) + tickets = append(tickets, sameArtifactTickets...) + sort.Slice(tickets, func(i, j int) bool { + return tickets[i].ID < tickets[j].ID + }) + + ticketResponse, err := toTicketResponse(ticketSimpleResponse) + if err != nil { + return nil, err + } + + return toTicketWithTickets(ticketResponse, tickets), nil +} + +func (db *Database) TicketUpdate(ctx context.Context, ticketID int64, ticket *models.Ticket) (*models.TicketWithTickets, error) { + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketWriteFilter(ctx) + if err != nil { + return nil, err + } + + query := `LET d = DOCUMENT(@@collection, @ID) + ` + ticketFilterQuery + ` + REPLACE d WITH @ticket IN @@collection + RETURN NEW` + ticket.Modified = time.Now().UTC() // TODO make setable? + return db.ticketGetQuery(ctx, ticketID, query, mergeMaps(map[string]interface{}{"ticket": ticket}, ticketFilterVars), &busdb.Operation{ + OperationType: busdb.Update, Ids: []driver.DocumentID{ + driver.NewDocumentID(TicketCollectionName, strconv.FormatInt(ticketID, 10)), + }, + Msg: "Ticket updated", + }) +} + +func (db *Database) TicketDelete(ctx context.Context, ticketID int64) error { + _, err := db.TicketGet(ctx, ticketID) + if err != nil { + return err + } + + _, err = db.ticketCollection.RemoveDocument(ctx, strconv.FormatInt(ticketID, 10)) + if err != nil { + return err + } + + return nil +} + +func (db *Database) TicketList(ctx context.Context, ticketType string, query string, sorts []string, desc []bool, offset, count int64) (*models.TicketList, error) { + binVars := map[string]interface{}{} + + parser := &caql.Parser{Searcher: db.Index, Prefix: "d."} + + var typeString = "" + if ticketType != "" { + typeString = "FILTER d.type == @type " + binVars["type"] = ticketType + } + + var filterString = "" + if query != "" { + queryTree, err := parser.Parse(query) + if err != nil { + return nil, errors.New("invalid filter query: syntax error") + } + filterString, err = queryTree.String() + if err != nil { + return nil, fmt.Errorf("invalid filter query: %w", err) + } + filterString = "FILTER " + filterString + } + + documentCount, err := db.TicketCount(ctx, typeString, filterString, binVars) + if err != nil { + return nil, err + } + + sortQ := sortQuery(sorts, desc, binVars) + binVars["offset"] = offset + binVars["count"] = count + + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketReadFilter(ctx) + if err != nil { + return nil, err + } + + q := `FOR d IN @@collection + ` + ticketFilterQuery + ` + ` + sortQ + ` + ` + typeString + ` + ` + filterString + ` + LIMIT @offset, @count + SORT d._key ASC + RETURN d` + // RETURN KEEP(d, "_key", "id", "name", "type", "created")` + ticketList, _, err := db.ticketListQuery(ctx, q, mergeMaps(binVars, ticketFilterVars), busdb.ReadOperation) + return &models.TicketList{ + Count: documentCount, + Tickets: ticketList, + }, err + // return map[string]interface{}{"tickets": ticketList, "count": documentCount}, err +} + +func (db *Database) ticketListQuery(ctx context.Context, query string, bindVars map[string]interface{}, operation *busdb.Operation) ([]*models.TicketSimpleResponse, *models.LogEntry, error) { + if bindVars == nil { + bindVars = map[string]interface{}{} + } + bindVars["@collection"] = TicketCollectionName + + cursor, logEntry, err := db.Query(ctx, query, bindVars, operation) + if err != nil { + return nil, nil, err + } + defer cursor.Close() + + var docs []*models.TicketSimpleResponse + for { + doc := models.Ticket{} + meta, err := cursor.ReadDocument(ctx, &doc) + if driver.IsNoMoreDocuments(err) { + break + } else if err != nil { + return nil, nil, err + } + + resp, err := toTicketSimpleResponse(meta.Key, &doc) + if err != nil { + return nil, nil, err + } + + docs = append(docs, resp) + } + + return docs, logEntry, nil +} + +func (db *Database) TicketCount(ctx context.Context, typequery, filterquery string, bindVars map[string]interface{}) (int, error) { + if bindVars == nil { + bindVars = map[string]interface{}{} + } + bindVars["@collection"] = TicketCollectionName + + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketReadFilter(ctx) + if err != nil { + return 0, err + } + + countQuery := `RETURN LENGTH(FOR d IN @@collection ` + ticketFilterQuery + " " + typequery + " " + filterquery + ` RETURN 1)` + cursor, _, err := db.Query(ctx, countQuery, mergeMaps(bindVars, ticketFilterVars), busdb.ReadOperation) + if err != nil { + return 0, err + } + documentCount := 0 + _, err = cursor.ReadDocument(ctx, &documentCount) + if err != nil { + return 0, err + } + cursor.Close() + return documentCount, nil +} + +func sortQuery(paramsSort []string, paramsDesc []bool, bindVars map[string]interface{}) string { + sort := "" + if len(paramsSort) > 0 { + var sorts []string + for i, column := range paramsSort { + colsort := fmt.Sprintf("d.@column%d", i) + if len(paramsDesc) > i && paramsDesc[i] { + colsort += " DESC" + } + sorts = append(sorts, colsort) + bindVars[fmt.Sprintf("column%d", i)] = column + } + sort = "SORT " + strings.Join(sorts, ", ") + } + return sort +} + +func mergeMaps(a map[string]interface{}, b map[string]interface{}) map[string]interface{} { + merged := map[string]interface{}{} + for k, v := range a { + merged[k] = v + } + for k, v := range b { + merged[k] = v + } + return merged +} + +func validate(e interface{}, schema *gojsonschema.Schema) error { + b, err := json.Marshal(e) + if err != nil { + return err + } + + res, err := schema.Validate(gojsonschema.NewStringLoader(string(b))) + if err != nil { + return err + } + + if len(res.Errors()) > 0 { + var l []string + for _, e := range res.Errors() { + l = append(l, e.String()) + } + return fmt.Errorf("validation failed: %v", strings.Join(l, ", ")) + } + return nil +} diff --git a/database/ticket_field.go b/database/ticket_field.go new file mode 100644 index 0000000..7f7df2b --- /dev/null +++ b/database/ticket_field.go @@ -0,0 +1,291 @@ +package database + +import ( + "context" + "errors" + "fmt" + "time" + + "github.com/arangodb/go-driver" + "github.com/iancoleman/strcase" + "github.com/mingrammer/commonregex" + + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/pointer" +) + +func (db *Database) AddArtifact(ctx context.Context, id int64, artifact *models.Artifact) (*models.TicketWithTickets, error) { + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketWriteFilter(ctx) + if err != nil { + return nil, err + } + + if artifact.Status == nil { + artifact.Status = pointer.String("unknown") + } + + if artifact.Type == nil { + artifact.Type = pointer.String(inferType(artifact.Name)) + } + + query := `LET d = DOCUMENT(@@collection, @ID) + ` + ticketFilterQuery + ` + UPDATE d WITH { "modified": DATE_ISO8601(DATE_NOW()), "artifacts": PUSH(NOT_NULL(d.artifacts, []), @artifact) } IN @@collection + RETURN NEW` + return db.ticketGetQuery(ctx, id, query, mergeMaps(map[string]interface{}{"artifact": artifact}, ticketFilterVars), &busdb.Operation{ + OperationType: busdb.Update, + Ids: []driver.DocumentID{ + driver.DocumentID(fmt.Sprintf("%s/%d", TicketCollectionName, id)), + }, + Msg: "Add artifact", + }) +} + +func inferType(name string) string { + switch { + case commonregex.IPRegex.MatchString(name): + return "ip" + case commonregex.LinkRegex.MatchString(name): + return "url" + case commonregex.EmailRegex.MatchString(name): + return "email" + case commonregex.MD5HexRegex.MatchString(name): + return "md5" + case commonregex.SHA1HexRegex.MatchString(name): + return "sha1" + case commonregex.SHA256HexRegex.MatchString(name): + return "sha256" + } + return "unknown" +} + +func (db *Database) RemoveArtifact(ctx context.Context, id int64, name string) (*models.TicketWithTickets, error) { + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketWriteFilter(ctx) + if err != nil { + return nil, err + } + + query := `LET d = DOCUMENT(@@collection, @ID) + ` + ticketFilterQuery + ` + FOR a IN NOT_NULL(d.artifacts, []) + FILTER a.name == @name + LET newartifacts = REMOVE_VALUE(d.artifacts, a) + UPDATE d WITH { "modified": DATE_ISO8601(DATE_NOW()), "artifacts": newartifacts } IN @@collection + RETURN NEW` + return db.ticketGetQuery(ctx, id, query, mergeMaps(map[string]interface{}{"name": name}, ticketFilterVars), &busdb.Operation{ + OperationType: busdb.Update, + Ids: []driver.DocumentID{ + driver.DocumentID(fmt.Sprintf("%s/%d", TicketCollectionName, id)), + }, + Msg: "Remove artifact", + }) +} + +func (db *Database) SetTemplate(ctx context.Context, id int64, schema string) (*models.TicketWithTickets, error) { + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketWriteFilter(ctx) + if err != nil { + return nil, err + } + + query := `LET d = DOCUMENT(@@collection, @ID) + ` + ticketFilterQuery + ` + UPDATE d WITH { "schema": @schema } IN @@collection + RETURN NEW` + return db.ticketGetQuery(ctx, id, query, mergeMaps(map[string]interface{}{"schema": schema}, ticketFilterVars), &busdb.Operation{ + OperationType: busdb.Update, + Ids: []driver.DocumentID{ + driver.DocumentID(fmt.Sprintf("%s/%d", TicketCollectionName, id)), + }, + Msg: "Set Template", + }) +} + +func (db *Database) AddComment(ctx context.Context, id int64, comment *models.CommentForm) (*models.TicketWithTickets, error) { + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketWriteFilter(ctx) + if err != nil { + return nil, err + } + + if comment.Creator == nil || *comment.Creator == "" { + user, exists := busdb.UserFromContext(ctx) + if !exists { + return nil, errors.New("no user in context") + } + + comment.Creator = pointer.String(user.ID) + } + + if comment.Created == nil { + comment.Created = pointer.Time(time.Now().UTC()) + } + + query := `LET d = DOCUMENT(@@collection, @ID) + ` + ticketFilterQuery + ` + UPDATE d WITH { "modified": DATE_ISO8601(DATE_NOW()), "comments": PUSH(NOT_NULL(d.comments, []), @comment) } IN @@collection + RETURN NEW` + return db.ticketGetQuery(ctx, id, query, mergeMaps(map[string]interface{}{"comment": comment}, ticketFilterVars), &busdb.Operation{ + OperationType: busdb.Update, + Ids: []driver.DocumentID{ + driver.DocumentID(fmt.Sprintf("%s/%d", TicketCollectionName, id)), + }, + Msg: "Add comment", + }) +} + +func (db *Database) RemoveComment(ctx context.Context, id int64, commentID int64) (*models.TicketWithTickets, error) { + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketWriteFilter(ctx) + if err != nil { + return nil, err + } + + query := `LET d = DOCUMENT(@@collection, @ID) + ` + ticketFilterQuery + ` + UPDATE d WITH { "modified": DATE_ISO8601(DATE_NOW()), "comments": REMOVE_NTH(d.comments, @commentID) } IN @@collection + RETURN NEW` + return db.ticketGetQuery(ctx, id, query, mergeMaps(map[string]interface{}{"commentID": commentID}, ticketFilterVars), &busdb.Operation{ + OperationType: busdb.Update, + Ids: []driver.DocumentID{ + driver.DocumentID(fmt.Sprintf("%s/%d", TicketCollectionName, id)), + }, + Msg: "Remove comment", + }) +} + +func (db *Database) SetReferences(ctx context.Context, id int64, references []*models.Reference) (*models.TicketWithTickets, error) { + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketWriteFilter(ctx) + if err != nil { + return nil, err + } + + query := `LET d = DOCUMENT(@@collection, @ID) + ` + ticketFilterQuery + ` + UPDATE d WITH { "modified": DATE_ISO8601(DATE_NOW()), "references": @references } IN @@collection + RETURN NEW` + return db.ticketGetQuery(ctx, id, query, mergeMaps(map[string]interface{}{"references": references}, ticketFilterVars), &busdb.Operation{ + OperationType: busdb.Update, + Ids: []driver.DocumentID{ + driver.DocumentID(fmt.Sprintf("%s/%d", TicketCollectionName, id)), + }, + Msg: "Changed references", + }) +} + +func (db *Database) LinkFiles(ctx context.Context, id int64, files []*models.File) (*models.TicketWithTickets, error) { + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketWriteFilter(ctx) + if err != nil { + return nil, err + } + + query := `LET d = DOCUMENT(@@collection, @ID) + ` + ticketFilterQuery + ` + UPDATE d WITH { "modified": DATE_ISO8601(DATE_NOW()), "files": @files } IN @@collection + RETURN NEW` + return db.ticketGetQuery(ctx, id, query, mergeMaps(map[string]interface{}{"files": files}, ticketFilterVars), &busdb.Operation{ + OperationType: busdb.Update, + Ids: []driver.DocumentID{ + driver.DocumentID(fmt.Sprintf("%s/%d", TicketCollectionName, id)), + }, + Msg: "Linked files", + }) +} + +func (db *Database) AddTicketPlaybook(ctx context.Context, id int64, playbookTemplate *models.PlaybookTemplateForm) (*models.TicketWithTickets, error) { + pb, err := toPlaybook(playbookTemplate) + if err != nil { + return nil, err + } + + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketWriteFilter(ctx) + if err != nil { + return nil, err + } + + playbookID := strcase.ToKebab(pb.Name) + if playbookTemplate.ID != nil { + playbookID = *playbookTemplate.ID + } + + parentTicket, err := db.TicketGet(ctx, id) + if err != nil { + return nil, err + } + + query := `FOR d IN @@collection + ` + ticketFilterQuery + ` + FILTER d._key == @ID + LET newplaybook = ZIP( [@playbookID], [@playbook] ) + LET newplaybooks = MERGE(NOT_NULL(d.playbooks, {}), newplaybook) + LET newticket = MERGE(d, { "modified": DATE_ISO8601(DATE_NOW()), "playbooks": newplaybooks }) + REPLACE d WITH newticket IN @@collection + RETURN NEW` + ticket, err := db.ticketGetQuery(ctx, id, query, mergeMaps(map[string]interface{}{ + "playbook": pb, + "playbookID": findName(parentTicket.Playbooks, playbookID), + }, ticketFilterVars), &busdb.Operation{ + OperationType: busdb.Update, + Ids: []driver.DocumentID{ + driver.NewDocumentID(TicketCollectionName, fmt.Sprintf("%d", id)), + }, + Msg: "Added playbook", + }) + if err != nil { + return nil, err + } + + if err := runRootTask(extractTicketResponse(ticket), playbookID, db); err != nil { + return nil, err + } + + return ticket, nil +} + +func findName(playbooks map[string]*models.PlaybookResponse, name string) string { + if _, ok := playbooks[name]; !ok { + return name + } + + for i := 0; ; i++ { + try := fmt.Sprintf("%s%d", name, i) + if _, ok := playbooks[try]; !ok { + return try + } + } +} + +func runRootTask(ticket *models.TicketResponse, playbookID string, db *Database) error { + playbook := ticket.Playbooks[playbookID] + + var root *models.TaskResponse + for _, task := range playbook.Tasks { + if task.Order == 0 { + root = task + } + } + + runNextTasks(ticket.ID, playbookID, root.Next, root.Data, ticket, db) + return nil +} + +func (db *Database) RemoveTicketPlaybook(ctx context.Context, id int64, playbookID string) (*models.TicketWithTickets, error) { + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketWriteFilter(ctx) + if err != nil { + return nil, err + } + + query := `FOR d IN @@collection + ` + ticketFilterQuery + ` + FILTER d._key == @ID + LET newplaybooks = UNSET(d.playbooks, @playbookID) + REPLACE d WITH MERGE(d, { "modified": DATE_ISO8601(DATE_NOW()), "playbooks": newplaybooks }) IN @@collection + RETURN NEW` + return db.ticketGetQuery(ctx, id, query, mergeMaps(map[string]interface{}{ + "playbookID": playbookID, + }, ticketFilterVars), &busdb.Operation{ + OperationType: busdb.Update, + Ids: []driver.DocumentID{ + driver.NewDocumentID(TicketCollectionName, fmt.Sprintf("%d", id)), + }, + Msg: fmt.Sprintf("Removed playbook %s", playbookID), + }) +} diff --git a/database/ticket_task.go b/database/ticket_task.go new file mode 100644 index 0000000..2c119af --- /dev/null +++ b/database/ticket_task.go @@ -0,0 +1,186 @@ +package database + +import ( + "context" + "errors" + "fmt" + "log" + "time" + + "github.com/arangodb/go-driver" + "github.com/google/uuid" + + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" +) + +func (db *Database) TaskGet(ctx context.Context, id int64, playbookID string, taskID string) (*models.TicketWithTickets, *models.PlaybookResponse, *models.TaskWithContext, error) { + inc, err := db.TicketGet(ctx, id) + if err != nil { + return nil, nil, nil, err + } + + playbook, ok := inc.Playbooks[playbookID] + if !ok { + return nil, nil, nil, errors.New("playbook does not exist") + } + + task, ok := playbook.Tasks[taskID] + if !ok { + return nil, nil, nil, errors.New("task does not exist") + } + + return inc, playbook, &models.TaskWithContext{ + PlaybookId: playbookID, + PlaybookName: playbook.Name, + TaskId: taskID, + Task: *task, + TicketId: id, + TicketName: inc.Name, + }, nil +} + +func (db *Database) TaskComplete(ctx context.Context, id int64, playbookID string, taskID string, data interface{}) (*models.TicketWithTickets, error) { + inc, err := db.TicketGet(ctx, id) + if err != nil { + return nil, err + } + + completable := inc.Playbooks[playbookID].Tasks[taskID].Active + if !completable { + return nil, errors.New("cannot be completed") + } + + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketWriteFilter(ctx) + if err != nil { + return nil, err + } + + query := `LET d = DOCUMENT(@@collection, @ID) + ` + ticketFilterQuery + ` + LET playbook = d.playbooks[@playbookID] + LET task = playbook.tasks[@taskID] + LET newtask = MERGE(task, {"data": NOT_NULL(@data, {}), "done": true, closed: @closed }) + LET newtasks = MERGE(playbook.tasks, { @taskID: newtask } ) + LET newplaybook = MERGE(playbook, {"tasks": newtasks}) + LET newplaybooks = MERGE(d.playbooks, { @playbookID: newplaybook } ) + + UPDATE d WITH { "modified": DATE_ISO8601(DATE_NOW()), "playbooks": newplaybooks } IN @@collection + RETURN NEW` + ticket, err := db.ticketGetQuery(ctx, id, query, mergeMaps(map[string]interface{}{ + "playbookID": playbookID, + "taskID": taskID, + "data": data, + "closed": time.Now().UTC(), + }, ticketFilterVars), &busdb.Operation{ + OperationType: busdb.Update, + Ids: []driver.DocumentID{ + driver.NewDocumentID(TicketCollectionName, fmt.Sprintf("%d", id)), + }, + Msg: fmt.Sprintf("Completed task %s in playbook %s", taskID, playbookID), + }) + if err != nil { + return nil, err + } + + playbook := ticket.Playbooks[playbookID] + task := playbook.Tasks[taskID] + + runNextTasks(id, playbookID, task.Next, task.Data, extractTicketResponse(ticket), db) + + return ticket, nil +} + +func extractTicketResponse(ticket *models.TicketWithTickets) *models.TicketResponse { + return &models.TicketResponse{ + Artifacts: ticket.Artifacts, + Comments: ticket.Comments, + Created: ticket.Created, + Details: ticket.Details, + Files: ticket.Files, + ID: ticket.ID, + Modified: ticket.Modified, + Name: ticket.Name, + Owner: ticket.Owner, + Playbooks: ticket.Playbooks, + Read: ticket.Read, + References: ticket.References, + Schema: ticket.Schema, + Status: ticket.Status, + Type: ticket.Type, + Write: ticket.Write, + } +} + +func (db *Database) TaskUpdate(ctx context.Context, id int64, playbookID string, taskID string, task *models.Task) (*models.TicketWithTickets, error) { + ticketFilterQuery, ticketFilterVars, err := db.Hooks.TicketWriteFilter(ctx) + if err != nil { + return nil, err + } + + query := `LET d = DOCUMENT(@@collection, @ID) + ` + ticketFilterQuery + ` + LET playbook = d.playbooks[@playbookID] + LET newtasks = MERGE(playbook.tasks, { @taskID: @task } ) + LET newplaybook = MERGE(playbook, {"tasks": newtasks}) + LET newplaybooks = MERGE(d.playbooks, { @playbookID: newplaybook } ) + + UPDATE d WITH { "modified": DATE_ISO8601(DATE_NOW()), "playbooks": newplaybooks } IN @@collection + RETURN NEW` + ticket, err := db.ticketGetQuery(ctx, id, query, mergeMaps(map[string]interface{}{ + "playbookID": playbookID, + "taskID": taskID, + "task": task, + }, ticketFilterVars), &busdb.Operation{ + OperationType: busdb.Update, + Ids: []driver.DocumentID{ + driver.NewDocumentID(TicketCollectionName, fmt.Sprintf("%d", id)), + }, + Msg: fmt.Sprintf("Saved task %s in playbook %s", taskID, playbookID), + }) + if err != nil { + return nil, err + } + + return ticket, nil +} + +func (db *Database) TaskRun(ctx context.Context, id int64, playbookID string, taskID string) error { + ticket, _, task, err := db.TaskGet(ctx, id, playbookID, taskID) + if err != nil { + return err + } + + if task.Task.Type == models.TaskTypeAutomation { + if err := runTask(id, playbookID, taskID, &task.Task, extractTicketResponse(ticket), db); err != nil { + return err + } + } + + return nil +} + +func runNextTasks(id int64, playbookID string, next map[string]string, data interface{}, ticket *models.TicketResponse, db *Database) { + for nextTaskID, requirement := range next { + nextTask := ticket.Playbooks[playbookID].Tasks[nextTaskID] + if nextTask.Type == models.TaskTypeAutomation { + b, err := evalRequirement(requirement, data) + if err != nil { + continue + } + if b { + if err := runTask(id, playbookID, nextTaskID, nextTask, ticket, db); err != nil { + log.Println(err) + } + } + } + } +} + +func runTask(ticketID int64, playbookID string, taskID string, task *models.TaskResponse, ticket *models.TicketResponse, db *Database) error { + playbook := ticket.Playbooks[playbookID] + msgContext := &models.Context{Playbook: playbook, Task: task, Ticket: ticket} + origin := &models.Origin{TaskOrigin: &models.TaskOrigin{TaskId: taskID, PlaybookId: playbookID, TicketId: ticketID}} + jobID := uuid.NewString() + return publishJobMapping(jobID, *task.Automation, msgContext, origin, task.Payload, db) +} diff --git a/database/tickettype.go b/database/tickettype.go new file mode 100644 index 0000000..f4581bc --- /dev/null +++ b/database/tickettype.go @@ -0,0 +1,101 @@ +package database + +import ( + "context" + "errors" + + "github.com/arangodb/go-driver" + "github.com/iancoleman/strcase" + + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" +) + +func toTicketType(doc *models.TicketTypeForm) *models.TicketType { + return &models.TicketType{ + Name: doc.Name, + Icon: doc.Icon, + DefaultPlaybooks: doc.DefaultPlaybooks, + DefaultTemplate: doc.DefaultTemplate, + DefaultGroups: doc.DefaultGroups, + } +} + +func toTicketTypeResponse(key string, doc *models.TicketType) *models.TicketTypeResponse { + return &models.TicketTypeResponse{ + ID: key, + Name: doc.Name, + Icon: doc.Icon, + DefaultPlaybooks: doc.DefaultPlaybooks, + DefaultTemplate: doc.DefaultTemplate, + DefaultGroups: doc.DefaultGroups, + } +} + +func (db *Database) TicketTypeCreate(ctx context.Context, tickettype *models.TicketTypeForm) (*models.TicketTypeResponse, error) { + if tickettype == nil { + return nil, errors.New("requires ticket type") + } + if tickettype.Name == "" { + return nil, errors.New("requires ticket type name") + } + + var doc models.TicketType + newctx := driver.WithReturnNew(ctx, &doc) + + meta, err := db.tickettypeCollection.CreateDocument(ctx, newctx, strcase.ToKebab(tickettype.Name), toTicketType(tickettype)) + if err != nil { + return nil, err + } + + return toTicketTypeResponse(meta.Key, &doc), nil +} + +func (db *Database) TicketTypeGet(ctx context.Context, id string) (*models.TicketTypeResponse, error) { + var doc models.TicketType + meta, err := db.tickettypeCollection.ReadDocument(ctx, id, &doc) + if err != nil { + return nil, err + } + + return toTicketTypeResponse(meta.Key, &doc), nil +} + +func (db *Database) TicketTypeUpdate(ctx context.Context, id string, tickettype *models.TicketTypeForm) (*models.TicketTypeResponse, error) { + var doc models.TicketType + ctx = driver.WithReturnNew(ctx, &doc) + + meta, err := db.tickettypeCollection.ReplaceDocument(ctx, id, toTicketType(tickettype)) + if err != nil { + return nil, err + } + + return toTicketTypeResponse(meta.Key, &doc), nil +} + +func (db *Database) TicketTypeDelete(ctx context.Context, id string) error { + _, err := db.tickettypeCollection.RemoveDocument(ctx, id) + return err +} + +func (db *Database) TicketTypeList(ctx context.Context) ([]*models.TicketTypeResponse, error) { + query := "FOR d IN @@collection RETURN d" + cursor, _, err := db.Query(ctx, query, map[string]interface{}{"@collection": TicketTypeCollectionName}, busdb.ReadOperation) + if err != nil { + return nil, err + } + defer cursor.Close() + var docs []*models.TicketTypeResponse + for { + var doc models.TicketType + meta, err := cursor.ReadDocument(ctx, &doc) + if driver.IsNoMoreDocuments(err) { + break + } else if err != nil { + return nil, err + } + docs = append(docs, toTicketTypeResponse(meta.Key, &doc)) + } + + return docs, err +} diff --git a/database/user.go b/database/user.go new file mode 100644 index 0000000..2a03baf --- /dev/null +++ b/database/user.go @@ -0,0 +1,201 @@ +package database + +import ( + "context" + "crypto/sha256" + "errors" + "fmt" + "math/rand" + "time" + + "github.com/arangodb/go-driver" + "github.com/gin-gonic/gin" + "github.com/iancoleman/strcase" + + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/pointer" + "github.com/SecurityBrewery/catalyst/role" +) + +var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_") + +func init() { + rand.Seed(time.Now().UnixNano()) +} + +func generateKey() string { + b := make([]rune, 32) + for i := range b { + b[i] = letters[rand.Intn(len(letters))] + } + return string(b) +} + +func toUser(user *models.UserForm, sha256 *string) *models.User { + roles := []string{} + roles = append(roles, role.Strings(role.Explodes(user.Roles))...) + u := &models.User{ + Blocked: user.Blocked, + Roles: roles, + Sha256: sha256, + Apikey: user.Apikey, + } + + // log.Println(u) + // b, _ := json.Marshal(u) + // loader := gojsonschema.NewBytesLoader(b) + // res, err := models.UserSchema.Validate(loader) + // if err != nil { + // log.Println(err) + // } + // log.Println(res.Errors()) + + return u +} + +func toUserResponse(key string, user *models.User) *models.UserResponse { + return &models.UserResponse{ + ID: key, + Roles: user.Roles, + Blocked: user.Blocked, + Apikey: user.Apikey, + } +} + +func toNewUserResponse(key string, user *models.User, secret *string) *models.NewUserResponse { + return &models.NewUserResponse{ + ID: key, + Roles: user.Roles, + Secret: secret, + Blocked: user.Blocked, + } +} + +func (db *Database) UserGetOrCreate(ctx *gin.Context, newUser *models.UserForm) (*models.UserResponse, error) { + user, err := db.UserGet(ctx, newUser.ID) + if err != nil { + newUser, err := db.UserCreate(ctx, newUser) + if err != nil { + return nil, err + } + return &models.UserResponse{ID: newUser.ID, Roles: newUser.Roles, Blocked: newUser.Blocked}, nil + } + return user, nil +} + +func (db *Database) UserCreate(ctx context.Context, newUser *models.UserForm) (*models.NewUserResponse, error) { + var key string + var hash *string + if newUser.Apikey { + key = generateKey() + hash = pointer.String(fmt.Sprintf("%x", sha256.Sum256([]byte(key)))) + } + + var doc models.User + newctx := driver.WithReturnNew(ctx, &doc) + meta, err := db.userCollection.CreateDocument(ctx, newctx, strcase.ToKebab(newUser.ID), toUser(newUser, hash)) + if err != nil { + return nil, err + } + + return toNewUserResponse(meta.Key, &doc, pointer.String(key)), nil +} + +func (db *Database) UserCreateSetupAPIKey(ctx context.Context, key string) (*models.UserResponse, error) { + newUser := &models.UserForm{ + ID: "setup", + Roles: []string{role.Admin}, + Apikey: true, + Blocked: false, + } + hash := pointer.String(fmt.Sprintf("%x", sha256.Sum256([]byte(key)))) + + var doc models.User + newctx := driver.WithReturnNew(ctx, &doc) + meta, err := db.userCollection.CreateDocument(ctx, newctx, strcase.ToKebab(newUser.ID), toUser(newUser, hash)) + if err != nil { + return nil, err + } + + return toUserResponse(meta.Key, &doc), nil +} + +func (db *Database) UserGet(ctx context.Context, id string) (*models.UserResponse, error) { + var doc models.User + meta, err := db.userCollection.ReadDocument(ctx, id, &doc) + if err != nil { + return nil, err + } + + return toUserResponse(meta.Key, &doc), nil +} + +func (db *Database) UserDelete(ctx context.Context, id string) error { + _, err := db.userCollection.RemoveDocument(ctx, id) + return err +} + +func (db *Database) UserList(ctx context.Context) ([]*models.UserResponse, error) { + query := "FOR d IN @@collection RETURN d" + cursor, _, err := db.Query(ctx, query, map[string]interface{}{"@collection": UserCollectionName}, busdb.ReadOperation) + if err != nil { + return nil, err + } + defer cursor.Close() + var docs []*models.UserResponse + for { + var doc models.User + meta, err := cursor.ReadDocument(ctx, &doc) + if driver.IsNoMoreDocuments(err) { + break + } else if err != nil { + return nil, err + } + doc.Sha256 = nil + docs = append(docs, toUserResponse(meta.Key, &doc)) + } + + return docs, err +} + +func (db *Database) UserByHash(ctx context.Context, sha256 string) (*models.UserResponse, error) { + query := `FOR d in @@collection + FILTER d.sha256 == @sha256 + RETURN d` + + cursor, _, err := db.Query(ctx, query, map[string]interface{}{"@collection": UserCollectionName, "sha256": sha256}, busdb.ReadOperation) + if err != nil { + return nil, err + } + defer cursor.Close() + + var doc models.User + meta, err := cursor.ReadDocument(ctx, &doc) + if err != nil { + return nil, err + } + + return toUserResponse(meta.Key, &doc), err +} + +func (db *Database) UserUpdate(ctx context.Context, id string, user *models.UserForm) (*models.UserResponse, error) { + var doc models.User + _, err := db.userCollection.ReadDocument(ctx, id, &doc) + if err != nil { + return nil, err + } + + if doc.Sha256 != nil { + return nil, errors.New("cannot update an API key") + } + + ctx = driver.WithReturnNew(ctx, &doc) + + meta, err := db.userCollection.ReplaceDocument(ctx, id, toUser(user, nil)) + if err != nil { + return nil, err + } + + return toUserResponse(meta.Key, &doc), nil +} diff --git a/definition/CAQLLexer.g4 b/definition/CAQLLexer.g4 new file mode 100644 index 0000000..45def35 --- /dev/null +++ b/definition/CAQLLexer.g4 @@ -0,0 +1,160 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2020 by Martin Mirchev + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Project : sqlite-parser; an ANTLR4 grammar for SQLite https://github.com/bkiers/sqlite-parser + * Developed by : Bart Kiers, bart@big-o.nl + */ + +// $antlr-format alignTrailingComments on, columnLimit 150, maxEmptyLinesToKeep 1, reflowComments off, useTab off +// $antlr-format allowShortRulesOnASingleLine on, alignSemicolons ownLine + +lexer grammar CAQLLexer; + +channels { ERRORCHANNEL } + + +DOT: '.'; + +// https://github.com/arangodb/arangodb/blob/devel/arangod/Aql/grammar.y +T_REGEX_MATCH: '=~'; // "~= operator" +T_REGEX_NON_MATCH: '!~'; // "~! operator" + +T_EQ: '=='; // "== operator"; +T_NE: '!='; // "!= operator"; +T_LT: '<'; // "< operator"; +T_GT: '>'; // "> operator"; +T_LE: '<='; // "<= operator"; +T_GE: '>='; // ">= operator"; + +T_PLUS: '+'; // "+ operator" +T_MINUS: '-'; // "- operator" +T_TIMES: '*'; // "* operator" +T_DIV: '/'; // "/ operator" +T_MOD: '%'; // "% operator" + +T_QUESTION: '?'; // "?" +T_COLON: ':'; // ":" +T_SCOPE: '::'; // "::" +T_RANGE: '..'; // ".." + +T_COMMA: ','; // "," +T_OPEN: '('; // "(" +T_CLOSE: ')'; // ")" +T_OBJECT_OPEN: '{'; // "{" +T_OBJECT_CLOSE: '}'; // "}" +T_ARRAY_OPEN: '['; // "[" +T_ARRAY_CLOSE: ']'; // "]" + + +// https://www.arangodb.com/docs/stable/aql/fundamentals-syntax.html#keywords +T_AGGREGATE: A G G R E G A T E; +T_ALL: A L L; +T_AND: (A N D | '&&'); +T_ANY: A N Y; +T_ASC: A S C; +T_COLLECT: C O L L E C T; +T_DESC: D E S C; +T_DISTINCT: D I S T I N C T; +T_FALSE: F A L S E; +T_FILTER: F I L T E R; +T_FOR: F O R; +T_GRAPH: G R A P H; +T_IN: I N; +T_INBOUND: I N B O U N D; +T_INSERT: I N S E R T; +T_INTO: I N T O; +T_K_SHORTEST_PATHS: K '_' S H O R T E S T '_' P A T H S; +T_LET: L E T; +T_LIKE: L I K E; +T_LIMIT: L I M I T; +T_NONE: N O N E; +T_NOT: (N O T | '!'); +T_NULL: N U L L; +T_OR: (O R | '||'); +T_OUTBOUND: O U T B O U N D; +T_REMOVE: R E M O V E; +T_REPLACE: R E P L A C E; +T_RETURN: R E T U R N; +T_SHORTEST_PATH: S H O R T E S T '_' P A T H; +T_SORT: S O R T; +T_TRUE: T R U E; +T_UPDATE: U P D A T E; +T_UPSERT: U P S E R T; +T_WITH: W I T H; + +T_KEEP: K E E P; +T_COUNT: C O U N T; +T_OPTIONS: O P T I O N S; +T_PRUNE: P R U N E; +T_SEARCH: S E A R C H; +T_TO: T O; + +T_CURRENT: C U R R E N T; +T_NEW: N E W; +T_OLD: O L D; + +T_STRING: [a-zA-Z_] [a-zA-Z_0-9]*; + +T_INT: [1-9] DIGIT* | '0' | '0x' HEX_DIGIT+ | '0b' [0-1]+; +T_FLOAT: ( [1-9] DIGIT* | '0' )? '.' DIGIT+ (E [-+]? DIGIT+)?; + +T_PARAMETER: '@' T_STRING; + +T_QUOTED_STRING: ('\'' ('\\'. | '\'\'' | ~('\'' | '\\'))* '\'' | '"' ( '\\'. | '""' | ~('"'| '\\') )* '"'); + +SINGLE_LINE_COMMENT: '//' ~[\r\n]* (('\r'? '\n') | EOF) -> channel(HIDDEN); + +MULTILINE_COMMENT: '/*' .*? '*/' -> channel(HIDDEN); + +SPACES: [ \u000B\t\r\n] -> channel(HIDDEN); + +UNEXPECTED_CHAR: .; + +fragment HEX_DIGIT: [0-9a-fA-F]; +fragment DIGIT: [0-9]; + +fragment A: [aA]; +fragment B: [bB]; +fragment C: [cC]; +fragment D: [dD]; +fragment E: [eE]; +fragment F: [fF]; +fragment G: [gG]; +fragment H: [hH]; +fragment I: [iI]; +fragment J: [jJ]; +fragment K: [kK]; +fragment L: [lL]; +fragment M: [mM]; +fragment N: [nN]; +fragment O: [oO]; +fragment P: [pP]; +fragment Q: [qQ]; +fragment R: [rR]; +fragment S: [sS]; +fragment T: [tT]; +fragment U: [uU]; +fragment V: [vV]; +fragment W: [wW]; +fragment X: [xX]; +fragment Y: [yY]; +fragment Z: [zZ]; + +ERROR_RECONGNIGION: . -> channel(ERRORCHANNEL); diff --git a/definition/CAQLParser.g4 b/definition/CAQLParser.g4 new file mode 100644 index 0000000..ffa84a7 --- /dev/null +++ b/definition/CAQLParser.g4 @@ -0,0 +1,109 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2014 by Bart Kiers + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Project : sqlite-parser; an ANTLR4 grammar for SQLite https://github.com/bkiers/sqlite-parser + * Developed by: + * Bart Kiers, bart@big-o.nl + * Martin Mirchev, marti_2203@abv.bg + * Mike Lische, mike@lischke-online.de + */ + +// $antlr-format alignTrailingComments on, columnLimit 130, minEmptyLines 1, maxEmptyLinesToKeep 1, reflowComments off +// $antlr-format useTab off, allowShortRulesOnASingleLine off, allowShortBlocksOnASingleLine on, alignSemicolons ownLine + +parser grammar CAQLParser; + +options { + tokenVocab = CAQLLexer; +} + +parse: expression EOF +; + +expression: + value_literal + | reference + | operator_unary + | expression (T_PLUS|T_MINUS) expression + | expression (T_TIMES|T_DIV|T_MOD) expression + | expression T_RANGE expression + | expression (T_LT|T_GT|T_LE|T_GE) expression + | expression T_NOT? T_IN expression + | expression (T_EQ|T_NE) expression + | expression (T_ALL|T_ANY|T_NONE) eq_op=(T_EQ|T_NE|T_LT|T_GT|T_LE|T_GE|T_IN) expression + | expression (T_ALL|T_ANY|T_NONE) T_NOT T_IN expression + | expression T_NOT? (T_LIKE|T_REGEX_MATCH|T_REGEX_NON_MATCH) expression + | expression T_AND expression + | expression T_OR expression + | expression T_QUESTION expression T_COLON expression + | expression T_QUESTION T_COLON expression +; + +operator_unary: ( + T_PLUS expression + | T_MINUS expression + | T_NOT expression +); + +reference: + T_STRING + | compound_value + | function_call + | T_OPEN expression T_CLOSE + | reference DOT T_STRING + | reference T_ARRAY_OPEN expression T_ARRAY_CLOSE +; + +compound_value: ( + array + | object +); + +function_call: ( + T_STRING T_OPEN expression? (T_COMMA expression)*? T_COMMA? T_CLOSE +); + +value_literal: ( + T_QUOTED_STRING + | T_INT + | T_FLOAT + | T_NULL + | T_TRUE + | T_FALSE +); + +array:( + T_ARRAY_OPEN expression? (T_COMMA expression)*? T_COMMA? T_ARRAY_CLOSE +); + +object: + T_OBJECT_OPEN object_element? (T_COMMA object_element)* T_COMMA? T_OBJECT_CLOSE +; + +object_element:( + T_STRING + | object_element_name T_COLON expression + | T_ARRAY_OPEN expression T_ARRAY_CLOSE T_COLON expression +); + +object_element_name:( + T_STRING + | T_QUOTED_STRING +); diff --git a/definition/artifacts.yaml b/definition/artifacts.yaml new file mode 100644 index 0000000..346f22b --- /dev/null +++ b/definition/artifacts.yaml @@ -0,0 +1,29 @@ +swagger: "2.0" +info: { version: "", title: "" } + +paths: { } + +definitions: + Artifact: + type: object + required: [ name ] + properties: + name: { type: string, example: "2.2.2.2" } + type: { type: string } + status: { type: string, example: "Unknown" } + enrichments: { type: object, additionalProperties: { $ref: "#/definitions/Enrichment" } } + + EnrichmentForm: + type: object + required: [ name, data ] + properties: + name: { type: string, example: "hash.sha1" } + data: { type: object, example: { "hash": "b7a067a742c20d07a7456646de89bc2d408a1153" } } + + Enrichment: + type: object + required: [ name, data, created ] + properties: + name: { type: string, example: "hash.sha1" } + data: { type: object, example: { "hash": "b7a067a742c20d07a7456646de89bc2d408a1153" } } + created: { type: string, format: "date-time", example: "1985-04-12T23:20:50.52Z" } diff --git a/definition/automation.yaml b/definition/automation.yaml new file mode 100644 index 0000000..92f1acb --- /dev/null +++ b/definition/automation.yaml @@ -0,0 +1,165 @@ +swagger: "2.0" +info: { version: "", title: "" } + +paths: + /automations: + get: + tags: [ "automations" ] + summary: "List automations" + operationId: "listAutomations" + responses: + "200": + description: "successful operation" + schema: { type: array, items: { $ref: "#/definitions/AutomationResponse" } } + examples: + test: + - id: comment + image: "docker.io/python:3" + script: "" + type: [ playbook ] + - id: hash.sha1 + image: "docker.io/python:3" + script: "" + type: [ global, artifact, playbook ] + schema: "{\"title\":\"Input\",\"type\":\"object\",\"properties\":{\"default\":{\"type\":\"string\",\"title\":\"Value\"}},\"required\":[\"default\"]}" + - id: thehive + image: "docker.io/python:3" + script: "" + type: [ global ] + schema: "{\"title\":\"TheHive credentials\",\"type\":\"object\",\"properties\":{\"thehiveurl\":{\"type\":\"string\",\"title\":\"TheHive URL (e.g. 'https://thehive.example.org')\"},\"thehivekey\":{\"type\":\"string\",\"title\":\"TheHive API Key\"},\"skip_files\":{\"type\":\"boolean\", \"default\": true, \"title\":\"Skip Files (much faster)\"},\"keep_ids\":{\"type\":\"boolean\", \"default\": true, \"title\":\"Keep IDs and overwrite existing IDs\"}},\"required\":[\"thehiveurl\", \"thehivekey\", \"skip_files\", \"keep_ids\"]}" + - id: vt.hash + image: "docker.io/python:3" + script: "" + type: [ global, artifact, playbook ] + schema: "{\"title\":\"Input\",\"type\":\"object\",\"properties\":{\"default\":{\"type\":\"string\",\"title\":\"Value\"}},\"required\":[\"default\"]}" + security: [ { roles: [ "automation:read" ] } ] + post: + tags: [ "automations" ] + summary: "Create a new automation" + operationId: "createAutomation" + parameters: + - { name: "automation", in: "body", description: "New automation", required: true, schema: { $ref: "#/definitions/AutomationForm" }, x-example: { id: "hash-sha-256", image: "docker.io/python:3", script: "import sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha256 = hashlib.sha256(msg['payload']['default'].encode('utf-8'))\n return {'hash': sha256.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", type: [ global ] } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/AutomationResponse" } + examples: + test: + id: "hash-sha-256" + image: "docker.io/python:3" + type: [ global ] + script: | + import sys + import json + import hashlib + + + def run(msg): + sha256 = hashlib.sha256(msg['payload']['default'].encode('utf-8')) + return {'hash': sha256.hexdigest()} + + + print(json.dumps(run(json.loads(sys.argv[1])))) + + security: [ { roles: [ "automation:write" ] } ] + + /automations/{id}: + get: + tags: [ "automations" ] + summary: "Get a single automation" + operationId: "getAutomation" + parameters: + - { name: "id", in: "path", description: "Automation ID", required: true, type: string, x-example: "hash.sha1" } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/AutomationResponse" } + examples: + test: + id: hash.sha1 + image: "docker.io/python:3" + type: [ global, artifact, playbook ] + schema: "{\"title\":\"Input\",\"type\":\"object\",\"properties\":{\"default\":{\"type\":\"string\",\"title\":\"Value\"}},\"required\":[\"default\"]}" + script: | + #!/usr/bin/env python + + import sys + import json + import hashlib + + + def run(msg): + sha1 = hashlib.sha1(msg['payload']['default'].encode('utf-8')) + return {"hash": sha1.hexdigest()} + + + print(json.dumps(run(json.loads(sys.argv[1])))) + security: [ { roles: [ "automation:read" ] } ] + put: + tags: [ "automations" ] + summary: "Update an existing automation" + operationId: "updateAutomation" + parameters: + - { name: "id", in: "path", description: "Automation ID", required: true, type: string, x-example: "hash.sha1" } + - { name: "automation", in: "body", description: "Automation object that needs to be added", required: true, schema: { $ref: "#/definitions/AutomationForm" }, x-example: { id: hash.sha1, image: "docker.io/python:3", script: "import sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha1 = hashlib.sha1(msg['payload'].encode('utf-8'))\n return {'hash': sha1.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", type: [ global, artifact, playbook ] } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/AutomationResponse" } + examples: + test: + id: hash.sha1 + image: "docker.io/python:3" + type: [ global, artifact, playbook ] + script: | + import sys + import json + import hashlib + + + def run(msg): + sha1 = hashlib.sha1(msg['payload'].encode('utf-8')) + return {'hash': sha1.hexdigest()} + + + print(json.dumps(run(json.loads(sys.argv[1])))) + security: [ { roles: [ "automation:write" ] } ] + delete: + tags: [ "automations" ] + summary: "Delete a automation" + operationId: "deleteAutomation" + parameters: + - { name: "id", in: "path", description: "Automation ID", required: true, type: string, x-example: "hash.sha1" } + responses: + "204": { description: "successful operation" } + security: [ { roles: [ "automation:write" ] } ] + +definitions: + AutomationForm: + type: object + required: [ id, image, script, type ] + properties: + id: { type: string } + image: { type: string } + script: { type: string } + type: { type: array, items: { type: string, enum: [ artifact, playbook, global ] } } + schema: { type: string, example: "{}" } + + Automation: + type: object + required: [ image, script, type ] + properties: + image: { type: string } + script: { type: string } + type: { type: array, items: { type: string, enum: [ artifact, playbook, global ] } } + schema: { type: string, example: "{}" } + + AutomationResponse: + type: object + required: [ id, image, script, type ] + properties: + id: { type: string } + image: { type: string } + script: { type: string } + type: { type: array, items: { type: string, enum: [ artifact, playbook, global ] } } + schema: { type: string, example: "{}" } diff --git a/definition/enterprise/graph.yaml b/definition/enterprise/graph.yaml new file mode 100644 index 0000000..0060149 --- /dev/null +++ b/definition/enterprise/graph.yaml @@ -0,0 +1,52 @@ +swagger: "2.0" +info: { version: "", title: "" } + +paths: + /graph/{col}/{id}: + get: + tags: [ "graph" ] + summary: "Graph" + operationId: "graph" + parameters: + - { name: "col", in: "path", description: "Graph Start", required: true, type: string, x-example: "tickets" } + - { name: "id", in: "path", description: "Graph Start", required: true, type: string, x-example: "88" } + - { name: "depth", in: "query", description: "Graph Start", required: true, type: integer, x-example: 1 } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/Graph" } + examples: + test: + nodes: + - { id: "artifacts/94d5cab6f5fe3422a447ab15436e7a672bc0c09a", name: "94d5cab6f5fe3422a447ab15436e7a672bc0c09a" } + - { id: "artifacts/http%3A%2F%2Fwww.customerviral.io%2Fscalable%2Fvertical%2Fkiller", name: "http://www.customerviral.io/scalable/vertical/killer" } + - { id: "artifacts/leadreintermediate.io", name: "leadreintermediate.io" } + - { id: "tickets/88", name: "live zebra" } + links: + - { id: "296239", sid: "tickets/88", tid: "artifacts/http%3A%2F%2Fwww.customerviral.io%2Fscalable%2Fvertical%2Fkiller" } + - { id: "296240", sid: "tickets/88", tid: "artifacts/leadreintermediate.io" } + - { id: "296242", sid: "tickets/88", tid: "artifacts/94d5cab6f5fe3422a447ab15436e7a672bc0c09a" } + security: [ { roles: [ "ticket:read" ] } ] + +definitions: + Graph: + type: object + properties: + nodes: { type: array, items: { $ref: "#/definitions/Node" } } + links: { type: array, items: { $ref: "#/definitions/Link" } } + + Node: + type: object + required: [ id, name ] + properties: + id: { type: string } + name: { type: string } + + Link: + type: object + required: [ id, tid, sid ] + properties: + id: { type: string } + # name: { type: string } + tid: { type: string } + sid: { type: string } diff --git a/definition/enterprise/groups.yaml b/definition/enterprise/groups.yaml new file mode 100644 index 0000000..6a2f91a --- /dev/null +++ b/definition/enterprise/groups.yaml @@ -0,0 +1,84 @@ +swagger: "2.0" +info: { version: "", title: "" } + +paths: + /groups: + get: + tags: [ "groups" ] + summary: "List groups" + operationId: "listGroups" + responses: + "200": + description: "successful operation" + schema: { type: array, items: { $ref: "#/definitions/Group" } } + security: [ { roles: [ "group:read" ] } ] + post: + tags: [ "groups" ] + summary: "Create a new group" + operationId: "createGroup" + parameters: + - { name: "group", in: "body", description: "New group", required: true, schema: { $ref: "#/definitions/GroupForm" } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/GroupResponse" } + security: [ { roles: [ "group:write" ] } ] + + /groups/{id}: + get: + tags: [ "groups" ] + summary: "Get a single group" + operationId: "getGroup" + parameters: + - { name: "id", in: "path", description: "Group ID", required: true, type: string } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/GroupResponse" } + security: [ { roles: [ "group:read" ] } ] + put: + tags: [ "groups" ] + summary: "Update an existing group" + operationId: "updateGroup" + parameters: + - { name: "id", in: "path", description: "Group ID", required: true, type: string } + - { name: "group", in: "body", description: "Group object that needs to be added", required: true, schema: { $ref: "#/definitions/Group" } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/Group" } + security: [ { roles: [ "group:write" ] } ] + delete: + tags: [ "groups" ] + summary: "Delete a group" + operationId: "deleteGroup" + parameters: + - { name: "id", in: "path", description: "Group ID", required: true, type: string } + responses: + "204": { description: "successful operation" } + security: [ { roles: [ "group:write" ] } ] + +definitions: + GroupForm: + type: object + required: [ name, users ] + properties: + id: { type: string } + name: { type: string } + users: { type: array, items: { type: string } } + + Group: + type: object + required: [ name, users ] + properties: + name: { type: string } + users: { type: array, items: { type: string } } + + + GroupResponse: + type: object + required: [ id, name, users ] + properties: + id: { type: string } + name: { type: string } + users: { type: array, items: { type: string } } diff --git a/definition/enterprise/rules.yaml b/definition/enterprise/rules.yaml new file mode 100644 index 0000000..6fdffa0 --- /dev/null +++ b/definition/enterprise/rules.yaml @@ -0,0 +1,110 @@ +swagger: "2.0" +info: { version: "", title: "" } + +paths: + /rules: + get: + tags: [ "rules" ] + summary: "List rules" + operationId: "listRules" + responses: + "200": + description: "successful operation" + schema: { type: array, items: { $ref: "#/definitions/RuleResponse" } } + examples: + test: + - id: ignore-alerts + name: Ignore Alerts + condition: "type == 'alert'" + update: { "status": "closed" } + security: [ { roles: [ "rule:read" ] } ] + post: + tags: [ "rules" ] + summary: "Create a rule" + operationId: "createRule" + parameters: + - { name: "rule", in: "body", description: "New rule", required: true, schema: { $ref: "#/definitions/RuleForm" }, x-example: { name: "Ignore all Alerts", condition: "type == 'alert'", update: { "status": "closed" } } } + responses: + "200": + description: "successful operation" + schema: { type: array, items: { $ref: "#/definitions/RuleResponse" } } + examples: + test: + id: ignore-all-alerts + name: Ignore all Alerts + condition: "type == 'alert'" + update: { "status": "closed" } + security: [ { roles: [ "rule:write" ] } ] + + /rules/{id}: + get: + tags: [ "rules" ] + summary: "Get a single rule" + operationId: "getRule" + parameters: + - { name: "id", in: "path", description: "Rule name", required: true, type: string, x-example: "ignore-alerts" } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/RuleResponse" } + examples: + test: + id: ignore-alerts + name: Ignore Alerts + condition: "type == 'alert'" + update: { "status": "closed" } + security: [ { roles: [ "rule:read" ] } ] + put: + tags: [ "rules" ] + summary: "Update an existing ticket rule" + operationId: "updateRule" + parameters: + - { name: "id", in: "path", description: "Rule ID", required: true, type: string, x-example: "ignore-alerts" } + - { name: "rule", in: "body", description: "Updated rule", required: true, schema: { $ref: "#/definitions/RuleForm" }, x-example: { name: "Ignore Alerts", condition: "type == 'alert'", update: { "status": "invalid" } } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/RuleResponse" } + examples: + test: + id: ignore-alerts + name: Ignore Alerts + condition: "type == 'alert'" + update: { "status": "invalid" } + security: [ { roles: [ "rule:write" ] } ] + delete: + tags: [ "rules" ] + summary: "Delete a rule" + operationId: "deleteRule" + parameters: + - { name: "id", in: "path", description: "Rule name", required: true, type: string, x-example: "ignore-alerts" } + responses: + "204": { description: "successful operation" } + security: [ { roles: [ "rule:write" ] } ] + +definitions: + RuleForm: + type: object + required: [ name, condition, update ] + properties: + id: { type: string } + name: { type: string } + condition: { type: string } + update: { type: object } + + Rule: + type: object + required: [ name, condition, update ] + properties: + name: { type: string } + condition: { type: string } + update: { type: object } + + RuleResponse: + type: object + required: [ id, name, condition, update ] + properties: + id: { type: string } + name: { type: string } + condition: { type: string } + update: { type: object } diff --git a/definition/jobs.yaml b/definition/jobs.yaml new file mode 100644 index 0000000..d9f9e43 --- /dev/null +++ b/definition/jobs.yaml @@ -0,0 +1,130 @@ +swagger: "2.0" +info: { version: "", title: "" } + +paths: + /jobs: + get: + tags: [ "jobs" ] + summary: "List jobs" + operationId: "listJobs" + responses: + "200": + description: "successful operation" + schema: { type: array, items: { $ref: "#/definitions/JobResponse" } } + examples: + test: + - id: "99cd67131b48" + automation: "hash.sha1" + payload: "test" + status: "created" + security: [ { roles: [ "job:read" ] } ] + post: + tags: [ "jobs" ] + summary: "Start a new job" + operationId: "runJob" + parameters: + - { name: "job", in: "body", description: "New job", required: true, schema: { $ref: "#/definitions/JobForm" }, x-example: { automation: "hash.sha1", message: { payload: "test" } } } + responses: + "204": { description: "successful operation" } + security: [ { roles: [ "job:write" ] } ] + + /jobs/{id}: + get: + tags: [ "jobs" ] + summary: "Get a single job" + operationId: "getJob" + parameters: + - { name: "id", in: "path", description: "Job ID", required: true, type: string, x-example: "99cd67131b48" } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/JobResponse" } + examples: + test: { id: "99cd67131b48", automation: "hash.sha1", payload: "test", status: "created" } + security: [ { roles: [ "job:read" ] } ] + put: + tags: [ "jobs" ] + summary: "Update an existing job" + operationId: "updateJob" + parameters: + - { name: "id", in: "path", description: "Job ID", required: true, type: string, x-example: "99cd67131b48" } + - { name: "job", in: "body", description: "Job object that needs to be added", required: true, schema: { $ref: "#/definitions/Job" }, x-example: { id: "99cd67131b48", automation: "hash.sha1", payload: "test", status: "failed" } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/JobResponse" } + examples: + test: { id: "99cd67131b48", automation: "hash.sha1", payload: "test", status: "failed" } + + security: [ { roles: [ "job:write" ] } ] + +definitions: + Message: + type: object + properties: + payload: { type: object } + secrets: { type: object, additionalProperties: { type: string } } + context: { $ref: "#/definitions/Context" } + + Context: + type: object + properties: + artifact: { $ref: "#/definitions/Artifact" } + playbook: { $ref: "#/definitions/PlaybookResponse" } + task: { $ref: "#/definitions/TaskResponse" } + ticket: { $ref: "#/definitions/TicketResponse" } + + Origin: + type: object + properties: + task_origin: { $ref: "#/definitions/TaskOrigin" } + artifact_origin: { $ref: "#/definitions/ArtifactOrigin" } + + TaskOrigin: + type: object + required: [ ticket_id, playbook_id, task_id ] + properties: + ticket_id: { type: integer, format: int64 } + playbook_id: { type: string } + task_id: { type: string } + + ArtifactOrigin: + type: object + required: [ ticket_id, artifact ] + properties: + ticket_id: { type: integer, format: int64 } + artifact: { type: string } + + JobForm: + type: object + required: [ automation ] + properties: + automation: { type: string } + payload: { } + origin: { $ref: "#/definitions/Origin" } + + Job: + type: object + required: [ automation, running, status ] + properties: + automation: { type: string } + container: { type: string } + payload: { } + running: { type: boolean } + status: { type: string } + log: { type: string } + output: { type: object } + origin: { $ref: "#/definitions/Origin" } + + JobResponse: + type: object + required: [ id, automation, status ] + properties: + id: { type: string } + automation: { type: string } + container: { type: string } + status: { type: string } + payload: { } + log: { type: string } + output: { type: object } + origin: { $ref: "#/definitions/Origin" } diff --git a/definition/logs.yaml b/definition/logs.yaml new file mode 100644 index 0000000..1d811a4 --- /dev/null +++ b/definition/logs.yaml @@ -0,0 +1,30 @@ +swagger: "2.0" +info: { version: "", title: "" } + +paths: + + /logs/{reference}: + get: + tags: [ "logs" ] + summary: "Get log entries" + operationId: "getLogs" + parameters: + - { name: "reference", in: "path", description: "Reference", required: true, type: string, x-example: "tickets%2F294511" } + responses: + "200": + description: "successful operation" + schema: { type: array, items: { $ref: "#/definitions/LogEntry" } } + examples: + test: + - { "created": "2021-10-02T18:05:00.333535+02:00","creator": "bob","reference": "tickets/294511","message": "Fail run account resist lend solve incident centre priority temperature. Cause change distribution examine location technique shape partner milk customer. Rail tea plate soil report cook railway interpretation breath action. Exercise dream accept park conclusion addition shoot assistance may answer. Gold writer link stop combine hear power name commitment operation. Determine lifespan support grow degree henry exclude detail set religion. Direct library policy convention chain retain discover ride walk student. Gather proposal select march aspect play noise avoid encourage employ. Assessment preserve transport combine wish influence income guess run stand. Charge limit crime ignore statement foundation study issue stop claim." } + security: [ { roles: [ "log:read" ] } ] + +definitions: + LogEntry: + type: object + required: [ reference, creator, created, message ] + properties: + reference: { type: string } + creator: { type: string } + created: { type: string, format: "date-time" } + message: { type: string } diff --git a/definition/playbooks.yaml b/definition/playbooks.yaml new file mode 100644 index 0000000..0af18ef --- /dev/null +++ b/definition/playbooks.yaml @@ -0,0 +1,202 @@ +swagger: "2.0" +info: { version: "", title: "" } + +paths: + /playbooks: + get: + tags: [ "playbooks" ] + summary: "List playbooks" + operationId: "listPlaybooks" + responses: + "200": + description: "successful operation" + schema: { type: array, items: { $ref: "#/definitions/PlaybookTemplateResponse" } } + examples: + test: + - id: malware + name: Malware + yaml: "name: Malware\ntasks:\n file-or-hash:\n name: Do you have the file or the hash?\n type: input\n schema:\n title: Malware\n type: object\n properties:\n file:\n type: string\n title: \"I have the\"\n enum: [ \"File\", \"Hash\" ]\n next:\n enter-hash: \"file == 'Hash'\"\n upload: \"file == 'File'\"\n\n enter-hash:\n name: Please enter the hash\n type: input\n schema:\n title: Malware\n type: object\n properties:\n hash:\n type: string\n title: Please enter the hash value\n minlength: 32\n next:\n virustotal: \"hash != ''\"\n\n upload:\n name: Upload the malware\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: object\n x-display: file\n title: Please upload the malware\n next:\n hash: \"malware\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['upload'].data['malware']\"\n next:\n virustotal:\n\n virustotal:\n name: Send hash to VirusTotal\n type: automation\n automation: vt.hash\n args:\n hash: \"playbook.tasks['enter-hash'].data['hash'] || playbook.tasks['hash'].data['hash']\"\n # next:\n # known-malware: \"score > 5\"\n # sandbox: \"score < 6\" # unknown-malware\n" + - id: phishing + name: Phishing + yaml: "name: Phishing\ntasks:\n board:\n name: Board Involvement?\n description: Is a board member involved?\n type: input\n schema:\n properties:\n boardInvolved:\n default: false\n title: A board member is involved.\n type: boolean\n required:\n - boardInvolved\n title: Board Involvement?\n type: object\n next:\n escalate: \"boardInvolved == true\"\n mail-available: \"boardInvolved == false\"\n\n escalate:\n name: Escalate to CISO\n description: Please escalate the task to the CISO\n type: task\n\n mail-available:\n name: Mail available\n type: input\n schema:\n oneOf:\n - properties:\n mail:\n title: Mail\n type: string\n x-display: textarea\n schemaKey:\n const: 'yes'\n type: string\n required:\n - mail\n title: 'Yes'\n - properties:\n schemaKey:\n const: 'no'\n type: string\n title: 'No'\n title: Mail available\n type: object\n next:\n block-sender: \"schemaKey == 'yes'\"\n extract-iocs: \"schemaKey == 'yes'\"\n search-email-gateway: \"schemaKey == 'no'\"\n\n search-email-gateway:\n name: Search email gateway\n description: Please search email-gateway for the phishing mail.\n type: task\n next:\n extract-iocs:\n\n block-sender:\n name: Block sender\n type: task\n next:\n extract-iocs:\n\n extract-iocs:\n name: Extract IOCs\n description: Please insert the IOCs\n type: input\n schema:\n properties:\n iocs:\n items:\n type: string\n title: IOCs\n type: array\n title: Extract IOCs\n type: object\n next:\n block-iocs:\n\n block-iocs:\n name: Block IOCs\n type: task\n" + - id: simple + name: Simple + yaml: "name: Simple\ntasks:\n input:\n name: Enter something to hash\n type: input\n schema:\n title: Something\n type: object\n properties:\n something:\n type: string\n title: Something\n default: \"\"\n next:\n hash: \"something != ''\"\n\n hash:\n name: Hash the something\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['something']\"\n next:\n comment: \"hash != ''\"\n\n comment:\n name: Comment the hash\n type: automation\n automation: comment\n payload:\n default: \"playbook.tasks['hash'].data['hash']\"\n next:\n done: \"done\"\n\n done:\n name: You can close this case now\n type: task\n" + security: [ { roles: [ "playbook:read" ] } ] + post: + tags: [ "playbooks" ] + summary: "Create a playbook" + operationId: "createPlaybook" + parameters: + - { name: "playbook", in: "body", description: "New playbook", required: true, schema: { $ref: "#/definitions/PlaybookTemplateForm" }, x-example: { yaml: "name: Simple2\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n" } } + responses: + "200": + description: "successful operation" + schema: { type: array, items: { $ref: "#/definitions/PlaybookTemplateResponse" } } + examples: + test: + id: simple-2 + name: Simple2 + yaml: | + name: Simple2 + tasks: + input: + name: Upload malware if possible + type: input + schema: + title: Malware + type: object + properties: + malware: + type: string + title: Select malware + default: "" + next: + hash: "malware != ''" + + hash: + name: Hash the malware + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['input'].data['malware']" + next: + escalate: + + escalate: + name: Escalate to malware team + type: task + security: [ { roles: [ "playbook:write" ] } ] + + /playbooks/{id}: + get: + tags: [ "playbooks" ] + summary: "Get a single playbook" + operationId: "getPlaybook" + parameters: + - { name: "id", in: "path", description: "Playbook name", required: true, type: string, x-example: "simple" } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/PlaybookTemplateResponse" } + examples: + test: + id: simple + name: Simple + yaml: | + name: Simple + tasks: + input: + name: Enter something to hash + type: input + schema: + title: Something + type: object + properties: + something: + type: string + title: Something + default: "" + next: + hash: "something != ''" + + hash: + name: Hash the something + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['input'].data['something']" + next: + comment: "hash != ''" + + comment: + name: Comment the hash + type: automation + automation: comment + payload: + default: "playbook.tasks['hash'].data['hash']" + next: + done: "done" + + done: + name: You can close this case now + type: task + + security: [ { roles: [ "playbook:read" ] } ] + put: + tags: [ "playbooks" ] + summary: "Update an existing ticket playbook" + operationId: "updatePlaybook" + parameters: + - { name: "id", in: "path", description: "Playbook ID", required: true, type: string, x-example: "simple" } + - { name: "playbook", in: "body", description: "Updated playbook", required: true, schema: { $ref: "#/definitions/PlaybookTemplateForm" }, x-example: { yaml: "name: Simple\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n" } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/PlaybookTemplateResponse" } + examples: + test: + id: simple + name: Simple + yaml: | + name: Simple + tasks: + input: + name: Upload malware if possible + type: input + schema: + title: Malware + type: object + properties: + malware: + type: string + title: Select malware + default: "" + next: + hash: "malware != ''" + + hash: + name: Hash the malware + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['input'].data['malware']" + next: + escalate: + + escalate: + name: Escalate to malware team + type: task + security: [ { roles: [ "playbook:write" ] } ] + delete: + tags: [ "playbooks" ] + summary: "Delete a playbook" + operationId: "deletePlaybook" + parameters: + - { name: "id", in: "path", description: "Playbook name", required: true, type: string, x-example: "simple" } + responses: + "204": { description: "successful operation" } + security: [ { roles: [ "playbook:write" ] } ] + +definitions: + PlaybookTemplateForm: + type: object + required: [ yaml ] + properties: + id: { type: string } + yaml: { type: string } + + PlaybookTemplate: + type: object + required: [ name, yaml ] + properties: + name: { type: string } + yaml: { type: string } + + PlaybookTemplateResponse: + type: object + required: [ id, name, yaml ] + properties: + id: { type: string } + name: { type: string } + yaml: { type: string } diff --git a/definition/settings.yaml b/definition/settings.yaml new file mode 100644 index 0000000..7a2c173 --- /dev/null +++ b/definition/settings.yaml @@ -0,0 +1,59 @@ +swagger: "2.0" +info: { version: "", title: "" } + +paths: + /settings: + get: + tags: [ "settings" ] + summary: "Get settings" + operationId: "getSettings" + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/Settings" } + examples: + test: + version: "0.0.0-test" + tier: community + timeformat: "YYYY-MM-DDThh:mm:ss" + ticketTypes: + - { icon: "mdi-alert", id: "alert", name: "Alerts", default_template: "default", default_playbooks: [ ] } + - { icon: "mdi-radioactive", id: "incident", name: "Incidents", default_template: "default", default_playbooks: [ ] } + - { icon: "mdi-fingerprint", id: "investigation", name: "Forensic Investigations", default_template: "default", default_playbooks: [ ] } + - { icon: "mdi-target", id: "hunt", name: "Threat Hunting", default_template: "default", default_playbooks: [ ] } + artifactStates: + - { icon: "mdi-help-circle-outline", id: "unknown", name: "Unknown", color: "info" } + - { icon: "mdi-skull", id: "malicious", name: "Malicious", color: "error" } + - { icon: "mdi-check", id: "clean", name: "Clean", color: "success" } + roles: [ + "admin:backup:read", "admin:backup:restore", "admin:group:write", "admin:job:read", "admin:job:write", + "admin:log:read", "admin:ticket:delete", "admin:user:write", "admin:userdata:read", + "admin:userdata:write", "analyst:automation:read", + "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", + "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", + "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", + "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", + "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", + "engineer:tickettype:write" ] + security: [ { roles: [ "settings:read" ] } ] + +definitions: + Settings: + type: object + required: [ version, tier, timeformat, ticketTypes, artifactStates ] + properties: + version: { title: "Version", type: string } + tier: { title: "Tier", type: string, enum: [ "community", "enterprise" ] } + timeformat: { title: "Time Format", type: string } + ticketTypes: { title: "Ticket Types", type: array, items: { $ref: "#/definitions/TicketTypeResponse" } } + artifactStates: { title: "Artifact States", type: array, items: { $ref: "#/definitions/Type" } } + roles: { title: "Roles", type: array, items: { type: string } } + + Type: + type: object + required: [ id, name, icon ] + properties: + id: { title: ID, type: string, x-cols: 3, x-class: pr-2 } + name: { title: Name, type: string, x-cols: 3, x-class: pr-2 } + icon: { title: "Icon (https://materialdesignicons.com)", type: string, x-cols: 3, x-class: pr-2 } + color: { title: Color, type: string, x-cols: 3, enum: [ error, info, success, warning ] } diff --git a/definition/statistics.yaml b/definition/statistics.yaml new file mode 100644 index 0000000..acfd678 --- /dev/null +++ b/definition/statistics.yaml @@ -0,0 +1,31 @@ +swagger: "2.0" +info: { version: "", title: "" } + +paths: + /statistics: + get: + tags: [ "statistics" ] + summary: "Get statistics" + operationId: "getStatistics" + responses: + "200": + description: "successful operation" + schema: { $ref: '#/definitions/Statistics' } + examples: + test: + unassigned: 0 + open_tickets_per_user: { } + tickets_per_week: { "2021-39": 3 } + tickets_per_type: { "alert": 2, "incident": 1 } + security: [ { roles: [ "ticket:read" ] } ] + +definitions: + + Statistics: + type: object + required: [ unassigned, open_tickets_per_user, tickets_per_week, tickets_per_type ] + properties: + unassigned: { type: integer } + open_tickets_per_user: { type: object, additionalProperties: { type: integer } } + tickets_per_week: { type: object, additionalProperties: { type: integer } } + tickets_per_type: { type: object, additionalProperties: { type: integer } } diff --git a/definition/swagger.yaml b/definition/swagger.yaml new file mode 100644 index 0000000..24d9a98 --- /dev/null +++ b/definition/swagger.yaml @@ -0,0 +1,18 @@ +swagger: "2.0" +info: + version: "0.0.3" + title: "Catalyst" + description: API for the catalyst incident response platform. + +host: "." +basePath: "/api" +schemes: + # - "https" + - "http" + +consumes: [ "application/json" ] +produces: [ "application/json" ] + +paths: {} + +definitions: {} diff --git a/definition/tasks.yaml b/definition/tasks.yaml new file mode 100644 index 0000000..7b5e15e --- /dev/null +++ b/definition/tasks.yaml @@ -0,0 +1,107 @@ +swagger: "2.0" +info: { version: "", title: "" } + +paths: + /tasks: + get: + tags: [ "tasks" ] + summary: "List tasks" + operationId: "listTasks" + responses: + "200": + description: "successful operation" + schema: { type: array, items: { $ref: "#/definitions/TaskResponse" } } + examples: + test: [ ] + security: [ { roles: [ "ticket:read" ] } ] + +definitions: + TaskForm: + type: object + required: [ name, type ] + properties: + name: { type: string, example: "Inform user" } + type: { type: string, enum: [ task, input, automation ], example: "task" } + done: { type: boolean } + + owner: { type: string } + data: { type: object } + + # automation + automation: { type: string } + payload: { type: object, additionalProperties: { type: string } } + + # input + schema: { type: object } + + # workflow + join: { type: boolean, example: false } + next: { type: object, additionalProperties: { type: string } } + + created: { type: string, format: "date-time", example: "1985-04-12T23:20:50.52Z" } + closed: { type: string, format: "date-time", example: "1985-04-12T23:20:50.52Z" } + + Task: + type: object + required: [ name, type, done, created ] + properties: + name: { type: string, example: "Inform user" } + type: { type: string, enum: [ task, input, automation ], example: "task" } + done: { type: boolean } + + owner: { type: string } + data: { type: object } + + # automation + automation: { type: string } + payload: { type: object, additionalProperties: { type: string } } + + # input + schema: { type: object } + + # workflow + join: { type: boolean, example: false } + next: { type: object, additionalProperties: { type: string } } + + created: { type: string, format: "date-time", example: "1985-04-12T23:20:50.52Z" } + closed: { type: string, format: "date-time", example: "1985-04-12T23:20:50.52Z" } + + TaskResponse: + type: object + required: [ name, type, done, created, order, active ] + properties: + name: { type: string, example: "Inform user" } + type: { type: string, enum: [ task, input, automation ], example: "task" } + done: { type: boolean } + + owner: { type: string } + data: { type: object } + + # automation + automation: { type: string } + payload: { type: object, additionalProperties: { type: string } } + + # input + schema: { type: object } + + # workflow + join: { type: boolean, example: false } + next: { type: object, additionalProperties: { type: string } } + + created: { type: string, format: "date-time", example: "1985-04-12T23:20:50.52Z" } + closed: { type: string, format: "date-time", example: "1985-04-12T23:20:50.52Z" } + + # helper + order: { type: number, format: "int64", example: 2 } + active: { type: boolean, example: false } + + TaskWithContext: + type: object + required: [ ticket_id, ticket_name, playbook_id, playbook_name, task_id, task ] + properties: + ticket_id: { type: number, format: "int64" } + ticket_name: { type: string } + playbook_id: { type: string } + playbook_name: { type: string } + task_id: { type: string } + task: { $ref: '#/definitions/TaskResponse' } diff --git a/definition/templates.yaml b/definition/templates.yaml new file mode 100644 index 0000000..b000dd4 --- /dev/null +++ b/definition/templates.yaml @@ -0,0 +1,104 @@ +swagger: "2.0" +info: { version: "", title: "" } + +paths: + /templates: + get: + tags: [ "templates" ] + summary: "List templates" + operationId: "listTemplates" + responses: + "200": + description: "successful operation" + schema: { type: array, items: { $ref: "#/definitions/TicketTemplateResponse" } } + examples: + test: + - id: default + name: Default + schema: "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Default\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + security: [ { roles: [ "template:read" ] } ] + post: + tags: [ "templates" ] + summary: "Create a new template" + operationId: "createTemplate" + parameters: + - { name: "template", in: "body", description: "New template", required: true, schema: { $ref: "#/definitions/TicketTemplateForm" }, x-example: { name: "My Template", schema: "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketTemplateResponse" } + examples: + test: + id: "my-template" + name: "My Template" + schema: "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + security: [ { roles: [ "template:write" ] } ] + + /templates/{id}: + get: + tags: [ "templates" ] + summary: "Get a single template" + operationId: "getTemplate" + parameters: + - { name: "id", in: "path", description: "Template ID", required: true, type: string, x-example: "default" } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketTemplateResponse" } + examples: + test: + id: default + name: Default + schema: "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Default\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + security: [ { roles: [ "template:read" ] } ] + put: + tags: [ "templates" ] + summary: "Update an existing template" + operationId: "updateTemplate" + parameters: + - { name: "id", in: "path", description: "Template ID", required: true, type: string, x-example: "default" } + - { name: "template", in: "body", description: "Template object that needs to be added", required: true, schema: { $ref: "#/definitions/TicketTemplateForm" }, x-example: { name: "My Template", schema: "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketTemplateResponse" } + examples: + test: + id: default + name: "My Template" + schema: "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + + security: [ { roles: [ "template:write" ] } ] + delete: + tags: [ "templates" ] + summary: "Delete a template" + operationId: "deleteTemplate" + parameters: + - { name: "id", in: "path", description: "Template ID", required: true, type: string, x-example: "default" } + responses: + "204": { description: "successful operation" } + security: [ { roles: [ "template:write" ] } ] + +definitions: + TicketTemplateForm: + type: object + required: [ name, schema ] + properties: + id: { type: string } + name: { type: string } + schema: { type: string } + + TicketTemplate: + type: object + required: [ name, schema ] + properties: + name: { type: string } + schema: { type: string } + + TicketTemplateResponse: + type: object + required: [ id, name, schema ] + properties: + id: { type: string } + name: { type: string } + schema: { type: string } diff --git a/definition/tickets.yaml b/definition/tickets.yaml new file mode 100644 index 0000000..59b7bff --- /dev/null +++ b/definition/tickets.yaml @@ -0,0 +1,1094 @@ +swagger: "2.0" +info: { version: "", title: "" } + +paths: + /tickets: + get: + tags: [ "tickets" ] + summary: "List tickets" + operationId: "listTickets" + parameters: + - { name: "type", in: "query", description: "Ticket Type", type: string } + - { name: "offset", in: "query", description: "Offset of the list", type: integer, default: 0 } + - { name: "count", in: "query", description: "Number of tickets", type: integer, maximum: 100, default: 25 } + - { name: "sort", in: "query", description: "Sort columns", type: array, items: { type: string } } #, example: [ "name", "id" ] + - { name: "desc", in: "query", description: "Sort descending", type: array, items: { type: boolean } } #, example: [ false, true ] + - { name: "query", in: "query", description: "Search query", type: string } + responses: + "200": + description: "successful operation" + schema: { $ref: '#/definitions/TicketList' } + examples: + test: + count: 3 + tickets: + - id: 8123 + created: "2021-10-02T18:04:59.078206+02:00" + modified: "2021-10-02T18:04:59.078206+02:00" + name: "live zebra" + owner: "demo" + playbooks: + phishing: + name: "Phishing" + tasks: + "block-iocs": { created: "2021-10-02T18:04:59.078186+02:00", done: false, name: "Block IOCs", type: "task" } + "block-sender": { created: "2021-10-02T18:04:59.078186+02:00", done: false, name: "Block sender","next": { "extract-iocs": "" }, type: "task" } + "board": { created: "2021-10-02T18:04:59.078186+02:00", done: false, name: "Board Involvement?","next": { "escalate": "boardInvolved == true","mail-available": "boardInvolved == false" },"schema": { "properties": { "boardInvolved": { "default": false, "title": "A board member is involved.", type: "boolean" } }, "required": [ "boardInvolved" ], "title": "Board Involvement?", type: "object" }, type: "input" } + "escalate": { created: "2021-10-02T18:04:59.078186+02:00", done: false, name: "Escalate to CISO", type: "task" } + "extract-iocs": { created: "2021-10-02T18:04:59.078186+02:00", done: false, name: "Extract IOCs", "next": { "block-iocs": "" },"schema": { "properties": { "iocs": { "items": { type: "string" },"title": "IOCs", type: "array" } }, "title": "Extract IOCs", type: "object" }, type: "input" } + "mail-available": { created: "2021-10-02T18:04:59.078186+02:00", done: false, name: "Mail available","next": { "block-sender": "schemaKey == 'yes'", "extract-iocs": "schemaKey == 'yes'", "search-email-gateway": "schemaKey == 'no'" },"schema": { "oneOf": [ { "properties": { "mail": { "title": "Mail", type: "string", "x-display": "textarea" }, "schemaKey": { "const": "yes", type: "string" } },"required": [ "mail" ], "title": "Yes" },{ "properties": { "schemaKey": { "const": "no", type: "string" } },"title": "No" } ],"title": "Mail available", type: "object" }, type: "input" } + "search-email-gateway": { created: "2021-10-02T18:04:59.078186+02:00", done: false, name: "Search email gateway","next": { "extract-iocs": "" }, type: "task" } + references: + - { href: "https://www.leadmaximize.net/e-services/back-end", name: "performance" } + - { href: "http://www.corporateinteractive.name/rich", name: "autumn" } + - { href: "https://www.corporateintuitive.org/intuitive/platforms/integrate", name: "suggest" } + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + status: "closed" + type: "incident" + artifacts: + - { name: "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", status: "unknown" } + - { name: "http://www.customerviral.io/scalable/vertical/killer", status: "clean" } + - { name: "leadreintermediate.io", status: "malicious" } + - { id: 8125, created: "2021-10-02T18:04:59.078186+02:00", modified: "2021-10-02T18:04:59.078186+02:00",name: "phishing from selenafadel@von.com detected", owner: "demo", references: [ { href: "https://www.seniorleading-edge.name/users/efficient", name: "recovery" },{ href: "http://www.dynamicseamless.com/clicks-and-mortar", name: "force" },{ href: "http://www.leadscalable.biz/envisioneer", name: "fund" } ],"schema": "{}", status: "closed", type: "alert" } + - { id: 8126, created: "2021-10-02T18:04:59.078186+02:00", modified: "2021-10-02T18:04:59.078186+02:00", name: "Surfaceintroduce virus detected", owner: "demo", references: [ { href: "http://www.centralworld-class.io/synthesize", name: "university" },{ href: "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", name: "goal" },{ href: "http://www.chiefsyndicate.io/action-items", name: "unemployment" } ],"schema": "{}", status: "closed", type: "alert" } + security: [ { roles: [ "ticket:read" ] } ] + post: + tags: [ "tickets" ] + summary: "Create a new ticket" + operationId: "createTicket" + parameters: + - { name: "ticket", in: "body", description: "New ticket", required: true, schema: { $ref: "#/definitions/TicketForm" }, x-example: { id: 123, owner: bob, name: "Wannacry infection", status: "open", type: "incident" } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketResponse" } + examples: + test: + id: 123 + name: "Wannacry infection" + type: "incident" + status: "open" + created: "1985-04-12T23:20:50.52Z" + modified: "1985-04-12T23:20:50.52Z" + owner: "bob" + schema: "{}" + security: [ { roles: [ "ticket:write" ] } ] + + /tickets/batch: + post: + tags: [ "tickets" ] + summary: "Create a new tickets in batch" + operationId: "createTicketBatch" + parameters: + - { name: "ticket", in: "body", description: "New ticket", required: true, schema: { type: array, items: { $ref: "#/definitions/TicketForm" } }, x-example: [ { id: 123, owner: bob, name: "Wannacry infection", status: "open", type: "incident" } ] } + responses: + "204": { description: "successful operation" } + security: [ { roles: [ "ticket:write" ] } ] + + /tickets/{id}: + get: + tags: [ "tickets" ] + summary: "Get a single ticket" + operationId: "getTicket" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8125 } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketResponse" } + examples: + test: + id: 8125 + created: "2021-10-02T18:04:59.078186+02:00" + modified: "2021-10-02T18:04:59.078186+02:00" + name: "phishing from selenafadel@von.com detected" + owner: "demo" + references: + - href: "https://www.seniorleading-edge.name/users/efficient" + name: "recovery" + - href: "http://www.dynamicseamless.com/clicks-and-mortar" + name: "force" + - href: "http://www.leadscalable.biz/envisioneer" + name: "fund" + schema: "{}" + status: "closed" + type: "alert" + tickets: + - { id: 8126, created: "2021-10-02T18:04:59.078186+02:00", modified: "2021-10-02T18:04:59.078186+02:00", name: "Surfaceintroduce virus detected", owner: "demo", references: [ { href: "http://www.centralworld-class.io/synthesize", name: "university" },{ href: "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", name: "goal" },{ href: "http://www.chiefsyndicate.io/action-items", name: "unemployment" } ],"schema": "{}", status: "closed", type: "alert" } + security: [ { roles: [ "ticket:read" ] } ] + put: + tags: [ "tickets" ] + summary: "Update an existing ticket" + operationId: "updateTicket" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8125 } + - { name: "ticket", in: "body", description: "Updated ticket", required: true, schema: { $ref: "#/definitions/Ticket" }, x-example: { "created": "2021-10-02T18:04:59.078186+02:00",modified: "2021-10-02T18:04:59.078186+02:00", name: "phishing from selenafadel@von.org detected", owner: "demo", references: [ { href: "https://www.seniorleading-edge.name/users/efficient", name: "recovery" },{ href: "http://www.dynamicseamless.com/clicks-and-mortar", name: "force" },{ href: "http://www.leadscalable.biz/envisioneer", name: "fund" } ], schema: "{}", status: "closed", type: "alert" } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketResponse" } + examples: + test: + id: 8125 + created: "2021-10-02T18:04:59.078186+02:00" + modified: "2021-10-02T18:04:59.078186+02:00" + name: "phishing from selenafadel@von.org detected" + owner: "demo" + references: + - href: "https://www.seniorleading-edge.name/users/efficient" + name: "recovery" + - href: "http://www.dynamicseamless.com/clicks-and-mortar" + name: "force" + - href: "http://www.leadscalable.biz/envisioneer" + name: "fund" + schema: "{}" + status: "closed" + type: "alert" + tickets: + - { id: 8126, created: "2021-10-02T18:04:59.078186+02:00", modified: "2021-10-02T18:04:59.078186+02:00", name: "Surfaceintroduce virus detected", owner: "demo", references: [ { href: "http://www.centralworld-class.io/synthesize", name: "university" },{ href: "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", name: "goal" },{ href: "http://www.chiefsyndicate.io/action-items", name: "unemployment" } ],"schema": "{}", status: "closed", type: "alert" } + security: [ { roles: [ "ticket:write" ] } ] + delete: + tags: [ "tickets" ] + summary: "Delete an ticket" + operationId: "deleteTicket" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8125 } + responses: + "204": { description: "successful operation" } + security: [ { roles: [ "ticket:delete" ] } ] + + /tickets/{id}/tickets: + patch: + tags: [ "tickets" ] + summary: "Link an ticket to an ticket" + operationId: "linkTicket" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8126 } + - { name: "linkedID", in: "body", description: "Added ticket ID", required: true, schema: { type: integer, format: "int64" }, x-example: 8123 } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketResponse" } + examples: + test: + id: 8126 + created: "2021-10-02T18:04:59.078186+02:00" + modified: "2021-10-02T18:04:59.078186+02:00" + name: "Surfaceintroduce virus detected" + owner: "demo" + references: + - { "href": "http://www.centralworld-class.io/synthesize", "name": "university" } + - { "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", "name": "goal" } + - { "href": "http://www.chiefsyndicate.io/action-items", "name": "unemployment" } + schema: "{}" + status: "closed" + type: "alert" + tickets: + - id: 8123 + created: "2021-10-02T18:04:59.078206+02:00" + modified: "2021-10-02T18:04:59.078206+02:00" + name: "live zebra" + owner: "demo" + playbooks: + phishing: + name: "Phishing" + tasks: + "block-iocs": { created: "2021-10-02T18:04:59.078186+02:00", done: false, name: "Block IOCs", type: "task" } + "block-sender": { created: "2021-10-02T18:04:59.078186+02:00", done: false, name: "Block sender","next": { "extract-iocs": "" }, type: "task" } + "board": { created: "2021-10-02T18:04:59.078186+02:00", done: false, name: "Board Involvement?","next": { "escalate": "boardInvolved == true","mail-available": "boardInvolved == false" },"schema": { "properties": { "boardInvolved": { "default": false, "title": "A board member is involved.", type: "boolean" } }, "required": [ "boardInvolved" ], "title": "Board Involvement?", type: "object" }, type: "input" } + "escalate": { created: "2021-10-02T18:04:59.078186+02:00", done: false, name: "Escalate to CISO", type: "task" } + "extract-iocs": { created: "2021-10-02T18:04:59.078186+02:00", done: false, name: "Extract IOCs", "next": { "block-iocs": "" },"schema": { "properties": { "iocs": { "items": { type: "string" },"title": "IOCs", type: "array" } }, "title": "Extract IOCs", type: "object" }, type: "input" } + "mail-available": { created: "2021-10-02T18:04:59.078186+02:00", done: false, name: "Mail available","next": { "block-sender": "schemaKey == 'yes'", "extract-iocs": "schemaKey == 'yes'", "search-email-gateway": "schemaKey == 'no'" },"schema": { "oneOf": [ { "properties": { "mail": { "title": "Mail", type: "string", "x-display": "textarea" }, "schemaKey": { "const": "yes", type: "string" } },"required": [ "mail" ], "title": "Yes" },{ "properties": { "schemaKey": { "const": "no", type: "string" } },"title": "No" } ],"title": "Mail available", type: "object" }, type: "input" } + "search-email-gateway": { created: "2021-10-02T18:04:59.078186+02:00", done: false, name: "Search email gateway","next": { "extract-iocs": "" }, type: "task" } + references: + - { href: "https://www.leadmaximize.net/e-services/back-end", name: "performance" } + - { href: "http://www.corporateinteractive.name/rich", name: "autumn" } + - { href: "https://www.corporateintuitive.org/intuitive/platforms/integrate", name: "suggest" } + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + status: "closed" + type: "incident" + artifacts: + - { name: "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", status: "unknown" } + - { name: "http://www.customerviral.io/scalable/vertical/killer", status: "clean" } + - { name: "leadreintermediate.io", status: "malicious" } + - id: 8125 + created: "2021-10-02T18:04:59.078186+02:00" + modified: "2021-10-02T18:04:59.078186+02:00" + name: "phishing from selenafadel@von.com detected" + owner: "demo" + references: + - { href: "https://www.seniorleading-edge.name/users/efficient", name: "recovery" } + - { href: "http://www.dynamicseamless.com/clicks-and-mortar", name: "force" } + - { href: "http://www.leadscalable.biz/envisioneer", name: "fund" } + "schema": "{}" + status: "closed" + type: "alert" + security: [ { roles: [ "ticket:write" ] } ] + delete: + tags: [ "tickets" ] + summary: "Unlink an ticket to an ticket" + operationId: "unlinkTicket" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8126 } + - { name: "linkedID", in: "body", description: "Added ticket ID", required: true, schema: { type: integer, format: "int64" }, x-example: 8125 } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketResponse" } + examples: + test: + id: 8126 + created: "2021-10-02T18:04:59.078186+02:00" + modified: "2021-10-02T18:04:59.078186+02:00" + name: "Surfaceintroduce virus detected" + owner: "demo" + references: + - { href: "http://www.centralworld-class.io/synthesize", name: "university" } + - { href: "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", name: "goal" } + - { href: "http://www.chiefsyndicate.io/action-items", name: "unemployment" } + "schema": "{}" + status: "closed" + type: "alert" + security: [ { roles: [ "ticket:write" ] } ] + + /tickets/{id}/comments: + post: + tags: [ "tickets" ] + summary: "Add ticket comment" + operationId: "addComment" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8125 } + - { name: "comment", in: "body", description: "Ticket comment", required: true, schema: { $ref: "#/definitions/CommentForm" } , x-example: { message: "My first comment" } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketResponse" } + examples: + test: + id: 8125 + created: "2021-10-02T18:04:59.078186+02:00" + modified: "2021-10-02T18:04:59.078186+02:00" + name: "phishing from selenafadel@von.com detected" + owner: "demo" + comments: + - created: "2021-10-02T18:04:59.078186+02:00" + creator: "bob" + message: "My first comment" + references: + - { href: "https://www.seniorleading-edge.name/users/efficient", name: "recovery" } + - { href: "http://www.dynamicseamless.com/clicks-and-mortar", name: "force" } + - { href: "http://www.leadscalable.biz/envisioneer", name: "fund" } + "schema": "{}" + status: "closed" + type: "alert" + tickets: + - { id: 8126, created: "2021-10-02T18:04:59.078186+02:00", modified: "2021-10-02T18:04:59.078186+02:00", name: "Surfaceintroduce virus detected", owner: "demo", references: [ { href: "http://www.centralworld-class.io/synthesize", name: "university" },{ href: "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", name: "goal" },{ href: "http://www.chiefsyndicate.io/action-items", name: "unemployment" } ],"schema": "{}", status: "closed", type: "alert" } + security: [ { roles: [ "ticket:write" ] } ] + + /tickets/{id}/comments/{commentID}: + delete: + tags: [ "tickets" ] + summary: "Remove an comment from an ticket" + description: "Comment will be removed from the ticket." + operationId: "removeComment" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8123 } + - { name: "commentID", in: "path", description: "Comment ID to remove", required: true, type: integer, x-example: 0 } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketResponse" } + examples: + test: + id: 8123 + created: "2021-10-02T18:04:59.078206+02:00" + modified: "2021-10-02T18:04:59.078206+02:00" + name: "live zebra" + owner: "demo" + playbooks: + phishing: + name: "Phishing" + tasks: + "block-iocs": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 6, name: "Block IOCs", type: "task" } + "block-sender": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 3, name: "Block sender","next": { "extract-iocs": "" }, type: "task" } + "board": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": true, "order": 0, name: "Board Involvement?","next": { "escalate": "boardInvolved == true","mail-available": "boardInvolved == false" },"schema": { "properties": { "boardInvolved": { "default": false, "title": "A board member is involved.", type: "boolean" } }, "required": [ "boardInvolved" ], "title": "Board Involvement?", type: "object" }, type: "input" } + "escalate": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 1, name: "Escalate to CISO", type: "task" } + "extract-iocs": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 5, name: "Extract IOCs", "next": { "block-iocs": "" },"schema": { "properties": { "iocs": { "items": { type: "string" },"title": "IOCs", type: "array" } }, "title": "Extract IOCs", type: "object" }, type: "input" } + "mail-available": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 2, name: "Mail available","next": { "block-sender": "schemaKey == 'yes'", "extract-iocs": "schemaKey == 'yes'", "search-email-gateway": "schemaKey == 'no'" },"schema": { "oneOf": [ { "properties": { "mail": { "title": "Mail", type: "string", "x-display": "textarea" }, "schemaKey": { "const": "yes", type: "string" } },"required": [ "mail" ], "title": "Yes" },{ "properties": { "schemaKey": { "const": "no", type: "string" } },"title": "No" } ],"title": "Mail available", type: "object" }, type: "input" } + "search-email-gateway": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 4, name: "Search email gateway","next": { "extract-iocs": "" }, type: "task" } + references: + - { href: "https://www.leadmaximize.net/e-services/back-end", name: "performance" } + - { href: "http://www.corporateinteractive.name/rich", name: "autumn" } + - { href: "https://www.corporateintuitive.org/intuitive/platforms/integrate", name: "suggest" } + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + status: "closed" + type: "incident" + artifacts: + - { name: "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", status: "unknown" } + - { name: "http://www.customerviral.io/scalable/vertical/killer", status: "clean" } + - { name: "leadreintermediate.io", status: "malicious" } + security: [ { roles: [ "ticket:write" ] } ] + + /tickets/{id}/references: + put: + tags: [ "tickets" ] + summary: "Set ticket references" + operationId: "setReferences" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8125 } + - { name: "references", in: "body", description: "All ticket references", required: true, schema: { type: array, items: { $ref: "#/definitions/Reference" } }, x-example: [ { href: "http://www.leadscalable.biz/envisioneer", name: "fund" } ] } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketResponse" } + examples: + test: + id: 8125 + created: "2021-10-02T18:04:59.078186+02:00" + modified: "2021-10-02T18:04:59.078186+02:00" + name: "phishing from selenafadel@von.com detected" + owner: "demo" + references: [ { href: "http://www.leadscalable.biz/envisioneer", name: "fund" } ] + "schema": "{}" + status: "closed" + type: "alert" + tickets: + - { id: 8126, created: "2021-10-02T18:04:59.078186+02:00", modified: "2021-10-02T18:04:59.078186+02:00", name: "Surfaceintroduce virus detected", owner: "demo", references: [ { href: "http://www.centralworld-class.io/synthesize", name: "university" },{ href: "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", name: "goal" },{ href: "http://www.chiefsyndicate.io/action-items", name: "unemployment" } ],"schema": "{}", status: "closed", type: "alert" } + security: [ { roles: [ "ticket:write" ] } ] + + /tickets/{id}/schema: + put: + tags: [ "tickets" ] + summary: "Set ticket schema" + operationId: "setSchema" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8125 } + - { name: "schema", in: "body", description: "New ticket schema", schema: { type: string }, x-example: "{}" } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketResponse" } + examples: + test: + id: 8125 + created: "2021-10-02T18:04:59.078186+02:00" + modified: "2021-10-02T18:04:59.078186+02:00" + name: "phishing from selenafadel@von.com detected" + owner: "demo" + references: + - { href: "https://www.seniorleading-edge.name/users/efficient", name: "recovery" } + - { href: "http://www.dynamicseamless.com/clicks-and-mortar", name: "force" } + - { href: "http://www.leadscalable.biz/envisioneer", name: "fund" } + "schema": "{}" + status: "closed" + type: "alert" + tickets: + - { id: 8126, created: "2021-10-02T18:04:59.078186+02:00", modified: "2021-10-02T18:04:59.078186+02:00", name: "Surfaceintroduce virus detected", owner: "demo", references: [ { href: "http://www.centralworld-class.io/synthesize", name: "university" },{ href: "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", name: "goal" },{ href: "http://www.chiefsyndicate.io/action-items", name: "unemployment" } ],"schema": "{}", status: "closed", type: "alert" } + security: [ { roles: [ "ticket:write" ] } ] + + /tickets/{id}/files: + put: + tags: [ "tickets" ] + summary: "Link files to an ticket" + description: "Link files to an ticket. The files themself will be stored in object storage." + operationId: "linkFiles" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8125 } + - { name: "files", in: "body", description: "Added files", required: true, schema: { type: array, items: { $ref: "#/definitions/File" } }, x-example: [ { key: myfile, name: "document.doc" } ] } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketResponse" } + examples: + test: + id: 8125 + created: "2021-10-02T18:04:59.078186+02:00" + modified: "2021-10-02T18:04:59.078186+02:00" + name: "phishing from selenafadel@von.com detected" + owner: "demo" + references: + - { href: "https://www.seniorleading-edge.name/users/efficient", name: "recovery" } + - { href: "http://www.dynamicseamless.com/clicks-and-mortar", name: "force" } + - { href: "http://www.leadscalable.biz/envisioneer", name: "fund" } + "schema": "{}" + status: "closed" + type: "alert" + files: [ { key: myfile, name: "document.doc" } ] + tickets: + - { id: 8126, created: "2021-10-02T18:04:59.078186+02:00", modified: "2021-10-02T18:04:59.078186+02:00", name: "Surfaceintroduce virus detected", owner: "demo", references: [ { href: "http://www.centralworld-class.io/synthesize", name: "university" },{ href: "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", name: "goal" },{ href: "http://www.chiefsyndicate.io/action-items", name: "unemployment" } ],"schema": "{}", status: "closed", type: "alert" } + + security: [ { roles: [ "ticket:write" ] } ] + + /tickets/{id}/playbooks: + post: + tags: [ "tickets" ] + summary: "Add a new ticket playbook" + operationId: "addTicketPlaybook" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8125 } + - { name: "playbook", in: "body", description: "Ticket playbook object that needs to be added", required: true, schema: { $ref: "#/definitions/PlaybookTemplateForm" }, x-example: { yaml: "name: Simple\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n" } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketResponse" } + examples: + test: + id: 8125 + name: phishing from selenafadel@von.com detected + owner: demo + type: "alert" + status: "closed" + created: "1985-04-12T23:20:50.52Z" + modified: "1985-04-12T23:20:50.52Z" + schema: "{}" + tickets: + - { id: 8126, created: "2021-10-02T18:04:59.078186+02:00", modified: "2021-10-02T18:04:59.078186+02:00", name: "Surfaceintroduce virus detected", owner: "demo", references: [ { href: "http://www.centralworld-class.io/synthesize", name: "university" },{ href: "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", name: "goal" },{ href: "http://www.chiefsyndicate.io/action-items", name: "unemployment" } ],"schema": "{}", status: "closed", type: "alert" } + references: + - { href: "https://www.seniorleading-edge.name/users/efficient", name: recovery } + - { href: "http://www.dynamicseamless.com/clicks-and-mortar", name: force } + - { href: "http://www.leadscalable.biz/envisioneer", name: fund } + playbooks: + simple: + name: Simple + tasks: + input: + active: true + done: false + created: "2021-10-02T18:04:59.078186+02:00" + order: 0 + name: Upload malware if possible + type: input + schema: + title: Malware + type: object + properties: + malware: + type: string + title: Select malware + default: "" + next: + hash: "malware != ''" + + hash: + active: false + done: false + created: "2021-10-02T18:04:59.078186+02:00" + order: 1 + name: Hash the malware + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['input'].data['malware']" + next: + escalate: "" + + escalate: + active: false + done: false + created: "2021-10-02T18:04:59.078186+02:00" + order: 2 + name: Escalate to malware team + type: task + + /tickets/{id}/playbooks/{playbookID}: + delete: + tags: [ "tickets" ] + summary: "Remove an ticket playbook" + operationId: "removeTicketPlaybook" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8123 } + - { name: "playbookID", in: "path", description: "Playbook ID", required: true, type: string, x-example: "phishing" } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketResponse" } + examples: + test: + id: 8123 + name: "live zebra" + type: "incident" + status: "closed" + created: "1985-04-12T23:20:50.52Z" + modified: "1985-04-12T23:20:50.52Z" + owner: "demo" + references: + - { href: "https://www.leadmaximize.net/e-services/back-end", name: performance } + - { href: "http://www.corporateinteractive.name/rich", name: autumn } + - { href: "https://www.corporateintuitive.org/intuitive/platforms/integrate", name: suggest } + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + artifacts: + - { name: "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", status: "unknown" } + - { name: "http://www.customerviral.io/scalable/vertical/killer", status: "clean" } + - { name: "leadreintermediate.io", status: "malicious" } + security: [ { roles: [ "ticket:write" ] } ] + + /tickets/{id}/playbooks/{playbookID}/task/{taskID}: + put: + tags: [ "tickets" ] + summary: "Set a ticket playbook task" + operationId: "setTask" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8123 } + - { name: "playbookID", in: "path", description: "Playbook ID", required: true, type: string, x-example: "phishing" } + - { name: "taskID", in: "path", description: "Task ID", required: true, type: string, x-example: "board" } + - { name: "task", in: "body", description: "Task", required: true, schema: { $ref: "#/definitions/Task" }, x-example: { done: false, "active": true, "order": 0, name: "Board Involvement?","next": { "escalate": "boardInvolved == true","mail-available": "boardInvolved == false" },"schema": { "properties": { "boardInvolved": { "default": false, "title": "A board member is involved.", type: "boolean" } }, "required": [ "boardInvolved" ], "title": "Board Involvement?", type: "object" }, type: "input", data: { boardInvolved: true } } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketResponse" } + examples: + test: + id: 8123 + created: "2021-10-02T18:04:59.078206+02:00" + modified: "2021-10-02T18:04:59.078206+02:00" + name: "live zebra" + owner: "demo" + playbooks: + phishing: + name: "Phishing" + tasks: + "block-iocs": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 6, name: "Block IOCs", type: "task" } + "block-sender": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 3, name: "Block sender","next": { "extract-iocs": "" }, type: "task" } + "board": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": true, "order": 0, name: "Board Involvement?","next": { "escalate": "boardInvolved == true","mail-available": "boardInvolved == false" },"schema": { "properties": { "boardInvolved": { "default": false, "title": "A board member is involved.", type: "boolean" } }, "required": [ "boardInvolved" ], "title": "Board Involvement?", type: "object" }, type: "input", data: { boardInvolved: true } } + "escalate": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 1, name: "Escalate to CISO", type: "task" } + "extract-iocs": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 5, name: "Extract IOCs", "next": { "block-iocs": "" },"schema": { "properties": { "iocs": { "items": { type: "string" },"title": "IOCs", type: "array" } }, "title": "Extract IOCs", type: "object" }, type: "input" } + "mail-available": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 2, name: "Mail available","next": { "block-sender": "schemaKey == 'yes'", "extract-iocs": "schemaKey == 'yes'", "search-email-gateway": "schemaKey == 'no'" },"schema": { "oneOf": [ { "properties": { "mail": { "title": "Mail", type: "string", "x-display": "textarea" }, "schemaKey": { "const": "yes", type: "string" } },"required": [ "mail" ], "title": "Yes" },{ "properties": { "schemaKey": { "const": "no", type: "string" } },"title": "No" } ],"title": "Mail available", type: "object" }, type: "input" } + "search-email-gateway": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 4, name: "Search email gateway","next": { "extract-iocs": "" }, type: "task" } + references: + - { href: "https://www.leadmaximize.net/e-services/back-end", name: "performance" } + - { href: "http://www.corporateinteractive.name/rich", name: "autumn" } + - { href: "https://www.corporateintuitive.org/intuitive/platforms/integrate", name: "suggest" } + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + status: "closed" + type: "incident" + artifacts: + - { name: "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", status: "unknown" } + - { name: "http://www.customerviral.io/scalable/vertical/killer", status: "clean" } + - { name: "leadreintermediate.io", status: "malicious" } + security: [ { roles: [ "ticket:write" ] } ] + + /tickets/{id}/playbooks/{playbookID}/task/{taskID}/complete: + put: + tags: [ "tickets" ] + summary: "Complete ticket playbook task" + operationId: "completeTask" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8123 } + - { name: "playbookID", in: "path", description: "Playbook ID", required: true, type: string, x-example: "phishing" } + - { name: "taskID", in: "path", description: "Task ID", required: true, type: string, x-example: "board" } + - { name: "data", in: "body", description: "Ticket playbook object that needs to be added", required: true, schema: { type: object }, x-example: { boardInvolved: true } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketResponse" } + examples: + test: + id: 8123 + created: "2021-10-02T18:04:59.078206+02:00" + modified: "2021-10-02T18:04:59.078206+02:00" + name: "live zebra" + owner: "demo" + playbooks: + phishing: + name: "Phishing" + tasks: + "block-iocs": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 6, name: "Block IOCs", type: "task" } + "block-sender": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 3, name: "Block sender","next": { "extract-iocs": "" }, type: "task" } + "board": { created: "2021-10-02T18:04:59.078186+02:00", closed: "2021-10-02T18:04:59.078186+02:00", done: true, "active": false, "order": 0, name: "Board Involvement?","next": { "escalate": "boardInvolved == true","mail-available": "boardInvolved == false" },"schema": { "properties": { "boardInvolved": { "default": false, "title": "A board member is involved.", type: "boolean" } }, "required": [ "boardInvolved" ], "title": "Board Involvement?", type: "object" }, type: "input", data: { boardInvolved: true } } + "escalate": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": true, "order": 1, name: "Escalate to CISO", type: "task" } + "extract-iocs": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 5, name: "Extract IOCs", "next": { "block-iocs": "" },"schema": { "properties": { "iocs": { "items": { type: "string" },"title": "IOCs", type: "array" } }, "title": "Extract IOCs", type: "object" }, type: "input" } + "mail-available": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 2, name: "Mail available","next": { "block-sender": "schemaKey == 'yes'", "extract-iocs": "schemaKey == 'yes'", "search-email-gateway": "schemaKey == 'no'" },"schema": { "oneOf": [ { "properties": { "mail": { "title": "Mail", type: "string", "x-display": "textarea" }, "schemaKey": { "const": "yes", type: "string" } },"required": [ "mail" ], "title": "Yes" },{ "properties": { "schemaKey": { "const": "no", type: "string" } },"title": "No" } ],"title": "Mail available", type: "object" }, type: "input" } + "search-email-gateway": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 4, name: "Search email gateway","next": { "extract-iocs": "" }, type: "task" } + references: + - { href: "https://www.leadmaximize.net/e-services/back-end", name: "performance" } + - { href: "http://www.corporateinteractive.name/rich", name: "autumn" } + - { href: "https://www.corporateintuitive.org/intuitive/platforms/integrate", name: "suggest" } + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + status: "closed" + type: "incident" + artifacts: + - { name: "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", status: "unknown" } + - { name: "http://www.customerviral.io/scalable/vertical/killer", status: "clean" } + - { name: "leadreintermediate.io", status: "malicious" } + security: [ { roles: [ "ticket:write" ] } ] + + /tickets/{id}/playbooks/{playbookID}/task/{taskID}/run: + post: + tags: [ "tickets" ] + summary: "Run ticket playbook task" + operationId: "runTask" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8123 } + - { name: "playbookID", in: "path", description: "Playbook ID", required: true, type: string, x-example: "phishing" } + - { name: "taskID", in: "path", description: "Task ID", required: true, type: string, x-example: "board" } + responses: + "204": { description: "successful operation" } + security: [ { roles: [ "ticket:write" ] } ] + + /tickets/{id}/artifacts: + post: + tags: [ "tickets" ] + summary: "Add a single artifact" + operationId: "addArtifact" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8123 } + - { name: "artifact", in: "body", description: "Artifact object that needs to be added", required: true, schema: { $ref: "#/definitions/Artifact" }, x-example: { name: "2.2.2.2" } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketResponse" } + examples: + test: + id: 8123 + created: "2021-10-02T18:04:59.078206+02:00" + modified: "2021-10-02T18:04:59.078206+02:00" + name: "live zebra" + owner: "demo" + playbooks: + phishing: + name: "Phishing" + tasks: + "block-iocs": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 6, name: "Block IOCs", type: "task" } + "block-sender": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 3, name: "Block sender","next": { "extract-iocs": "" }, type: "task" } + "board": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": true, "order": 0, name: "Board Involvement?","next": { "escalate": "boardInvolved == true","mail-available": "boardInvolved == false" },"schema": { "properties": { "boardInvolved": { "default": false, "title": "A board member is involved.", type: "boolean" } }, "required": [ "boardInvolved" ], "title": "Board Involvement?", type: "object" }, type: "input" } + "escalate": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 1, name: "Escalate to CISO", type: "task" } + "extract-iocs": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 5, name: "Extract IOCs", "next": { "block-iocs": "" },"schema": { "properties": { "iocs": { "items": { type: "string" },"title": "IOCs", type: "array" } }, "title": "Extract IOCs", type: "object" }, type: "input" } + "mail-available": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 2, name: "Mail available","next": { "block-sender": "schemaKey == 'yes'", "extract-iocs": "schemaKey == 'yes'", "search-email-gateway": "schemaKey == 'no'" },"schema": { "oneOf": [ { "properties": { "mail": { "title": "Mail", type: "string", "x-display": "textarea" }, "schemaKey": { "const": "yes", type: "string" } },"required": [ "mail" ], "title": "Yes" },{ "properties": { "schemaKey": { "const": "no", type: "string" } },"title": "No" } ],"title": "Mail available", type: "object" }, type: "input" } + "search-email-gateway": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 4, name: "Search email gateway","next": { "extract-iocs": "" }, type: "task" } + references: + - { href: "https://www.leadmaximize.net/e-services/back-end", name: "performance" } + - { href: "http://www.corporateinteractive.name/rich", name: "autumn" } + - { href: "https://www.corporateintuitive.org/intuitive/platforms/integrate", name: "suggest" } + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + status: "closed" + type: "incident" + artifacts: + - { name: "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", status: "unknown" } + - { name: "http://www.customerviral.io/scalable/vertical/killer", status: "clean" } + - { name: "leadreintermediate.io", status: "malicious" } + - { name: "2.2.2.2", status: "unknown", type: "ip" } + security: [ { roles: [ "ticket:write" ] } ] + + /tickets/{id}/artifacts/{name}: + get: + tags: [ "tickets" ] + summary: "Get a single artifact" + operationId: "getArtifact" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8123 } + - { name: "name", in: "path", required: true, type: string, x-example: "leadreintermediate.io" } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/Artifact" } + examples: + test: { name: "leadreintermediate.io", status: "malicious" } + security: [ { roles: [ "ticket:write" ] } ] + put: + tags: [ "tickets" ] + summary: "Set a single artifact" + operationId: "setArtifact" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8123 } + - { name: "name", in: "path", required: true, type: string, x-example: "leadreintermediate.io" } + - { name: "artifact", in: "body", required: true, schema: { $ref: "#/definitions/Artifact" }, x-example: { name: "leadreintermediate.io", status: "clean" } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketResponse" } + examples: + test: + id: 8123 + created: "2021-10-02T18:04:59.078206+02:00" + modified: "2021-10-02T18:04:59.078206+02:00" + name: "live zebra" + owner: "demo" + playbooks: + phishing: + name: "Phishing" + tasks: + "block-iocs": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 6, name: "Block IOCs", type: "task" } + "block-sender": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 3, name: "Block sender","next": { "extract-iocs": "" }, type: "task" } + "board": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": true, "order": 0, name: "Board Involvement?","next": { "escalate": "boardInvolved == true","mail-available": "boardInvolved == false" },"schema": { "properties": { "boardInvolved": { "default": false, "title": "A board member is involved.", type: "boolean" } }, "required": [ "boardInvolved" ], "title": "Board Involvement?", type: "object" }, type: "input" } + "escalate": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 1, name: "Escalate to CISO", type: "task" } + "extract-iocs": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 5, name: "Extract IOCs", "next": { "block-iocs": "" },"schema": { "properties": { "iocs": { "items": { type: "string" },"title": "IOCs", type: "array" } }, "title": "Extract IOCs", type: "object" }, type: "input" } + "mail-available": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 2, name: "Mail available","next": { "block-sender": "schemaKey == 'yes'", "extract-iocs": "schemaKey == 'yes'", "search-email-gateway": "schemaKey == 'no'" },"schema": { "oneOf": [ { "properties": { "mail": { "title": "Mail", type: "string", "x-display": "textarea" }, "schemaKey": { "const": "yes", type: "string" } },"required": [ "mail" ], "title": "Yes" },{ "properties": { "schemaKey": { "const": "no", type: "string" } },"title": "No" } ],"title": "Mail available", type: "object" }, type: "input" } + "search-email-gateway": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 4, name: "Search email gateway","next": { "extract-iocs": "" }, type: "task" } + references: + - { href: "https://www.leadmaximize.net/e-services/back-end", name: "performance" } + - { href: "http://www.corporateinteractive.name/rich", name: "autumn" } + - { href: "https://www.corporateintuitive.org/intuitive/platforms/integrate", name: "suggest" } + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + status: "closed" + type: "incident" + artifacts: + - { name: "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", status: "unknown" } + - { name: "http://www.customerviral.io/scalable/vertical/killer", status: "clean" } + - { name: "leadreintermediate.io", status: "clean" } + security: [ { roles: [ "ticket:write" ] } ] + delete: + tags: [ "tickets" ] + summary: "Remove an artifact" + operationId: "removeArtifact" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8123 } + - { name: "name", in: "path", required: true, type: string, x-example: "leadreintermediate.io" } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketResponse" } + examples: + test: + id: 8123 + created: "2021-10-02T18:04:59.078206+02:00" + modified: "2021-10-02T18:04:59.078206+02:00" + name: "live zebra" + owner: "demo" + playbooks: + phishing: + name: "Phishing" + tasks: + "block-iocs": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 6, name: "Block IOCs", type: "task" } + "block-sender": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 3, name: "Block sender","next": { "extract-iocs": "" }, type: "task" } + "board": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": true, "order": 0, name: "Board Involvement?","next": { "escalate": "boardInvolved == true","mail-available": "boardInvolved == false" },"schema": { "properties": { "boardInvolved": { "default": false, "title": "A board member is involved.", type: "boolean" } }, "required": [ "boardInvolved" ], "title": "Board Involvement?", type: "object" }, type: "input" } + "escalate": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 1, name: "Escalate to CISO", type: "task" } + "extract-iocs": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 5, name: "Extract IOCs", "next": { "block-iocs": "" },"schema": { "properties": { "iocs": { "items": { type: "string" },"title": "IOCs", type: "array" } }, "title": "Extract IOCs", type: "object" }, type: "input" } + "mail-available": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 2, name: "Mail available","next": { "block-sender": "schemaKey == 'yes'", "extract-iocs": "schemaKey == 'yes'", "search-email-gateway": "schemaKey == 'no'" },"schema": { "oneOf": [ { "properties": { "mail": { "title": "Mail", type: "string", "x-display": "textarea" }, "schemaKey": { "const": "yes", type: "string" } },"required": [ "mail" ], "title": "Yes" },{ "properties": { "schemaKey": { "const": "no", type: "string" } },"title": "No" } ],"title": "Mail available", type: "object" }, type: "input" } + "search-email-gateway": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 4, name: "Search email gateway","next": { "extract-iocs": "" }, type: "task" } + references: + - { href: "https://www.leadmaximize.net/e-services/back-end", name: "performance" } + - { href: "http://www.corporateinteractive.name/rich", name: "autumn" } + - { href: "https://www.corporateintuitive.org/intuitive/platforms/integrate", name: "suggest" } + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + status: "closed" + type: "incident" + artifacts: + - { name: "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", status: "unknown" } + - { name: "http://www.customerviral.io/scalable/vertical/killer", status: "clean" } + security: [ { roles: [ "ticket:write" ] } ] + + /tickets/{id}/artifacts/{name}/run/{automation}: + post: + tags: [ "tickets" ] + summary: "Run automation on a single artifact" + operationId: "runArtifact" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8123 } + - { name: "name", in: "path", required: true, type: string, x-example: "leadreintermediate.io" } + - { name: "automation", in: "path", required: true, type: string, x-example: "hash.sha1" } + responses: + "204": { description: "successful operation" } + security: [ { roles: [ "ticket:write" ] } ] + + /tickets/{id}/artifacts/{name}/enrich: + post: + tags: [ "tickets" ] + summary: "Enrich a single artifact" + operationId: "enrichArtifact" + parameters: + - { name: "id", in: "path", description: "Ticket ID", required: true, type: integer, format: "int64", x-example: 8123 } + - { name: "name", in: "path", required: true, type: string, x-example: "leadreintermediate.io" } + - { name: "data", in: "body", required: true, schema: { $ref: "#/definitions/EnrichmentForm" }, x-example: { name: "hash.sha1", data: { "hash": "b7a067a742c20d07a7456646de89bc2d408a1153" } } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/Artifact" } + examples: + test: + id: 8123 + created: "2021-10-02T18:04:59.078206+02:00" + modified: "2021-10-02T18:04:59.078206+02:00" + name: "live zebra" + owner: "demo" + playbooks: + phishing: + name: "Phishing" + tasks: + "block-iocs": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 6, name: "Block IOCs", type: "task" } + "block-sender": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 3, name: "Block sender","next": { "extract-iocs": "" }, type: "task" } + "board": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": true, "order": 0, name: "Board Involvement?","next": { "escalate": "boardInvolved == true","mail-available": "boardInvolved == false" },"schema": { "properties": { "boardInvolved": { "default": false, "title": "A board member is involved.", type: "boolean" } }, "required": [ "boardInvolved" ], "title": "Board Involvement?", type: "object" }, type: "input" } + "escalate": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 1, name: "Escalate to CISO", type: "task" } + "extract-iocs": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 5, name: "Extract IOCs", "next": { "block-iocs": "" },"schema": { "properties": { "iocs": { "items": { type: "string" },"title": "IOCs", type: "array" } }, "title": "Extract IOCs", type: "object" }, type: "input" } + "mail-available": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 2, name: "Mail available","next": { "block-sender": "schemaKey == 'yes'", "extract-iocs": "schemaKey == 'yes'", "search-email-gateway": "schemaKey == 'no'" },"schema": { "oneOf": [ { "properties": { "mail": { "title": "Mail", type: "string", "x-display": "textarea" }, "schemaKey": { "const": "yes", type: "string" } },"required": [ "mail" ], "title": "Yes" },{ "properties": { "schemaKey": { "const": "no", type: "string" } },"title": "No" } ],"title": "Mail available", type: "object" }, type: "input" } + "search-email-gateway": { created: "2021-10-02T18:04:59.078186+02:00", done: false, "active": false, "order": 4, name: "Search email gateway","next": { "extract-iocs": "" }, type: "task" } + references: + - { href: "https://www.leadmaximize.net/e-services/back-end", name: "performance" } + - { href: "http://www.corporateinteractive.name/rich", name: "autumn" } + - { href: "https://www.corporateintuitive.org/intuitive/platforms/integrate", name: "suggest" } + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + status: "closed" + type: "incident" + artifacts: + - { name: "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", status: "unknown" } + - { name: "http://www.customerviral.io/scalable/vertical/killer", status: "clean" } + - { name: "leadreintermediate.io", status: "malicious", enrichments: { hash.sha1: { name: "hash.sha1", created: "2021-10-03T18:44:06.488923+02:00", data: { "hash": "b7a067a742c20d07a7456646de89bc2d408a1153" } } } } + security: [ { roles: [ "ticket:write" ] } ] + +definitions: + + TicketForm: + type: object + required: [ name, type, status ] + properties: + id: { type: integer, format: int64, example: 123 } + name: { type: string, example: WannyCry } + type: { type: string, example: incident } + status: { type: string, example: "open" } + + owner: { type: string, example: "bob" } + write: { type: array, items: { type: string }, example: [ "alice" ] } + read: { type: array, items: { type: string }, example: [ "bob" ] } + + schema: { type: string, example: "{}" } + details: { type: object, example: { "description": "my little incident" } } + + references: { type: array, items: { $ref: '#/definitions/Reference' } } + playbooks: { type: array, items: { $ref: '#/definitions/PlaybookTemplateForm' } } + files: { type: array, items: { $ref: '#/definitions/File' } } + comments: { type: array, items: { $ref: '#/definitions/Comment' } } + artifacts: { type: array, items: { $ref: "#/definitions/Artifact" } } + + created: { type: string, format: "date-time", example: "1985-04-12T23:20:50.52Z" } + modified: { type: string, format: "date-time", example: "1985-04-12T23:20:50.52Z" } + + Ticket: + type: object + required: [ name, type, status, created, modified, schema ] + properties: + name: { type: string, example: WannyCry } + type: { type: string, example: incident } + status: { type: string, example: "open" } + + owner: { type: string, example: "bob" } + write: { type: array, items: { type: string }, example: [ "alice" ] } + read: { type: array, items: { type: string }, example: [ "bob" ] } + + schema: { type: string, example: "{}" } + details: { type: object, example: { "description": "my little incident" } } + + references: { type: array, items: { $ref: '#/definitions/Reference' } } + playbooks: { type: object, additionalProperties: { $ref: '#/definitions/Playbook' } } + files: { type: array, items: { $ref: '#/definitions/File' } } + comments: { type: array, items: { $ref: '#/definitions/Comment' } } + artifacts: { type: array, items: { $ref: "#/definitions/Artifact" } } + + created: { type: string, format: "date-time", example: "1985-04-12T23:20:50.52Z" } + modified: { type: string, format: "date-time", example: "1985-04-12T23:20:50.52Z" } + + TicketResponse: + type: object + required: [ id, name, type, status, created, modified, schema ] + properties: + id: { type: integer, format: int64, example: 123 } + name: { type: string, example: WannyCry } + type: { type: string, example: incident } + status: { type: string, example: "open" } + + owner: { type: string, example: "bob" } + write: { type: array, items: { type: string }, example: [ "alice" ] } + read: { type: array, items: { type: string }, example: [ "bob" ] } + + schema: { type: string, example: "{}" } + details: { type: object, example: { "description": "my little incident" } } + + references: { type: array, items: { $ref: '#/definitions/Reference' } } + playbooks: { type: object, additionalProperties: { $ref: '#/definitions/PlaybookResponse' } } + files: { type: array, items: { $ref: '#/definitions/File' } } + comments: { type: array, items: { $ref: '#/definitions/Comment' } } + artifacts: { type: array, items: { $ref: "#/definitions/Artifact" } } + + created: { type: string, format: "date-time", example: "1985-04-12T23:20:50.52Z" } + modified: { type: string, format: "date-time", example: "1985-04-12T23:20:50.52Z" } + + TicketSimpleResponse: + type: object + required: [ id, name, type, status, created, modified, schema ] + properties: + id: { type: integer, format: int64, example: 123 } + name: { type: string, example: WannyCry } + type: { type: string, example: incident } + status: { type: string, example: "open" } + + owner: { type: string, example: "bob" } + write: { type: array, items: { type: string }, example: [ "alice" ] } + read: { type: array, items: { type: string }, example: [ "bob" ] } + + schema: { type: string, example: "{}" } + details: { type: object, example: { "description": "my little incident" } } + + references: { type: array, items: { $ref: '#/definitions/Reference' } } + playbooks: { type: object, additionalProperties: { $ref: '#/definitions/Playbook' } } + files: { type: array, items: { $ref: '#/definitions/File' } } + comments: { type: array, items: { $ref: '#/definitions/Comment' } } + artifacts: { type: array, items: { $ref: "#/definitions/Artifact" } } + + created: { type: string, format: "date-time", example: "1985-04-12T23:20:50.52Z" } + modified: { type: string, format: "date-time", example: "1985-04-12T23:20:50.52Z" } + + TicketWithTickets: + type: object + required: [ id, name, type, status, created, modified, schema ] + properties: + id: { type: integer, format: int64, example: 123 } + name: { type: string, example: WannyCry } + type: { type: string, example: incident } + status: { type: string, example: "open" } + + owner: { type: string, example: "bob" } + write: { type: array, items: { type: string }, example: [ "alice" ] } + read: { type: array, items: { type: string }, example: [ "bob" ] } + + schema: { type: string, example: "{}" } + details: { type: object, example: { "description": "my little incident" } } + + references: { type: array, items: { $ref: '#/definitions/Reference' } } + playbooks: { type: object, additionalProperties: { $ref: '#/definitions/PlaybookResponse' } } + files: { type: array, items: { $ref: '#/definitions/File' } } + comments: { type: array, items: { $ref: '#/definitions/Comment' } } + artifacts: { type: array, items: { $ref: "#/definitions/Artifact" } } + + created: { type: string, format: "date-time", example: "1985-04-12T23:20:50.52Z" } + modified: { type: string, format: "date-time", example: "1985-04-12T23:20:50.52Z" } + + tickets: { type: array, items: { $ref: "#/definitions/TicketSimpleResponse" } } + + TicketList: + type: object + required: [ tickets, count ] + properties: + tickets: { type: array, items: { $ref: "#/definitions/TicketSimpleResponse" } } + count: { type: number, example: 3 } + + CommentForm: + type: object + required: [ message ] + properties: + creator: { type: string } + created: { type: string, format: "date-time" } + message: { type: string } + + Comment: + type: object + required: [ creator, created, message ] + properties: + creator: { type: string } + created: { type: string, format: "date-time" } + message: { type: string } + + Reference: + type: object + required: [ name, href ] + properties: + name: { type: string, example: "CVE-2017-0144" } + href: { type: string, example: "https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0144" } + + File: + type: object + required: [ key, name ] + properties: + key: { type: string, example: "myfile" } + name: { type: string, example: "notes.docx" } + + Playbook: + type: object + required: [ name, tasks ] + properties: + name: { type: string, example: "Phishing" } + tasks: { type: object, additionalProperties: { $ref: '#/definitions/Task' } } + + PlaybookResponse: + type: object + required: [ name, tasks ] + properties: + name: { type: string, example: "Phishing" } + tasks: { type: object, additionalProperties: { $ref: '#/definitions/TaskResponse' } } diff --git a/definition/tickettype.yaml b/definition/tickettype.yaml new file mode 100644 index 0000000..3c8b491 --- /dev/null +++ b/definition/tickettype.yaml @@ -0,0 +1,121 @@ +swagger: "2.0" +info: { version: "", title: "" } + + +paths: + /tickettypes: + get: + tags: [ "tickettypes" ] + summary: "List tickettypes" + operationId: "listTicketTypes" + responses: + "200": + description: "successful operation" + schema: { type: array, items: { $ref: "#/definitions/TicketTypeResponse" } } + examples: + test: + - { icon: "mdi-alert", id: "alert", name: "Alerts", default_template: "default", default_playbooks: [ ] } + - { icon: "mdi-radioactive", id: "incident", name: "Incidents", default_template: "default", default_playbooks: [ ] } + - { icon: "mdi-fingerprint", id: "investigation", name: "Forensic Investigations", default_template: "default", default_playbooks: [ ] } + - { icon: "mdi-target", id: "hunt", name: "Threat Hunting", default_template: "default", default_playbooks: [ ] } + security: [ { roles: [ "tickettype:read" ] } ] + post: + tags: [ "tickettypes" ] + summary: "Create a new tickettype" + operationId: "createTicketType" + parameters: + - { name: "tickettype", in: "body", description: "New tickettype", required: true, schema: { $ref: "#/definitions/TicketTypeForm" }, x-example: { name: "TI Tickets", icon: "mdi-newspaper-variant-outline", default_template: "default", default_playbooks: [ ] } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketTypeResponse" } + examples: + test: + id: "ti-tickets" + name: "TI Tickets" + icon: "mdi-newspaper-variant-outline" + default_template: "default" + default_playbooks: [ ] + security: [ { roles: [ "tickettype:write" ] } ] + + /tickettypes/{id}: + get: + tags: [ "tickettypes" ] + summary: "Get a single tickettype" + operationId: "getTicketType" + parameters: + - { name: "id", in: "path", description: "TicketType ID", required: true, type: string, x-example: "alert" } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketTypeResponse" } + examples: + test: + icon: "mdi-alert" + id: "alert" + name: "Alerts" + default_template: "default" + default_playbooks: [ ] + security: [ { roles: [ "tickettype:read" ] } ] + put: + tags: [ "tickettypes" ] + summary: "Update an existing tickettype" + operationId: "updateTicketType" + parameters: + - { name: "id", in: "path", description: "TicketType ID", required: true, type: string, x-example: "alert" } + - { name: "tickettype", in: "body", description: "TicketType object that needs to be added", required: true, schema: { $ref: "#/definitions/TicketTypeForm" }, x-example: { icon: "mdi-bell", id: "alert", name: "Alerts", default_template: "default", default_playbooks: [ ] } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/TicketTypeResponse" } + examples: + test: + icon: "mdi-bell" + id: "alert" + name: "Alerts" + default_template: "default" + default_playbooks: [ ] + + security: [ { roles: [ "tickettype:write" ] } ] + delete: + tags: [ "tickettypes" ] + summary: "Delete a tickettype" + operationId: "deleteTicketType" + parameters: + - { name: "id", in: "path", description: "TicketType ID", required: true, type: string, x-example: "alert" } + responses: + "204": { description: "successful operation" } + security: [ { roles: [ "tickettype:write" ] } ] + +definitions: + TicketTypeForm: + type: object + required: [ name, icon, default_template, default_playbooks ] + properties: + id: { type: string } + icon: { type: string } + name: { type: string } + default_template: { type: string } + default_playbooks: { type: array, items: { type: string } } + default_groups: { type: array, items: { type: string } } + + TicketType: + type: object + required: [ name, icon, default_template, default_playbooks ] + properties: + icon: { type: string } + name: { type: string } + default_template: { type: string } + default_playbooks: { type: array, items: { type: string } } + default_groups: { type: array, items: { type: string } } + + TicketTypeResponse: + type: object + required: [ id, name, icon, default_template, default_playbooks ] + properties: + id: { type: string } + icon: { type: string } + name: { type: string } + default_template: { type: string } + default_playbooks: { type: array, items: { type: string } } + default_groups: { type: array, items: { type: string } } diff --git a/definition/userdata.yaml b/definition/userdata.yaml new file mode 100644 index 0000000..449fbca --- /dev/null +++ b/definition/userdata.yaml @@ -0,0 +1,94 @@ +swagger: "2.0" +info: { version: "", title: "" } + +paths: + /currentuserdata: + get: + tags: [ "userdata" ] + summary: "Get current user data" + operationId: "currentUserData" + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/UserDataResponse" } + examples: + test: { id: bob, name: "Bob Bad", email: "bob@example.org" } + security: [ { roles: [ "currentuserdata:read" ] } ] + put: + tags: [ "userdata" ] + summary: "Update current user data" + operationId: "updateCurrentUserData" + parameters: + - { name: "userdata", in: "body", description: "User data object that needs to be added", required: true, schema: { $ref: "#/definitions/UserData" }, x-example: { name: "Bob Bad", email: "bob@example.org" } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/UserDataResponse" } + examples: + test: { id: bob, name: "Bob Bad", email: "bob@example.org" } + security: [ { roles: [ "currentuserdata:write" ] } ] + + /userdata: + get: + tags: [ "userdata" ] + summary: "List userdata" + operationId: "listUserData" + responses: + "200": + description: "successful operation" + schema: { type: array, items: { $ref: "#/definitions/UserDataResponse" } } + examples: + test: + - { id: bob, name: "Bob Bad", email: "bob@example.org" } + security: [ { roles: [ "userdata:read" ] } ] + + /userdata/{id}: + get: + tags: [ "userdata" ] + summary: "Get a single user data" + operationId: "getUserData" + parameters: + - { name: "id", in: "path", description: "User Data ID", required: true, type: string, x-example: "bob" } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/UserDataResponse" } + examples: + test: + id: bob + name: "Bob Bad" + email: "bob@example.org" + security: [ { roles: [ "userdata:read" ] } ] + put: + tags: [ "userdata" ] + summary: "Update an existing user data" + operationId: "updateUserData" + parameters: + - { name: "id", in: "path", description: "User Data ID", required: true, type: string, x-example: "bob" } + - { name: "userdata", in: "body", description: "User data object that needs to be added", required: true, schema: { $ref: "#/definitions/UserData" }, x-example: { name: "Bob Bad", email: "bob@example.org", blocked: false } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/UserDataResponse" } + examples: + test: { id: bob, name: "Bob Bad", email: "bob@example.org" } + security: [ { roles: [ "userdata:write" ] } ] + +definitions: + UserData: + type: object + properties: + name: { type: string, x-example: "Robert Smith" } + email: { type: string, x-example: "bob@example.org" } + image: { type: string, x-display: "custom-avatar" } + timeformat: { title: "Time Format (https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens)", type: string } + + UserDataResponse: + type: object + required: [ id ] + properties: + id: { type: string } + name: { type: string, x-example: "Robert Smith" } + email: { type: string, x-example: "bob@example.org" } + image: { type: string, x-display: "custom-avatar" } + timeformat: { title: "Time Format (https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens)", type: string } diff --git a/definition/users.yaml b/definition/users.yaml new file mode 100644 index 0000000..5020cfd --- /dev/null +++ b/definition/users.yaml @@ -0,0 +1,122 @@ +swagger: "2.0" +info: { version: "", title: "" } + +paths: + /currentuser: + get: + tags: [ "users" ] + summary: "Get current user" + operationId: "currentUser" + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/UserResponse" } + examples: + test: { id: bob, roles: [ "admin:backup:read", "admin:backup:restore", "admin:group:write", "admin:job:read", "admin:job:write", "admin:log:read", "admin:ticket:delete", "admin:user:write", "admin:userdata:read", "admin:userdata:write", "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write" ], blocked: false, apikey: false } + security: [ { roles: [ "currentuser:read" ] } ] + + /users: + get: + tags: [ "users" ] + summary: "List users" + operationId: "listUsers" + responses: + "200": + description: "successful operation" + schema: { type: array, items: { $ref: "#/definitions/UserResponse" } } + examples: + test: + - { id: bob, blocked: false, roles: [ "admin:backup:read", "admin:backup:restore", "admin:group:write", "admin:job:read", "admin:job:write", "admin:log:read", "admin:ticket:delete", "admin:user:write", "admin:userdata:read", "admin:userdata:write", "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write" ], apikey: false } + - { id: script, roles: [ "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write" ], blocked: false, apikey: true } + security: [ { roles: [ "user:read" ] } ] + post: + tags: [ "users" ] + summary: "Create user" + operationId: "createUser" + parameters: + - { name: "user", in: "body", description: "user object that needs to be added", required: true, schema: { $ref: "#/definitions/UserForm" }, x-example: { id: "syncscript", roles: [ "analyst" ] } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/NewUserResponse" } + examples: + test: { id: "syncscript", roles: [ "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read" ], secret: "v39bOuobnlEljfWzjAgoKzhmnh1xSMxH", blocked: false } + security: [ { roles: [ "user:write" ] } ] + /users/{id}: + get: + tags: [ "users" ] + summary: "Get a single user" + operationId: "getUser" + parameters: + - { name: "id", in: "path", description: "user ID", required: true, type: string, x-example: "script" } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/UserResponse" } + examples: + test: { id: "script", roles: [ "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write" ], blocked: false, apikey: true } + security: [ { roles: [ "user:read" ] } ] + put: + tags: [ "users" ] + summary: "Update user" + operationId: "updateUser" + parameters: + - { name: "id", in: "path", description: "Template ID", required: true, type: string, x-example: "bob" } + - { name: "user", in: "body", description: "user object that needs to be added", required: true, schema: { $ref: "#/definitions/UserForm" }, x-example: { roles: [ "analyst", "admin" ] } } + responses: + "200": + description: "successful operation" + schema: { $ref: "#/definitions/UserResponse" } + examples: + test: + id: bob + roles: [ "admin:backup:read", "admin:backup:restore", "admin:group:write", "admin:job:read", "admin:job:write", "admin:log:read", "admin:ticket:delete", "admin:user:write", "admin:userdata:read", "admin:userdata:write", "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write" ] + apikey: false + blocked: false + security: [ { roles: [ "user:write" ] } ] + delete: + tags: [ "users" ] + summary: "Delete user" + operationId: "deleteUser" + parameters: + - { name: "id", in: "path", description: "user ID", required: true, type: string, x-example: "script" } + responses: + "204": { description: "successful operation" } + security: [ { roles: [ "user:write" ] } ] + +definitions: + UserForm: + type: object + required: [ id, blocked, roles, apikey ] + properties: + id: { type: string } + blocked: { type: boolean } + apikey: { type: boolean } + roles: { type: array, items: { type: string } } + + User: + type: object + required: [ blocked, apikey, roles ] + properties: + blocked: { type: boolean } + apikey: { type: boolean } + roles: { type: array, items: { type: string } } + sha256: { type: string } # for api keys + + UserResponse: + type: object + required: [ id, blocked, roles, apikey ] + properties: + id: { type: string } + blocked: { type: boolean } + apikey: { type: boolean } + roles: { type: array, items: { type: string } } + + NewUserResponse: + type: object + required: [ id, blocked, roles ] + properties: + id: { type: string } + blocked: { type: boolean } + roles: { type: array, items: { type: string } } + secret: { type: string } diff --git a/dev/docker-compose.yml b/dev/docker-compose.yml new file mode 100644 index 0000000..4308c8a --- /dev/null +++ b/dev/docker-compose.yml @@ -0,0 +1,49 @@ +version: '2.2' +services: + nginx: + image: nginx:1.21 + volumes: + - ./nginx.conf:/etc/nginx/nginx.conf:ro + ports: [ "80:80", "8529:8529", "9000:9000", "9001:9001", "9002:9002" ] + + arangodb: + image: arangodb/arangodb:3.8.1 + environment: + ARANGO_ROOT_PASSWORD: foobar + + emitter: + image: emitter/server + environment: + - EMITTER_LICENSE=PfA8ID8izeSlDUlNZgNXo77DQV9QzlNtxTk64WreCXKfDZsREAVXUXwh20UKOZdkALbLTmOytO_iC6mc_twKAQ:3 + # A9RysEsPJni8RaHeg_K0FKXQNfBrUyw- + + minio: + image: minio/minio + environment: + MINIO_ROOT_USER: minio + MINIO_ROOT_PASSWORD: minio123 + command: server /data -console-address ":9003" + + postgres: + image: postgres + environment: + POSTGRES_DB: keycloak + POSTGRES_USER: keycloak + POSTGRES_PASSWORD: password + + keycloak: + image: quay.io/keycloak/keycloak:14.0.0 + environment: + DB_VENDOR: POSTGRES + DB_ADDR: postgres + DB_DATABASE: keycloak + DB_USER: keycloak + DB_SCHEMA: public + DB_PASSWORD: password + KEYCLOAK_USER: admin + KEYCLOAK_PASSWORD: admin + KEYCLOAK_IMPORT: /tmp/realm.json + PROXY_ADDRESS_FORWARDING: "true" + volumes: + - ./keycloak/realm.json:/tmp/realm.json + depends_on: [ postgres ] diff --git a/dev/keycloak/realm.json b/dev/keycloak/realm.json new file mode 100644 index 0000000..a8f59a8 --- /dev/null +++ b/dev/keycloak/realm.json @@ -0,0 +1,1997 @@ +{ + "id": "catalyst", + "realm": "catalyst", + "notBefore": 0, + "defaultSignatureAlgorithm": "RS256", + "revokeRefreshToken": false, + "refreshTokenMaxReuse": 0, + "accessTokenLifespan": 300, + "accessTokenLifespanForImplicitFlow": 900, + "ssoSessionIdleTimeout": 1800, + "ssoSessionMaxLifespan": 36000, + "ssoSessionIdleTimeoutRememberMe": 0, + "ssoSessionMaxLifespanRememberMe": 0, + "offlineSessionIdleTimeout": 2592000, + "offlineSessionMaxLifespanEnabled": false, + "offlineSessionMaxLifespan": 5184000, + "clientSessionIdleTimeout": 0, + "clientSessionMaxLifespan": 0, + "clientOfflineSessionIdleTimeout": 0, + "clientOfflineSessionMaxLifespan": 0, + "accessCodeLifespan": 60, + "accessCodeLifespanUserAction": 300, + "accessCodeLifespanLogin": 1800, + "actionTokenGeneratedByAdminLifespan": 43200, + "actionTokenGeneratedByUserLifespan": 300, + "oauth2DeviceCodeLifespan": 600, + "oauth2DevicePollingInterval": 5, + "enabled": true, + "sslRequired": "external", + "registrationAllowed": false, + "registrationEmailAsUsername": false, + "rememberMe": false, + "verifyEmail": false, + "loginWithEmailAllowed": true, + "duplicateEmailsAllowed": false, + "resetPasswordAllowed": false, + "editUsernameAllowed": false, + "bruteForceProtected": false, + "permanentLockout": false, + "maxFailureWaitSeconds": 900, + "minimumQuickLoginWaitSeconds": 60, + "waitIncrementSeconds": 60, + "quickLoginCheckMilliSeconds": 1000, + "maxDeltaTimeSeconds": 43200, + "failureFactor": 30, + "defaultRole": { + "id": "43c7a86b-0423-4699-bc4f-94979c8995c6", + "name": "default-roles-catalyst", + "description": "${role_default-roles}", + "composite": true, + "clientRole": false, + "containerId": "catalyst" + }, + "requiredCredentials": [ + "password" + ], + "otpPolicyType": "totp", + "otpPolicyAlgorithm": "HmacSHA1", + "otpPolicyInitialCounter": 0, + "otpPolicyDigits": 6, + "otpPolicyLookAheadWindow": 1, + "otpPolicyPeriod": 30, + "otpSupportedApplications": [ + "FreeOTP", + "Google Authenticator" + ], + "webAuthnPolicyRpEntityName": "keycloak", + "webAuthnPolicySignatureAlgorithms": [ + "ES256" + ], + "webAuthnPolicyRpId": "", + "webAuthnPolicyAttestationConveyancePreference": "not specified", + "webAuthnPolicyAuthenticatorAttachment": "not specified", + "webAuthnPolicyRequireResidentKey": "not specified", + "webAuthnPolicyUserVerificationRequirement": "not specified", + "webAuthnPolicyCreateTimeout": 0, + "webAuthnPolicyAvoidSameAuthenticatorRegister": false, + "webAuthnPolicyAcceptableAaguids": [], + "webAuthnPolicyPasswordlessRpEntityName": "keycloak", + "webAuthnPolicyPasswordlessSignatureAlgorithms": [ + "ES256" + ], + "webAuthnPolicyPasswordlessRpId": "", + "webAuthnPolicyPasswordlessAttestationConveyancePreference": "not specified", + "webAuthnPolicyPasswordlessAuthenticatorAttachment": "not specified", + "webAuthnPolicyPasswordlessRequireResidentKey": "not specified", + "webAuthnPolicyPasswordlessUserVerificationRequirement": "not specified", + "webAuthnPolicyPasswordlessCreateTimeout": 0, + "webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister": false, + "webAuthnPolicyPasswordlessAcceptableAaguids": [], + "users": [ + { + "id": "2da488d4-f934-4cfc-92fe-16bfbfd693e2", + "createdTimestamp": 1625168814915, + "username": "service-account-reader", + "enabled": true, + "totp": false, + "emailVerified": false, + "serviceAccountClientId": "reader", + "disableableCredentialTypes": [], + "requiredActions": [], + "notBefore": 0 + }, + { + "username" : "alice", + "enabled": true, + "email" : "alice@example.org", + "firstName": "Alice", + "lastName": "Alert Analyst", + "credentials" : [ + { "type" : "password", "value" : "alice" } + ] + }, + { + "username" : "bob", + "enabled": true, + "email" : "bob@example.org", + "firstName": "Bob", + "lastName": "Incident Handler", + "credentials" : [ + { "type" : "password", "value" : "bob" } + ] + }, + { + "username" : "carol", + "enabled": true, + "email" : "carol@example.org", + "firstName": "Carol", + "lastName": "Forensicator", + "credentials" : [ + { "type" : "password", "value" : "carol" } + ] + }, + { + "username" : "dave", + "enabled": true, + "email" : "dave@example.org", + "firstName": "Dave", + "lastName": "Admin", + "credentials" : [ + { "type" : "password", "value" : "dave" } + ] + }, + { + "username" : "eve", + "enabled": true, + "email" : "eve@example.org", + "firstName": "Eve", + "lastName": "Team Lead", + "credentials" : [ + { "type" : "password", "value" : "eve" } + ] + } + ], + "scopeMappings": [ + { + "clientScope": "offline_access", + "roles": [ + "offline_access" + ] + } + ], + "clientScopeMappings": { + "account": [ + { + "client": "account-console", + "roles": [ + "manage-account" + ] + } + ] + }, + "clients": [ + { + "id": "86c72872-e504-4a19-89d6-5c3843a107c6", + "clientId": "account", + "name": "${client_account}", + "rootUrl": "${authBaseUrl}", + "baseUrl": "/realms/catalyst/account/", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "redirectUris": [ + "/realms/catalyst/account/*" + ], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": true, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": {}, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "defaultClientScopes": [ + "web-origins", + "roles", + "profile", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + }, + { + "id": "50acde65-ed47-42ed-9447-0b4b43983cf9", + "clientId": "account-console", + "name": "${client_account-console}", + "rootUrl": "${authBaseUrl}", + "baseUrl": "/realms/catalyst/account/", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "redirectUris": [ + "/realms/catalyst/account/*" + ], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": true, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "pkce.code.challenge.method": "S256" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "protocolMappers": [ + { + "id": "8f05de9b-20b0-4cb0-9885-c1f08b16494d", + "name": "audience resolve", + "protocol": "openid-connect", + "protocolMapper": "oidc-audience-resolve-mapper", + "consentRequired": false, + "config": {} + } + ], + "defaultClientScopes": [ + "web-origins", + "roles", + "profile", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + }, + { + "id": "ce10e93d-9e15-4420-a8fd-c8fb8d262596", + "clientId": "admin-cli", + "name": "${client_admin-cli}", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "redirectUris": [], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": false, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": true, + "serviceAccountsEnabled": false, + "publicClient": true, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": {}, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "defaultClientScopes": [ + "web-origins", + "roles", + "profile", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + }, + { + "id": "ff18f8fb-27be-47c2-9a76-3ceb17ccccd8", + "clientId": "broker", + "name": "${client_broker}", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "redirectUris": [], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": true, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": false, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": {}, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "defaultClientScopes": [ + "web-origins", + "roles", + "profile", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + }, + { + "id": "43419de7-4beb-4401-9a7f-34aedf158305", + "clientId": "reader", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "secret": "**********", + "redirectUris": [], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": false, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": true, + "publicClient": false, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "saml.assertion.signature": "false", + "id.token.as.detached.signature": "false", + "saml.multivalued.roles": "false", + "saml.force.post.binding": "false", + "saml.encrypt": "false", + "oauth2.device.authorization.grant.enabled": "false", + "backchannel.logout.revoke.offline.tokens": "false", + "saml.server.signature": "false", + "saml.server.signature.keyinfo.ext": "false", + "use.refresh.tokens": "true", + "exclude.session.state.from.auth.response": "false", + "oidc.ciba.grant.enabled": "false", + "saml.artifact.binding": "false", + "backchannel.logout.session.required": "true", + "client_credentials.use_refresh_token": "false", + "saml_force_name_id_format": "false", + "saml.client.signature": "false", + "tls.client.certificate.bound.access.tokens": "false", + "saml.authnstatement": "false", + "display.on.consent.screen": "false", + "saml.onetimeuse.condition": "false" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": true, + "nodeReRegistrationTimeout": -1, + "protocolMappers": [ + { + "id": "8da9dcd5-8da3-4280-bdaa-24c4c61b46b2", + "name": "Client Host", + "protocol": "openid-connect", + "protocolMapper": "oidc-usersessionmodel-note-mapper", + "consentRequired": false, + "config": { + "user.session.note": "clientHost", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "clientHost", + "jsonType.label": "String" + } + }, + { + "id": "1e98ec8d-f131-4ef6-9363-a46930896cd3", + "name": "Client ID", + "protocol": "openid-connect", + "protocolMapper": "oidc-usersessionmodel-note-mapper", + "consentRequired": false, + "config": { + "user.session.note": "clientId", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "clientId", + "jsonType.label": "String" + } + }, + { + "id": "85483f67-1ed0-40d1-a67a-29817b99d2b9", + "name": "Client IP Address", + "protocol": "openid-connect", + "protocolMapper": "oidc-usersessionmodel-note-mapper", + "consentRequired": false, + "config": { + "user.session.note": "clientAddress", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "clientAddress", + "jsonType.label": "String" + } + } + ], + "defaultClientScopes": [ + "web-origins", + "roles", + "profile", + "groups", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + }, + { + "id": "d2286137-1944-4a9b-b826-4d5a6f7cdf28", + "clientId": "catalyst", + "rootUrl": "http://catalyst.internal.com/", + "adminUrl": "http://catalyst.internal.com/", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "secret": "d3ec0d91-b6ea-482d-8a4e-2f5a7ca0b4cb", + "redirectUris": [ + "http://catalyst.internal.com/*", + "http://localhost:8000/callback", + "http://localhost/callback" + ], + "webOrigins": [ + "http://catalyst.internal.com", + "http://localhost:8000", + "http://localhost", + "+" + ], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": true, + "serviceAccountsEnabled": false, + "publicClient": false, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "id.token.as.detached.signature": "false", + "saml.assertion.signature": "false", + "saml.force.post.binding": "false", + "saml.multivalued.roles": "false", + "saml.encrypt": "false", + "oauth2.device.authorization.grant.enabled": "false", + "backchannel.logout.revoke.offline.tokens": "false", + "saml.server.signature": "false", + "saml.server.signature.keyinfo.ext": "false", + "use.refresh.tokens": "true", + "exclude.session.state.from.auth.response": "false", + "oidc.ciba.grant.enabled": "false", + "saml.artifact.binding": "false", + "backchannel.logout.session.required": "true", + "client_credentials.use_refresh_token": "false", + "saml_force_name_id_format": "false", + "saml.client.signature": "false", + "tls.client.certificate.bound.access.tokens": "false", + "saml.authnstatement": "false", + "display.on.consent.screen": "false", + "saml.onetimeuse.condition": "false" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": true, + "nodeReRegistrationTimeout": -1, + "defaultClientScopes": [ + "web-origins", + "roles", + "profile", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + }, + { + "id": "6cd83d64-0384-4e16-890d-2fa470b144ab", + "clientId": "realm-management", + "name": "${client_realm-management}", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "redirectUris": [], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": true, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": false, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": {}, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "defaultClientScopes": [ + "web-origins", + "roles", + "profile", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + }, + { + "id": "31f01a93-e892-4874-92be-62e1ba4c49b5", + "clientId": "security-admin-console", + "name": "${client_security-admin-console}", + "rootUrl": "${authAdminUrl}", + "baseUrl": "/admin/catalyst/console/", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "redirectUris": [ + "/admin/catalyst/console/*" + ], + "webOrigins": [ + "+" + ], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": true, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "pkce.code.challenge.method": "S256" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "protocolMappers": [ + { + "id": "bff3e1b7-5125-419d-a97b-720622e79a81", + "name": "locale", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "locale", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "locale", + "jsonType.label": "String" + } + } + ], + "defaultClientScopes": [ + "web-origins", + "roles", + "profile", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + } + ], + "clientScopes": [ + { + "id": "90b39bdb-75ff-4928-ba7a-085b2f735409", + "name": "roles", + "description": "OpenID Connect scope for add user roles to the access token", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "false", + "display.on.consent.screen": "true", + "consent.screen.text": "${rolesScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "8fbf5a86-4629-4b1a-b66d-d957c8158e77", + "name": "audience resolve", + "protocol": "openid-connect", + "protocolMapper": "oidc-audience-resolve-mapper", + "consentRequired": false, + "config": {} + }, + { + "id": "065c0856-09e2-4b2e-ae83-7ca0edc487ac", + "name": "realm roles", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-realm-role-mapper", + "consentRequired": false, + "config": { + "user.attribute": "foo", + "access.token.claim": "true", + "claim.name": "realm_access.roles", + "jsonType.label": "String", + "multivalued": "true" + } + }, + { + "id": "2fca9b42-c6da-4d6a-94ee-c2c8b2731dfe", + "name": "client roles", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-client-role-mapper", + "consentRequired": false, + "config": { + "user.attribute": "foo", + "access.token.claim": "true", + "claim.name": "resource_access.${client_id}.roles", + "jsonType.label": "String", + "multivalued": "true" + } + } + ] + }, + { + "id": "3b637bf5-80f8-4419-921f-334b2c4dd11f", + "name": "groups", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "true" + }, + "protocolMappers": [ + { + "id": "0acdd906-0208-4afa-b33a-01e59b280fac", + "name": "groups", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-realm-role-mapper", + "consentRequired": false, + "config": { + "multivalued": "true", + "user.attribute": "foo", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "groups", + "jsonType.label": "String" + } + } + ] + }, + { + "id": "7afd7e91-0f50-42dc-bfd7-5898ee70b908", + "name": "profile", + "description": "OpenID Connect built-in scope: profile", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "true", + "consent.screen.text": "${profileScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "975e3e1f-daca-4c91-b0ba-69242bbe0945", + "name": "middle name", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "middleName", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "middle_name", + "jsonType.label": "String" + } + }, + { + "id": "fef97135-a66c-48d2-a942-6798e387be15", + "name": "username", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "username", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "preferred_username", + "jsonType.label": "String" + } + }, + { + "id": "b3c5f39f-a126-4840-9103-2ae574344049", + "name": "gender", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "gender", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "gender", + "jsonType.label": "String" + } + }, + { + "id": "04a542fe-c6b1-4880-a0a9-e9a6934bf1f3", + "name": "picture", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "picture", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "picture", + "jsonType.label": "String" + } + }, + { + "id": "78d162f9-b23f-45ca-a671-f2f528229da2", + "name": "profile", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "profile", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "profile", + "jsonType.label": "String" + } + }, + { + "id": "30aecb8d-36fc-465e-a141-dc2b58ff675f", + "name": "birthdate", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "birthdate", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "birthdate", + "jsonType.label": "String" + } + }, + { + "id": "b20432db-d804-4821-989e-e48030d8b562", + "name": "locale", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "locale", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "locale", + "jsonType.label": "String" + } + }, + { + "id": "842ee2fa-5ecb-47f6-a890-f8cbd1ee1eb0", + "name": "full name", + "protocol": "openid-connect", + "protocolMapper": "oidc-full-name-mapper", + "consentRequired": false, + "config": { + "id.token.claim": "true", + "access.token.claim": "true", + "userinfo.token.claim": "true" + } + }, + { + "id": "7ca293bf-c6ba-45cc-b49d-a824ae1284b8", + "name": "family name", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "lastName", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "family_name", + "jsonType.label": "String" + } + }, + { + "id": "4d7f731d-0133-4501-8fd6-3a9918b7d7df", + "name": "nickname", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "nickname", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "nickname", + "jsonType.label": "String" + } + }, + { + "id": "68c7909b-e46d-421e-943d-0fc30d1fa0ab", + "name": "updated at", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "updatedAt", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "updated_at", + "jsonType.label": "String" + } + }, + { + "id": "9f041128-9b6e-4013-af57-e3599ea30465", + "name": "given name", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "firstName", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "given_name", + "jsonType.label": "String" + } + }, + { + "id": "6cfa184f-1163-4b6a-a4da-a96e4720cec6", + "name": "website", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "website", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "website", + "jsonType.label": "String" + } + }, + { + "id": "8328b25a-9b10-4059-ac90-20ffa2d8d331", + "name": "zoneinfo", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "zoneinfo", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "zoneinfo", + "jsonType.label": "String" + } + } + ] + }, + { + "id": "bcac8ddc-27db-4734-99db-ab9f892ea1a6", + "name": "microprofile-jwt", + "description": "Microprofile - JWT built-in scope", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "false" + }, + "protocolMappers": [ + { + "id": "272bbae0-68d0-4466-a756-742a26ad9e7d", + "name": "upn", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "username", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "upn", + "jsonType.label": "String" + } + }, + { + "id": "df5f04b5-544c-4cd4-8ea6-6ce101a72216", + "name": "groups", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-realm-role-mapper", + "consentRequired": false, + "config": { + "multivalued": "true", + "userinfo.token.claim": "true", + "user.attribute": "foo", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "groups", + "jsonType.label": "String" + } + } + ] + }, + { + "id": "cda6829b-af33-462c-99d1-198bcfe1a648", + "name": "phone", + "description": "OpenID Connect built-in scope: phone", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "true", + "consent.screen.text": "${phoneScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "834b65c6-72ac-4884-9fc6-d81e68d00e2e", + "name": "phone number verified", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "phoneNumberVerified", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "phone_number_verified", + "jsonType.label": "boolean" + } + }, + { + "id": "1d6d57b3-4500-4888-8473-c10b5c91dbb6", + "name": "phone number", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "phoneNumber", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "phone_number", + "jsonType.label": "String" + } + } + ] + }, + { + "id": "ed16c65e-eede-4dfa-a1c7-332cd0d3d2b0", + "name": "web-origins", + "description": "OpenID Connect scope for add allowed web origins to the access token", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "false", + "display.on.consent.screen": "false", + "consent.screen.text": "" + }, + "protocolMappers": [ + { + "id": "f6507f62-0e6b-4e46-8124-216eed351d9a", + "name": "allowed web origins", + "protocol": "openid-connect", + "protocolMapper": "oidc-allowed-origins-mapper", + "consentRequired": false, + "config": {} + } + ] + }, + { + "id": "22de1ea1-162c-4bca-a864-ce1c41a98984", + "name": "email", + "description": "OpenID Connect built-in scope: email", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "true", + "consent.screen.text": "${emailScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "5bb8438c-d485-4134-bc7c-006337364a8c", + "name": "email", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "email", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "email", + "jsonType.label": "String" + } + }, + { + "id": "3914a22d-f4f2-4278-8df6-17b3a2d79c11", + "name": "email verified", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "emailVerified", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "email_verified", + "jsonType.label": "boolean" + } + } + ] + }, + { + "id": "44eb06c1-1f84-4f20-9fe5-af2dd2652883", + "name": "role_list", + "description": "SAML role list", + "protocol": "saml", + "attributes": { + "consent.screen.text": "${samlRoleListScopeConsentText}", + "display.on.consent.screen": "true" + }, + "protocolMappers": [ + { + "id": "377fcde9-859d-4022-81e1-b08c523e9eea", + "name": "role list", + "protocol": "saml", + "protocolMapper": "saml-role-list-mapper", + "consentRequired": false, + "config": { + "single": "false", + "attribute.nameformat": "Basic", + "attribute.name": "Role" + } + } + ] + }, + { + "id": "9b141075-26c2-45d9-b4be-fd3c3cbb3c51", + "name": "address", + "description": "OpenID Connect built-in scope: address", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "true", + "consent.screen.text": "${addressScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "7cec2511-c0ef-4f79-842f-3c68573dc5a7", + "name": "address", + "protocol": "openid-connect", + "protocolMapper": "oidc-address-mapper", + "consentRequired": false, + "config": { + "user.attribute.formatted": "formatted", + "user.attribute.country": "country", + "user.attribute.postal_code": "postal_code", + "userinfo.token.claim": "true", + "user.attribute.street": "street", + "id.token.claim": "true", + "user.attribute.region": "region", + "access.token.claim": "true", + "user.attribute.locality": "locality" + } + } + ] + }, + { + "id": "40730fee-dab9-408b-934d-bc6eeea12ff8", + "name": "offline_access", + "description": "OpenID Connect built-in scope: offline_access", + "protocol": "openid-connect", + "attributes": { + "consent.screen.text": "${offlineAccessScopeConsentText}", + "display.on.consent.screen": "true" + } + } + ], + "defaultDefaultClientScopes": [ + "role_list", + "profile", + "email", + "roles", + "web-origins" + ], + "defaultOptionalClientScopes": [ + "offline_access", + "address", + "phone", + "microprofile-jwt" + ], + "browserSecurityHeaders": { + "contentSecurityPolicyReportOnly": "", + "xContentTypeOptions": "nosniff", + "xRobotsTag": "none", + "xFrameOptions": "SAMEORIGIN", + "contentSecurityPolicy": "frame-src 'self'; frame-ancestors 'self'; object-src 'none';", + "xXSSProtection": "1; mode=block", + "strictTransportSecurity": "max-age=31536000; includeSubDomains" + }, + "smtpServer": {}, + "eventsEnabled": false, + "eventsListeners": [ + "jboss-logging" + ], + "enabledEventTypes": [], + "adminEventsEnabled": false, + "adminEventsDetailsEnabled": false, + "identityProviders": [], + "identityProviderMappers": [], + "components": { + "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy": [ + { + "id": "4b06a544-5815-47c4-8e21-e5e0c44af05b", + "name": "Trusted Hosts", + "providerId": "trusted-hosts", + "subType": "anonymous", + "subComponents": {}, + "config": { + "host-sending-registration-request-must-match": [ + "true" + ], + "client-uris-must-match": [ + "true" + ] + } + }, + { + "id": "b58228d2-64f7-4880-bdb4-b37902896176", + "name": "Allowed Protocol Mapper Types", + "providerId": "allowed-protocol-mappers", + "subType": "authenticated", + "subComponents": {}, + "config": { + "allowed-protocol-mapper-types": [ + "saml-user-attribute-mapper", + "oidc-sha256-pairwise-sub-mapper", + "oidc-address-mapper", + "oidc-full-name-mapper", + "saml-user-property-mapper", + "oidc-usermodel-property-mapper", + "saml-role-list-mapper", + "oidc-usermodel-attribute-mapper" + ] + } + }, + { + "id": "2122720d-ea69-4bfa-834e-f1dd12ad55df", + "name": "Max Clients Limit", + "providerId": "max-clients", + "subType": "anonymous", + "subComponents": {}, + "config": { + "max-clients": [ + "200" + ] + } + }, + { + "id": "e1a99694-7f99-416d-8e80-2ab92c53034a", + "name": "Consent Required", + "providerId": "consent-required", + "subType": "anonymous", + "subComponents": {}, + "config": {} + }, + { + "id": "83ae6ccc-24c1-47d5-9bae-59879a90e2a4", + "name": "Allowed Client Scopes", + "providerId": "allowed-client-templates", + "subType": "anonymous", + "subComponents": {}, + "config": { + "allow-default-scopes": [ + "true" + ] + } + }, + { + "id": "15dcc7e3-13a1-45d2-b95c-f92cb7b86471", + "name": "Allowed Client Scopes", + "providerId": "allowed-client-templates", + "subType": "authenticated", + "subComponents": {}, + "config": { + "allow-default-scopes": [ + "true" + ] + } + }, + { + "id": "c9f2eefd-43dd-49fb-b143-f61135c4fc9d", + "name": "Full Scope Disabled", + "providerId": "scope", + "subType": "anonymous", + "subComponents": {}, + "config": {} + }, + { + "id": "ef9fa331-eaed-4408-999f-5c2e86e883ea", + "name": "Allowed Protocol Mapper Types", + "providerId": "allowed-protocol-mappers", + "subType": "anonymous", + "subComponents": {}, + "config": { + "allowed-protocol-mapper-types": [ + "saml-user-attribute-mapper", + "oidc-usermodel-property-mapper", + "oidc-address-mapper", + "saml-user-property-mapper", + "oidc-full-name-mapper", + "oidc-usermodel-attribute-mapper", + "oidc-sha256-pairwise-sub-mapper", + "saml-role-list-mapper" + ] + } + } + ], + "org.keycloak.keys.KeyProvider": [ + { + "id": "9681f0d2-cf07-481a-b51b-755824f4c848", + "name": "hmac-generated", + "providerId": "hmac-generated", + "subComponents": {}, + "config": { + "priority": [ + "100" + ], + "algorithm": [ + "HS256" + ] + } + }, + { + "id": "b7310fea-0031-46be-a62d-bcfc363a6b38", + "name": "rsa-generated", + "providerId": "rsa-generated", + "subComponents": {}, + "config": { + "priority": [ + "100" + ] + } + }, + { + "id": "e462b05b-9e22-403c-b715-582c2c7d9d31", + "name": "aes-generated", + "providerId": "aes-generated", + "subComponents": {}, + "config": { + "priority": [ + "100" + ] + } + } + ] + }, + "internationalizationEnabled": false, + "supportedLocales": [], + "authenticationFlows": [ + { + "id": "25cc92da-3b9c-420f-aed4-47fc9a862cf1", + "alias": "Account verification options", + "description": "Method with which to verity the existing account", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "idp-email-verification", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticatorFlow": true, + "requirement": "ALTERNATIVE", + "priority": 20, + "flowAlias": "Verify Existing Account by Re-authentication", + "userSetupAllowed": false, + "autheticatorFlow": true + } + ] + }, + { + "id": "9a50d2e9-9b6c-43d4-9e96-5e0057b9989e", + "alias": "Authentication Options", + "description": "Authentication options.", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "basic-auth", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "basic-auth-otp", + "authenticatorFlow": false, + "requirement": "DISABLED", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "auth-spnego", + "authenticatorFlow": false, + "requirement": "DISABLED", + "priority": 30, + "userSetupAllowed": false, + "autheticatorFlow": false + } + ] + }, + { + "id": "9c08f7ff-0ae1-4917-acde-a86918c21392", + "alias": "Browser - Conditional OTP", + "description": "Flow to determine if the OTP is required for the authentication", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "conditional-user-configured", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "auth-otp-form", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + } + ] + }, + { + "id": "cc263684-5287-48c3-b36f-cf0307e5866f", + "alias": "Direct Grant - Conditional OTP", + "description": "Flow to determine if the OTP is required for the authentication", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "conditional-user-configured", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "direct-grant-validate-otp", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + } + ] + }, + { + "id": "2d1b3b73-d844-48e6-9564-ebb612eb1ecd", + "alias": "First broker login - Conditional OTP", + "description": "Flow to determine if the OTP is required for the authentication", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "conditional-user-configured", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "auth-otp-form", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + } + ] + }, + { + "id": "05ead699-855a-4a82-a040-93fccf6ddc91", + "alias": "Handle Existing Account", + "description": "Handle what to do if there is existing account with same email/username like authenticated identity provider", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "idp-confirm-link", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticatorFlow": true, + "requirement": "REQUIRED", + "priority": 20, + "flowAlias": "Account verification options", + "userSetupAllowed": false, + "autheticatorFlow": true + } + ] + }, + { + "id": "2c0e2ddf-4de7-44ff-8e3c-7d547e6cc52b", + "alias": "Reset - Conditional OTP", + "description": "Flow to determine if the OTP should be reset or not. Set to REQUIRED to force.", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "conditional-user-configured", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "reset-otp", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + } + ] + }, + { + "id": "9ce700a0-743c-42f9-be51-83e11beb1521", + "alias": "User creation or linking", + "description": "Flow for the existing/non-existing user alternatives", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticatorConfig": "create unique user config", + "authenticator": "idp-create-user-if-unique", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticatorFlow": true, + "requirement": "ALTERNATIVE", + "priority": 20, + "flowAlias": "Handle Existing Account", + "userSetupAllowed": false, + "autheticatorFlow": true + } + ] + }, + { + "id": "f2454788-daaa-4c04-ad4f-b3d686727665", + "alias": "Verify Existing Account by Re-authentication", + "description": "Reauthentication of existing account", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "idp-username-password-form", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticatorFlow": true, + "requirement": "CONDITIONAL", + "priority": 20, + "flowAlias": "First broker login - Conditional OTP", + "userSetupAllowed": false, + "autheticatorFlow": true + } + ] + }, + { + "id": "fd57d3fe-8353-4d51-ab6b-531f1b6484d0", + "alias": "browser", + "description": "browser based authentication", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "auth-cookie", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "auth-spnego", + "authenticatorFlow": false, + "requirement": "DISABLED", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "identity-provider-redirector", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 25, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticatorFlow": true, + "requirement": "ALTERNATIVE", + "priority": 30, + "flowAlias": "forms", + "userSetupAllowed": false, + "autheticatorFlow": true + } + ] + }, + { + "id": "0895ae02-6132-41aa-8e2a-ae7ef8a1a090", + "alias": "clients", + "description": "Base authentication for clients", + "providerId": "client-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "client-secret", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "client-jwt", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "client-secret-jwt", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 30, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "client-x509", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 40, + "userSetupAllowed": false, + "autheticatorFlow": false + } + ] + }, + { + "id": "f1cd5fb9-4201-4645-a4f7-72e2404f9b5f", + "alias": "direct grant", + "description": "OpenID Connect Resource Owner Grant", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "direct-grant-validate-username", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "direct-grant-validate-password", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticatorFlow": true, + "requirement": "CONDITIONAL", + "priority": 30, + "flowAlias": "Direct Grant - Conditional OTP", + "userSetupAllowed": false, + "autheticatorFlow": true + } + ] + }, + { + "id": "34571ce1-2cc9-4ee6-be67-88761c35fb1e", + "alias": "docker auth", + "description": "Used by Docker clients to authenticate against the IDP", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "docker-http-basic-authenticator", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + } + ] + }, + { + "id": "708e0448-2e55-4e93-8d27-2bcb30fb484e", + "alias": "first broker login", + "description": "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticatorConfig": "review profile config", + "authenticator": "idp-review-profile", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticatorFlow": true, + "requirement": "REQUIRED", + "priority": 20, + "flowAlias": "User creation or linking", + "userSetupAllowed": false, + "autheticatorFlow": true + } + ] + }, + { + "id": "4e1d40ab-f072-4deb-ba28-3938d306a5e2", + "alias": "forms", + "description": "Username, password, otp and other auth forms.", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "auth-username-password-form", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticatorFlow": true, + "requirement": "CONDITIONAL", + "priority": 20, + "flowAlias": "Browser - Conditional OTP", + "userSetupAllowed": false, + "autheticatorFlow": true + } + ] + }, + { + "id": "fad42d83-0a6b-441a-a217-73ea14f7460d", + "alias": "http challenge", + "description": "An authentication flow based on challenge-response HTTP Authentication Schemes", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "no-cookie-redirect", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticatorFlow": true, + "requirement": "REQUIRED", + "priority": 20, + "flowAlias": "Authentication Options", + "userSetupAllowed": false, + "autheticatorFlow": true + } + ] + }, + { + "id": "f44f939f-75c5-4080-880b-00ccb4a7496e", + "alias": "registration", + "description": "registration flow", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "registration-page-form", + "authenticatorFlow": true, + "requirement": "REQUIRED", + "priority": 10, + "flowAlias": "registration form", + "userSetupAllowed": false, + "autheticatorFlow": true + } + ] + }, + { + "id": "e7350e5b-1f96-4b34-94ac-0fd465f1d7a9", + "alias": "registration form", + "description": "registration form", + "providerId": "form-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "registration-user-creation", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "registration-profile-action", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 40, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "registration-password-action", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 50, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "registration-recaptcha-action", + "authenticatorFlow": false, + "requirement": "DISABLED", + "priority": 60, + "userSetupAllowed": false, + "autheticatorFlow": false + } + ] + }, + { + "id": "34cc3df0-1908-4a02-89df-08560e2a3e6c", + "alias": "reset credentials", + "description": "Reset credentials for a user if they forgot their password or something", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "reset-credentials-choose-user", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "reset-credential-email", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticator": "reset-password", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 30, + "userSetupAllowed": false, + "autheticatorFlow": false + }, + { + "authenticatorFlow": true, + "requirement": "CONDITIONAL", + "priority": 40, + "flowAlias": "Reset - Conditional OTP", + "userSetupAllowed": false, + "autheticatorFlow": true + } + ] + }, + { + "id": "d92671ab-6873-4eac-863a-becb6cdaa9f4", + "alias": "saml ecp", + "description": "SAML ECP Profile Authentication Flow", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "http-basic-authenticator", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "userSetupAllowed": false, + "autheticatorFlow": false + } + ] + } + ], + "authenticatorConfig": [ + { + "id": "d73bbeaf-a93d-4b97-8c6b-d01b015f2861", + "alias": "create unique user config", + "config": { + "require.password.update.after.registration": "false" + } + }, + { + "id": "a459ffde-e6fc-41d8-9ab8-c7b65b4384c3", + "alias": "review profile config", + "config": { + "update.profile.on.first.login": "missing" + } + } + ], + "requiredActions": [ + { + "alias": "CONFIGURE_TOTP", + "name": "Configure OTP", + "providerId": "CONFIGURE_TOTP", + "enabled": true, + "defaultAction": false, + "priority": 10, + "config": {} + }, + { + "alias": "terms_and_conditions", + "name": "Terms and Conditions", + "providerId": "terms_and_conditions", + "enabled": false, + "defaultAction": false, + "priority": 20, + "config": {} + }, + { + "alias": "UPDATE_PASSWORD", + "name": "Update Password", + "providerId": "UPDATE_PASSWORD", + "enabled": true, + "defaultAction": false, + "priority": 30, + "config": {} + }, + { + "alias": "UPDATE_PROFILE", + "name": "Update Profile", + "providerId": "UPDATE_PROFILE", + "enabled": true, + "defaultAction": false, + "priority": 40, + "config": {} + }, + { + "alias": "VERIFY_EMAIL", + "name": "Verify Email", + "providerId": "VERIFY_EMAIL", + "enabled": true, + "defaultAction": false, + "priority": 50, + "config": {} + }, + { + "alias": "delete_account", + "name": "Delete Account", + "providerId": "delete_account", + "enabled": false, + "defaultAction": false, + "priority": 60, + "config": {} + }, + { + "alias": "update_user_locale", + "name": "Update User Locale", + "providerId": "update_user_locale", + "enabled": true, + "defaultAction": false, + "priority": 1000, + "config": {} + } + ], + "browserFlow": "browser", + "registrationFlow": "registration", + "directGrantFlow": "direct grant", + "resetCredentialsFlow": "reset credentials", + "clientAuthenticationFlow": "clients", + "dockerAuthenticationFlow": "docker auth", + "attributes": { + "cibaBackchannelTokenDeliveryMode": "poll", + "cibaExpiresIn": "120", + "cibaAuthRequestedUserHint": "login_hint", + "oauth2DeviceCodeLifespan": "600", + "clientOfflineSessionMaxLifespan": "0", + "oauth2DevicePollingInterval": "5", + "clientSessionIdleTimeout": "0", + "clientSessionMaxLifespan": "0", + "clientOfflineSessionIdleTimeout": "0", + "cibaInterval": "5" + }, + "keycloakVersion": "14.0.0", + "userManagedAccessAllowed": false, + "clientProfiles": { + "profiles": [] + }, + "clientPolicies": { + "policies": [] + } +} diff --git a/dev/nginx.conf b/dev/nginx.conf new file mode 100644 index 0000000..fcb5a48 --- /dev/null +++ b/dev/nginx.conf @@ -0,0 +1,89 @@ +user www-data; +worker_processes 5; +error_log /var/log/nginx/error.log; + +events { + worker_connections 4096; +} + +http { + include mime.types; + index index.html index.htm; + + log_format main '$remote_addr - $remote_user [$time_local] $status ' + '"$request" $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + access_log /var/log/nginx/access.log main; + + server { + listen 80 default_server; + server_name _; + + location / { + resolver 127.0.0.11 valid=30s; + set $upstream_catalyst host.docker.internal; + proxy_pass http://$upstream_catalyst:8000; + } + + location /wss { + resolver 127.0.0.11 valid=30s; + set $upstream_catalyst host.docker.internal; + proxy_pass http://$upstream_catalyst:8000; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_read_timeout 86400; + } + } + + server { + listen 8529 default_server; + server_name _; + + location / { + resolver 127.0.0.11 valid=30s; + set $upstream_arangodb arangodb; + proxy_pass http://$upstream_arangodb:8529; + } + } + + server { + listen 9000 default_server; + server_name _; + + location / { + resolver 127.0.0.11 valid=30s; + set $upstream_minio minio; + proxy_pass http://$upstream_minio:9000; + } + } + + server { + listen 9002 default_server; + server_name _; + + location / { + resolver 127.0.0.11 valid=30s; + set $upstream_keycloak keycloak; + proxy_pass http://$upstream_keycloak:8080; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Port $server_port; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Server $host; + } + } +} + +stream { + server { + listen 9001; + + resolver 127.0.0.11 valid=30s; + set $upstream_emitter emitter; + proxy_pass $upstream_emitter:8080; + } +} diff --git a/docs/screenshots/automation.png b/docs/screenshots/automation.png new file mode 100644 index 0000000000000000000000000000000000000000..5c011cb68caa786959ff78c2bc7cb7bdc6e5a056 GIT binary patch literal 254191 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

DeioGy*liUynm5mM;;r(D#4I##W-* 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%0DmlngkZ0Xe~hb zw*RRaVB%o5zt~|0$k3YsW~mDR>HYzb>*RTSM?HW3oK3_(r~=gYO3=TLNdHMG|F$Q? zB{m7yrg?`su6!xX>LlDjXT%sc3?@?1p3@yA&l6SppWp}8r}|5ZuR20C)uK##b109r z1Yas%uVq{Y^u-W#8ZBqM7}E!NLmIA~_FwjQF0xa0`|1kE|aZ#;Z+bT$iG>X&=jR*pwbPOq_G$IO&2ucXj z(hLYnNtaSXN(o4b{>qH%BMFlqAjdJjOyuZcVfC~AS= z_oB}YKKr*A(VWU~{)A>vEO(bPcm9!0zV=kKn=1F<+o6 zW91LxD){afmlthUVqg>c5I23xo&>bA+WmV}2Yr$q9PX@~>4y1=ogeAW^JHt#=TiFh z)HDn_sPDd`oDEiX6(tV1O`Jr^y;$EjA)}r zWdu8{fpq%y#S0&TXU|=@)Sa%#srOT1AeoZZIAN63uSe&xTSiAwADfVg~Tda&Bde+e3a?!o7TPwxT|Ipo!#sbp(`eqa{_O8Yr=X_# zq%D-zqF?U#o(~j&M}NxEZe0-nmlCSE?rvryI@x^s#J$PQyfVY;D8(q@)GY@|2PWHR{EPk>DR41MWzG8Ym;3i4#XceYJL zPW|gP(To8ymB07N=$xc_Rr5G=-b*dgKO^Jr;fzzcyOe8WFSHh)%;uJuZ~kne{jIvt zy5u!_ytjDLsG35i4%?DxK{DlpTL0fRToGc-(H2XTldKp zPS^ni>#p6g(X}x>kUHE!LhR4x>wyC7n-=A(&-B}K|5Ab9RGN*H$W)|Dz95nP1nkW1 z#5I3!AV`F6NBI&W?l`toe=5CY| zHpg-BFSA)9taRO7qHduqCm@M~$|`p(=sEJVp9L6X;1ie_-ItmNX2qn?Tw7PDgZE~k zbt8YT;9fV!a46GpT;vx6Ldj4;vY-iFX~TYxAxP5ciR4}zy_Uo2W~I*TR|5XD6&QOr zE%NyHGK4a)gNOJ-k|)Fd?u}gmpw~>e0KFjG+T*dycc=&1yPYs+*tXSXA7+`Afv*|_ z*Dtz)_^xW1t!CU_P+cRSzHV2ydyTfpN)w)wyTT!0D zXaEZUy85sA=71vYS?_T$Lbw~vC`s3|D?G0?`)F4Gx+{ATmkwLnWt{q`PTkT8c+!PX z{@#;$;v3|GaZsrz`^5K+MdPD5(R5eZz+k$&&tgRTt`|o!kg`^}##lQYjbcD z7n9xEwiZ!9DKp-jZ-3UtdHL6#^3PEBj|)^-QOI;ASNs}(v z(qZ@L&?@O9im6>UFi&(}H<9tXJ=q>H_5;GPapnc6Z_v^2-N)`;&7~|U^VT_t9>K*Pa z>|t$g{8yY+OxO#+DhwnXi8jh1;_IVORPOlv0Q*39_a_&8Uc~gzlj!M5wX@z-(@DGV zTVRk`m~FA}|M(EA$r|=Z+%&?HfhO8T#C+7FR>A;jETywfVO(gwsV<#`ik}j@Rv~@2 zO2#WDZa8()60yaLg5J}ZvAWPAH8ns4)I_y@|5j?S^dYVOB*(X|71W8f{1)#SUS1M+ zIIM+-pu2V6mYUVSJpsrXtVRRPG4L!+5brVEh?WymlrX8p)#@@JgM=6BUgqxH6<7L|GoS*J6 zRp$gLO95$dTsRTn;`5LF*0^}JgI<;pZ0uUKkWGHA0q2QQq+VX$c=2H8@6E3&;=r@B zd5hJ7teb03r^VTum%pB+74^cTayA2*pQm5_slN5r^3-+35&_ns2b^*HUre5xT0>5*;{DplRVQvBrrakka?esTdc zqtw+@BCQLY6=B+qc!N&Ly^s)=PFB}@Ul00Zl!3Y3QW%qE4HeJ zFMPS7ag&9Jl5*2%lR9&}>e1RT9X|gm z!7!=$2Ax)dD)XGF7jIz&FQ`~^Yth#DvCfU`#o5r2Y!C#fM>#sL=cwI)-AZ*cN}^sD zli#m$6k)pk{NC3y3X3!3%i;4`;Nde0)h@<~!0_15PIE20z#_`}0_`{ClZA4wKdy-F z%5SGk(Y}jZXRts1^^2m*0DZ6h{xS|wqDTj69yq0trku_353^vmFReqqo*r^DD*hNfm4}BBzN?gm?n}y%%wFUr=?yTcHdBXT%rgv-JSCTr< zCYV~n_%g0Nao(_MPe!xUqTF%Tv@TS%|D&c1 z3`y%c<3Tw~XPSw$$liK1ZkVl|jF$Odsc_GX-+qgA9mYviPnwMhnYCU`eaYngYS_=( z)gVSrWgLqn;GhQ`pO!bE1n&nfUv82$00?<%fC7{PkP(7C{$5qP;{#lg6Cj%RF=Qk0 z-L&UIWMYbVIOa^Lz?OB#vr|Sqe9w?Yr4e3jCqDHvpqan^CEXX$IG6A7&Or-$hk3^C z;c{O(3;TO2na$6;06WH)PwDmBbpo_~Di(5p#KI4^^>SyxpD!NWZUSQ2@J{{nyQUWZ zESkhG5I?N_s5h%Tt2BFmR{iXNkBb(m#O4J+*%&Y}$wGGz^3-h9z%v&gSLH-dp+fDo zlBL&T)dsQD_y6!0!XE96-B}}4(>Gmx={@^V#6Q_1gf=yjEI$7}l>`L4vO766 z))F93)Upzd^<5qM?C&m#o4wri;0@Qbfxo#nBuhgwUi*u?E0E3?3)N#O?}A)kPrK{`w261#F^k<0 zyAPbVn7ZB{-YCnceF|5Wi)3VR;HFSbTQtM)M9%S8~AQHZ4*Jjhuv9p#R1MF z4b(^i-OPG#Ol4HA?VG@WA!+&tQz2TRN~hzU@<~ZqJ^&B=ut&&b!cPoqrtwzgU71{| zG43(;v0HF*)y`Y~r8^YD4K$4aAVxb<^SrU4$J!@J)eBh9-L!Jqi442bao) z=X^5&cB8eF1@A@KgKRcSqA^xsP8lz$fEQ>${7dx_$*ut$WBAD8DL`u=$|S!V2++Gg zVRBeNLQHVfs26MB^ZK*ZQp#aORf@TsgDL%!#~Ps-^D+Tm%LG7Ms@i^l>f`2Zvbq1+ z=V9TxAWIQ;0mj)vDj!^NlJ@?-Z@7N-pf16qV&z)-<;-;}81s%lFi&#h>qOEihOg-L$LT zja&|rpjO-TQh8YCYy0)(ezk?s<z~0IK`n3;Vk1DNKruR|zP?IE$yKLI? ziRVcmfIh&W^&+EbOh?<-v*KOFKeN@-q~ilXS>MS19ORWd*HFR0q|(*ze^lwVrC?{} z__^D?r9s^;k=gS3!HT5 zIrKkBMXK{O3SJ~h1brM%R&NKqRu(PjZvTBGML^)v=dwv6YT1}wE~W6sq9*hY$0T_V z)Vs>nn!IOy;6X7!F%eGZ)m{DV>({Ym>BUK6Ky@kf(sn1)3IW?s$laix8emjxb-&y8 zbPqd&ZVfvc2t)&Dc#k=XI%WFC%|8D(*;w) zsX2|l1zh3aHhqyM)6u%Z(87$YBjKny*=8@If65XUk&L4G+(AlQ(FHBNeIz_AyO{sz zl2>&p@jRn`6oK&u?&#@M8bVXQm!u6e#v*Bi`EK;TbGj@V8{h7@R0paPda8XV(Ro`J zJP+blh{4u}m04W?&xMd3zS8 zw-(gA(?*ZJco34jj9|bV0%Sa{SAS?Mxrlo@JzfjEAyMY7TNYY4^;Vrd`yB&L*(x=d zbT&p3f*Fi%0qU-#qHnK&B$MYtgeGS}Xio|#Cue+^?DaX$V$g+%kUm)~FLQVS4>1^! zCid+aI}Py>&h8BrY>`-)4MYjmZ|aL?k)l=R2B=KlIMP0p*=cZPuFRfbujwJDEZu10Di<=O4-rAZ(S=wk~>suET{K)>4>gaYz#0(k=Sc7UNIL` zG8LZFa2)nR@uKKuof79HhQ}Yifw?DvGxaz@8b8%V#sxl6vh24nbd)~W@O5#NLJrv% z*du7Z`U4XHl;!R*ki31|;ocn@np>wh-y%jzd;LO$EYgDW&Wnkd51uJ{X0gbiVNs`{% zI(W$J8zt4{E9p5zO^LZllueL{&iDQ4O~N-OTpItLvj))G2osne{{PDQ% zNIQ{{HHE})wgLB86^;G6iQ;(gnkyk(vb`r1LS$QlC+8tdd*DAxhr5{z9L;fdD&&gV zd-Ljgp;VHKG0H39$}u4=jA7D;e|+%U}$D+@@eQYVENuF|7Eu44z77ddqj`}dXWY(w56jC0Ay zFEr%&2t9L!FCcKJ*5+7>z*m4qVem}7R_q%Eth!?&?$#A|4hatU{s#5yMAuITZ>jVi zsaWB5Lm>BhXB9LR zuXjgh#@rEf;l*f5wNHm2w3hR5H3J@w<-;bS6_Rsr` z0oNp46P(Nx6`UMs(XN1QR(>AIXlX*oX|+f{*ThJf>7%p|H#>`Sh3#0oNadq&+mhPX zT6-3Lw8Hj3nXLyMwR&O-S!=1yqNN>aqG;~YOs16y`>kn(dD7EHnD1e}Z`sO@%99Qi z9+@o2gfxC{PPC~7D%0K{*<@i4EKLPn$-LU>;#Fcb*2_5nIFJ=`MgF*!;eNON+b7?K zBGA_CJI340OWuNXdhMc;1If>bIp6@MZtPs)sCkQZz^a65MIsBSv{abMNa3>}q$kbf zs6B&29f0-udzm>&9_V7KRV(d(d8`*+%JTGVjqrou-7Lj=-CfYib!yLn|6|C{}eI!btA}DMF#^ zV}dVGxM`g#eoiCS`iVV;5j;-%JeuNXPO#so{bR)IW`NCja=iohXXP6hdN!+NaOb=u zrt;88&r{^y;uYd{VDNp$PU&L3T>bIo$1m%Qy4$-fxLUDeR}*@A8uaQe>i?*_&oLB} zA?Iy$=kkXZWh>4PkGNvkr#e3iGw2D*c1;5ZoN@fy&du(NU9mjFvS}e?Pmv`_WIod6 zf=oV?ORw2Bm*nq8GA9=2%H|RQp6=o|I;t7wJ=kQj`ZVY32#Xef1@|Wb!0qJ zo#XhDJsj?EBSOW%gg;kTKH9}K@ntoGek>1_6tpDK&UI;uG5My|r;!?!hp%D|`p%Q< zYFxefXk?T5r+ZQ~(Nx&=A$@0+%hNCdF6{GjCP{h1=4~Fu=>E6aZwiD%ysG;H?ME@6 zoFkQT{eV7+&gr*C0ApjX1aj^Jln>LAXcy}^FO{lOjaHmz;*pIw9WCePJwO0e29cft zjkJnpwaPd(wXcbgo<5Z@nE+?mxWPNJFD}ULbwravY1pGS{hJqxlPLZA?9e7i*J{5% z_tD?F;JTE7n;zGx>0M@2r`tXZWE=?Z3azeSDe6|g^?!22hm_BPVJAIk@DHvBW$A{% zU{i{&`9~rYXP!;#^$yxen)SuYA*@wvx+XZ{;7v_x7CK)>TyHdQ@@YQYw-;_-Ew$vJ zEnczQx$s*>-+sk7_zb1CYl#AAO|=}2>GIl}XsbakRbC?Ee>7(^>A9L+o~W@pt33J{ zzIqLG*A*C(1DNrWL(hYrQ#0Qw$jwowTpLXVHJw^y!FKQ#VU07 z1PGOA&uHK*5L+D|%RfsP>y0k}v{uNC!UBWB%Wq`^9#mcOxl0?UXhqgCGEn*k68Rr&x%=vTsYXdPl`_s6{pbQ93`;zK^^f( zJT%3!_8w>BUvq@N?Kn>?RWtXR8njr!Aty1MgltlZRdy+Y5}U-5rmfmQZ2D6KCqYRj z1gjj*f!c)}3hYA)EAgMql=HIgF4A=LQtED98|5A_VhTy1m3ltQEGXXnLg`lOX2HF1 z8to31K_e)ZBX`6CdejA&S%Ff{6W9@t-^Vd_4j zVuhdd0`5Fw3ri&6x~P?ozq-vX+Qzr$=8tU~8RYnc&tkf58F|ERB2mM){gZl-=;<0F zAG=Y3e?Y1gp5Qu{2%w}=8}|2~zxlQOkU*w^?$8eo(pf;?NBbYpbj9)xF7T@#>H)BNQx0J%VHzb?8crZkL5t$f-Q0tY_^lV_ zx1@W_F!jkEd{;>`bNY7C)~oSsGJ~Iab+fWxdr;LhM=+Z771>Jkb>Tk#m8+aw$Y11* z08_GHnm=YOEI8=SdGGlocV3i=hGYx2eh7{QULCgCf<1vdhBWlm+#m;ZhutqI(KO26DYu>d3UnNtmKGv3QPrZG=!=6rD@8zuIw|4i-N%}UB+AdM z5-&}GgDw9oA?-hd({IOi%^mN~=Ba4JLmz<5-zsl8@h?ivzB!3it(Rn|ZZB%9*1gJf z@fg6VLAm7LdRH&xtU|p{lmeRR471$VIv5!jFpj*T|(#t)IAFjO}9L{w5B+HMx z7O-w9PVT<0cJau&gGi1{pn6GsUwVI)>z%USu3ARIE3EpC#9qmd8FcjI_!sjx;Lq4q z$nlgby{(a32X(7E%F^bnpH0tu?|Pln#P35H()<@xrroN@pqw`1uO=K%J%SgG<>Y2C9?P_06tLgzqd7Se<)WY|PZ)=XWOSwAf`Y08kPDUH{owdLSJK*ep*ZcUtBk|q*Gz#$3uwIVAW zU+S%w>unkc9DPD}QNGV~0zm)MOAVT!k8Y?m(Ta7hkc(d1|7p-SI2`own%PiVSad1XHLz;-?&~-oVB_TM{zQL3@`W2^9{4@P^J4gJ; z1zdOQUPu?rAKrX(HE(?Wt09~qKQHlovy-I^{EpO@Vu})CkG{nxN|CMUQ02PY${@E^ z42pW=zsj|`rY0y&=CE1_l3^Xuuwns`%6(;1d6idIG3oMDz`a>P$Sq;Ogvu$3e%&pz zmxDz#N+@0ty2YHyt6_rd7;XK73jlN2$?K3yCN62yN`hgv8aB~#Xq_fhY1Kw)~3v}&rw5>qylg>D$hL7Y0C2nHL5_@BXOk@ zGkUUBA?!i3&rPH`V|p~?T$kzseQg{I#eUkYB$O++8FGr;sqro?(S(cH8@7gT1m|r6 z5!^T&ACHtRdCoOfoD|YkYz>ePeYWDleT&G`FxmcWddDOW?H zY)yf!#tsy;kTO55%x>|DbhSN=`=cn?oU*?L#eO?PvA;*QOZSKY-<+c$yTnR?rBJ!b z?@Mk1?Tle zC6f-3V8vkR9+!uA-hxPj;&gdM!_UWXR=uF95QbIF!M&-@-!=E!rM~q>2u0^R7b33V zEL((R=ilUm;3J5Ck~qKQ`)kdo0n}0B)12t9HzYo|P>1NqqZga^9}eg1P%}b(or^i& z^q|*6-BqX)Bfi@8nvVAuHNLT_e%i)-nz9$ikV~btTh5UEY??!NyYfM=bS`HvJKgzL z0E4%Dy^h@hW$J1>GT-G#r?ro(Z1iRec&odNhJ5-`(_NTAzK& zUF8~DnUx`mU*&=(tf`r}zteKxRq-u<8fwJL8Z7+R{J}GGey%A^bK&<=}B`SA>BiBjn1~3T2zppc&nUK_#OM?0ca}Lga zcl#l?&L}_zst6}yqZE3s<*=$g5bK9BV&TV&*&Z^a^PC=%(x8mOp{U`9mZNWzp}2Kp z+aGv(ZAlI(Yuj%ErC*=6Qn!Kr`}O`7M*h5b?I49O;Hy()#Ps}W6tmqpqkt$sZ zc`cutj46wpG_g;GG80>m7xFpr)w?ta*Y4ci zr@EFY1Qu-5-wxH#%8kA`N}=vn(0Y}VWj`!~^OFl(hcaYs0Ze=DMox%!Jvk!{_tlX9 z;WPg-g0pcUutP3oPFqF6B8g03k8|E=_EB4YCXvT$(Ces4^>)MnX`kv*_plJ|{msO3 zp1!yKt6jjjs~pCKy()15KEm5*6{<x$|K)1_X|b7=>@f%Iz*rizD|rE`at9FgsmV^L12V~J z%p&Y_dOs0NL*-oI_vR;EG^(PpjQlDf1uH=H?lxmb5^I&t+F^pOj!yW)AS z8o)520V6@W>$7&6FI^c0>(2xNu%@cV{Sc8q44@Y&h^Lwb0XY!JS)(Gu37*CGJn6VMC2I2e>==O zwIP~oLp!t5MLF?m&)h~Bp@+thHJb(it~*|$=oF(RPdm9UN+nsq*RD4M#T@D(-rx6H z8x(fT2Obz5du~O(d@k!q{4&0r-|yU9jQ`&tZ2vIp|M3PGY62v9ZDQ#NahD>WEzRAN zoYgO&cf3HzmiA;A?X;gaQg_9_sW@TWbP9!K2|JLvd-(vf&0QIot_*vNvTo791Y4_J z{h!VJT-P3?UkmNcEyWI(F-Gd$ zp`QG!3Q-_c3D7;MX;`|M1&H=o{QP8MF;VgC{&U4sV7jmc7=vkPc|*~PMIWSA)&Eg@ z{?Ey^&|J;PNR>k!FTfeOCC8W|myp~Ipt!Sr^62r@vo@U>}rzk_DWMwRV=b>*Q zVl$4DS(bkNgB|mFZpck4R3{^zx<5!yL@ozdH*Lw>|)Iz2{^bB2DQ*C4&O48A7dsdwaPXGm83qUgoP=%rWU*qfXUjaHeEvu_n&gfG)>ptqh zK^3WAb2lLWc2BEi+8=f{<#VL*9Htnq8MbpF5Iggu$t&Wzl>bZK|%?+nTBqXa~eOm zvQQZJjL7WfUgzRq9(7273h6g_oME((pJagnERyR1Pn;%ROsGeC`KDRjAqph-&}iUq z6Rd{BXY%!Lsn}AIXuq#CQ?m4u0SMbK762h2+1YtLyLazjpZ@2T4*1f!L1P^V?(l`P zf5iNG@P(DvySe~!&6mRW(gm23i7%yJI9BV^4PX%ZKBfpFF1f0cz8Qwdik4(M97$%# z;9G%ROI>e2)fFP|aQ*gKC5S!Il_W8_TWer$Ai%bj$$e2(DV9+(_p{b&Y=2q#IWXBr#U zzqom&L-L+z7KIhCYia~0uv=* zG%nlrW8Mf>_P}?H{&eESPG!GO?{Nc~MZ{R;-HW#O0JQ)6_=_!SZ-NhOX9u?)P1u9r zn{h3|*cM~hh9jTmS7=f4_g7I8uyoJiY^Y!UFM&+*m2=Gz;~K zJ;)&LbDcqaRhHU;&O0NAa9SQhjO)(*F6-PnAM06U*McBkg9;6Y@MFj{2Twln95^xo z!aPQ;>2~D1F3HNX!amBs*+Qn1eosxhdw#T(-gA|#A}^9e+uRLngW@^u&K4_$;dk)U zh|{t$3S2V2Vc_?B`|TE+9)otRi3sE1Q_E=NCk!KD9@_8=O~6128w-S9OfCGhw#@$+ z_-iOG3b`jUv&7=^+rs>3eg65fQ%CAciv9&VbtDu+vF%VdwS5X`biPmWwpM06?Ayv3 z6%VsFqR4xgk;3=F@8pv z@Vy`V-57zY!T&6l`up>IP3jL^-4+xV2HE3l!qmf#cl=QYkR33CAJfT?jc@9qn7`agdU%}-edbKM1}t01+|zxQidX$E%gl7I&oN{h zI_}ko$f`Mo+s|2m31O`i+NX0M;&5#Rdnf6oK`J%9ej~qng(3r|mz!}K+8>&vb*LM@ zNK2)M48P@b-LDLK5C%?j!D*U$`)^}zeu5pA5l{$xNPSyfdNuq{zlyFW^~dDHFvSow zA7ODpq8PiJh%DOwI&uMjXBUi7hOG+toI0LRBIfo|jbVq;_`x!NlraodeCB&UqEB~! zBL4Xt|NgEik<`=_4cfORY{GFNXFn=oZsY{Vv4v9NuWD<9Z#~q83uX9OFg8fu z3AYJcJ_20~BkT}x#snlm&Fya+4df;0#0;_FA?NQp>8L}%BZ0$+x??zg7=~FF#=b%9 z+7JREyQEDRF4$sp!=V3Kvj18!un`adl>uxo0{iyyv;VK9o0{Wl2uDazvN3E=7~c-_ zj$8qo_6z&V2_5rotH}zas?vk}Vmv6X|%}8IO-Ys59aN2be`Vs)u zIK4mC`aIci72+;;NF<8-P?Co6m@CuzMA*jM|AchGMQkD6a9&x+Q!u_2=IOhL5hg4F zEY&-Ay-EJG7}?zyJAu%XH_(&yeq1f&xI5}Z?K*5t7?%gkQ{?-v3m{5R0*HM9Xzdj9 zf7!YJv&y?>#{rNlt2HIQ1Sc<)2fh!9PKIH02y4*Brey5!3wxn5{PBi!)|@u6+u%qe z#gtbk{WMO)Ll!5YJ2|S8zCK-PI!gL^#Uh{L%B$6ojqT+k`Ps!t5|1NFF0<(a8%V&O zu}y$b?a_)XD$pQJV*CNgxwlYH<`8!82$SR z&T@nu)Cw_d?KfwEn89AJ63}vpm1Art5-kH;(SagjQMboPKO?;c5eBo6FUQvL0Yewl zG`4tu4s(~`SYQi|zO(bjapmW<*+Xh58W**3d>mUELYVPc*pFU<_Ck_jJJ`K z0dG=TH!ZT3?>N@z9O3rxGxq+Qr^Sgb{SkgJ%n=eEE&%UAgm<3!uX*FQP*~{L0SpQ_ z9d1^UkhpPv{m5m>EAUOfOgMCH=u%s>IfzD^oVo~(G@fmN-=fzBpOX!EF@1e7qSyw* zP)65xKthY85l&3ddnbWUsQqdyvaaYdNhxIFkiI%ZD)0Xc+ar`Q&qo9e1O0gOVBhTJ zU?iVecS|R{w8xE`2p$=qw4D}3O_k;@%AO+Xr%AK*QV#Z9n4qRX>W%NGO1GAqsl0P* z*NRZ&e{OCsCKX4G)N5LVqX`+(D`_$t=ygE}!WaDa*!k~rK^c(N1rw|Zb{b!aQ)4BY z)M^XaLev-oG@GARiYuq^^|&!sTeyRn(c4bT89}@dK7~}Vybb#h+t}#RF;$sS*5|V4 zu{Xxb-}j~TM(e^Y$Ez?#*pHyhhfn| zOzm)QT63tr-`;)nQ6~&MZNMhaB+01Nv%5awu9pZ}GU-&-aj8yR3w;m# zgs<8-MIxkAqzkyI=L^le4B%L-PFYhPBtva2d&wZ6Lsz&iIgGFwLy>L%K8l+(q{H(> zI%|4q*vPL7o-Chl?~4*+OEgolCGwRDw)eXad4vm#w#SsM6IC^K9g6vjt{GOGABvzh zPo3et>#q_t+$XVTUJ$|xa+CPD2N-E%_gpa&C6GF4mHKYo$qKp!EvO-X&1VuH&nk0x zHx;+ylR_v9+e1y+WZZ#>1511rwtWKJI?noZ=MMvf^ou>^l`#OGuBq-t2i5z3O+QXR6RNQ14nopV?{=*gbEwRk7 zQ)_!vXK~2G2)Vj$l@qU(yiYW+=J;Bg!SNXzr;am~XX71Bh%{5Qce>$D*w4Hx4HP#T zoF+AW6W8wjgwqpGn!PM^C1c848A*)Vb-VL%82`q<>tmU}@lPEdb>y^n6dM7pUtO6T z#Y@h%Zr>4vI5P5^O>~<#o^K}_QN$Vc`&YRMRC)mlaij$$8Br5(!kH~zgmdX`N|+sjUj1~&ZWxr;V(b8Fl45mfF2?S`0D zNwDu8yus|zD5L10j+fhsTc#1B$Z?^Wbp3b&?8ir{c2%W}GK5svOm203?Q2oAG}#3IA z0Ih2lk&QK!39>?J%~skJ8~HQ$t~IHZ^5f|?@>z3qMP#x$Plkce1-x!x5gMy3qOPj>_FKxnBJJAFwz`8)aOM8|Zj(gU79;f|B$R)_u#a@K` z6u4KoKkeX?8Wit!>VQ7(1D~yo`!<&hY#Td)|9Ws7f^P4Fp8X>#-V49Zf)K;!?Ufy< zI9JrpeYeng1L+6P#q~Z&He@_i-j+Mv8`4W>WszI!mv5>xC(L%|hOo{O$?l$`4(RWg z@IYbTMyGv|iFR{iBm$?Gx|xqgZ#L)E$T$0)L%IcCaeXVLMB4Sn01z5ySylB`aB(N2 zqxO{yB0dZ$gLz8cP`f_2+Pt7>97nku;56~Nw@KRfXqdh!nPw)U6zXKP7Sd1kVX-gn zK8=|Ss|m`jXgJ-srg%cp*zw+=@W?OX@7j{0AkSBJ&`~uc5Y*i|lkpRTabs)(taKd< zLub~GVI4pYcn91~yzD{|>RdRX{qQU({DQ$Za&hkH&d&0u=+6DJpCOGZrPbJtwIJW8 zI%dBcm@Cu_&oAxUkS|0q$2Ve6nfQ8ylVC7bfg~6K(}nQMDW@_=jHc}%uoc+HzYb=O z`{P5j9X2Qmh#dAeU;ngduqT4Oq_K)<>^nb~0IINt&Gy|g`#}oz8+ti~S-^9pdmf%| zY8pA-G|MGL(CM6O@M-a$o2J8WgK%s&fK0oEoTx_w#$*>{vr`^_CQZk3|+ zrXKz$EF4b>7yr_O9>ATBU)E!DB}7rZ(=n}^bj=zb z;?Z-*oxa(`?So738ptFxMY$IOtJv4ssji*D9!Iq%T3;`rL~bv^%NSKo;+3_wKUFU6 zO~Zwf^-pFK%0wp@ec~E*qbc~@>Jn^D<^xH4*7w{^+$YPZI~1v#;qOEzKUk_#Cr7XP zl(a78`+8={Q@(E^zjog9_P~>YYsA(eecBB}EH;<~r=IwlSK{+y&jox?J4$k_ad@}4 z(GYLoKPIHy5k1-G^OD~?Y#oX-4Mg%Wxeai0vgkbX9?DCn;*rn%lyT4DXs#;0#4igJ zFV?tc`0>RNys0J|fg)BjIrsmT|yCNOL|uOdPL2IZc!Kk%fImy->FNYZ)mA-B&xqp1I zQgo~*OeZnFFft2KUW2l~2j_!#`R(7gAe^lSzKyu!+7Lm4XKC^h`1rW?Xt+`^DGi-0 z=Dv;i!Ly+y_hCM|7cA*dvZn&;CpcjSCj`tZGVxaQghH@9^XZ8WoAv1^z8y3B3{h^S z^Gohc1s(`(I45?gt<4+t;INgEK^z6>Xg-f(r0FsIM59|mF}=;>M%nG2cl^~pRqjGE z?hNTdIu+}4xaWq#*C%XxHgknRJl?V=tCYZu(ukqc}t$bcivvVK_*;wyTDPeW} zToWU?^}X()MBlnZC(JLEh9c_vlm6~x`DaIac0Ly{1M!f(3AKY5gZ=(uzdP8q2TeyS zNCqd-SS=me5vbJ@y1E8?DLWe%fXXqxaqm%>D`mjg?wW+E3Gv=*R%~h zI2h9HL_05aWh0oh^t|!BTCrJYor)&ajOrD6#=DDgjYW<`?O;k6PMxGoTDKynjgi`` z!UnZaB#*zBNe7mZJ6R~!={cN_C?%|;1Sa|;!6kSvy+vpsNLCS(N{l&YEaP)BI6E9j zt^F%#%u==+Ix5i&x9=L3p9IQ-R9HW%66MiJy!Z6?aNtTkjjzXAqQ`(ZiIjnDVyh2U z`jDsi&pX1W_^KVp{vAF)Ys2l+g@euaK=zBmYtMMR0e2i*%ag!UU@IOs-ETGQtRz|u znhKqF@ZE1ZSJvr4h!-};u6wo=4$skDqH0FLpzcg}uQul|R0Wo94fZe2`DoYAC7jd~ z4>S568X8xi3-@w@+`?ffq9$kl;VV=)F7-LJU`FC5Po}bx8C9yZ^J}s>yMwKx9V~t9 z3h8f27jY0nl2B6oNFh~UMB(N zGAGX*YicTJ70`^)k=;CcT^)$$hC}A&vIjdqisNjYCQ;Nv=uLqIqYB5CxIvN$$)&mK zoF8~B0`S=yz&Y!2E4BGA31;|mtkxILvalsMc$v_PfS0?hM5iNO;iu3(NbnKv84|wj zr#CYq@x>43bq+UVuqol%iLltLMWYpcGhEK0^DA?{J6BO7!!!P?&r_jxI8pufb`8Z-v zCWt2Fb|6EpuChB2JDB0}R5aNR`?XJ&-M0#Ib~AR3QRgRD*sHq-mZX-d&BO=uOJzA^ z+&s;fCX#na++MW88zywXkA$QA9B9}Oq<4}$hbX}}{qIQkC3{cSsXJEjs^a=VY#Ea$ ztGT45{sM!u@!fc-xk}i2y~+$P590M|zR=0vQnDI?J+M3+0(C3j_RD~b3*mv6?7!!- zl#T##>~FEY>|gcee|~{yst?|!nSCW_)ZMNz}+L`|gS zX4{He7k09ux96{Ti#m;>jDF!l=+f$5ewTq*`iC68%_f7UdvlpyVf#d{x#gKS+MS*L zjLprKI9dW!6>kn6Dh%eLh?5a+mL#HXMlR_l8(IY*D=v5r=iEy&ZJ0plQcI^aEr|I$ z$g-OscCbb7Cn%CyW!n~4Qo=KeF(fvg1NUEJ!WgMCUs&%XC=Ofmbm93=GjJH6^%NW$ zcCcfv_81lcvA%5fTM2dip+BKgknj*+4Wy|+_T@42^=YTp!4ZOSAkDZkn-okE{V z0ZwOeW?R4yPX%AuW16iqgNw7y@LAqKA8;c4bjtjf!Apf(h#&l}KU68rt5%IsTNf^s z$rXt*Go82<=LczHCwB+u`-L!Q>b&`!_^3%UUjFV}XqbeIrh`jKj(vvg%EKY|u!cxg zIjIJ>2idmp6@=4-)kY=Fg7t?c-ub-G`f3W24yZ}ZWL1(`p7RwG_Uty@;^z~(bIW=; z8r-;z&17(UU(-0@o5kN%y$5!Qe9u8K+NU;qcc~f8A4B9N@NUa2SaaTVO$W@bZP4V} zgV%0v#z-_5EEWs`FQs0oDMEkf#*RM^>SMIe5`CM|#QMMNI; z+Wdkg!vqPBfV|7+%E$^FToC%5f?9VQiTC0FEid|J@R%F1?o9i?sP73_weF+b>dDWSXfFIJdB$`^ZC`Z_3Dr`kzYS1es?J9 z&duh2=_cOFowMQpRrjTFNv40lnNv(-$xKdJnbJ(tXjw94;|_PbEt6DES-H@Zre>yz zy8@Y&m6?^Al?$d7m8IpbDP-oJl6zo^JD?&0vdMCvi~P^?Jm;L(=f&wo@d?cC`@XK< z@4Njjo#JpkS0fjzJ`U&Dr{7z$g?i9GkVW5&W3FDn-eoKKz%h&bJZ^gOlBsPp@2F!g zvT58!;ve*0Vt#d6$H6_=b2#0NI~{%r+lifM91>Ks9}IGjX5O*zD(b*`$fJW;4iklB zx)E)B@SOtYrMA#Ht1PYGce5=un>1eur-d@754 zVl9wO9QsgI6TJe;_J{j4&AKg!Q9wFT(z})%y9uR6_{s8BYImzBpNhXvcHq?hx!dIP zi9O78rY1`HJK3xhRt3sXnm-ZMQDWR`-CEVqNpY#H!(poLsUA&&O2CF!B%6H3Z0Co6 zS$Mt+Ra7WonOHec)tV=#q(%osgN>dOFR?S9nHVRl;=-I)#G|Nfh`zp#5zFv0dB?@a zCN{IePLw=xU~<6mqwe5`y{6NY{ftm!&$2YKm+`*5123lS!Zqu+MSh;A;0AiO@m~Ig zFN&Y}oSMEAZI|VYad0E=`Ge()sv>m|7}+70aUa~ zA>4tpt-RzZUE#+)MyaC)izdUek z#n^(cqC{`(xr~P5n>i_3T>H?-#QQS%x6;L4N&z298br}fsLF|N#gr2l88@^vV%Fq0 zr}HpzYAuKK!8(%w{@8Czozm`IJ;yA}s7$@N<>$vCbCmbf8515$HQ4yfd9lYJx~MMVzI zBi*U0BcFjZ57A6#**p>NO0$XEmT?m+{6s>cx-RG_>XLPqo`5q+IkU!I$teF54*15f zHfl&^hW>E*@DSjlsAhVTl^{sL=>V_7G+*X)4oIy&qb+*gYydwO`G1`rSUzKU%Vrx6ga@YUJ?MTtTp> za^x^h`lN%up!(@fqX4c#4Zpe9s8qm# zIguBprg4P5L~#J%=$!K3my;>Vekmo&<9cfCrzSp~QB{jA01z$i%gP4p`(#W{gDBtr z+9Oo$A<3Myf$jOIRXIlcQko&kL{8Nih0L<_O`?{MswXzXR)T6<*gh(qgPb|-=w(~3 z(yc71VR!akvvVKaI6mU`n@&iXi;1djgK%EzvB9Eu$@>@TS82>JqpfYN7rWv_iyXGy zK=+RGb|3I|*q`;+v6TUl)6w58BJTpDr#}WTe7RkJ9JUFnZp_JZcK>aVaQMufnTk6{ z1gC$fs;>0d>i#6o*sje9%bz`rPwslRxF&UD1f3~42k*d)I7LV%clYGAhB6X}nvbb1 zv#n=IhauiH@5nuuYf!J@Y=R5sc>oKD+jT)K>uOwN=y;8E^4YQto3-5k`X8N1M&w&yB$C7W-rjzMN}z_ zm38*0rN#b1 ztvZ5tQS^0Bmn7HX*4cW=<=pF`U=y*zJ2B(ue+T zO1^Iw&t72IzI(Yz29ZDG-jx_LV7>k3(1Cx#`3ubzme=jJFWh9mA7@iwcfd)VOkL~l zB02cX&d$AYy*oC;KR9~QOMD*Bja!oHHIjUO+)>)KotS@Hzu|?qb;R&|=24vEx_*zb z^)6(F;X?=ed5Lzm5@!!`Lv~Ka9se>HWh1c(`;f`G3ebplvHdFufvtC++|RitQv44N zAd3LbswR+(7)m6P71PQd8q}xxA}ftzhpRQdEtAT%=t<=;Qmo9u+|=M&=%Na-($FJp zL8F<{sy+Sn6TETaft-%}p;1rlvP@maO&mrrSe(y@ zNq4Fxslzc(7JQUF4|T$*`7NySZPVRt*j2eWS5~}{`L!5lu5Lm5Sn#3Ll&L7PRbvd>1rx^?3*oMKeZ9?^9wLj<9gxZ z*s{^(`*9A<(0y`-co%lr15;Czioz z6hD8Zto@RH#+^(%*0cHSti`YFPHZg;zjt`Nj2fSlJ3G%{J@^KZ4xSCNEQ*b~*=Y-F z_URSpdpeYY#7zI_t{QJ$Y~Q$olN=N9>+=a+EDjMCiJ6%%S(C=%QDZIcFp9fsa$ZCg zAZ6>M%tdEmUWWpf){e0WPUqEqo4w}NlBLBLs1)wU9@ku~-%B{H=&|O|o1vCuqx)p& z%(zIju&b8Yqu*(3si+=KlEhk znzot^CIQ71TDihwU)^vNlwsmeTcj%b` z{!*$FZa8rvV(2gf=3Q0(_GBPwG2)k6PcxUGH%^bQf>rdsLvNekp}w=vb}mA6Ce=_D zuX6Wc9(iW&5gM5{-n-yXWuV1VuFmv0XLpKK6%XhTHvFAW3Wa`@J0@sT_rXf;?|N<( zU4z9&i1fJI&I^t4Njr>CdlyzUZZ|QRDxy?*771H51SfIJHy$Z-Gnj+3C9nl7|HGx? z$kkCiUU>>g)Pf9XO8#a}oDe8$X!J=XXnGj>I=*t)*g&S1v?59AbSSks(uD|*i>LxY zmE+U&#Km0YMepqCgwh9h5?se?j`LnEnVxUOL`**2xeuAvCcKtosvMUrX^pks>n)l- zA2UDLuXQZK#g@NBa)W*dKqu-;7Iw|6 zu=#Z_()(VlOFg3Ct~zj9*oh166lOm)z#28p{;l4Dv51>4Wbb;47;w}boa$B^SfuT* z4DQJBfYMG0J%9kL_Br@QUT{NW_ZZ!&`)8QReJpR(fn>gt~15z0fSGX_(|$Uk&~DmIY~K*`v{T0>Aj#oH?XbB9{Fk_?i<9m=1w)TqEJBN)-j5#CT75 zDrCmER5BWtw#=JU2_GY+0B4dz|CJ)>6tS%8T|XyDCc@c#*7TN3M-sYEEToJ7svLWM z;MXnTZR6sj#Ll+i98=nuwR`5whuql7udk7c&+W}5yZ*w&JQTBD4^eP<5d+&7c*zZG zQ@;YaGIW^!k`k9p%$(TwT6h1R4HutJ?9IwB@R$f6XpO^)mJGe5EusCk1TsPPr2u=J zs%~<&Cpip^)W)`kN|T1UE=pm?-NMG|sBI48rW89@Q%WRSIkE&#u_%dibKp)|mju_j zu!r>Eb0|&k7aV?c65<%(FGq_#h#ELhBW?q-aoow?79&!GJKXZR={5Z|B(978{*e(Y zUs6k<=8Kp^jG@Foi{#2rzONIs_$Zb9)%%sSUE0w!x3VyVm)(stX!@f_Fyu)C>#F>i zeBmU}Q|nt%^b!u*PuQCdzv}G~2u>SiH9yj4=@k#J*Wd6iYdd3UwcWXJP z0(tYI9at8mAQP55vk=U2=& zd)j1%e+W8;Xw^FcCqdE$R8euef!tFAe?h6{ zTfrBg^J>iSv+`d`HfkzSI771F&q5&nm3}!>0@LUofUZr{GDLTQ@r}Dr{z^IykYdfr zFNy#T`+q_LnG8>(CMY(Fx%zmOim(;Pak_&Sy{NM!YbN<7gV=f>@=@}TB#`} zjvq9%z0_T6Kx}-LAF#yzWc7rj6sPgoKh2`dB9Ts*T8d{|mpy~3N5eivOc_1Cs!F&; zIrZG~R;Kau*ulj&H~C8z8fTi=fh&cE;%Yd*Af~PN74WY9nb)E5O>;QmcX@zQ73UMnkOrr^9LsIo%L^n&J1SN;fux(oztrhoL zVu)n9P@_3DT0(7HuuZtp!Hx5*pDHyc`{5P--4N*%w2vAZZWH2t{Hc{%j*-Y-V!5V? zcA0_Uw{-N=i>Al}g^xciG(KNV+#GE_mR}tDPxASUfX}A1)~h+$P9I*pduqvD_&wtD z@Qu3rv%cnEuaazrkLqLHW@mC~icRYQ0Q_nWr8T}RykVF}n=m+e2$dqg?0hW4J&9BF z6S~}m6gt?>ywd1V&{$2mbG`!4&p`;cb_YMxWrJO`1X`dtr(vuOV}A9$;IAQ;X%wan zK*S5H^gH-xoZJ_Hp8DA@nlMJ}X-7XVCC;S0`LyHP5G~8Fgsq^_^c^0yFY7RIzzh~geZW6QBu2$e#yJlm_{s3`!6a(3)7EV!>7j*5d9x31pU;NJcg~h1eWgzJqz3p= z7Ht7qR4EWl^5-PGuz40%%M1D5;`RmP9YMl#6dT#PH3}bI7(9PqBG<~67$bfjJB4qLIuoD>j#Jj%8xkzI z=Y00>6V!>{?CQ;yY&CuCBACA+W64G$E1f#id!$QPA9WO^&Wg{8{(G1BP0p?RZmsDlC}$~Y0r+M5#zq16|pz|g5DokzIAH$<``)B zmJa2Uxw>2bP%>mTFk5{3zu`@lBg-7XWEz0UoFmQj%n0X*XGb#2Rbmfw#cn^q-mi%e z>`NI?=7bLbJkYCnt>nuB(nvm#)7O8Xkv%SaQHV43pmDJ`dy*}tS5;6gaU9CXNbviU z*A5_8uSvaakv|D*eld(zHHJ=Ybg4XUa)%iD`JO#r>>j>joY!&NS}8dJHCz@+ob}yZ zeN{Z$(e{wL5I0t8J^v}&oO`AIR7m!1vua+l&ywXC{-WxMtO1@AIk+OI=|+xVMABYd z?F)Z=+@?c)V)#6^F0cfr46ppz#zCGkQ*BB<$`15lI$z$ur7LBY01jH{VZ^J(^oR}E z=wT|AcDF+x5ag^S?Y-f{j7Z`{_lUdzzf5|#1*oj$DBS^IG)duf@^P@?qY#b4Em7hg^?HPLUe165XPN@0NU zWlOl{>{_B^kx9C=m?8AhjcjzWayk8TDM<`1D^V4?wXSlIgfE|3pT{T;&lPp<9e0I<2mv6 zFGWonQ_(ko>>(@!>#cpG1JaR50m5k<6*$QjP}ptOdnF_L5O&=CX; zAJ~|E24iJ5IZ)JCmulI@eQ^+dNq2<1o1p<)>~Qv=`e08- z{KqtqSPgGUhtHzZmldapZO8LFRXCVr07RD&U zJ1BYoWk^lgxJOs+7#$Lf#`2-FAL1gK=d{L5q3{#AIVqJ)N{7*KzamFd?heKA$>M#=S7nhgqaa2H$N|w^uLmxOs*vz1s zsZB+$hMo>APSt$o%%Ed4DNHvwY8pr_Rotv2?oiU&G?P(k9r>x#H)~ z7qc7?`{|~U{!h1S_lu`6)9K>$pNGn3@Li==?mBjw)qnloV3o#%c=Gm?gJrWv@WU@4 zR)U~dz)QScN)+2+rX{TMUvoh>jykkjFB8Q#`8Ukk`nL_4@OI#(vFTH9ZaVC zlG4Sxvi?VjpZ40@uLfVAjjInuKi&~2liyv?L7e@(%2avZ`9PQ z9%>;f+zAt&owHyZY%8rIy-csQOvfeK_Dt)EM33mh_v|HF;l~R4l#pesHGezYY=#%Q z2}f_)dSfERexT_Cw!~@EDv7lS!dkPj^WcuneMs3{&PkVWTk^Fa`coRg#2>un9Q}v& z<kjA{ZXB~Q#TOA=46p@Ql_Uxw_wQ%1!=qKs-l9{ zr#+VjjE>K+E*Uz)&`Qt_b z;VP4g#)txEibbap)?`btkM%EI9U({AlQeG>J}4ZgoVg^MtZ}4#TUF(^=a?2nxku^r zv?`}6NXf9gFb%d?6nfdtW{`e*u+n;ZpQZu&W{&8M3deiNnG;Wl)b{->4S@mBGb7}T z$9dpAnUkbjO_S%5l!BUN0SczJuy@yr5~FaV@uPT#&58b_>myZ>4EjlJrnYIPeEe$w zi=1pS?V-9ld}e^bJ6EWPbh*e1Xnp3oatbhZ^`f?n{eslhQSycfNA(TEC3&RvLaS#@ zf%_SYgz07IJo*OZ>FU_c#+*w_{y=n9r(d|^Gc8=#JI^+kt`0wn(m#@&l!%(T;={D_ z4J_W&$ecHC^@V-Aw*S2*vx6j`oS^6x6E0ghiL#`9ky75#e5oJZ2y*wvDC;Q1S)8i` zTCLvpkfvJY@zBk|lpGR0)2a;-gyqBCSC$rm+jfDxQRARKblzR14u=E!MslR-1bDb{ zj&o_@A)pfqy=1=^rHNNuHPz9h_&;3v1@wNm35Ej+-6 zX@0b%{{|PyDyN{4)(3uhDeuhUp`aCtfU?}#x>RD3cwZ^zw#OyItfzXd26(xiWZ+DX z-2G9EXIC#Y_}&+K1fH^S){A;VcN^XG6c?ehWNfvM@e>p_Zhi5AE#^x$?p=vA67Oyb4gpOP*MQxRj~j#ephe9VO4R2=`E* z*hWuK2lw=RtIgQOm9Ou1_jI!X;}j6cy_&VZMwe0jN~t%Evec@t@Sw2v9dIcH+TJv@ zO_;snt!h{;?vbJ_J(akL8kP?KMK3vk{4*e54n6zDPs$5aejvL7Zjg4VmEa%gN#jI% zQG0CO4yB10T;5v3cy@1We`W3!1eLfIXV;#eaXWYRutr?2M9$9WJ<)|64t3WfhWy;l z?2!4y_N;iBp+?lmW@GQ6e&+sd{H(Af<}7u)^&0<>Ks#zLqhpb9Kp?!gEz~^6yzoYT z>JPXuY3^`LGpT@UikmH@&?bi$P>D9Gz)MpjxV~xCsMHzL*NA^^ZQNL&G}VDMQSZlQ z$|idf|Ep0gC-=ItAg!3QDek!DpFbVW>>{1eNM@S<&Ep)^9J=*YAsz;`mMwee_n#=h zw>&_mcf6F*YSffL&*UuDtS>!;U_rOU^*a?k6XE7F&SpBuxtwQ`-LJfG1X5^(zqH-msEYJFj+%W8I(a)pFj1?@!b{{^B6+FbZqX9<;`wZ;wYbBnTn-~ z%7eQfNZRdkZ-th0Y00N9;Rfy|H6A)!Z=g+!yMnG%0zc3NxlHBms8`pSSl5;O^SQBF zV$l-w4gOpirN|u2dVXA6t)&nxAgZHH|5|`vKl~8=Wv%iodp9GZ|3`a<6l4fGC~{2q z%56FHFM2Mt%L^0r+uc_lv?q=;8}!qahF)htXH~xsoByt_=RFl^^7qS*uo8(bq%!C4 zAPS~gjRN-$=XqlQL@{o$WBmB5)of;O89t~=sG#T%34X1Z44^3ZJZ zUW(l2eTx8J>A78^Rcf^Hu3t=Mh=2d}xnD66^kIRw>Z`VdpgI*bUuVB+dapPoFww}GQN@;f|G-@@+PI9orJs%8IHK3&^j&$L zD1nsTltFG(F{QPR@YW$bndvR)Oi|a#*GU^Itu-!6Z|DoiiP%LB|7d6!!&g9 zdZ1y6YmT=&Fy}HzyRT=^$(Rg!RY25>a(4e`c?Jel)v^Xuw0ZZlSnRgtGitoLs7;1b zvHetCJ)+^68XYN9tY@#|5nQ4ZdFH%2r#6*TIqx8T(5TrL-a&@nzenl@%U64%vvkZc zS=c)|w$6P648!|t2Vx9Kc4o#+;lkRSPlMAEM`Isvx}By&I6Y&=Fif7(Q(u~-BJNFj z4qz0#moz3c!R6TrC!gxMyDs7$9P7doC3Nhtj%k1dD4?R5wmEO%mi?T!VA9K#vYVGQ zLsQW&9hyFI=eQHyD1O4v`=_}7E02LNk%a|f!CkWz7RGLQc z?tOA2x@AFNUdnhg1hqo1jWiKx_>wGLiHmX;I<7>)3+1gUx?W*V*o>``d31iL2jAP( zcX4&2tFd}=ZT}<~qzq$yy0C?7%IH#6S2Go;^lsNACysof^NpPC6p2Ax&+yft<9A}6 zJc@!je{4DU#wSJING*-DO9@Y*5-X||J3b6j(HWp^N2fFn*iN{JUnj_VSyb~3N&#bG zmJ#xK-Ye)Ed?UV-fDuZ7(xL>v^pgA8Fv@7^E$3VSTs2%bH%KA){_VdG9eYe!Gq(-i ziXAU*({Hm~>}1dV^w^y^=iteHQ2ecFffNm_4gDq8&XrDWXiT3lCv|u7#imuokyCJR zOt6=p1v9*%Ek?F6e=N=6WJT*zhApWANVECUf*6EZ%~9<4Py-73q_G&iFOfc*s?iz}KRMUzK7eHuP9?~fs7oKToqM~d1je4x-Wfok?~`XPdV=nWiy8rt z!sNu%Aq%adi?=72Y{)Dh(J~@3Pliy`JtU-ui1#X&-K0;CX9b}4mmg3Z*gEm^lD~&+ z`4k1ZSHLul5_K7d{6VTj{rEjnIluYT;>p$Dr<)>n(GMlE zAB>ki3tCPK9N{+oQrvO3zwlP*4a|s&WfW;3jXpfh+<*J^%-bae`TB+d#CZA^THSmK z(O|!kS<*fZXR?P94tYT|CY>$#w)n&9U(bzjCGr7s&_48@)ptzqJ6pifVLBn5%)pG|311#aZbu(u05$X9<_kLrmmunu+Z3 zDutlRl%0MZx#US{d3MWGBgI5DF3OiTbTM*gLHrr((0AjrUKp!qq3IIH)@BsBWQ%5} zWuV#F+-jpQi#ThH!kwB=P#04v@ZbsbwezAb=HC!L-OfkF9hhYMqBPMf*`83^%rR4n zW)f(6p7@&M)0xsi$cr*LAum*95{VR|3Gsspo&jF#9Bcy75d1P^wUq6>C2|bXKE_RO zrA*In@KZUXLjDUHuc^{L#hx8D@9h@-7fRH=sPOzrw>ACX)S0Bb`@4+KzV<Y=v_Hfo|*!-k;62SnX07nQ36v{Nf% zP1;2(b$jzK;LAu2(-6lF4-Jb1RA_Qp(DhMvGrd;tkkbpA7=ivuGRr(y>LKdV>ORf% z*SDfxt4@wkKv;xN@sk0d`FgOM;7xT-wNt$SNe}WNs=>ek1nJT-idZSD*_AL2XSh|n&@LNzE#r}UDiY}@R7FN_#^DHpfS$?afj!r-Rf9Ex$%oS0f;0m}I7w*DgRWd^n;i9Ufi z^6c+)vtI9u8^6t<06iJG0bcHWv))@x5IW|Wa?lo4V=&JgktM5Aqm8(xMTYMO8=c+? zituV@g?FfV$LkFBektjBRuXjXk3)$uMqI^v!iC!{ZHD7Z27>NvA$g@b%{=&yYb$?= z-PT)HD8NVRh^i`QQ>PF$lHp17bSwMdKY0zFc=fXBY+X^lv>5WHI0X$H;Me2MO2M2Z zWd6^;ffHlB$y_P?A1fgu`_EtSizf}Wmlu|Kh}5VsC5gYOo}rpIOG7n38r~;kpMB_+ zQU3*U$)=lNAjd$_j?+^kbpwbLxP7la|Ur1)Ev$<*Kj<++IWAU(<_g&LCg;m z)oGM3JM(WXGb1GUU}Amb5epz@@)K*>y@ud1E8eJOnaEzUK=C=V z2{mdAvRn7bU%qW-H?V;nqkwZO>n|7g@Db&@&%Y`rcp&k50Y9k<$p^+4QGFeo7#u%?6W{l4MxC7Tg`95c!4 zRe6SojNIYITnf_7nwpPJSZq9)qR^rBw&9rc<0c|1u}t1oh@?6NOarX>XSq?pFcmRX zluyEPCqJx@v9qav*|#aruKaiLq_}}^05&Y;oBoP(`02n+OYlrrRD#hQ@F4Sc2Z2)D zi)@B2K-YgdrRa&X<%t;f$2P(=AZHJq03%`V+&)Afp9?K}XI6oj2fjr|_?8f{nZQYG zUT-+5x~QyPtpnV68&euzp$qvCU$_!@hZ#LSWB3VYB?hjcBJ(-U3V|=|JOOuM)q@3; zjA{Hix_k#GarMbhP*4qep>6!|jA{LPf_`OWv@noncwo7c`%3jo(jWhP1~UMm26(%H z0?O?q7h|j|h#KF!2C_1hGvpUUmE<+8;;H&~r6jEqt8?Z^KzhQ9x7VP0+yyC=ZZ3wk zU57Ia_SY`CR2APuIqh6tp~!dMUo>c{m#?@O$0H-q)nvGyLi3cd@I6fd3yI#WF!u4@z7&A(<3`lpOg}xxEf^T&;TY^6-`o8 z^JJ6M;q>n)g?Ki-lXT|69BP3b;pLpUpxHB0Gy2*t>ePM^k! z7ny(%6Uk=^c)w=|1aBbmQRTvNv7_H!rrkOHb#ysFz){TyGC8z0?2+}GmJ9$mC`0u_ z3<9~tLY^alUjO1X@%+zZ_}fUck$C=jxLp02<=gkZBvi}o*OM;55q0{?)>0<<=AV7e z$IlG*yOOzl7X^N0bce=}o$vc13A!+_VC1va<;xkO^pUDd;-@QdXcOa2hXjp#wx|3> zPg%wuI6O9B375++)=$y`eo!2nBPM1i=Ta8TGNV)UYV!52Kz1r|%x zIEXsGO7=^RGD{^-HxTl)@q0;51HF~VT9wSGUe82Kn}laYx4`#^Rpd*FE`2AFojBz* z^YF6+7zdLr#XQYh9b?VK*wraHwtr#Fz8`jWbU`%!-T#H7cO9J}kF2g*Q6~Rv_s9EK z*(7DQAj71hbAlRLk~i+nPx8Awysnv4F@Z9fN5;y%K~l)n3Z5!{Gl%yVT*(JNl~J@W zN-up@N&)GXw{z<<3RATFW85euyM~`S%Emzt)@Fj%@hw}N6MiUf{aFim2YFs0K8Iz$83Y)ZV&u8Qh~TF#@`Xi--Qw0Z@l{MC6dHP`I)sT-cF5lm9J*TH?(nfUGlrP0_QNkO&Q%#*KxoUnf;>PAc5iZ z)iz=pjMW)$>m@iPPqw#xSEIW@$i)%u_%#x8P;D5C-Vks{z5Is{lWc(>@Fja^-}UUc zNG&KUkQ3@hK>tSa_kj*xRUT5HmO0tpM6Fu`2zN-KYNF}8p$Cz;0=+j>1h@P5A}t2eQke7DfHTW>&KH;;W_ z^Y3U~V~fgy)K?C_D1KjYQZ&xl)%HwpN|o4C5UV){xdWnRs1Au1GBje0XpTK;xwH8y zY|-pou+3Wi~u$6YtH~#Z6moz?*Pxy6rO`3a>#e013 zo+uX8)JV=Q#APn2~ zZUr(jFaGrIsB>?F6+Km{|5<>oWP6yk9>l+7aYVA23rqV4Q${6{$3J1-tZF;VTO=spYXf-s1_92K$*(XDXY{8ojRE`1R`SR7{NONlfa($nE3#Wgc%* zsUFOc_edAzOImZ!uJ?F%ke8LlQp7Mne(Z|vkZ=D{EB4%>56j8%i0t~6=npmEM|m5r*i+}y1iHiD_GJTgyEG-Br{#OpK)omNTWjHw4Sqfi({VmL5B7Op{IOZ-+-q1mF zWmd4j)B2{I55;gV*2PZ;0@I}wwlYk9U->drPTq}92 z%5^JPp?D#+400frfNY#@FDmwnF&ATe<;d72O^`h-ijW~&PS+k13KEu za}*5E-94@Q74$btRgr2~dX7`B7G4oL|x7?BD8JRFg7uzph9y+pBrZH9?XM%UcE zj#q!|aoXdm9yyEvPaOe?y=jeja6|EaFKjQi8cGcC_7B5xCLwPmVajU8YkIF?OTt() zsG+#GPi!yd{f`gG3E%^@l>g@+kPR`CW+y7|6G$2F2L0vgM;Y*`OD#YE&!WKs0NV6e zgNPAD1hkd(YVdBWaY~?8ko`wr+j{{T{!c4w#c#>Upi9+CaG+giN#yCw;_hbaKFDF+ vv9$j_?e70Nx9ESIoc90wd-AEs0T@wjLNKat%*vbxe(l@sv@37NsmuQhBpj9& literal 0 HcmV?d00001 diff --git a/docs/screenshots/cond_custom_1.png b/docs/screenshots/cond_custom_1.png new file mode 100644 index 0000000000000000000000000000000000000000..c8333374faff28ee65f35baff21a5020363a861c GIT binary patch literal 203852 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�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

%9edvfic{`s&kS4pX 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


Cj6nY1uM`wPZfBB%L1QjC} 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/cond_custom_2.png b/docs/screenshots/cond_custom_2.png new file mode 100644 index 0000000000000000000000000000000000000000..dff8050609bd9133832f7f1958cb7a58f421bfb6 GIT binary patch literal 202465 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%0A^SLt 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

t}iL7I~o@WeVvphPgFCvkN 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

NHxN1P$Ir) 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/phishing_playbook.png b/docs/screenshots/phishing_playbook.png new file mode 100644 index 0000000000000000000000000000000000000000..7660390ac6e9fdd6ade06805e94038dd75e1ae53 GIT binary patch literal 25747 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/playbooks.png b/docs/screenshots/playbooks.png new file mode 100644 index 0000000000000000000000000000000000000000..8394dde4e4e1365ec8b7cc24626c70ff48ec4b6a GIT binary patch literal 201614 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

{~mW^>9P;15Y!J9 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

  • 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∨>AST-O2n^>;CcOrmYn&pMtyMT!zFFE(%3Gs7MC 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

    >y$>+gKC`9R1**eJ&wc8}DP1}6PpSYKo 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
  • ?&J|QM}41!~71b4FL!Z@f4 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/ticket.png b/docs/screenshots/ticket.png new file mode 100644 index 0000000000000000000000000000000000000000..8c0c4efe6928ba109a91f76803667512b16253e2 GIT binary patch literal 254383 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 =;0;fJLGb)L^SZvtLw%Ll?|&WZAJ)OjCUG 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

    M^aHoiF?!$IMI2i_c%q zqp1D>aR-&zR}v}Twoy?OwUd)yfm-LaMVV~abug7vKV&~B@H6Usleu$(H+`f;C$Osu z_5Yl!a9UG&QeV!M0LOE!q9B!(Wl-;h_W{|Z^U;GNwR6gA3p5w1JI^NYy|8>#K0awq zDRVE1N{Cve6|-J9j_V!KvlC&3MdB0;90otXcO9d#Cm|CU{cEEQ1V3R&OUM#G_wKbb z9)zU4MCYpPchq(?sXfw=^d2y5&($K9$^&vjpF8p$smB8*<|BXUW!f!82)__s9230n z3C*i(W$tnRQ||zkxM`1~xmr)(h)c_j47`M6jyDJ_eNvD zwX+H$q;g>r3O?FZVpZ-yJt^UTYaG z_b#1_KzlEKqCk9r=T~JuhOAmiIPuA2Mm1Q))T*2p!&tf zsj}M?@N7&Oix|_obs0Yuu|#K|DMm)22uO24m$B#wsm}sJ^NSmm>rJ z#7M&J1czsk*b%hB=;b8f;7n z-^7kuUI_tqX+w>6XM3^~kJO!aoOX|nH5q$M>T5z~x`;0deby1RwD0Ig4H@mbU#q6o z2Qz>8M`H}9>z3=Tiu2Mv#@#o&H45f0ENdVpZa%?uq@&fR;dG?dg}Lr7S5FyUJwaU1^@am{D8b$rR4U5UQ|(Rg$bQ)xDeCF zNe2cEYccrU0YaSnOvbwFtLfqgQAE5|SASqa4q{OfK5eyt;>vZOBAoiOAWrDT)tu)a zBGeHf^Otkc>UMk#VP&tG#tSHcF20MDRmeazEyq#&Oq{0VXxjkcXO9=PVjIJN?I09 zmU`M&!j5YdOy+XpQhDpcc2IijYZGHO((0TAu{f3>z4AYM2N4`OC8v~M?A7jsRAr}7$rtVsx_Tuw^duGs~Ql=Ki=dxY2x4#RQu%SL2**} zW&2HLnC?bfNf)!0d36*@RPGEgds_=)S$KA*X@}VK^s9kL5J^!z_Zb-K6$MW??945~bQT4Lw{C~| z_)k=^<|_CFiUbul8x>`HM#I9&2P1_N@n?FeAQ388Dv= zW=b>2p?(manC!5+Giti= z85MSQ-U^o4Wp&L3h61rRTbXBZ%P}y-Y&a|AkB{sGO?h3(UGjQfu;&gR`%H00_l<5d z6LPv(&WHX*iH_`NrQm4tM$$pgk_B<$X2|-95GbI>eqUbv17kc zrc|drv$**YkD&bm}%C%-xqUHO^%k4Ef4&uAnDq^3`NsTG-E0}>JQqzB9 z5=QS$c#U#DZAkUvkZ}{=aQp59aLVts@TR}uzpd55`Y-r+Y#rYZG*x9~W0?0dp{otb zytgzEDlRIp`fiw!R(||V1g|)*Bm21qf)~oNOVF1fo>b_0jJzq%uL#Sbc8gNxA-TS3 zR~=64-d6u$pad*ZG)DZ~Ht~1j2RL}?q3;wsOy#q*F%wg>FZYUJC%2^*1u_m_U9GA& zXR{~m(0UeMnjhZ4A4yN&4lx$cQb>H;Z<^_e1FuVo9_Q{m-8!l0HxKVkMHvOv1@3zh z<(&ik20(H+{A?<<`+1Vmz00wb824fn#YWLd;p)Jl7A;q?qn#1%y{8-8tfyz%>g})Y zzV;z7H?mG;NNqoR>qWFAEVLk*P!xsZ3fVU~1G;>7BjkP%kYHMoHWmGwn)C0|MC|T? z-LD@d{3ec9zx72veIfpBQDC0mERPcS^4p?B$iuBzJ8{91MKPzF8?7Nv)N~dnT&#y1 zPqpuwkZIypNFVIVtG7tYr!3A`24R9EmV{X?UMaGEw2EZ-`A~VQ_w}TSnhCmr380Oz}3B zz>4|_4){45$#MD-f2&BZA~xnWfnT*y3lhvDQHl(CB{PPq9aE3rp0kcbDfU?>`-Io% zuD^79zqgf-0M6GtW5uIjy|&-}BeN)MUp{?OLc*f1@>ZX3TPs#{&|}74=FF^}5bLI$ zkhjJ?IPOwQwbwqxo^bjN6Bm^J(Krah`HoijJY&>FOtqS zr|oT0{+rAKE|1Mlxp6d*XmQ^qegEz`-udBA^+>St{vc7vg>0l@ECuK@3FZpxyECey z^{K^@lVL9#xJLe}x(+wi$`4s>03MX(-PT!Q^v@&J#FyrkZA|=~AhpPcn@H=MW+kYk z;!eTO?DfTL5!W4KkWJh@VG1`lkjCsbXvfZ{K+5a&h zQcAcz{i5~tOd|iXe%Vn|MUNZPFE^X!!lbl&~ zKcekPUavirkV=(Y%X2y_9Nf&uCk4NpPWQr^z^5oEVGZw+MMd1$nVn#I_@*D9Yt! zr;z2$5rxa{uiY5gAMq0&HYmy^J}+*LvOy_h083N;sh)7D^lLTPq&&AfJf1nmy%6Tu z^^SAE>EdLixcFe+j7OlSKM-6|TQ?NzbGSF-TE>80a&NiJXKPW}FwdkEM&qVFJI4E^ z_Z{ig95wz+so(BKBsXcO$cBVG4^;}a>!kXo$iR^iAKohsWDho9$~3Qrp-F<)h~2$8 zER{SncP+qNlDOG|LQ}|7<7ko?a(9gZyp9HB%yKGOik$PFRGm#;%OT}<%p(xHU6{ z`0X?uTTB{tS`4VuWeV(M*|HmxhLVa`EXH~hJ-+$zrd(`bchLIlRAW<8Lq~6kjxW?( zL0~ULkjq-<#2(#Urq699Q7|t40>aCW;*Y-8vj$sFwo~eD+^$v9OAK1gsMd^Bn<*eR zjLUc4yWC!luYIDc^b+NA%QuP;Vk2R=C~OG(wI#`W($q+G)8A9-a&t%}gaLkUd{gDcfi$X-$H<*Gr`&Q}&|K=SC0` z>ucu`RLM@vIGV7>5@0dEh9Z#@(THi6&;{y6!d~VJDn$g5-?cT)y}Lu_>iKr5% z=e5|Sk$R02dkk-mTX&&t*i83_$=7KCU#gOZQ`i8?IZkf=0I|*O9Z|xh3$^oU)Fn%T zl;3V;>(>Cvy?QR&8)E#B&p(QWue=lz(X@gyqu`{UU7eCqf>9pM;+44y>H+gpFeU3r zHhv|+WKI&>FqSLOV1wUTFEOs~hByV2Y0%tvjh=$H+qr$EJESqV)ZMLMSt^5z|6T1u z|7`vO3uXBF$?Zm{f7Wmp^JpZgo<|6XOI|j?PIzylc9s9qCVWK@qjdLdKfe#Ydxc0_ zd^lSHsBH%IkQ0R+Dn%jT=JF9#!VUxUD15g%2*p4lU%8o1zEb|{-|v8*ZP*GRu(Jq5 zwkhG4P&o=|Yfb_|58pLzKrtXFy7~_hvt^qF_F4!EaWfXmzpIc)y=N1SVx^1`HV08? zk^*wZ_80;}+NJ%s@uOXhpU#nYm#`L;@aZ{6isxJK78KgBefGm9Unzzb(83-2vYw3BVS zxZK6~ca7jhUGlZn3S5-F8OLl?oFZRIhs|=&`SE$bOCc@{L08|nupYh61=+UaLeSSM zPU^=GkPPq--I-&HGc=p&^m3&p4+M=R$!ra`d!N#BUW|PxGvLRsFR=py@{?}|weL-? z7iTzAEQ9!cL2mF(cv#LXQzInwAyA{_Cn`<4ttN>o8^b3~F{F0x@Oo4PNud?&Y0@qlilFFFN%+6NhkPn!ecXbw*NZ^7P}bN3gy1U( z3&J>euit+z=0dH((Tr{3p`-i0P#_fEaJ^$J12dJ7pc#;(-F-7d? z4aa6qq~BjhzZBTLAuh)>HYo+)PZsrM%3J5Z#S|7L!|%$bf2p!Ym(lv1YnZ~-uU6Cc z4(XbtzOTxq#o5x8;UD8-awOz{v}Cb=p?=BB#FtB)|n^mC67+!|;xc7N}+HLxg= zGdDVvl1DKkR}$T~<`%L2s2r#vVvUk=VT7zEzONdwLg^&m!*=)go5LQL?X5Q*;lx{A@O4aLsGNokLri4OD&k=Net5^9FD&L; zl)gS|_K$2CT1e?Rj9W^J=504%fGBaW5E~W{#{$XxmIc9juZq`?gpThkft+o6-W!I> zGkILp%)Fv%ANU9C-~PlaalT9yk(3By(g=jSXEYknRTjvN@8Z+6g| z+B~?C!chL`K#6CiUyO~R_H196XS9Vi>~mofY1yF%b_G8^DZ>uynYXMPpbsK(XaJM zo0PuumU@4fF0(}ow!H~k#c*&dzF+P>2)}yd+^hZbyYemc63)}}3wyKC5p_);T5LrV zS%?wbCCjo$N?_~73`WQ1jCf8wHNWh&KlF#X#K7@y4p)))yVK$YETKMA{QS2LtA;fn zVPmL!=X~{udOM2=Wnz98tBVf^nh%(7exVubk0*6sUvu0&gxgB%d11@k^@Qkuuaf~% zqtJxD#(i88+B5Ify_=0l$uC67PB;q3l6R@H29tOE#2@3(@a_=@a#>^mhu#thsB@ISL5sV*8?tKh|&!3S*PqT9Mdyl!)IwywZ4o z_Xx%PIgbU&g8`Yb)ves}{7KisV%;=*Ou(ir*EqE3dNXS`hqg6#yve84p;aAbJ}P&n z$}zB)deeI^@tNEPLp2*>Q0Dw|$)}LZf@wGNTP;3DUHzFBgDdDqCwzl?``4&$-cK}B zsuDiOu=1u}>)^!h-e`@uEvqPo+>7DKk@Y{=Jt;AZ7fWrdrta!*X-D~Yl*no zjd-5(Cn_(Pe;hn2>{nLeHT_!U=*aps(a3}7a$>fgo(B~v`@`6}Das&x$hV~@R9~v* z+W1jb=t13m!Z1^s$&Z&TJ`Tb=oux~M z6R5&ZnjYa014&zx`}5+7rif9*Oyah#|5Ex^Pk`d+z&EfTVGeVS?NaT~c68ngH%;emvm}OTuc!=J|bLs`R+HJsLD&}gp%a0veFWA zIoWge+)}DX5viC|y*byKIn(hTD&6Rg{;|84#G3<6CKnN>0-%H5K4mkniz!8!U7O{l z_Yw8IB2)t5xlk8RJi(%gyHmc(S5TYfalgqyiz34)7Yk1WhYAOqVEBK(nA+^TQ<9UL$TEerH$c%x~Mt6PAU^W z&gj>Ie1~|4KwYY>so2yKSgkGG^xSFzOAnQU_M{Gx9d@wa(QCyYh<0n-+Z3BM)HcOw zjoZSodC+&D7E!y?h}xoC#vq%1!Op5WO zqzUFII~?#Q?)Im?$M*ZTPNN_^F);b>_|krq*S?e83Mm1&OqLHba*Ezw8_NwUbtQF( z`y6Z4uQogni)%_}T0LL?ATwdI;kCtK#2x)jZ6_r(i9r+pt+qQV14#jw10sBPM3 zoi2c5zbvDtBZYiG`SW9ZVX$a+Fmj@PJWbxh-Adz$?36D~LPc$73%eu#MxjzX4sFxN z0^TD-7kG`9^qD?X4(gsUI23n(1KAEEW;Hr?1Vnm|BMmp_384MtKBlShEjbSz0O`WH zv?^Ax+{T~wmCnrGJFYzt1qU|~W{RV1pUKDd`doy@Omve#25z${`y>RjAPfIG z@XoA8biL*iqgc(m({ZE>vsSF}TU@LO^KHJsLx*sEYPsxEy)chSyJd0F4GlhO0p@4q zgVJuTSvtW!=*W&f-t5Chk74Br9A0-araRMHDf6g5NilfAPv8HCiBW{L467Rn;RwlJ z8Z+0qtbvPfV-^thXTcH#b4jMr+|(nvRf_Iihe+S*Q}x(pqsP(@^?@h% zrAbqKmlGudHnJo8LBiq#Xi~tr_LwmsRNmHwdj)J*z9hK+@p#mP(f+O2PV9Ai>Ymo| z7#*W$eucwo3A)U4b$|yS1m-(@3}gY3BLls`EKyX_YA0h(y;0xjE@g1*$Ar@y3ChIM zpZ&-T+M(2#jQO;tTvJ^4VU4=q8duP>WH5M^QK}~Q{?pl9uPTYNvGDDoEbVq1Y}9g1 zJ^LE6Bk^UXx^mYpdvlxK;PLG*;CKXL>DinUb{nfd{2b6v_r@7U+8d`~QUXN$^E|DA z2X$rNZ8AQ$FDjoxJE_HdTCy3YPP;(*0w3Rnr9?pc!zOTwRq!IPpr*aOdJZg*`y%*M zz{XBj+>qoG%u-4^rYWH&xp(;e7b+E!BKLXdl4@-sUk=)nY?*676-N8rE6r<60SYez zRX7xOl05O1!RdNbGUmAIT$NN;KC5;&=a+ZpMusB4`l7lW;Y3jwovRBg(f`@rxI3~H648XE^cIhokmtg`qy*8sUd`>%4U6z(<$UhI3V^mbdN*oI9eM@W@I&*(+~_E8 z`Hb8Z9e=Eryo@(i6gTjyZ)xl6q-xCS2UoULUkCZd!^7*qV9rg`u6QS-MD-EmmJ*Fe z%}K>PdBbd$%&Vv;QQ}efw$qE8f_X#nH)%Q(OibU8#yGRH6&X5YQ|w4Tn50Hch|G*- z!iMpmIq!P@!TD@ihhCr6xj%y48~S9Gat{PZFgrPw03Q;|ph^Yx?j?z!8VKtzi9CID z8f@;Toz*o;XM@6W4`PW|2wcH@%tp`!EV`tb!o}_16cHwKL3>v-%Nmes;EUf;Z*KHm ze!s)EZW?22te0W;oh0qXj_yrC=+gE$CyY^5_>RyA809b*Td^UvdWkz;(W#`jt0(N~ z!?S_HP~R$Wbik|jgYm#ibccOmTl&mHT=(Wo{a}&bg_qr*aMo6(Sw6D#Ao*7;5^%v|k>P^K0Q?hL}U7MxXkc41*3f|op zoL3azS4YM%HewD4vZ2=qc5V+;3DB#FrakY^gAmbW0XsI_^YG%GV~cE)@wZ zWnY=(Qs{O~)T&a2^U1$k+a59-4n?%}7H%*^*1*XW!>h9 zBKeQ&*-M!4y3ICWQKZOy6;i*>t7iS5BUndqM>n9~FDKvc0uKM&KaQr|ct5Nr!zy_E zhr0P9Q_*&g!97}7=JxLMGY_wz>|{e>58QvlYqxL1;m`y1`W6`bW|-dWJf#FGq0a%c zv~Fb=rSm-ktm2XSkDpZIBjDE8BxV1do6)86;kQmxIwfbqi$jprXy#i#?7Ze{_pP96 zzOs6Fi|Nod^JZ-5?hv@>r|JC#LN6{(5Hk{&N@H3DrWs!zX32sy1}%Oxa=qT*%M}=+ zZmd-?GA!gTPA;m&UqoTM6*F=#*k~)TpE?r-7crX0|Pn)U5y89)}d;C2&>m+e6ahapdmBA=G%L|2( z;e~5S58Mk!9DJJtvU zmAC39uIkyU*amYAcnr9xbi@DlQl?iMgJNSgt-OE~zwB$mKU@IJ?AiZ<4-k}~3GjOf zmH>;tIuqbhNdO~W61tjO*~F#+BzQwUx|0)@E~JK)!NuO2-H2vufPwl|h~B=F|~7uVWlJki5@9zdkrxijhTD0Uy3>z@#{nTCJs< zV!M)BdgDb~;=6iSO_H7JILS!Sl-7afI~W#^+A=c3(;WZmwTmz)YtcMM`h@Krm$0!m z^ilMxzhT2>n@yp7gqmZ^LOxOVFI&_!!skED34*4ll;z#GBhN8%*a&(zVLa$WXJbbg z_SFUQN!GS(+O)wn;v>gFm7I|WMb3XxX&asFl58vmY-1J36>m*ava)F|0BqL9>9Vuz z213a~C>lTgCU=Jm5G5grUJw*fMWAyH~ePjpy^E?)la)n<+meCqc^yOel_-Qi^MsLdois`=<_M}`wdSX%F<2Qdp%~t z@p~)uwPO!2pkEFUpMDJ3D?mRt?P^B72&1MT1a5cl4Cc;*qscV@OFRv4trj^G!=Rzb zSRp&;B!xCI$Lf*oHl0Z#r;_zr<6q2Up!dfD*@r>P@xdbvWX1Mm#z6KuudeNR`;Z!DIM!|J{VCSR23v$bnqJ zaE|^vu1XqHDLs@*fFl`&ronp9=vUi$XjG`kuSO#61(ERI!aG&)Y?eJkbGvFUe!0q zTIu*gv00av8Jyri==I<21zjb((>iXGmV~!{5V3xUe~mw8DpDk72#$VB(QK>5d11Z+zBVUqWE=8GLDzN=W|E<6?M;D1aAS9unq40 z1;e5yw~S?9k?<`{=Xef*m%nHkrL+wBJ!r*VVHTu>?d|37yB{yQ)qy>L;lgpBhiGDi zNpn*d0ly89ZNjL?>^(4f^yn=>ps>O|oyvA(W;i+jxr_pdTmDMwKwFNSud)=mJXi74S?oJTZ(Da1@3m z*D%)Ul16r1rUfVP0OpTeW_kMs{X~t(Ih3^d&J#n-a8g2pGc=g6s>RW~>8hL;8O=B5 zd>gN2N*raDOssj+;H&ug=Gvb8rCOS5pk<=%bc?8HzgFK% zdp9dy-0p$S*LZRsGt1Ex9g0vhBDj(UJZ0T!P!?rh#O8AaU$AZ$Azffny?DoTf3^9d zmn-sqaNDJV`Xvf(wQ+^-6jZG!Q-0^F6B-~1Ab9-4 zi{_z0Nfj_dGI(TD69K#Db=Gh>6Ct^Zdrw+UK53b@ma^<^Ks?)w0|TR!KWbmcrpyx| znV|AJIAQIoR`oEyta{enWO8tcovvJs<;QUKa5QE*PaUaj!fM^6X&sBY@8BKu?WJkE z@59*@ArW#!-Pz}0Nh-u_Dv0Nd3`*%&hPM)XrnYT#ud@;lG+dXLSD0-kPg{Xpvue34 zY$qPzb=Yvxd9SD%B@K>D9W=@g>s2+&AXSvK2)-wb`;MnXwDBTG(ZB*tw9!pbOnq~j znZGbK&q?abLBB_2J;L;hu1^cnJvQx^mvSbeMVBDV5ka4!NN^XoD!glLHjPr`AtBpr zP?;Os&7#;?f#qL~&n!+fry?&IRLB){!%85M0DE&%#7~2|E3BCKz|9e|zxtO;KkJd^ zm=*ct^N~^V8BuXsC+3k+K4DZCM9eHAF(9*cYBz&Jauhzk&3iX?7RAbj$ zeY;ATmxU}8CjHr=$yT`?qsoe%`K1&~qt!{V@ zRH0=!5=5~yfx0uxFHQ>ji!R@ouAcw;U+rP<$OXbFTn-e*xYvp25m%01cwzi%Em=8%GCEV(44Buv9NSW?aO6=s3-3|q^6?i2!AK23?uk8MfP2ODsYbcHRw6f%Q=voUaQa1iFIaucxMxs)03eot#nnlWbetxQpD{tlRHn z9N};4kAB?`TA1#o8wWjbuj$b#3vEJ0SY8Ml&P`}w=#^zFh`-7d-&3qcj^9cO+WT_l z5<5L2npEsih50VkT4SL2g;LSDg%}0M|MZIWhcn;JJ`^v320aT?kzCjg%HN+OqDg@= z8^v|(QaI9+djKENLOCWc8NprLWfVa)X$m2Ugs>4X7uF(XWBZly?dq2crGP%_hMF4? zYJfNxRX+YrCe2tpw_}t;VDgpWj169YGdTH@W(J2qle*az3MKdH6J(p!Dx%z@T?tP? zmH*mhh)Xu9_%zK4ZTX;(ATYqiBW@@he#4RZroL^i%pRP~GEOoHJ#R}}UMo4(O_Sg% zS(#ch@|jQW6|Bh%j_BN01guaaZB4?^xM3$PYU&)WLOL@oWE}`N#&S^XEPep|BsGlI ztRJ_E(%jhcQraGCG0x+^e~_vT9yUryi8b2H*-EFPbHY<097i;MEh$4c0cAcjxS8X* z)LP{BUD%)}FG+1i$2lT`)m5lHNABu4+jG%^B870hn0b z*wN^VVo8wcIvsy6FYdU?B7|SdD{p3Nc!9dBs&Dp#l^YBbU-^OxH1TGm{n7aYSbi*( zigV_-Is-iZ!EQkuLcsUd*ouE`)moJzY#hd-x!;g4?u&gPjG7n6LxpV2&$X8L@C=dRQj@?~c^sM{2xwV&$}Z|odpH>ey_Y^_d5 ze|}mND(3^|dQkSS6ST-_m@K~`HTi((1;uYa!*4_fh6z3#QoAAzZkQv0K@MJ!fa8w{ zB$HhnRryVgYEBsSTr;G4kU#@g1Ec- z%o&8bJ~FP&uL8D~A#JH(k<6Y4K@!X($ss7!z+J3GlIgB?#m(>&$8(&~3C?q)f|Fbk zg(4O8tSr1uIuJphpzPxuwU^Hp3KZJ*0XcHfJ&hK1Eh0dlK3**@GMu8C)C0@fJH}4+ zrR)DtQ|o=ac=KSaMD3>+$9EItx2WR$S0CxdgpB+f@3;Tv{?kynw5{Q2{=mH2YP+6k_ngh( z>rq-`u*^^wCS33XRa&pg6D?={>NSc`%njMtY1eDw?voa$y{>gW%f+MR88eMkC=2+z!9n*_J|#jb zcNH=jZn0jzhJtmBre^`Pspl}A^VKKC>9*X=zc z=xSL}M-Ok@sj^j<7sEH_jLf!*eB11cWq8D=n+7l8{a_+vf7fA|Ct`RScYT@5|BKW>RdP_)hJ&h^=}w6J3H z2*F9h(FH!+ZLlDJ^i2xzMA+FhsyS}-kjYHO5nF5D(Kx;?HPF|eE8H%>l`rSRO*GxpM$%4I#PuQ%&1;^`5`~2!o1Pw~kJWIG4BT zd%j5Z9KR}gNewEMZidI628jF$QsGd_h%+$m9S@M2($*jiO^EaxEeBtp$pA%wjN8Ay znHFl0V(7K|%X%-w+I_42UqAvN; zx~R%kKlR?tB9+j4bIqfpIpk4}%}-toyV=V(OPgtMp3*k~{vuDdu;U5>Zl;ToRt7Rj zveFIc#M$D;)`#?~=y%eC&E_or*Vk^CZow8b#kMLu5!I?s@UXcuoP-KE=0%%L3#kXn z_ea6&B0cxKH&XYlh3L-)hU=2*Boy_pONT9|(#JcF=Up5sI7zt>rO7LZr@)AW*f#V4 z1oEiphko;>qR%)90g7i^nN{#dXjU_g_ct)JI3Js^B-DlYU##{bVlPC0mDK|5A(CMi zh<+98hMcH?g-!M?yh0iF>I;%?(zF3`{$$=nx;CPj(bAM*U9?VmHkOtPtMrW%sw@kU z!Uls74;Ud`-;f75!4VrYyL=uBk_dp03aye}Nk7ev$_0(Be7hq|^9xRZWNQ9)0sh7V z;cCjUl1m&DQJ-$Gt(+UGQNh|qPKIk%y`S2G$SeGz7}pOsUOQRX^a@(w%hh2CCt;MD zF}(cgx}UG7+ZlhUF(wgnk5GXObcH7~{e$%RkFN7(qAcc_C|u2wj^%SLUJwpb?l-EF zTd=Roa}${)B%lfN!%0&<&}=a)(~IGqa2xhSpyS}jqPnZYhkXB@6&~lhfEG^{_EVZc z8|i&=FTM{@WeIQ&MM9^Lu(^5$#~7)#($YJMcaR%+v-@Le+2v&u^`X$+kEx+5()GY? z3X!HmJ}047-D^sD7Mz{ZtB?;f)_0x{^bQjro}@z0@F6e<1jOBd3wVV>(B+WeHb`Le znE<{*@t%0t07E{*qdF}Sa~aD`SlVFX2g3MwglJDEEbMLE z|CDhf(P}C&j;veDU5t(G(oG3h&s7GFrRb3Hq_%dODHS;{#pEQU?=M40R)?#lP}5a5 z`nQ#_5lvizJmbqwne;|dK$N+dlC_V5R9M-^MD-@ZQQIJAThgR2@*;Y2?7Wi-20TI| z@06m_8F9XYf9rdvnsJ{64b8gYZ2(dv)I+FFj@9*;iW`m|ifB+q!axI7-<9S;>gDh? z!srz9_M@h-?4^$L4ot)nCvN?RBp=&0eMjX<6e_(=b`1H15nM=n`9XN&^*PEdhkZW& zG0l0)Gb{?EVtU52A7+O4<%u%6#x+Ya!g)TdpRPwndG|*B&GJgJwP`D1z5lHzzq%F0 z;*Hq(bqGhOdoH|0MeGgkX$^4rSadT3O`^@=OzjG(KuE0%)Hck75iv}{&suc9x!-u- z-rfue?q{r+TC&8@^vFSnQ)i}?;d6IBAdUy~cdKIgWpV7|8!=DUk%x*9TAEz)n;{Aj zUinFkR971xF0&fJMi@myMUM&-KzyI$-fD6N$K^-NM3G9~=ErxUCC`4^fNWaZbL`W* z2+I6!{M2JXC%$vb<(p|1saRK(^d~qoZqE#*qmwHH-9C@g_P_A=FV+U58gw!OegbPm z(rr#0%T2h#Fz;bb=z0rZqL5&V*D*nenA6BsvaDy7F8~Pn zDDVA{H(%X<{;qGZe*`^cZg8Y075)q$v=p9NZsLvDyzJStQ25Yqe_VjTd1U}+T^1un zsMMkVtGcRMT0N+J%D2wODKi&Z^Oy}YA}*`g{LSq@Vjo!``2rHR7(qsI^_|5;FO$u(VnnbWE)C?O;R9VlzGq4?Ph_h=xo#nM(=`XSn{W>%yY zj?*uRrd2|nRVmQ09s!zFGqQcA(+E4(wo%lMkEM94d!nnOe8ju<`X1l?Yw~%~$lQbK z;6k^7ewm;7YHLL2I>hs<`iy*lMFfQ5_A$_UgTiNdoM%4;L@|UyrIT?oBD$;m$WZ8u`e=OM zrwMYt0NEuuiK*Br6hSNa^)%w7oxq#}XZer2j`&_dPR&AkY@zvA6>msEb?P$ic?W)G zPB5jctf1b@eKDMh>_b{qz!qm-m`_R2246$6HVJC}p0;OXJ+@X*$-61-n8E*>TR~sUy`UlU>iFMMZL}u-=38EzW{5a*_jaQVv5#PU2X$Gk> zU#fzfYLbdpm54KrInaCkG=mf8kr3gHb4WaOA$9o<{pCR=Kq4SzR#6i)1=jat`Tu+g zD&r~nH5qJhvfS%0T#1GO4_+@JC(m;H>SeMlsH3EdHS;EUls0yvPe3ei|BWWEkTqht zzEd&fU-9|}v!Mw@BuSJNVYB{zrISlZ@hdt~hA;*K`7YZ=?e6@;n2|Ux`B*4<)Hl=S)XCuo=T`A45)+H(}cgQXn~l66#Va0VEXvaH9ISG4hX z?VjUYHkOb;+k<3b{G>{3fvrdJ0?f4w_gXYMCpWTXgxi)K3>3)U2<}7G9|371s`RKBQ9E zGk(|T*Kn|3j8H4?a9XwBwJaZc=WEBYPx;e`Z6Xje&zRG=6jZIb-kLmr+XaLV)_^qR zvLgyOWs40^gMsl{(>KN@1j=gR0tZ6&#L9wy50}OT>;LVSPT}^e+U!;y$MP5%=$gf! zAjC%ILmMcUJp&#G^f`+ALQ8@f;A30F^jFdY^3%9jx6N*{14k|NBK#8V`jBK2IXSmz zdk}+SlDJaI#$%e6_!sx;4l|WP7gFtB=OmG6Tju(KFpbQ(q&#nXl`@5gB7Lrimt9=x8Mg`a}S-SFD^WV$o1OX1^&jaHS z2o~PeqH3q3_d?=TQYBqab;VV2^|s~*s;ZIt05Jfp3wtwM5nEEFEBLwCmW-&(UU)*G zC2lwul=9)`OL+AtKG>4Sjy*H=JNP{l^I5&b(;4;xn8+2YZj7=f%SO zVPgu$=nV>qjnI}s6R5L0JT7w&w%TfJhLD>B#J`0)Pt|SJO)zrPcu6uZB$UpYmL#VE z^LIG6?0_Fdk*^wE=B1jl*sSe+JrDDb=ar{(Ik(!idV>pP+u#IamOzI415uem7lu75 zgof87WRB-HD6K54x8YERO4lPVUqu*34 z521UflO)z}uD*MXXiS0}T514Wi*yQ>|0eE~ODd_H=fAE-d6t!AG6g#+hI7}&E`g#= z+}k7}c-!DvP2BtV5IGVqC)?WXo5E{a!OaE+cVyS*c7%MiqVI5TUD5S+8;=VQp2MzW zi|S>6Qm_UF`+&&n_XQ#{3EGGiQg9*l<6c-;cU(i(y+;=T*&-whs=&aJq)|=}7k?0a zR!KSge-)$CvNe1q@orlY^iM#L=-#94)j}Mai>-)MMJp?T3;Kgg6hHKUh~u+Z_B|vh zuexcxg#JOnr42(q)leED$?Da-1HP@VafLB*2^d2Pz3V4Vb)XfT#cpO*hBiJr-zudg z1HuQ@Md&o9A9Q7kumw!Es#s~UQ%B%rWqc2{;+}o%@cJH4Ugq{JTppsWf3O;g9+?!b zWvs61+G^$hpi|4W^r2G+%DJ3B_`v59j{=Q*;$8rO1H0fBE!YLr#}x`;C8SCo&vVL< z>#Ej_<&43j9IkTeSiu=mFr><6^tq}IwEh_~m7?+=O61v!xoH~Ca62{+A`K1Z{D#0L zchCeMb?raWX>{iG#*D~!9MaA+Dy1hMD*a`;dJZ@N^!L-|foV1ZFw0{5nCw(%x9g&g zJ2Ek-#@MkrdDYw!GlTq;=w!dy12JAsin3acOs)A(M%;RXDZNu5>1ptab)aYy!MsG& zuYL~e){D&1U@Oo}T}E&lOHkg5gYS+%iiv4hFYps4oe#RtpvhhdAHzen4Lh~8@G_@H zCK*#Mqj~&(e$o16hQIpe;(iW#U>9%}s%Ea01tC0WN3U^i!cgW^%9iqfg6a6c1L2qc z9Z||Q9J!5@@ReVWR|0>1T*bA1%Qz3ptjs?j>a#j}d9kKv)8HJroAXXIMM|C{yW(2# z?h*NLk;|&uX%{XYGlS#pw%?XS3FM4pl?1UD$+sw%0=q)c?>{%u^pAb@7}^nm;oWk( zs4Y4qUsAmE<#G2uC*zRaOO;C_k<74#K&ik-sL8>w1hYP~=t-v4nSDf3&$YHTI#y}e zG^8#UKw@Boay(+d1vJKasgMiS<`N=SE#z=gwNtVguqw}n^rf4bb{Xy~Q;^J|3lK_a zg}#8s;gjBr3--NE2%M;U2B>-Ru~9)?oTSNvP8sJyP-s84%4w$WZ9*O8G+g-k>U?qT zT7S|g3JgOgTU@~74EX`3yId|Rx{*PNGN_)uJ?I)z0_b0thQ=&6KjKfXh)RpzW4^a- z896dS!;lu$hztM~vRZEiT@rh|PBtqvD*POWRrZE?r;(J(moBt%vqQr<#&pR2x~J{G3&h6@pj+DDMA`A@Fi~z)6fvC|og|9>vCqqFhqCjN_K4p3FrqSj^Te=j@LuYaj`52G9+)5H zY~%(V(tXx}r7W2ep^x`{8{m&n(U$tI%u0ByeMtTQ9!qf^zIK11`x2es_W>^LoH`LZyxqvl8AID3cBBgiw>0ix5aLy|vOoo*m zG~LPE4cl6U$t34=ZGgPvfpsb^8WHX-o7P?wcXOWyi@B-05KCE6kC|0fqzfjO>{KKK znVdN3B|u^dF2438zPmf)8#uh;iv|+$xbgn5%6IPmgoKn6wWiEI*d-f=6*Lqb5x@p;yEW4N4_D^%R7Aqv2a2V>8z+F>2D zECCU)4?ykTG3On&1bpO6{tPS!@k*b~ux<^9xZx8|BbSVk+JV={MILQaPJikSgjSF6 zX0ybiZOFU^az^-t;>WOGO8kHmq_4=A2drLLns(*sM3+i1wDIt2H)!o`uiWB*%yYjq z(`X?`N0EgX-n^4caK-Ud4AarqOCg}Qzo473Oqn14FDC)e>)1Pgg78La0-M6F7F`-WvY^I{>W&%*e}O6yd=mO5 z6OOFrG6Yt@m;FTQ`^HRS2|Qzyf0t%1WyzAi!9Ko;@V*)Kb*-y!JxrZHKLRe{lCNUG z8EKeWl`(qzX=^Y$CyWY@$ni@H;<};_nal8E=HWsFH5gD@mL~w9QlC(WeF1NmZ?S=~ z5Ewtc5K}V_`d04o-%Tk&n6dclBV<3i(!+P+=KostCJ$Maa)pzG*+rj5Gt<6L>ZF9) zsx;mbO(Z4hH8DXpc6qn|ogEVXJ~(o2S2pbo02+$B!=3wLCam_Ez)RRMtBVCzn_A&wO4vmLPxnhA!U>Ayk4UNo#56(JzF%}L~w7+`jS zi#=ER&}s^z48fmJXT9ueR&4B*4S)B6R5+*sDF=tdulDF+;x$}ruZCo$M(%^`=%e+t zua|}FJBaWF!~xIEh?rXoO1x@@bo$;0B|&ieU%k&2lzr87{%dh;;U;GbFberHQzR{H zEVj{OasGwG=wZ{Q&#IzM$iS_{oyYzHvFaic+IR!!=sJqj9Y`y)fHcboNp0Z%NLDCMo0%T;6+fDeRePY;3w{ zBXD$LYXM>oe9Z~;QfQb0OK)6b^K3#F^CBhkX1mq@)WK@qh%zK7auUY}nJSK2a#-c| z7VofjLI$P^kgJ2i)r7(iZ5X!go7&&Cd`7uXccul0z)8v=xxlp5wQH_B;*XVW`WDsR zy7GtJu#@9$1~wwGdtikp_Fyzdcd2Xqr^tuV>Yy;=#WAckaSbZ%nC%`!WFFd*bbhbj z5+bwwx4GuS+V@tz+3sPRFfJl@!Nx9u2xkY?WC2+h|As+=$$~B?asN^9^@$5|wNk2( z#+~sCB2*L2%Wz2Z-tHvJTIwlotPViNr1Sizl2xOts?zvS+uGuqjf)G=kC5*0Mg+KB z2+czpfxp=!<52iRfI%ucRKU>lMhMq0UC+;fAccc{=T^*xipcxK_kjMov)HIw3oQ|8UC^AzK-Qt|`E9m0X6dTjK;&915r>4g~-r$+u8;7>gf4CdB zG2A-Tx6eg&4W^ZBnHwh2juE-ma8(U*dINkNv~%JwA|oMjm$x2HW3YSYJO5S5pP)R+ zzu*r##R!n!>T_*fI=Qt+MsOOscceh(QU>Xc!TtjS!e#3nP52U0V6UgL)h|(814Lk>u1k@<3|7ZgC|3S zGx+R}IqGhM#5&yA1q*$lnXARR?8{l=zfKg~JG?DidL*B6AESH}9fM?`V`!g?de-G5 zrcZwL*XNeq+RB&RIAhjH&DBUS+ES{*C7C5{5$BM7xHGwU2LoJ+9T#^TnMZybNms3g zOyO?@-u}hz3wUFDZd?$p78d~qKeW3ta8brZ-d;69+qy%{(*YF{kf&&zkdQ!(JZBk(@^*ac=&9c42`O96e+wyAXL{a zNVt4f&J6>9>6ZE*Bz`#llp))0E92A3NJ*Z(t^RV7SqS}W;T|}2<^MY?a9R_wO#bTJ zV8QKM;C8C2-mmZwON51o4_1VJ&74BgfwBAF|0}#Kbg@d{?L8#Tq7V=arG4y)4BNAc wQ7;bKDB)6k?bi3-?Oyu-`!~4%J0;xocSoYd-Rs#)kbg%GIUmeBaPijv0Mh>OeE{P?cP4JzW_bSa?o$W%g*CRf z3gv-`Q9U75<*xk=)c(6C8<=s!xezlUO9SDVtEMN-1b!hSwAC8k6+MZJ)Y$gpt~ywa zuhKRGmZJPFKVn%%F+lf8v%ojAs0#6j;V1k$JI1UcV3Bk2-}WjpcO{pmJ~@<=_$>w} zvRzJLo3P~Ng$(|ztGY)`OOI|F=-b-)>QcrZnZv?~trA!7to2+Q8N7As^r_R%4t!6w zF473HGhWVn@#mkt5;}9r`W}nR#9J-yB+^J z-m%WR@q(qXsVVT&(#glg#nbl@+)wrCQ77P0qi(mY{j6_X*L8w>s5?5tAGoLod3f=f z@aYHX0*4+hevXPk9xzW|-5>+yzwXclj(MlS%8Gy8;^%IlY<=UVqA}dZMNw1zl=>-U zLt#ZlMSUOVhq@LQFaOgV_{~81k)NNJE*Kmb7^oh2Mjh_s3f9ok(E*=24L*JPByh(` z-(XKa$Dos*zAAq|2m%K`t%JUi-5P2@fq*Uc5N&>7DfA=;hstLdwEzr+2W3Rt6Z~ zrH!o6)rK>hQw_es7{VXRJJ4`i_?^{1Wo0XyeyFlI{zyd${;2a3LfbDW3jKfO7qk=q z2&^M~dgQ*e-k|KY*dNuCHE!d%1&gs!3YDV4el?lS@ZHN51Fx(68CO{|C^kGS>$+}^ z4@<+>nd9BZFG3hHWyblQ2*^NoSVzW=K6B}V=y2y)XL3}J^s4G`Px;QV@L9X|>u}dQ zdJ6F0eRpfmv-GB{T8&{7={}s^EiJ+{Szp7=uyZRtLxlh(T(9^6oP#d(no^$dFe+;-&30r{Ib%z9}=Oms%OOPJ%(!4HW(`Xmkr!P zXKz~#sf1ESm4@mb#D5d#jByz%ZBBVNbPzr)T8EHzMWndf0!l$-;iiV#*Z{{!AxmP( z)*IB#%G}bT!jaBF*K5=|%onD6Fmfu(BCusp0dGugEy>hX`kSL(@e9`|a;iewwX<@W zG?NjK4RYNirsHC!56hXI^7jc1=?V=<@Ld3lk0^Zmf{Zua zz{nvpkf*t5!XC;q>O<&Kw+=Vn`;kWXRvq+^D_g_Rvx>9mDn>{t!G!2napXWMHb`C% zTt`r(d&h|V8HC;vOh?chLj?<3*+I%mA(q=Ay~9(8{bXE78PWXV?Fz~PN>&`_;bASo z?Q!5bgHxjZXa;OhMi zj6$0dLWgsj>&zh$b`eB>Wg&ey-jGGtzD}xZV}J6d^<%8bq7Nq{9@+=Nhkuw%=iS=L z8brl1Gn^=_0fjR_82Os^LD-yG!xZZ399|U&4~@aT!#dmrRyU^=@w01tKm$)gPqmi5$JG&((}~u@fTeZL0geEgbV|OYS&g9ZI=(oX7E{#sI05?W&f#T=PZyg0 z^jrU+UaFPepCf_$eoprr_|*_&Bvx~Atr)!Q5p8Cm7NUBevMAw)9!xxKG!{Z!PBO%0 z-<8F!8H9M%G4jgDKb06*RCunKERmK%S3J{xik`G7wVASv{M$FZTdrXP--BNTOOoxb zO;JC6&O(NUwH_fRkvYE`&Jn>I@nnrO8kVl@4eDeZCzh9BsyJQ10k}Vj7f{*6qzreH zs|}nb?5_sSGIpTbpM67a;bA#pRN4lkGNgn{hGREIa-Fz`zbAzU_E}A%&*k{PcKcN3 zTnBX=sBRX9M#X7j4zwFhfzzv?dv%?yS8CaXn#)J&UtX6Q$fP|O&UozJgU;6UK%tKq zawNhOH$=HFD(}hquWOJyn9ts1^lh@;u@8uw@NDZk&7~+LZ)WIlvc$8_TtCBIzoK2} zQ&JJk*;g3gIXt3U>ESWt!s%soBYtyc44vNM%T2yI373reuo`05-Sq07z1qKGTbckw zQwDMrJOP?;{p%q?*CY4YE`TOxOCKEFE^l-N2V1tlG16({uBA?Fxv)MM1`vrW$p|MvaI z*zb#m#T~J}MMTjg`EHyGFUf@>QS5KwuD03846G|2G>Vkm#BU`cVe%-Zz6-U+wTYoN zMlxPp-%yU|mcFdZKLJjwd}LxDN-YTU9$lN?dOy}alwJ2G9#*R2QhidhUDZF^hAw%S}?MGYNoPf-cg>21%5uAGkX~hL6WbJWjH@_Hm3&g) zd|@L{0|gr-O}heG4-Z;)X1@Y#0>y_uBay${O66rv8{`Hd$!!Fh<8E4O)lvD>`ok1e zyjXc^v=UAIB8#)cD&)_N(@-sOA;gI?>o|fa1wC$o+g9>TZ2Q@8m=Xg|5qO~8wyzWvSO3_+?k;mV7D1cID z$72IbRMkTsXgutgqsKiyt4S%X(HPg)e2&@L1hJUx<4h=Wua4jxy_=N^R83SCvYPXQ z@d={!kUfTPEp#VVe&{a_6is@q|B@CsGQBLaBEEba)&sUdN=v+OW>2nymZkq)BW#c( zmd4G}I6@W2CtFS7!%{UzZdIkMZowAWxY3&Elo&8L!7a?r>{xm|0}sQ^##V)^jTLVo zmywa+L>zpZD{r={g$Bpj^ znAwm+^snNxZ(r!^&SvJ>-kQDCc6Dj5!`5MnixT4b$u|*wG1lf8O&B_i$d1B++w{pb zJEgklqt@tLc;K;Rnodo|UTDb;4|7|zDOny_Tt*ue9k-0F;p{=i?`qgzr-b+dVM70& zt4y8LtpO@f91V_yRUvB#lKpk}tlN(erWN)j74NUhLUxSSb9%N^3817`Js94k9!D8h zbG-b40z`FcO!R6#Z1lPsNY-bFtK@^JcA*o_Y=ibA#8t%f4_XK1KC-^QQu?iHbKyIu z$u@6YS?*8VO9InaTW~fGO$x**aNAED$)}^O3dONd4+G8Pmk;z@m1O*ix`we!OV%al z3Esr`E$yX@+%g~Qt%AN#)v@q^L2ut#6!#ve3%I=`F1sXYvF@2RS)T6RZ4+dpY&5qrurFjXyRSb{U=NJ{UmL5Lbqs+F}v|V53!)`8A}gmBJgNDaYm}D~sAdy7(GIe7X4Yeieis z=lcsd_nNec5t7t+)$jQkOpLwc3|7 z^AV&C(wY55|J@uz6$>2yHKsC%5Bn9dd;)nti#a{cq-m9JIYCE%F}bPjN#$g z%j)1R>Tvt)pw8@pa#f(Xc+XVdM_KeS ze4Ef+j7$S%ETn<+gC+1$BFKQ7u*8_s>K2Q9M`;8_2}ChB6456oaJDM^wp@>%zh7bWhp{ICv?s zc`j05+kpz`Gbynn2${K3=>uI6rl?Mp?ay+;^c1@2zT2#;Y89HvY@h4F{_k26%o|4( zP~R?K+w0($?h~&hl$+y3@s?WgaQ(2OxEn8$`ZZgCXytOEkr)$aARVV~xh{mQG<9VW zS*WeRFoktHWiuTv48iH&(jq36U>=rXGPJ5VJ&aTyYG77B8kzpvjdfV*5*a%y0zf;U z0A5TIOiJREj3Gm^<``$Ns5a*6csGE6*NpnOqsQc=vcNbt#sImy9O6c#NqeZ(5zW~t zT`Ah!y~EF@E5vbU1T>%M((Y7FfObD>_zoVZkJ=_71bq^Gp$@fFnVSd}8c;3P^k~_6 z4_fQERRPoUC=M)q#C#^NDMaq<-w%?#D9awp(VfK)(n<7M)Q}0TZ$AjSA=CJ6l`PRe z({Dd;?O!x&fi>743wTw3zcvK$>#D4RN*Sn%bFlp6eWwuhPDb^#D}8Tf38X`MAnz}z z&?mDj#p5Z&;E}D<#3TfIZ+Z!Y$Hagpc23&q581=3Dq$}YsLwmZ{dwX3TceFr@rEeA zc_!SfnrnJwOnRe#gB5GeN){tv0^~?!h*cO#zwVLk1Xg>CpO)+mR-8e- zO6rw!vhB#^6gr;Ww|f4B>G$!~X`eMz12@iQ1Co3Igwf$VL~(h*o=2S$ zJGWe$)P32rTbe*&mL>n-m8Ehm+&QaESNWGb`rot9Gs~%ob1@yr3z%iWGJ`7sE)A9Y z22iXLh_>bg=!!2#ewsV?NK%|yV1tbBZ(h*@>eOc3a0|z)Z>ABo!6azEC9%3S-h-30 z5;Z6*R-=n;)CP|$tTEB=0!@94@!gL6ubE~lR6m|<^ z(7~%$;>0)}Po&HyQ-7>6+O`hy#%c%mUO9gvRhdM)TE-30Z`}#dOu%L$3kMGU3#_UD zY?2_*pZ}qOi$!VK!Pi}ZcHi1)(#+>X8i2b;`!%^$cQb0Zxt4a=1JF=~A(?j75ij-` zHA4@Y(~E44dz>BeF2sAG-baV8sqkBykwqLUNF&>oZz76EYQw+BoaPh>o~0OHnBEQx zv(Q{x|CHTAH$L<904|q$El<>l9YzMI4TltspnV@LvR$UrJK(dM+WcIF*k$DWyQ44h zJAbX5;Qp}S1JgZnX*${k|gx#Lp<+mbx4B=mDk z#%^#g-SJNwr!N#+t-A*gSVpP8pFu@#f3c%r0#W&1dwcpecS8C_10x%W+AmW(-+5Gi zH(QG#m$b#Q&lj3oe4{gzzMI`z6+1tMW_*3k7;A@zEqgfW#+wHpK)s=UFT63EMBXXx zttHBF3InL3uSp_?JYgZ0AwvbbEadb+oZ=s5a?b#%EEN#ESTCvY5l~s<^=i&R5Xc7U z!v20wnWq`OpdAVFTDi%~`FdCo-sun)#MVjM`r>?+A}wRTUibN%IllEoeO^|%c&ztY)Xb8dtaW#u1?w+y9s;z6OBVT$dl@Gwf8 zx`3Tu$9E-p_|t92=H#`DqxlcLF##cukIA$?P}MGoIu_LauCLTtOA0?~_R=)Gky=Au zcjH#ViE1hv)nFQGBVkX#N>&ZLL!A1DPC|L(=ySt$0hbKCmj~P7WH|d^re6`f`#Fd; zX*DXHwv1HP*d(LyU@CNhn?W$?_w74Q+IkpdID2%^Gwd6UaH88c8|e!`7@#2H%kQIH zIWqmlZCe4>eJs89E~=>82*&BG4<}m(gT``snJ$Ia(Suh3R4g5rpceVp87>2rwJ)jt z2NJT74;7$*EP6y1eZa7%CVQ&;vcOvScoPeN1!LuDI@3UtfM4RbZ zvMrJx8J`F+v|NYbUcqRWGPIZ2J}_*%NvwQjLQ>gD+32AT!*TL>pXShjIeswl^V4tO zg?vs8S)OZ0mdCJhFUhKiwLoqs2f!mU$@p?q2ao~?3jO=~(&YfXj!7-20vTV2TMc$* z527F+Y>>LB-;W zKEKlUEiIoM|3w9pa70KsDXa0Se}eI2Zmk=ZYcKv&^-`$Ctm058_vwa5*z(Vm&yGon zd*$;)b#a-GV@31Aq4x^<-+L{kcb>=TSIPz1#wI)nw-pcy+)asa7N(!T(Iy!umu`ho zaP)a$O&9NX2ESep1Uov|4FDn*qS}dgk3mX!WWypb%!B)ZzHD5|SE#DRbg4;U~vss&@<1p+rDsPSxZ1ViEbi2#@!P&SLq40N7c;I zjTY-$cE+6!wjlOUFOA0BK6R*!@2#k!L2w?-aV82$E-?YSBx?7s7>TU8f8=auCfn`q1$?DG0#IiAgevaeu4O8_e^7 zhocF!#C{YS40XekO$t+86NRr>liAuDr2X!&V_WcV-d(7z$J{1 zt6~E;nJM1Dtzb_f*A8sxL+rRi(P4wJ1c?0@R)JgN2wLNa1g}DpEiV5EWe+diN9OtV zUN`|H^8T$3&aZ$ndJUX?0MyJr-GY8i67kr7sY$8&Xx|GdjD+rDD^B10P_7(*bRMYY z5hOG;stG{Ex#ds@#zj^|U9o50#VX23`*+f5$?{8d&>FD6cN;Pog%HOxDV5b{6Iey%8n;>mnAFgA= z3Z%mRw{9Z4uf|!ck!vPz+c?rzcAq=wN*C-$4jo^Ne=6UC^Nr$|+Ct_e*M-QE;hmUw z)!8jWDF;zaMq%vTMp5MNUX`&E{Nq$)x zu|xf9s`aQ1*!tut`a{cju)`=WN8d0-(~$j6OsTzw>;^=y z|EpH|hEZc^lma5x4!KD%E7z#!8X5BH<*cE+`>xG|m-6!i^SlL$2F^^;Vp5zP^28*~ zB#Gh&=&o~K>}$b6ob)RX)TxceCR0?@Cho;YVe~WKJX)IDwT6Ug`?$_?KOiR#85&A5 zP4x*-3T#BiQg%J=NPzQz+X* zd;SFD%M=<&jnMTgveQAOASVa+Wlh5noD%)pRJO3Z%W{G-;=ptjDSqtr_$Z@IOoLM) z?_d4B?j-vvi;Pf-Dfoh!Moz@y!jswU;YXR!ZB9}OBt(86{tm14+OiMJg-7$Zu>K;{ zDBC_DXJqN!@a4#$jD0xs*MU_reb1qJR^t{AL;9x|V_kS`B9pq>L%hErNVrAG2?Xx$ z-NO1_83C~y`1Nskfzl4Kj<^o7py&6?xV~%@t)t5p>9uSY%4rjGOXAv}G33}lYdSDA zIc`m%0>vJ5*p^nXIBN0;{=$H9*F>fgGUq|mk8Z~2DL__`sk4LjppEH(0wGe$2pSvD zd=wmKAqOu7wnHdhN!icmC-(J?SfVcG#GA`qL$w=o+oY>H!TaO`YHr2fcyW?O{}A5{ zE%S)`IPwQeXH<#?FqB)IJn@6=0R^Ks&9Co7!i4b%HnQ1j zdUm>Qc|5NpmUz&@zo1=hOma2SoHp0&`V&nJRsH_@vndB=Y&U%|Rt)o^vIroTav08d z8oLki&g2mmeFu8HZqC@%_E*5@2a=qBnhf8p!;kzzyt)x7I$B=AYjK-duKjc=6!w$Y zuiND@72;8B9G?WDjL4!4KdIDSH;4ie)l%Wao;r_OV?v)NwA9!f#i~k(gg8A@b@{H_ z)z%bVmv|P?LV0U9wi}r|@clOdiLIWa%b}>NL4bbW5yZx>9(ICFxGvn|I;Qfp>k@-% z0FPB?AOEMilwhhk4_~Fxv^JfaP_A!z<)=h;477I>Kok1RIP`}Gjy0VoI9hc#lSJQP zS@0cIMbFHOR`g*{qf@ngZah25snB?zh<<^nbfbD01QV}R`h$F~)3ppWakA+(weL$F z8QbVl8M)UHaqmUz51TzI7Z-Ri_GSBzis&@<@D-7_=u!jD(dr0e-02W}3ghrnY}N81 z+Ot2m4kNFRC4$HAcLj`B$=hj${VLn%hp1dUnX1f?OGH&lB40u}@O1LvMrPH6CPy7| z=*1{xlJN$H9M)Qy0wA=1FuDKy&%&MrUCSptO0z$X_OCIvl@ss0f zOj6x+B5|a&F@Ve7#N0_~4xIGIvR@z$X-y8r-m89i!z9P=rM2segkVd5k5G24riVeu zA#yYq#uQ@4`hW2KQ)J0o^6`z!98JzM;Yn)7N!_6_~$4_Ot zHOqYW$0R?C%4+(_YI!buHc48g{7;)aPC&Nnt<*bppaV#_GX0=IQUf6eCXHCn2eAj< zr`t0sf8{5=CiUDfh~|13AGYB)H?n`Z%YJ7h{}=n*_|gp@!;x!Voz6WltQSy)Evl(H7~*vq(t`e{%E zQYwTEm5 zO(8yM^i}60e@QPa9 zyWLE%+oc!aUn*SzUH4Z*u%VNb*LAGo<7M@Ejg+qA)S5fn4)5Xrf8T6VV#gokD+hns zxbm6!*0x?FbsRm#F73h{Vh};c0KL-#P&ejHORXIfj;+ zbcvunTj?)LbsP3|%@xCSWN;M&3eCZ!pI@jqrzxkGDou(^V#ouIaf=x6jjdw5TCd4N z^cijWYTpmLpM`k1T~}z{Q9bx!NQseOBGw#`e1~!5y8>z?_3L?sJLuFT2#4Mr)T2Ik z=Yq=rVpLe5P^1t8w~Iz~}y#?(s*G_HCXXO{OiyC0aZZ zYhR@B^i04BZeMeV6nXJA{Qh>S?sJHcuk*^>>3>fF-<0ijPg%PM(NF< zrAooNU3||Y4T7JXj{eX>I_naC3qJl*{!gcD<4!XJ|I&WEnC{{`qQhY=&oq&?v;SlF zM7Gt7X(zRb=`FwgMQuzMEfetEiQu1lB8Zr=o%8x>dH1LImh{r0%%VU`SA!M_R^_dS zZ6Gw|3gBUIuO^;T>I ze)^pCQu8^MD5`LYv(wi8jw(iFHR>cwSYJewa%QpOdtbm@rK9m&2;X%$6vpO`~6`C^Szy{AoSX0I^(+zI4awCVclcLq9@x z;1s)ER{F^<&i^)tt-XaNyxK(X|27mmDnDKdGdBBhICJJ+QLOoe8MC6;!rz@By3CW1 zE$LnRV4dB9j?oaEoR_8ki*pa>ykUdrj;Rm|Rk+<&nLkiMY$EcWt6*{9+Bc_DLeUqm z6c;Aec$mm5=3*1|jaX>;U`<@L(y%5MIUJqR|36eE2j*qI?e3|qk*(RS&##E3eEpu9f%uQo3b3V<;#Xq9U}3l^2#5m}KRkX#kq^QT7M zhwrraYuZ!!9T$^+g00W9Q8y^Z$DrWOqcXdgJo1()*3*amQHs z&*$8Ij@b+RkW&7y-I3$FBQrfe7vp=inz|N06U)XQvaihiYcN`t{4G|EH)s?2?Qq!8s)v z9P_Sy;yA1OUtPW6uv4k^U+6y$C>q$KD1y)Hn^Qk}Kg)LzZd1>5&p925yJ`-7{+eek1#n zJAUkv zFn9oCVmB)54ut)3Fs!uXKV7s<{*dO$oAjaALtj#GmyrQ?L)Qbcv`<>sT>9xGJ~Qf+ z--m8jyYpY}R+F58lq>(=^32C?ExW+2r~>~roV(K7J3z>=z+a}S{#MX%|INg}rhMiX zaYV&uf%=GnHO9o&O7xoUeGbS+=A!-6y@~wxPht}!{3wUkj>0HM3n=Ff>phMWWxNiQ zVSIzj*3BblT-SPI9$m9<_IR#Qc-`2cHqz^vuk(Q?7Zh=N=l!BC>J~Rgf4%F*{@snP zam~M>cYZZ1x4O^z(mtDALSA0*=X2~a+o*fEzj_zKPX|XeZ%#F;msvlu_x`>wPE3>= zD)Ik-c8bZhjvLXuY1O)9G@~Baa4oPubgH_MMd@xtvF21K^A%`CS0CJJY3S7GkQ+3Z zQxg9ZfOA7Up6@zdzC5+n7kGE#^#Rp-$t#CETiW`)QU!9JRE0gKEzQ{~HqO~xk9+*B zvS?71Gaw^q3pzzvkkA;FfOR^RmpPko2KtXt^YsVS5`~n1JFAi^{Ka0Rne9ld1I9FT3cg&lHupZNs^}(bTyDo!v-eX zBwG`5LOlbgf(gUH=cr>3aup!|*XRH2*an;(D<5DT$YoAr_S{v?37TEB{|e^Jf&;i~ z;@qE;LHI0I+snu=;S1rLlXZ=2Uq#YSv>)nF&GIq|K>y?tS4PTR!KcDAL zeB`dr)^P|wDAkDW1GjIy*R47!N&kc5{8_=dmy--P8~PJIZ@bpJjr*!R%*AZ~+i3ai z%gM%Ke_FWgRWLR`Js*LVL0k%;bgBjdER$%aN2)Z0Uze(!_Fl`H45`0A;%uxLny05ZE|AxdbkJ6KfNs(SPwjxd`yiUG?pC zP4g!kZ6}xRP8QT6!F;5qj@n!1Ci~2IfEp&Ek`+oIX-Q_s_MmYWDXS?-sv8v z7|zSD26e1_lQLg6GoTH*93G&HS0shasn85bVbF!Z7HW3LR8GI=apLc*Gk2~uRPNA< zYHciv)^oHhlBIxah6U7x+_t2b$%5r7nCL#A&XK09RKrL4AWPz-Glh#VvwVx^##vH5 zy$%8Ql3$qCD!tD>^iuxSXjSt&ZEM^+Dz|h!$qY(Y%yEJJXnX}Dtqz_4>7Z1FmMcm! zaKNlMGFK+$Ynf%We}b)`gUtlW@y~VlLu~4DPsm9ty9b`&tkl_VR^S7PiG~H!9WBAX zV^$2H*3-=-Ct{4KpAPg2**2|Ev@xIiHx4_bX4n*nFb6GGuYl^IWhX?#v9{N zLk>A9P!JU66*zRu#DDWMwpn-K0ph~m|C3LwGla5yy3}Zw<+Vgr?@RkOhfR2Q4680f zX&?3^wg-EF-ru>Xg*W*dEikTy>4TO@k}iIr!ij-B^k*@=QwB zOY;k0RpVo>JGk53Tnto0mz2b=xWRLLFb9riD5tq;!IBbKeLn$+z#6w=^{5R>SZf+#?>acVTSrDf#md zv~#+B$e$r|-?Ar}x$BXt%lF;;&e^LQPE&I>{dmFB7>Hp``eyXmbbNm4Z|Awaf0yMk z0H42!Xa%#rg8eY;am?iXfH9Za*IRSN=HZVwN9tPq{mv`{OxL6jP`@QpB<7UpU*Rw=zn!HxTaapYQ1UbZaJiuAaMunHz4fYBE`HYx zFI7lAFGKe}?xCX95pq4Wo7Z5qPV*$^CYN|jz)Wr2ge>%8Bq&la1r}u-X>BxfTO#-% ztccKlniUr&9I#kny!JfthAd7Qmkb(lgxfBuxtkx0HNFaRgA`uB<{eV%J zE`K&`T$>v{MEU5kt&;Y3dbBQdxfrrohFa|`ru=oDCRka^^c7nyW8hcQC!JR~wIsA= z|F+$dJ9d5F*4!+V+6`v^0uQUU(%+AF7;aR0{PI`8?lkty@glbl?op~lcUq;qyWlXa zbZUIN`>^QQ9l}87y(Kvlv(V3;==X;(t0A_iCH=M59mgg4JJ0l@bTE`x}f801pq2uho=`FcL&)>S9ugK*JAByu{Yz{qVS+LK*VkYlC$Rrp|#^d zoyQgH`@>f(ke!-o8!$adkNT%ygAPW}NkhFH+9)KUA>tOUeznhxI4%*Yly zDLwstgCYJ3yGuR4VsYN;Gs^<@R#vuqwDx)K;wn($789*D$)8UmJSt8;P36;iyEzWW z45V6b(ZZ`4Rk*Uzt`yCp^ zh=Y@1hHL$Aj&!axuG+&-^>4Ikcs{Wdv^UNWF&QD3q{M2q)4m`gMKND59b%V#ejHq` zw`~4PvEr@dj0ryySU4F5_C2x8*zi3FHEz7Ce!f@+$WggRvS(lE+Etb`hW@?u@q-+v zjE1$v{3HdoDorY9?TKz6{1Yg^Z23{zU)e{oVo|6j=T~-k8^yceB0v%Ht0Aj(5$OU-@k&v>pCcfE%U2*{SffO8Nl>?4$Ai@lc|s zkeoKPm#62eIgj0u6u#_qJlKC@%oXlS>FV>TjxZg- zYQw~>ahnBykNGdaeIcTD52pReBg(GOXDaFegj8(HM(w1*ig(h=8>hr#XX!0oZZ9uy zV)S!a{VVKMBr<%vg7WecDYF9&%-(5M?_)^3Hvo%T&>cDc;~*{>gbn;Tn2bHo#Uj~O zfg?7q!z4BH;H$Kb-bq&obL9snuh=8ZB1>q)P*h@ zgK#8Z@8%?iL&V$_Z=w)^R55Lvo;k0&_466Xn%#k9nQZbn&JOTMiSQeWpEUABZ#(Lq z@m(eJkYA~v%@LH;Nhp^F#j1WeT6bDHG5PMq+QJ=NeD;A3g;1CWVlg-Nt~}z8ls9xO zO4`pH$ryCcS$&eZocx$azV-`lLpTQmaIs7QJE4!iW8QPF^pq-Q@e=s)opVTR#4u> z1fUG!2mTc4k-te5em-I&Iz7V|sIxan(o`j8i~>%Zhu$lT(S%VTqc#iQlHeBF@)Tb( zgdQ>YC8mjd#g;qNe|)e+cTplyG{&+!;Pu`MtBOB&z0R(&9Ld;zR5NXCUA$gcH>cuj z;p{uLPaTQgGO3?0rRptf82t8I-ir>*nsrmtL&lERcok)5lo`MfvbNW$1+UR@DL&`7 zuJxKGWvgF~|GxeuA##V9_PePd`d8_eiZ^9-IB99o8B=b(*IynQHpKt;cSr}7TZsih zS6@JFjNT|ND!S2YAzE65kgF_SFc1$4Sj@pW3-G0Kz2F-ZK<*#E`sAj#DW!>EP#!wk zrf?Vaqyu6eRJr1P!_*GPo}6aiKRjU1Ub4a(>Mv*{6}wz{4WUOv7OlH~rxr>nehFgl zGgn-DVql&^z6$Z1D9G+@2`4}}ifcz`B!Dy&b8k@xk`Oh_Rzbs`1L^5abBAkJ%aLrN zyL@GzKK1%%$gS2iZi5Wt9j57YJXQe#1Y&vlZhRDb6S2B^>`1apa$uO2#AP1L+^p{~ zD4Pm0B-IQqJ=K3h#gxtTxqnM*@ZwKRZ&`m&d)PWYwSi^`SE(A3pYIDC>7hS4grDTl z=LL3@yE^xB-(s6Sw9Lk@iZxAfHtJ+gy8++66}cD@JiPVF3B^6=nA0$ry>gpy+Wtnt z`8=SD&~jhpxzk$8O8xBj+K7jtMpB@jSh4#FCgu3 z)1%m_8{>Hg{}c_12lMOkL!P-Tk3K6mL)AQOtGvro z=)86`WhphSuluugy8tweZ1Ms;OB8J80J{h}UI&a{*W4fFsNte=RQ&^tA3ZPSsk^3r zd;eF7Qz-VbYdV;||Kcp!N=Vs0qhb#LS@tvBpS{vfTvz+IMl{Nih^Pqa^UbluUImAa zbwAu45qIgCG@=-ixwiM`CWgztTC~;@G%q_%zkIm#1a+63+U~!@|FRaYMf?!ZYIa-7c4YXc88>iOsFJk=NWFJ0e6*6tv@{xeE{#V zt$M7Ee?OO~YdejT{o%0I<7!xKDB8~LJAdlJ^$R&Ev1cEIl~!EN=@l%Ok9?xSfwM>8 z{#ZNT8=GZ;&7Y=jUQX(trYB4nY1Ic`O;F8ItXK&n=+!Ab9tSceH#0X=#3bh%Jp;9s zagZ<%Mh1KE7`{J}S%mRg+u|h`nC;w>BD&C{yZA@LkE_-r3bs0O zenalYnVKzGq5(C=74P*6f0DQORRin`#S*`an=bJSq5P83FR%MufA`b)-oSp)GhGVl zeCMj2CTk3e%f-5Oj+~|qRVvZ#Zg1i45E~n(d_G%2vjS=7sO=n-NZD$lZO7U|I^2G- zn-wDX%hM0@!sXgMuz+_&GLuHE{_Y;dRUxmY~UwnXb1-_&Sm zAz1|d>hu;_aAuu>4zVk>mvUe1yE_BkVa(NhWiqx_MI6`v(%W>Y|n>wA8j z95J(1Hnw<5J79i=++`@VUnui;>NOry$qo8-K4mZ7l!l?lVHQ`sV)d-=4F3LJ{z}4m z5Z6DV#j#w9Khw8pX1FzXmGRTnelvDDcVa=auK1hnr&tN+`06c(CTTmb3*VyxzC{-* zu@(OHw*ZQy1cgdW3@ItE;s;mP8fPKGF%Oug+LRqtKc#ZgOYSbH05MW58F7d+3}p{99uL98iMEp{_84l|>Y3r<1@VvNe)GDwB3ltG zJP3*!o$KsXNz(uIvDhLp6tO$PizUW=lS2%?QrfNFSkj);c<%07W#k+pc`s zz1n?m0THt`zbIAturbFvkuLSXi@X!8Vr6_R-AK5YFFnfPc=`6gU%1Dy3bGca$1MEz z-132p&ZLI;t({&NP)U=7dBAt$dert9_{#hq5<_Pf+!$Ao6>z(`wD`=0z4s2VV&DqHH>@+BcH*qT5dDn+3u>3m!Z)jNU3=e1eS7k;i=$8p>hQeY$$bd5pQy< z=Th}9^JI!&q3-}JU_kKiy0Byv!7L~N!~4FDO9ahp!4JxEv{p60URn{D;x{aqzdUoN z-s`+zT~uk-E*DLZLe+#i-%q8Q4s0?vR}3XY>Tx%3nD;%3??61zDjW?`SIHWVrKH5uh?-cxmj#bOmmY`z6br=NOP+{Ust&C^=jlZ{y#nsfWKAoUFwf^AbS+Z|fFDx3Qy|ee(XYX^){&fHFx{yCSv7Qz8y6^RJ2}nC#9QIDD6ds7)PLFzf4yN!4 zOE!54R({Wa@w0u$|URjbhtgx+76EJHxB zf_)^AYnmb;{EZ;72|M0^h}y_A)4#u>G3Uf9RTie(bXr0>3LoH3zlOG%oCIjQW&=pn^{z7}<&3Q}=<`DK1HWj=+8=-8Dz)|wQ_Q_1YARafM zI8JiSjz4XBGpefTF7k+-vSI^(u*Z$7O<012l#G;?s6M|#?5yB;y=yib3SU)eIf|#n z|5j}6Vg3WkAXLBBnnRUN->(Ux%0~9{_kr}*A>6+EzKR1fua$&STnoee7z8pwnKw(8 z*OZA*Qor{;hXKt^CEKq+uW+L)8q~6Un>8O?arlyBY6I>$7OMTq>&D8b_U=2(v&`dZ zO?Ao>v^Sc7kPT~k%z^)YRX9ghgL;-8Xb+hbfC z_2KZIrGqx)_3d^!zb_p|I2VBpMe;{BO-e`#{so#-l?l?c;Yg@r9!K4rrYkzHE$_>% zy1;aKhrhin^(eF|zLgp_={+~tY_oFfT0~>sAX007k)+Gwcy6oomC9A`X4eV2b1f2a!NZG`$c(7mM<8L8ICj@@S128p_A5&*tKV zo@rUAX%JaO@&hn9-ud@&a?j8!A;{;}(}sN^uY=D0Fd5bzE+B>Q@0%kJZ6$E}F5l8? zwXlN5kyFBd9Yfl14c|rVhehfvSk~$3T{WamIq(bVMp`AF?~d)+;M&|TV_lrla{l~! z0cMiOP?`|kM8nluv@Y`Ddk5)5f#ELkbD&zhs4J}YfyzHl}ZyFE9c^)dyK{7}ks`k^&{O$Zb4xFerkJU)~Cf!gm8 zcms^K`UN0i-yb8z+92&_grs~qybk-isr8h1J3o6n8ABVu`dL)^hF1@2m=~|wBKz`O zDzStN*U+d!VGphL_u?og57R|(7?Z^a7*T%Mc?`oG4GVmeXmZo!+|bb->G)~EsZLWX zXf&eDsCPi4^LIdK-j!yTD(mi)f|cyEg(ixw5PTW+xd%$yTREvQAF@R)CiFy`Qzt25 zHRGQ_(Mpj~bH*_^2ya2h_qvOx;?;F1!Z2{+MTS-A$^)P6^Z};J86xq!!j6|}LIv|# z@cEYvl!(#5hFE#Nf-C3t1L-2S#p5)4*G&nOYgm`}!c~aSUsk!$V1j=LZE~Ibr2Sgj`O3GzLypLnVOXa!`iZEB`OJ4c%8g3M zrKU%AT780LjBI0G>L8lAi1sG8G|7mKZ0znR3##NU1Qu$EtUoLxZ}{Ce@7NUB2wLF0(;omf4<%~z}DSgF)NWi?i~gH4&YOjc>qsc>$_vA+a#so8ExsTL&W9)wH9(cymNF08ZZ4PiW7DM z2V7g_CcdJXVNzTlAd3Q^6)UOo#5#_InmD{mgV2cZ(<;%&%G0OeT&KB)y;;Y|DG{~Q z^8K8+w-k&kkLfgaMyY3B%A3g);#^R*I7h#7+nymqWqeN)qr9a~2`vz{Zu}9?P-az5 z2-b}!`4?gXJhsC|BB5OdWVf7HiTG>XcJCQ%a(rr=gLbs(K)iSNS-`s^bhtcAK>6Ru zIU-=6Eac9nB9vGd!O;G0{VD2wA&N9Ps*;w&aBByXRL3a`ddw+nSCpNPUk);jd~f)C zT2XPZVTR8dEgGa5P4Y0M9N&wzMnNCf6HfCYF+5jRZ?D66W6 zEiv6rpfc3_9T)i*U#my~^~kmTKB7BE<6k)ML%gWO6=6yj0ww7} zY84a{8fy-y&S+=%=$+OCnVP!@=@jgmBcW5YtfFdiJNX%`GX{9t1D|#UQz^-O+V|vn zLm7doHQF4(t`PJxyOHD!5#{;Q*h}cAJr+A-!luy@e=dSf;=Qx>W@3%ZJ-e^J*ABm} zPnZA2`{&f=ol<`;mKnXTpv}L^{q8!o5KTHt`mOXVK^Jk4dF?AS(mGN@t}C>3QLmZo z%2Gu3kc8HJ9-&*g_c|9{RI2b2_SDUoFNzj;{KEW4h>YF${Tf#M0haTW7agk)68SuE ziQ6M1>tBnXwMF_?>rByM{p);yatPfUpfWvqG=;B6TKjL<`UUO`1@8MMeL0dpTfYfd zH+k?~9`sY45%b?H710_jZ%gf~>}%8oYo~|yUy~%0pdSWj<2rL5O4Bp3#k{LHjuFnA z0ea{Klp7d}DE>n8(MpmGdnB-g+c^A}u@w(=0>G)BQnRD{0sloE@|wB?nnF4AMu}Pt z)#lSq{JUkMwZ`F)&D=0DWXl>zr2u3Od5ZIQZ%)0(RcYd418ZA;vZl8E{S7S}huz@T zURH#PEWe4uGKvjs?{R%cV3GeL53AvgX`ljYznJ#Z0KSvBb(<6Ltkaa9WHSir6;g;` zn-nsOr}p;8hgd=;R>(4KHNa`_Cu+$%xgEFq_}?oY$T`wIsP2sP%_4U}ZFY=1Y&RCz zv5@(|P&ucX``5F2c+*M~y3wtaO?Les3;xT0^3mJ;`?~v*+fo5JwjG@fL(>^{G}ybf zoPq)Z6Q^iLv!u&1T_ZgS!l4eBsbLKl+9PJyNLS6Mj6A({8AMg+f8-r~vycDAHgKd4 zuQZNk)T~MQ*=d*aoVLEctU=7x=M+<}X|R%1akjV&bY%l1)`mZA?O*5jm*xENWB|4X zEy@wq0V4}!RdrI7qxvFLGh|QW>b6~olikx!plPC&%(^{i6(gU1Bz5{)Xq#p2lT)2B zmxqG1$u3FwsI-J)0M(aZLp&I&Sl=gNvbmLMd4R2=+(Qhjq8)kBhk4g!FsIo1cxngC z_E_@IXY$9D{>_rg0H4C`jpNNp?HId6O@720^=4`ibBu!g3(yi`nJ9o@(OipaYmv6D zdzmt&`!2$(EH4!(cs~Irq|6@}!EsZ1?^XXB(iG|m>Kaa})Qrzqf-dtbIOK)|U*^>4 zxnMaxy%A1uYU}G!>Kv%e}Vu94VL@gROC^_pZbv08Z*+ z;6>E6nKYw&-*r_JcFT!xxJL!+mN7cHxqpuZk5NW3=Z=&a1BqolmRK`62kW<-#dalY z3a|H1&Q&Tn{ag_ylm%5`lt<`{wlsfpB>#JVs+Q<|iERLk*cM%u>1;kIzHrDV3@4U; z>@XKIP}zsqUY$W3a1m;>7Y-f>u;!&4>}d;Z0UWYpkQobZ&V91XPTTpL7Nf$<)xzk8 zlCq(NHQm_cC?r9*=)kF7PbHXlPRwSp4OlgTBDmth&09%sS0P@}=oGTva@Y%Bb06rJq8*}lpoC9swT#gWid{}PEg=t^3<7c}uATcp3rFv^#T zL?6Pej3X1E++Hr9heJ9yrf4ymEoy4wHh`e*#z`i30vH>wiy?w7;lhG7@QmW}mt22_ z%s>6a|DND$-y2`iy9gNFgHohqDB3>&zHCHSRE>0dT_37j7Tuajp|K6JE$_gLK5$_4^xn)e6h+FJW=Vx1B1Eo%c&lsa_y zdX#%@Exm=dOIRr8fqzy!ddGVSu8dCf)2#<=j`tEcT>Brj1LHVvM6b#$0r|jSSu#Dy z^1v4dV-Fi9t99PzZf zu(KsRlA^r1T$--33?lnB?5|$`Cr6|Enwp9mB^`wUWr>CxMMb~GP}0T13@x&A9tKr^ zSrd{H?z+3KB^7vq!(JxbN2;6_z*W4QUcBxVz%`j+>BsJ4&-cEn-R8w?gf1A@PXHD- z&lNY{jxM37B2)t@@|w?}9SH#M0ArXqL5=_p^Owl|H@EYLmnwb>ehIsWyliEPiP($sNlq2DxP`U*$<%9K_n+DDzt^W5Pc?ePYD0T5 za$f+`<&3zVuN3$lzpi|c?pyhWj4)tAQ9`$Ki%=wR zbbhKLwYSHq>>WHyR7qO(GJYc=Zo` z1vFZZ zzdl9!f}ng>f(GNcQrx`=cABVE=2<)p@fM?l1MgJtZ@8pB+Fo(x}V`C069ZvnTDfXA9bJu(91ekS*YX4`1gVRHHY{Q)8j@% zMZ)>c=ew2QTI1o54RQ}T9sA_C!_QJbm9~6zvY|ayjCb(Bss;od~{U+lRJNy0mR4U8?;J3wMM=f46JN)8sctq zGbJ$pXrmo+s+Q3)TMM$se3uWWU#;GALlqPu1(J)`(UHGiFR*xv@8}jZl~4tB5GuJ5 zFIgR-gXmRmexcTm=v8;k4AoY-J!hI_x$yMVcz|W!^-KW3%O zynza*DMbmXZ|FXhZ7+cAn@+={x)jaNY@A_FV`JFK((7PQg4}g2JDIRG{~tOra`fFg zgIv*#HJxQJREMf!S;rK;76{k5s)KXt+?3ZGj38TR9Q~mX%aW+3<)M+lNxW$x@IpvT z?@{|j)$koTX@5cQ2oYY>JSsGl^o#M7p51z8+0Rchr<~_OdTU@m_AwSI-~8e8KPyDXT)a&UlP39 z-{=4$sUy~|Sg*|DWJ{?@thM=)>JNmibtJK3)e0cPCetDML%*~pd1*YKg6yFiUngYb zg-tWFv0Mz|E$;IL%ez^Wk0%f=%_u@xl^lEMU+Yx-!*xADg(?G0o! z<*%W>rh$lrY{k~}J-RYda-XX{G&6TU=}8aw>S(!pQ=`2++`&hbKP19#enqLs2Wyvn z56|5okYWtS6 zGJ1N2Mq%97x-|l~5x`vW3Im7CEUAyWu*Biqxj8s#g)h0a>$kUsj{ShpaYi9fn{r$F zu-llS%nXf_v885a7#M!G9V8g0^Xebo2sWx!1IA0kuED<6sE)+G5!qFpWrdk6P3bB<}zX6|1eYaZo}rEF!8NvZBUhhNNBtjllH3bWvI!v|2 z!Hn+h9u%00HXmB}E=+ZC_f+H}H4KeH*T+KNKl5&;?4ONzc{12xM! zHC!$3xb8}W4~CiJUf#pI_n@dN+BYwvsqfxi0fZbS(@3{aZ35?>mC{;M;q`wC{`EgXR|H$X=;PVO|LH#irG`bSIZ|6eICY7e?QkY0TUh+;!l zop+WBRrF&xL4>b?A4 ziuAju0^LTG^L+05;D*6GcWL9UTGp+^*T}}Rqe+Ub#E(_t*18_SoubNyaj;Oc+n3n1 ziRN7+R*k6^=0`KiIw!=K?CF!IFt3yO%BkGHDj5IXH?`Hgct3qdo+eYC?_173lFI4$ z&GSd2&gIf4WP_TP{6pmks1cN3fv?T*ZY?}sX4Mz#%CDHE6R6z-!GJzBq^(s`h3lj* z$}5xn^oSF>uBrYRjVOxm0*G-Y$y^{1?(U&zh^~Rw>jS;bSGsM+1}9t<*yMX<)RwS0 zBF8;4aw;}bmu)lAO~zOVb~y#9J0}mn<-JQVDJA6~&H49MuiEqd#%WanTgUzS&CfyS z!`7aa{LAle8E+~5EcE@c-2{r8X{xJ2rE?6WVXlDw;{$natONYrkH)2D8bEg4i9PyA zW2m)n0bnz=FWakMiBoEHT#pg~xk4#pdW8wCc>gGGFl9fT!-lP?2O!CT%_wZ%=+BNV zdorue`bk2q{f&|=C0ux7KElzx)j39EjJ#qI-KOj zA?*Hjjbi$8u=PSlkObi4rtjrgOf!$>Nh(_v?+7Rp9b`Z#vFH zjC?wC9rn@(7(YwfH85pW^C_v>S5N(FXQ>ZpW5oo?Lchz$frTXn-S4`G)+B@$9tq6I zsJFM0#5RG<__tO2nYPTVWl!cZX~9hoQn2qA>l)rTnwW2k0D1yd-2ua{^SXied~3+Z zxErdCXeV)8JmM{G-&zn^8+YnA+?%Uj7za2r`*f@>(jF%VNR7qiaqVy7DZoD{>yX2v zBi(b>mftUE^;dLan>TdNyg4Enul-fIPY4aoq+)_3g2Eq*YAXiF(nRWlA5ecE2X9+QHs=sJTEHvpCstxB z?xh*3eX13*yx?lJH;W``Wo2pK>wi`rceB)CyQ*yMwjC}Mw)SGq zmhd?35whsG^GZ@Jl{^DG&}qWecZPZZ-*Cp%nt|jISI$IrIWWqY9nfCC%1rgl7X_v) zs7ZQC`=vsWjO!nO9I?C+8Y8o<{086~DF4Wp6fA56#+NKM17kOKKmbpHReHDE32{Q4 z-thS8@skd5Z+7`#VlUCSNuh14!tuzKq+>GuS0uMTd^Tpzf~E}m8mhW1hYKgv-jNI` zsb=baa=?lXn_0OP?NuJmH!v6Vg@PO?t@tjE3WfKewjpmP7#!dg-zQ#|`zEj(+AI79 zIzl>YWEo6D6~MEuN1_=dH((PVAiLu#TZAW8n8DWPbTR-R^!qfVXb~8?;jlAZS_-{? z9qPCi&ixy8rxB1oI``|dmKd}Ibk7jgsvHub{&GtNc+0H5GaCdH`fAibONh9V1)j(f zEJS*Zngb{8$2FS845Gcmq9=CCVdj>|Jfk$dLlwY-S>z+(;_IG5EEvUNdETC_**bve zxa(P`S6Qz`Nsa`h9?CeKK}SV#_B`R8luk$`YonyVD&B%O8pTYppXA+5(dBAZ&wY3L zg5M-6f2NIpc(K2%yKLdNrlPZow##~$XQ^6c9zU`*K0lGa1W+K&1)T)Sf1|eY1MZ<= z!_lLfV&0PF#3L4%7USN(ZWMrUHLKPYW>Fe8TQgpBW@|s(cNp?%bm|c#r15>UB1_!-U#; z1uJC*qv6y2gA97+-p&1m+8^642hhVvFZbFd&vQ%T#%XOgM+@h=PVxpMb@6=D>uM80 zEb_1f6(#g~_elpD0G!5lDfYj)63==mXg0XlHm2*lEE#c!lxtUm0<8pHIIIr8_hucI znFBt-|I52yr#BzJudFKk{$p0FMgbM&<6~i6|hxFX| z=p`n%+w4OXghi)Fz$78|?5%8=zBuq1DLxt_Z>+kl)Ez_LNCdQCO#`6nMy0iRw z{4vPcm}uYmvl|`NO$@0QDELwDQ6C|H)SW{`O4{*wk*#^f?oW8~3pczmmudl@(42dv z+3bJQiOb@JYr#ip2O@`9zS-(Au<9V$+}+DCJk*0wwl?=?DR2j6M{>$%$wQnHI3hPf zwZ$y#VACeDm%EVSLCu~q|AvB0lxofkf2gLV9SX;1iHd&oHfae>QiPtkUEnQFGd&(qbralqB}&-u|-9fBnctfcoy$vbNjaYtOSmohb(aiUY++ z*H>l~-P~^L7O z^kZ-*8PA#=tq5QTV}+6Rck-!hGpMXK59Ml47rV^azO76^n0@G!7*Fq;?|Cx@amDeX#t0xlQ4o8y!G_P)>(8pvYSX38 zd(LEd8o<=zz*BDDihuzpeeR%$%Jdk=hLlMj=Vr3J75~Q zbdDssE(W&H8TW8=`eF$3KKEslqx(;D{f})Qhuny~rP=K2$h#KCx!r=BSJHescQhIZ zs!A&iVe{v4095XYr5=0c>m8V^y9=G2lvf8Bf=*?`Y@w+u%~^p}fi9!3vqHrr^#l=^ z{384-V_sv*NufCQUD0U6{ufo6&^{gnrh&Ve8e~NM$YFtRzMVP!Nd)6eyfK(#)t&o?>V2)~!W28X$EET7ys3G=SrA0jQ}d1!rF*xP?uExkN~B zK1o;f_w>;gX)I~f54IM6yjt#gd3y=IA_|&=k6GhzICd5?u_q$BqG%;PZ-I-#%N`9r zx{cn(PD5y3{I1)zF*u5vu2aGRux-*zk8s+-`fk6TeNNcbYex9KbBfS z6m03i-3GTyn~nzLPTNhi54VKnt%n&jYVKj=Kq523Gis?+^-eyBZVH3jN9AZJGD~wP zF9Q>j!T>{FdD&8;(OVU4BKQ%kf7qL~G75gW0a$SU@MNXu%}{>}ztt1z0HfFw>Q0^; z2ZMZ9!I|OK)5V}!688EB?)b_D&IT_ebMis&}q!Gbe;isq4WpC|g{9w%e#NIhuL zbmdR)=>>{1!+R>nEh?>@6oH??t&pagC2e zCyC|lJybb=-l9pJq|U&4O}y-ef{(s4Tijz_sxlPn8)me8xgc9r4SvrtCtxcvZjT$z z=U8RE(+B+_!QF<_6oy4MDpL`hMaS2}0A0M(6UtWd2x-dN!Sq4+|6z6&# zRk>MS8aG}05I1FLdY-MXBj?(MZE|J){AM`8@5fbvDStZ6#-Q_EV=_+;vN^0d^sF&c z1g0xSfG(kq`bj(&J>un@DOajS^@J4YtzMW~XaJ!{0Pj=ga(Kq|qksf~;P5(w|5 zmKtGM7)B5$3Lz2f(;fr6d5{D&Q(P?M-K3+NkJ5!%eb(t1j_m3K6L3MKbtB}ohhDu^ zhW$9fM4JK_S+@?<$JQ=@Zf%OGLa#Hbq-Mcs9=5Uj*9iMJOY{Er+k(tSU$d!~2=B0t z7c6aqp}|BGj$RBzlkEqI=u$kADOn@_GhKYd2I_Zhx*2Wdns~v*rQX!+SqOqj?sKR)$G$8gwxiX^i5EA^J0~}m;g){tQ689i8`?W*?_~xyi zzIgbziSJ*Anic>J5o;iYtEpO}lO-==D|--ts$SOsxf-6o_W9g&f+#j`4p0IAAYuRh zH%Idy?p`+jM*7m^gSmdqZPwUg%7y&NAOtL(BF6J3(_P|r&3fC7Zw!nq66Hhe^g1O& zn|R(qIzxD(Le(>55`&r-huy3#!M%~sEofkY0w(YsU|NhaP^5gnPjSBv5Prr1BUn6Q zN80#+9C-j~_)lzxZCu8sf4ZnLBZ8nb{7b`8#Gv6$_RY-iHsQHKFm1({+8((c+$<@P z%e@;2i%7mKsjT#@xf$jq!%%u(!xt?3v zZqaj3FGiJg2&kOguSyWO#9r`Y=exTzG;We65XQbS>ceIyPOLwqzCl8ecuNu*!6SY( zG011IT8VZvYTdhF(^udW(5m3~B8-Z;-?W@CGZN>jYrTWDT&p%Q@(e!O(-&wf8uZFw z5+}cZis47tY=zO_fY3#!P#m%XOuk?G*mc$@F&@cvP3xd}^YaMy0)_JhmFs}!H&)Kq zLI~wgEU>ODn-CwO>QJr@yvrATc?yP7LHS+kgd7{Ow8vG@)dBhgv)8F(+r5b&l?#^q zhf|Pn9;~uNo_9SCgF)~LzBc%o|GQ?;&|d z66(_J$J;BAk080nPfeouj600>k_3Y@j}DE7@X{&Gz?ku)oP+Y~HkyEHC=Kw@l9X=< zt?dux#kGqKWR4Sx{=FzA8nq?#%|AdI@x2RP;%Zai3PzVsEbchu2$bguWFLR-Rq>PP zZ&t=?MXk`n2~+ja|n?u5m;rVx$g;;ZGk?*0a=o*zV^E0 z0>2&CCny$z3J#Z!yzAi{fK6*DJ8AqlJMt!8$aBBM;!hZlTx@CjrZyiBZm|foYhC(& zEmgjB|Kh^Sy{HJN9HT^kbw|o{Hao?Aw38d^ULWK=^y|yEK%&|E=B=wfbrT^XsQ6-` zQDT(oLt~O<`r$l1mY?B{Y5Cw?RTzO#u@fZK z=?O5w!G55@K7xhSeRn|4Zo#tDXg!;Cq2;2tb}F8rrL4xH*-o0*=6msgVEuko)mOX0 z0J}jK>m9ob8D2mzF)*p3(=3h6@T;rdKxftpG5kW{H7Z%h^GGbTnq?02<4bI+YH&v< zw<{Jx#y#u0$`xy8i(mDGQvGc%pq`B&Gvl1zkcpUp7+Fu!+%XE{B%Y$zlU0Z*3t$g? zH_<}}YN>*+$uz$o5CCFq>(1%vjr{wv4n4FOiV<_kbjGipjfAvnYZE6-tmd4c(UJ+t zrJ&l~x>Hhv4fQX3tF}0*YNehK9c^24HRnk+qfSR57APMeIzecW{XCRWc@N{O`cSbO zI*h(#J0UL8ajthUZGfb+g(>)3gYfTO(hZQkUDHvQi-BW{-@<_j`D3=b$!>$IQeB?MzOZlUhrym14U@R3QHv4Rc z1TI=1jlEs?d}h zURBHAFU7BD+}!?Vvlfb|00hv$xbVHgsE>7WRCH8i^yR2jR_mw)ZLq|+9PEVnS;`jc zkfhfNu5y^8{+L#U{9?+?c7r2%E1ZM4IS7;>c)BArv`ORTK&`)>0XXO7pp~R>f~aI; z7H)9sQabNy8M<_^NrWfAafCYwi}{S~6y*R^*kxAavjv%Vy#qc4W#x_q^FT$m#_>b>8{ff)%C$< z5qX`{5~R>I2FC8`vL72Ep?n(FT=hK2GBUKVl%xOK2Mh6#ACgBh^IZ`(q!I|1M8C%s%r5VzCN zUlK|@>Y!mW3g=xt$h6#Co0n6ufo8C&h%xBfeGT*EN^rEx0h#xw*Cc z*-@Rm!fWUqK$@{zTZ8AvA$@~eWU$*+EI;3@i1u+ecW`A|(hX`5Z-Z6%pyoz@wfj33 z7sSpnPy0lQ?B!F7?Ngvrk#~o+eo%)0AyZyjerVHv50=qou|~Ys)j^U~RgODiT(lk% zKcV~crPYX`jH%mwH+}qp)bA=reY}`b>#!p23UJUK-cj z^l=rqZg4iGcW8Cn(1t24gMl5Dx_Hss&C2u|&-utNaR{xC1+z#|klhw_dy6R5GF-fE?ab%tUf$cMGI#TwjC zX0WYW)x{YY{wAIGXycnJT)Y?1B@RV1xtSEJqvnO#LTSuWD!q&79#~q1L4k6fXmF#l zAFfQ$`c+{kQQZ{umC&4hm0kU9+0+y`t;_Ihz1+xDsg91kz_(klkJ|Lv{|zzzR~FV5 zhWmmwmB-YMD(2&8`$3!cP=FrYSO-;+osalOf zPvv58)31CSkpS?DqLd4VtFJiX5o5liA#4sb&oaY4e9BVXyXO^*d*8bNi;DWV{$Lp6 zv6Q&xc7tFp%POHce0hXSV!w-19yF&3@A4{y_5ad|i3{s~Q+gCzcsP`M)j?0M;U#cs z)@82zz3f9KZkD1OeuxpiKHi*=U-cie08&;tpYcE9$gHS7!%gdxloexLjR}4Dp%-m! z%o`pR7)o}y)1X`kPWj~?Z+l~r78Y?#17+QIWUf#qTJ^*6KH=IR(XK~bxu{f6^iVk? zam>+Qh0W&>j@(hrPEV=o7ZxDWnY%(9rpsTdcd`CWVEb#l(8a?`GQTw9gPp?|>@pc) zMfcNOV>`*G>S&(e&D@c+8E}_ZSs5W)B><_S=2s1wV0j@d_pMaT*T59=&bji_#S*e_ z%ek~KGtpaL{+GG@7qa4gTOJ5XX*u`{bbCN7n2_TiL#%xR!zRBGm*M)c-K8Savt$oq z`z&z)jtG(tBk&bkdovV5GAZ|if>?@jsm2oo4~0)8z4Wj%|J9xpaaAi&9~ggzB^GQ8 zWq$*I1vfMDsrqGRjzwj}^`aO*rFo^kLHn%w@T6W{F;xH3_AG_vqHfBWSc17@Ms}Lv zm+_T|z`K4*$GGAO{V;^M;C==P?c;SQfr!$*=gch@j~NPS6z~Ge1B_C}--OxIcIAOT zzbWfr^_e;=;EtP6h3i4_f?X5stbv6%1ih~OWe%&L-7dgfl5r~hM6(8-A^Zc#HFvS-%#*2j9uN`PKn9B3QCRkJl5?AtkFj9 zS67CO(iw>xCQmTzpDgoNz{kzoj`jo9V|}GAhK-6~fo*^v+(B}6(+A$wU(hA7+!2_> z#qHVedyUwC+1zC!5RcH}`v-qZCV{H*6^qeR7;#l{|3swK#9OgT1o->yZQ`;l8@!?T zj-hd|k~(wbkL()~Et-eJv?zG#Nwfi;Z|M>e>fvjlI_?CKONQId`@brpRbQcILBxa} zR9$h*B1~Uw@oO4<12+@r>$I)X6U04wG&IcF%af%{8i@me1of(RM!GP&Y?;^>v6y6W zZoHqLVnEx0kEOr7d@B1-Oar3`Y4XZKt~k6~CSTpW)o+GKi{%aFve6LQ;}zR&7bb6G z$aJm06=!mf`4@OXt(iI1-P-EuR}R1@|HMUXG1}+04!yeE0+0D`o5w+2+Hr%k9CE{L zx_EH$198Pg#OS6D^uo`&OwtlGHD^&l#YxZAFX1uHfElp;gR3Fsrb#?;_)z~vC!ciB z^a%ooUDZy^tuU7MPNzJ&1mQ5&nv{@4N0=F{>X`MWONwrYF~P#C`(;6TEcHR=>G4UL z!7_`Vi-|?k&xR*^!M{AU;2RI69SHYBuc%;&v-u+)uht~g*EVny*yJUu848jNIO|Dz zg%pwoX|GU%dF|+R>|)T;cfEPKDz6ZhX%l(f^y*%H^QFJ?-QEO1!2peZYhTR`!YoELcUU>KgdV>32)9EpvZ|tfdaQ*mGy9@-OYEM#%L%0cGjAWccL-Uq z$*rRGj&#sYu-s*k!Gh9Cw4bWomvmDP_g}R39+fR)FstEz%X`a%^yIIvXH%|T`DdT{ zha~xBOq|j_qz2`Vxb~dXmlchh2%0k`Z83WWDHmIN$z9;~(pZhm=5DMi1G zdSkdVWtnf^j7b2%7=ZRXqbxDy8;f-<#S1OYB?(bO!T3xk>k@Eh`qK|JCbD;a{s)MMR7*`=RCuXHTorzWV8xDXIiz&2lHpEZF&X)_RLy<+DDI zknk8Y?MVU>%AfSw#=6&O4NG6#@rF;Rqte}_#n;12`Vxb#7sPZ`HPj2)d1C{W(gV6{ z$-F&-jZ8gB&%-?EYKo&TEYpBCnj->lVC$E+1mq?SgdcL=vTU)C-4UVG!}nOn1iDTb2cW64On<1E z(-v*E+Qyi|6b`=_I5@#K&1VsRDaAhJ`b3VW9sc~h>U1PKxOu`5?&S~6B}Z9aBOk!x=O3|l=i6+$bT-`BGgzgS#L<(O8v-&BNPN9z`W<)*O=9)3IPDE zE+f{i9M9>=JK{ISwt*|F8=nMihm@=_^ zZZMP*mfjJbdkCP_7WgmPMEbt`Kj{M-CB{MEOec|`zuvQSVPvZ$a*;FPD(-SxgOq*C zxUOJP3n%hW50v!^Xlq*BHNcY5M1=&&-;B3i?IUgvfy3!=>?eAx`C$FoSV1=!%AO(1 z`%v#T1dR8riDbXW?GLiZf2QWDvZw*Ki?*Hs;R)$ufeg7hu|TIyL?9&JZ*(F=S}mI{ zf(i7XR)oMlYz<85rCx%rRb-O#P=JUHQrciuT|~Dew!^UKbOZHb=+n&?H9$X@4HqSi zo*dmc^smLmpMO<0^~FgH5UBE$gupAbTnV0Ye39rA54rovR+X4utaOrf;A7OOLKOV+ zs}^2qbq4a@W53&(URSivS)3#zsJ^PcWW`gA==$aBY9|0Pe_qHO;MkQ5C8VoK|&$RtAP&vH=MG=!>Ky(>FN6)$BqR^dWncFuh$Ix;CpyNiz4=gr1pdxA4D z2r7LEcT^T^H|Kx_kN-cG@dw!lIcodjkQf;ab3q@$CzRTurV^$vi+i5gjk2ubvIl3N zQjs95Krrf)9!sSVAX1Hi<>#PO6rrq^UYBq%#FK?1AKBL1%6O?J`P1CenV!j=0sX+2vJ^$yT1j_ zrXI~0Km(aVRBv@!QvVF)Y9o@=?Z-Dv;+;lz%}tY1(;x$EI$tI+?)N&as30G0;a+K}NT z-s*i;W2P7E5()$T41PHzZ&lrA735!uXV739U=8v>ib*ylg5=Uuigo>UP>a{Kgt$@> z{p_P}@XRynSbmBS%;=+M2s;E!aU>$!zL5~1pV>LZ7#sAGP~1I>auO3AubhhDF;o|{ z17`@}YSF4iEK@F_E5jewhonE(FyCc5@52#!A!K6=lOha@N zIZcm&43hn`+XHq=653W=OH=u3_|e>50#gQ4Cg9(b$pZ5=0?XU!rmR)GGZT*H*!tN^ zV%K^sE~XzKxkL$wE*$nlh-KByBzM9o5NNkj?YduNbKs^V%LhpyN)!=xMU|HLyx} zjvxtEmDJ6OTu-G?_j?>B0A~x-ac{I5?k*^RikZpCuWGEb*d7{@Eful%m`Z-qA>KR+ zrJ2(FQd{%;k?9_zF2Z}b6MV7x^4$T(`a)AB#oxsz-3W{f{(Bl#_yMMj06d*9IE&bg zX0ipUtlDRWmncLxZ6)4!n9kR8v70N<;IPmrb$u$CCy1-SQ-3PBp*H4o4Cg48zTVGNr8kIfdj2z(Q#oY5zE%s5ho^Jr4}- zKPn3pEOG}rGjmXF_Bu=SV(jeoomV*jyYogq&o&}4UAUl#Lu_uR%6=NV1poZM zi4#MMpQzERB@`(7i4TM8EqtDDu&d+OT&an=uZF-06`9!kr9&UqH8ryJxW6N@g+}O1 z7ndnBvEBf&+il*?q;LsNS5|KNsC=Pec!=z)uOmm}&${ju*Y=&KZ^_Y0P(MP>8eFNP zMot3O5+V+ytv5+?F+Tg$iuj~>nSPSP5YG>^>l`fse*QWz*ih~4>n2DAH}~DMS%+QZ z*vi3RhBQ@*tAoHq<|EwZfqD1WYS=u>?<%~z8&>)OZP2O7OOh1!#+2mhR1M46aI!rQ&HLb=BAH{_*h6Hb- zt{Ft|=2byByuSbNEEPZ!@R1+%vG%=~cj>@ji2IGY*mV4vi7aplV0Lbg>>y{=A0fvW zZ=NHkNnZf3MB@zJE2IrqTZvn1Ip5a+MyCIGO^FKqKhoYip6a;oA1_Htva%wxNXROi zQ(4JM%HAV;Zw@C>$SgbKge2Kn*?W^@Z;nkIj&&RyzxSu>zOMWF-oNheeLo)G|2!HG z=X^fz@p`?U3vt|z;DL;XCnPFEzMq1ZUm>~3rMA7Cqwp*8FNZNn?ESmcyHs~6t`N&9 z&BX(NGVWucF*vO1C}-T8U9BE&TT1zj??)(NT-1?_`gv3`k%Ok;a}0i*_i%gJgI~|W zS-owqhN|-YIE`p8zBz| zRZrGLSNPs)1#;ARt)=>IR)YM1%I;V~9#tX9tpGBflu=;6C9}5rrnqD4^A@BI!+_0O zI|)=si@*g=%eze|P2B_dC}W@{y{9q<;`R#Cv{~BM!Qc8&t_~IYyYnrc9wAN(CBdfV zg`Ub}a6P#X-;qnKimB z#%T?Ud>h*VZ#aIDg7?7h=YtCoiR;Yzh?Bk79}qht2o1H+npG9Y+sjCVzh7X@jAyAc zq2s;~_1UoY2X&CG^U;C|)_?nL4V2Dx2*~UDtZr*;$1@?`Ruc+*;fyfe4v;dMBOR+6kquE*|F-}a$rm*9n2C$ zHz?#9zn*P9I3e@j3d9}FLH5`NM^LWDS~pq%U+V`h4}+s4SqNQ$p)c}NM+^zn_b$a%8Ww5yVOrlcM_17 zF-bjK;aV^W7ofc!tiK!D3`pW;C^oOTKtA^lq>qlJGJO9&6K>->!xgciA6v9<$wL4N zNY5M3w!7Vk{H~9^35d}c0cPfLxNp9BDDKoy^dwh@u)rgSpKBRBZ!H1N+0}ojv!oAaaX=)e{hD_=qzzbKervL{ z+4$Cd$6Yd&uVT_g$s2g{>eroYIF5)^Y84t9oKJ*YHfu`T3!k5|_mLMuM7#uu2m3s)2Ffmh@}VdL-i^e?+_3~1mLUtLc=V~E zE0wZsU6A=l7c{!I0I`Hp+=fw|?^?b$8_B>gm*98ug0o+L0CC>e}aAlHUk>^+@(X?49uPR1!jXqCyCpiG-SR zL4m}>Gwd9d8k`~_eCr|FV1#(1xiCLaO|QPU9gf;&NCfZka@p%PmWIqt@(gkWd7`|8 z#V#ZxeIEYDpzt;QQ|H^LPBnj*xu74Apv;Go$=S{5-DAc`OB>YC2?YS`RX^%Qm>XT_U7%b)D1p>HQY4Hb(<_gbfCkwdN2N`ygJm24xlFnYOpmkc zwyTFU`%^@?gyt?1GGS7@P@&ID=ls1j#2k4v)`4tT+UtqTv45oYlW;)`Z5b$wjF6+*TtT@WJ^rt_%qi4)ly;9vl=M3ua!qO zXkRF3JZ1kTKLg<(UCE5IFS_=CgY)8HlJ|zK(FAulIzWa@sx%S-&YeNz18IpcM&d3r z`uZ5%X68AD{;?=XlFEQ-#sn%Rzh1bE+{3H8iWOXALI^$$_$y z*4g(&4Ti2c67T5TJ>jI<8Ux=jmz#|ebs_5a{2=u!G8A#t$7b?4EIg^02We2|a2JZbU)Uz7Gg0P+wC4ur#{nK>y0 z{LxNT`_G>TF(Hz&9|lw<>|@%G?Q8dj_b3c9{ZwfjY0Od_9@e0)4g+z4 z9?&2!4~e{oESU!fOyD${M;!%t6~H!(bYFuk&pG@h3Bolrwj1BYnChpb%u*nbr^n0P z-G=+$Frc(8EHe5HTwD#*jB}{~3Tas8YPLr)jkU{5X`t&SJ4@2|#pu{9tq-{1bg=t! z7PNH<40#7-!{w=wJ9{AWXJl`uhPlK!avu`vnz7SwmXl|_5^`N~gI2nL@VaHw zZ1{I5-a1|lj-uM@HB(h{x?~E<{V&<<4j`l@>S&3tj+jeKuHWIM!VOc&cygI%5A#rk zL|!Ghi)vmEsqMTZrw^BrM$21}w}r2-MV};!>;Z2EgLJZx>Rsorxu-&TZxzBI zPIR(<6ykV(J%^O3Oq6)O{~g?c{Ai9MjE=L!OPS5FX}K(OF%6n4Xj1U|LK>k(-!^*7 z!9EsLao`6+BE^?8B6O&$oP2uK+ieW%eRNU0t&j@>&UY4#-$Zw5q+w!l62WNCaO7#| zwR#19rtGAc7<-=V$Hl+%4NCa_D-{8{xo8LimQH&AK@o7pX;4Rwj}Xj#G14|=?7wA0 zFMxfaj3f!;^BXQHe--)z6)ZZ0dm3C;E{)a|ke|#@sV&g+6Z$8FHEMb>Pq*yrpN^@1 zMOuld+tS|IC0IiR^3Gac=45@rO1SOSurFXFR_h9>{L_R{32add4+*cKcd5&~29iXw zD14?t!V0x4>;5*7tbeVUBX#_e-Gn*RC$=CqNGY#c`_ADnu;H+N+91?CYpYK7QvrFYqc*kZG@D{vzl`PRpQiO}>S9 z4V$ueGjn>B$eQFB>_I~=|>FSI2ZC#EhlyLgqGKnJ11)YzFL8|288pYylbVZiH0FAoSM!h{92 zaNTZe3M6ko2d2r?rIDWKxH^vN*_~7Gb9rzhgF>3FGfBxs_n6`fV8}Al`UyAcx)pQ@kUxpubx4(IrwOnjn95Y7=NFsJdmAO*Stkh7iQ zk6V52WO_y5HN5@0r#^LP;{2y!sE%?0(XI*5@*N5u(1uJCd>rj|Zq-7goaa}&Lvt0R z*3=h4a?c$u4s)O;>s!wx@s>ns%Nw+CNjq{zN!$8)+mpv&C37+(#lISSD3d0bf;`W0 zw;nKMdVy%N?W}AuR z9RZv7kUGkXnbPfZY8pKgZ+=7deb0QexGfz+Q}E$#wZoqEgk6g8q4h+VWZnUZM)-DS zuMeO&UX@?^j#cJ?tNQhrF_pY+59gJi=j%CCjy^Q65&Oc+NC0meg2ao=>#d5}@Zmw_ znX{brUd@Spb*NJ6>|}W%Rh=z*ZDL``@vwpCCmx+Q69(IvF>OLoy%WDkKc^Va_4PcyABbn-2>9|#8d1bC^Ey!p3TE z@8aW{{J)GlC=(S4YU(S%)j4#)HGXh={8~~URk`*&myp3^Rl!lh)N9p17P+wRLBuVh zY|n=iEv2ed+e#~cdVOP>v4ZtvN5O{6^U9?AKWr(%@cqH4C^DLQ6+#{Y?S+TLZ2Y{o z0>fj(Z=MV)jqb$+#@}->4tXqa?D{D}ax1Y_K6K}sxX>wFV8>4vy;5L z#`*!)bU%a%-_TDn;|h{et;HZU6UhFm{&tE#io&K;L&JnUA)Kh9IK{kcMabNC=Adj| zpLIcK%R2ktj_DUM4bRT!trynUxuK&b2RAnOf)9cpwO)u`cDw4g^izvGg3YuzlGQ&w zpTF&b6o-GPNvh})yQJKXBG1l>(6))xIJx&v+bs(z@9lOz-t{~aYuoqfIq8KwPB%lw zM6*?jZzx~h*=CLGEjqg-@DC6?|4Ur2$3She(vQJMcwx2SkZ$plhKxe!Y#T)p*Q`A+ z{F?n78b>xQr&&`b+7gHvbYAS|P@l&(e3dFtF5I+7&Y$NV{Xjcex42l_ zFXZ^~y%2`g3Sn#Em<;Uu8*=mmed2ifl8d+=Is5f0_sBB;=7ht+?8PQQq(EH`75Shd z&))aZTnKY94!g0{p&H5Sl>2_l-`rK62IXsc?`}# z3nID{EmA<;S^eTvspmftk^j<(1n>smcZ;7CsJb-%NTQGN1IaZK+Ijtz+jKkqfoxXq zIIocsP@h-{^xKb%Pr39aS7JX&AAV7|5*{x$oQdY&)L|5Q&_viz*`ojI{f*a^6g+aj z`XpZ$<5dJ`?=P69GVX>(zfpH^XIfK;1BUwe4E`cVbnFRD#>{E${eVQEzW6F)e+Gm~mT+ zQTSi5e2QLD8(0+V0!|*M$6df~#O;!3hbU0Qk$=z?;Ib`kacWGr_NfYlHWA6@SDXPg zbj#$5NhqOyp2n?*&&D0T767dK4c+TGHT_{sl4eg96R&f=qezOTAL@UEoFOXFs}v1; zKrzf2jA9DX43eYj`mTx^)Rp~0tQ_*_B6LE*#nfMuePVNPpPIJRo|9p;RX>x|9HJyS zzmVDcTJ1Pn7diPqVnkO7oV#MHPZ39K7sxJZ!SpUv8ebZshBc=6_)8FZ?|8MM zvf3m+0_H6`6(?>`aZMnnb=+$&nC}AcstsbF?PAED#(Cm`3TD3!R=TysITl8*dWB^?Kj9 z4+COxsAagL%TE`Rey5dr+L``cPE0ltUW(%Dl{fX~>=ejbFW-sEd22-pblz%#4{xho zwg+hLUT0g#MPfK*jOXREq%8~0BDS4khJL7cL+4iNMN}ByX4Nfni3fTQBpztws2VUJt+=tWzUdKkL;oij9?x`ceh*vD5)dkVOo83u*=Sul&rskJJ|3Q2vmp%UM9ZRY|8_ZjR+_c)d}F(n@!a9-Iyag zd6Gos|AvYpbpPWaHf-gVxt!7iqt4K;D|{s`dKcc}#!)v?2bHF_z-h zq|feqO~eCslkhakTEhJEysrgl7C>X$=|V&pHG3#2L0xFwj$G-nbke4{DsFq zJnp#16pB+#>Jr{adGsMDoU2XLwe;$&X=<2sGP`iHva-nY2m$#pG7(jt_!2epP@AMddn1XiJeB!fJB)l=vz3k1+^_cHuXvJVLMNVL_z6EAf| z2&usots!_<;Lyb)jq2GhMZHyMI#So}N+vLk4GncfZJUuMKRRJm`yZtutuib=k9T7L zD-$r{h=S^x@5SQ>ecc~TUlXC131Pcv?;t%NqLbIUHTRak^_nS_E3nG&5gt()>MP2y z_=i^CQlEmBJWpYFtq{cZRH8;y{#yCHR)v5~ z2c4_c1G>r#5`h=IuHm8G0qiacDQt)}i&TN_v2)%l74r_FH!cB4Eg?kahT4<&7MT=D z#ErqErEg$66z!wLZIXwTqr_(6@CBCBx0|M<>uihfyAu5K)xb^w$e-04%6$pQb z&WF1|#7+Z`v8+wwsVeuyB8l8*}h`TzcnlU0;OxiVtZ zbk^^Dm{kz|)r*+JQUD2t7>%#+^c%AAQz#S+W?6(Ia!+o+4inW*7A&O1)m`{i^+!%p zJDy#bO1K&sB0KTJf=cm`31#_C%L0(Vk|N+8ag%`c8L`Mg$9ds!Tk(nw$LIV$eGH&( z6y*N%L+~dMGGQAo#6tjaEiWAO)x1#K)6LGb9U^#4D+9S8-2(Gi4eDIM5fZx1t+QEx z*kC^fKy@GI?YYHjQUY!6#s2$`e09xR5M5JQ!a4f|$)TKjnP@V-N&7(r3#u3{o7 z2kXvmmVZ_IVbT8%HULF-#&^03=Up@VJ4>1MyX*2B zonP@-D{+eU4i!HaA=*=Xx!yHrzI!2^bQjs~%hB5|KS~Uv8{W#aIvx{kqE1%6qdRQv z`Yu@Pm>;#`%C0?(>eD|ZwQwvAW$)|Se0=hMyhktd+58GjpF7uxfu{k$CF?Yp0J1%z z@oWYRE4$*f40Qm^iO+$ubh(UstK=~=SACgBdhEzWGc8>g;|abEGM zaQvZ7Wk5KU?3n=jCvW9$UApQZi7(YbSKUh!3y169M>Wxzl@6-fVR~i#F#jT?_OJ$k zfnO}hIQnV`IXIa}!Ut>Ls;7K}J>5uW8GQ84K{Kw+pte6gUahRB?rn}aDv;HRQUedqn zghUyFKV%p<(JtLQ!RHK9EDk4{myL^hi?RL|0>pQjcn%$bhr+*5H1L_1kP9 zoZuQ)*&AN9EXh*{$%t~6>1_R8&*4vO*mI6e1W7l{`Ly2kKfj?GA(ZMpqM`kJmFeKS z!rV^2=`Ig#8aCxCG})O1zO+1lPDm(b z(Fd~zf$ZKOlTgI8B4rd%8B3Y3kfzWtX8a6Hz{H>Mr7F=gWY)m3QaGU9g1(V&Z85+W>%Z0UK1+@ z>Jf4OZ6FL=H5)Ul$2Y_8U=(QCKHnJxBoRgd;g>h*0~FtT!?i7;egTf_nGekBZL^L+ zme+o1^{MA?rGt&QIu0f2Q=inY7tJ*}BfbC!6|MLV@Erfpb=Y*4I zcRE~5NPwn|rCHumo*+m&0h;5MMqOMe48o>xZ(0IqtuQ;6ya0RV*UA1wq4c%r+j zhC?FA1d4a(nf-3zPyC-Rbl$Lk|4V_GEt*h}R*KU4=M}dUbOzzn?|2;d6A;HHlI3TsAatG~y99VG zXX{N=PcGhhojU`0r#EH&^QQf`>z*ZmH{c9{aFX8W`%ks+;{w+%(!P1~^xT@&BgBK_ zx8=VI>&b%=yY#qzecfJ8Q+gj&J>>Tmek5*;48IWS5TrI-wHck|)h6n6Gx3lxOGV&P z8?wCqOtRUz9<$xh&ItacPtWqEc#a<1>9PA-?U<)Z>SU|=-T5mf`)|vT=Nf@h0$a?p zlk=o+n(wc$D`yl=N=`;O1Wr@(o{xC5muDf3d#o~FOJ^HJkg6;SXG9}Qns$m|q9 z1hYPEC47NIY@WvlKKoyyLJ1@zpsG?ffm10lKgu)9e-ckhmVdlyyA%^hjiVE}n~J*^ z`oGY0Mz>$`I1qr;*Xuxiy=VA=ST>2}3~Ok7*j~sJ;^#VjT({xuJQh*{6rV!WA`A3f z&F}0iEZ(KD$Lx+MJV*gzM7z!W!~12GGvN~dc}xHEp8B^h|HwFi7sBnjYwyqX zzjd~mOPDn9ls)m_9v3u zw|L%)Nzfbo+HZcmd?fX~{!r#+{p0y@o80_Mh-annLrfC_Ns1#2KdwuI%}{Nc?+{`S zXW!j8p4<{@mP14j<9oKyXZo;~s$d9x5sPko)=AG9FhjAmyyD68TLswwKlJ~APfdJ4 z;41UcJ1Xe(QDlJ(L+$H`^Z|bP=Jcq@_W*|wc=gAz0r$tT;b;$uEyew?+S5^!T+f*? z3ib{^T*#q1Ilb`ym3#3~lc=jb%SEmp`I0oYG4lC^c24{lVe!BG8j`O4v1<_h54#3V zn(ejOK(agfiEP6uHCJi=2(Sar-#^oD1B&H6j7rz}tyjF!yz<8jMkq=hJ!?Gl$@+Ln!A@+JtD>LPSp5(aKG z6CNKls1f7e|I-V=@%%+)WP=q<;kfbKsmi@C2zKo0dHh7zX~75ly4VQ4{Eolh5TF1~WOkU>)h(Wo7z+ANAwG8Jr36sP0e?lH+6 zvW%?pu43}*Ue|aG5byKDxGS$6~7}pUl86W(E&!{dQ<4h#zd>6B)#1 z(L_-#eAW)5i0XeDSXSl}y6{^ddz9oieQ5FlLWX-|{{wz84&!WKh^=|h zwRjrhusw6-+}VbMNl<@j&m4~eUNgyvGO`16_LH zeh027$g~(KooD~3p&>OE?LP6vW3obyfCp5wqzMcT-_xZ(yCmC}Cl$xsgd4>qXvQ>{ zvPC25RbSXwZ63obBgnkfl#qZfg0~M@=(Ac@U zF`o5s?=%wL?aU$c=Un19FmFn=)E1Aa#&K=b&>vO_CN?`3qQnJGMgOx)*@-=qLG6gy zfmMDWTzY?IChS;E(6M8u9)ph>WkbOyx(69Uy>DokkS@U@F$499H! zg&6r4FA0TN8|o<}hrzlYCyb!dVBwFcPsn~UO@6V*mO!$pOsMW-#8%tmpv(fjy#(Ut zN!j*g*YAF)VUFm}8(!YuOKP$)~vg@I54U zZ22~az1(|cO1oNYsZs}X{*u_Yu>w6?^GvL`yWNb4SwXsg`l^nA-I2Bd0y>yt>~172Hc3-&|YUoL=Q8Cq3ws)@A$!Pj>6A%_84gwo>xWy5Ncw+CI6Pn5rvB5O}kJT|^=oxM$qnYyX9GNzA$M z&8VS?)szzTlz=>r|2V0glYn|&n5?zr?C=UFr@ae#R4ZVS`yXd()YBw&@K`hjRbC!F?Rzw;(8+({i(1a9g;e;0vKe0~gyN2JLn4BsaZbM3@Y(7pc z(2GbMG_|k6$xsMw?ST{)9w?%tYrCBp_ORueQVnFpc(w4w%WAHFe0XPyj$lc?f@+Kd z4ar$1ji!SY^N7UN6xk#@sgs-hM#Niw=)NAf_r1w>Wy-CYz@$&s1-x-DPvz}$3XgwJ z9y~+v_5E-FtfETJhI!p!-YTVWFbT>@_Q=?4A3(0D&-0kS{bvIf%|4e0MVHT{)zI$ml!2@U40x9SU*(YC8Uh-4a& zNsUhBU9%UlwNhS7n)-0UV=-NL;i~?0zj-}!$)#{OzQGRCDgIZ75;~;%(6y$kS1!IF z?GN!@V!N?;{V=>bt4f~7b|K4xks^0}A3|8YwcKbyFv8m>z~^-P#Cr=}h^(nBq!3a1 zmNO3IyIoKnO);0NMHZ^9%mj=n*@ykXITz2XUPI8tFunE0rQz&_SiqchW=}j`QGne> zgUppKTce|KNE{KaogCH(O=BPwI^lxk?Agrt(^fuz^=a^|5~_hkHN@Z8Bt}Aj{UTud zy3yl5*5KwoLE*WTBek2)nE-V+F4bc^2geKsYjMpoAVHmC`!bfvd!%~$Ig|h&2RSbm zuzP^z&&&&qr@=|>TvKbo z)cux)(^jgvQMtuyCeOVjH&ayv2r^%KJ!GWZj=b0AO+nZGjRpqqP+$NYlNT=cL;VDT z$?*C*>s4ijyPU)F+V3si6WEa}4AYri?c{Jd7uqW-@)Ch^5$X&jtL#uihWQVN&a)k0 zHs4aj2-MMY3h!w*)42`|B1fyQq|SS_B~!v9hampSZJ!oT&}Xjh>js53lfmF&65d1S ziq43qd_w1}0PNzx(PRPj4J1)#>esO%?sat828Ur; z`Q=@R;hu!l-g>`<1^!n*wv4=c>s2C4*zr$eP8)S9T^29A!j1$

    `6GL<9o1M4?h zwm+4ybiG?K=`Jl4jV7x*pb50+0>zLg(}?Wp7i)oz zl0R)b?br(49YtG0H}dAxh+2hEDu|}`X4GCrAETq!$82M)oa94CMWp+&b!aEu$!ofT z1%T))Cwl>u{RRz!=h~GMARP1)Xrq*|FG#zo=$Nr?ey3HjEzTT^L2QRB_FNOti9#%G zXGP7$jJ~v*-|CbgJevw1eEY{Y=f(I2xHk;scnBkke}hpfI#jD-9lz|fhoN3{)U-D+ zEa@#@G?+qss&TBIuyeUS(_8yh523nzu=V4#++Z@^xJdkPA%-M77Rt7Wh0?4%Cys-s zAg@}?SFPHw5DS@kTWK9^vMi$Iub@+I!|k`2zSHBr#k`UqYm3+N zn{EHN-r9r5TDpkC)}g^1W3dnayKl|-(%` zEq=+2yvAx6(faB%)CWY&=+4s3^Ie?=!?}27pdN8w1N^vx><&XbCPB+NTm=0Gf^!8F zLQkp_+piCP??B`!uziC+KYx2VhJ$oySU)L-HZ;cQWKFB&oll9_#CSarV{{{rJCU&v zwLdu`IqHg|&p>h)Ajt{lWtAsU<u7m9%M>`ssBqQJ$lb;;6c`qhFF!FI%0Ye9~f$ zw9Y(@&b`Lq7?B(rGPth?hR)p z;~-mx5e&+gkX?$fe>j657Z++57&jPj}A>FAaWTs0J z)IcgSSv1Qm<^n>2h83KYi4I$7jr6^C{;0`L0^dL*J$&8r0TZIPqjP9;=IAz?^M}0@ z*B@MntqX{szRxB>O2wYb@pgLxVA4yuM<7HnzDY9!$H{V%-lD19Xyx#Fb03K1sWv(d z8X~^aeaBNxSaq~QD@K9)IG`C4r>T*+K2GlAJ3jqAbuook@j1uVr`6iV^Kw65tiGU) zcDAITW+D*e$+(;GYV>Uv3yb)bk3uXTFVB9tb^8**x!bb@Z@+wJNzNd+BXsBE%UdBl z&0l}r_Z*m5fXy7e^&0c+)N{{W)2wy%udkt}cSgy!B)p?Y+Lmh>iUdJsK#SvDw3CE9 zOp@`=#|Wx7cU_1fg|hohY<0KuLcRmJSnb|vbfH%(_Z$Bez~eA-5x?YE z#VI*=QO2-z5BI}P!Z!Cc^omleUOgM|T#MP|)V#OOw|BjwW|8-TFNaZ2H^Ygr{Ymht z{V|FUk1}~5?B9K=t1EZ%E1|AbsBvLO8ol$TlNz(FSHGtxBW;{M<6gKsL~$B+7>PgS zi0fQ4nJa`Za#z#V%${#1q&ak(`IC9~qR!{^aow2qGrpj8vlG7M!jthrcc&LK3s(<~ zueh4|Oaoc1*KmX+HF2=x=6v2H`*(TcBA=3gYHR#lr_ZT3>1d#zY@fE(Vj|AZFcQaKrj^fKbCqhdPjQ1HMjXc;Y3D@gT|eLdGDQCCryKr>Y@ zx6$>zVEqE^o(kssm%1vgt{hS=vb~a3J#Iv7G8T?L@XzW;_1E+i`|Z#m&I2u>HUSkp6#9*}OYZK}6D&o$Fo; zO)mcOo18DfU=?KfpC&T4~oyzJypoC>DGkWDEfiH{o4~! zC!0hJm*l`e`H8 zK6Brf+-?oKQtuoPsRjxuatYEJ}Z3wjCkf7Q7?U)Tr-55xoVQAm|V;A_r)Ohkc|uI=?M~+^`c5z;TrOF z_;RSzIZvXAnjZSWZy8;|<&lS}pk%w>ge?-@THrmQwkK7CkZI+?Sbidf8A6_PW$9MFNkD=URcY9?~R>sOH^Aq_k!b<@svc?h< zzv&m`b?KD{!1TxQbpQS@?hC#|1peTxbh0|w1PTl?zqe!$P1mJN#;s5Fyh@U%>{v{8 zx$>=+_tc02*~g!m_p5-~&V+ynvkapImG$Mt=KGnAg&?#u{oL5Ao=4KV zGrtk*75?k@KhjBFg`uwBo|s%+Cf!_VMmq&dT)s`@0B=anGuxBUD^@d6uf5Mdo-yi2 zJz`E}KI38jI5jn6;B#%BVHJ#sYSa&efe6oTNXyg2Ns0d;<_l6OFL9X}Bt;wBHIFtF zSGf`%K04q`jJo zjqW_mos!Bgd@&rRZ6eE%8g$Ng1>p8;FSClCn?J5i%@9&`Ri82(oGunBbMQ^rHk=Rf zGU7j^2o*0(O&QV*pK;wUap3daKPYincirP2pMuOBnkAC9-)b&R9qFJGx;OW*bv-`A zG_`uXCH1R){TUv{I#N2C`;#T^`xJJc9hdhVOif>f4yQ@Xi{gCI zronD6#$aa8U<%rEa}1peb}or)15ZBU#C{TE-`Gc;Ge|V(fYdB&}vVAm#kk-&c81hQMzz_dU`1>PNg#PPUaOnZ%#{L?Gguy!cyF1>N}PE!JyfQ zq8cu=IVw3VGlFyG%D#t+8!^$ZkOYSo>R;BWP18qr>N9+YZg!s{Oj1`jTjEux6xy^e zFVHjYz6uu*7M;zUQ7TPf<+Bc9ENPCGS^Y9bfd<|F{4DxIgl5kTnH%&UzxjO}%OZlm zc&GhKuhj43sj_kXb#vF=a@yIVsgUf;y5-(FLnj+E_>JZ>6C!>CBBUjYq&)P5H@l09 z*m^G06MlrvzwzyQ@i{Z#S|Ebx-YkI(pX|-o_gSA1|E497F4v^Mz4$W0Mk6L$+D?Qh zp$uX+?JO@LEOvCi-5<%u5A_YCBSgR8jNkg(Xum|s*En$|KgYD@hi`9|dT3gg$;p=e=+R^khT1ajNDY(` zf}IybW2)XPY&%#C#ht5+^HjV+=`wai7Z7+Lb#6E9VE>S6+OVQ8h+nXf_f^tz0}Dk! zwHy1+cw*49xB7^r>+}Zs==9ksKFfo9+)t<+X@;BfzA(<0UJe`8_ejG?D)(Ctq{FhN z`S!0Z{Hm8bZqUrIw3UZk9J$CW3I4sm&kL}jIj3t%oJGu>>Wpf3z7)3oDxC<Wsirdp^^EW7$6 z^LOudSLBERoJUpALmnovuL;{8+~i}z@=h(D%=T$J_;z(p85#K~9?aoy?y!U;2zBSS zn`(yHN5VT2?QPDqzGVqc+9FEoxwhwGPu_#EyUvxq-aL6Jzc}%t1IzpC%;iMi?arDx z3GtQMGg^w_DQ;;RSAWzgYUxk?gxAv6S{KrQ|n=Sp)5en3V6Z5Pk6b$!cjA!Eurk6cQj7 zc%_^y7QqdBkyRh}?)(+zuN%X5&*J)fjzauJ^`@6nhAOuP6Ru5iPV^?j=>{)(x5mS< zXDX@!J1$^u|C&y~mRX*|VH74gPco&&xGj`}oYA|Tk5c6JnxyQU1y>2ZE4c)-41a|- zMABg&e!6qp7bQC3-}W-ADkVTE(0emEPHj4dJSBvj@HeE{IeReN##7NKVy@isvELPW zG&%Q6^Fy~Ry)Nc0{`LV9e|xXnxSzzRPD_q*+aw#<4bFVd?Vkn6Bb7*hxaszn{0TC6j^Pc2mO8?5#)xD zM(YO9s*_E4+{Oa}>D2zTYAs?O$CY2oz4I$|vHnY)4Wf*%PJ*p#nzC+VhbeWtk{2zQ z9EKB|N!?O}-AeV4m~gK0^^^Lu1t$k`&|)1rXf}@bYnD?~8?dAi)jQ2*_3IvW2kq_> z_ULcNQOzSd6()8~K}X=X${4Fu9)vE}bk(ZX{A1H~;6K9@x~jiiCuZ7N>&*DZ>F|R% z-yOlXAZ9c3d_tJpy5hjKtJ(|ID`6`k=r5~))4bFdBYe_qh+Hyxf`8q>!S)fhdfxga zne$SBQ0G0Eq~bd5G+_dpWbk^>HhXA$ukiJ9*HYmiPCv;j*PD7(f4w70XMkCjuV7{< z)AIRS_(HQjc3OqEg|wjBBfpEGqQX(CDAbJsw{vew+%k}&{VH&urjFR%D4R_TI^PE~ z>vLi^TRiyZyWMF;OhD%p?TU{^`y9~ z=PJg#ihJ0X{3fSBH@kt~B0F``7BgA;+IhC5MOh*6i0Fv)j`qfTorI2SfzCJqzYn40 zV>s*h{NX<1cf6US=A60Nx~aqVAMMk$uTu%Ki<=4dTzXf`;`E~Pt9KabVaMC=*oYkg zbeb#z?y%EaXCJX^vgMR`(}p_2AFfmT5%$BVqsF%O4@1L2j`~zm|AkcS6 ziJSvR8tI}`whh;sFLl3M5fhe|I>|F+b?3kJJgy(odEu&V6c4ZPdlkxvi+yhK=i2%# zk>$`=Q&KcI1|k<`4T#6xa=9mpRb3WAa5*vru!y6VUX4*V=N@X;DU*eW?oZNo8zNa;%241N1Y1q)| zczMEx27d+bL^PCQQ=w>d&-oK1)p>n%$srA9t6v5)vzvv};FZn;-9AM&UPSDQJ9thj z914vkRQN36uV5d^H@nieiO`a9JDU7?)kP?eaRhhI+9>$_226lu=%l@904Qx9NXtXDg7nlHhEl6P>c zlM~^MNmmGS?_>V-vXH@hN;|2Imknf1&D{O%1MPS}_+Qr4rTSv>$>ZzXX9LO`q`^%E zlw6?7E$u%aUxN~K$E@Ce(z&5MEvDQMAPx(APTe03o}K#rEzK?`fle&2jqO9}&?w=9 ze!xm;eOf{*k=ezLQ+FU+LWoq#Cr|ce<3w|*e^h<5aOp_+a(qj`RL|Qi#Ho$C^907d z)VTdy#4%#ACv@k>#51)K1x+l6x)BgOK>h($v%SO}-W+(NYWT8wBo8tAns!?D1I6P_QE;1r7 z#aR%+Ty)BC>pb{CdQDNcY=7sc2ulp?$%yb3wi^d{D}%>@Rpi#`fQ`5(LK-Mm-I5&9 zM~Cc)TV7Al+1|Rb^A@{Z5ch1Sm)vBey;3ruIp0Hjkl?hqjiOs20FApCHm)Xoj)*G?!m>{D_in;rxqLL zyYwNoyak1c_6+u3Oc(KC$v99LLu?Jb0_Q=sIkL|m(zPClUZ$lY?Pz~`@IFwo%b&_P zxRLkb8u)S`dHcf6P@eCw(;FU&%6qL>7!WN~HO$Q5@kPsKhH1B)R_KsMwe5Z!g-7-D z7XIMZ(7e6xI!rEsIM*m4$^l>Kdo{q1;VBB!b@!|X zzU7#@C#bvqDN9<4J12>W^WmWgP$`}*d3fGia(b|90^LtaTt#m~nZ}-62Myy#P!#`^ z@)p4N?V`s&Pp)?|i4WqEKN$bmIQ=HcI6-hZbv-Bg!M93Cwa|;>ztuCP$+44D22V1Z zjZv#kuT_!VfYUex4Pu~ZOjLcSEnhO>V2@{>?%s-H@~LBt@9jwUgu$Uh4`wP(&ss0S+SgcP2gr@TxE=KPD-dBT{(&RL6FSP;kR5^Y#b_2h&^AQ z>}>jTI?Fy%N(0*0w7^;kLq~T0sV`r8bp6j|{y=o+)4;g_=t;$zf@5GA8@Oke@a1-g zcUPVLpd7Xn6jwm4DO7QurO7RBwjquD^J~rc>_ynYt;98-FRiEN)j=$VdVMw;&*O3` zK~7}{cgueP!-xu^v-_qyXI=B<5IdgnJJYuiQZJf$yp8^I6VtDnMLO5K^;;c7vFM#` z8KLA4dOr-~taY5E0DtZfrmy6T!8sYMN#?W1GP@=Q$fV;J5u1f4EM_@0d(=0xVZK^U zynol!rW<;P^etTVO{`uAueCjPEFBlLQ*~)%{sY{;+UK@v;eCO@_y=?O5mRd3_S4tK zcOaUhJ7?|&btR5{dbVds{2$f^o%nGzzpA`8k z&O33_D_Az3Cb{Q;@cAo=h|bKJ^7|jY6?1S$8BzpUTq|t(@rupNEofis;#9U`<(a^G zWp8iMQC82c#}GPer@;_H9&j9vUs?j6C&jbNZ=0c#aUB;l4O`q~0q&zv$nUswx-A2R z{m{BbSPR{;0X6yJ+1bT5+sT@(qh=V(JJ5vjZL4s)Jy(dL<5)xki;Qr&*tE6o#n`|l zE`y~V{dZ}Bo9Us!B&>nT#t(lhM_!q<;`(?eWa-r1=%4eXmf`O`IFG{Wg>xmC4VkhE zV0~uq7qUyog6T~x1_}hTW2;ZvCB1^T%XoU`v3fBAx;CdDY^QY!C5zmMV@x4BPr{hu z1dbf1^bH!ivy$VikgH@jy#Iilt*(?vAw-7>0Kz2t=2ztAN{*=CMycX5Kp$I;8IUmX ztZwBDapC>5+%rHy?f0=qCYYk#*fN-1EfglU!sL9yN}ArPw?Yv?*uaJRCE7H;HC=4dL(ws z%aOIt?4_0V@r2Vazbf!sJ5KkkT2(_ft_&*y7Qkq-QlQM@pTf1)_>vvzSZ z0b@5R-EQV9&zii)E01YjzE|x9Q~F@x@A8Vh_2Sg~)l>Aqndk!pbzbT-tpsL4=R~sy zqr35IW}h`vXFWFk*kPmAfL&g|?+@a!QoB_$;f8?UU6l#8sb^Y_mNc* zJo%2Pb$}qBgq@0}+QI9J(m0SzJCG=`H>d^*)?&Wdgocv2$c}8CfojihNAmGWDC|CV zrQE~L*QA~8-5By-MPt{%V7!Ov7gb1o(Kh@ZM&_K-W2ynwWp}YC#(#&) zZ>p4_Y(I&?$8+Xud_YZ6JHnubDxfv2scbX_+t;}L5EsKsc^R?y*g(vR>9Rme;%ju6 z@fWT%R^A7!OM{kqMz`9*p$WQ!<`I!&1MU}$t1>d%0>9mZH4KFYGlW0%I9E* z8ir2~vEU!r4~=O(Ir2gem`xQvd2CMQDeb0bzX={Ur=cCPvk!`#m_qf={FPH4 zHMg7~$V2>oA>TVqJXZ-x-ZxsGCKUZt|(9#3~xA?yL|9a z`Tv!cqTX6A}zhy^H8e;>enY~MJMsuG;{gvn!3qCSdreOQL1lsj!r4= zCW$Lr@=noKFDh-89FWE(uSKVis)^?W@<4EUHTlNy=O;!3aZGbdr7D_5*fIDIPpB<{a(gg9dKQs+<-E zKBXrnK8Vk>B=tp+`WCP{GxP6>W@RF2D5#ZgKBnTJwp$#@?iV0ulN9rI$%xfdwAX=p z+NNY;b_2&gzN6wdTzS)QK#rn_ zCp{fHbZT>3#m1cYgGEa$&CF`yjSLvyy{)|=+xXd%WTix-m!15ZOIbU zXE)i?G6^l|O)~DHltmpG-nx>rPxtQNG>Q}6g0^I@yw_+h*+w>;4Fl+}x+h?zvzsO^ zb|Drf59|fKo`5SxKNk@`oT%L5IRT?L-`dD8EOjs%sF+?!lVKqRYTHilxtv%jMLfHI zAocxH1<3c!?55vMd$4xilP+T@g}=7?C8`9Na8(6xkntcMOE6-9CYFirmuqwUmoG{Z z?HAI4p$XbL#?uTv;V1A_!|{3iJxf3S3JP5EtBFl2-P#qwF9&A7rUlSMvdw0tDiKeN zt_d_3?0o_Mv@1;-x*$CTS7q4bW_R&pC1+^4fSY`mN| zbo;W$=O&M+U66{kus1njeI~Lk*v&$9G={22Io+&f)AaAyCNo9?@DaE91H0X;C3!-S7vHkkXQo zS}~=J%A;YwP71$>dUt7rJmH*{Wb&>u@icQCs#;W|OmhiT2 z#%$d%41KA5mYVzAq5Pb9QA6dQ6Cy83NyV5m#QG`CuLe_0dSKwkv(gcJ0~Q1L{CBn) zisSS*4Rp6iLs$NJ(gk+e33v6v!&MR1vv&%blTZ5=^&Owc44^t~;LP0fuYGQubl zrs}z{4wh6jtF zu=grsXDxTNZ1ea{wx*rD@RBaKD&4hr$Gsf!vN~smOaTScg*>|F!A%Jazt+~fzx5uJ z@n^u*BP`N``vq|b?FX>5E1psmlb#2118H6VOLUYB+nPLY=fZVk5%KvmS02Y{ zIz6oyhp=r6+0`XMj&a2d&V~LKO3xsN>hvHW!*`{Mwnv=G3L05|J?((&s$b&eBUe#> zY9Wzq)#jcWj(4eE)w-_9!Z2#3`7>Bher@6ld-$KbxEPa}MU|u%-fk}pksEaBb+|*% zB;zq$k5H2PI9Nyx^kUyg)aMmuckVQD_Y0m-pn&i9?C))7!kzewHvYM59kTBWX{5M^ z{Z~7SSVb^<(o_T{wD?Vr$k`zk>_2+nF$r$cWZ0YYuAf)oIAsB4 zEvPBJ21W^jtevCS*FI@60CO@79x%<<_BA**Jxt z*n!g^A?(|iu->phhH>ubQsK$KLJNYil;_3tQ^OB=e#5+Sz7R#pcUk!Kd7#gLv=^q{<+t%=k8=(kP}wZj`7eAYTY>Ya z{4Jg;z?<^n9DG6dBmy>RbG{f#u#wJMqU4i$$rmOVOyhiGNR8FAVZGzLrM2?ZMXO~o zW^DFVM%GF72A}KJbMVIY`Pri+-%N-OtVr82)?E-tm#641AE_w6* zgh`<6v`XnBoSnpd&_AoT#)x5jEKudWJ>X^J8AGo(F0M_6qu40UVD*OA`n{i7yR)*( z^KxKtcM+1QZ=&iaGkCx7Af1&GkSIN_n}2f>2b+vMLORTQ`P^<13RZb-`6q#ryRiDK z&ZED(aJEK8G5F&8)6k%!Yg7~MjKx3fZyw#XQNJ~PUt&Xc4OZr}=DdLn`c`Vhas@J3 zcGo=WdpRy3+TsS=3AVo8PMMAHuS4Y}aIXlxLSpcEVhPpISCuwzR#Qk(!LgaC-yq9f z^7>%JmT;&$eU&^x1|)IWV~P0OOGm#3>ZhZAO^<>&dTU?S%qo!9?Gv9m4tVP3#T5#i zZX$OG!A-0IJ=jKp%|Fp(u*DB0&U_1yJt3ta{PR6g{CEJE?ND@akPh6+*`KrG`!SJo`j>`7DU#$k5`2)s_Zw};LO2E+ zabc72>D*YkN{{RPnk_Xs=n3t!X9GSBzX;%Hj0sf5b6Q)oVF>pAMOSa5Aygl84wY>I zpMb7)FxjYY5B+zGXC|d2>zRe?)c^$3I&)D|ibDE?X|jkWHNmup7jp@Ol8*?J31{!u zC8HY!$@(sn6w zN7rxa^wV2%ssJYXz3)e#V9t8fL7;_jlPQcLfmwS+nZ>-4p>`VaSA z=|9naJPyS*t%H2u>%A}HN+-~1Zv{$EtDa_kR}L2cs%+#c_#Iko`6<^2uU`ZLOMW^O;6Ra^n%lLG4;*?!-A7eXp*vZbe6H*I|aPJ8k%FZXrgzS8FR8 z@GrpnAdcj5`_VXpWjF?(wY{NNRZR7-v+r7fQuw9CCWI~deR!J-2UdJYNq_dv2%h&x ze{$c(OSFg5l#kz_3Jc9~E#(yIajo6%71GTL>nqMxECbJvuRxsN3e!-&fxSEif<&4W zf+H@HLkOaa`6N@p-sMc#F}Udt<;39Xw|T|C*Ds^)Yb-`9b>%uPXt%7)Ywz71?0W=R zFbQ%++PHM&RvWNwp&0N(8Yvf99nl6p9nLb;NJXKL(+*Y`TULfEnq!7LX)z;cN)Zt* zAeZb63=1Z63RhI;WK>UT#u#N$x77T}5;Q*G(HugjVR@hZdTX=`D?1UysaO3ckflCQ zvfgl?=%5)F>Qs1>o04CD2yVo9L(LPn&A#_ z>t`cmU)tDFkPL*frKPhGWEbXVsk+3?`JZEZx%_QiT8(D{T2r4+gMKY-9z%~PHl6F& zIA(o3CNw0rq^F`4G86DRA7@6}lE69ILSKqNUM44Ag(6W6>#%tVHoN zlsx{_Bw-uTX#c|B?_{A6r+*q1T=cO})cRCz+Uk>y-@EV?Ar~-TjCPkNpQLRCbxR8c)~DYy2~@TZp}`($m2RPUui#ap_L(oa){G z6Se=&&;D;e=AF2lzBFAcDL1+3(Hvs&WF}O)2ew~kKDeEIJu{y_?)s`oIT;+1pq~spVvxL?uw{4UwmBR%9JNu_V{*~9vi9y= zEfjii11G`hfT#6If{j`G>3RZK8%%$z;5b05pfmYdp!}b=^Y54RfB8{LPeS1J1ol|I zx`_p+mNkpICMSV@{6N9zjwtddctLl4&1`F|8}~?_@?Q_^cjGK;uHLe^Ki(4eB%I2VPdr@IK}>k2ics#t4AVWY z_Y57$9MD|Uunxl#i6#)>u8%TF{O@Y|zkJbuRvK`r*<+B}$PVz>4`hEL7cBK!>Ov!| z;8Yelqv^I@!59@16$tHFn*U4*JLk^3E;;UYeW2zAV-h3wKz=pDr$p;oD?F@;i&yQ9 zR3IN)RR62FtSh$S9VTXzRJZN;D(YRI@v`M8X>QQT3~8PVy+l{RkNyb%|6V~axtt~~ z$>8O47d;+B869BD2g74HHb%W0iUQn8*Gck~*AMd;KXtp?sxEf<-`|~Zi=x?Ab4%;k zP=yI@(1nj^{VSaQ-ygs~2QXy-Zq>x&EB+hoJyl*M|K0t{74Kf|UWV6dZ4xe&d8gLy zOn%T#K^eZwZ~8A7pJvomp-gCPhOIj`i?fGiDHsH8t{TMS2U(B*X*>OYe;^Rzs`H

    5qb5*cRnzcF)4zp67(NScy!Domb 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ɧWi@INhSJdb!D1ce=;}} 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 ya1%zmDX!HHt7gC_8~F-Xu%yewWEz^_$x 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 literal 0 HcmV?d00001 diff --git a/file.go b/file.go new file mode 100644 index 0000000..c480775 --- /dev/null +++ b/file.go @@ -0,0 +1,95 @@ +package catalyst + +import ( + "errors" + "fmt" + "io" + "log" + "net/http" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/s3" + "github.com/aws/aws-sdk-go/service/s3/s3manager" + "github.com/gin-gonic/gin" + tusd "github.com/tus/tusd/pkg/handler" + "github.com/tus/tusd/pkg/s3store" + + "github.com/SecurityBrewery/catalyst/storage" +) + +func upload(client *s3.S3, external string) gin.HandlerFunc { + return func(ctx *gin.Context) { + ticketID, exists := ctx.Params.Get("ticketID") + if !exists { + ctx.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "ticketID not given"}) + return + } + + if err := storage.CreateBucket(client, ticketID); err != nil { + ctx.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": fmt.Errorf("could not create bucket: %w", err)}) + return + } + + store := s3store.New("catalyst-"+ticketID, client) + + composer := tusd.NewStoreComposer() + store.UseIn(composer) + + handler, err := tusd.NewUnroutedHandler(tusd.Config{ + BasePath: external + "/api/files/" + ticketID + "/upload/", + StoreComposer: composer, + }) + if err != nil { + ctx.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": fmt.Errorf("could not create tusd handler: %w", err)}) + return + } + + switch ctx.Request.Method { + case http.MethodHead: + gin.WrapF(handler.HeadFile)(ctx) + case http.MethodPost: + gin.WrapF(handler.PostFile)(ctx) + case http.MethodPatch: + gin.WrapF(handler.PatchFile)(ctx) + default: + log.Println(errors.New("unknown method")) + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "unknown method"}) + } + } +} + +func download(downloader *s3manager.Downloader) gin.HandlerFunc { + return func(ctx *gin.Context) { + ticketID, exists := ctx.Params.Get("ticketID") + if !exists { + ctx.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "ticketID not given"}) + return + } + + key, exists := ctx.Params.Get("key") + if !exists { + ctx.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "key not given"}) + return + } + + buf := sequentialWriter{ctx.Writer} + + downloader.Concurrency = 1 + _, err := downloader.Download(buf, &s3.GetObjectInput{ + Bucket: aws.String("catalyst-" + ticketID), + Key: aws.String(key), + }) + if err != nil { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": err}) + return + } + } +} + +type sequentialWriter struct { + w io.Writer +} + +func (fw sequentialWriter) WriteAt(p []byte, _ int64) (n int, err error) { + return fw.w.Write(p) +} diff --git a/generate.sh b/generate.sh new file mode 100644 index 0000000..51ac1ae --- /dev/null +++ b/generate.sh @@ -0,0 +1,37 @@ +set -e + +rm -rf generated + +mkdir generated +spruce merge definition/*.yaml >generated/community.yml +spruce merge definition/*.yaml definition/enterprise/*.yaml >generated/catalyst.yml + +echo generate caql parser and lexer +cd definition || exit +antlr -Dlanguage=Go -o ../generated/caql/parser CAQLParser.g4 CAQLLexer.g4 +antlr -Dlanguage=JavaScript -o ../ui/src/suggestions/grammar CAQLParser.g4 CAQLLexer.g4 +cd .. + +echo generate json +openapi-generator generate -i generated/community.yml -o generated -g openapi +mv generated/openapi.json generated/community.json +openapi-generator generate -i generated/catalyst.yml -o generated -g openapi +mv generated/openapi.json generated/catalyst.json + +# generate python client +# openapi-generator generate -i generated/community.yml -o generated/python -g python --package-name catalystpy --ignore-file-override .openapi-generator-ignore + +echo generate server and tests +go run ./generator/. ./generator + +echo generate typescript client +openapi-generator generate -i generated/catalyst.yml -o ui/src/client -g typescript-axios --artifact-version 1.0.0-SNAPSHOT + +rm -rf gen +rm -rf generated/models/old +rm -rf generated/.openapi-generator generated/.openapi-generator-ignore generated/README.md +# rm -rf generated/python/.openapi-generator generated/python/.gitlab-ci.yml generated/python/git_push.sh generated/python/.travis.yml generated/python/.gitignore generated/python/.openapi-generator-ignore +rm -rf ui/src/client/.openapi-generator ui/src/client/git_push.sh ui/src/client/.gitignore ui/src/client/.openapi-generator-ignore + +go mod tidy +gci -w -local "github.com/SecurityBrewery/catalyst" . diff --git a/generated/caql/parser/caql_lexer.go b/generated/caql/parser/caql_lexer.go new file mode 100644 index 0000000..8e2cd57 --- /dev/null +++ b/generated/caql/parser/caql_lexer.go @@ -0,0 +1,517 @@ +// Code generated from CAQLLexer.g4 by ANTLR 4.9.2. DO NOT EDIT. + +package parser + +import ( + "fmt" + "unicode" + + "github.com/antlr/antlr4/runtime/Go/antlr" +) + +// Suppress unused import error +var _ = fmt.Printf +var _ = unicode.IsLetter + +var serializedLexerAtn = []uint16{ + 3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 80, 739, + 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, + 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, + 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, + 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, + 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, + 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, + 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, + 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, + 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, + 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, + 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, + 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, + 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, + 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, + 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, + 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, + 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, + 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, + 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, + 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, + 9, 106, 4, 107, 9, 107, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, + 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, + 3, 9, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, + 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, + 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 23, 3, + 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, + 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, + 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 294, 10, 29, 3, 30, 3, 30, + 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, + 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, + 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, + 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, + 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, + 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, + 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, + 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, + 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, + 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, + 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, + 48, 5, 48, 414, 10, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, + 3, 50, 3, 50, 3, 50, 5, 50, 426, 10, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, + 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, + 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, + 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, + 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, + 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, + 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, + 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, + 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, + 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, + 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, + 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, + 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 7, 70, 555, 10, 70, 12, + 70, 14, 70, 558, 11, 70, 3, 71, 3, 71, 7, 71, 562, 10, 71, 12, 71, 14, + 71, 565, 11, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 6, 71, 572, 10, 71, + 13, 71, 14, 71, 573, 3, 71, 3, 71, 3, 71, 3, 71, 6, 71, 580, 10, 71, 13, + 71, 14, 71, 581, 5, 71, 584, 10, 71, 3, 72, 3, 72, 7, 72, 588, 10, 72, + 12, 72, 14, 72, 591, 11, 72, 3, 72, 5, 72, 594, 10, 72, 3, 72, 3, 72, 6, + 72, 598, 10, 72, 13, 72, 14, 72, 599, 3, 72, 3, 72, 5, 72, 604, 10, 72, + 3, 72, 6, 72, 607, 10, 72, 13, 72, 14, 72, 608, 5, 72, 611, 10, 72, 3, + 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 7, 74, 622, + 10, 74, 12, 74, 14, 74, 625, 11, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, + 3, 74, 3, 74, 7, 74, 634, 10, 74, 12, 74, 14, 74, 637, 11, 74, 3, 74, 5, + 74, 640, 10, 74, 3, 75, 3, 75, 3, 75, 3, 75, 7, 75, 646, 10, 75, 12, 75, + 14, 75, 649, 11, 75, 3, 75, 5, 75, 652, 10, 75, 3, 75, 3, 75, 5, 75, 656, + 10, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 7, 76, 664, 10, 76, 12, + 76, 14, 76, 667, 11, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, + 3, 77, 3, 77, 3, 78, 3, 78, 3, 79, 3, 79, 3, 80, 3, 80, 3, 81, 3, 81, 3, + 82, 3, 82, 3, 83, 3, 83, 3, 84, 3, 84, 3, 85, 3, 85, 3, 86, 3, 86, 3, 87, + 3, 87, 3, 88, 3, 88, 3, 89, 3, 89, 3, 90, 3, 90, 3, 91, 3, 91, 3, 92, 3, + 92, 3, 93, 3, 93, 3, 94, 3, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, + 3, 98, 3, 98, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, + 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, + 107, 3, 107, 3, 107, 3, 107, 3, 665, 2, 108, 3, 3, 5, 4, 7, 5, 9, 6, 11, + 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, + 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, + 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, + 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, + 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, + 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, + 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, + 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, + 151, 77, 153, 78, 155, 79, 157, 2, 159, 2, 161, 2, 163, 2, 165, 2, 167, + 2, 169, 2, 171, 2, 173, 2, 175, 2, 177, 2, 179, 2, 181, 2, 183, 2, 185, + 2, 187, 2, 189, 2, 191, 2, 193, 2, 195, 2, 197, 2, 199, 2, 201, 2, 203, + 2, 205, 2, 207, 2, 209, 2, 211, 2, 213, 80, 3, 2, 39, 5, 2, 67, 92, 97, + 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 51, 59, 3, 2, + 50, 51, 4, 2, 45, 45, 47, 47, 4, 2, 41, 41, 94, 94, 4, 2, 36, 36, 94, 94, + 4, 2, 12, 12, 15, 15, 5, 2, 11, 13, 15, 15, 34, 34, 5, 2, 50, 59, 67, 72, + 99, 104, 3, 2, 50, 59, 4, 2, 67, 67, 99, 99, 4, 2, 68, 68, 100, 100, 4, + 2, 69, 69, 101, 101, 4, 2, 70, 70, 102, 102, 4, 2, 71, 71, 103, 103, 4, + 2, 72, 72, 104, 104, 4, 2, 73, 73, 105, 105, 4, 2, 74, 74, 106, 106, 4, + 2, 75, 75, 107, 107, 4, 2, 76, 76, 108, 108, 4, 2, 77, 77, 109, 109, 4, + 2, 78, 78, 110, 110, 4, 2, 79, 79, 111, 111, 4, 2, 80, 80, 112, 112, 4, + 2, 81, 81, 113, 113, 4, 2, 82, 82, 114, 114, 4, 2, 83, 83, 115, 115, 4, + 2, 84, 84, 116, 116, 4, 2, 85, 85, 117, 117, 4, 2, 86, 86, 118, 118, 4, + 2, 87, 87, 119, 119, 4, 2, 88, 88, 120, 120, 4, 2, 89, 89, 121, 121, 4, + 2, 90, 90, 122, 122, 4, 2, 91, 91, 123, 123, 4, 2, 92, 92, 124, 124, 2, + 738, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, + 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, + 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, + 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, + 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, + 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, + 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, + 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, + 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, + 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, + 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, + 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, + 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, + 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, + 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, + 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, + 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, + 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, + 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, + 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, + 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 3, 215, + 3, 2, 2, 2, 5, 217, 3, 2, 2, 2, 7, 220, 3, 2, 2, 2, 9, 223, 3, 2, 2, 2, + 11, 226, 3, 2, 2, 2, 13, 229, 3, 2, 2, 2, 15, 231, 3, 2, 2, 2, 17, 233, + 3, 2, 2, 2, 19, 236, 3, 2, 2, 2, 21, 239, 3, 2, 2, 2, 23, 241, 3, 2, 2, + 2, 25, 243, 3, 2, 2, 2, 27, 245, 3, 2, 2, 2, 29, 247, 3, 2, 2, 2, 31, 249, + 3, 2, 2, 2, 33, 251, 3, 2, 2, 2, 35, 253, 3, 2, 2, 2, 37, 256, 3, 2, 2, + 2, 39, 259, 3, 2, 2, 2, 41, 261, 3, 2, 2, 2, 43, 263, 3, 2, 2, 2, 45, 265, + 3, 2, 2, 2, 47, 267, 3, 2, 2, 2, 49, 269, 3, 2, 2, 2, 51, 271, 3, 2, 2, + 2, 53, 273, 3, 2, 2, 2, 55, 283, 3, 2, 2, 2, 57, 293, 3, 2, 2, 2, 59, 295, + 3, 2, 2, 2, 61, 299, 3, 2, 2, 2, 63, 303, 3, 2, 2, 2, 65, 311, 3, 2, 2, + 2, 67, 316, 3, 2, 2, 2, 69, 325, 3, 2, 2, 2, 71, 331, 3, 2, 2, 2, 73, 338, + 3, 2, 2, 2, 75, 342, 3, 2, 2, 2, 77, 348, 3, 2, 2, 2, 79, 351, 3, 2, 2, + 2, 81, 359, 3, 2, 2, 2, 83, 366, 3, 2, 2, 2, 85, 371, 3, 2, 2, 2, 87, 388, + 3, 2, 2, 2, 89, 392, 3, 2, 2, 2, 91, 397, 3, 2, 2, 2, 93, 403, 3, 2, 2, + 2, 95, 413, 3, 2, 2, 2, 97, 415, 3, 2, 2, 2, 99, 425, 3, 2, 2, 2, 101, + 427, 3, 2, 2, 2, 103, 436, 3, 2, 2, 2, 105, 443, 3, 2, 2, 2, 107, 451, + 3, 2, 2, 2, 109, 458, 3, 2, 2, 2, 111, 472, 3, 2, 2, 2, 113, 477, 3, 2, + 2, 2, 115, 482, 3, 2, 2, 2, 117, 489, 3, 2, 2, 2, 119, 496, 3, 2, 2, 2, + 121, 501, 3, 2, 2, 2, 123, 506, 3, 2, 2, 2, 125, 512, 3, 2, 2, 2, 127, + 520, 3, 2, 2, 2, 129, 526, 3, 2, 2, 2, 131, 533, 3, 2, 2, 2, 133, 536, + 3, 2, 2, 2, 135, 544, 3, 2, 2, 2, 137, 548, 3, 2, 2, 2, 139, 552, 3, 2, + 2, 2, 141, 583, 3, 2, 2, 2, 143, 593, 3, 2, 2, 2, 145, 612, 3, 2, 2, 2, + 147, 639, 3, 2, 2, 2, 149, 641, 3, 2, 2, 2, 151, 659, 3, 2, 2, 2, 153, + 673, 3, 2, 2, 2, 155, 677, 3, 2, 2, 2, 157, 679, 3, 2, 2, 2, 159, 681, + 3, 2, 2, 2, 161, 683, 3, 2, 2, 2, 163, 685, 3, 2, 2, 2, 165, 687, 3, 2, + 2, 2, 167, 689, 3, 2, 2, 2, 169, 691, 3, 2, 2, 2, 171, 693, 3, 2, 2, 2, + 173, 695, 3, 2, 2, 2, 175, 697, 3, 2, 2, 2, 177, 699, 3, 2, 2, 2, 179, + 701, 3, 2, 2, 2, 181, 703, 3, 2, 2, 2, 183, 705, 3, 2, 2, 2, 185, 707, + 3, 2, 2, 2, 187, 709, 3, 2, 2, 2, 189, 711, 3, 2, 2, 2, 191, 713, 3, 2, + 2, 2, 193, 715, 3, 2, 2, 2, 195, 717, 3, 2, 2, 2, 197, 719, 3, 2, 2, 2, + 199, 721, 3, 2, 2, 2, 201, 723, 3, 2, 2, 2, 203, 725, 3, 2, 2, 2, 205, + 727, 3, 2, 2, 2, 207, 729, 3, 2, 2, 2, 209, 731, 3, 2, 2, 2, 211, 733, + 3, 2, 2, 2, 213, 735, 3, 2, 2, 2, 215, 216, 7, 48, 2, 2, 216, 4, 3, 2, + 2, 2, 217, 218, 7, 63, 2, 2, 218, 219, 7, 128, 2, 2, 219, 6, 3, 2, 2, 2, + 220, 221, 7, 35, 2, 2, 221, 222, 7, 128, 2, 2, 222, 8, 3, 2, 2, 2, 223, + 224, 7, 63, 2, 2, 224, 225, 7, 63, 2, 2, 225, 10, 3, 2, 2, 2, 226, 227, + 7, 35, 2, 2, 227, 228, 7, 63, 2, 2, 228, 12, 3, 2, 2, 2, 229, 230, 7, 62, + 2, 2, 230, 14, 3, 2, 2, 2, 231, 232, 7, 64, 2, 2, 232, 16, 3, 2, 2, 2, + 233, 234, 7, 62, 2, 2, 234, 235, 7, 63, 2, 2, 235, 18, 3, 2, 2, 2, 236, + 237, 7, 64, 2, 2, 237, 238, 7, 63, 2, 2, 238, 20, 3, 2, 2, 2, 239, 240, + 7, 45, 2, 2, 240, 22, 3, 2, 2, 2, 241, 242, 7, 47, 2, 2, 242, 24, 3, 2, + 2, 2, 243, 244, 7, 44, 2, 2, 244, 26, 3, 2, 2, 2, 245, 246, 7, 49, 2, 2, + 246, 28, 3, 2, 2, 2, 247, 248, 7, 39, 2, 2, 248, 30, 3, 2, 2, 2, 249, 250, + 7, 65, 2, 2, 250, 32, 3, 2, 2, 2, 251, 252, 7, 60, 2, 2, 252, 34, 3, 2, + 2, 2, 253, 254, 7, 60, 2, 2, 254, 255, 7, 60, 2, 2, 255, 36, 3, 2, 2, 2, + 256, 257, 7, 48, 2, 2, 257, 258, 7, 48, 2, 2, 258, 38, 3, 2, 2, 2, 259, + 260, 7, 46, 2, 2, 260, 40, 3, 2, 2, 2, 261, 262, 7, 42, 2, 2, 262, 42, + 3, 2, 2, 2, 263, 264, 7, 43, 2, 2, 264, 44, 3, 2, 2, 2, 265, 266, 7, 125, + 2, 2, 266, 46, 3, 2, 2, 2, 267, 268, 7, 127, 2, 2, 268, 48, 3, 2, 2, 2, + 269, 270, 7, 93, 2, 2, 270, 50, 3, 2, 2, 2, 271, 272, 7, 95, 2, 2, 272, + 52, 3, 2, 2, 2, 273, 274, 5, 161, 81, 2, 274, 275, 5, 173, 87, 2, 275, + 276, 5, 173, 87, 2, 276, 277, 5, 195, 98, 2, 277, 278, 5, 169, 85, 2, 278, + 279, 5, 173, 87, 2, 279, 280, 5, 161, 81, 2, 280, 281, 5, 199, 100, 2, + 281, 282, 5, 169, 85, 2, 282, 54, 3, 2, 2, 2, 283, 284, 5, 161, 81, 2, + 284, 285, 5, 183, 92, 2, 285, 286, 5, 183, 92, 2, 286, 56, 3, 2, 2, 2, + 287, 288, 5, 161, 81, 2, 288, 289, 5, 187, 94, 2, 289, 290, 5, 167, 84, + 2, 290, 294, 3, 2, 2, 2, 291, 292, 7, 40, 2, 2, 292, 294, 7, 40, 2, 2, + 293, 287, 3, 2, 2, 2, 293, 291, 3, 2, 2, 2, 294, 58, 3, 2, 2, 2, 295, 296, + 5, 161, 81, 2, 296, 297, 5, 187, 94, 2, 297, 298, 5, 209, 105, 2, 298, + 60, 3, 2, 2, 2, 299, 300, 5, 161, 81, 2, 300, 301, 5, 197, 99, 2, 301, + 302, 5, 165, 83, 2, 302, 62, 3, 2, 2, 2, 303, 304, 5, 165, 83, 2, 304, + 305, 5, 189, 95, 2, 305, 306, 5, 183, 92, 2, 306, 307, 5, 183, 92, 2, 307, + 308, 5, 169, 85, 2, 308, 309, 5, 165, 83, 2, 309, 310, 5, 199, 100, 2, + 310, 64, 3, 2, 2, 2, 311, 312, 5, 167, 84, 2, 312, 313, 5, 169, 85, 2, + 313, 314, 5, 197, 99, 2, 314, 315, 5, 165, 83, 2, 315, 66, 3, 2, 2, 2, + 316, 317, 5, 167, 84, 2, 317, 318, 5, 177, 89, 2, 318, 319, 5, 197, 99, + 2, 319, 320, 5, 199, 100, 2, 320, 321, 5, 177, 89, 2, 321, 322, 5, 187, + 94, 2, 322, 323, 5, 165, 83, 2, 323, 324, 5, 199, 100, 2, 324, 68, 3, 2, + 2, 2, 325, 326, 5, 171, 86, 2, 326, 327, 5, 161, 81, 2, 327, 328, 5, 183, + 92, 2, 328, 329, 5, 197, 99, 2, 329, 330, 5, 169, 85, 2, 330, 70, 3, 2, + 2, 2, 331, 332, 5, 171, 86, 2, 332, 333, 5, 177, 89, 2, 333, 334, 5, 183, + 92, 2, 334, 335, 5, 199, 100, 2, 335, 336, 5, 169, 85, 2, 336, 337, 5, + 195, 98, 2, 337, 72, 3, 2, 2, 2, 338, 339, 5, 171, 86, 2, 339, 340, 5, + 189, 95, 2, 340, 341, 5, 195, 98, 2, 341, 74, 3, 2, 2, 2, 342, 343, 5, + 173, 87, 2, 343, 344, 5, 195, 98, 2, 344, 345, 5, 161, 81, 2, 345, 346, + 5, 191, 96, 2, 346, 347, 5, 175, 88, 2, 347, 76, 3, 2, 2, 2, 348, 349, + 5, 177, 89, 2, 349, 350, 5, 187, 94, 2, 350, 78, 3, 2, 2, 2, 351, 352, + 5, 177, 89, 2, 352, 353, 5, 187, 94, 2, 353, 354, 5, 163, 82, 2, 354, 355, + 5, 189, 95, 2, 355, 356, 5, 201, 101, 2, 356, 357, 5, 187, 94, 2, 357, + 358, 5, 167, 84, 2, 358, 80, 3, 2, 2, 2, 359, 360, 5, 177, 89, 2, 360, + 361, 5, 187, 94, 2, 361, 362, 5, 197, 99, 2, 362, 363, 5, 169, 85, 2, 363, + 364, 5, 195, 98, 2, 364, 365, 5, 199, 100, 2, 365, 82, 3, 2, 2, 2, 366, + 367, 5, 177, 89, 2, 367, 368, 5, 187, 94, 2, 368, 369, 5, 199, 100, 2, + 369, 370, 5, 189, 95, 2, 370, 84, 3, 2, 2, 2, 371, 372, 5, 181, 91, 2, + 372, 373, 7, 97, 2, 2, 373, 374, 5, 197, 99, 2, 374, 375, 5, 175, 88, 2, + 375, 376, 5, 189, 95, 2, 376, 377, 5, 195, 98, 2, 377, 378, 5, 199, 100, + 2, 378, 379, 5, 169, 85, 2, 379, 380, 5, 197, 99, 2, 380, 381, 5, 199, + 100, 2, 381, 382, 7, 97, 2, 2, 382, 383, 5, 191, 96, 2, 383, 384, 5, 161, + 81, 2, 384, 385, 5, 199, 100, 2, 385, 386, 5, 175, 88, 2, 386, 387, 5, + 197, 99, 2, 387, 86, 3, 2, 2, 2, 388, 389, 5, 183, 92, 2, 389, 390, 5, + 169, 85, 2, 390, 391, 5, 199, 100, 2, 391, 88, 3, 2, 2, 2, 392, 393, 5, + 183, 92, 2, 393, 394, 5, 177, 89, 2, 394, 395, 5, 181, 91, 2, 395, 396, + 5, 169, 85, 2, 396, 90, 3, 2, 2, 2, 397, 398, 5, 183, 92, 2, 398, 399, + 5, 177, 89, 2, 399, 400, 5, 185, 93, 2, 400, 401, 5, 177, 89, 2, 401, 402, + 5, 199, 100, 2, 402, 92, 3, 2, 2, 2, 403, 404, 5, 187, 94, 2, 404, 405, + 5, 189, 95, 2, 405, 406, 5, 187, 94, 2, 406, 407, 5, 169, 85, 2, 407, 94, + 3, 2, 2, 2, 408, 409, 5, 187, 94, 2, 409, 410, 5, 189, 95, 2, 410, 411, + 5, 199, 100, 2, 411, 414, 3, 2, 2, 2, 412, 414, 7, 35, 2, 2, 413, 408, + 3, 2, 2, 2, 413, 412, 3, 2, 2, 2, 414, 96, 3, 2, 2, 2, 415, 416, 5, 187, + 94, 2, 416, 417, 5, 201, 101, 2, 417, 418, 5, 183, 92, 2, 418, 419, 5, + 183, 92, 2, 419, 98, 3, 2, 2, 2, 420, 421, 5, 189, 95, 2, 421, 422, 5, + 195, 98, 2, 422, 426, 3, 2, 2, 2, 423, 424, 7, 126, 2, 2, 424, 426, 7, + 126, 2, 2, 425, 420, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 426, 100, 3, 2, + 2, 2, 427, 428, 5, 189, 95, 2, 428, 429, 5, 201, 101, 2, 429, 430, 5, 199, + 100, 2, 430, 431, 5, 163, 82, 2, 431, 432, 5, 189, 95, 2, 432, 433, 5, + 201, 101, 2, 433, 434, 5, 187, 94, 2, 434, 435, 5, 167, 84, 2, 435, 102, + 3, 2, 2, 2, 436, 437, 5, 195, 98, 2, 437, 438, 5, 169, 85, 2, 438, 439, + 5, 185, 93, 2, 439, 440, 5, 189, 95, 2, 440, 441, 5, 203, 102, 2, 441, + 442, 5, 169, 85, 2, 442, 104, 3, 2, 2, 2, 443, 444, 5, 195, 98, 2, 444, + 445, 5, 169, 85, 2, 445, 446, 5, 191, 96, 2, 446, 447, 5, 183, 92, 2, 447, + 448, 5, 161, 81, 2, 448, 449, 5, 165, 83, 2, 449, 450, 5, 169, 85, 2, 450, + 106, 3, 2, 2, 2, 451, 452, 5, 195, 98, 2, 452, 453, 5, 169, 85, 2, 453, + 454, 5, 199, 100, 2, 454, 455, 5, 201, 101, 2, 455, 456, 5, 195, 98, 2, + 456, 457, 5, 187, 94, 2, 457, 108, 3, 2, 2, 2, 458, 459, 5, 197, 99, 2, + 459, 460, 5, 175, 88, 2, 460, 461, 5, 189, 95, 2, 461, 462, 5, 195, 98, + 2, 462, 463, 5, 199, 100, 2, 463, 464, 5, 169, 85, 2, 464, 465, 5, 197, + 99, 2, 465, 466, 5, 199, 100, 2, 466, 467, 7, 97, 2, 2, 467, 468, 5, 191, + 96, 2, 468, 469, 5, 161, 81, 2, 469, 470, 5, 199, 100, 2, 470, 471, 5, + 175, 88, 2, 471, 110, 3, 2, 2, 2, 472, 473, 5, 197, 99, 2, 473, 474, 5, + 189, 95, 2, 474, 475, 5, 195, 98, 2, 475, 476, 5, 199, 100, 2, 476, 112, + 3, 2, 2, 2, 477, 478, 5, 199, 100, 2, 478, 479, 5, 195, 98, 2, 479, 480, + 5, 201, 101, 2, 480, 481, 5, 169, 85, 2, 481, 114, 3, 2, 2, 2, 482, 483, + 5, 201, 101, 2, 483, 484, 5, 191, 96, 2, 484, 485, 5, 167, 84, 2, 485, + 486, 5, 161, 81, 2, 486, 487, 5, 199, 100, 2, 487, 488, 5, 169, 85, 2, + 488, 116, 3, 2, 2, 2, 489, 490, 5, 201, 101, 2, 490, 491, 5, 191, 96, 2, + 491, 492, 5, 197, 99, 2, 492, 493, 5, 169, 85, 2, 493, 494, 5, 195, 98, + 2, 494, 495, 5, 199, 100, 2, 495, 118, 3, 2, 2, 2, 496, 497, 5, 205, 103, + 2, 497, 498, 5, 177, 89, 2, 498, 499, 5, 199, 100, 2, 499, 500, 5, 175, + 88, 2, 500, 120, 3, 2, 2, 2, 501, 502, 5, 181, 91, 2, 502, 503, 5, 169, + 85, 2, 503, 504, 5, 169, 85, 2, 504, 505, 5, 191, 96, 2, 505, 122, 3, 2, + 2, 2, 506, 507, 5, 165, 83, 2, 507, 508, 5, 189, 95, 2, 508, 509, 5, 201, + 101, 2, 509, 510, 5, 187, 94, 2, 510, 511, 5, 199, 100, 2, 511, 124, 3, + 2, 2, 2, 512, 513, 5, 189, 95, 2, 513, 514, 5, 191, 96, 2, 514, 515, 5, + 199, 100, 2, 515, 516, 5, 177, 89, 2, 516, 517, 5, 189, 95, 2, 517, 518, + 5, 187, 94, 2, 518, 519, 5, 197, 99, 2, 519, 126, 3, 2, 2, 2, 520, 521, + 5, 191, 96, 2, 521, 522, 5, 195, 98, 2, 522, 523, 5, 201, 101, 2, 523, + 524, 5, 187, 94, 2, 524, 525, 5, 169, 85, 2, 525, 128, 3, 2, 2, 2, 526, + 527, 5, 197, 99, 2, 527, 528, 5, 169, 85, 2, 528, 529, 5, 161, 81, 2, 529, + 530, 5, 195, 98, 2, 530, 531, 5, 165, 83, 2, 531, 532, 5, 175, 88, 2, 532, + 130, 3, 2, 2, 2, 533, 534, 5, 199, 100, 2, 534, 535, 5, 189, 95, 2, 535, + 132, 3, 2, 2, 2, 536, 537, 5, 165, 83, 2, 537, 538, 5, 201, 101, 2, 538, + 539, 5, 195, 98, 2, 539, 540, 5, 195, 98, 2, 540, 541, 5, 169, 85, 2, 541, + 542, 5, 187, 94, 2, 542, 543, 5, 199, 100, 2, 543, 134, 3, 2, 2, 2, 544, + 545, 5, 187, 94, 2, 545, 546, 5, 169, 85, 2, 546, 547, 5, 205, 103, 2, + 547, 136, 3, 2, 2, 2, 548, 549, 5, 189, 95, 2, 549, 550, 5, 183, 92, 2, + 550, 551, 5, 167, 84, 2, 551, 138, 3, 2, 2, 2, 552, 556, 9, 2, 2, 2, 553, + 555, 9, 3, 2, 2, 554, 553, 3, 2, 2, 2, 555, 558, 3, 2, 2, 2, 556, 554, + 3, 2, 2, 2, 556, 557, 3, 2, 2, 2, 557, 140, 3, 2, 2, 2, 558, 556, 3, 2, + 2, 2, 559, 563, 9, 4, 2, 2, 560, 562, 5, 159, 80, 2, 561, 560, 3, 2, 2, + 2, 562, 565, 3, 2, 2, 2, 563, 561, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, + 584, 3, 2, 2, 2, 565, 563, 3, 2, 2, 2, 566, 584, 7, 50, 2, 2, 567, 568, + 7, 50, 2, 2, 568, 569, 7, 122, 2, 2, 569, 571, 3, 2, 2, 2, 570, 572, 5, + 157, 79, 2, 571, 570, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 571, 3, 2, + 2, 2, 573, 574, 3, 2, 2, 2, 574, 584, 3, 2, 2, 2, 575, 576, 7, 50, 2, 2, + 576, 577, 7, 100, 2, 2, 577, 579, 3, 2, 2, 2, 578, 580, 9, 5, 2, 2, 579, + 578, 3, 2, 2, 2, 580, 581, 3, 2, 2, 2, 581, 579, 3, 2, 2, 2, 581, 582, + 3, 2, 2, 2, 582, 584, 3, 2, 2, 2, 583, 559, 3, 2, 2, 2, 583, 566, 3, 2, + 2, 2, 583, 567, 3, 2, 2, 2, 583, 575, 3, 2, 2, 2, 584, 142, 3, 2, 2, 2, + 585, 589, 9, 4, 2, 2, 586, 588, 5, 159, 80, 2, 587, 586, 3, 2, 2, 2, 588, + 591, 3, 2, 2, 2, 589, 587, 3, 2, 2, 2, 589, 590, 3, 2, 2, 2, 590, 594, + 3, 2, 2, 2, 591, 589, 3, 2, 2, 2, 592, 594, 7, 50, 2, 2, 593, 585, 3, 2, + 2, 2, 593, 592, 3, 2, 2, 2, 593, 594, 3, 2, 2, 2, 594, 595, 3, 2, 2, 2, + 595, 597, 7, 48, 2, 2, 596, 598, 5, 159, 80, 2, 597, 596, 3, 2, 2, 2, 598, + 599, 3, 2, 2, 2, 599, 597, 3, 2, 2, 2, 599, 600, 3, 2, 2, 2, 600, 610, + 3, 2, 2, 2, 601, 603, 5, 169, 85, 2, 602, 604, 9, 6, 2, 2, 603, 602, 3, + 2, 2, 2, 603, 604, 3, 2, 2, 2, 604, 606, 3, 2, 2, 2, 605, 607, 5, 159, + 80, 2, 606, 605, 3, 2, 2, 2, 607, 608, 3, 2, 2, 2, 608, 606, 3, 2, 2, 2, + 608, 609, 3, 2, 2, 2, 609, 611, 3, 2, 2, 2, 610, 601, 3, 2, 2, 2, 610, + 611, 3, 2, 2, 2, 611, 144, 3, 2, 2, 2, 612, 613, 7, 66, 2, 2, 613, 614, + 5, 139, 70, 2, 614, 146, 3, 2, 2, 2, 615, 623, 7, 41, 2, 2, 616, 617, 7, + 94, 2, 2, 617, 622, 11, 2, 2, 2, 618, 619, 7, 41, 2, 2, 619, 622, 7, 41, + 2, 2, 620, 622, 10, 7, 2, 2, 621, 616, 3, 2, 2, 2, 621, 618, 3, 2, 2, 2, + 621, 620, 3, 2, 2, 2, 622, 625, 3, 2, 2, 2, 623, 621, 3, 2, 2, 2, 623, + 624, 3, 2, 2, 2, 624, 626, 3, 2, 2, 2, 625, 623, 3, 2, 2, 2, 626, 640, + 7, 41, 2, 2, 627, 635, 7, 36, 2, 2, 628, 629, 7, 94, 2, 2, 629, 634, 11, + 2, 2, 2, 630, 631, 7, 36, 2, 2, 631, 634, 7, 36, 2, 2, 632, 634, 10, 8, + 2, 2, 633, 628, 3, 2, 2, 2, 633, 630, 3, 2, 2, 2, 633, 632, 3, 2, 2, 2, + 634, 637, 3, 2, 2, 2, 635, 633, 3, 2, 2, 2, 635, 636, 3, 2, 2, 2, 636, + 638, 3, 2, 2, 2, 637, 635, 3, 2, 2, 2, 638, 640, 7, 36, 2, 2, 639, 615, + 3, 2, 2, 2, 639, 627, 3, 2, 2, 2, 640, 148, 3, 2, 2, 2, 641, 642, 7, 49, + 2, 2, 642, 643, 7, 49, 2, 2, 643, 647, 3, 2, 2, 2, 644, 646, 10, 9, 2, + 2, 645, 644, 3, 2, 2, 2, 646, 649, 3, 2, 2, 2, 647, 645, 3, 2, 2, 2, 647, + 648, 3, 2, 2, 2, 648, 655, 3, 2, 2, 2, 649, 647, 3, 2, 2, 2, 650, 652, + 7, 15, 2, 2, 651, 650, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 653, 3, 2, + 2, 2, 653, 656, 7, 12, 2, 2, 654, 656, 7, 2, 2, 3, 655, 651, 3, 2, 2, 2, + 655, 654, 3, 2, 2, 2, 656, 657, 3, 2, 2, 2, 657, 658, 8, 75, 2, 2, 658, + 150, 3, 2, 2, 2, 659, 660, 7, 49, 2, 2, 660, 661, 7, 44, 2, 2, 661, 665, + 3, 2, 2, 2, 662, 664, 11, 2, 2, 2, 663, 662, 3, 2, 2, 2, 664, 667, 3, 2, + 2, 2, 665, 666, 3, 2, 2, 2, 665, 663, 3, 2, 2, 2, 666, 668, 3, 2, 2, 2, + 667, 665, 3, 2, 2, 2, 668, 669, 7, 44, 2, 2, 669, 670, 7, 49, 2, 2, 670, + 671, 3, 2, 2, 2, 671, 672, 8, 76, 2, 2, 672, 152, 3, 2, 2, 2, 673, 674, + 9, 10, 2, 2, 674, 675, 3, 2, 2, 2, 675, 676, 8, 77, 2, 2, 676, 154, 3, + 2, 2, 2, 677, 678, 11, 2, 2, 2, 678, 156, 3, 2, 2, 2, 679, 680, 9, 11, + 2, 2, 680, 158, 3, 2, 2, 2, 681, 682, 9, 12, 2, 2, 682, 160, 3, 2, 2, 2, + 683, 684, 9, 13, 2, 2, 684, 162, 3, 2, 2, 2, 685, 686, 9, 14, 2, 2, 686, + 164, 3, 2, 2, 2, 687, 688, 9, 15, 2, 2, 688, 166, 3, 2, 2, 2, 689, 690, + 9, 16, 2, 2, 690, 168, 3, 2, 2, 2, 691, 692, 9, 17, 2, 2, 692, 170, 3, + 2, 2, 2, 693, 694, 9, 18, 2, 2, 694, 172, 3, 2, 2, 2, 695, 696, 9, 19, + 2, 2, 696, 174, 3, 2, 2, 2, 697, 698, 9, 20, 2, 2, 698, 176, 3, 2, 2, 2, + 699, 700, 9, 21, 2, 2, 700, 178, 3, 2, 2, 2, 701, 702, 9, 22, 2, 2, 702, + 180, 3, 2, 2, 2, 703, 704, 9, 23, 2, 2, 704, 182, 3, 2, 2, 2, 705, 706, + 9, 24, 2, 2, 706, 184, 3, 2, 2, 2, 707, 708, 9, 25, 2, 2, 708, 186, 3, + 2, 2, 2, 709, 710, 9, 26, 2, 2, 710, 188, 3, 2, 2, 2, 711, 712, 9, 27, + 2, 2, 712, 190, 3, 2, 2, 2, 713, 714, 9, 28, 2, 2, 714, 192, 3, 2, 2, 2, + 715, 716, 9, 29, 2, 2, 716, 194, 3, 2, 2, 2, 717, 718, 9, 30, 2, 2, 718, + 196, 3, 2, 2, 2, 719, 720, 9, 31, 2, 2, 720, 198, 3, 2, 2, 2, 721, 722, + 9, 32, 2, 2, 722, 200, 3, 2, 2, 2, 723, 724, 9, 33, 2, 2, 724, 202, 3, + 2, 2, 2, 725, 726, 9, 34, 2, 2, 726, 204, 3, 2, 2, 2, 727, 728, 9, 35, + 2, 2, 728, 206, 3, 2, 2, 2, 729, 730, 9, 36, 2, 2, 730, 208, 3, 2, 2, 2, + 731, 732, 9, 37, 2, 2, 732, 210, 3, 2, 2, 2, 733, 734, 9, 38, 2, 2, 734, + 212, 3, 2, 2, 2, 735, 736, 11, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 738, + 8, 107, 3, 2, 738, 214, 3, 2, 2, 2, 26, 2, 293, 413, 425, 556, 563, 573, + 581, 583, 589, 593, 599, 603, 608, 610, 621, 623, 633, 635, 639, 647, 651, + 655, 665, 4, 2, 3, 2, 2, 4, 2, +} + +var lexerChannelNames = []string{ + "DEFAULT_TOKEN_CHANNEL", "HIDDEN", "ERRORCHANNEL", +} + +var lexerModeNames = []string{ + "DEFAULT_MODE", +} + +var lexerLiteralNames = []string{ + "", "'.'", "'=~'", "'!~'", "'=='", "'!='", "'<'", "'>'", "'<='", "'>='", + "'+'", "'-'", "'*'", "'/'", "'%'", "'?'", "':'", "'::'", "'..'", "','", + "'('", "')'", "'{'", "'}'", "'['", "']'", +} + +var lexerSymbolicNames = []string{ + "", "DOT", "T_REGEX_MATCH", "T_REGEX_NON_MATCH", "T_EQ", "T_NE", "T_LT", + "T_GT", "T_LE", "T_GE", "T_PLUS", "T_MINUS", "T_TIMES", "T_DIV", "T_MOD", + "T_QUESTION", "T_COLON", "T_SCOPE", "T_RANGE", "T_COMMA", "T_OPEN", "T_CLOSE", + "T_OBJECT_OPEN", "T_OBJECT_CLOSE", "T_ARRAY_OPEN", "T_ARRAY_CLOSE", "T_AGGREGATE", + "T_ALL", "T_AND", "T_ANY", "T_ASC", "T_COLLECT", "T_DESC", "T_DISTINCT", + "T_FALSE", "T_FILTER", "T_FOR", "T_GRAPH", "T_IN", "T_INBOUND", "T_INSERT", + "T_INTO", "T_K_SHORTEST_PATHS", "T_LET", "T_LIKE", "T_LIMIT", "T_NONE", + "T_NOT", "T_NULL", "T_OR", "T_OUTBOUND", "T_REMOVE", "T_REPLACE", "T_RETURN", + "T_SHORTEST_PATH", "T_SORT", "T_TRUE", "T_UPDATE", "T_UPSERT", "T_WITH", + "T_KEEP", "T_COUNT", "T_OPTIONS", "T_PRUNE", "T_SEARCH", "T_TO", "T_CURRENT", + "T_NEW", "T_OLD", "T_STRING", "T_INT", "T_FLOAT", "T_PARAMETER", "T_QUOTED_STRING", + "SINGLE_LINE_COMMENT", "MULTILINE_COMMENT", "SPACES", "UNEXPECTED_CHAR", + "ERROR_RECONGNIGION", +} + +var lexerRuleNames = []string{ + "DOT", "T_REGEX_MATCH", "T_REGEX_NON_MATCH", "T_EQ", "T_NE", "T_LT", "T_GT", + "T_LE", "T_GE", "T_PLUS", "T_MINUS", "T_TIMES", "T_DIV", "T_MOD", "T_QUESTION", + "T_COLON", "T_SCOPE", "T_RANGE", "T_COMMA", "T_OPEN", "T_CLOSE", "T_OBJECT_OPEN", + "T_OBJECT_CLOSE", "T_ARRAY_OPEN", "T_ARRAY_CLOSE", "T_AGGREGATE", "T_ALL", + "T_AND", "T_ANY", "T_ASC", "T_COLLECT", "T_DESC", "T_DISTINCT", "T_FALSE", + "T_FILTER", "T_FOR", "T_GRAPH", "T_IN", "T_INBOUND", "T_INSERT", "T_INTO", + "T_K_SHORTEST_PATHS", "T_LET", "T_LIKE", "T_LIMIT", "T_NONE", "T_NOT", + "T_NULL", "T_OR", "T_OUTBOUND", "T_REMOVE", "T_REPLACE", "T_RETURN", "T_SHORTEST_PATH", + "T_SORT", "T_TRUE", "T_UPDATE", "T_UPSERT", "T_WITH", "T_KEEP", "T_COUNT", + "T_OPTIONS", "T_PRUNE", "T_SEARCH", "T_TO", "T_CURRENT", "T_NEW", "T_OLD", + "T_STRING", "T_INT", "T_FLOAT", "T_PARAMETER", "T_QUOTED_STRING", "SINGLE_LINE_COMMENT", + "MULTILINE_COMMENT", "SPACES", "UNEXPECTED_CHAR", "HEX_DIGIT", "DIGIT", + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", + "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "ERROR_RECONGNIGION", +} + +type CAQLLexer struct { + *antlr.BaseLexer + channelNames []string + modeNames []string + // TODO: EOF string +} + +// NewCAQLLexer produces a new lexer instance for the optional input antlr.CharStream. +// +// The *CAQLLexer instance produced may be reused by calling the SetInputStream method. +// The initial lexer configuration is expensive to construct, and the object is not thread-safe; +// however, if used within a Golang sync.Pool, the construction cost amortizes well and the +// objects can be used in a thread-safe manner. +func NewCAQLLexer(input antlr.CharStream) *CAQLLexer { + l := new(CAQLLexer) + lexerDeserializer := antlr.NewATNDeserializer(nil) + lexerAtn := lexerDeserializer.DeserializeFromUInt16(serializedLexerAtn) + lexerDecisionToDFA := make([]*antlr.DFA, len(lexerAtn.DecisionToState)) + for index, ds := range lexerAtn.DecisionToState { + lexerDecisionToDFA[index] = antlr.NewDFA(ds, index) + } + l.BaseLexer = antlr.NewBaseLexer(input) + l.Interpreter = antlr.NewLexerATNSimulator(l, lexerAtn, lexerDecisionToDFA, antlr.NewPredictionContextCache()) + + l.channelNames = lexerChannelNames + l.modeNames = lexerModeNames + l.RuleNames = lexerRuleNames + l.LiteralNames = lexerLiteralNames + l.SymbolicNames = lexerSymbolicNames + l.GrammarFileName = "CAQLLexer.g4" + // TODO: l.EOF = antlr.TokenEOF + + return l +} + +// CAQLLexer tokens. +const ( + CAQLLexerDOT = 1 + CAQLLexerT_REGEX_MATCH = 2 + CAQLLexerT_REGEX_NON_MATCH = 3 + CAQLLexerT_EQ = 4 + CAQLLexerT_NE = 5 + CAQLLexerT_LT = 6 + CAQLLexerT_GT = 7 + CAQLLexerT_LE = 8 + CAQLLexerT_GE = 9 + CAQLLexerT_PLUS = 10 + CAQLLexerT_MINUS = 11 + CAQLLexerT_TIMES = 12 + CAQLLexerT_DIV = 13 + CAQLLexerT_MOD = 14 + CAQLLexerT_QUESTION = 15 + CAQLLexerT_COLON = 16 + CAQLLexerT_SCOPE = 17 + CAQLLexerT_RANGE = 18 + CAQLLexerT_COMMA = 19 + CAQLLexerT_OPEN = 20 + CAQLLexerT_CLOSE = 21 + CAQLLexerT_OBJECT_OPEN = 22 + CAQLLexerT_OBJECT_CLOSE = 23 + CAQLLexerT_ARRAY_OPEN = 24 + CAQLLexerT_ARRAY_CLOSE = 25 + CAQLLexerT_AGGREGATE = 26 + CAQLLexerT_ALL = 27 + CAQLLexerT_AND = 28 + CAQLLexerT_ANY = 29 + CAQLLexerT_ASC = 30 + CAQLLexerT_COLLECT = 31 + CAQLLexerT_DESC = 32 + CAQLLexerT_DISTINCT = 33 + CAQLLexerT_FALSE = 34 + CAQLLexerT_FILTER = 35 + CAQLLexerT_FOR = 36 + CAQLLexerT_GRAPH = 37 + CAQLLexerT_IN = 38 + CAQLLexerT_INBOUND = 39 + CAQLLexerT_INSERT = 40 + CAQLLexerT_INTO = 41 + CAQLLexerT_K_SHORTEST_PATHS = 42 + CAQLLexerT_LET = 43 + CAQLLexerT_LIKE = 44 + CAQLLexerT_LIMIT = 45 + CAQLLexerT_NONE = 46 + CAQLLexerT_NOT = 47 + CAQLLexerT_NULL = 48 + CAQLLexerT_OR = 49 + CAQLLexerT_OUTBOUND = 50 + CAQLLexerT_REMOVE = 51 + CAQLLexerT_REPLACE = 52 + CAQLLexerT_RETURN = 53 + CAQLLexerT_SHORTEST_PATH = 54 + CAQLLexerT_SORT = 55 + CAQLLexerT_TRUE = 56 + CAQLLexerT_UPDATE = 57 + CAQLLexerT_UPSERT = 58 + CAQLLexerT_WITH = 59 + CAQLLexerT_KEEP = 60 + CAQLLexerT_COUNT = 61 + CAQLLexerT_OPTIONS = 62 + CAQLLexerT_PRUNE = 63 + CAQLLexerT_SEARCH = 64 + CAQLLexerT_TO = 65 + CAQLLexerT_CURRENT = 66 + CAQLLexerT_NEW = 67 + CAQLLexerT_OLD = 68 + CAQLLexerT_STRING = 69 + CAQLLexerT_INT = 70 + CAQLLexerT_FLOAT = 71 + CAQLLexerT_PARAMETER = 72 + CAQLLexerT_QUOTED_STRING = 73 + CAQLLexerSINGLE_LINE_COMMENT = 74 + CAQLLexerMULTILINE_COMMENT = 75 + CAQLLexerSPACES = 76 + CAQLLexerUNEXPECTED_CHAR = 77 + CAQLLexerERROR_RECONGNIGION = 78 +) + +// CAQLLexerERRORCHANNEL is the CAQLLexer channel. +const CAQLLexerERRORCHANNEL = 2 diff --git a/generated/caql/parser/caql_parser.go b/generated/caql/parser/caql_parser.go new file mode 100644 index 0000000..31f337c --- /dev/null +++ b/generated/caql/parser/caql_parser.go @@ -0,0 +1,2526 @@ +// Code generated from CAQLParser.g4 by ANTLR 4.9.2. DO NOT EDIT. + +package parser // CAQLParser + +import ( + "fmt" + "reflect" + "strconv" + + "github.com/antlr/antlr4/runtime/Go/antlr" +) + +// Suppress unused import errors +var _ = fmt.Printf +var _ = reflect.Copy +var _ = strconv.Itoa + +var parserATN = []uint16{ + 3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 80, 192, + 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, + 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 3, 2, + 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 32, 10, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, + 48, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 66, 10, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 7, 3, 86, 10, 3, 12, 3, 14, 3, 89, 11, 3, 3, 4, 3, 4, + 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 97, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, + 3, 5, 3, 5, 3, 5, 5, 5, 107, 10, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, + 3, 5, 3, 5, 7, 5, 117, 10, 5, 12, 5, 14, 5, 120, 11, 5, 3, 6, 3, 6, 5, + 6, 124, 10, 6, 3, 7, 3, 7, 3, 7, 5, 7, 129, 10, 7, 3, 7, 3, 7, 7, 7, 133, + 10, 7, 12, 7, 14, 7, 136, 11, 7, 3, 7, 5, 7, 139, 10, 7, 3, 7, 3, 7, 3, + 8, 3, 8, 3, 9, 3, 9, 5, 9, 147, 10, 9, 3, 9, 3, 9, 7, 9, 151, 10, 9, 12, + 9, 14, 9, 154, 11, 9, 3, 9, 5, 9, 157, 10, 9, 3, 9, 3, 9, 3, 10, 3, 10, + 5, 10, 163, 10, 10, 3, 10, 3, 10, 7, 10, 167, 10, 10, 12, 10, 14, 10, 170, + 11, 10, 3, 10, 5, 10, 173, 10, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, + 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 188, 10, 11, + 3, 12, 3, 12, 3, 12, 4, 134, 152, 4, 4, 8, 13, 2, 4, 6, 8, 10, 12, 14, + 16, 18, 20, 22, 2, 11, 3, 2, 12, 13, 3, 2, 14, 16, 3, 2, 8, 11, 3, 2, 6, + 7, 5, 2, 29, 29, 31, 31, 48, 48, 4, 2, 6, 11, 40, 40, 4, 2, 4, 5, 46, 46, + 7, 2, 36, 36, 50, 50, 58, 58, 72, 73, 75, 75, 4, 2, 71, 71, 75, 75, 2, + 216, 2, 24, 3, 2, 2, 2, 4, 31, 3, 2, 2, 2, 6, 96, 3, 2, 2, 2, 8, 106, 3, + 2, 2, 2, 10, 123, 3, 2, 2, 2, 12, 125, 3, 2, 2, 2, 14, 142, 3, 2, 2, 2, + 16, 144, 3, 2, 2, 2, 18, 160, 3, 2, 2, 2, 20, 187, 3, 2, 2, 2, 22, 189, + 3, 2, 2, 2, 24, 25, 5, 4, 3, 2, 25, 26, 7, 2, 2, 3, 26, 3, 3, 2, 2, 2, + 27, 28, 8, 3, 1, 2, 28, 32, 5, 14, 8, 2, 29, 32, 5, 8, 5, 2, 30, 32, 5, + 6, 4, 2, 31, 27, 3, 2, 2, 2, 31, 29, 3, 2, 2, 2, 31, 30, 3, 2, 2, 2, 32, + 87, 3, 2, 2, 2, 33, 34, 12, 15, 2, 2, 34, 35, 9, 2, 2, 2, 35, 86, 5, 4, + 3, 16, 36, 37, 12, 14, 2, 2, 37, 38, 9, 3, 2, 2, 38, 86, 5, 4, 3, 15, 39, + 40, 12, 13, 2, 2, 40, 41, 7, 20, 2, 2, 41, 86, 5, 4, 3, 14, 42, 43, 12, + 12, 2, 2, 43, 44, 9, 4, 2, 2, 44, 86, 5, 4, 3, 13, 45, 47, 12, 11, 2, 2, + 46, 48, 7, 49, 2, 2, 47, 46, 3, 2, 2, 2, 47, 48, 3, 2, 2, 2, 48, 49, 3, + 2, 2, 2, 49, 50, 7, 40, 2, 2, 50, 86, 5, 4, 3, 12, 51, 52, 12, 10, 2, 2, + 52, 53, 9, 5, 2, 2, 53, 86, 5, 4, 3, 11, 54, 55, 12, 9, 2, 2, 55, 56, 9, + 6, 2, 2, 56, 57, 9, 7, 2, 2, 57, 86, 5, 4, 3, 10, 58, 59, 12, 8, 2, 2, + 59, 60, 9, 6, 2, 2, 60, 61, 7, 49, 2, 2, 61, 62, 7, 40, 2, 2, 62, 86, 5, + 4, 3, 9, 63, 65, 12, 7, 2, 2, 64, 66, 7, 49, 2, 2, 65, 64, 3, 2, 2, 2, + 65, 66, 3, 2, 2, 2, 66, 67, 3, 2, 2, 2, 67, 68, 9, 8, 2, 2, 68, 86, 5, + 4, 3, 8, 69, 70, 12, 6, 2, 2, 70, 71, 7, 30, 2, 2, 71, 86, 5, 4, 3, 7, + 72, 73, 12, 5, 2, 2, 73, 74, 7, 51, 2, 2, 74, 86, 5, 4, 3, 6, 75, 76, 12, + 4, 2, 2, 76, 77, 7, 17, 2, 2, 77, 78, 5, 4, 3, 2, 78, 79, 7, 18, 2, 2, + 79, 80, 5, 4, 3, 5, 80, 86, 3, 2, 2, 2, 81, 82, 12, 3, 2, 2, 82, 83, 7, + 17, 2, 2, 83, 84, 7, 18, 2, 2, 84, 86, 5, 4, 3, 4, 85, 33, 3, 2, 2, 2, + 85, 36, 3, 2, 2, 2, 85, 39, 3, 2, 2, 2, 85, 42, 3, 2, 2, 2, 85, 45, 3, + 2, 2, 2, 85, 51, 3, 2, 2, 2, 85, 54, 3, 2, 2, 2, 85, 58, 3, 2, 2, 2, 85, + 63, 3, 2, 2, 2, 85, 69, 3, 2, 2, 2, 85, 72, 3, 2, 2, 2, 85, 75, 3, 2, 2, + 2, 85, 81, 3, 2, 2, 2, 86, 89, 3, 2, 2, 2, 87, 85, 3, 2, 2, 2, 87, 88, + 3, 2, 2, 2, 88, 5, 3, 2, 2, 2, 89, 87, 3, 2, 2, 2, 90, 91, 7, 12, 2, 2, + 91, 97, 5, 4, 3, 2, 92, 93, 7, 13, 2, 2, 93, 97, 5, 4, 3, 2, 94, 95, 7, + 49, 2, 2, 95, 97, 5, 4, 3, 2, 96, 90, 3, 2, 2, 2, 96, 92, 3, 2, 2, 2, 96, + 94, 3, 2, 2, 2, 97, 7, 3, 2, 2, 2, 98, 99, 8, 5, 1, 2, 99, 107, 7, 71, + 2, 2, 100, 107, 5, 10, 6, 2, 101, 107, 5, 12, 7, 2, 102, 103, 7, 22, 2, + 2, 103, 104, 5, 4, 3, 2, 104, 105, 7, 23, 2, 2, 105, 107, 3, 2, 2, 2, 106, + 98, 3, 2, 2, 2, 106, 100, 3, 2, 2, 2, 106, 101, 3, 2, 2, 2, 106, 102, 3, + 2, 2, 2, 107, 118, 3, 2, 2, 2, 108, 109, 12, 4, 2, 2, 109, 110, 7, 3, 2, + 2, 110, 117, 7, 71, 2, 2, 111, 112, 12, 3, 2, 2, 112, 113, 7, 26, 2, 2, + 113, 114, 5, 4, 3, 2, 114, 115, 7, 27, 2, 2, 115, 117, 3, 2, 2, 2, 116, + 108, 3, 2, 2, 2, 116, 111, 3, 2, 2, 2, 117, 120, 3, 2, 2, 2, 118, 116, + 3, 2, 2, 2, 118, 119, 3, 2, 2, 2, 119, 9, 3, 2, 2, 2, 120, 118, 3, 2, 2, + 2, 121, 124, 5, 16, 9, 2, 122, 124, 5, 18, 10, 2, 123, 121, 3, 2, 2, 2, + 123, 122, 3, 2, 2, 2, 124, 11, 3, 2, 2, 2, 125, 126, 7, 71, 2, 2, 126, + 128, 7, 22, 2, 2, 127, 129, 5, 4, 3, 2, 128, 127, 3, 2, 2, 2, 128, 129, + 3, 2, 2, 2, 129, 134, 3, 2, 2, 2, 130, 131, 7, 21, 2, 2, 131, 133, 5, 4, + 3, 2, 132, 130, 3, 2, 2, 2, 133, 136, 3, 2, 2, 2, 134, 135, 3, 2, 2, 2, + 134, 132, 3, 2, 2, 2, 135, 138, 3, 2, 2, 2, 136, 134, 3, 2, 2, 2, 137, + 139, 7, 21, 2, 2, 138, 137, 3, 2, 2, 2, 138, 139, 3, 2, 2, 2, 139, 140, + 3, 2, 2, 2, 140, 141, 7, 23, 2, 2, 141, 13, 3, 2, 2, 2, 142, 143, 9, 9, + 2, 2, 143, 15, 3, 2, 2, 2, 144, 146, 7, 26, 2, 2, 145, 147, 5, 4, 3, 2, + 146, 145, 3, 2, 2, 2, 146, 147, 3, 2, 2, 2, 147, 152, 3, 2, 2, 2, 148, + 149, 7, 21, 2, 2, 149, 151, 5, 4, 3, 2, 150, 148, 3, 2, 2, 2, 151, 154, + 3, 2, 2, 2, 152, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 156, 3, 2, + 2, 2, 154, 152, 3, 2, 2, 2, 155, 157, 7, 21, 2, 2, 156, 155, 3, 2, 2, 2, + 156, 157, 3, 2, 2, 2, 157, 158, 3, 2, 2, 2, 158, 159, 7, 27, 2, 2, 159, + 17, 3, 2, 2, 2, 160, 162, 7, 24, 2, 2, 161, 163, 5, 20, 11, 2, 162, 161, + 3, 2, 2, 2, 162, 163, 3, 2, 2, 2, 163, 168, 3, 2, 2, 2, 164, 165, 7, 21, + 2, 2, 165, 167, 5, 20, 11, 2, 166, 164, 3, 2, 2, 2, 167, 170, 3, 2, 2, + 2, 168, 166, 3, 2, 2, 2, 168, 169, 3, 2, 2, 2, 169, 172, 3, 2, 2, 2, 170, + 168, 3, 2, 2, 2, 171, 173, 7, 21, 2, 2, 172, 171, 3, 2, 2, 2, 172, 173, + 3, 2, 2, 2, 173, 174, 3, 2, 2, 2, 174, 175, 7, 25, 2, 2, 175, 19, 3, 2, + 2, 2, 176, 188, 7, 71, 2, 2, 177, 178, 5, 22, 12, 2, 178, 179, 7, 18, 2, + 2, 179, 180, 5, 4, 3, 2, 180, 188, 3, 2, 2, 2, 181, 182, 7, 26, 2, 2, 182, + 183, 5, 4, 3, 2, 183, 184, 7, 27, 2, 2, 184, 185, 7, 18, 2, 2, 185, 186, + 5, 4, 3, 2, 186, 188, 3, 2, 2, 2, 187, 176, 3, 2, 2, 2, 187, 177, 3, 2, + 2, 2, 187, 181, 3, 2, 2, 2, 188, 21, 3, 2, 2, 2, 189, 190, 9, 10, 2, 2, + 190, 23, 3, 2, 2, 2, 22, 31, 47, 65, 85, 87, 96, 106, 116, 118, 123, 128, + 134, 138, 146, 152, 156, 162, 168, 172, 187, +} +var literalNames = []string{ + "", "'.'", "'=~'", "'!~'", "'=='", "'!='", "'<'", "'>'", "'<='", "'>='", + "'+'", "'-'", "'*'", "'/'", "'%'", "'?'", "':'", "'::'", "'..'", "','", + "'('", "')'", "'{'", "'}'", "'['", "']'", +} +var symbolicNames = []string{ + "", "DOT", "T_REGEX_MATCH", "T_REGEX_NON_MATCH", "T_EQ", "T_NE", "T_LT", + "T_GT", "T_LE", "T_GE", "T_PLUS", "T_MINUS", "T_TIMES", "T_DIV", "T_MOD", + "T_QUESTION", "T_COLON", "T_SCOPE", "T_RANGE", "T_COMMA", "T_OPEN", "T_CLOSE", + "T_OBJECT_OPEN", "T_OBJECT_CLOSE", "T_ARRAY_OPEN", "T_ARRAY_CLOSE", "T_AGGREGATE", + "T_ALL", "T_AND", "T_ANY", "T_ASC", "T_COLLECT", "T_DESC", "T_DISTINCT", + "T_FALSE", "T_FILTER", "T_FOR", "T_GRAPH", "T_IN", "T_INBOUND", "T_INSERT", + "T_INTO", "T_K_SHORTEST_PATHS", "T_LET", "T_LIKE", "T_LIMIT", "T_NONE", + "T_NOT", "T_NULL", "T_OR", "T_OUTBOUND", "T_REMOVE", "T_REPLACE", "T_RETURN", + "T_SHORTEST_PATH", "T_SORT", "T_TRUE", "T_UPDATE", "T_UPSERT", "T_WITH", + "T_KEEP", "T_COUNT", "T_OPTIONS", "T_PRUNE", "T_SEARCH", "T_TO", "T_CURRENT", + "T_NEW", "T_OLD", "T_STRING", "T_INT", "T_FLOAT", "T_PARAMETER", "T_QUOTED_STRING", + "SINGLE_LINE_COMMENT", "MULTILINE_COMMENT", "SPACES", "UNEXPECTED_CHAR", + "ERROR_RECONGNIGION", +} + +var ruleNames = []string{ + "parse", "expression", "operator_unary", "reference", "compound_value", + "function_call", "value_literal", "array", "object", "object_element", + "object_element_name", +} + +type CAQLParser struct { + *antlr.BaseParser +} + +// NewCAQLParser produces a new parser instance for the optional input antlr.TokenStream. +// +// The *CAQLParser instance produced may be reused by calling the SetInputStream method. +// The initial parser configuration is expensive to construct, and the object is not thread-safe; +// however, if used within a Golang sync.Pool, the construction cost amortizes well and the +// objects can be used in a thread-safe manner. +func NewCAQLParser(input antlr.TokenStream) *CAQLParser { + this := new(CAQLParser) + deserializer := antlr.NewATNDeserializer(nil) + deserializedATN := deserializer.DeserializeFromUInt16(parserATN) + decisionToDFA := make([]*antlr.DFA, len(deserializedATN.DecisionToState)) + for index, ds := range deserializedATN.DecisionToState { + decisionToDFA[index] = antlr.NewDFA(ds, index) + } + this.BaseParser = antlr.NewBaseParser(input) + + this.Interpreter = antlr.NewParserATNSimulator(this, deserializedATN, decisionToDFA, antlr.NewPredictionContextCache()) + this.RuleNames = ruleNames + this.LiteralNames = literalNames + this.SymbolicNames = symbolicNames + this.GrammarFileName = "CAQLParser.g4" + + return this +} + +// CAQLParser tokens. +const ( + CAQLParserEOF = antlr.TokenEOF + CAQLParserDOT = 1 + CAQLParserT_REGEX_MATCH = 2 + CAQLParserT_REGEX_NON_MATCH = 3 + CAQLParserT_EQ = 4 + CAQLParserT_NE = 5 + CAQLParserT_LT = 6 + CAQLParserT_GT = 7 + CAQLParserT_LE = 8 + CAQLParserT_GE = 9 + CAQLParserT_PLUS = 10 + CAQLParserT_MINUS = 11 + CAQLParserT_TIMES = 12 + CAQLParserT_DIV = 13 + CAQLParserT_MOD = 14 + CAQLParserT_QUESTION = 15 + CAQLParserT_COLON = 16 + CAQLParserT_SCOPE = 17 + CAQLParserT_RANGE = 18 + CAQLParserT_COMMA = 19 + CAQLParserT_OPEN = 20 + CAQLParserT_CLOSE = 21 + CAQLParserT_OBJECT_OPEN = 22 + CAQLParserT_OBJECT_CLOSE = 23 + CAQLParserT_ARRAY_OPEN = 24 + CAQLParserT_ARRAY_CLOSE = 25 + CAQLParserT_AGGREGATE = 26 + CAQLParserT_ALL = 27 + CAQLParserT_AND = 28 + CAQLParserT_ANY = 29 + CAQLParserT_ASC = 30 + CAQLParserT_COLLECT = 31 + CAQLParserT_DESC = 32 + CAQLParserT_DISTINCT = 33 + CAQLParserT_FALSE = 34 + CAQLParserT_FILTER = 35 + CAQLParserT_FOR = 36 + CAQLParserT_GRAPH = 37 + CAQLParserT_IN = 38 + CAQLParserT_INBOUND = 39 + CAQLParserT_INSERT = 40 + CAQLParserT_INTO = 41 + CAQLParserT_K_SHORTEST_PATHS = 42 + CAQLParserT_LET = 43 + CAQLParserT_LIKE = 44 + CAQLParserT_LIMIT = 45 + CAQLParserT_NONE = 46 + CAQLParserT_NOT = 47 + CAQLParserT_NULL = 48 + CAQLParserT_OR = 49 + CAQLParserT_OUTBOUND = 50 + CAQLParserT_REMOVE = 51 + CAQLParserT_REPLACE = 52 + CAQLParserT_RETURN = 53 + CAQLParserT_SHORTEST_PATH = 54 + CAQLParserT_SORT = 55 + CAQLParserT_TRUE = 56 + CAQLParserT_UPDATE = 57 + CAQLParserT_UPSERT = 58 + CAQLParserT_WITH = 59 + CAQLParserT_KEEP = 60 + CAQLParserT_COUNT = 61 + CAQLParserT_OPTIONS = 62 + CAQLParserT_PRUNE = 63 + CAQLParserT_SEARCH = 64 + CAQLParserT_TO = 65 + CAQLParserT_CURRENT = 66 + CAQLParserT_NEW = 67 + CAQLParserT_OLD = 68 + CAQLParserT_STRING = 69 + CAQLParserT_INT = 70 + CAQLParserT_FLOAT = 71 + CAQLParserT_PARAMETER = 72 + CAQLParserT_QUOTED_STRING = 73 + CAQLParserSINGLE_LINE_COMMENT = 74 + CAQLParserMULTILINE_COMMENT = 75 + CAQLParserSPACES = 76 + CAQLParserUNEXPECTED_CHAR = 77 + CAQLParserERROR_RECONGNIGION = 78 +) + +// CAQLParser rules. +const ( + CAQLParserRULE_parse = 0 + CAQLParserRULE_expression = 1 + CAQLParserRULE_operator_unary = 2 + CAQLParserRULE_reference = 3 + CAQLParserRULE_compound_value = 4 + CAQLParserRULE_function_call = 5 + CAQLParserRULE_value_literal = 6 + CAQLParserRULE_array = 7 + CAQLParserRULE_object = 8 + CAQLParserRULE_object_element = 9 + CAQLParserRULE_object_element_name = 10 +) + +// IParseContext is an interface to support dynamic dispatch. +type IParseContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // IsParseContext differentiates from other interfaces. + IsParseContext() +} + +type ParseContext struct { + *antlr.BaseParserRuleContext + parser antlr.Parser +} + +func NewEmptyParseContext() *ParseContext { + var p = new(ParseContext) + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(nil, -1) + p.RuleIndex = CAQLParserRULE_parse + return p +} + +func (*ParseContext) IsParseContext() {} + +func NewParseContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *ParseContext { + var p = new(ParseContext) + + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(parent, invokingState) + + p.parser = parser + p.RuleIndex = CAQLParserRULE_parse + + return p +} + +func (s *ParseContext) GetParser() antlr.Parser { return s.parser } + +func (s *ParseContext) Expression() IExpressionContext { + var t = s.GetTypedRuleContext(reflect.TypeOf((*IExpressionContext)(nil)).Elem(), 0) + + if t == nil { + return nil + } + + return t.(IExpressionContext) +} + +func (s *ParseContext) EOF() antlr.TerminalNode { + return s.GetToken(CAQLParserEOF, 0) +} + +func (s *ParseContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *ParseContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *ParseContext) EnterRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(CAQLParserListener); ok { + listenerT.EnterParse(s) + } +} + +func (s *ParseContext) ExitRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(CAQLParserListener); ok { + listenerT.ExitParse(s) + } +} + +func (p *CAQLParser) Parse() (localctx IParseContext) { + localctx = NewParseContext(p, p.GetParserRuleContext(), p.GetState()) + p.EnterRule(localctx, 0, CAQLParserRULE_parse) + + defer func() { + p.ExitRule() + }() + + defer func() { + if err := recover(); err != nil { + if v, ok := err.(antlr.RecognitionException); ok { + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + } else { + panic(err) + } + } + }() + + p.EnterOuterAlt(localctx, 1) + { + p.SetState(22) + p.expression(0) + } + { + p.SetState(23) + p.Match(CAQLParserEOF) + } + + return localctx +} + +// IExpressionContext is an interface to support dynamic dispatch. +type IExpressionContext interface { + antlr.ParserRuleContext + + // GetParser returns the parser. + GetParser() antlr.Parser + + // GetEq_op returns the eq_op token. + GetEq_op() antlr.Token + + // SetEq_op sets the eq_op token. + SetEq_op(antlr.Token) + + // IsExpressionContext differentiates from other interfaces. + IsExpressionContext() +} + +type ExpressionContext struct { + *antlr.BaseParserRuleContext + parser antlr.Parser + eq_op antlr.Token +} + +func NewEmptyExpressionContext() *ExpressionContext { + var p = new(ExpressionContext) + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(nil, -1) + p.RuleIndex = CAQLParserRULE_expression + return p +} + +func (*ExpressionContext) IsExpressionContext() {} + +func NewExpressionContext(parser antlr.Parser, parent antlr.ParserRuleContext, invokingState int) *ExpressionContext { + var p = new(ExpressionContext) + + p.BaseParserRuleContext = antlr.NewBaseParserRuleContext(parent, invokingState) + + p.parser = parser + p.RuleIndex = CAQLParserRULE_expression + + return p +} + +func (s *ExpressionContext) GetParser() antlr.Parser { return s.parser } + +func (s *ExpressionContext) GetEq_op() antlr.Token { return s.eq_op } + +func (s *ExpressionContext) SetEq_op(v antlr.Token) { s.eq_op = v } + +func (s *ExpressionContext) Value_literal() IValue_literalContext { + var t = s.GetTypedRuleContext(reflect.TypeOf((*IValue_literalContext)(nil)).Elem(), 0) + + if t == nil { + return nil + } + + return t.(IValue_literalContext) +} + +func (s *ExpressionContext) Reference() IReferenceContext { + var t = s.GetTypedRuleContext(reflect.TypeOf((*IReferenceContext)(nil)).Elem(), 0) + + if t == nil { + return nil + } + + return t.(IReferenceContext) +} + +func (s *ExpressionContext) Operator_unary() IOperator_unaryContext { + var t = s.GetTypedRuleContext(reflect.TypeOf((*IOperator_unaryContext)(nil)).Elem(), 0) + + if t == nil { + return nil + } + + return t.(IOperator_unaryContext) +} + +func (s *ExpressionContext) AllExpression() []IExpressionContext { + var ts = s.GetTypedRuleContexts(reflect.TypeOf((*IExpressionContext)(nil)).Elem()) + var tst = make([]IExpressionContext, len(ts)) + + for i, t := range ts { + if t != nil { + tst[i] = t.(IExpressionContext) + } + } + + return tst +} + +func (s *ExpressionContext) Expression(i int) IExpressionContext { + var t = s.GetTypedRuleContext(reflect.TypeOf((*IExpressionContext)(nil)).Elem(), i) + + if t == nil { + return nil + } + + return t.(IExpressionContext) +} + +func (s *ExpressionContext) T_PLUS() antlr.TerminalNode { + return s.GetToken(CAQLParserT_PLUS, 0) +} + +func (s *ExpressionContext) T_MINUS() antlr.TerminalNode { + return s.GetToken(CAQLParserT_MINUS, 0) +} + +func (s *ExpressionContext) T_TIMES() antlr.TerminalNode { + return s.GetToken(CAQLParserT_TIMES, 0) +} + +func (s *ExpressionContext) T_DIV() antlr.TerminalNode { + return s.GetToken(CAQLParserT_DIV, 0) +} + +func (s *ExpressionContext) T_MOD() antlr.TerminalNode { + return s.GetToken(CAQLParserT_MOD, 0) +} + +func (s *ExpressionContext) T_RANGE() antlr.TerminalNode { + return s.GetToken(CAQLParserT_RANGE, 0) +} + +func (s *ExpressionContext) T_LT() antlr.TerminalNode { + return s.GetToken(CAQLParserT_LT, 0) +} + +func (s *ExpressionContext) T_GT() antlr.TerminalNode { + return s.GetToken(CAQLParserT_GT, 0) +} + +func (s *ExpressionContext) T_LE() antlr.TerminalNode { + return s.GetToken(CAQLParserT_LE, 0) +} + +func (s *ExpressionContext) T_GE() antlr.TerminalNode { + return s.GetToken(CAQLParserT_GE, 0) +} + +func (s *ExpressionContext) T_IN() antlr.TerminalNode { + return s.GetToken(CAQLParserT_IN, 0) +} + +func (s *ExpressionContext) T_NOT() antlr.TerminalNode { + return s.GetToken(CAQLParserT_NOT, 0) +} + +func (s *ExpressionContext) T_EQ() antlr.TerminalNode { + return s.GetToken(CAQLParserT_EQ, 0) +} + +func (s *ExpressionContext) T_NE() antlr.TerminalNode { + return s.GetToken(CAQLParserT_NE, 0) +} + +func (s *ExpressionContext) T_ALL() antlr.TerminalNode { + return s.GetToken(CAQLParserT_ALL, 0) +} + +func (s *ExpressionContext) T_ANY() antlr.TerminalNode { + return s.GetToken(CAQLParserT_ANY, 0) +} + +func (s *ExpressionContext) T_NONE() antlr.TerminalNode { + return s.GetToken(CAQLParserT_NONE, 0) +} + +func (s *ExpressionContext) T_LIKE() antlr.TerminalNode { + return s.GetToken(CAQLParserT_LIKE, 0) +} + +func (s *ExpressionContext) T_REGEX_MATCH() antlr.TerminalNode { + return s.GetToken(CAQLParserT_REGEX_MATCH, 0) +} + +func (s *ExpressionContext) T_REGEX_NON_MATCH() antlr.TerminalNode { + return s.GetToken(CAQLParserT_REGEX_NON_MATCH, 0) +} + +func (s *ExpressionContext) T_AND() antlr.TerminalNode { + return s.GetToken(CAQLParserT_AND, 0) +} + +func (s *ExpressionContext) T_OR() antlr.TerminalNode { + return s.GetToken(CAQLParserT_OR, 0) +} + +func (s *ExpressionContext) T_QUESTION() antlr.TerminalNode { + return s.GetToken(CAQLParserT_QUESTION, 0) +} + +func (s *ExpressionContext) T_COLON() antlr.TerminalNode { + return s.GetToken(CAQLParserT_COLON, 0) +} + +func (s *ExpressionContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *ExpressionContext) ToStringTree(ruleNames []string, recog antlr.Recognizer) string { + return antlr.TreesStringTree(s, ruleNames, recog) +} + +func (s *ExpressionContext) EnterRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(CAQLParserListener); ok { + listenerT.EnterExpression(s) + } +} + +func (s *ExpressionContext) ExitRule(listener antlr.ParseTreeListener) { + if listenerT, ok := listener.(CAQLParserListener); ok { + listenerT.ExitExpression(s) + } +} + +func (p *CAQLParser) Expression() (localctx IExpressionContext) { + return p.expression(0) +} + +func (p *CAQLParser) expression(_p int) (localctx IExpressionContext) { + var _parentctx antlr.ParserRuleContext = p.GetParserRuleContext() + _parentState := p.GetState() + localctx = NewExpressionContext(p, p.GetParserRuleContext(), _parentState) + var _prevctx IExpressionContext = localctx + var _ antlr.ParserRuleContext = _prevctx // TODO: To prevent unused variable warning. + _startState := 2 + p.EnterRecursionRule(localctx, 2, CAQLParserRULE_expression, _p) + var _la int + + defer func() { + p.UnrollRecursionContexts(_parentctx) + }() + + defer func() { + if err := recover(); err != nil { + if v, ok := err.(antlr.RecognitionException); ok { + localctx.SetException(v) + p.GetErrorHandler().ReportError(p, v) + p.GetErrorHandler().Recover(p, v) + } else { + panic(err) + } + } + }() + + var _alt int + + p.EnterOuterAlt(localctx, 1) + p.SetState(29) + p.GetErrorHandler().Sync(p) + + switch p.GetTokenStream().LA(1) { + case CAQLParserT_FALSE, CAQLParserT_NULL, CAQLParserT_TRUE, CAQLParserT_INT, CAQLParserT_FLOAT, CAQLParserT_QUOTED_STRING: + { + p.SetState(26) + p.Value_literal() + } + + case CAQLParserT_OPEN, CAQLParserT_OBJECT_OPEN, CAQLParserT_ARRAY_OPEN, CAQLParserT_STRING: + { + p.SetState(27) + p.reference(0) + } + + case CAQLParserT_PLUS, CAQLParserT_MINUS, CAQLParserT_NOT: + { + p.SetState(28) + p.Operator_unary() + } + + default: + panic(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) + } + p.GetParserRuleContext().SetStop(p.GetTokenStream().LT(-1)) + p.SetState(85) + p.GetErrorHandler().Sync(p) + _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 4, p.GetParserRuleContext()) + + for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { + if _alt == 1 { + if p.GetParseListeners() != nil { + p.TriggerExitRuleEvent() + } + _prevctx = localctx + p.SetState(83) + p.GetErrorHandler().Sync(p) + switch p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 3, p.GetParserRuleContext()) { + case 1: + localctx = NewExpressionContext(p, _parentctx, _parentState) + p.PushNewRecursionContext(localctx, _startState, CAQLParserRULE_expression) + p.SetState(31) + + if !(p.Precpred(p.GetParserRuleContext(), 13)) { + panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 13)", "")) + } + { + p.SetState(32) + _la = p.GetTokenStream().LA(1) + + if !(_la == CAQLParserT_PLUS || _la == CAQLParserT_MINUS) { + p.GetErrorHandler().RecoverInline(p) + } else { + p.GetErrorHandler().ReportMatch(p) + p.Consume() + } + } + { + p.SetState(33) + p.expression(14) + } + + case 2: + localctx = NewExpressionContext(p, _parentctx, _parentState) + p.PushNewRecursionContext(localctx, _startState, CAQLParserRULE_expression) + p.SetState(34) + + if !(p.Precpred(p.GetParserRuleContext(), 12)) { + panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 12)", "")) + } + { + p.SetState(35) + _la = p.GetTokenStream().LA(1) + + if !(((_la)&-(0x1f+1)) == 0 && ((1< 5\"\n # sandbox: \"score < 6\" # unknown-malware\n" + }, { + "id" : "phishing", + "name" : "Phishing", + "yaml" : "name: Phishing\ntasks:\n board:\n name: Board Involvement?\n description: Is a board member involved?\n type: input\n schema:\n properties:\n boardInvolved:\n default: false\n title: A board member is involved.\n type: boolean\n required:\n - boardInvolved\n title: Board Involvement?\n type: object\n next:\n escalate: \"boardInvolved == true\"\n mail-available: \"boardInvolved == false\"\n\n escalate:\n name: Escalate to CISO\n description: Please escalate the task to the CISO\n type: task\n\n mail-available:\n name: Mail available\n type: input\n schema:\n oneOf:\n - properties:\n mail:\n title: Mail\n type: string\n x-display: textarea\n schemaKey:\n const: 'yes'\n type: string\n required:\n - mail\n title: 'Yes'\n - properties:\n schemaKey:\n const: 'no'\n type: string\n title: 'No'\n title: Mail available\n type: object\n next:\n block-sender: \"schemaKey == 'yes'\"\n extract-iocs: \"schemaKey == 'yes'\"\n search-email-gateway: \"schemaKey == 'no'\"\n\n search-email-gateway:\n name: Search email gateway\n description: Please search email-gateway for the phishing mail.\n type: task\n next:\n extract-iocs:\n\n block-sender:\n name: Block sender\n type: task\n next:\n extract-iocs:\n\n extract-iocs:\n name: Extract IOCs\n description: Please insert the IOCs\n type: input\n schema:\n properties:\n iocs:\n items:\n type: string\n title: IOCs\n type: array\n title: Extract IOCs\n type: object\n next:\n block-iocs:\n\n block-iocs:\n name: Block IOCs\n type: task\n" + }, { + "id" : "simple", + "name" : "Simple", + "yaml" : "name: Simple\ntasks:\n input:\n name: Enter something to hash\n type: input\n schema:\n title: Something\n type: object\n properties:\n something:\n type: string\n title: Something\n default: \"\"\n next:\n hash: \"something != ''\"\n\n hash:\n name: Hash the something\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['something']\"\n next:\n comment: \"hash != ''\"\n\n comment:\n name: Comment the hash\n type: automation\n automation: comment\n payload:\n default: \"playbook.tasks['hash'].data['hash']\"\n next:\n done: \"done\"\n\n done:\n name: You can close this case now\n type: task\n" + } ] + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "playbook:read" ] + } ], + "summary" : "List playbooks", + "tags" : [ "playbooks" ] + }, + "post" : { + "operationId" : "createPlaybook", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/PlaybookTemplateForm" + } + } + }, + "description" : "New playbook", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/PlaybookTemplateResponse" + }, + "type" : "array" + } + }, + "test" : { + "example" : { + "id" : "simple-2", + "name" : "Simple2", + "yaml" : "name: Simple2\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "playbook:write" ] + } ], + "summary" : "Create a playbook", + "tags" : [ "playbooks" ], + "x-codegen-request-body-name" : "playbook" + } + }, + "/playbooks/{id}" : { + "delete" : { + "operationId" : "deletePlaybook", + "parameters" : [ { + "description" : "Playbook name", + "example" : "simple", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "204" : { + "content" : { }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "playbook:write" ] + } ], + "summary" : "Delete a playbook", + "tags" : [ "playbooks" ] + }, + "get" : { + "operationId" : "getPlaybook", + "parameters" : [ { + "description" : "Playbook name", + "example" : "simple", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/PlaybookTemplateResponse" + } + }, + "test" : { + "example" : { + "id" : "simple", + "name" : "Simple", + "yaml" : "name: Simple\ntasks:\n input:\n name: Enter something to hash\n type: input\n schema:\n title: Something\n type: object\n properties:\n something:\n type: string\n title: Something\n default: \"\"\n next:\n hash: \"something != ''\"\n\n hash:\n name: Hash the something\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['something']\"\n next:\n comment: \"hash != ''\"\n\n comment:\n name: Comment the hash\n type: automation\n automation: comment\n payload:\n default: \"playbook.tasks['hash'].data['hash']\"\n next:\n done: \"done\"\n\n done:\n name: You can close this case now\n type: task\n" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "playbook:read" ] + } ], + "summary" : "Get a single playbook", + "tags" : [ "playbooks" ] + }, + "put" : { + "operationId" : "updatePlaybook", + "parameters" : [ { + "description" : "Playbook ID", + "example" : "simple", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/PlaybookTemplateForm" + } + } + }, + "description" : "Updated playbook", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/PlaybookTemplateResponse" + } + }, + "test" : { + "example" : { + "id" : "simple", + "name" : "Simple", + "yaml" : "name: Simple\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "playbook:write" ] + } ], + "summary" : "Update an existing ticket playbook", + "tags" : [ "playbooks" ], + "x-codegen-request-body-name" : "playbook" + } + }, + "/rules" : { + "get" : { + "operationId" : "listRules", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/RuleResponse" + }, + "type" : "array" + } + }, + "test" : { + "example" : [ { + "condition" : "type == 'alert'", + "id" : "ignore-alerts", + "name" : "Ignore Alerts", + "update" : { + "status" : "closed" + } + } ] + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "rule:read" ] + } ], + "summary" : "List rules", + "tags" : [ "rules" ] + }, + "post" : { + "operationId" : "createRule", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/RuleForm" + } + } + }, + "description" : "New rule", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/RuleResponse" + }, + "type" : "array" + } + }, + "test" : { + "example" : { + "condition" : "type == 'alert'", + "id" : "ignore-all-alerts", + "name" : "Ignore all Alerts", + "update" : { + "status" : "closed" + } + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "rule:write" ] + } ], + "summary" : "Create a rule", + "tags" : [ "rules" ], + "x-codegen-request-body-name" : "rule" + } + }, + "/rules/{id}" : { + "delete" : { + "operationId" : "deleteRule", + "parameters" : [ { + "description" : "Rule name", + "example" : "ignore-alerts", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "204" : { + "content" : { }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "rule:write" ] + } ], + "summary" : "Delete a rule", + "tags" : [ "rules" ] + }, + "get" : { + "operationId" : "getRule", + "parameters" : [ { + "description" : "Rule name", + "example" : "ignore-alerts", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/RuleResponse" + } + }, + "test" : { + "example" : { + "condition" : "type == 'alert'", + "id" : "ignore-alerts", + "name" : "Ignore Alerts", + "update" : { + "status" : "closed" + } + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "rule:read" ] + } ], + "summary" : "Get a single rule", + "tags" : [ "rules" ] + }, + "put" : { + "operationId" : "updateRule", + "parameters" : [ { + "description" : "Rule ID", + "example" : "ignore-alerts", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/RuleForm" + } + } + }, + "description" : "Updated rule", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/RuleResponse" + } + }, + "test" : { + "example" : { + "condition" : "type == 'alert'", + "id" : "ignore-alerts", + "name" : "Ignore Alerts", + "update" : { + "status" : "invalid" + } + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "rule:write" ] + } ], + "summary" : "Update an existing ticket rule", + "tags" : [ "rules" ], + "x-codegen-request-body-name" : "rule" + } + }, + "/settings" : { + "get" : { + "operationId" : "getSettings", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Settings" + } + }, + "test" : { + "example" : { + "artifactStates" : [ { + "color" : "info", + "icon" : "mdi-help-circle-outline", + "id" : "unknown", + "name" : "Unknown" + }, { + "color" : "error", + "icon" : "mdi-skull", + "id" : "malicious", + "name" : "Malicious" + }, { + "color" : "success", + "icon" : "mdi-check", + "id" : "clean", + "name" : "Clean" + } ], + "roles" : [ "admin:backup:read", "admin:backup:restore", "admin:group:write", "admin:job:read", "admin:job:write", "admin:log:read", "admin:ticket:delete", "admin:user:write", "admin:userdata:read", "admin:userdata:write", "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write" ], + "ticketTypes" : [ { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-alert", + "id" : "alert", + "name" : "Alerts" + }, { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-radioactive", + "id" : "incident", + "name" : "Incidents" + }, { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-fingerprint", + "id" : "investigation", + "name" : "Forensic Investigations" + }, { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-target", + "id" : "hunt", + "name" : "Threat Hunting" + } ], + "tier" : "community", + "timeformat" : "YYYY-MM-DDThh:mm:ss", + "version" : "0.0.0-test" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "settings:read" ] + } ], + "summary" : "Get settings", + "tags" : [ "settings" ] + } + }, + "/statistics" : { + "get" : { + "operationId" : "getStatistics", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Statistics" + } + }, + "test" : { + "example" : { + "open_tickets_per_user" : { }, + "tickets_per_type" : { + "alert" : 2, + "incident" : 1 + }, + "tickets_per_week" : { + "2021-39" : 3 + }, + "unassigned" : 0 + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:read" ] + } ], + "summary" : "Get statistics", + "tags" : [ "statistics" ] + } + }, + "/tasks" : { + "get" : { + "operationId" : "listTasks", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/TaskResponse" + }, + "type" : "array" + } + }, + "test" : { + "example" : [ ] + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:read" ] + } ], + "summary" : "List tasks", + "tags" : [ "tasks" ] + } + }, + "/templates" : { + "get" : { + "operationId" : "listTemplates", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/TicketTemplateResponse" + }, + "type" : "array" + } + }, + "test" : { + "example" : [ { + "id" : "default", + "name" : "Default", + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Default\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + } ] + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "template:read" ] + } ], + "summary" : "List templates", + "tags" : [ "templates" ] + }, + "post" : { + "operationId" : "createTemplate", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTemplateForm" + } + } + }, + "description" : "New template", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTemplateResponse" + } + }, + "test" : { + "example" : { + "id" : "my-template", + "name" : "My Template", + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "template:write" ] + } ], + "summary" : "Create a new template", + "tags" : [ "templates" ], + "x-codegen-request-body-name" : "template" + } + }, + "/templates/{id}" : { + "delete" : { + "operationId" : "deleteTemplate", + "parameters" : [ { + "description" : "Template ID", + "example" : "default", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "204" : { + "content" : { }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "template:write" ] + } ], + "summary" : "Delete a template", + "tags" : [ "templates" ] + }, + "get" : { + "operationId" : "getTemplate", + "parameters" : [ { + "description" : "Template ID", + "example" : "default", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTemplateResponse" + } + }, + "test" : { + "example" : { + "id" : "default", + "name" : "Default", + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Default\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "template:read" ] + } ], + "summary" : "Get a single template", + "tags" : [ "templates" ] + }, + "put" : { + "operationId" : "updateTemplate", + "parameters" : [ { + "description" : "Template ID", + "example" : "default", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTemplateForm" + } + } + }, + "description" : "Template object that needs to be added", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTemplateResponse" + } + }, + "test" : { + "example" : { + "id" : "default", + "name" : "My Template", + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "template:write" ] + } ], + "summary" : "Update an existing template", + "tags" : [ "templates" ], + "x-codegen-request-body-name" : "template" + } + }, + "/tickets" : { + "get" : { + "operationId" : "listTickets", + "parameters" : [ { + "description" : "Ticket Type", + "in" : "query", + "name" : "type", + "schema" : { + "type" : "string" + } + }, { + "description" : "Offset of the list", + "in" : "query", + "name" : "offset", + "schema" : { + "default" : 0, + "type" : "integer" + } + }, { + "description" : "Number of tickets", + "in" : "query", + "name" : "count", + "schema" : { + "default" : 25, + "maximum" : 100, + "type" : "integer" + } + }, { + "description" : "Sort columns", + "explode" : false, + "in" : "query", + "name" : "sort", + "schema" : { + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "style" : "form" + }, { + "description" : "Sort descending", + "explode" : false, + "in" : "query", + "name" : "desc", + "schema" : { + "items" : { + "type" : "boolean" + }, + "type" : "array" + }, + "style" : "form" + }, { + "description" : "Search query", + "in" : "query", + "name" : "query", + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketList" + } + }, + "test" : { + "example" : { + "count" : 3, + "tickets" : [ { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + }, { + "name" : "leadreintermediate.io", + "status" : "malicious" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8123, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "live zebra", + "owner" : "demo", + "playbooks" : { + "phishing" : { + "name" : "Phishing", + "tasks" : { + "block-iocs" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block IOCs", + "type" : "task" + }, + "block-sender" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block sender", + "next" : { + "extract-iocs" : "" + }, + "type" : "task" + }, + "board" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Board Involvement?", + "next" : { + "escalate" : "boardInvolved == true", + "mail-available" : "boardInvolved == false" + }, + "schema" : { + "properties" : { + "boardInvolved" : { + "default" : false, + "title" : "A board member is involved.", + "type" : "boolean" + } + }, + "required" : [ "boardInvolved" ], + "title" : "Board Involvement?", + "type" : "object" + }, + "type" : "input" + }, + "escalate" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to CISO", + "type" : "task" + }, + "extract-iocs" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Extract IOCs", + "next" : { + "block-iocs" : "" + }, + "schema" : { + "properties" : { + "iocs" : { + "items" : { + "type" : "string" + }, + "title" : "IOCs", + "type" : "array" + } + }, + "title" : "Extract IOCs", + "type" : "object" + }, + "type" : "input" + }, + "mail-available" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Mail available", + "next" : { + "block-sender" : "schemaKey == 'yes'", + "extract-iocs" : "schemaKey == 'yes'", + "search-email-gateway" : "schemaKey == 'no'" + }, + "schema" : { + "oneOf" : [ { + "properties" : { + "mail" : { + "title" : "Mail", + "type" : "string", + "x-display" : "textarea" + }, + "schemaKey" : { + "const" : "yes", + "type" : "string" + } + }, + "required" : [ "mail" ], + "title" : "Yes" + }, { + "properties" : { + "schemaKey" : { + "const" : "no", + "type" : "string" + } + }, + "title" : "No" + } ], + "title" : "Mail available", + "type" : "object" + }, + "type" : "input" + }, + "search-email-gateway" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Search email gateway", + "next" : { + "extract-iocs" : "" + }, + "type" : "task" + } + } + } + }, + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + }, { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8125, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "phishing from selenafadel@von.com detected", + "owner" : "demo", + "references" : [ { + "href" : "https://www.seniorleading-edge.name/users/efficient", + "name" : "recovery" + }, { + "href" : "http://www.dynamicseamless.com/clicks-and-mortar", + "name" : "force" + }, { + "href" : "http://www.leadscalable.biz/envisioneer", + "name" : "fund" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + }, { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } ] + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:read" ] + } ], + "summary" : "List tickets", + "tags" : [ "tickets" ] + }, + "post" : { + "operationId" : "createTicket", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketForm" + } + } + }, + "description" : "New ticket", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "created" : "1985-04-12T23:20:50.520+0000", + "id" : 123, + "modified" : "1985-04-12T23:20:50.520+0000", + "name" : "Wannacry infection", + "owner" : "bob", + "schema" : "{}", + "status" : "open", + "type" : "incident" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Create a new ticket", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "ticket" + } + }, + "/tickets/{id}" : { + "delete" : { + "operationId" : "deleteTicket", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8125, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "responses" : { + "204" : { + "content" : { }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:delete" ] + } ], + "summary" : "Delete an ticket", + "tags" : [ "tickets" ] + }, + "get" : { + "operationId" : "getTicket", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8125, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8125, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "phishing from selenafadel@von.com detected", + "owner" : "demo", + "references" : [ { + "href" : "https://www.seniorleading-edge.name/users/efficient", + "name" : "recovery" + }, { + "href" : "http://www.dynamicseamless.com/clicks-and-mortar", + "name" : "force" + }, { + "href" : "http://www.leadscalable.biz/envisioneer", + "name" : "fund" + } ], + "schema" : "{}", + "status" : "closed", + "tickets" : [ { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } ], + "type" : "alert" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:read" ] + } ], + "summary" : "Get a single ticket", + "tags" : [ "tickets" ] + }, + "put" : { + "operationId" : "updateTicket", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8125, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Ticket" + } + } + }, + "description" : "Updated ticket", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8125, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "phishing from selenafadel@von.org detected", + "owner" : "demo", + "references" : [ { + "href" : "https://www.seniorleading-edge.name/users/efficient", + "name" : "recovery" + }, { + "href" : "http://www.dynamicseamless.com/clicks-and-mortar", + "name" : "force" + }, { + "href" : "http://www.leadscalable.biz/envisioneer", + "name" : "fund" + } ], + "schema" : "{}", + "status" : "closed", + "tickets" : [ { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } ], + "type" : "alert" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Update an existing ticket", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "ticket" + } + }, + "/tickets/{id}/artifacts" : { + "post" : { + "operationId" : "addArtifact", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Artifact" + } + } + }, + "description" : "Artifact object that needs to be added", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + }, { + "name" : "leadreintermediate.io", + "status" : "malicious" + }, { + "name" : "2.2.2.2", + "status" : "unknown", + "type" : "ip" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8123, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "live zebra", + "owner" : "demo", + "playbooks" : { + "phishing" : { + "name" : "Phishing", + "tasks" : { + "block-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block IOCs", + "order" : 6, + "type" : "task" + }, + "block-sender" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block sender", + "next" : { + "extract-iocs" : "" + }, + "order" : 3, + "type" : "task" + }, + "board" : { + "active" : true, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Board Involvement?", + "next" : { + "escalate" : "boardInvolved == true", + "mail-available" : "boardInvolved == false" + }, + "order" : 0, + "schema" : { + "properties" : { + "boardInvolved" : { + "default" : false, + "title" : "A board member is involved.", + "type" : "boolean" + } + }, + "required" : [ "boardInvolved" ], + "title" : "Board Involvement?", + "type" : "object" + }, + "type" : "input" + }, + "escalate" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to CISO", + "order" : 1, + "type" : "task" + }, + "extract-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Extract IOCs", + "next" : { + "block-iocs" : "" + }, + "order" : 5, + "schema" : { + "properties" : { + "iocs" : { + "items" : { + "type" : "string" + }, + "title" : "IOCs", + "type" : "array" + } + }, + "title" : "Extract IOCs", + "type" : "object" + }, + "type" : "input" + }, + "mail-available" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Mail available", + "next" : { + "block-sender" : "schemaKey == 'yes'", + "extract-iocs" : "schemaKey == 'yes'", + "search-email-gateway" : "schemaKey == 'no'" + }, + "order" : 2, + "schema" : { + "oneOf" : [ { + "properties" : { + "mail" : { + "title" : "Mail", + "type" : "string", + "x-display" : "textarea" + }, + "schemaKey" : { + "const" : "yes", + "type" : "string" + } + }, + "required" : [ "mail" ], + "title" : "Yes" + }, { + "properties" : { + "schemaKey" : { + "const" : "no", + "type" : "string" + } + }, + "title" : "No" + } ], + "title" : "Mail available", + "type" : "object" + }, + "type" : "input" + }, + "search-email-gateway" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Search email gateway", + "next" : { + "extract-iocs" : "" + }, + "order" : 4, + "type" : "task" + } + } + } + }, + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Add a single artifact", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "artifact" + } + }, + "/tickets/{id}/artifacts/{name}" : { + "delete" : { + "operationId" : "removeArtifact", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "example" : "leadreintermediate.io", + "in" : "path", + "name" : "name", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8123, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "live zebra", + "owner" : "demo", + "playbooks" : { + "phishing" : { + "name" : "Phishing", + "tasks" : { + "block-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block IOCs", + "order" : 6, + "type" : "task" + }, + "block-sender" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block sender", + "next" : { + "extract-iocs" : "" + }, + "order" : 3, + "type" : "task" + }, + "board" : { + "active" : true, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Board Involvement?", + "next" : { + "escalate" : "boardInvolved == true", + "mail-available" : "boardInvolved == false" + }, + "order" : 0, + "schema" : { + "properties" : { + "boardInvolved" : { + "default" : false, + "title" : "A board member is involved.", + "type" : "boolean" + } + }, + "required" : [ "boardInvolved" ], + "title" : "Board Involvement?", + "type" : "object" + }, + "type" : "input" + }, + "escalate" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to CISO", + "order" : 1, + "type" : "task" + }, + "extract-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Extract IOCs", + "next" : { + "block-iocs" : "" + }, + "order" : 5, + "schema" : { + "properties" : { + "iocs" : { + "items" : { + "type" : "string" + }, + "title" : "IOCs", + "type" : "array" + } + }, + "title" : "Extract IOCs", + "type" : "object" + }, + "type" : "input" + }, + "mail-available" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Mail available", + "next" : { + "block-sender" : "schemaKey == 'yes'", + "extract-iocs" : "schemaKey == 'yes'", + "search-email-gateway" : "schemaKey == 'no'" + }, + "order" : 2, + "schema" : { + "oneOf" : [ { + "properties" : { + "mail" : { + "title" : "Mail", + "type" : "string", + "x-display" : "textarea" + }, + "schemaKey" : { + "const" : "yes", + "type" : "string" + } + }, + "required" : [ "mail" ], + "title" : "Yes" + }, { + "properties" : { + "schemaKey" : { + "const" : "no", + "type" : "string" + } + }, + "title" : "No" + } ], + "title" : "Mail available", + "type" : "object" + }, + "type" : "input" + }, + "search-email-gateway" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Search email gateway", + "next" : { + "extract-iocs" : "" + }, + "order" : 4, + "type" : "task" + } + } + } + }, + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Remove an artifact", + "tags" : [ "tickets" ] + }, + "get" : { + "operationId" : "getArtifact", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "example" : "leadreintermediate.io", + "in" : "path", + "name" : "name", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Artifact" + } + }, + "test" : { + "example" : { + "name" : "leadreintermediate.io", + "status" : "malicious" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Get a single artifact", + "tags" : [ "tickets" ] + }, + "put" : { + "operationId" : "setArtifact", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "example" : "leadreintermediate.io", + "in" : "path", + "name" : "name", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Artifact" + } + } + }, + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + }, { + "name" : "leadreintermediate.io", + "status" : "clean" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8123, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "live zebra", + "owner" : "demo", + "playbooks" : { + "phishing" : { + "name" : "Phishing", + "tasks" : { + "block-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block IOCs", + "order" : 6, + "type" : "task" + }, + "block-sender" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block sender", + "next" : { + "extract-iocs" : "" + }, + "order" : 3, + "type" : "task" + }, + "board" : { + "active" : true, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Board Involvement?", + "next" : { + "escalate" : "boardInvolved == true", + "mail-available" : "boardInvolved == false" + }, + "order" : 0, + "schema" : { + "properties" : { + "boardInvolved" : { + "default" : false, + "title" : "A board member is involved.", + "type" : "boolean" + } + }, + "required" : [ "boardInvolved" ], + "title" : "Board Involvement?", + "type" : "object" + }, + "type" : "input" + }, + "escalate" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to CISO", + "order" : 1, + "type" : "task" + }, + "extract-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Extract IOCs", + "next" : { + "block-iocs" : "" + }, + "order" : 5, + "schema" : { + "properties" : { + "iocs" : { + "items" : { + "type" : "string" + }, + "title" : "IOCs", + "type" : "array" + } + }, + "title" : "Extract IOCs", + "type" : "object" + }, + "type" : "input" + }, + "mail-available" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Mail available", + "next" : { + "block-sender" : "schemaKey == 'yes'", + "extract-iocs" : "schemaKey == 'yes'", + "search-email-gateway" : "schemaKey == 'no'" + }, + "order" : 2, + "schema" : { + "oneOf" : [ { + "properties" : { + "mail" : { + "title" : "Mail", + "type" : "string", + "x-display" : "textarea" + }, + "schemaKey" : { + "const" : "yes", + "type" : "string" + } + }, + "required" : [ "mail" ], + "title" : "Yes" + }, { + "properties" : { + "schemaKey" : { + "const" : "no", + "type" : "string" + } + }, + "title" : "No" + } ], + "title" : "Mail available", + "type" : "object" + }, + "type" : "input" + }, + "search-email-gateway" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Search email gateway", + "next" : { + "extract-iocs" : "" + }, + "order" : 4, + "type" : "task" + } + } + } + }, + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Set a single artifact", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "artifact" + } + }, + "/tickets/{id}/artifacts/{name}/enrich" : { + "post" : { + "operationId" : "enrichArtifact", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "example" : "leadreintermediate.io", + "in" : "path", + "name" : "name", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/EnrichmentForm" + } + } + }, + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Artifact" + } + }, + "test" : { + "example" : { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + }, { + "enrichments" : { + "hash.sha1" : { + "created" : "2021-10-03T16:44:06.489+0000", + "data" : { + "hash" : "b7a067a742c20d07a7456646de89bc2d408a1153" + }, + "name" : "hash.sha1" + } + }, + "name" : "leadreintermediate.io", + "status" : "malicious" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8123, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "live zebra", + "owner" : "demo", + "playbooks" : { + "phishing" : { + "name" : "Phishing", + "tasks" : { + "block-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block IOCs", + "order" : 6, + "type" : "task" + }, + "block-sender" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block sender", + "next" : { + "extract-iocs" : "" + }, + "order" : 3, + "type" : "task" + }, + "board" : { + "active" : true, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Board Involvement?", + "next" : { + "escalate" : "boardInvolved == true", + "mail-available" : "boardInvolved == false" + }, + "order" : 0, + "schema" : { + "properties" : { + "boardInvolved" : { + "default" : false, + "title" : "A board member is involved.", + "type" : "boolean" + } + }, + "required" : [ "boardInvolved" ], + "title" : "Board Involvement?", + "type" : "object" + }, + "type" : "input" + }, + "escalate" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to CISO", + "order" : 1, + "type" : "task" + }, + "extract-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Extract IOCs", + "next" : { + "block-iocs" : "" + }, + "order" : 5, + "schema" : { + "properties" : { + "iocs" : { + "items" : { + "type" : "string" + }, + "title" : "IOCs", + "type" : "array" + } + }, + "title" : "Extract IOCs", + "type" : "object" + }, + "type" : "input" + }, + "mail-available" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Mail available", + "next" : { + "block-sender" : "schemaKey == 'yes'", + "extract-iocs" : "schemaKey == 'yes'", + "search-email-gateway" : "schemaKey == 'no'" + }, + "order" : 2, + "schema" : { + "oneOf" : [ { + "properties" : { + "mail" : { + "title" : "Mail", + "type" : "string", + "x-display" : "textarea" + }, + "schemaKey" : { + "const" : "yes", + "type" : "string" + } + }, + "required" : [ "mail" ], + "title" : "Yes" + }, { + "properties" : { + "schemaKey" : { + "const" : "no", + "type" : "string" + } + }, + "title" : "No" + } ], + "title" : "Mail available", + "type" : "object" + }, + "type" : "input" + }, + "search-email-gateway" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Search email gateway", + "next" : { + "extract-iocs" : "" + }, + "order" : 4, + "type" : "task" + } + } + } + }, + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Enrich a single artifact", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "data" + } + }, + "/tickets/{id}/artifacts/{name}/run/{automation}" : { + "post" : { + "operationId" : "runArtifact", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "example" : "leadreintermediate.io", + "in" : "path", + "name" : "name", + "required" : true, + "schema" : { + "type" : "string" + } + }, { + "example" : "hash.sha1", + "in" : "path", + "name" : "automation", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "204" : { + "content" : { }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Run automation on a single artifact", + "tags" : [ "tickets" ] + } + }, + "/tickets/{id}/comments" : { + "post" : { + "operationId" : "addComment", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8125, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/CommentForm" + } + } + }, + "description" : "Ticket comment", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "comments" : [ { + "created" : "2021-10-02T16:04:59.078+0000", + "creator" : "bob", + "message" : "My first comment" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8125, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "phishing from selenafadel@von.com detected", + "owner" : "demo", + "references" : [ { + "href" : "https://www.seniorleading-edge.name/users/efficient", + "name" : "recovery" + }, { + "href" : "http://www.dynamicseamless.com/clicks-and-mortar", + "name" : "force" + }, { + "href" : "http://www.leadscalable.biz/envisioneer", + "name" : "fund" + } ], + "schema" : "{}", + "status" : "closed", + "tickets" : [ { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } ], + "type" : "alert" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Add ticket comment", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "comment" + } + }, + "/tickets/{id}/comments/{commentID}" : { + "delete" : { + "description" : "Comment will be removed from the ticket.", + "operationId" : "removeComment", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "description" : "Comment ID to remove", + "example" : 0, + "in" : "path", + "name" : "commentID", + "required" : true, + "schema" : { + "type" : "integer" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + }, { + "name" : "leadreintermediate.io", + "status" : "malicious" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8123, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "live zebra", + "owner" : "demo", + "playbooks" : { + "phishing" : { + "name" : "Phishing", + "tasks" : { + "block-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block IOCs", + "order" : 6, + "type" : "task" + }, + "block-sender" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block sender", + "next" : { + "extract-iocs" : "" + }, + "order" : 3, + "type" : "task" + }, + "board" : { + "active" : true, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Board Involvement?", + "next" : { + "escalate" : "boardInvolved == true", + "mail-available" : "boardInvolved == false" + }, + "order" : 0, + "schema" : { + "properties" : { + "boardInvolved" : { + "default" : false, + "title" : "A board member is involved.", + "type" : "boolean" + } + }, + "required" : [ "boardInvolved" ], + "title" : "Board Involvement?", + "type" : "object" + }, + "type" : "input" + }, + "escalate" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to CISO", + "order" : 1, + "type" : "task" + }, + "extract-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Extract IOCs", + "next" : { + "block-iocs" : "" + }, + "order" : 5, + "schema" : { + "properties" : { + "iocs" : { + "items" : { + "type" : "string" + }, + "title" : "IOCs", + "type" : "array" + } + }, + "title" : "Extract IOCs", + "type" : "object" + }, + "type" : "input" + }, + "mail-available" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Mail available", + "next" : { + "block-sender" : "schemaKey == 'yes'", + "extract-iocs" : "schemaKey == 'yes'", + "search-email-gateway" : "schemaKey == 'no'" + }, + "order" : 2, + "schema" : { + "oneOf" : [ { + "properties" : { + "mail" : { + "title" : "Mail", + "type" : "string", + "x-display" : "textarea" + }, + "schemaKey" : { + "const" : "yes", + "type" : "string" + } + }, + "required" : [ "mail" ], + "title" : "Yes" + }, { + "properties" : { + "schemaKey" : { + "const" : "no", + "type" : "string" + } + }, + "title" : "No" + } ], + "title" : "Mail available", + "type" : "object" + }, + "type" : "input" + }, + "search-email-gateway" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Search email gateway", + "next" : { + "extract-iocs" : "" + }, + "order" : 4, + "type" : "task" + } + } + } + }, + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Remove an comment from an ticket", + "tags" : [ "tickets" ] + } + }, + "/tickets/{id}/files" : { + "put" : { + "description" : "Link files to an ticket. The files themself will be stored in object storage.", + "operationId" : "linkFiles", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8125, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/File" + }, + "type" : "array" + } + } + }, + "description" : "Added files", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "created" : "2021-10-02T16:04:59.078+0000", + "files" : [ { + "key" : "myfile", + "name" : "document.doc" + } ], + "id" : 8125, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "phishing from selenafadel@von.com detected", + "owner" : "demo", + "references" : [ { + "href" : "https://www.seniorleading-edge.name/users/efficient", + "name" : "recovery" + }, { + "href" : "http://www.dynamicseamless.com/clicks-and-mortar", + "name" : "force" + }, { + "href" : "http://www.leadscalable.biz/envisioneer", + "name" : "fund" + } ], + "schema" : "{}", + "status" : "closed", + "tickets" : [ { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } ], + "type" : "alert" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Link files to an ticket", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "files" + } + }, + "/tickets/{id}/playbooks" : { + "post" : { + "operationId" : "addTicketPlaybook", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8125, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/PlaybookTemplateForm" + } + } + }, + "description" : "Ticket playbook object that needs to be added", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "created" : "1985-04-12T23:20:50.520+0000", + "id" : 8125, + "modified" : "1985-04-12T23:20:50.520+0000", + "name" : "phishing from selenafadel@von.com detected", + "owner" : "demo", + "playbooks" : { + "simple" : { + "name" : "Simple", + "tasks" : { + "escalate" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to malware team", + "order" : 2, + "type" : "task" + }, + "hash" : { + "active" : false, + "automation" : "hash.sha1", + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Hash the malware", + "next" : { + "escalate" : "" + }, + "order" : 1, + "payload" : { + "default" : "playbook.tasks['input'].data['malware']" + }, + "type" : "automation" + }, + "input" : { + "active" : true, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Upload malware if possible", + "next" : { + "hash" : "malware != ''" + }, + "order" : 0, + "schema" : { + "properties" : { + "malware" : { + "default" : "", + "title" : "Select malware", + "type" : "string" + } + }, + "title" : "Malware", + "type" : "object" + }, + "type" : "input" + } + } + } + }, + "references" : [ { + "href" : "https://www.seniorleading-edge.name/users/efficient", + "name" : "recovery" + }, { + "href" : "http://www.dynamicseamless.com/clicks-and-mortar", + "name" : "force" + }, { + "href" : "http://www.leadscalable.biz/envisioneer", + "name" : "fund" + } ], + "schema" : "{}", + "status" : "closed", + "tickets" : [ { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } ], + "type" : "alert" + } + } + }, + "description" : "successful operation" + } + }, + "summary" : "Add a new ticket playbook", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "playbook" + } + }, + "/tickets/{id}/playbooks/{playbookID}" : { + "delete" : { + "operationId" : "removeTicketPlaybook", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "description" : "Playbook ID", + "example" : "phishing", + "in" : "path", + "name" : "playbookID", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + }, { + "name" : "leadreintermediate.io", + "status" : "malicious" + } ], + "created" : "1985-04-12T23:20:50.520+0000", + "id" : 8123, + "modified" : "1985-04-12T23:20:50.520+0000", + "name" : "live zebra", + "owner" : "demo", + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Remove an ticket playbook", + "tags" : [ "tickets" ] + } + }, + "/tickets/{id}/playbooks/{playbookID}/task/{taskID}" : { + "put" : { + "operationId" : "setTask", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "description" : "Playbook ID", + "example" : "phishing", + "in" : "path", + "name" : "playbookID", + "required" : true, + "schema" : { + "type" : "string" + } + }, { + "description" : "Task ID", + "example" : "board", + "in" : "path", + "name" : "taskID", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Task" + } + } + }, + "description" : "Task", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + }, { + "name" : "leadreintermediate.io", + "status" : "malicious" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8123, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "live zebra", + "owner" : "demo", + "playbooks" : { + "phishing" : { + "name" : "Phishing", + "tasks" : { + "block-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block IOCs", + "order" : 6, + "type" : "task" + }, + "block-sender" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block sender", + "next" : { + "extract-iocs" : "" + }, + "order" : 3, + "type" : "task" + }, + "board" : { + "active" : true, + "created" : "2021-10-02T16:04:59.078+0000", + "data" : { + "boardInvolved" : true + }, + "done" : false, + "name" : "Board Involvement?", + "next" : { + "escalate" : "boardInvolved == true", + "mail-available" : "boardInvolved == false" + }, + "order" : 0, + "schema" : { + "properties" : { + "boardInvolved" : { + "default" : false, + "title" : "A board member is involved.", + "type" : "boolean" + } + }, + "required" : [ "boardInvolved" ], + "title" : "Board Involvement?", + "type" : "object" + }, + "type" : "input" + }, + "escalate" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to CISO", + "order" : 1, + "type" : "task" + }, + "extract-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Extract IOCs", + "next" : { + "block-iocs" : "" + }, + "order" : 5, + "schema" : { + "properties" : { + "iocs" : { + "items" : { + "type" : "string" + }, + "title" : "IOCs", + "type" : "array" + } + }, + "title" : "Extract IOCs", + "type" : "object" + }, + "type" : "input" + }, + "mail-available" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Mail available", + "next" : { + "block-sender" : "schemaKey == 'yes'", + "extract-iocs" : "schemaKey == 'yes'", + "search-email-gateway" : "schemaKey == 'no'" + }, + "order" : 2, + "schema" : { + "oneOf" : [ { + "properties" : { + "mail" : { + "title" : "Mail", + "type" : "string", + "x-display" : "textarea" + }, + "schemaKey" : { + "const" : "yes", + "type" : "string" + } + }, + "required" : [ "mail" ], + "title" : "Yes" + }, { + "properties" : { + "schemaKey" : { + "const" : "no", + "type" : "string" + } + }, + "title" : "No" + } ], + "title" : "Mail available", + "type" : "object" + }, + "type" : "input" + }, + "search-email-gateway" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Search email gateway", + "next" : { + "extract-iocs" : "" + }, + "order" : 4, + "type" : "task" + } + } + } + }, + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Set a ticket playbook task", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "task" + } + }, + "/tickets/{id}/playbooks/{playbookID}/task/{taskID}/complete" : { + "put" : { + "operationId" : "completeTask", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "description" : "Playbook ID", + "example" : "phishing", + "in" : "path", + "name" : "playbookID", + "required" : true, + "schema" : { + "type" : "string" + } + }, { + "description" : "Task ID", + "example" : "board", + "in" : "path", + "name" : "taskID", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "type" : "object" + } + } + }, + "description" : "Ticket playbook object that needs to be added", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + }, { + "name" : "leadreintermediate.io", + "status" : "malicious" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8123, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "live zebra", + "owner" : "demo", + "playbooks" : { + "phishing" : { + "name" : "Phishing", + "tasks" : { + "block-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block IOCs", + "order" : 6, + "type" : "task" + }, + "block-sender" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block sender", + "next" : { + "extract-iocs" : "" + }, + "order" : 3, + "type" : "task" + }, + "board" : { + "active" : false, + "closed" : "2021-10-02T16:04:59.078+0000", + "created" : "2021-10-02T16:04:59.078+0000", + "data" : { + "boardInvolved" : true + }, + "done" : true, + "name" : "Board Involvement?", + "next" : { + "escalate" : "boardInvolved == true", + "mail-available" : "boardInvolved == false" + }, + "order" : 0, + "schema" : { + "properties" : { + "boardInvolved" : { + "default" : false, + "title" : "A board member is involved.", + "type" : "boolean" + } + }, + "required" : [ "boardInvolved" ], + "title" : "Board Involvement?", + "type" : "object" + }, + "type" : "input" + }, + "escalate" : { + "active" : true, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to CISO", + "order" : 1, + "type" : "task" + }, + "extract-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Extract IOCs", + "next" : { + "block-iocs" : "" + }, + "order" : 5, + "schema" : { + "properties" : { + "iocs" : { + "items" : { + "type" : "string" + }, + "title" : "IOCs", + "type" : "array" + } + }, + "title" : "Extract IOCs", + "type" : "object" + }, + "type" : "input" + }, + "mail-available" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Mail available", + "next" : { + "block-sender" : "schemaKey == 'yes'", + "extract-iocs" : "schemaKey == 'yes'", + "search-email-gateway" : "schemaKey == 'no'" + }, + "order" : 2, + "schema" : { + "oneOf" : [ { + "properties" : { + "mail" : { + "title" : "Mail", + "type" : "string", + "x-display" : "textarea" + }, + "schemaKey" : { + "const" : "yes", + "type" : "string" + } + }, + "required" : [ "mail" ], + "title" : "Yes" + }, { + "properties" : { + "schemaKey" : { + "const" : "no", + "type" : "string" + } + }, + "title" : "No" + } ], + "title" : "Mail available", + "type" : "object" + }, + "type" : "input" + }, + "search-email-gateway" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Search email gateway", + "next" : { + "extract-iocs" : "" + }, + "order" : 4, + "type" : "task" + } + } + } + }, + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Complete ticket playbook task", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "data" + } + }, + "/tickets/{id}/playbooks/{playbookID}/task/{taskID}/run" : { + "post" : { + "operationId" : "runTask", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "description" : "Playbook ID", + "example" : "phishing", + "in" : "path", + "name" : "playbookID", + "required" : true, + "schema" : { + "type" : "string" + } + }, { + "description" : "Task ID", + "example" : "board", + "in" : "path", + "name" : "taskID", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "204" : { + "content" : { }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Run ticket playbook task", + "tags" : [ "tickets" ] + } + }, + "/tickets/{id}/references" : { + "put" : { + "operationId" : "setReferences", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8125, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/Reference" + }, + "type" : "array" + } + } + }, + "description" : "All ticket references", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8125, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "phishing from selenafadel@von.com detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.leadscalable.biz/envisioneer", + "name" : "fund" + } ], + "schema" : "{}", + "status" : "closed", + "tickets" : [ { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } ], + "type" : "alert" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Set ticket references", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "references" + } + }, + "/tickets/{id}/schema" : { + "put" : { + "operationId" : "setSchema", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8125, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "type" : "string" + } + } + }, + "description" : "New ticket schema", + "required" : false + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8125, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "phishing from selenafadel@von.com detected", + "owner" : "demo", + "references" : [ { + "href" : "https://www.seniorleading-edge.name/users/efficient", + "name" : "recovery" + }, { + "href" : "http://www.dynamicseamless.com/clicks-and-mortar", + "name" : "force" + }, { + "href" : "http://www.leadscalable.biz/envisioneer", + "name" : "fund" + } ], + "schema" : "{}", + "status" : "closed", + "tickets" : [ { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } ], + "type" : "alert" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Set ticket schema", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "schema" + } + }, + "/tickets/{id}/tickets" : { + "delete" : { + "operationId" : "unlinkTicket", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8126, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "format" : "int64", + "type" : "integer" + } + } + }, + "description" : "Added ticket ID", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Unlink an ticket to an ticket", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "linkedID" + }, + "patch" : { + "operationId" : "linkTicket", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8126, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "format" : "int64", + "type" : "integer" + } + } + }, + "description" : "Added ticket ID", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "tickets" : [ { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + }, { + "name" : "leadreintermediate.io", + "status" : "malicious" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8123, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "live zebra", + "owner" : "demo", + "playbooks" : { + "phishing" : { + "name" : "Phishing", + "tasks" : { + "block-iocs" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block IOCs", + "type" : "task" + }, + "block-sender" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block sender", + "next" : { + "extract-iocs" : "" + }, + "type" : "task" + }, + "board" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Board Involvement?", + "next" : { + "escalate" : "boardInvolved == true", + "mail-available" : "boardInvolved == false" + }, + "schema" : { + "properties" : { + "boardInvolved" : { + "default" : false, + "title" : "A board member is involved.", + "type" : "boolean" + } + }, + "required" : [ "boardInvolved" ], + "title" : "Board Involvement?", + "type" : "object" + }, + "type" : "input" + }, + "escalate" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to CISO", + "type" : "task" + }, + "extract-iocs" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Extract IOCs", + "next" : { + "block-iocs" : "" + }, + "schema" : { + "properties" : { + "iocs" : { + "items" : { + "type" : "string" + }, + "title" : "IOCs", + "type" : "array" + } + }, + "title" : "Extract IOCs", + "type" : "object" + }, + "type" : "input" + }, + "mail-available" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Mail available", + "next" : { + "block-sender" : "schemaKey == 'yes'", + "extract-iocs" : "schemaKey == 'yes'", + "search-email-gateway" : "schemaKey == 'no'" + }, + "schema" : { + "oneOf" : [ { + "properties" : { + "mail" : { + "title" : "Mail", + "type" : "string", + "x-display" : "textarea" + }, + "schemaKey" : { + "const" : "yes", + "type" : "string" + } + }, + "required" : [ "mail" ], + "title" : "Yes" + }, { + "properties" : { + "schemaKey" : { + "const" : "no", + "type" : "string" + } + }, + "title" : "No" + } ], + "title" : "Mail available", + "type" : "object" + }, + "type" : "input" + }, + "search-email-gateway" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Search email gateway", + "next" : { + "extract-iocs" : "" + }, + "type" : "task" + } + } + } + }, + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + }, { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8125, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "phishing from selenafadel@von.com detected", + "owner" : "demo", + "references" : [ { + "href" : "https://www.seniorleading-edge.name/users/efficient", + "name" : "recovery" + }, { + "href" : "http://www.dynamicseamless.com/clicks-and-mortar", + "name" : "force" + }, { + "href" : "http://www.leadscalable.biz/envisioneer", + "name" : "fund" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } ], + "type" : "alert" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Link an ticket to an ticket", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "linkedID" + } + }, + "/tickets/batch" : { + "post" : { + "operationId" : "createTicketBatch", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/TicketForm" + }, + "type" : "array" + } + } + }, + "description" : "New ticket", + "required" : true + }, + "responses" : { + "204" : { + "content" : { }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Create a new tickets in batch", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "ticket" + } + }, + "/tickettypes" : { + "get" : { + "operationId" : "listTicketTypes", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/TicketTypeResponse" + }, + "type" : "array" + } + }, + "test" : { + "example" : [ { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-alert", + "id" : "alert", + "name" : "Alerts" + }, { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-radioactive", + "id" : "incident", + "name" : "Incidents" + }, { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-fingerprint", + "id" : "investigation", + "name" : "Forensic Investigations" + }, { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-target", + "id" : "hunt", + "name" : "Threat Hunting" + } ] + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "tickettype:read" ] + } ], + "summary" : "List tickettypes", + "tags" : [ "tickettypes" ] + }, + "post" : { + "operationId" : "createTicketType", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTypeForm" + } + } + }, + "description" : "New tickettype", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTypeResponse" + } + }, + "test" : { + "example" : { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-newspaper-variant-outline", + "id" : "ti-tickets", + "name" : "TI Tickets" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "tickettype:write" ] + } ], + "summary" : "Create a new tickettype", + "tags" : [ "tickettypes" ], + "x-codegen-request-body-name" : "tickettype" + } + }, + "/tickettypes/{id}" : { + "delete" : { + "operationId" : "deleteTicketType", + "parameters" : [ { + "description" : "TicketType ID", + "example" : "alert", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "204" : { + "content" : { }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "tickettype:write" ] + } ], + "summary" : "Delete a tickettype", + "tags" : [ "tickettypes" ] + }, + "get" : { + "operationId" : "getTicketType", + "parameters" : [ { + "description" : "TicketType ID", + "example" : "alert", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTypeResponse" + } + }, + "test" : { + "example" : { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-alert", + "id" : "alert", + "name" : "Alerts" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "tickettype:read" ] + } ], + "summary" : "Get a single tickettype", + "tags" : [ "tickettypes" ] + }, + "put" : { + "operationId" : "updateTicketType", + "parameters" : [ { + "description" : "TicketType ID", + "example" : "alert", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTypeForm" + } + } + }, + "description" : "TicketType object that needs to be added", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTypeResponse" + } + }, + "test" : { + "example" : { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-bell", + "id" : "alert", + "name" : "Alerts" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "tickettype:write" ] + } ], + "summary" : "Update an existing tickettype", + "tags" : [ "tickettypes" ], + "x-codegen-request-body-name" : "tickettype" + } + }, + "/userdata" : { + "get" : { + "operationId" : "listUserData", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/UserDataResponse" + }, + "type" : "array" + } + }, + "test" : { + "example" : [ { + "email" : "bob@example.org", + "id" : "bob", + "name" : "Bob Bad" + } ] + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "userdata:read" ] + } ], + "summary" : "List userdata", + "tags" : [ "userdata" ] + } + }, + "/userdata/{id}" : { + "get" : { + "operationId" : "getUserData", + "parameters" : [ { + "description" : "User Data ID", + "example" : "bob", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/UserDataResponse" + } + }, + "test" : { + "example" : { + "email" : "bob@example.org", + "id" : "bob", + "name" : "Bob Bad" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "userdata:read" ] + } ], + "summary" : "Get a single user data", + "tags" : [ "userdata" ] + }, + "put" : { + "operationId" : "updateUserData", + "parameters" : [ { + "description" : "User Data ID", + "example" : "bob", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/UserData" + } + } + }, + "description" : "User data object that needs to be added", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/UserDataResponse" + } + }, + "test" : { + "example" : { + "email" : "bob@example.org", + "id" : "bob", + "name" : "Bob Bad" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "userdata:write" ] + } ], + "summary" : "Update an existing user data", + "tags" : [ "userdata" ], + "x-codegen-request-body-name" : "userdata" + } + }, + "/users" : { + "get" : { + "operationId" : "listUsers", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/UserResponse" + }, + "type" : "array" + } + }, + "test" : { + "example" : [ { + "apikey" : false, + "blocked" : false, + "id" : "bob", + "roles" : [ "admin:backup:read", "admin:backup:restore", "admin:group:write", "admin:job:read", "admin:job:write", "admin:log:read", "admin:ticket:delete", "admin:user:write", "admin:userdata:read", "admin:userdata:write", "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write" ] + }, { + "apikey" : true, + "blocked" : false, + "id" : "script", + "roles" : [ "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write" ] + } ] + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "user:read" ] + } ], + "summary" : "List users", + "tags" : [ "users" ] + }, + "post" : { + "operationId" : "createUser", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/UserForm" + } + } + }, + "description" : "user object that needs to be added", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/NewUserResponse" + } + }, + "test" : { + "example" : { + "blocked" : false, + "id" : "syncscript", + "roles" : [ "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read" ], + "secret" : "v39bOuobnlEljfWzjAgoKzhmnh1xSMxH" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "user:write" ] + } ], + "summary" : "Create user", + "tags" : [ "users" ], + "x-codegen-request-body-name" : "user" + } + }, + "/users/{id}" : { + "delete" : { + "operationId" : "deleteUser", + "parameters" : [ { + "description" : "user ID", + "example" : "script", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "204" : { + "content" : { }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "user:write" ] + } ], + "summary" : "Delete user", + "tags" : [ "users" ] + }, + "get" : { + "operationId" : "getUser", + "parameters" : [ { + "description" : "user ID", + "example" : "script", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/UserResponse" + } + }, + "test" : { + "example" : { + "apikey" : true, + "blocked" : false, + "id" : "script", + "roles" : [ "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write" ] + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "user:read" ] + } ], + "summary" : "Get a single user", + "tags" : [ "users" ] + }, + "put" : { + "operationId" : "updateUser", + "parameters" : [ { + "description" : "Template ID", + "example" : "bob", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/UserForm" + } + } + }, + "description" : "user object that needs to be added", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/UserResponse" + } + }, + "test" : { + "example" : { + "apikey" : false, + "blocked" : false, + "id" : "bob", + "roles" : [ "admin:backup:read", "admin:backup:restore", "admin:group:write", "admin:job:read", "admin:job:write", "admin:log:read", "admin:ticket:delete", "admin:user:write", "admin:userdata:read", "admin:userdata:write", "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write" ] + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "user:write" ] + } ], + "summary" : "Update user", + "tags" : [ "users" ], + "x-codegen-request-body-name" : "user" + } + } + }, + "components" : { + "schemas" : { + "Artifact" : { + "properties" : { + "enrichments" : { + "additionalProperties" : { + "$ref" : "#/components/schemas/Enrichment" + }, + "type" : "object" + }, + "name" : { + "example" : "2.2.2.2", + "type" : "string" + }, + "status" : { + "example" : "Unknown", + "type" : "string" + }, + "type" : { + "type" : "string" + } + }, + "required" : [ "name" ], + "type" : "object" + }, + "ArtifactOrigin" : { + "properties" : { + "artifact" : { + "type" : "string" + }, + "ticket_id" : { + "format" : "int64", + "type" : "integer" + } + }, + "required" : [ "artifact", "ticket_id" ], + "type" : "object" + }, + "Automation" : { + "properties" : { + "image" : { + "type" : "string" + }, + "schema" : { + "example" : "{}", + "type" : "string" + }, + "script" : { + "type" : "string" + }, + "type" : { + "items" : { + "enum" : [ "artifact", "playbook", "global" ], + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "image", "script", "type" ], + "type" : "object" + }, + "AutomationForm" : { + "properties" : { + "id" : { + "type" : "string" + }, + "image" : { + "type" : "string" + }, + "schema" : { + "example" : "{}", + "type" : "string" + }, + "script" : { + "type" : "string" + }, + "type" : { + "items" : { + "enum" : [ "artifact", "playbook", "global" ], + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "id", "image", "script", "type" ], + "type" : "object" + }, + "AutomationResponse" : { + "properties" : { + "id" : { + "type" : "string" + }, + "image" : { + "type" : "string" + }, + "schema" : { + "example" : "{}", + "type" : "string" + }, + "script" : { + "type" : "string" + }, + "type" : { + "items" : { + "enum" : [ "artifact", "playbook", "global" ], + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "id", "image", "script", "type" ], + "type" : "object" + }, + "Comment" : { + "properties" : { + "created" : { + "format" : "date-time", + "type" : "string" + }, + "creator" : { + "type" : "string" + }, + "message" : { + "type" : "string" + } + }, + "required" : [ "created", "creator", "message" ], + "type" : "object" + }, + "CommentForm" : { + "properties" : { + "created" : { + "format" : "date-time", + "type" : "string" + }, + "creator" : { + "type" : "string" + }, + "message" : { + "type" : "string" + } + }, + "required" : [ "message" ], + "type" : "object" + }, + "Context" : { + "properties" : { + "artifact" : { + "$ref" : "#/components/schemas/Artifact" + }, + "playbook" : { + "$ref" : "#/components/schemas/PlaybookResponse" + }, + "task" : { + "$ref" : "#/components/schemas/TaskResponse" + }, + "ticket" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "type" : "object" + }, + "Enrichment" : { + "properties" : { + "created" : { + "format" : "date-time", + "type" : "string" + }, + "data" : { + "example" : { + "hash" : "b7a067a742c20d07a7456646de89bc2d408a1153" + }, + "properties" : { }, + "type" : "object" + }, + "name" : { + "example" : "hash.sha1", + "type" : "string" + } + }, + "required" : [ "created", "data", "name" ], + "type" : "object" + }, + "EnrichmentForm" : { + "properties" : { + "data" : { + "example" : { + "hash" : "b7a067a742c20d07a7456646de89bc2d408a1153" + }, + "properties" : { }, + "type" : "object" + }, + "name" : { + "example" : "hash.sha1", + "type" : "string" + } + }, + "required" : [ "data", "name" ], + "type" : "object" + }, + "File" : { + "properties" : { + "key" : { + "example" : "myfile", + "type" : "string" + }, + "name" : { + "example" : "notes.docx", + "type" : "string" + } + }, + "required" : [ "key", "name" ], + "type" : "object" + }, + "Graph" : { + "properties" : { + "links" : { + "items" : { + "$ref" : "#/components/schemas/Link" + }, + "type" : "array" + }, + "nodes" : { + "items" : { + "$ref" : "#/components/schemas/Node" + }, + "type" : "array" + } + }, + "type" : "object" + }, + "Group" : { + "properties" : { + "name" : { + "type" : "string" + }, + "users" : { + "items" : { + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "name", "users" ], + "type" : "object" + }, + "GroupForm" : { + "properties" : { + "id" : { + "type" : "string" + }, + "name" : { + "type" : "string" + }, + "users" : { + "items" : { + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "name", "users" ], + "type" : "object" + }, + "GroupResponse" : { + "properties" : { + "id" : { + "type" : "string" + }, + "name" : { + "type" : "string" + }, + "users" : { + "items" : { + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "id", "name", "users" ], + "type" : "object" + }, + "Job" : { + "properties" : { + "automation" : { + "type" : "string" + }, + "container" : { + "type" : "string" + }, + "log" : { + "type" : "string" + }, + "origin" : { + "$ref" : "#/components/schemas/Origin" + }, + "output" : { + "properties" : { }, + "type" : "object" + }, + "payload" : { + "type" : "object" + }, + "running" : { + "type" : "boolean" + }, + "status" : { + "type" : "string" + } + }, + "required" : [ "automation", "running", "status" ], + "type" : "object" + }, + "JobForm" : { + "properties" : { + "automation" : { + "type" : "string" + }, + "origin" : { + "$ref" : "#/components/schemas/Origin" + }, + "payload" : { + "type" : "object" + } + }, + "required" : [ "automation" ], + "type" : "object" + }, + "JobResponse" : { + "properties" : { + "automation" : { + "type" : "string" + }, + "container" : { + "type" : "string" + }, + "id" : { + "type" : "string" + }, + "log" : { + "type" : "string" + }, + "origin" : { + "$ref" : "#/components/schemas/Origin" + }, + "output" : { + "properties" : { }, + "type" : "object" + }, + "payload" : { + "type" : "object" + }, + "status" : { + "type" : "string" + } + }, + "required" : [ "automation", "id", "status" ], + "type" : "object" + }, + "Link" : { + "properties" : { + "id" : { + "type" : "string" + }, + "sid" : { + "type" : "string" + }, + "tid" : { + "type" : "string" + } + }, + "required" : [ "id", "sid", "tid" ], + "type" : "object" + }, + "LogEntry" : { + "properties" : { + "created" : { + "format" : "date-time", + "type" : "string" + }, + "creator" : { + "type" : "string" + }, + "message" : { + "type" : "string" + }, + "reference" : { + "type" : "string" + } + }, + "required" : [ "created", "creator", "message", "reference" ], + "type" : "object" + }, + "Message" : { + "properties" : { + "context" : { + "$ref" : "#/components/schemas/Context" + }, + "payload" : { + "properties" : { }, + "type" : "object" + }, + "secrets" : { + "additionalProperties" : { + "type" : "string" + }, + "type" : "object" + } + }, + "type" : "object" + }, + "NewUserResponse" : { + "properties" : { + "blocked" : { + "type" : "boolean" + }, + "id" : { + "type" : "string" + }, + "roles" : { + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "secret" : { + "type" : "string" + } + }, + "required" : [ "blocked", "id", "roles" ], + "type" : "object" + }, + "Node" : { + "properties" : { + "id" : { + "type" : "string" + }, + "name" : { + "type" : "string" + } + }, + "required" : [ "id", "name" ], + "type" : "object" + }, + "Origin" : { + "properties" : { + "artifact_origin" : { + "$ref" : "#/components/schemas/ArtifactOrigin" + }, + "task_origin" : { + "$ref" : "#/components/schemas/TaskOrigin" + } + }, + "type" : "object" + }, + "Playbook" : { + "properties" : { + "name" : { + "example" : "Phishing", + "type" : "string" + }, + "tasks" : { + "additionalProperties" : { + "$ref" : "#/components/schemas/Task" + }, + "type" : "object" + } + }, + "required" : [ "name", "tasks" ], + "type" : "object" + }, + "PlaybookResponse" : { + "properties" : { + "name" : { + "example" : "Phishing", + "type" : "string" + }, + "tasks" : { + "additionalProperties" : { + "$ref" : "#/components/schemas/TaskResponse" + }, + "type" : "object" + } + }, + "required" : [ "name", "tasks" ], + "type" : "object" + }, + "PlaybookTemplate" : { + "properties" : { + "name" : { + "type" : "string" + }, + "yaml" : { + "type" : "string" + } + }, + "required" : [ "name", "yaml" ], + "type" : "object" + }, + "PlaybookTemplateForm" : { + "properties" : { + "id" : { + "type" : "string" + }, + "yaml" : { + "type" : "string" + } + }, + "required" : [ "yaml" ], + "type" : "object" + }, + "PlaybookTemplateResponse" : { + "properties" : { + "id" : { + "type" : "string" + }, + "name" : { + "type" : "string" + }, + "yaml" : { + "type" : "string" + } + }, + "required" : [ "id", "name", "yaml" ], + "type" : "object" + }, + "Reference" : { + "properties" : { + "href" : { + "example" : "https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0144", + "type" : "string" + }, + "name" : { + "example" : "CVE-2017-0144", + "type" : "string" + } + }, + "required" : [ "href", "name" ], + "type" : "object" + }, + "Rule" : { + "properties" : { + "condition" : { + "type" : "string" + }, + "name" : { + "type" : "string" + }, + "update" : { + "properties" : { }, + "type" : "object" + } + }, + "required" : [ "condition", "name", "update" ], + "type" : "object" + }, + "RuleForm" : { + "properties" : { + "condition" : { + "type" : "string" + }, + "id" : { + "type" : "string" + }, + "name" : { + "type" : "string" + }, + "update" : { + "properties" : { }, + "type" : "object" + } + }, + "required" : [ "condition", "name", "update" ], + "type" : "object" + }, + "RuleResponse" : { + "properties" : { + "condition" : { + "type" : "string" + }, + "id" : { + "type" : "string" + }, + "name" : { + "type" : "string" + }, + "update" : { + "properties" : { }, + "type" : "object" + } + }, + "required" : [ "condition", "id", "name", "update" ], + "type" : "object" + }, + "Settings" : { + "properties" : { + "artifactStates" : { + "items" : { + "$ref" : "#/components/schemas/Type" + }, + "title" : "Artifact States", + "type" : "array" + }, + "roles" : { + "items" : { + "type" : "string" + }, + "title" : "Roles", + "type" : "array" + }, + "ticketTypes" : { + "items" : { + "$ref" : "#/components/schemas/TicketTypeResponse" + }, + "title" : "Ticket Types", + "type" : "array" + }, + "tier" : { + "enum" : [ "community", "enterprise" ], + "title" : "Tier", + "type" : "string" + }, + "timeformat" : { + "title" : "Time Format", + "type" : "string" + }, + "version" : { + "title" : "Version", + "type" : "string" + } + }, + "required" : [ "artifactStates", "ticketTypes", "tier", "timeformat", "version" ], + "type" : "object" + }, + "Statistics" : { + "properties" : { + "open_tickets_per_user" : { + "additionalProperties" : { + "type" : "integer" + }, + "type" : "object" + }, + "tickets_per_type" : { + "additionalProperties" : { + "type" : "integer" + }, + "type" : "object" + }, + "tickets_per_week" : { + "additionalProperties" : { + "type" : "integer" + }, + "type" : "object" + }, + "unassigned" : { + "type" : "integer" + } + }, + "required" : [ "open_tickets_per_user", "tickets_per_type", "tickets_per_week", "unassigned" ], + "type" : "object" + }, + "Task" : { + "properties" : { + "automation" : { + "type" : "string" + }, + "closed" : { + "format" : "date-time", + "type" : "string" + }, + "created" : { + "format" : "date-time", + "type" : "string" + }, + "data" : { + "properties" : { }, + "type" : "object" + }, + "done" : { + "type" : "boolean" + }, + "join" : { + "example" : false, + "type" : "boolean" + }, + "name" : { + "example" : "Inform user", + "type" : "string" + }, + "next" : { + "additionalProperties" : { + "type" : "string" + }, + "type" : "object" + }, + "owner" : { + "type" : "string" + }, + "payload" : { + "additionalProperties" : { + "type" : "string" + }, + "type" : "object" + }, + "schema" : { + "properties" : { }, + "type" : "object" + }, + "type" : { + "enum" : [ "task", "input", "automation" ], + "example" : "task", + "type" : "string" + } + }, + "required" : [ "created", "done", "name", "type" ], + "type" : "object" + }, + "TaskForm" : { + "properties" : { + "automation" : { + "type" : "string" + }, + "closed" : { + "format" : "date-time", + "type" : "string" + }, + "created" : { + "format" : "date-time", + "type" : "string" + }, + "data" : { + "properties" : { }, + "type" : "object" + }, + "done" : { + "type" : "boolean" + }, + "join" : { + "example" : false, + "type" : "boolean" + }, + "name" : { + "example" : "Inform user", + "type" : "string" + }, + "next" : { + "additionalProperties" : { + "type" : "string" + }, + "type" : "object" + }, + "owner" : { + "type" : "string" + }, + "payload" : { + "additionalProperties" : { + "type" : "string" + }, + "type" : "object" + }, + "schema" : { + "properties" : { }, + "type" : "object" + }, + "type" : { + "enum" : [ "task", "input", "automation" ], + "example" : "task", + "type" : "string" + } + }, + "required" : [ "name", "type" ], + "type" : "object" + }, + "TaskOrigin" : { + "properties" : { + "playbook_id" : { + "type" : "string" + }, + "task_id" : { + "type" : "string" + }, + "ticket_id" : { + "format" : "int64", + "type" : "integer" + } + }, + "required" : [ "playbook_id", "task_id", "ticket_id" ], + "type" : "object" + }, + "TaskResponse" : { + "properties" : { + "active" : { + "example" : false, + "type" : "boolean" + }, + "automation" : { + "type" : "string" + }, + "closed" : { + "format" : "date-time", + "type" : "string" + }, + "created" : { + "format" : "date-time", + "type" : "string" + }, + "data" : { + "properties" : { }, + "type" : "object" + }, + "done" : { + "type" : "boolean" + }, + "join" : { + "example" : false, + "type" : "boolean" + }, + "name" : { + "example" : "Inform user", + "type" : "string" + }, + "next" : { + "additionalProperties" : { + "type" : "string" + }, + "type" : "object" + }, + "order" : { + "example" : 2.0, + "format" : "int64", + "type" : "number" + }, + "owner" : { + "type" : "string" + }, + "payload" : { + "additionalProperties" : { + "type" : "string" + }, + "type" : "object" + }, + "schema" : { + "properties" : { }, + "type" : "object" + }, + "type" : { + "enum" : [ "task", "input", "automation" ], + "example" : "task", + "type" : "string" + } + }, + "required" : [ "active", "created", "done", "name", "order", "type" ], + "type" : "object" + }, + "TaskWithContext" : { + "properties" : { + "playbook_id" : { + "type" : "string" + }, + "playbook_name" : { + "type" : "string" + }, + "task" : { + "$ref" : "#/components/schemas/TaskResponse" + }, + "task_id" : { + "type" : "string" + }, + "ticket_id" : { + "format" : "int64", + "type" : "number" + }, + "ticket_name" : { + "type" : "string" + } + }, + "required" : [ "playbook_id", "playbook_name", "task", "task_id", "ticket_id", "ticket_name" ], + "type" : "object" + }, + "Ticket" : { + "properties" : { + "artifacts" : { + "items" : { + "$ref" : "#/components/schemas/Artifact" + }, + "type" : "array" + }, + "comments" : { + "items" : { + "$ref" : "#/components/schemas/Comment" + }, + "type" : "array" + }, + "created" : { + "format" : "date-time", + "type" : "string" + }, + "details" : { + "example" : { + "description" : "my little incident" + }, + "properties" : { }, + "type" : "object" + }, + "files" : { + "items" : { + "$ref" : "#/components/schemas/File" + }, + "type" : "array" + }, + "modified" : { + "format" : "date-time", + "type" : "string" + }, + "name" : { + "example" : "WannyCry", + "type" : "string" + }, + "owner" : { + "example" : "bob", + "type" : "string" + }, + "playbooks" : { + "additionalProperties" : { + "$ref" : "#/components/schemas/Playbook" + }, + "type" : "object" + }, + "read" : { + "example" : [ "bob" ], + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "references" : { + "items" : { + "$ref" : "#/components/schemas/Reference" + }, + "type" : "array" + }, + "schema" : { + "example" : "{}", + "type" : "string" + }, + "status" : { + "example" : "open", + "type" : "string" + }, + "type" : { + "example" : "incident", + "type" : "string" + }, + "write" : { + "example" : [ "alice" ], + "items" : { + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "created", "modified", "name", "schema", "status", "type" ], + "type" : "object" + }, + "TicketForm" : { + "properties" : { + "artifacts" : { + "items" : { + "$ref" : "#/components/schemas/Artifact" + }, + "type" : "array" + }, + "comments" : { + "items" : { + "$ref" : "#/components/schemas/Comment" + }, + "type" : "array" + }, + "created" : { + "format" : "date-time", + "type" : "string" + }, + "details" : { + "example" : { + "description" : "my little incident" + }, + "properties" : { }, + "type" : "object" + }, + "files" : { + "items" : { + "$ref" : "#/components/schemas/File" + }, + "type" : "array" + }, + "id" : { + "example" : 123, + "format" : "int64", + "type" : "integer" + }, + "modified" : { + "format" : "date-time", + "type" : "string" + }, + "name" : { + "example" : "WannyCry", + "type" : "string" + }, + "owner" : { + "example" : "bob", + "type" : "string" + }, + "playbooks" : { + "items" : { + "$ref" : "#/components/schemas/PlaybookTemplateForm" + }, + "type" : "array" + }, + "read" : { + "example" : [ "bob" ], + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "references" : { + "items" : { + "$ref" : "#/components/schemas/Reference" + }, + "type" : "array" + }, + "schema" : { + "example" : "{}", + "type" : "string" + }, + "status" : { + "example" : "open", + "type" : "string" + }, + "type" : { + "example" : "incident", + "type" : "string" + }, + "write" : { + "example" : [ "alice" ], + "items" : { + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "name", "status", "type" ], + "type" : "object" + }, + "TicketList" : { + "properties" : { + "count" : { + "example" : 3.0, + "type" : "number" + }, + "tickets" : { + "items" : { + "$ref" : "#/components/schemas/TicketSimpleResponse" + }, + "type" : "array" + } + }, + "required" : [ "count", "tickets" ], + "type" : "object" + }, + "TicketResponse" : { + "properties" : { + "artifacts" : { + "items" : { + "$ref" : "#/components/schemas/Artifact" + }, + "type" : "array" + }, + "comments" : { + "items" : { + "$ref" : "#/components/schemas/Comment" + }, + "type" : "array" + }, + "created" : { + "format" : "date-time", + "type" : "string" + }, + "details" : { + "example" : { + "description" : "my little incident" + }, + "properties" : { }, + "type" : "object" + }, + "files" : { + "items" : { + "$ref" : "#/components/schemas/File" + }, + "type" : "array" + }, + "id" : { + "example" : 123, + "format" : "int64", + "type" : "integer" + }, + "modified" : { + "format" : "date-time", + "type" : "string" + }, + "name" : { + "example" : "WannyCry", + "type" : "string" + }, + "owner" : { + "example" : "bob", + "type" : "string" + }, + "playbooks" : { + "additionalProperties" : { + "$ref" : "#/components/schemas/PlaybookResponse" + }, + "type" : "object" + }, + "read" : { + "example" : [ "bob" ], + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "references" : { + "items" : { + "$ref" : "#/components/schemas/Reference" + }, + "type" : "array" + }, + "schema" : { + "example" : "{}", + "type" : "string" + }, + "status" : { + "example" : "open", + "type" : "string" + }, + "type" : { + "example" : "incident", + "type" : "string" + }, + "write" : { + "example" : [ "alice" ], + "items" : { + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "created", "id", "modified", "name", "schema", "status", "type" ], + "type" : "object" + }, + "TicketSimpleResponse" : { + "properties" : { + "artifacts" : { + "items" : { + "$ref" : "#/components/schemas/Artifact" + }, + "type" : "array" + }, + "comments" : { + "items" : { + "$ref" : "#/components/schemas/Comment" + }, + "type" : "array" + }, + "created" : { + "format" : "date-time", + "type" : "string" + }, + "details" : { + "example" : { + "description" : "my little incident" + }, + "properties" : { }, + "type" : "object" + }, + "files" : { + "items" : { + "$ref" : "#/components/schemas/File" + }, + "type" : "array" + }, + "id" : { + "example" : 123, + "format" : "int64", + "type" : "integer" + }, + "modified" : { + "format" : "date-time", + "type" : "string" + }, + "name" : { + "example" : "WannyCry", + "type" : "string" + }, + "owner" : { + "example" : "bob", + "type" : "string" + }, + "playbooks" : { + "additionalProperties" : { + "$ref" : "#/components/schemas/Playbook" + }, + "type" : "object" + }, + "read" : { + "example" : [ "bob" ], + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "references" : { + "items" : { + "$ref" : "#/components/schemas/Reference" + }, + "type" : "array" + }, + "schema" : { + "example" : "{}", + "type" : "string" + }, + "status" : { + "example" : "open", + "type" : "string" + }, + "type" : { + "example" : "incident", + "type" : "string" + }, + "write" : { + "example" : [ "alice" ], + "items" : { + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "created", "id", "modified", "name", "schema", "status", "type" ], + "type" : "object" + }, + "TicketTemplate" : { + "properties" : { + "name" : { + "type" : "string" + }, + "schema" : { + "type" : "string" + } + }, + "required" : [ "name", "schema" ], + "type" : "object" + }, + "TicketTemplateForm" : { + "properties" : { + "id" : { + "type" : "string" + }, + "name" : { + "type" : "string" + }, + "schema" : { + "type" : "string" + } + }, + "required" : [ "name", "schema" ], + "type" : "object" + }, + "TicketTemplateResponse" : { + "properties" : { + "id" : { + "type" : "string" + }, + "name" : { + "type" : "string" + }, + "schema" : { + "type" : "string" + } + }, + "required" : [ "id", "name", "schema" ], + "type" : "object" + }, + "TicketType" : { + "properties" : { + "default_groups" : { + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "default_playbooks" : { + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "default_template" : { + "type" : "string" + }, + "icon" : { + "type" : "string" + }, + "name" : { + "type" : "string" + } + }, + "required" : [ "default_playbooks", "default_template", "icon", "name" ], + "type" : "object" + }, + "TicketTypeForm" : { + "properties" : { + "default_groups" : { + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "default_playbooks" : { + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "default_template" : { + "type" : "string" + }, + "icon" : { + "type" : "string" + }, + "id" : { + "type" : "string" + }, + "name" : { + "type" : "string" + } + }, + "required" : [ "default_playbooks", "default_template", "icon", "name" ], + "type" : "object" + }, + "TicketTypeResponse" : { + "properties" : { + "default_groups" : { + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "default_playbooks" : { + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "default_template" : { + "type" : "string" + }, + "icon" : { + "type" : "string" + }, + "id" : { + "type" : "string" + }, + "name" : { + "type" : "string" + } + }, + "required" : [ "default_playbooks", "default_template", "icon", "id", "name" ], + "type" : "object" + }, + "TicketWithTickets" : { + "properties" : { + "artifacts" : { + "items" : { + "$ref" : "#/components/schemas/Artifact" + }, + "type" : "array" + }, + "comments" : { + "items" : { + "$ref" : "#/components/schemas/Comment" + }, + "type" : "array" + }, + "created" : { + "format" : "date-time", + "type" : "string" + }, + "details" : { + "example" : { + "description" : "my little incident" + }, + "properties" : { }, + "type" : "object" + }, + "files" : { + "items" : { + "$ref" : "#/components/schemas/File" + }, + "type" : "array" + }, + "id" : { + "example" : 123, + "format" : "int64", + "type" : "integer" + }, + "modified" : { + "format" : "date-time", + "type" : "string" + }, + "name" : { + "example" : "WannyCry", + "type" : "string" + }, + "owner" : { + "example" : "bob", + "type" : "string" + }, + "playbooks" : { + "additionalProperties" : { + "$ref" : "#/components/schemas/PlaybookResponse" + }, + "type" : "object" + }, + "read" : { + "example" : [ "bob" ], + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "references" : { + "items" : { + "$ref" : "#/components/schemas/Reference" + }, + "type" : "array" + }, + "schema" : { + "example" : "{}", + "type" : "string" + }, + "status" : { + "example" : "open", + "type" : "string" + }, + "tickets" : { + "items" : { + "$ref" : "#/components/schemas/TicketSimpleResponse" + }, + "type" : "array" + }, + "type" : { + "example" : "incident", + "type" : "string" + }, + "write" : { + "example" : [ "alice" ], + "items" : { + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "created", "id", "modified", "name", "schema", "status", "type" ], + "type" : "object" + }, + "Type" : { + "properties" : { + "color" : { + "enum" : [ "error", "info", "success", "warning" ], + "title" : "Color", + "type" : "string", + "x-cols" : 3 + }, + "icon" : { + "title" : "Icon (https://materialdesignicons.com)", + "type" : "string", + "x-cols" : 3, + "x-class" : "pr-2" + }, + "id" : { + "title" : "ID", + "type" : "string", + "x-cols" : 3, + "x-class" : "pr-2" + }, + "name" : { + "title" : "Name", + "type" : "string", + "x-cols" : 3, + "x-class" : "pr-2" + } + }, + "required" : [ "icon", "id", "name" ], + "type" : "object" + }, + "User" : { + "properties" : { + "apikey" : { + "type" : "boolean" + }, + "blocked" : { + "type" : "boolean" + }, + "roles" : { + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "sha256" : { + "type" : "string" + } + }, + "required" : [ "apikey", "blocked", "roles" ], + "type" : "object" + }, + "UserData" : { + "properties" : { + "email" : { + "type" : "string" + }, + "image" : { + "type" : "string", + "x-display" : "custom-avatar" + }, + "name" : { + "type" : "string" + }, + "timeformat" : { + "title" : "Time Format (https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens)", + "type" : "string" + } + }, + "type" : "object" + }, + "UserDataResponse" : { + "properties" : { + "email" : { + "type" : "string" + }, + "id" : { + "type" : "string" + }, + "image" : { + "type" : "string", + "x-display" : "custom-avatar" + }, + "name" : { + "type" : "string" + }, + "timeformat" : { + "title" : "Time Format (https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens)", + "type" : "string" + } + }, + "required" : [ "id" ], + "type" : "object" + }, + "UserForm" : { + "properties" : { + "apikey" : { + "type" : "boolean" + }, + "blocked" : { + "type" : "boolean" + }, + "id" : { + "type" : "string" + }, + "roles" : { + "items" : { + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "apikey", "blocked", "id", "roles" ], + "type" : "object" + }, + "UserResponse" : { + "properties" : { + "apikey" : { + "type" : "boolean" + }, + "blocked" : { + "type" : "boolean" + }, + "id" : { + "type" : "string" + }, + "roles" : { + "items" : { + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "apikey", "blocked", "id", "roles" ], + "type" : "object" + } + } + }, + "x-original-swagger-version" : "2.0" +} \ No newline at end of file diff --git a/generated/catalyst.yml b/generated/catalyst.yml new file mode 100644 index 0000000..338752b --- /dev/null +++ b/generated/catalyst.yml @@ -0,0 +1,7058 @@ +basePath: /api +consumes: +- application/json +definitions: + Artifact: + properties: + enrichments: + additionalProperties: + $ref: '#/definitions/Enrichment' + type: object + name: + example: 2.2.2.2 + type: string + status: + example: Unknown + type: string + type: + type: string + required: + - name + type: object + ArtifactOrigin: + properties: + artifact: + type: string + ticket_id: + format: int64 + type: integer + required: + - ticket_id + - artifact + type: object + Automation: + properties: + image: + type: string + schema: + example: '{}' + type: string + script: + type: string + type: + items: + enum: + - artifact + - playbook + - global + type: string + type: array + required: + - image + - script + - type + type: object + AutomationForm: + properties: + id: + type: string + image: + type: string + schema: + example: '{}' + type: string + script: + type: string + type: + items: + enum: + - artifact + - playbook + - global + type: string + type: array + required: + - id + - image + - script + - type + type: object + AutomationResponse: + properties: + id: + type: string + image: + type: string + schema: + example: '{}' + type: string + script: + type: string + type: + items: + enum: + - artifact + - playbook + - global + type: string + type: array + required: + - id + - image + - script + - type + type: object + Comment: + properties: + created: + format: date-time + type: string + creator: + type: string + message: + type: string + required: + - creator + - created + - message + type: object + CommentForm: + properties: + created: + format: date-time + type: string + creator: + type: string + message: + type: string + required: + - message + type: object + Context: + properties: + artifact: + $ref: '#/definitions/Artifact' + playbook: + $ref: '#/definitions/PlaybookResponse' + task: + $ref: '#/definitions/TaskResponse' + ticket: + $ref: '#/definitions/TicketResponse' + type: object + Enrichment: + properties: + created: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + data: + example: + hash: b7a067a742c20d07a7456646de89bc2d408a1153 + type: object + name: + example: hash.sha1 + type: string + required: + - name + - data + - created + type: object + EnrichmentForm: + properties: + data: + example: + hash: b7a067a742c20d07a7456646de89bc2d408a1153 + type: object + name: + example: hash.sha1 + type: string + required: + - name + - data + type: object + File: + properties: + key: + example: myfile + type: string + name: + example: notes.docx + type: string + required: + - key + - name + type: object + Graph: + properties: + links: + items: + $ref: '#/definitions/Link' + type: array + nodes: + items: + $ref: '#/definitions/Node' + type: array + type: object + Group: + properties: + name: + type: string + users: + items: + type: string + type: array + required: + - name + - users + type: object + GroupForm: + properties: + id: + type: string + name: + type: string + users: + items: + type: string + type: array + required: + - name + - users + type: object + GroupResponse: + properties: + id: + type: string + name: + type: string + users: + items: + type: string + type: array + required: + - id + - name + - users + type: object + Job: + properties: + automation: + type: string + container: + type: string + log: + type: string + origin: + $ref: '#/definitions/Origin' + output: + type: object + payload: {} + running: + type: boolean + status: + type: string + required: + - automation + - running + - status + type: object + JobForm: + properties: + automation: + type: string + origin: + $ref: '#/definitions/Origin' + payload: {} + required: + - automation + type: object + JobResponse: + properties: + automation: + type: string + container: + type: string + id: + type: string + log: + type: string + origin: + $ref: '#/definitions/Origin' + output: + type: object + payload: {} + status: + type: string + required: + - id + - automation + - status + type: object + Link: + properties: + id: + type: string + sid: + type: string + tid: + type: string + required: + - id + - tid + - sid + type: object + LogEntry: + properties: + created: + format: date-time + type: string + creator: + type: string + message: + type: string + reference: + type: string + required: + - reference + - creator + - created + - message + type: object + Message: + properties: + context: + $ref: '#/definitions/Context' + payload: + type: object + secrets: + additionalProperties: + type: string + type: object + type: object + NewUserResponse: + properties: + blocked: + type: boolean + id: + type: string + roles: + items: + type: string + type: array + secret: + type: string + required: + - id + - blocked + - roles + type: object + Node: + properties: + id: + type: string + name: + type: string + required: + - id + - name + type: object + Origin: + properties: + artifact_origin: + $ref: '#/definitions/ArtifactOrigin' + task_origin: + $ref: '#/definitions/TaskOrigin' + type: object + Playbook: + properties: + name: + example: Phishing + type: string + tasks: + additionalProperties: + $ref: '#/definitions/Task' + type: object + required: + - name + - tasks + type: object + PlaybookResponse: + properties: + name: + example: Phishing + type: string + tasks: + additionalProperties: + $ref: '#/definitions/TaskResponse' + type: object + required: + - name + - tasks + type: object + PlaybookTemplate: + properties: + name: + type: string + yaml: + type: string + required: + - name + - yaml + type: object + PlaybookTemplateForm: + properties: + id: + type: string + yaml: + type: string + required: + - yaml + type: object + PlaybookTemplateResponse: + properties: + id: + type: string + name: + type: string + yaml: + type: string + required: + - id + - name + - yaml + type: object + Reference: + properties: + href: + example: https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0144 + type: string + name: + example: CVE-2017-0144 + type: string + required: + - name + - href + type: object + Rule: + properties: + condition: + type: string + name: + type: string + update: + type: object + required: + - name + - condition + - update + type: object + RuleForm: + properties: + condition: + type: string + id: + type: string + name: + type: string + update: + type: object + required: + - name + - condition + - update + type: object + RuleResponse: + properties: + condition: + type: string + id: + type: string + name: + type: string + update: + type: object + required: + - id + - name + - condition + - update + type: object + Settings: + properties: + artifactStates: + items: + $ref: '#/definitions/Type' + title: Artifact States + type: array + roles: + items: + type: string + title: Roles + type: array + ticketTypes: + items: + $ref: '#/definitions/TicketTypeResponse' + title: Ticket Types + type: array + tier: + enum: + - community + - enterprise + title: Tier + type: string + timeformat: + title: Time Format + type: string + version: + title: Version + type: string + required: + - version + - tier + - timeformat + - ticketTypes + - artifactStates + type: object + Statistics: + properties: + open_tickets_per_user: + additionalProperties: + type: integer + type: object + tickets_per_type: + additionalProperties: + type: integer + type: object + tickets_per_week: + additionalProperties: + type: integer + type: object + unassigned: + type: integer + required: + - unassigned + - open_tickets_per_user + - tickets_per_week + - tickets_per_type + type: object + Task: + properties: + automation: + type: string + closed: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + created: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + data: + type: object + done: + type: boolean + join: + example: false + type: boolean + name: + example: Inform user + type: string + next: + additionalProperties: + type: string + type: object + owner: + type: string + payload: + additionalProperties: + type: string + type: object + schema: + type: object + type: + enum: + - task + - input + - automation + example: task + type: string + required: + - name + - type + - done + - created + type: object + TaskForm: + properties: + automation: + type: string + closed: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + created: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + data: + type: object + done: + type: boolean + join: + example: false + type: boolean + name: + example: Inform user + type: string + next: + additionalProperties: + type: string + type: object + owner: + type: string + payload: + additionalProperties: + type: string + type: object + schema: + type: object + type: + enum: + - task + - input + - automation + example: task + type: string + required: + - name + - type + type: object + TaskOrigin: + properties: + playbook_id: + type: string + task_id: + type: string + ticket_id: + format: int64 + type: integer + required: + - ticket_id + - playbook_id + - task_id + type: object + TaskResponse: + properties: + active: + example: false + type: boolean + automation: + type: string + closed: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + created: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + data: + type: object + done: + type: boolean + join: + example: false + type: boolean + name: + example: Inform user + type: string + next: + additionalProperties: + type: string + type: object + order: + example: 2 + format: int64 + type: number + owner: + type: string + payload: + additionalProperties: + type: string + type: object + schema: + type: object + type: + enum: + - task + - input + - automation + example: task + type: string + required: + - name + - type + - done + - created + - order + - active + type: object + TaskWithContext: + properties: + playbook_id: + type: string + playbook_name: + type: string + task: + $ref: '#/definitions/TaskResponse' + task_id: + type: string + ticket_id: + format: int64 + type: number + ticket_name: + type: string + required: + - ticket_id + - ticket_name + - playbook_id + - playbook_name + - task_id + - task + type: object + Ticket: + properties: + artifacts: + items: + $ref: '#/definitions/Artifact' + type: array + comments: + items: + $ref: '#/definitions/Comment' + type: array + created: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + details: + example: + description: my little incident + type: object + files: + items: + $ref: '#/definitions/File' + type: array + modified: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + name: + example: WannyCry + type: string + owner: + example: bob + type: string + playbooks: + additionalProperties: + $ref: '#/definitions/Playbook' + type: object + read: + example: + - bob + items: + type: string + type: array + references: + items: + $ref: '#/definitions/Reference' + type: array + schema: + example: '{}' + type: string + status: + example: open + type: string + type: + example: incident + type: string + write: + example: + - alice + items: + type: string + type: array + required: + - name + - type + - status + - created + - modified + - schema + type: object + TicketForm: + properties: + artifacts: + items: + $ref: '#/definitions/Artifact' + type: array + comments: + items: + $ref: '#/definitions/Comment' + type: array + created: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + details: + example: + description: my little incident + type: object + files: + items: + $ref: '#/definitions/File' + type: array + id: + example: 123 + format: int64 + type: integer + modified: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + name: + example: WannyCry + type: string + owner: + example: bob + type: string + playbooks: + items: + $ref: '#/definitions/PlaybookTemplateForm' + type: array + read: + example: + - bob + items: + type: string + type: array + references: + items: + $ref: '#/definitions/Reference' + type: array + schema: + example: '{}' + type: string + status: + example: open + type: string + type: + example: incident + type: string + write: + example: + - alice + items: + type: string + type: array + required: + - name + - type + - status + type: object + TicketList: + properties: + count: + example: 3 + type: number + tickets: + items: + $ref: '#/definitions/TicketSimpleResponse' + type: array + required: + - tickets + - count + type: object + TicketResponse: + properties: + artifacts: + items: + $ref: '#/definitions/Artifact' + type: array + comments: + items: + $ref: '#/definitions/Comment' + type: array + created: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + details: + example: + description: my little incident + type: object + files: + items: + $ref: '#/definitions/File' + type: array + id: + example: 123 + format: int64 + type: integer + modified: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + name: + example: WannyCry + type: string + owner: + example: bob + type: string + playbooks: + additionalProperties: + $ref: '#/definitions/PlaybookResponse' + type: object + read: + example: + - bob + items: + type: string + type: array + references: + items: + $ref: '#/definitions/Reference' + type: array + schema: + example: '{}' + type: string + status: + example: open + type: string + type: + example: incident + type: string + write: + example: + - alice + items: + type: string + type: array + required: + - id + - name + - type + - status + - created + - modified + - schema + type: object + TicketSimpleResponse: + properties: + artifacts: + items: + $ref: '#/definitions/Artifact' + type: array + comments: + items: + $ref: '#/definitions/Comment' + type: array + created: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + details: + example: + description: my little incident + type: object + files: + items: + $ref: '#/definitions/File' + type: array + id: + example: 123 + format: int64 + type: integer + modified: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + name: + example: WannyCry + type: string + owner: + example: bob + type: string + playbooks: + additionalProperties: + $ref: '#/definitions/Playbook' + type: object + read: + example: + - bob + items: + type: string + type: array + references: + items: + $ref: '#/definitions/Reference' + type: array + schema: + example: '{}' + type: string + status: + example: open + type: string + type: + example: incident + type: string + write: + example: + - alice + items: + type: string + type: array + required: + - id + - name + - type + - status + - created + - modified + - schema + type: object + TicketTemplate: + properties: + name: + type: string + schema: + type: string + required: + - name + - schema + type: object + TicketTemplateForm: + properties: + id: + type: string + name: + type: string + schema: + type: string + required: + - name + - schema + type: object + TicketTemplateResponse: + properties: + id: + type: string + name: + type: string + schema: + type: string + required: + - id + - name + - schema + type: object + TicketType: + properties: + default_groups: + items: + type: string + type: array + default_playbooks: + items: + type: string + type: array + default_template: + type: string + icon: + type: string + name: + type: string + required: + - name + - icon + - default_template + - default_playbooks + type: object + TicketTypeForm: + properties: + default_groups: + items: + type: string + type: array + default_playbooks: + items: + type: string + type: array + default_template: + type: string + icon: + type: string + id: + type: string + name: + type: string + required: + - name + - icon + - default_template + - default_playbooks + type: object + TicketTypeResponse: + properties: + default_groups: + items: + type: string + type: array + default_playbooks: + items: + type: string + type: array + default_template: + type: string + icon: + type: string + id: + type: string + name: + type: string + required: + - id + - name + - icon + - default_template + - default_playbooks + type: object + TicketWithTickets: + properties: + artifacts: + items: + $ref: '#/definitions/Artifact' + type: array + comments: + items: + $ref: '#/definitions/Comment' + type: array + created: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + details: + example: + description: my little incident + type: object + files: + items: + $ref: '#/definitions/File' + type: array + id: + example: 123 + format: int64 + type: integer + modified: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + name: + example: WannyCry + type: string + owner: + example: bob + type: string + playbooks: + additionalProperties: + $ref: '#/definitions/PlaybookResponse' + type: object + read: + example: + - bob + items: + type: string + type: array + references: + items: + $ref: '#/definitions/Reference' + type: array + schema: + example: '{}' + type: string + status: + example: open + type: string + tickets: + items: + $ref: '#/definitions/TicketSimpleResponse' + type: array + type: + example: incident + type: string + write: + example: + - alice + items: + type: string + type: array + required: + - id + - name + - type + - status + - created + - modified + - schema + type: object + Type: + properties: + color: + enum: + - error + - info + - success + - warning + title: Color + type: string + x-cols: 3 + icon: + title: Icon (https://materialdesignicons.com) + type: string + x-class: pr-2 + x-cols: 3 + id: + title: ID + type: string + x-class: pr-2 + x-cols: 3 + name: + title: Name + type: string + x-class: pr-2 + x-cols: 3 + required: + - id + - name + - icon + type: object + User: + properties: + apikey: + type: boolean + blocked: + type: boolean + roles: + items: + type: string + type: array + sha256: + type: string + required: + - blocked + - apikey + - roles + type: object + UserData: + properties: + email: + type: string + x-example: bob@example.org + image: + type: string + x-display: custom-avatar + name: + type: string + x-example: Robert Smith + timeformat: + title: Time Format (https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens) + type: string + type: object + UserDataResponse: + properties: + email: + type: string + x-example: bob@example.org + id: + type: string + image: + type: string + x-display: custom-avatar + name: + type: string + x-example: Robert Smith + timeformat: + title: Time Format (https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens) + type: string + required: + - id + type: object + UserForm: + properties: + apikey: + type: boolean + blocked: + type: boolean + id: + type: string + roles: + items: + type: string + type: array + required: + - id + - blocked + - roles + - apikey + type: object + UserResponse: + properties: + apikey: + type: boolean + blocked: + type: boolean + id: + type: string + roles: + items: + type: string + type: array + required: + - id + - blocked + - roles + - apikey + type: object +host: . +info: + description: API for the catalyst incident response platform. + title: "" + version: "" +paths: + /automations: + get: + operationId: listAutomations + responses: + "200": + description: successful operation + examples: + test: + - id: comment + image: docker.io/python:3 + script: "" + type: + - playbook + - id: hash.sha1 + image: docker.io/python:3 + schema: '{"title":"Input","type":"object","properties":{"default":{"type":"string","title":"Value"}},"required":["default"]}' + script: "" + type: + - global + - artifact + - playbook + - id: thehive + image: docker.io/python:3 + schema: '{"title":"TheHive credentials","type":"object","properties":{"thehiveurl":{"type":"string","title":"TheHive + URL (e.g. ''https://thehive.example.org'')"},"thehivekey":{"type":"string","title":"TheHive + API Key"},"skip_files":{"type":"boolean", "default": true, "title":"Skip + Files (much faster)"},"keep_ids":{"type":"boolean", "default": true, + "title":"Keep IDs and overwrite existing IDs"}},"required":["thehiveurl", + "thehivekey", "skip_files", "keep_ids"]}' + script: "" + type: + - global + - id: vt.hash + image: docker.io/python:3 + schema: '{"title":"Input","type":"object","properties":{"default":{"type":"string","title":"Value"}},"required":["default"]}' + script: "" + type: + - global + - artifact + - playbook + schema: + items: + $ref: '#/definitions/AutomationResponse' + type: array + security: + - roles: + - automation:read + summary: List automations + tags: + - automations + post: + operationId: createAutomation + parameters: + - description: New automation + in: body + name: automation + required: true + schema: + $ref: '#/definitions/AutomationForm' + x-example: + id: hash-sha-256 + image: docker.io/python:3 + script: | + import sys + import json + import hashlib + + + def run(msg): + sha256 = hashlib.sha256(msg['payload']['default'].encode('utf-8')) + return {'hash': sha256.hexdigest()} + + + print(json.dumps(run(json.loads(sys.argv[1])))) + type: + - global + responses: + "200": + description: successful operation + examples: + test: + id: hash-sha-256 + image: docker.io/python:3 + script: | + import sys + import json + import hashlib + + + def run(msg): + sha256 = hashlib.sha256(msg['payload']['default'].encode('utf-8')) + return {'hash': sha256.hexdigest()} + + + print(json.dumps(run(json.loads(sys.argv[1])))) + type: + - global + schema: + $ref: '#/definitions/AutomationResponse' + security: + - roles: + - automation:write + summary: Create a new automation + tags: + - automations + /automations/{id}: + delete: + operationId: deleteAutomation + parameters: + - description: Automation ID + in: path + name: id + required: true + type: string + x-example: hash.sha1 + responses: + "204": + description: successful operation + security: + - roles: + - automation:write + summary: Delete a automation + tags: + - automations + get: + operationId: getAutomation + parameters: + - description: Automation ID + in: path + name: id + required: true + type: string + x-example: hash.sha1 + responses: + "200": + description: successful operation + examples: + test: + id: hash.sha1 + image: docker.io/python:3 + schema: '{"title":"Input","type":"object","properties":{"default":{"type":"string","title":"Value"}},"required":["default"]}' + script: | + #!/usr/bin/env python + + import sys + import json + import hashlib + + + def run(msg): + sha1 = hashlib.sha1(msg['payload']['default'].encode('utf-8')) + return {"hash": sha1.hexdigest()} + + + print(json.dumps(run(json.loads(sys.argv[1])))) + type: + - global + - artifact + - playbook + schema: + $ref: '#/definitions/AutomationResponse' + security: + - roles: + - automation:read + summary: Get a single automation + tags: + - automations + put: + operationId: updateAutomation + parameters: + - description: Automation ID + in: path + name: id + required: true + type: string + x-example: hash.sha1 + - description: Automation object that needs to be added + in: body + name: automation + required: true + schema: + $ref: '#/definitions/AutomationForm' + x-example: + id: hash.sha1 + image: docker.io/python:3 + script: | + import sys + import json + import hashlib + + + def run(msg): + sha1 = hashlib.sha1(msg['payload'].encode('utf-8')) + return {'hash': sha1.hexdigest()} + + + print(json.dumps(run(json.loads(sys.argv[1])))) + type: + - global + - artifact + - playbook + responses: + "200": + description: successful operation + examples: + test: + id: hash.sha1 + image: docker.io/python:3 + script: | + import sys + import json + import hashlib + + + def run(msg): + sha1 = hashlib.sha1(msg['payload'].encode('utf-8')) + return {'hash': sha1.hexdigest()} + + + print(json.dumps(run(json.loads(sys.argv[1])))) + type: + - global + - artifact + - playbook + schema: + $ref: '#/definitions/AutomationResponse' + security: + - roles: + - automation:write + summary: Update an existing automation + tags: + - automations + /currentuser: + get: + operationId: currentUser + responses: + "200": + description: successful operation + examples: + test: + apikey: false + blocked: false + id: bob + roles: + - admin:backup:read + - admin:backup:restore + - admin:group:write + - admin:job:read + - admin:job:write + - admin:log:read + - admin:ticket:delete + - admin:user:write + - admin:userdata:read + - admin:userdata:write + - analyst:automation:read + - analyst:currentsettings:write + - analyst:currentuser:read + - analyst:currentuserdata:read + - analyst:file + - analyst:group:read + - analyst:playbook:read + - analyst:rule:read + - analyst:settings:read + - analyst:template:read + - analyst:ticket:read + - analyst:ticket:write + - analyst:tickettype:read + - analyst:user:read + - engineer:automation:write + - engineer:playbook:write + - engineer:rule:write + - engineer:template:write + - engineer:tickettype:write + schema: + $ref: '#/definitions/UserResponse' + security: + - roles: + - currentuser:read + summary: Get current user + tags: + - users + /currentuserdata: + get: + operationId: currentUserData + responses: + "200": + description: successful operation + examples: + test: + email: bob@example.org + id: bob + name: Bob Bad + schema: + $ref: '#/definitions/UserDataResponse' + security: + - roles: + - currentuserdata:read + summary: Get current user data + tags: + - userdata + put: + operationId: updateCurrentUserData + parameters: + - description: User data object that needs to be added + in: body + name: userdata + required: true + schema: + $ref: '#/definitions/UserData' + x-example: + email: bob@example.org + name: Bob Bad + responses: + "200": + description: successful operation + examples: + test: + email: bob@example.org + id: bob + name: Bob Bad + schema: + $ref: '#/definitions/UserDataResponse' + security: + - roles: + - currentuserdata:write + summary: Update current user data + tags: + - userdata + /graph/{col}/{id}: + get: + operationId: graph + parameters: + - description: Graph Start + in: path + name: col + required: true + type: string + x-example: tickets + - description: Graph Start + in: path + name: id + required: true + type: string + x-example: "88" + - description: Graph Start + in: query + name: depth + required: true + type: integer + x-example: 1 + responses: + "200": + description: successful operation + examples: + test: + links: + - id: "296239" + sid: tickets/88 + tid: artifacts/http%3A%2F%2Fwww.customerviral.io%2Fscalable%2Fvertical%2Fkiller + - id: "296240" + sid: tickets/88 + tid: artifacts/leadreintermediate.io + - id: "296242" + sid: tickets/88 + tid: artifacts/94d5cab6f5fe3422a447ab15436e7a672bc0c09a + nodes: + - id: artifacts/94d5cab6f5fe3422a447ab15436e7a672bc0c09a + name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + - id: artifacts/http%3A%2F%2Fwww.customerviral.io%2Fscalable%2Fvertical%2Fkiller + name: http://www.customerviral.io/scalable/vertical/killer + - id: artifacts/leadreintermediate.io + name: leadreintermediate.io + - id: tickets/88 + name: live zebra + schema: + $ref: '#/definitions/Graph' + security: + - roles: + - ticket:read + summary: Graph + tags: + - graph + /groups: + get: + operationId: listGroups + responses: + "200": + description: successful operation + schema: + items: + $ref: '#/definitions/Group' + type: array + security: + - roles: + - group:read + summary: List groups + tags: + - groups + post: + operationId: createGroup + parameters: + - description: New group + in: body + name: group + required: true + schema: + $ref: '#/definitions/GroupForm' + responses: + "200": + description: successful operation + schema: + $ref: '#/definitions/GroupResponse' + security: + - roles: + - group:write + summary: Create a new group + tags: + - groups + /groups/{id}: + delete: + operationId: deleteGroup + parameters: + - description: Group ID + in: path + name: id + required: true + type: string + responses: + "204": + description: successful operation + security: + - roles: + - group:write + summary: Delete a group + tags: + - groups + get: + operationId: getGroup + parameters: + - description: Group ID + in: path + name: id + required: true + type: string + responses: + "200": + description: successful operation + schema: + $ref: '#/definitions/GroupResponse' + security: + - roles: + - group:read + summary: Get a single group + tags: + - groups + put: + operationId: updateGroup + parameters: + - description: Group ID + in: path + name: id + required: true + type: string + - description: Group object that needs to be added + in: body + name: group + required: true + schema: + $ref: '#/definitions/Group' + responses: + "200": + description: successful operation + schema: + $ref: '#/definitions/Group' + security: + - roles: + - group:write + summary: Update an existing group + tags: + - groups + /jobs: + get: + operationId: listJobs + responses: + "200": + description: successful operation + examples: + test: + - automation: hash.sha1 + id: 99cd67131b48 + payload: test + status: created + schema: + items: + $ref: '#/definitions/JobResponse' + type: array + security: + - roles: + - job:read + summary: List jobs + tags: + - jobs + post: + operationId: runJob + parameters: + - description: New job + in: body + name: job + required: true + schema: + $ref: '#/definitions/JobForm' + x-example: + automation: hash.sha1 + message: + payload: test + responses: + "204": + description: successful operation + security: + - roles: + - job:write + summary: Start a new job + tags: + - jobs + /jobs/{id}: + get: + operationId: getJob + parameters: + - description: Job ID + in: path + name: id + required: true + type: string + x-example: 99cd67131b48 + responses: + "200": + description: successful operation + examples: + test: + automation: hash.sha1 + id: 99cd67131b48 + payload: test + status: created + schema: + $ref: '#/definitions/JobResponse' + security: + - roles: + - job:read + summary: Get a single job + tags: + - jobs + put: + operationId: updateJob + parameters: + - description: Job ID + in: path + name: id + required: true + type: string + x-example: 99cd67131b48 + - description: Job object that needs to be added + in: body + name: job + required: true + schema: + $ref: '#/definitions/Job' + x-example: + automation: hash.sha1 + id: 99cd67131b48 + payload: test + status: failed + responses: + "200": + description: successful operation + examples: + test: + automation: hash.sha1 + id: 99cd67131b48 + payload: test + status: failed + schema: + $ref: '#/definitions/JobResponse' + security: + - roles: + - job:write + summary: Update an existing job + tags: + - jobs + /logs/{reference}: + get: + operationId: getLogs + parameters: + - description: Reference + in: path + name: reference + required: true + type: string + x-example: tickets%2F294511 + responses: + "200": + description: successful operation + examples: + test: + - created: 2021-10-02T18:05:00.333535+02:00 + creator: bob + message: Fail run account resist lend solve incident centre priority + temperature. Cause change distribution examine location technique + shape partner milk customer. Rail tea plate soil report cook railway + interpretation breath action. Exercise dream accept park conclusion + addition shoot assistance may answer. Gold writer link stop combine + hear power name commitment operation. Determine lifespan support grow + degree henry exclude detail set religion. Direct library policy convention + chain retain discover ride walk student. Gather proposal select march + aspect play noise avoid encourage employ. Assessment preserve transport + combine wish influence income guess run stand. Charge limit crime + ignore statement foundation study issue stop claim. + reference: tickets/294511 + schema: + items: + $ref: '#/definitions/LogEntry' + type: array + security: + - roles: + - log:read + summary: Get log entries + tags: + - logs + /playbooks: + get: + operationId: listPlaybooks + responses: + "200": + description: successful operation + examples: + test: + - id: malware + name: Malware + yaml: | + name: Malware + tasks: + file-or-hash: + name: Do you have the file or the hash? + type: input + schema: + title: Malware + type: object + properties: + file: + type: string + title: "I have the" + enum: [ "File", "Hash" ] + next: + enter-hash: "file == 'Hash'" + upload: "file == 'File'" + + enter-hash: + name: Please enter the hash + type: input + schema: + title: Malware + type: object + properties: + hash: + type: string + title: Please enter the hash value + minlength: 32 + next: + virustotal: "hash != ''" + + upload: + name: Upload the malware + type: input + schema: + title: Malware + type: object + properties: + malware: + type: object + x-display: file + title: Please upload the malware + next: + hash: "malware" + + hash: + name: Hash the malware + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['upload'].data['malware']" + next: + virustotal: + + virustotal: + name: Send hash to VirusTotal + type: automation + automation: vt.hash + args: + hash: "playbook.tasks['enter-hash'].data['hash'] || playbook.tasks['hash'].data['hash']" + # next: + # known-malware: "score > 5" + # sandbox: "score < 6" # unknown-malware + - id: phishing + name: Phishing + yaml: | + name: Phishing + tasks: + board: + name: Board Involvement? + description: Is a board member involved? + type: input + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + next: + escalate: "boardInvolved == true" + mail-available: "boardInvolved == false" + + escalate: + name: Escalate to CISO + description: Please escalate the task to the CISO + type: task + + mail-available: + name: Mail available + type: input + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: 'yes' + type: string + required: + - mail + title: 'Yes' + - properties: + schemaKey: + const: 'no' + type: string + title: 'No' + title: Mail available + type: object + next: + block-sender: "schemaKey == 'yes'" + extract-iocs: "schemaKey == 'yes'" + search-email-gateway: "schemaKey == 'no'" + + search-email-gateway: + name: Search email gateway + description: Please search email-gateway for the phishing mail. + type: task + next: + extract-iocs: + + block-sender: + name: Block sender + type: task + next: + extract-iocs: + + extract-iocs: + name: Extract IOCs + description: Please insert the IOCs + type: input + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + next: + block-iocs: + + block-iocs: + name: Block IOCs + type: task + - id: simple + name: Simple + yaml: | + name: Simple + tasks: + input: + name: Enter something to hash + type: input + schema: + title: Something + type: object + properties: + something: + type: string + title: Something + default: "" + next: + hash: "something != ''" + + hash: + name: Hash the something + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['input'].data['something']" + next: + comment: "hash != ''" + + comment: + name: Comment the hash + type: automation + automation: comment + payload: + default: "playbook.tasks['hash'].data['hash']" + next: + done: "done" + + done: + name: You can close this case now + type: task + schema: + items: + $ref: '#/definitions/PlaybookTemplateResponse' + type: array + security: + - roles: + - playbook:read + summary: List playbooks + tags: + - playbooks + post: + operationId: createPlaybook + parameters: + - description: New playbook + in: body + name: playbook + required: true + schema: + $ref: '#/definitions/PlaybookTemplateForm' + x-example: + yaml: | + name: Simple2 + tasks: + input: + name: Upload malware if possible + type: input + schema: + title: Malware + type: object + properties: + malware: + type: string + title: Select malware + default: "" + next: + hash: "malware != ''" + + hash: + name: Hash the malware + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['input'].data['malware']" + next: + escalate: + + escalate: + name: Escalate to malware team + type: task + responses: + "200": + description: successful operation + examples: + test: + id: simple-2 + name: Simple2 + yaml: | + name: Simple2 + tasks: + input: + name: Upload malware if possible + type: input + schema: + title: Malware + type: object + properties: + malware: + type: string + title: Select malware + default: "" + next: + hash: "malware != ''" + + hash: + name: Hash the malware + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['input'].data['malware']" + next: + escalate: + + escalate: + name: Escalate to malware team + type: task + schema: + items: + $ref: '#/definitions/PlaybookTemplateResponse' + type: array + security: + - roles: + - playbook:write + summary: Create a playbook + tags: + - playbooks + /playbooks/{id}: + delete: + operationId: deletePlaybook + parameters: + - description: Playbook name + in: path + name: id + required: true + type: string + x-example: simple + responses: + "204": + description: successful operation + security: + - roles: + - playbook:write + summary: Delete a playbook + tags: + - playbooks + get: + operationId: getPlaybook + parameters: + - description: Playbook name + in: path + name: id + required: true + type: string + x-example: simple + responses: + "200": + description: successful operation + examples: + test: + id: simple + name: Simple + yaml: | + name: Simple + tasks: + input: + name: Enter something to hash + type: input + schema: + title: Something + type: object + properties: + something: + type: string + title: Something + default: "" + next: + hash: "something != ''" + + hash: + name: Hash the something + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['input'].data['something']" + next: + comment: "hash != ''" + + comment: + name: Comment the hash + type: automation + automation: comment + payload: + default: "playbook.tasks['hash'].data['hash']" + next: + done: "done" + + done: + name: You can close this case now + type: task + schema: + $ref: '#/definitions/PlaybookTemplateResponse' + security: + - roles: + - playbook:read + summary: Get a single playbook + tags: + - playbooks + put: + operationId: updatePlaybook + parameters: + - description: Playbook ID + in: path + name: id + required: true + type: string + x-example: simple + - description: Updated playbook + in: body + name: playbook + required: true + schema: + $ref: '#/definitions/PlaybookTemplateForm' + x-example: + yaml: | + name: Simple + tasks: + input: + name: Upload malware if possible + type: input + schema: + title: Malware + type: object + properties: + malware: + type: string + title: Select malware + default: "" + next: + hash: "malware != ''" + + hash: + name: Hash the malware + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['input'].data['malware']" + next: + escalate: + + escalate: + name: Escalate to malware team + type: task + responses: + "200": + description: successful operation + examples: + test: + id: simple + name: Simple + yaml: | + name: Simple + tasks: + input: + name: Upload malware if possible + type: input + schema: + title: Malware + type: object + properties: + malware: + type: string + title: Select malware + default: "" + next: + hash: "malware != ''" + + hash: + name: Hash the malware + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['input'].data['malware']" + next: + escalate: + + escalate: + name: Escalate to malware team + type: task + schema: + $ref: '#/definitions/PlaybookTemplateResponse' + security: + - roles: + - playbook:write + summary: Update an existing ticket playbook + tags: + - playbooks + /rules: + get: + operationId: listRules + responses: + "200": + description: successful operation + examples: + test: + - condition: type == 'alert' + id: ignore-alerts + name: Ignore Alerts + update: + status: closed + schema: + items: + $ref: '#/definitions/RuleResponse' + type: array + security: + - roles: + - rule:read + summary: List rules + tags: + - rules + post: + operationId: createRule + parameters: + - description: New rule + in: body + name: rule + required: true + schema: + $ref: '#/definitions/RuleForm' + x-example: + condition: type == 'alert' + name: Ignore all Alerts + update: + status: closed + responses: + "200": + description: successful operation + examples: + test: + condition: type == 'alert' + id: ignore-all-alerts + name: Ignore all Alerts + update: + status: closed + schema: + items: + $ref: '#/definitions/RuleResponse' + type: array + security: + - roles: + - rule:write + summary: Create a rule + tags: + - rules + /rules/{id}: + delete: + operationId: deleteRule + parameters: + - description: Rule name + in: path + name: id + required: true + type: string + x-example: ignore-alerts + responses: + "204": + description: successful operation + security: + - roles: + - rule:write + summary: Delete a rule + tags: + - rules + get: + operationId: getRule + parameters: + - description: Rule name + in: path + name: id + required: true + type: string + x-example: ignore-alerts + responses: + "200": + description: successful operation + examples: + test: + condition: type == 'alert' + id: ignore-alerts + name: Ignore Alerts + update: + status: closed + schema: + $ref: '#/definitions/RuleResponse' + security: + - roles: + - rule:read + summary: Get a single rule + tags: + - rules + put: + operationId: updateRule + parameters: + - description: Rule ID + in: path + name: id + required: true + type: string + x-example: ignore-alerts + - description: Updated rule + in: body + name: rule + required: true + schema: + $ref: '#/definitions/RuleForm' + x-example: + condition: type == 'alert' + name: Ignore Alerts + update: + status: invalid + responses: + "200": + description: successful operation + examples: + test: + condition: type == 'alert' + id: ignore-alerts + name: Ignore Alerts + update: + status: invalid + schema: + $ref: '#/definitions/RuleResponse' + security: + - roles: + - rule:write + summary: Update an existing ticket rule + tags: + - rules + /settings: + get: + operationId: getSettings + responses: + "200": + description: successful operation + examples: + test: + artifactStates: + - color: info + icon: mdi-help-circle-outline + id: unknown + name: Unknown + - color: error + icon: mdi-skull + id: malicious + name: Malicious + - color: success + icon: mdi-check + id: clean + name: Clean + roles: + - admin:backup:read + - admin:backup:restore + - admin:group:write + - admin:job:read + - admin:job:write + - admin:log:read + - admin:ticket:delete + - admin:user:write + - admin:userdata:read + - admin:userdata:write + - analyst:automation:read + - analyst:currentsettings:write + - analyst:currentuser:read + - analyst:currentuserdata:read + - analyst:file + - analyst:group:read + - analyst:playbook:read + - analyst:rule:read + - analyst:settings:read + - analyst:template:read + - analyst:ticket:read + - analyst:ticket:write + - analyst:tickettype:read + - analyst:user:read + - engineer:automation:write + - engineer:playbook:write + - engineer:rule:write + - engineer:template:write + - engineer:tickettype:write + ticketTypes: + - default_playbooks: [] + default_template: default + icon: mdi-alert + id: alert + name: Alerts + - default_playbooks: [] + default_template: default + icon: mdi-radioactive + id: incident + name: Incidents + - default_playbooks: [] + default_template: default + icon: mdi-fingerprint + id: investigation + name: Forensic Investigations + - default_playbooks: [] + default_template: default + icon: mdi-target + id: hunt + name: Threat Hunting + tier: community + timeformat: YYYY-MM-DDThh:mm:ss + version: 0.0.0-test + schema: + $ref: '#/definitions/Settings' + security: + - roles: + - settings:read + summary: Get settings + tags: + - settings + /statistics: + get: + operationId: getStatistics + responses: + "200": + description: successful operation + examples: + test: + open_tickets_per_user: {} + tickets_per_type: + alert: 2 + incident: 1 + tickets_per_week: + 2021-39: 3 + unassigned: 0 + schema: + $ref: '#/definitions/Statistics' + security: + - roles: + - ticket:read + summary: Get statistics + tags: + - statistics + /tasks: + get: + operationId: listTasks + responses: + "200": + description: successful operation + examples: + test: [] + schema: + items: + $ref: '#/definitions/TaskResponse' + type: array + security: + - roles: + - ticket:read + summary: List tasks + tags: + - tasks + /templates: + get: + operationId: listTemplates + responses: + "200": + description: successful operation + examples: + test: + - id: default + name: Default + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Default", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + schema: + items: + $ref: '#/definitions/TicketTemplateResponse' + type: array + security: + - roles: + - template:read + summary: List templates + tags: + - templates + post: + operationId: createTemplate + parameters: + - description: New template + in: body + name: template + required: true + schema: + $ref: '#/definitions/TicketTemplateForm' + x-example: + name: My Template + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + responses: + "200": + description: successful operation + examples: + test: + id: my-template + name: My Template + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + schema: + $ref: '#/definitions/TicketTemplateResponse' + security: + - roles: + - template:write + summary: Create a new template + tags: + - templates + /templates/{id}: + delete: + operationId: deleteTemplate + parameters: + - description: Template ID + in: path + name: id + required: true + type: string + x-example: default + responses: + "204": + description: successful operation + security: + - roles: + - template:write + summary: Delete a template + tags: + - templates + get: + operationId: getTemplate + parameters: + - description: Template ID + in: path + name: id + required: true + type: string + x-example: default + responses: + "200": + description: successful operation + examples: + test: + id: default + name: Default + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Default", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + schema: + $ref: '#/definitions/TicketTemplateResponse' + security: + - roles: + - template:read + summary: Get a single template + tags: + - templates + put: + operationId: updateTemplate + parameters: + - description: Template ID + in: path + name: id + required: true + type: string + x-example: default + - description: Template object that needs to be added + in: body + name: template + required: true + schema: + $ref: '#/definitions/TicketTemplateForm' + x-example: + name: My Template + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + responses: + "200": + description: successful operation + examples: + test: + id: default + name: My Template + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + schema: + $ref: '#/definitions/TicketTemplateResponse' + security: + - roles: + - template:write + summary: Update an existing template + tags: + - templates + /tickets: + get: + operationId: listTickets + parameters: + - description: Ticket Type + in: query + name: type + type: string + - default: 0 + description: Offset of the list + in: query + name: offset + type: integer + - default: 25 + description: Number of tickets + in: query + maximum: 100 + name: count + type: integer + - description: Sort columns + in: query + items: + type: string + name: sort + type: array + - description: Sort descending + in: query + items: + type: boolean + name: desc + type: array + - description: Search query + in: query + name: query + type: string + responses: + "200": + description: successful operation + examples: + test: + count: 3 + tickets: + - artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + - name: leadreintermediate.io + status: malicious + created: 2021-10-02T18:04:59.078206+02:00 + id: 8123 + modified: 2021-10-02T18:04:59.078206+02:00 + name: live zebra + owner: demo + playbooks: + phishing: + name: Phishing + tasks: + block-iocs: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block IOCs + type: task + block-sender: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block sender + next: + extract-iocs: "" + type: task + board: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + escalate: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to CISO + type: task + extract-iocs: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Extract IOCs + next: + block-iocs: "" + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + type: input + mail-available: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Mail available + next: + block-sender: schemaKey == 'yes' + extract-iocs: schemaKey == 'yes' + search-email-gateway: schemaKey == 'no' + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: "yes" + type: string + required: + - mail + title: "Yes" + - properties: + schemaKey: + const: "no" + type: string + title: "No" + title: Mail available + type: object + type: input + search-email-gateway: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Search email gateway + next: + extract-iocs: "" + type: task + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8125 + modified: 2021-10-02T18:04:59.078186+02:00 + name: phishing from selenafadel@von.com detected + owner: demo + references: + - href: https://www.seniorleading-edge.name/users/efficient + name: recovery + - href: http://www.dynamicseamless.com/clicks-and-mortar + name: force + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + type: alert + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + type: alert + schema: + $ref: '#/definitions/TicketList' + security: + - roles: + - ticket:read + summary: List tickets + tags: + - tickets + post: + operationId: createTicket + parameters: + - description: New ticket + in: body + name: ticket + required: true + schema: + $ref: '#/definitions/TicketForm' + x-example: + id: 123 + name: Wannacry infection + owner: bob + status: open + type: incident + responses: + "200": + description: successful operation + examples: + test: + created: 1985-04-12T23:20:50.52Z + id: 123 + modified: 1985-04-12T23:20:50.52Z + name: Wannacry infection + owner: bob + schema: '{}' + status: open + type: incident + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Create a new ticket + tags: + - tickets + /tickets/{id}: + delete: + operationId: deleteTicket + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8125 + responses: + "204": + description: successful operation + security: + - roles: + - ticket:delete + summary: Delete an ticket + tags: + - tickets + get: + operationId: getTicket + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8125 + responses: + "200": + description: successful operation + examples: + test: + created: 2021-10-02T18:04:59.078186+02:00 + id: 8125 + modified: 2021-10-02T18:04:59.078186+02:00 + name: phishing from selenafadel@von.com detected + owner: demo + references: + - href: https://www.seniorleading-edge.name/users/efficient + name: recovery + - href: http://www.dynamicseamless.com/clicks-and-mortar + name: force + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + tickets: + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + type: alert + type: alert + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:read + summary: Get a single ticket + tags: + - tickets + put: + operationId: updateTicket + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8125 + - description: Updated ticket + in: body + name: ticket + required: true + schema: + $ref: '#/definitions/Ticket' + x-example: + created: 2021-10-02T18:04:59.078186+02:00 + modified: 2021-10-02T18:04:59.078186+02:00 + name: phishing from selenafadel@von.org detected + owner: demo + references: + - href: https://www.seniorleading-edge.name/users/efficient + name: recovery + - href: http://www.dynamicseamless.com/clicks-and-mortar + name: force + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + type: alert + responses: + "200": + description: successful operation + examples: + test: + created: 2021-10-02T18:04:59.078186+02:00 + id: 8125 + modified: 2021-10-02T18:04:59.078186+02:00 + name: phishing from selenafadel@von.org detected + owner: demo + references: + - href: https://www.seniorleading-edge.name/users/efficient + name: recovery + - href: http://www.dynamicseamless.com/clicks-and-mortar + name: force + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + tickets: + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + type: alert + type: alert + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Update an existing ticket + tags: + - tickets + /tickets/{id}/artifacts: + post: + operationId: addArtifact + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - description: Artifact object that needs to be added + in: body + name: artifact + required: true + schema: + $ref: '#/definitions/Artifact' + x-example: + name: 2.2.2.2 + responses: + "200": + description: successful operation + examples: + test: + artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + - name: leadreintermediate.io + status: malicious + - name: 2.2.2.2 + status: unknown + type: ip + created: 2021-10-02T18:04:59.078206+02:00 + id: 8123 + modified: 2021-10-02T18:04:59.078206+02:00 + name: live zebra + owner: demo + playbooks: + phishing: + name: Phishing + tasks: + block-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block IOCs + order: 6 + type: task + block-sender: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block sender + next: + extract-iocs: "" + order: 3 + type: task + board: + active: true + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + order: 0 + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + escalate: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to CISO + order: 1 + type: task + extract-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Extract IOCs + next: + block-iocs: "" + order: 5 + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + type: input + mail-available: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Mail available + next: + block-sender: schemaKey == 'yes' + extract-iocs: schemaKey == 'yes' + search-email-gateway: schemaKey == 'no' + order: 2 + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: "yes" + type: string + required: + - mail + title: "Yes" + - properties: + schemaKey: + const: "no" + type: string + title: "No" + title: Mail available + type: object + type: input + search-email-gateway: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Search email gateway + next: + extract-iocs: "" + order: 4 + type: task + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Add a single artifact + tags: + - tickets + /tickets/{id}/artifacts/{name}: + delete: + operationId: removeArtifact + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - in: path + name: name + required: true + type: string + x-example: leadreintermediate.io + responses: + "200": + description: successful operation + examples: + test: + artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + created: 2021-10-02T18:04:59.078206+02:00 + id: 8123 + modified: 2021-10-02T18:04:59.078206+02:00 + name: live zebra + owner: demo + playbooks: + phishing: + name: Phishing + tasks: + block-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block IOCs + order: 6 + type: task + block-sender: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block sender + next: + extract-iocs: "" + order: 3 + type: task + board: + active: true + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + order: 0 + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + escalate: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to CISO + order: 1 + type: task + extract-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Extract IOCs + next: + block-iocs: "" + order: 5 + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + type: input + mail-available: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Mail available + next: + block-sender: schemaKey == 'yes' + extract-iocs: schemaKey == 'yes' + search-email-gateway: schemaKey == 'no' + order: 2 + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: "yes" + type: string + required: + - mail + title: "Yes" + - properties: + schemaKey: + const: "no" + type: string + title: "No" + title: Mail available + type: object + type: input + search-email-gateway: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Search email gateway + next: + extract-iocs: "" + order: 4 + type: task + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Remove an artifact + tags: + - tickets + get: + operationId: getArtifact + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - in: path + name: name + required: true + type: string + x-example: leadreintermediate.io + responses: + "200": + description: successful operation + examples: + test: + name: leadreintermediate.io + status: malicious + schema: + $ref: '#/definitions/Artifact' + security: + - roles: + - ticket:write + summary: Get a single artifact + tags: + - tickets + put: + operationId: setArtifact + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - in: path + name: name + required: true + type: string + x-example: leadreintermediate.io + - in: body + name: artifact + required: true + schema: + $ref: '#/definitions/Artifact' + x-example: + name: leadreintermediate.io + status: clean + responses: + "200": + description: successful operation + examples: + test: + artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + - name: leadreintermediate.io + status: clean + created: 2021-10-02T18:04:59.078206+02:00 + id: 8123 + modified: 2021-10-02T18:04:59.078206+02:00 + name: live zebra + owner: demo + playbooks: + phishing: + name: Phishing + tasks: + block-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block IOCs + order: 6 + type: task + block-sender: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block sender + next: + extract-iocs: "" + order: 3 + type: task + board: + active: true + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + order: 0 + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + escalate: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to CISO + order: 1 + type: task + extract-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Extract IOCs + next: + block-iocs: "" + order: 5 + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + type: input + mail-available: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Mail available + next: + block-sender: schemaKey == 'yes' + extract-iocs: schemaKey == 'yes' + search-email-gateway: schemaKey == 'no' + order: 2 + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: "yes" + type: string + required: + - mail + title: "Yes" + - properties: + schemaKey: + const: "no" + type: string + title: "No" + title: Mail available + type: object + type: input + search-email-gateway: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Search email gateway + next: + extract-iocs: "" + order: 4 + type: task + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Set a single artifact + tags: + - tickets + /tickets/{id}/artifacts/{name}/enrich: + post: + operationId: enrichArtifact + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - in: path + name: name + required: true + type: string + x-example: leadreintermediate.io + - in: body + name: data + required: true + schema: + $ref: '#/definitions/EnrichmentForm' + x-example: + data: + hash: b7a067a742c20d07a7456646de89bc2d408a1153 + name: hash.sha1 + responses: + "200": + description: successful operation + examples: + test: + artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + - enrichments: + hash.sha1: + created: 2021-10-03T18:44:06.488923+02:00 + data: + hash: b7a067a742c20d07a7456646de89bc2d408a1153 + name: hash.sha1 + name: leadreintermediate.io + status: malicious + created: 2021-10-02T18:04:59.078206+02:00 + id: 8123 + modified: 2021-10-02T18:04:59.078206+02:00 + name: live zebra + owner: demo + playbooks: + phishing: + name: Phishing + tasks: + block-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block IOCs + order: 6 + type: task + block-sender: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block sender + next: + extract-iocs: "" + order: 3 + type: task + board: + active: true + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + order: 0 + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + escalate: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to CISO + order: 1 + type: task + extract-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Extract IOCs + next: + block-iocs: "" + order: 5 + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + type: input + mail-available: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Mail available + next: + block-sender: schemaKey == 'yes' + extract-iocs: schemaKey == 'yes' + search-email-gateway: schemaKey == 'no' + order: 2 + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: "yes" + type: string + required: + - mail + title: "Yes" + - properties: + schemaKey: + const: "no" + type: string + title: "No" + title: Mail available + type: object + type: input + search-email-gateway: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Search email gateway + next: + extract-iocs: "" + order: 4 + type: task + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + schema: + $ref: '#/definitions/Artifact' + security: + - roles: + - ticket:write + summary: Enrich a single artifact + tags: + - tickets + /tickets/{id}/artifacts/{name}/run/{automation}: + post: + operationId: runArtifact + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - in: path + name: name + required: true + type: string + x-example: leadreintermediate.io + - in: path + name: automation + required: true + type: string + x-example: hash.sha1 + responses: + "204": + description: successful operation + security: + - roles: + - ticket:write + summary: Run automation on a single artifact + tags: + - tickets + /tickets/{id}/comments: + post: + operationId: addComment + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8125 + - description: Ticket comment + in: body + name: comment + required: true + schema: + $ref: '#/definitions/CommentForm' + x-example: + message: My first comment + responses: + "200": + description: successful operation + examples: + test: + comments: + - created: 2021-10-02T18:04:59.078186+02:00 + creator: bob + message: My first comment + created: 2021-10-02T18:04:59.078186+02:00 + id: 8125 + modified: 2021-10-02T18:04:59.078186+02:00 + name: phishing from selenafadel@von.com detected + owner: demo + references: + - href: https://www.seniorleading-edge.name/users/efficient + name: recovery + - href: http://www.dynamicseamless.com/clicks-and-mortar + name: force + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + tickets: + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + type: alert + type: alert + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Add ticket comment + tags: + - tickets + /tickets/{id}/comments/{commentID}: + delete: + description: Comment will be removed from the ticket. + operationId: removeComment + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - description: Comment ID to remove + in: path + name: commentID + required: true + type: integer + x-example: 0 + responses: + "200": + description: successful operation + examples: + test: + artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + - name: leadreintermediate.io + status: malicious + created: 2021-10-02T18:04:59.078206+02:00 + id: 8123 + modified: 2021-10-02T18:04:59.078206+02:00 + name: live zebra + owner: demo + playbooks: + phishing: + name: Phishing + tasks: + block-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block IOCs + order: 6 + type: task + block-sender: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block sender + next: + extract-iocs: "" + order: 3 + type: task + board: + active: true + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + order: 0 + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + escalate: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to CISO + order: 1 + type: task + extract-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Extract IOCs + next: + block-iocs: "" + order: 5 + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + type: input + mail-available: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Mail available + next: + block-sender: schemaKey == 'yes' + extract-iocs: schemaKey == 'yes' + search-email-gateway: schemaKey == 'no' + order: 2 + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: "yes" + type: string + required: + - mail + title: "Yes" + - properties: + schemaKey: + const: "no" + type: string + title: "No" + title: Mail available + type: object + type: input + search-email-gateway: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Search email gateway + next: + extract-iocs: "" + order: 4 + type: task + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Remove an comment from an ticket + tags: + - tickets + /tickets/{id}/files: + put: + description: Link files to an ticket. The files themself will be stored in object + storage. + operationId: linkFiles + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8125 + - description: Added files + in: body + name: files + required: true + schema: + items: + $ref: '#/definitions/File' + type: array + x-example: + - key: myfile + name: document.doc + responses: + "200": + description: successful operation + examples: + test: + created: 2021-10-02T18:04:59.078186+02:00 + files: + - key: myfile + name: document.doc + id: 8125 + modified: 2021-10-02T18:04:59.078186+02:00 + name: phishing from selenafadel@von.com detected + owner: demo + references: + - href: https://www.seniorleading-edge.name/users/efficient + name: recovery + - href: http://www.dynamicseamless.com/clicks-and-mortar + name: force + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + tickets: + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + type: alert + type: alert + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Link files to an ticket + tags: + - tickets + /tickets/{id}/playbooks: + post: + operationId: addTicketPlaybook + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8125 + - description: Ticket playbook object that needs to be added + in: body + name: playbook + required: true + schema: + $ref: '#/definitions/PlaybookTemplateForm' + x-example: + yaml: | + name: Simple + tasks: + input: + name: Upload malware if possible + type: input + schema: + title: Malware + type: object + properties: + malware: + type: string + title: Select malware + default: "" + next: + hash: "malware != ''" + + hash: + name: Hash the malware + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['input'].data['malware']" + next: + escalate: + + escalate: + name: Escalate to malware team + type: task + responses: + "200": + description: successful operation + examples: + test: + created: 1985-04-12T23:20:50.52Z + id: 8125 + modified: 1985-04-12T23:20:50.52Z + name: phishing from selenafadel@von.com detected + owner: demo + playbooks: + simple: + name: Simple + tasks: + escalate: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to malware team + order: 2 + type: task + hash: + active: false + automation: hash.sha1 + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Hash the malware + next: + escalate: "" + order: 1 + payload: + default: playbook.tasks['input'].data['malware'] + type: automation + input: + active: true + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Upload malware if possible + next: + hash: malware != '' + order: 0 + schema: + properties: + malware: + default: "" + title: Select malware + type: string + title: Malware + type: object + type: input + references: + - href: https://www.seniorleading-edge.name/users/efficient + name: recovery + - href: http://www.dynamicseamless.com/clicks-and-mortar + name: force + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + tickets: + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + type: alert + type: alert + schema: + $ref: '#/definitions/TicketResponse' + summary: Add a new ticket playbook + tags: + - tickets + /tickets/{id}/playbooks/{playbookID}: + delete: + operationId: removeTicketPlaybook + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - description: Playbook ID + in: path + name: playbookID + required: true + type: string + x-example: phishing + responses: + "200": + description: successful operation + examples: + test: + artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + - name: leadreintermediate.io + status: malicious + created: 1985-04-12T23:20:50.52Z + id: 8123 + modified: 1985-04-12T23:20:50.52Z + name: live zebra + owner: demo + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Remove an ticket playbook + tags: + - tickets + /tickets/{id}/playbooks/{playbookID}/task/{taskID}: + put: + operationId: setTask + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - description: Playbook ID + in: path + name: playbookID + required: true + type: string + x-example: phishing + - description: Task ID + in: path + name: taskID + required: true + type: string + x-example: board + - description: Task + in: body + name: task + required: true + schema: + $ref: '#/definitions/Task' + x-example: + active: true + data: + boardInvolved: true + done: false + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + order: 0 + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + responses: + "200": + description: successful operation + examples: + test: + artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + - name: leadreintermediate.io + status: malicious + created: 2021-10-02T18:04:59.078206+02:00 + id: 8123 + modified: 2021-10-02T18:04:59.078206+02:00 + name: live zebra + owner: demo + playbooks: + phishing: + name: Phishing + tasks: + block-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block IOCs + order: 6 + type: task + block-sender: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block sender + next: + extract-iocs: "" + order: 3 + type: task + board: + active: true + created: 2021-10-02T18:04:59.078186+02:00 + data: + boardInvolved: true + done: false + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + order: 0 + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + escalate: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to CISO + order: 1 + type: task + extract-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Extract IOCs + next: + block-iocs: "" + order: 5 + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + type: input + mail-available: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Mail available + next: + block-sender: schemaKey == 'yes' + extract-iocs: schemaKey == 'yes' + search-email-gateway: schemaKey == 'no' + order: 2 + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: "yes" + type: string + required: + - mail + title: "Yes" + - properties: + schemaKey: + const: "no" + type: string + title: "No" + title: Mail available + type: object + type: input + search-email-gateway: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Search email gateway + next: + extract-iocs: "" + order: 4 + type: task + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Set a ticket playbook task + tags: + - tickets + /tickets/{id}/playbooks/{playbookID}/task/{taskID}/complete: + put: + operationId: completeTask + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - description: Playbook ID + in: path + name: playbookID + required: true + type: string + x-example: phishing + - description: Task ID + in: path + name: taskID + required: true + type: string + x-example: board + - description: Ticket playbook object that needs to be added + in: body + name: data + required: true + schema: + type: object + x-example: + boardInvolved: true + responses: + "200": + description: successful operation + examples: + test: + artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + - name: leadreintermediate.io + status: malicious + created: 2021-10-02T18:04:59.078206+02:00 + id: 8123 + modified: 2021-10-02T18:04:59.078206+02:00 + name: live zebra + owner: demo + playbooks: + phishing: + name: Phishing + tasks: + block-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block IOCs + order: 6 + type: task + block-sender: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block sender + next: + extract-iocs: "" + order: 3 + type: task + board: + active: false + closed: 2021-10-02T18:04:59.078186+02:00 + created: 2021-10-02T18:04:59.078186+02:00 + data: + boardInvolved: true + done: true + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + order: 0 + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + escalate: + active: true + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to CISO + order: 1 + type: task + extract-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Extract IOCs + next: + block-iocs: "" + order: 5 + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + type: input + mail-available: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Mail available + next: + block-sender: schemaKey == 'yes' + extract-iocs: schemaKey == 'yes' + search-email-gateway: schemaKey == 'no' + order: 2 + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: "yes" + type: string + required: + - mail + title: "Yes" + - properties: + schemaKey: + const: "no" + type: string + title: "No" + title: Mail available + type: object + type: input + search-email-gateway: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Search email gateway + next: + extract-iocs: "" + order: 4 + type: task + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Complete ticket playbook task + tags: + - tickets + /tickets/{id}/playbooks/{playbookID}/task/{taskID}/run: + post: + operationId: runTask + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - description: Playbook ID + in: path + name: playbookID + required: true + type: string + x-example: phishing + - description: Task ID + in: path + name: taskID + required: true + type: string + x-example: board + responses: + "204": + description: successful operation + security: + - roles: + - ticket:write + summary: Run ticket playbook task + tags: + - tickets + /tickets/{id}/references: + put: + operationId: setReferences + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8125 + - description: All ticket references + in: body + name: references + required: true + schema: + items: + $ref: '#/definitions/Reference' + type: array + x-example: + - href: http://www.leadscalable.biz/envisioneer + name: fund + responses: + "200": + description: successful operation + examples: + test: + created: 2021-10-02T18:04:59.078186+02:00 + id: 8125 + modified: 2021-10-02T18:04:59.078186+02:00 + name: phishing from selenafadel@von.com detected + owner: demo + references: + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + tickets: + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + type: alert + type: alert + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Set ticket references + tags: + - tickets + /tickets/{id}/schema: + put: + operationId: setSchema + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8125 + - description: New ticket schema + in: body + name: schema + schema: + type: string + x-example: '{}' + responses: + "200": + description: successful operation + examples: + test: + created: 2021-10-02T18:04:59.078186+02:00 + id: 8125 + modified: 2021-10-02T18:04:59.078186+02:00 + name: phishing from selenafadel@von.com detected + owner: demo + references: + - href: https://www.seniorleading-edge.name/users/efficient + name: recovery + - href: http://www.dynamicseamless.com/clicks-and-mortar + name: force + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + tickets: + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + type: alert + type: alert + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Set ticket schema + tags: + - tickets + /tickets/{id}/tickets: + delete: + operationId: unlinkTicket + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8126 + - description: Added ticket ID + in: body + name: linkedID + required: true + schema: + format: int64 + type: integer + x-example: 8125 + responses: + "200": + description: successful operation + examples: + test: + created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + type: alert + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Unlink an ticket to an ticket + tags: + - tickets + patch: + operationId: linkTicket + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8126 + - description: Added ticket ID + in: body + name: linkedID + required: true + schema: + format: int64 + type: integer + x-example: 8123 + responses: + "200": + description: successful operation + examples: + test: + created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + tickets: + - artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + - name: leadreintermediate.io + status: malicious + created: 2021-10-02T18:04:59.078206+02:00 + id: 8123 + modified: 2021-10-02T18:04:59.078206+02:00 + name: live zebra + owner: demo + playbooks: + phishing: + name: Phishing + tasks: + block-iocs: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block IOCs + type: task + block-sender: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block sender + next: + extract-iocs: "" + type: task + board: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + escalate: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to CISO + type: task + extract-iocs: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Extract IOCs + next: + block-iocs: "" + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + type: input + mail-available: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Mail available + next: + block-sender: schemaKey == 'yes' + extract-iocs: schemaKey == 'yes' + search-email-gateway: schemaKey == 'no' + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: "yes" + type: string + required: + - mail + title: "Yes" + - properties: + schemaKey: + const: "no" + type: string + title: "No" + title: Mail available + type: object + type: input + search-email-gateway: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Search email gateway + next: + extract-iocs: "" + type: task + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8125 + modified: 2021-10-02T18:04:59.078186+02:00 + name: phishing from selenafadel@von.com detected + owner: demo + references: + - href: https://www.seniorleading-edge.name/users/efficient + name: recovery + - href: http://www.dynamicseamless.com/clicks-and-mortar + name: force + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + type: alert + type: alert + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Link an ticket to an ticket + tags: + - tickets + /tickets/batch: + post: + operationId: createTicketBatch + parameters: + - description: New ticket + in: body + name: ticket + required: true + schema: + items: + $ref: '#/definitions/TicketForm' + type: array + x-example: + - id: 123 + name: Wannacry infection + owner: bob + status: open + type: incident + responses: + "204": + description: successful operation + security: + - roles: + - ticket:write + summary: Create a new tickets in batch + tags: + - tickets + /tickettypes: + get: + operationId: listTicketTypes + responses: + "200": + description: successful operation + examples: + test: + - default_playbooks: [] + default_template: default + icon: mdi-alert + id: alert + name: Alerts + - default_playbooks: [] + default_template: default + icon: mdi-radioactive + id: incident + name: Incidents + - default_playbooks: [] + default_template: default + icon: mdi-fingerprint + id: investigation + name: Forensic Investigations + - default_playbooks: [] + default_template: default + icon: mdi-target + id: hunt + name: Threat Hunting + schema: + items: + $ref: '#/definitions/TicketTypeResponse' + type: array + security: + - roles: + - tickettype:read + summary: List tickettypes + tags: + - tickettypes + post: + operationId: createTicketType + parameters: + - description: New tickettype + in: body + name: tickettype + required: true + schema: + $ref: '#/definitions/TicketTypeForm' + x-example: + default_playbooks: [] + default_template: default + icon: mdi-newspaper-variant-outline + name: TI Tickets + responses: + "200": + description: successful operation + examples: + test: + default_playbooks: [] + default_template: default + icon: mdi-newspaper-variant-outline + id: ti-tickets + name: TI Tickets + schema: + $ref: '#/definitions/TicketTypeResponse' + security: + - roles: + - tickettype:write + summary: Create a new tickettype + tags: + - tickettypes + /tickettypes/{id}: + delete: + operationId: deleteTicketType + parameters: + - description: TicketType ID + in: path + name: id + required: true + type: string + x-example: alert + responses: + "204": + description: successful operation + security: + - roles: + - tickettype:write + summary: Delete a tickettype + tags: + - tickettypes + get: + operationId: getTicketType + parameters: + - description: TicketType ID + in: path + name: id + required: true + type: string + x-example: alert + responses: + "200": + description: successful operation + examples: + test: + default_playbooks: [] + default_template: default + icon: mdi-alert + id: alert + name: Alerts + schema: + $ref: '#/definitions/TicketTypeResponse' + security: + - roles: + - tickettype:read + summary: Get a single tickettype + tags: + - tickettypes + put: + operationId: updateTicketType + parameters: + - description: TicketType ID + in: path + name: id + required: true + type: string + x-example: alert + - description: TicketType object that needs to be added + in: body + name: tickettype + required: true + schema: + $ref: '#/definitions/TicketTypeForm' + x-example: + default_playbooks: [] + default_template: default + icon: mdi-bell + id: alert + name: Alerts + responses: + "200": + description: successful operation + examples: + test: + default_playbooks: [] + default_template: default + icon: mdi-bell + id: alert + name: Alerts + schema: + $ref: '#/definitions/TicketTypeResponse' + security: + - roles: + - tickettype:write + summary: Update an existing tickettype + tags: + - tickettypes + /userdata: + get: + operationId: listUserData + responses: + "200": + description: successful operation + examples: + test: + - email: bob@example.org + id: bob + name: Bob Bad + schema: + items: + $ref: '#/definitions/UserDataResponse' + type: array + security: + - roles: + - userdata:read + summary: List userdata + tags: + - userdata + /userdata/{id}: + get: + operationId: getUserData + parameters: + - description: User Data ID + in: path + name: id + required: true + type: string + x-example: bob + responses: + "200": + description: successful operation + examples: + test: + email: bob@example.org + id: bob + name: Bob Bad + schema: + $ref: '#/definitions/UserDataResponse' + security: + - roles: + - userdata:read + summary: Get a single user data + tags: + - userdata + put: + operationId: updateUserData + parameters: + - description: User Data ID + in: path + name: id + required: true + type: string + x-example: bob + - description: User data object that needs to be added + in: body + name: userdata + required: true + schema: + $ref: '#/definitions/UserData' + x-example: + blocked: false + email: bob@example.org + name: Bob Bad + responses: + "200": + description: successful operation + examples: + test: + email: bob@example.org + id: bob + name: Bob Bad + schema: + $ref: '#/definitions/UserDataResponse' + security: + - roles: + - userdata:write + summary: Update an existing user data + tags: + - userdata + /users: + get: + operationId: listUsers + responses: + "200": + description: successful operation + examples: + test: + - apikey: false + blocked: false + id: bob + roles: + - admin:backup:read + - admin:backup:restore + - admin:group:write + - admin:job:read + - admin:job:write + - admin:log:read + - admin:ticket:delete + - admin:user:write + - admin:userdata:read + - admin:userdata:write + - analyst:automation:read + - analyst:currentsettings:write + - analyst:currentuser:read + - analyst:currentuserdata:read + - analyst:file + - analyst:group:read + - analyst:playbook:read + - analyst:rule:read + - analyst:settings:read + - analyst:template:read + - analyst:ticket:read + - analyst:ticket:write + - analyst:tickettype:read + - analyst:user:read + - engineer:automation:write + - engineer:playbook:write + - engineer:rule:write + - engineer:template:write + - engineer:tickettype:write + - apikey: true + blocked: false + id: script + roles: + - analyst:automation:read + - analyst:currentsettings:write + - analyst:currentuser:read + - analyst:currentuserdata:read + - analyst:file + - analyst:group:read + - analyst:playbook:read + - analyst:rule:read + - analyst:settings:read + - analyst:template:read + - analyst:ticket:read + - analyst:ticket:write + - analyst:tickettype:read + - analyst:user:read + - engineer:automation:write + - engineer:playbook:write + - engineer:rule:write + - engineer:template:write + - engineer:tickettype:write + schema: + items: + $ref: '#/definitions/UserResponse' + type: array + security: + - roles: + - user:read + summary: List users + tags: + - users + post: + operationId: createUser + parameters: + - description: user object that needs to be added + in: body + name: user + required: true + schema: + $ref: '#/definitions/UserForm' + x-example: + id: syncscript + roles: + - analyst + responses: + "200": + description: successful operation + examples: + test: + blocked: false + id: syncscript + roles: + - analyst:automation:read + - analyst:currentsettings:write + - analyst:currentuser:read + - analyst:currentuserdata:read + - analyst:file + - analyst:group:read + - analyst:playbook:read + - analyst:rule:read + - analyst:settings:read + - analyst:template:read + - analyst:ticket:read + - analyst:ticket:write + - analyst:tickettype:read + - analyst:user:read + secret: v39bOuobnlEljfWzjAgoKzhmnh1xSMxH + schema: + $ref: '#/definitions/NewUserResponse' + security: + - roles: + - user:write + summary: Create user + tags: + - users + /users/{id}: + delete: + operationId: deleteUser + parameters: + - description: user ID + in: path + name: id + required: true + type: string + x-example: script + responses: + "204": + description: successful operation + security: + - roles: + - user:write + summary: Delete user + tags: + - users + get: + operationId: getUser + parameters: + - description: user ID + in: path + name: id + required: true + type: string + x-example: script + responses: + "200": + description: successful operation + examples: + test: + apikey: true + blocked: false + id: script + roles: + - analyst:automation:read + - analyst:currentsettings:write + - analyst:currentuser:read + - analyst:currentuserdata:read + - analyst:file + - analyst:group:read + - analyst:playbook:read + - analyst:rule:read + - analyst:settings:read + - analyst:template:read + - analyst:ticket:read + - analyst:ticket:write + - analyst:tickettype:read + - analyst:user:read + - engineer:automation:write + - engineer:playbook:write + - engineer:rule:write + - engineer:template:write + - engineer:tickettype:write + schema: + $ref: '#/definitions/UserResponse' + security: + - roles: + - user:read + summary: Get a single user + tags: + - users + put: + operationId: updateUser + parameters: + - description: Template ID + in: path + name: id + required: true + type: string + x-example: bob + - description: user object that needs to be added + in: body + name: user + required: true + schema: + $ref: '#/definitions/UserForm' + x-example: + roles: + - analyst + - admin + responses: + "200": + description: successful operation + examples: + test: + apikey: false + blocked: false + id: bob + roles: + - admin:backup:read + - admin:backup:restore + - admin:group:write + - admin:job:read + - admin:job:write + - admin:log:read + - admin:ticket:delete + - admin:user:write + - admin:userdata:read + - admin:userdata:write + - analyst:automation:read + - analyst:currentsettings:write + - analyst:currentuser:read + - analyst:currentuserdata:read + - analyst:file + - analyst:group:read + - analyst:playbook:read + - analyst:rule:read + - analyst:settings:read + - analyst:template:read + - analyst:ticket:read + - analyst:ticket:write + - analyst:tickettype:read + - analyst:user:read + - engineer:automation:write + - engineer:playbook:write + - engineer:rule:write + - engineer:template:write + - engineer:tickettype:write + schema: + $ref: '#/definitions/UserResponse' + security: + - roles: + - user:write + summary: Update user + tags: + - users +produces: +- application/json +schemes: +- http +swagger: "2.0" + diff --git a/generated/community.json b/generated/community.json new file mode 100644 index 0000000..b5eac50 --- /dev/null +++ b/generated/community.json @@ -0,0 +1,6067 @@ +{ + "openapi" : "3.0.1", + "info" : { + "description" : "API for the catalyst incident response platform.", + "title" : "", + "version" : "" + }, + "servers" : [ { + "url" : "http://./api" + } ], + "paths" : { + "/automations" : { + "get" : { + "operationId" : "listAutomations", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/AutomationResponse" + }, + "type" : "array" + } + }, + "test" : { + "example" : [ { + "id" : "comment", + "image" : "docker.io/python:3", + "script" : "", + "type" : [ "playbook" ] + }, { + "id" : "hash.sha1", + "image" : "docker.io/python:3", + "schema" : "{\"title\":\"Input\",\"type\":\"object\",\"properties\":{\"default\":{\"type\":\"string\",\"title\":\"Value\"}},\"required\":[\"default\"]}", + "script" : "", + "type" : [ "global", "artifact", "playbook" ] + }, { + "id" : "thehive", + "image" : "docker.io/python:3", + "schema" : "{\"title\":\"TheHive credentials\",\"type\":\"object\",\"properties\":{\"thehiveurl\":{\"type\":\"string\",\"title\":\"TheHive URL (e.g. 'https://thehive.example.org')\"},\"thehivekey\":{\"type\":\"string\",\"title\":\"TheHive API Key\"},\"skip_files\":{\"type\":\"boolean\", \"default\": true, \"title\":\"Skip Files (much faster)\"},\"keep_ids\":{\"type\":\"boolean\", \"default\": true, \"title\":\"Keep IDs and overwrite existing IDs\"}},\"required\":[\"thehiveurl\", \"thehivekey\", \"skip_files\", \"keep_ids\"]}", + "script" : "", + "type" : [ "global" ] + }, { + "id" : "vt.hash", + "image" : "docker.io/python:3", + "schema" : "{\"title\":\"Input\",\"type\":\"object\",\"properties\":{\"default\":{\"type\":\"string\",\"title\":\"Value\"}},\"required\":[\"default\"]}", + "script" : "", + "type" : [ "global", "artifact", "playbook" ] + } ] + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "automation:read" ] + } ], + "summary" : "List automations", + "tags" : [ "automations" ] + }, + "post" : { + "operationId" : "createAutomation", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/AutomationForm" + } + } + }, + "description" : "New automation", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/AutomationResponse" + } + }, + "test" : { + "example" : { + "id" : "hash-sha-256", + "image" : "docker.io/python:3", + "script" : "import sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha256 = hashlib.sha256(msg['payload']['default'].encode('utf-8'))\n return {'hash': sha256.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", + "type" : [ "global" ] + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "automation:write" ] + } ], + "summary" : "Create a new automation", + "tags" : [ "automations" ], + "x-codegen-request-body-name" : "automation" + } + }, + "/automations/{id}" : { + "delete" : { + "operationId" : "deleteAutomation", + "parameters" : [ { + "description" : "Automation ID", + "example" : "hash.sha1", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "204" : { + "content" : { }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "automation:write" ] + } ], + "summary" : "Delete a automation", + "tags" : [ "automations" ] + }, + "get" : { + "operationId" : "getAutomation", + "parameters" : [ { + "description" : "Automation ID", + "example" : "hash.sha1", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/AutomationResponse" + } + }, + "test" : { + "example" : { + "id" : "hash.sha1", + "image" : "docker.io/python:3", + "schema" : "{\"title\":\"Input\",\"type\":\"object\",\"properties\":{\"default\":{\"type\":\"string\",\"title\":\"Value\"}},\"required\":[\"default\"]}", + "script" : "#!/usr/bin/env python\n\nimport sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha1 = hashlib.sha1(msg['payload']['default'].encode('utf-8'))\n return {\"hash\": sha1.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", + "type" : [ "global", "artifact", "playbook" ] + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "automation:read" ] + } ], + "summary" : "Get a single automation", + "tags" : [ "automations" ] + }, + "put" : { + "operationId" : "updateAutomation", + "parameters" : [ { + "description" : "Automation ID", + "example" : "hash.sha1", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/AutomationForm" + } + } + }, + "description" : "Automation object that needs to be added", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/AutomationResponse" + } + }, + "test" : { + "example" : { + "id" : "hash.sha1", + "image" : "docker.io/python:3", + "script" : "import sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha1 = hashlib.sha1(msg['payload'].encode('utf-8'))\n return {'hash': sha1.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", + "type" : [ "global", "artifact", "playbook" ] + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "automation:write" ] + } ], + "summary" : "Update an existing automation", + "tags" : [ "automations" ], + "x-codegen-request-body-name" : "automation" + } + }, + "/currentuser" : { + "get" : { + "operationId" : "currentUser", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/UserResponse" + } + }, + "test" : { + "example" : { + "apikey" : false, + "blocked" : false, + "id" : "bob", + "roles" : [ "admin:backup:read", "admin:backup:restore", "admin:group:write", "admin:job:read", "admin:job:write", "admin:log:read", "admin:ticket:delete", "admin:user:write", "admin:userdata:read", "admin:userdata:write", "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write" ] + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "currentuser:read" ] + } ], + "summary" : "Get current user", + "tags" : [ "users" ] + } + }, + "/currentuserdata" : { + "get" : { + "operationId" : "currentUserData", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/UserDataResponse" + } + }, + "test" : { + "example" : { + "email" : "bob@example.org", + "id" : "bob", + "name" : "Bob Bad" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "currentuserdata:read" ] + } ], + "summary" : "Get current user data", + "tags" : [ "userdata" ] + }, + "put" : { + "operationId" : "updateCurrentUserData", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/UserData" + } + } + }, + "description" : "User data object that needs to be added", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/UserDataResponse" + } + }, + "test" : { + "example" : { + "email" : "bob@example.org", + "id" : "bob", + "name" : "Bob Bad" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "currentuserdata:write" ] + } ], + "summary" : "Update current user data", + "tags" : [ "userdata" ], + "x-codegen-request-body-name" : "userdata" + } + }, + "/jobs" : { + "get" : { + "operationId" : "listJobs", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/JobResponse" + }, + "type" : "array" + } + }, + "test" : { + "example" : [ { + "automation" : "hash.sha1", + "id" : "99cd67131b48", + "payload" : "test", + "status" : "created" + } ] + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "job:read" ] + } ], + "summary" : "List jobs", + "tags" : [ "jobs" ] + }, + "post" : { + "operationId" : "runJob", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/JobForm" + } + } + }, + "description" : "New job", + "required" : true + }, + "responses" : { + "204" : { + "content" : { }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "job:write" ] + } ], + "summary" : "Start a new job", + "tags" : [ "jobs" ], + "x-codegen-request-body-name" : "job" + } + }, + "/jobs/{id}" : { + "get" : { + "operationId" : "getJob", + "parameters" : [ { + "description" : "Job ID", + "example" : "99cd67131b48", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/JobResponse" + } + }, + "test" : { + "example" : { + "automation" : "hash.sha1", + "id" : "99cd67131b48", + "payload" : "test", + "status" : "created" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "job:read" ] + } ], + "summary" : "Get a single job", + "tags" : [ "jobs" ] + }, + "put" : { + "operationId" : "updateJob", + "parameters" : [ { + "description" : "Job ID", + "example" : "99cd67131b48", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Job" + } + } + }, + "description" : "Job object that needs to be added", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/JobResponse" + } + }, + "test" : { + "example" : { + "automation" : "hash.sha1", + "id" : "99cd67131b48", + "payload" : "test", + "status" : "failed" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "job:write" ] + } ], + "summary" : "Update an existing job", + "tags" : [ "jobs" ], + "x-codegen-request-body-name" : "job" + } + }, + "/logs/{reference}" : { + "get" : { + "operationId" : "getLogs", + "parameters" : [ { + "description" : "Reference", + "example" : "tickets%2F294511", + "in" : "path", + "name" : "reference", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/LogEntry" + }, + "type" : "array" + } + }, + "test" : { + "example" : [ { + "created" : "2021-10-02T16:05:00.334+0000", + "creator" : "bob", + "message" : "Fail run account resist lend solve incident centre priority temperature. Cause change distribution examine location technique shape partner milk customer. Rail tea plate soil report cook railway interpretation breath action. Exercise dream accept park conclusion addition shoot assistance may answer. Gold writer link stop combine hear power name commitment operation. Determine lifespan support grow degree henry exclude detail set religion. Direct library policy convention chain retain discover ride walk student. Gather proposal select march aspect play noise avoid encourage employ. Assessment preserve transport combine wish influence income guess run stand. Charge limit crime ignore statement foundation study issue stop claim.", + "reference" : "tickets/294511" + } ] + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "log:read" ] + } ], + "summary" : "Get log entries", + "tags" : [ "logs" ] + } + }, + "/playbooks" : { + "get" : { + "operationId" : "listPlaybooks", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/PlaybookTemplateResponse" + }, + "type" : "array" + } + }, + "test" : { + "example" : [ { + "id" : "malware", + "name" : "Malware", + "yaml" : "name: Malware\ntasks:\n file-or-hash:\n name: Do you have the file or the hash?\n type: input\n schema:\n title: Malware\n type: object\n properties:\n file:\n type: string\n title: \"I have the\"\n enum: [ \"File\", \"Hash\" ]\n next:\n enter-hash: \"file == 'Hash'\"\n upload: \"file == 'File'\"\n\n enter-hash:\n name: Please enter the hash\n type: input\n schema:\n title: Malware\n type: object\n properties:\n hash:\n type: string\n title: Please enter the hash value\n minlength: 32\n next:\n virustotal: \"hash != ''\"\n\n upload:\n name: Upload the malware\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: object\n x-display: file\n title: Please upload the malware\n next:\n hash: \"malware\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['upload'].data['malware']\"\n next:\n virustotal:\n\n virustotal:\n name: Send hash to VirusTotal\n type: automation\n automation: vt.hash\n args:\n hash: \"playbook.tasks['enter-hash'].data['hash'] || playbook.tasks['hash'].data['hash']\"\n # next:\n # known-malware: \"score > 5\"\n # sandbox: \"score < 6\" # unknown-malware\n" + }, { + "id" : "phishing", + "name" : "Phishing", + "yaml" : "name: Phishing\ntasks:\n board:\n name: Board Involvement?\n description: Is a board member involved?\n type: input\n schema:\n properties:\n boardInvolved:\n default: false\n title: A board member is involved.\n type: boolean\n required:\n - boardInvolved\n title: Board Involvement?\n type: object\n next:\n escalate: \"boardInvolved == true\"\n mail-available: \"boardInvolved == false\"\n\n escalate:\n name: Escalate to CISO\n description: Please escalate the task to the CISO\n type: task\n\n mail-available:\n name: Mail available\n type: input\n schema:\n oneOf:\n - properties:\n mail:\n title: Mail\n type: string\n x-display: textarea\n schemaKey:\n const: 'yes'\n type: string\n required:\n - mail\n title: 'Yes'\n - properties:\n schemaKey:\n const: 'no'\n type: string\n title: 'No'\n title: Mail available\n type: object\n next:\n block-sender: \"schemaKey == 'yes'\"\n extract-iocs: \"schemaKey == 'yes'\"\n search-email-gateway: \"schemaKey == 'no'\"\n\n search-email-gateway:\n name: Search email gateway\n description: Please search email-gateway for the phishing mail.\n type: task\n next:\n extract-iocs:\n\n block-sender:\n name: Block sender\n type: task\n next:\n extract-iocs:\n\n extract-iocs:\n name: Extract IOCs\n description: Please insert the IOCs\n type: input\n schema:\n properties:\n iocs:\n items:\n type: string\n title: IOCs\n type: array\n title: Extract IOCs\n type: object\n next:\n block-iocs:\n\n block-iocs:\n name: Block IOCs\n type: task\n" + }, { + "id" : "simple", + "name" : "Simple", + "yaml" : "name: Simple\ntasks:\n input:\n name: Enter something to hash\n type: input\n schema:\n title: Something\n type: object\n properties:\n something:\n type: string\n title: Something\n default: \"\"\n next:\n hash: \"something != ''\"\n\n hash:\n name: Hash the something\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['something']\"\n next:\n comment: \"hash != ''\"\n\n comment:\n name: Comment the hash\n type: automation\n automation: comment\n payload:\n default: \"playbook.tasks['hash'].data['hash']\"\n next:\n done: \"done\"\n\n done:\n name: You can close this case now\n type: task\n" + } ] + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "playbook:read" ] + } ], + "summary" : "List playbooks", + "tags" : [ "playbooks" ] + }, + "post" : { + "operationId" : "createPlaybook", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/PlaybookTemplateForm" + } + } + }, + "description" : "New playbook", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/PlaybookTemplateResponse" + }, + "type" : "array" + } + }, + "test" : { + "example" : { + "id" : "simple-2", + "name" : "Simple2", + "yaml" : "name: Simple2\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "playbook:write" ] + } ], + "summary" : "Create a playbook", + "tags" : [ "playbooks" ], + "x-codegen-request-body-name" : "playbook" + } + }, + "/playbooks/{id}" : { + "delete" : { + "operationId" : "deletePlaybook", + "parameters" : [ { + "description" : "Playbook name", + "example" : "simple", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "204" : { + "content" : { }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "playbook:write" ] + } ], + "summary" : "Delete a playbook", + "tags" : [ "playbooks" ] + }, + "get" : { + "operationId" : "getPlaybook", + "parameters" : [ { + "description" : "Playbook name", + "example" : "simple", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/PlaybookTemplateResponse" + } + }, + "test" : { + "example" : { + "id" : "simple", + "name" : "Simple", + "yaml" : "name: Simple\ntasks:\n input:\n name: Enter something to hash\n type: input\n schema:\n title: Something\n type: object\n properties:\n something:\n type: string\n title: Something\n default: \"\"\n next:\n hash: \"something != ''\"\n\n hash:\n name: Hash the something\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['something']\"\n next:\n comment: \"hash != ''\"\n\n comment:\n name: Comment the hash\n type: automation\n automation: comment\n payload:\n default: \"playbook.tasks['hash'].data['hash']\"\n next:\n done: \"done\"\n\n done:\n name: You can close this case now\n type: task\n" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "playbook:read" ] + } ], + "summary" : "Get a single playbook", + "tags" : [ "playbooks" ] + }, + "put" : { + "operationId" : "updatePlaybook", + "parameters" : [ { + "description" : "Playbook ID", + "example" : "simple", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/PlaybookTemplateForm" + } + } + }, + "description" : "Updated playbook", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/PlaybookTemplateResponse" + } + }, + "test" : { + "example" : { + "id" : "simple", + "name" : "Simple", + "yaml" : "name: Simple\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "playbook:write" ] + } ], + "summary" : "Update an existing ticket playbook", + "tags" : [ "playbooks" ], + "x-codegen-request-body-name" : "playbook" + } + }, + "/settings" : { + "get" : { + "operationId" : "getSettings", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Settings" + } + }, + "test" : { + "example" : { + "artifactStates" : [ { + "color" : "info", + "icon" : "mdi-help-circle-outline", + "id" : "unknown", + "name" : "Unknown" + }, { + "color" : "error", + "icon" : "mdi-skull", + "id" : "malicious", + "name" : "Malicious" + }, { + "color" : "success", + "icon" : "mdi-check", + "id" : "clean", + "name" : "Clean" + } ], + "roles" : [ "admin:backup:read", "admin:backup:restore", "admin:group:write", "admin:job:read", "admin:job:write", "admin:log:read", "admin:ticket:delete", "admin:user:write", "admin:userdata:read", "admin:userdata:write", "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write" ], + "ticketTypes" : [ { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-alert", + "id" : "alert", + "name" : "Alerts" + }, { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-radioactive", + "id" : "incident", + "name" : "Incidents" + }, { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-fingerprint", + "id" : "investigation", + "name" : "Forensic Investigations" + }, { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-target", + "id" : "hunt", + "name" : "Threat Hunting" + } ], + "tier" : "community", + "timeformat" : "YYYY-MM-DDThh:mm:ss", + "version" : "0.0.0-test" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "settings:read" ] + } ], + "summary" : "Get settings", + "tags" : [ "settings" ] + } + }, + "/statistics" : { + "get" : { + "operationId" : "getStatistics", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Statistics" + } + }, + "test" : { + "example" : { + "open_tickets_per_user" : { }, + "tickets_per_type" : { + "alert" : 2, + "incident" : 1 + }, + "tickets_per_week" : { + "2021-39" : 3 + }, + "unassigned" : 0 + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:read" ] + } ], + "summary" : "Get statistics", + "tags" : [ "statistics" ] + } + }, + "/tasks" : { + "get" : { + "operationId" : "listTasks", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/TaskResponse" + }, + "type" : "array" + } + }, + "test" : { + "example" : [ ] + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:read" ] + } ], + "summary" : "List tasks", + "tags" : [ "tasks" ] + } + }, + "/templates" : { + "get" : { + "operationId" : "listTemplates", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/TicketTemplateResponse" + }, + "type" : "array" + } + }, + "test" : { + "example" : [ { + "id" : "default", + "name" : "Default", + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Default\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + } ] + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "template:read" ] + } ], + "summary" : "List templates", + "tags" : [ "templates" ] + }, + "post" : { + "operationId" : "createTemplate", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTemplateForm" + } + } + }, + "description" : "New template", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTemplateResponse" + } + }, + "test" : { + "example" : { + "id" : "my-template", + "name" : "My Template", + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "template:write" ] + } ], + "summary" : "Create a new template", + "tags" : [ "templates" ], + "x-codegen-request-body-name" : "template" + } + }, + "/templates/{id}" : { + "delete" : { + "operationId" : "deleteTemplate", + "parameters" : [ { + "description" : "Template ID", + "example" : "default", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "204" : { + "content" : { }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "template:write" ] + } ], + "summary" : "Delete a template", + "tags" : [ "templates" ] + }, + "get" : { + "operationId" : "getTemplate", + "parameters" : [ { + "description" : "Template ID", + "example" : "default", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTemplateResponse" + } + }, + "test" : { + "example" : { + "id" : "default", + "name" : "Default", + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Default\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "template:read" ] + } ], + "summary" : "Get a single template", + "tags" : [ "templates" ] + }, + "put" : { + "operationId" : "updateTemplate", + "parameters" : [ { + "description" : "Template ID", + "example" : "default", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTemplateForm" + } + } + }, + "description" : "Template object that needs to be added", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTemplateResponse" + } + }, + "test" : { + "example" : { + "id" : "default", + "name" : "My Template", + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "template:write" ] + } ], + "summary" : "Update an existing template", + "tags" : [ "templates" ], + "x-codegen-request-body-name" : "template" + } + }, + "/tickets" : { + "get" : { + "operationId" : "listTickets", + "parameters" : [ { + "description" : "Ticket Type", + "in" : "query", + "name" : "type", + "schema" : { + "type" : "string" + } + }, { + "description" : "Offset of the list", + "in" : "query", + "name" : "offset", + "schema" : { + "default" : 0, + "type" : "integer" + } + }, { + "description" : "Number of tickets", + "in" : "query", + "name" : "count", + "schema" : { + "default" : 25, + "maximum" : 100, + "type" : "integer" + } + }, { + "description" : "Sort columns", + "explode" : false, + "in" : "query", + "name" : "sort", + "schema" : { + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "style" : "form" + }, { + "description" : "Sort descending", + "explode" : false, + "in" : "query", + "name" : "desc", + "schema" : { + "items" : { + "type" : "boolean" + }, + "type" : "array" + }, + "style" : "form" + }, { + "description" : "Search query", + "in" : "query", + "name" : "query", + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketList" + } + }, + "test" : { + "example" : { + "count" : 3, + "tickets" : [ { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + }, { + "name" : "leadreintermediate.io", + "status" : "malicious" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8123, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "live zebra", + "owner" : "demo", + "playbooks" : { + "phishing" : { + "name" : "Phishing", + "tasks" : { + "block-iocs" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block IOCs", + "type" : "task" + }, + "block-sender" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block sender", + "next" : { + "extract-iocs" : "" + }, + "type" : "task" + }, + "board" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Board Involvement?", + "next" : { + "escalate" : "boardInvolved == true", + "mail-available" : "boardInvolved == false" + }, + "schema" : { + "properties" : { + "boardInvolved" : { + "default" : false, + "title" : "A board member is involved.", + "type" : "boolean" + } + }, + "required" : [ "boardInvolved" ], + "title" : "Board Involvement?", + "type" : "object" + }, + "type" : "input" + }, + "escalate" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to CISO", + "type" : "task" + }, + "extract-iocs" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Extract IOCs", + "next" : { + "block-iocs" : "" + }, + "schema" : { + "properties" : { + "iocs" : { + "items" : { + "type" : "string" + }, + "title" : "IOCs", + "type" : "array" + } + }, + "title" : "Extract IOCs", + "type" : "object" + }, + "type" : "input" + }, + "mail-available" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Mail available", + "next" : { + "block-sender" : "schemaKey == 'yes'", + "extract-iocs" : "schemaKey == 'yes'", + "search-email-gateway" : "schemaKey == 'no'" + }, + "schema" : { + "oneOf" : [ { + "properties" : { + "mail" : { + "title" : "Mail", + "type" : "string", + "x-display" : "textarea" + }, + "schemaKey" : { + "const" : "yes", + "type" : "string" + } + }, + "required" : [ "mail" ], + "title" : "Yes" + }, { + "properties" : { + "schemaKey" : { + "const" : "no", + "type" : "string" + } + }, + "title" : "No" + } ], + "title" : "Mail available", + "type" : "object" + }, + "type" : "input" + }, + "search-email-gateway" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Search email gateway", + "next" : { + "extract-iocs" : "" + }, + "type" : "task" + } + } + } + }, + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + }, { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8125, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "phishing from selenafadel@von.com detected", + "owner" : "demo", + "references" : [ { + "href" : "https://www.seniorleading-edge.name/users/efficient", + "name" : "recovery" + }, { + "href" : "http://www.dynamicseamless.com/clicks-and-mortar", + "name" : "force" + }, { + "href" : "http://www.leadscalable.biz/envisioneer", + "name" : "fund" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + }, { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } ] + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:read" ] + } ], + "summary" : "List tickets", + "tags" : [ "tickets" ] + }, + "post" : { + "operationId" : "createTicket", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketForm" + } + } + }, + "description" : "New ticket", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "created" : "1985-04-12T23:20:50.520+0000", + "id" : 123, + "modified" : "1985-04-12T23:20:50.520+0000", + "name" : "Wannacry infection", + "owner" : "bob", + "schema" : "{}", + "status" : "open", + "type" : "incident" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Create a new ticket", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "ticket" + } + }, + "/tickets/{id}" : { + "delete" : { + "operationId" : "deleteTicket", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8125, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "responses" : { + "204" : { + "content" : { }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:delete" ] + } ], + "summary" : "Delete an ticket", + "tags" : [ "tickets" ] + }, + "get" : { + "operationId" : "getTicket", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8125, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8125, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "phishing from selenafadel@von.com detected", + "owner" : "demo", + "references" : [ { + "href" : "https://www.seniorleading-edge.name/users/efficient", + "name" : "recovery" + }, { + "href" : "http://www.dynamicseamless.com/clicks-and-mortar", + "name" : "force" + }, { + "href" : "http://www.leadscalable.biz/envisioneer", + "name" : "fund" + } ], + "schema" : "{}", + "status" : "closed", + "tickets" : [ { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } ], + "type" : "alert" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:read" ] + } ], + "summary" : "Get a single ticket", + "tags" : [ "tickets" ] + }, + "put" : { + "operationId" : "updateTicket", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8125, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Ticket" + } + } + }, + "description" : "Updated ticket", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8125, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "phishing from selenafadel@von.org detected", + "owner" : "demo", + "references" : [ { + "href" : "https://www.seniorleading-edge.name/users/efficient", + "name" : "recovery" + }, { + "href" : "http://www.dynamicseamless.com/clicks-and-mortar", + "name" : "force" + }, { + "href" : "http://www.leadscalable.biz/envisioneer", + "name" : "fund" + } ], + "schema" : "{}", + "status" : "closed", + "tickets" : [ { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } ], + "type" : "alert" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Update an existing ticket", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "ticket" + } + }, + "/tickets/{id}/artifacts" : { + "post" : { + "operationId" : "addArtifact", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Artifact" + } + } + }, + "description" : "Artifact object that needs to be added", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + }, { + "name" : "leadreintermediate.io", + "status" : "malicious" + }, { + "name" : "2.2.2.2", + "status" : "unknown", + "type" : "ip" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8123, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "live zebra", + "owner" : "demo", + "playbooks" : { + "phishing" : { + "name" : "Phishing", + "tasks" : { + "block-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block IOCs", + "order" : 6, + "type" : "task" + }, + "block-sender" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block sender", + "next" : { + "extract-iocs" : "" + }, + "order" : 3, + "type" : "task" + }, + "board" : { + "active" : true, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Board Involvement?", + "next" : { + "escalate" : "boardInvolved == true", + "mail-available" : "boardInvolved == false" + }, + "order" : 0, + "schema" : { + "properties" : { + "boardInvolved" : { + "default" : false, + "title" : "A board member is involved.", + "type" : "boolean" + } + }, + "required" : [ "boardInvolved" ], + "title" : "Board Involvement?", + "type" : "object" + }, + "type" : "input" + }, + "escalate" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to CISO", + "order" : 1, + "type" : "task" + }, + "extract-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Extract IOCs", + "next" : { + "block-iocs" : "" + }, + "order" : 5, + "schema" : { + "properties" : { + "iocs" : { + "items" : { + "type" : "string" + }, + "title" : "IOCs", + "type" : "array" + } + }, + "title" : "Extract IOCs", + "type" : "object" + }, + "type" : "input" + }, + "mail-available" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Mail available", + "next" : { + "block-sender" : "schemaKey == 'yes'", + "extract-iocs" : "schemaKey == 'yes'", + "search-email-gateway" : "schemaKey == 'no'" + }, + "order" : 2, + "schema" : { + "oneOf" : [ { + "properties" : { + "mail" : { + "title" : "Mail", + "type" : "string", + "x-display" : "textarea" + }, + "schemaKey" : { + "const" : "yes", + "type" : "string" + } + }, + "required" : [ "mail" ], + "title" : "Yes" + }, { + "properties" : { + "schemaKey" : { + "const" : "no", + "type" : "string" + } + }, + "title" : "No" + } ], + "title" : "Mail available", + "type" : "object" + }, + "type" : "input" + }, + "search-email-gateway" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Search email gateway", + "next" : { + "extract-iocs" : "" + }, + "order" : 4, + "type" : "task" + } + } + } + }, + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Add a single artifact", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "artifact" + } + }, + "/tickets/{id}/artifacts/{name}" : { + "delete" : { + "operationId" : "removeArtifact", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "example" : "leadreintermediate.io", + "in" : "path", + "name" : "name", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8123, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "live zebra", + "owner" : "demo", + "playbooks" : { + "phishing" : { + "name" : "Phishing", + "tasks" : { + "block-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block IOCs", + "order" : 6, + "type" : "task" + }, + "block-sender" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block sender", + "next" : { + "extract-iocs" : "" + }, + "order" : 3, + "type" : "task" + }, + "board" : { + "active" : true, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Board Involvement?", + "next" : { + "escalate" : "boardInvolved == true", + "mail-available" : "boardInvolved == false" + }, + "order" : 0, + "schema" : { + "properties" : { + "boardInvolved" : { + "default" : false, + "title" : "A board member is involved.", + "type" : "boolean" + } + }, + "required" : [ "boardInvolved" ], + "title" : "Board Involvement?", + "type" : "object" + }, + "type" : "input" + }, + "escalate" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to CISO", + "order" : 1, + "type" : "task" + }, + "extract-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Extract IOCs", + "next" : { + "block-iocs" : "" + }, + "order" : 5, + "schema" : { + "properties" : { + "iocs" : { + "items" : { + "type" : "string" + }, + "title" : "IOCs", + "type" : "array" + } + }, + "title" : "Extract IOCs", + "type" : "object" + }, + "type" : "input" + }, + "mail-available" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Mail available", + "next" : { + "block-sender" : "schemaKey == 'yes'", + "extract-iocs" : "schemaKey == 'yes'", + "search-email-gateway" : "schemaKey == 'no'" + }, + "order" : 2, + "schema" : { + "oneOf" : [ { + "properties" : { + "mail" : { + "title" : "Mail", + "type" : "string", + "x-display" : "textarea" + }, + "schemaKey" : { + "const" : "yes", + "type" : "string" + } + }, + "required" : [ "mail" ], + "title" : "Yes" + }, { + "properties" : { + "schemaKey" : { + "const" : "no", + "type" : "string" + } + }, + "title" : "No" + } ], + "title" : "Mail available", + "type" : "object" + }, + "type" : "input" + }, + "search-email-gateway" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Search email gateway", + "next" : { + "extract-iocs" : "" + }, + "order" : 4, + "type" : "task" + } + } + } + }, + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Remove an artifact", + "tags" : [ "tickets" ] + }, + "get" : { + "operationId" : "getArtifact", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "example" : "leadreintermediate.io", + "in" : "path", + "name" : "name", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Artifact" + } + }, + "test" : { + "example" : { + "name" : "leadreintermediate.io", + "status" : "malicious" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Get a single artifact", + "tags" : [ "tickets" ] + }, + "put" : { + "operationId" : "setArtifact", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "example" : "leadreintermediate.io", + "in" : "path", + "name" : "name", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Artifact" + } + } + }, + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + }, { + "name" : "leadreintermediate.io", + "status" : "clean" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8123, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "live zebra", + "owner" : "demo", + "playbooks" : { + "phishing" : { + "name" : "Phishing", + "tasks" : { + "block-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block IOCs", + "order" : 6, + "type" : "task" + }, + "block-sender" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block sender", + "next" : { + "extract-iocs" : "" + }, + "order" : 3, + "type" : "task" + }, + "board" : { + "active" : true, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Board Involvement?", + "next" : { + "escalate" : "boardInvolved == true", + "mail-available" : "boardInvolved == false" + }, + "order" : 0, + "schema" : { + "properties" : { + "boardInvolved" : { + "default" : false, + "title" : "A board member is involved.", + "type" : "boolean" + } + }, + "required" : [ "boardInvolved" ], + "title" : "Board Involvement?", + "type" : "object" + }, + "type" : "input" + }, + "escalate" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to CISO", + "order" : 1, + "type" : "task" + }, + "extract-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Extract IOCs", + "next" : { + "block-iocs" : "" + }, + "order" : 5, + "schema" : { + "properties" : { + "iocs" : { + "items" : { + "type" : "string" + }, + "title" : "IOCs", + "type" : "array" + } + }, + "title" : "Extract IOCs", + "type" : "object" + }, + "type" : "input" + }, + "mail-available" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Mail available", + "next" : { + "block-sender" : "schemaKey == 'yes'", + "extract-iocs" : "schemaKey == 'yes'", + "search-email-gateway" : "schemaKey == 'no'" + }, + "order" : 2, + "schema" : { + "oneOf" : [ { + "properties" : { + "mail" : { + "title" : "Mail", + "type" : "string", + "x-display" : "textarea" + }, + "schemaKey" : { + "const" : "yes", + "type" : "string" + } + }, + "required" : [ "mail" ], + "title" : "Yes" + }, { + "properties" : { + "schemaKey" : { + "const" : "no", + "type" : "string" + } + }, + "title" : "No" + } ], + "title" : "Mail available", + "type" : "object" + }, + "type" : "input" + }, + "search-email-gateway" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Search email gateway", + "next" : { + "extract-iocs" : "" + }, + "order" : 4, + "type" : "task" + } + } + } + }, + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Set a single artifact", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "artifact" + } + }, + "/tickets/{id}/artifacts/{name}/enrich" : { + "post" : { + "operationId" : "enrichArtifact", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "example" : "leadreintermediate.io", + "in" : "path", + "name" : "name", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/EnrichmentForm" + } + } + }, + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Artifact" + } + }, + "test" : { + "example" : { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + }, { + "enrichments" : { + "hash.sha1" : { + "created" : "2021-10-03T16:44:06.489+0000", + "data" : { + "hash" : "b7a067a742c20d07a7456646de89bc2d408a1153" + }, + "name" : "hash.sha1" + } + }, + "name" : "leadreintermediate.io", + "status" : "malicious" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8123, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "live zebra", + "owner" : "demo", + "playbooks" : { + "phishing" : { + "name" : "Phishing", + "tasks" : { + "block-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block IOCs", + "order" : 6, + "type" : "task" + }, + "block-sender" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block sender", + "next" : { + "extract-iocs" : "" + }, + "order" : 3, + "type" : "task" + }, + "board" : { + "active" : true, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Board Involvement?", + "next" : { + "escalate" : "boardInvolved == true", + "mail-available" : "boardInvolved == false" + }, + "order" : 0, + "schema" : { + "properties" : { + "boardInvolved" : { + "default" : false, + "title" : "A board member is involved.", + "type" : "boolean" + } + }, + "required" : [ "boardInvolved" ], + "title" : "Board Involvement?", + "type" : "object" + }, + "type" : "input" + }, + "escalate" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to CISO", + "order" : 1, + "type" : "task" + }, + "extract-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Extract IOCs", + "next" : { + "block-iocs" : "" + }, + "order" : 5, + "schema" : { + "properties" : { + "iocs" : { + "items" : { + "type" : "string" + }, + "title" : "IOCs", + "type" : "array" + } + }, + "title" : "Extract IOCs", + "type" : "object" + }, + "type" : "input" + }, + "mail-available" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Mail available", + "next" : { + "block-sender" : "schemaKey == 'yes'", + "extract-iocs" : "schemaKey == 'yes'", + "search-email-gateway" : "schemaKey == 'no'" + }, + "order" : 2, + "schema" : { + "oneOf" : [ { + "properties" : { + "mail" : { + "title" : "Mail", + "type" : "string", + "x-display" : "textarea" + }, + "schemaKey" : { + "const" : "yes", + "type" : "string" + } + }, + "required" : [ "mail" ], + "title" : "Yes" + }, { + "properties" : { + "schemaKey" : { + "const" : "no", + "type" : "string" + } + }, + "title" : "No" + } ], + "title" : "Mail available", + "type" : "object" + }, + "type" : "input" + }, + "search-email-gateway" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Search email gateway", + "next" : { + "extract-iocs" : "" + }, + "order" : 4, + "type" : "task" + } + } + } + }, + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Enrich a single artifact", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "data" + } + }, + "/tickets/{id}/artifacts/{name}/run/{automation}" : { + "post" : { + "operationId" : "runArtifact", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "example" : "leadreintermediate.io", + "in" : "path", + "name" : "name", + "required" : true, + "schema" : { + "type" : "string" + } + }, { + "example" : "hash.sha1", + "in" : "path", + "name" : "automation", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "204" : { + "content" : { }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Run automation on a single artifact", + "tags" : [ "tickets" ] + } + }, + "/tickets/{id}/comments" : { + "post" : { + "operationId" : "addComment", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8125, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/CommentForm" + } + } + }, + "description" : "Ticket comment", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "comments" : [ { + "created" : "2021-10-02T16:04:59.078+0000", + "creator" : "bob", + "message" : "My first comment" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8125, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "phishing from selenafadel@von.com detected", + "owner" : "demo", + "references" : [ { + "href" : "https://www.seniorleading-edge.name/users/efficient", + "name" : "recovery" + }, { + "href" : "http://www.dynamicseamless.com/clicks-and-mortar", + "name" : "force" + }, { + "href" : "http://www.leadscalable.biz/envisioneer", + "name" : "fund" + } ], + "schema" : "{}", + "status" : "closed", + "tickets" : [ { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } ], + "type" : "alert" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Add ticket comment", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "comment" + } + }, + "/tickets/{id}/comments/{commentID}" : { + "delete" : { + "description" : "Comment will be removed from the ticket.", + "operationId" : "removeComment", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "description" : "Comment ID to remove", + "example" : 0, + "in" : "path", + "name" : "commentID", + "required" : true, + "schema" : { + "type" : "integer" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + }, { + "name" : "leadreintermediate.io", + "status" : "malicious" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8123, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "live zebra", + "owner" : "demo", + "playbooks" : { + "phishing" : { + "name" : "Phishing", + "tasks" : { + "block-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block IOCs", + "order" : 6, + "type" : "task" + }, + "block-sender" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block sender", + "next" : { + "extract-iocs" : "" + }, + "order" : 3, + "type" : "task" + }, + "board" : { + "active" : true, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Board Involvement?", + "next" : { + "escalate" : "boardInvolved == true", + "mail-available" : "boardInvolved == false" + }, + "order" : 0, + "schema" : { + "properties" : { + "boardInvolved" : { + "default" : false, + "title" : "A board member is involved.", + "type" : "boolean" + } + }, + "required" : [ "boardInvolved" ], + "title" : "Board Involvement?", + "type" : "object" + }, + "type" : "input" + }, + "escalate" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to CISO", + "order" : 1, + "type" : "task" + }, + "extract-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Extract IOCs", + "next" : { + "block-iocs" : "" + }, + "order" : 5, + "schema" : { + "properties" : { + "iocs" : { + "items" : { + "type" : "string" + }, + "title" : "IOCs", + "type" : "array" + } + }, + "title" : "Extract IOCs", + "type" : "object" + }, + "type" : "input" + }, + "mail-available" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Mail available", + "next" : { + "block-sender" : "schemaKey == 'yes'", + "extract-iocs" : "schemaKey == 'yes'", + "search-email-gateway" : "schemaKey == 'no'" + }, + "order" : 2, + "schema" : { + "oneOf" : [ { + "properties" : { + "mail" : { + "title" : "Mail", + "type" : "string", + "x-display" : "textarea" + }, + "schemaKey" : { + "const" : "yes", + "type" : "string" + } + }, + "required" : [ "mail" ], + "title" : "Yes" + }, { + "properties" : { + "schemaKey" : { + "const" : "no", + "type" : "string" + } + }, + "title" : "No" + } ], + "title" : "Mail available", + "type" : "object" + }, + "type" : "input" + }, + "search-email-gateway" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Search email gateway", + "next" : { + "extract-iocs" : "" + }, + "order" : 4, + "type" : "task" + } + } + } + }, + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Remove an comment from an ticket", + "tags" : [ "tickets" ] + } + }, + "/tickets/{id}/files" : { + "put" : { + "description" : "Link files to an ticket. The files themself will be stored in object storage.", + "operationId" : "linkFiles", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8125, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/File" + }, + "type" : "array" + } + } + }, + "description" : "Added files", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "created" : "2021-10-02T16:04:59.078+0000", + "files" : [ { + "key" : "myfile", + "name" : "document.doc" + } ], + "id" : 8125, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "phishing from selenafadel@von.com detected", + "owner" : "demo", + "references" : [ { + "href" : "https://www.seniorleading-edge.name/users/efficient", + "name" : "recovery" + }, { + "href" : "http://www.dynamicseamless.com/clicks-and-mortar", + "name" : "force" + }, { + "href" : "http://www.leadscalable.biz/envisioneer", + "name" : "fund" + } ], + "schema" : "{}", + "status" : "closed", + "tickets" : [ { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } ], + "type" : "alert" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Link files to an ticket", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "files" + } + }, + "/tickets/{id}/playbooks" : { + "post" : { + "operationId" : "addTicketPlaybook", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8125, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/PlaybookTemplateForm" + } + } + }, + "description" : "Ticket playbook object that needs to be added", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "created" : "1985-04-12T23:20:50.520+0000", + "id" : 8125, + "modified" : "1985-04-12T23:20:50.520+0000", + "name" : "phishing from selenafadel@von.com detected", + "owner" : "demo", + "playbooks" : { + "simple" : { + "name" : "Simple", + "tasks" : { + "escalate" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to malware team", + "order" : 2, + "type" : "task" + }, + "hash" : { + "active" : false, + "automation" : "hash.sha1", + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Hash the malware", + "next" : { + "escalate" : "" + }, + "order" : 1, + "payload" : { + "default" : "playbook.tasks['input'].data['malware']" + }, + "type" : "automation" + }, + "input" : { + "active" : true, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Upload malware if possible", + "next" : { + "hash" : "malware != ''" + }, + "order" : 0, + "schema" : { + "properties" : { + "malware" : { + "default" : "", + "title" : "Select malware", + "type" : "string" + } + }, + "title" : "Malware", + "type" : "object" + }, + "type" : "input" + } + } + } + }, + "references" : [ { + "href" : "https://www.seniorleading-edge.name/users/efficient", + "name" : "recovery" + }, { + "href" : "http://www.dynamicseamless.com/clicks-and-mortar", + "name" : "force" + }, { + "href" : "http://www.leadscalable.biz/envisioneer", + "name" : "fund" + } ], + "schema" : "{}", + "status" : "closed", + "tickets" : [ { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } ], + "type" : "alert" + } + } + }, + "description" : "successful operation" + } + }, + "summary" : "Add a new ticket playbook", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "playbook" + } + }, + "/tickets/{id}/playbooks/{playbookID}" : { + "delete" : { + "operationId" : "removeTicketPlaybook", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "description" : "Playbook ID", + "example" : "phishing", + "in" : "path", + "name" : "playbookID", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + }, { + "name" : "leadreintermediate.io", + "status" : "malicious" + } ], + "created" : "1985-04-12T23:20:50.520+0000", + "id" : 8123, + "modified" : "1985-04-12T23:20:50.520+0000", + "name" : "live zebra", + "owner" : "demo", + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Remove an ticket playbook", + "tags" : [ "tickets" ] + } + }, + "/tickets/{id}/playbooks/{playbookID}/task/{taskID}" : { + "put" : { + "operationId" : "setTask", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "description" : "Playbook ID", + "example" : "phishing", + "in" : "path", + "name" : "playbookID", + "required" : true, + "schema" : { + "type" : "string" + } + }, { + "description" : "Task ID", + "example" : "board", + "in" : "path", + "name" : "taskID", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Task" + } + } + }, + "description" : "Task", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + }, { + "name" : "leadreintermediate.io", + "status" : "malicious" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8123, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "live zebra", + "owner" : "demo", + "playbooks" : { + "phishing" : { + "name" : "Phishing", + "tasks" : { + "block-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block IOCs", + "order" : 6, + "type" : "task" + }, + "block-sender" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block sender", + "next" : { + "extract-iocs" : "" + }, + "order" : 3, + "type" : "task" + }, + "board" : { + "active" : true, + "created" : "2021-10-02T16:04:59.078+0000", + "data" : { + "boardInvolved" : true + }, + "done" : false, + "name" : "Board Involvement?", + "next" : { + "escalate" : "boardInvolved == true", + "mail-available" : "boardInvolved == false" + }, + "order" : 0, + "schema" : { + "properties" : { + "boardInvolved" : { + "default" : false, + "title" : "A board member is involved.", + "type" : "boolean" + } + }, + "required" : [ "boardInvolved" ], + "title" : "Board Involvement?", + "type" : "object" + }, + "type" : "input" + }, + "escalate" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to CISO", + "order" : 1, + "type" : "task" + }, + "extract-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Extract IOCs", + "next" : { + "block-iocs" : "" + }, + "order" : 5, + "schema" : { + "properties" : { + "iocs" : { + "items" : { + "type" : "string" + }, + "title" : "IOCs", + "type" : "array" + } + }, + "title" : "Extract IOCs", + "type" : "object" + }, + "type" : "input" + }, + "mail-available" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Mail available", + "next" : { + "block-sender" : "schemaKey == 'yes'", + "extract-iocs" : "schemaKey == 'yes'", + "search-email-gateway" : "schemaKey == 'no'" + }, + "order" : 2, + "schema" : { + "oneOf" : [ { + "properties" : { + "mail" : { + "title" : "Mail", + "type" : "string", + "x-display" : "textarea" + }, + "schemaKey" : { + "const" : "yes", + "type" : "string" + } + }, + "required" : [ "mail" ], + "title" : "Yes" + }, { + "properties" : { + "schemaKey" : { + "const" : "no", + "type" : "string" + } + }, + "title" : "No" + } ], + "title" : "Mail available", + "type" : "object" + }, + "type" : "input" + }, + "search-email-gateway" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Search email gateway", + "next" : { + "extract-iocs" : "" + }, + "order" : 4, + "type" : "task" + } + } + } + }, + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Set a ticket playbook task", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "task" + } + }, + "/tickets/{id}/playbooks/{playbookID}/task/{taskID}/complete" : { + "put" : { + "operationId" : "completeTask", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "description" : "Playbook ID", + "example" : "phishing", + "in" : "path", + "name" : "playbookID", + "required" : true, + "schema" : { + "type" : "string" + } + }, { + "description" : "Task ID", + "example" : "board", + "in" : "path", + "name" : "taskID", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "type" : "object" + } + } + }, + "description" : "Ticket playbook object that needs to be added", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + }, { + "name" : "leadreintermediate.io", + "status" : "malicious" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8123, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "live zebra", + "owner" : "demo", + "playbooks" : { + "phishing" : { + "name" : "Phishing", + "tasks" : { + "block-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block IOCs", + "order" : 6, + "type" : "task" + }, + "block-sender" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block sender", + "next" : { + "extract-iocs" : "" + }, + "order" : 3, + "type" : "task" + }, + "board" : { + "active" : false, + "closed" : "2021-10-02T16:04:59.078+0000", + "created" : "2021-10-02T16:04:59.078+0000", + "data" : { + "boardInvolved" : true + }, + "done" : true, + "name" : "Board Involvement?", + "next" : { + "escalate" : "boardInvolved == true", + "mail-available" : "boardInvolved == false" + }, + "order" : 0, + "schema" : { + "properties" : { + "boardInvolved" : { + "default" : false, + "title" : "A board member is involved.", + "type" : "boolean" + } + }, + "required" : [ "boardInvolved" ], + "title" : "Board Involvement?", + "type" : "object" + }, + "type" : "input" + }, + "escalate" : { + "active" : true, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to CISO", + "order" : 1, + "type" : "task" + }, + "extract-iocs" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Extract IOCs", + "next" : { + "block-iocs" : "" + }, + "order" : 5, + "schema" : { + "properties" : { + "iocs" : { + "items" : { + "type" : "string" + }, + "title" : "IOCs", + "type" : "array" + } + }, + "title" : "Extract IOCs", + "type" : "object" + }, + "type" : "input" + }, + "mail-available" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Mail available", + "next" : { + "block-sender" : "schemaKey == 'yes'", + "extract-iocs" : "schemaKey == 'yes'", + "search-email-gateway" : "schemaKey == 'no'" + }, + "order" : 2, + "schema" : { + "oneOf" : [ { + "properties" : { + "mail" : { + "title" : "Mail", + "type" : "string", + "x-display" : "textarea" + }, + "schemaKey" : { + "const" : "yes", + "type" : "string" + } + }, + "required" : [ "mail" ], + "title" : "Yes" + }, { + "properties" : { + "schemaKey" : { + "const" : "no", + "type" : "string" + } + }, + "title" : "No" + } ], + "title" : "Mail available", + "type" : "object" + }, + "type" : "input" + }, + "search-email-gateway" : { + "active" : false, + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Search email gateway", + "next" : { + "extract-iocs" : "" + }, + "order" : 4, + "type" : "task" + } + } + } + }, + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Complete ticket playbook task", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "data" + } + }, + "/tickets/{id}/playbooks/{playbookID}/task/{taskID}/run" : { + "post" : { + "operationId" : "runTask", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8123, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + }, { + "description" : "Playbook ID", + "example" : "phishing", + "in" : "path", + "name" : "playbookID", + "required" : true, + "schema" : { + "type" : "string" + } + }, { + "description" : "Task ID", + "example" : "board", + "in" : "path", + "name" : "taskID", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "204" : { + "content" : { }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Run ticket playbook task", + "tags" : [ "tickets" ] + } + }, + "/tickets/{id}/references" : { + "put" : { + "operationId" : "setReferences", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8125, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/Reference" + }, + "type" : "array" + } + } + }, + "description" : "All ticket references", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8125, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "phishing from selenafadel@von.com detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.leadscalable.biz/envisioneer", + "name" : "fund" + } ], + "schema" : "{}", + "status" : "closed", + "tickets" : [ { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } ], + "type" : "alert" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Set ticket references", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "references" + } + }, + "/tickets/{id}/schema" : { + "put" : { + "operationId" : "setSchema", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8125, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "type" : "string" + } + } + }, + "description" : "New ticket schema", + "required" : false + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8125, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "phishing from selenafadel@von.com detected", + "owner" : "demo", + "references" : [ { + "href" : "https://www.seniorleading-edge.name/users/efficient", + "name" : "recovery" + }, { + "href" : "http://www.dynamicseamless.com/clicks-and-mortar", + "name" : "force" + }, { + "href" : "http://www.leadscalable.biz/envisioneer", + "name" : "fund" + } ], + "schema" : "{}", + "status" : "closed", + "tickets" : [ { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } ], + "type" : "alert" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Set ticket schema", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "schema" + } + }, + "/tickets/{id}/tickets" : { + "delete" : { + "operationId" : "unlinkTicket", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8126, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "format" : "int64", + "type" : "integer" + } + } + }, + "description" : "Added ticket ID", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Unlink an ticket to an ticket", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "linkedID" + }, + "patch" : { + "operationId" : "linkTicket", + "parameters" : [ { + "description" : "Ticket ID", + "example" : 8126, + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "format" : "int64", + "type" : "integer" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "format" : "int64", + "type" : "integer" + } + } + }, + "description" : "Added ticket ID", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "test" : { + "example" : { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8126, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "Surfaceintroduce virus detected", + "owner" : "demo", + "references" : [ { + "href" : "http://www.centralworld-class.io/synthesize", + "name" : "university" + }, { + "href" : "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name" : "goal" + }, { + "href" : "http://www.chiefsyndicate.io/action-items", + "name" : "unemployment" + } ], + "schema" : "{}", + "status" : "closed", + "tickets" : [ { + "artifacts" : [ { + "name" : "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status" : "unknown" + }, { + "name" : "http://www.customerviral.io/scalable/vertical/killer", + "status" : "clean" + }, { + "name" : "leadreintermediate.io", + "status" : "malicious" + } ], + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8123, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "live zebra", + "owner" : "demo", + "playbooks" : { + "phishing" : { + "name" : "Phishing", + "tasks" : { + "block-iocs" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block IOCs", + "type" : "task" + }, + "block-sender" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Block sender", + "next" : { + "extract-iocs" : "" + }, + "type" : "task" + }, + "board" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Board Involvement?", + "next" : { + "escalate" : "boardInvolved == true", + "mail-available" : "boardInvolved == false" + }, + "schema" : { + "properties" : { + "boardInvolved" : { + "default" : false, + "title" : "A board member is involved.", + "type" : "boolean" + } + }, + "required" : [ "boardInvolved" ], + "title" : "Board Involvement?", + "type" : "object" + }, + "type" : "input" + }, + "escalate" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Escalate to CISO", + "type" : "task" + }, + "extract-iocs" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Extract IOCs", + "next" : { + "block-iocs" : "" + }, + "schema" : { + "properties" : { + "iocs" : { + "items" : { + "type" : "string" + }, + "title" : "IOCs", + "type" : "array" + } + }, + "title" : "Extract IOCs", + "type" : "object" + }, + "type" : "input" + }, + "mail-available" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Mail available", + "next" : { + "block-sender" : "schemaKey == 'yes'", + "extract-iocs" : "schemaKey == 'yes'", + "search-email-gateway" : "schemaKey == 'no'" + }, + "schema" : { + "oneOf" : [ { + "properties" : { + "mail" : { + "title" : "Mail", + "type" : "string", + "x-display" : "textarea" + }, + "schemaKey" : { + "const" : "yes", + "type" : "string" + } + }, + "required" : [ "mail" ], + "title" : "Yes" + }, { + "properties" : { + "schemaKey" : { + "const" : "no", + "type" : "string" + } + }, + "title" : "No" + } ], + "title" : "Mail available", + "type" : "object" + }, + "type" : "input" + }, + "search-email-gateway" : { + "created" : "2021-10-02T16:04:59.078+0000", + "done" : false, + "name" : "Search email gateway", + "next" : { + "extract-iocs" : "" + }, + "type" : "task" + } + } + } + }, + "references" : [ { + "href" : "https://www.leadmaximize.net/e-services/back-end", + "name" : "performance" + }, { + "href" : "http://www.corporateinteractive.name/rich", + "name" : "autumn" + }, { + "href" : "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name" : "suggest" + } ], + "schema" : "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status" : "closed", + "type" : "incident" + }, { + "created" : "2021-10-02T16:04:59.078+0000", + "id" : 8125, + "modified" : "2021-10-02T16:04:59.078+0000", + "name" : "phishing from selenafadel@von.com detected", + "owner" : "demo", + "references" : [ { + "href" : "https://www.seniorleading-edge.name/users/efficient", + "name" : "recovery" + }, { + "href" : "http://www.dynamicseamless.com/clicks-and-mortar", + "name" : "force" + }, { + "href" : "http://www.leadscalable.biz/envisioneer", + "name" : "fund" + } ], + "schema" : "{}", + "status" : "closed", + "type" : "alert" + } ], + "type" : "alert" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Link an ticket to an ticket", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "linkedID" + } + }, + "/tickets/batch" : { + "post" : { + "operationId" : "createTicketBatch", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/TicketForm" + }, + "type" : "array" + } + } + }, + "description" : "New ticket", + "required" : true + }, + "responses" : { + "204" : { + "content" : { }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "ticket:write" ] + } ], + "summary" : "Create a new tickets in batch", + "tags" : [ "tickets" ], + "x-codegen-request-body-name" : "ticket" + } + }, + "/tickettypes" : { + "get" : { + "operationId" : "listTicketTypes", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/TicketTypeResponse" + }, + "type" : "array" + } + }, + "test" : { + "example" : [ { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-alert", + "id" : "alert", + "name" : "Alerts" + }, { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-radioactive", + "id" : "incident", + "name" : "Incidents" + }, { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-fingerprint", + "id" : "investigation", + "name" : "Forensic Investigations" + }, { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-target", + "id" : "hunt", + "name" : "Threat Hunting" + } ] + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "tickettype:read" ] + } ], + "summary" : "List tickettypes", + "tags" : [ "tickettypes" ] + }, + "post" : { + "operationId" : "createTicketType", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTypeForm" + } + } + }, + "description" : "New tickettype", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTypeResponse" + } + }, + "test" : { + "example" : { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-newspaper-variant-outline", + "id" : "ti-tickets", + "name" : "TI Tickets" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "tickettype:write" ] + } ], + "summary" : "Create a new tickettype", + "tags" : [ "tickettypes" ], + "x-codegen-request-body-name" : "tickettype" + } + }, + "/tickettypes/{id}" : { + "delete" : { + "operationId" : "deleteTicketType", + "parameters" : [ { + "description" : "TicketType ID", + "example" : "alert", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "204" : { + "content" : { }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "tickettype:write" ] + } ], + "summary" : "Delete a tickettype", + "tags" : [ "tickettypes" ] + }, + "get" : { + "operationId" : "getTicketType", + "parameters" : [ { + "description" : "TicketType ID", + "example" : "alert", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTypeResponse" + } + }, + "test" : { + "example" : { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-alert", + "id" : "alert", + "name" : "Alerts" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "tickettype:read" ] + } ], + "summary" : "Get a single tickettype", + "tags" : [ "tickettypes" ] + }, + "put" : { + "operationId" : "updateTicketType", + "parameters" : [ { + "description" : "TicketType ID", + "example" : "alert", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTypeForm" + } + } + }, + "description" : "TicketType object that needs to be added", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/TicketTypeResponse" + } + }, + "test" : { + "example" : { + "default_playbooks" : [ ], + "default_template" : "default", + "icon" : "mdi-bell", + "id" : "alert", + "name" : "Alerts" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "tickettype:write" ] + } ], + "summary" : "Update an existing tickettype", + "tags" : [ "tickettypes" ], + "x-codegen-request-body-name" : "tickettype" + } + }, + "/userdata" : { + "get" : { + "operationId" : "listUserData", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/UserDataResponse" + }, + "type" : "array" + } + }, + "test" : { + "example" : [ { + "email" : "bob@example.org", + "id" : "bob", + "name" : "Bob Bad" + } ] + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "userdata:read" ] + } ], + "summary" : "List userdata", + "tags" : [ "userdata" ] + } + }, + "/userdata/{id}" : { + "get" : { + "operationId" : "getUserData", + "parameters" : [ { + "description" : "User Data ID", + "example" : "bob", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/UserDataResponse" + } + }, + "test" : { + "example" : { + "email" : "bob@example.org", + "id" : "bob", + "name" : "Bob Bad" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "userdata:read" ] + } ], + "summary" : "Get a single user data", + "tags" : [ "userdata" ] + }, + "put" : { + "operationId" : "updateUserData", + "parameters" : [ { + "description" : "User Data ID", + "example" : "bob", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/UserData" + } + } + }, + "description" : "User data object that needs to be added", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/UserDataResponse" + } + }, + "test" : { + "example" : { + "email" : "bob@example.org", + "id" : "bob", + "name" : "Bob Bad" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "userdata:write" ] + } ], + "summary" : "Update an existing user data", + "tags" : [ "userdata" ], + "x-codegen-request-body-name" : "userdata" + } + }, + "/users" : { + "get" : { + "operationId" : "listUsers", + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "items" : { + "$ref" : "#/components/schemas/UserResponse" + }, + "type" : "array" + } + }, + "test" : { + "example" : [ { + "apikey" : false, + "blocked" : false, + "id" : "bob", + "roles" : [ "admin:backup:read", "admin:backup:restore", "admin:group:write", "admin:job:read", "admin:job:write", "admin:log:read", "admin:ticket:delete", "admin:user:write", "admin:userdata:read", "admin:userdata:write", "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write" ] + }, { + "apikey" : true, + "blocked" : false, + "id" : "script", + "roles" : [ "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write" ] + } ] + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "user:read" ] + } ], + "summary" : "List users", + "tags" : [ "users" ] + }, + "post" : { + "operationId" : "createUser", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/UserForm" + } + } + }, + "description" : "user object that needs to be added", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/NewUserResponse" + } + }, + "test" : { + "example" : { + "blocked" : false, + "id" : "syncscript", + "roles" : [ "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read" ], + "secret" : "v39bOuobnlEljfWzjAgoKzhmnh1xSMxH" + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "user:write" ] + } ], + "summary" : "Create user", + "tags" : [ "users" ], + "x-codegen-request-body-name" : "user" + } + }, + "/users/{id}" : { + "delete" : { + "operationId" : "deleteUser", + "parameters" : [ { + "description" : "user ID", + "example" : "script", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "204" : { + "content" : { }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "user:write" ] + } ], + "summary" : "Delete user", + "tags" : [ "users" ] + }, + "get" : { + "operationId" : "getUser", + "parameters" : [ { + "description" : "user ID", + "example" : "script", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/UserResponse" + } + }, + "test" : { + "example" : { + "apikey" : true, + "blocked" : false, + "id" : "script", + "roles" : [ "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write" ] + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "user:read" ] + } ], + "summary" : "Get a single user", + "tags" : [ "users" ] + }, + "put" : { + "operationId" : "updateUser", + "parameters" : [ { + "description" : "Template ID", + "example" : "bob", + "in" : "path", + "name" : "id", + "required" : true, + "schema" : { + "type" : "string" + } + } ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/UserForm" + } + } + }, + "description" : "user object that needs to be added", + "required" : true + }, + "responses" : { + "200" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/UserResponse" + } + }, + "test" : { + "example" : { + "apikey" : false, + "blocked" : false, + "id" : "bob", + "roles" : [ "admin:backup:read", "admin:backup:restore", "admin:group:write", "admin:job:read", "admin:job:write", "admin:log:read", "admin:ticket:delete", "admin:user:write", "admin:userdata:read", "admin:userdata:write", "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write" ] + } + } + }, + "description" : "successful operation" + } + }, + "security" : [ { + "roles" : [ "user:write" ] + } ], + "summary" : "Update user", + "tags" : [ "users" ], + "x-codegen-request-body-name" : "user" + } + } + }, + "components" : { + "schemas" : { + "Artifact" : { + "properties" : { + "enrichments" : { + "additionalProperties" : { + "$ref" : "#/components/schemas/Enrichment" + }, + "type" : "object" + }, + "name" : { + "example" : "2.2.2.2", + "type" : "string" + }, + "status" : { + "example" : "Unknown", + "type" : "string" + }, + "type" : { + "type" : "string" + } + }, + "required" : [ "name" ], + "type" : "object" + }, + "ArtifactOrigin" : { + "properties" : { + "artifact" : { + "type" : "string" + }, + "ticket_id" : { + "format" : "int64", + "type" : "integer" + } + }, + "required" : [ "artifact", "ticket_id" ], + "type" : "object" + }, + "Automation" : { + "properties" : { + "image" : { + "type" : "string" + }, + "schema" : { + "example" : "{}", + "type" : "string" + }, + "script" : { + "type" : "string" + }, + "type" : { + "items" : { + "enum" : [ "artifact", "playbook", "global" ], + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "image", "script", "type" ], + "type" : "object" + }, + "AutomationForm" : { + "properties" : { + "id" : { + "type" : "string" + }, + "image" : { + "type" : "string" + }, + "schema" : { + "example" : "{}", + "type" : "string" + }, + "script" : { + "type" : "string" + }, + "type" : { + "items" : { + "enum" : [ "artifact", "playbook", "global" ], + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "id", "image", "script", "type" ], + "type" : "object" + }, + "AutomationResponse" : { + "properties" : { + "id" : { + "type" : "string" + }, + "image" : { + "type" : "string" + }, + "schema" : { + "example" : "{}", + "type" : "string" + }, + "script" : { + "type" : "string" + }, + "type" : { + "items" : { + "enum" : [ "artifact", "playbook", "global" ], + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "id", "image", "script", "type" ], + "type" : "object" + }, + "Comment" : { + "properties" : { + "created" : { + "format" : "date-time", + "type" : "string" + }, + "creator" : { + "type" : "string" + }, + "message" : { + "type" : "string" + } + }, + "required" : [ "created", "creator", "message" ], + "type" : "object" + }, + "CommentForm" : { + "properties" : { + "created" : { + "format" : "date-time", + "type" : "string" + }, + "creator" : { + "type" : "string" + }, + "message" : { + "type" : "string" + } + }, + "required" : [ "message" ], + "type" : "object" + }, + "Context" : { + "properties" : { + "artifact" : { + "$ref" : "#/components/schemas/Artifact" + }, + "playbook" : { + "$ref" : "#/components/schemas/PlaybookResponse" + }, + "task" : { + "$ref" : "#/components/schemas/TaskResponse" + }, + "ticket" : { + "$ref" : "#/components/schemas/TicketResponse" + } + }, + "type" : "object" + }, + "Enrichment" : { + "properties" : { + "created" : { + "format" : "date-time", + "type" : "string" + }, + "data" : { + "example" : { + "hash" : "b7a067a742c20d07a7456646de89bc2d408a1153" + }, + "properties" : { }, + "type" : "object" + }, + "name" : { + "example" : "hash.sha1", + "type" : "string" + } + }, + "required" : [ "created", "data", "name" ], + "type" : "object" + }, + "EnrichmentForm" : { + "properties" : { + "data" : { + "example" : { + "hash" : "b7a067a742c20d07a7456646de89bc2d408a1153" + }, + "properties" : { }, + "type" : "object" + }, + "name" : { + "example" : "hash.sha1", + "type" : "string" + } + }, + "required" : [ "data", "name" ], + "type" : "object" + }, + "File" : { + "properties" : { + "key" : { + "example" : "myfile", + "type" : "string" + }, + "name" : { + "example" : "notes.docx", + "type" : "string" + } + }, + "required" : [ "key", "name" ], + "type" : "object" + }, + "Job" : { + "properties" : { + "automation" : { + "type" : "string" + }, + "container" : { + "type" : "string" + }, + "log" : { + "type" : "string" + }, + "origin" : { + "$ref" : "#/components/schemas/Origin" + }, + "output" : { + "properties" : { }, + "type" : "object" + }, + "payload" : { + "type" : "object" + }, + "running" : { + "type" : "boolean" + }, + "status" : { + "type" : "string" + } + }, + "required" : [ "automation", "running", "status" ], + "type" : "object" + }, + "JobForm" : { + "properties" : { + "automation" : { + "type" : "string" + }, + "origin" : { + "$ref" : "#/components/schemas/Origin" + }, + "payload" : { + "type" : "object" + } + }, + "required" : [ "automation" ], + "type" : "object" + }, + "JobResponse" : { + "properties" : { + "automation" : { + "type" : "string" + }, + "container" : { + "type" : "string" + }, + "id" : { + "type" : "string" + }, + "log" : { + "type" : "string" + }, + "origin" : { + "$ref" : "#/components/schemas/Origin" + }, + "output" : { + "properties" : { }, + "type" : "object" + }, + "payload" : { + "type" : "object" + }, + "status" : { + "type" : "string" + } + }, + "required" : [ "automation", "id", "status" ], + "type" : "object" + }, + "LogEntry" : { + "properties" : { + "created" : { + "format" : "date-time", + "type" : "string" + }, + "creator" : { + "type" : "string" + }, + "message" : { + "type" : "string" + }, + "reference" : { + "type" : "string" + } + }, + "required" : [ "created", "creator", "message", "reference" ], + "type" : "object" + }, + "Message" : { + "properties" : { + "context" : { + "$ref" : "#/components/schemas/Context" + }, + "payload" : { + "properties" : { }, + "type" : "object" + }, + "secrets" : { + "additionalProperties" : { + "type" : "string" + }, + "type" : "object" + } + }, + "type" : "object" + }, + "NewUserResponse" : { + "properties" : { + "blocked" : { + "type" : "boolean" + }, + "id" : { + "type" : "string" + }, + "roles" : { + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "secret" : { + "type" : "string" + } + }, + "required" : [ "blocked", "id", "roles" ], + "type" : "object" + }, + "Origin" : { + "properties" : { + "artifact_origin" : { + "$ref" : "#/components/schemas/ArtifactOrigin" + }, + "task_origin" : { + "$ref" : "#/components/schemas/TaskOrigin" + } + }, + "type" : "object" + }, + "Playbook" : { + "properties" : { + "name" : { + "example" : "Phishing", + "type" : "string" + }, + "tasks" : { + "additionalProperties" : { + "$ref" : "#/components/schemas/Task" + }, + "type" : "object" + } + }, + "required" : [ "name", "tasks" ], + "type" : "object" + }, + "PlaybookResponse" : { + "properties" : { + "name" : { + "example" : "Phishing", + "type" : "string" + }, + "tasks" : { + "additionalProperties" : { + "$ref" : "#/components/schemas/TaskResponse" + }, + "type" : "object" + } + }, + "required" : [ "name", "tasks" ], + "type" : "object" + }, + "PlaybookTemplate" : { + "properties" : { + "name" : { + "type" : "string" + }, + "yaml" : { + "type" : "string" + } + }, + "required" : [ "name", "yaml" ], + "type" : "object" + }, + "PlaybookTemplateForm" : { + "properties" : { + "id" : { + "type" : "string" + }, + "yaml" : { + "type" : "string" + } + }, + "required" : [ "yaml" ], + "type" : "object" + }, + "PlaybookTemplateResponse" : { + "properties" : { + "id" : { + "type" : "string" + }, + "name" : { + "type" : "string" + }, + "yaml" : { + "type" : "string" + } + }, + "required" : [ "id", "name", "yaml" ], + "type" : "object" + }, + "Reference" : { + "properties" : { + "href" : { + "example" : "https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0144", + "type" : "string" + }, + "name" : { + "example" : "CVE-2017-0144", + "type" : "string" + } + }, + "required" : [ "href", "name" ], + "type" : "object" + }, + "Settings" : { + "properties" : { + "artifactStates" : { + "items" : { + "$ref" : "#/components/schemas/Type" + }, + "title" : "Artifact States", + "type" : "array" + }, + "roles" : { + "items" : { + "type" : "string" + }, + "title" : "Roles", + "type" : "array" + }, + "ticketTypes" : { + "items" : { + "$ref" : "#/components/schemas/TicketTypeResponse" + }, + "title" : "Ticket Types", + "type" : "array" + }, + "tier" : { + "enum" : [ "community", "enterprise" ], + "title" : "Tier", + "type" : "string" + }, + "timeformat" : { + "title" : "Time Format", + "type" : "string" + }, + "version" : { + "title" : "Version", + "type" : "string" + } + }, + "required" : [ "artifactStates", "ticketTypes", "tier", "timeformat", "version" ], + "type" : "object" + }, + "Statistics" : { + "properties" : { + "open_tickets_per_user" : { + "additionalProperties" : { + "type" : "integer" + }, + "type" : "object" + }, + "tickets_per_type" : { + "additionalProperties" : { + "type" : "integer" + }, + "type" : "object" + }, + "tickets_per_week" : { + "additionalProperties" : { + "type" : "integer" + }, + "type" : "object" + }, + "unassigned" : { + "type" : "integer" + } + }, + "required" : [ "open_tickets_per_user", "tickets_per_type", "tickets_per_week", "unassigned" ], + "type" : "object" + }, + "Task" : { + "properties" : { + "automation" : { + "type" : "string" + }, + "closed" : { + "format" : "date-time", + "type" : "string" + }, + "created" : { + "format" : "date-time", + "type" : "string" + }, + "data" : { + "properties" : { }, + "type" : "object" + }, + "done" : { + "type" : "boolean" + }, + "join" : { + "example" : false, + "type" : "boolean" + }, + "name" : { + "example" : "Inform user", + "type" : "string" + }, + "next" : { + "additionalProperties" : { + "type" : "string" + }, + "type" : "object" + }, + "owner" : { + "type" : "string" + }, + "payload" : { + "additionalProperties" : { + "type" : "string" + }, + "type" : "object" + }, + "schema" : { + "properties" : { }, + "type" : "object" + }, + "type" : { + "enum" : [ "task", "input", "automation" ], + "example" : "task", + "type" : "string" + } + }, + "required" : [ "created", "done", "name", "type" ], + "type" : "object" + }, + "TaskForm" : { + "properties" : { + "automation" : { + "type" : "string" + }, + "closed" : { + "format" : "date-time", + "type" : "string" + }, + "created" : { + "format" : "date-time", + "type" : "string" + }, + "data" : { + "properties" : { }, + "type" : "object" + }, + "done" : { + "type" : "boolean" + }, + "join" : { + "example" : false, + "type" : "boolean" + }, + "name" : { + "example" : "Inform user", + "type" : "string" + }, + "next" : { + "additionalProperties" : { + "type" : "string" + }, + "type" : "object" + }, + "owner" : { + "type" : "string" + }, + "payload" : { + "additionalProperties" : { + "type" : "string" + }, + "type" : "object" + }, + "schema" : { + "properties" : { }, + "type" : "object" + }, + "type" : { + "enum" : [ "task", "input", "automation" ], + "example" : "task", + "type" : "string" + } + }, + "required" : [ "name", "type" ], + "type" : "object" + }, + "TaskOrigin" : { + "properties" : { + "playbook_id" : { + "type" : "string" + }, + "task_id" : { + "type" : "string" + }, + "ticket_id" : { + "format" : "int64", + "type" : "integer" + } + }, + "required" : [ "playbook_id", "task_id", "ticket_id" ], + "type" : "object" + }, + "TaskResponse" : { + "properties" : { + "active" : { + "example" : false, + "type" : "boolean" + }, + "automation" : { + "type" : "string" + }, + "closed" : { + "format" : "date-time", + "type" : "string" + }, + "created" : { + "format" : "date-time", + "type" : "string" + }, + "data" : { + "properties" : { }, + "type" : "object" + }, + "done" : { + "type" : "boolean" + }, + "join" : { + "example" : false, + "type" : "boolean" + }, + "name" : { + "example" : "Inform user", + "type" : "string" + }, + "next" : { + "additionalProperties" : { + "type" : "string" + }, + "type" : "object" + }, + "order" : { + "example" : 2.0, + "format" : "int64", + "type" : "number" + }, + "owner" : { + "type" : "string" + }, + "payload" : { + "additionalProperties" : { + "type" : "string" + }, + "type" : "object" + }, + "schema" : { + "properties" : { }, + "type" : "object" + }, + "type" : { + "enum" : [ "task", "input", "automation" ], + "example" : "task", + "type" : "string" + } + }, + "required" : [ "active", "created", "done", "name", "order", "type" ], + "type" : "object" + }, + "TaskWithContext" : { + "properties" : { + "playbook_id" : { + "type" : "string" + }, + "playbook_name" : { + "type" : "string" + }, + "task" : { + "$ref" : "#/components/schemas/TaskResponse" + }, + "task_id" : { + "type" : "string" + }, + "ticket_id" : { + "format" : "int64", + "type" : "number" + }, + "ticket_name" : { + "type" : "string" + } + }, + "required" : [ "playbook_id", "playbook_name", "task", "task_id", "ticket_id", "ticket_name" ], + "type" : "object" + }, + "Ticket" : { + "properties" : { + "artifacts" : { + "items" : { + "$ref" : "#/components/schemas/Artifact" + }, + "type" : "array" + }, + "comments" : { + "items" : { + "$ref" : "#/components/schemas/Comment" + }, + "type" : "array" + }, + "created" : { + "format" : "date-time", + "type" : "string" + }, + "details" : { + "example" : { + "description" : "my little incident" + }, + "properties" : { }, + "type" : "object" + }, + "files" : { + "items" : { + "$ref" : "#/components/schemas/File" + }, + "type" : "array" + }, + "modified" : { + "format" : "date-time", + "type" : "string" + }, + "name" : { + "example" : "WannyCry", + "type" : "string" + }, + "owner" : { + "example" : "bob", + "type" : "string" + }, + "playbooks" : { + "additionalProperties" : { + "$ref" : "#/components/schemas/Playbook" + }, + "type" : "object" + }, + "read" : { + "example" : [ "bob" ], + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "references" : { + "items" : { + "$ref" : "#/components/schemas/Reference" + }, + "type" : "array" + }, + "schema" : { + "example" : "{}", + "type" : "string" + }, + "status" : { + "example" : "open", + "type" : "string" + }, + "type" : { + "example" : "incident", + "type" : "string" + }, + "write" : { + "example" : [ "alice" ], + "items" : { + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "created", "modified", "name", "schema", "status", "type" ], + "type" : "object" + }, + "TicketForm" : { + "properties" : { + "artifacts" : { + "items" : { + "$ref" : "#/components/schemas/Artifact" + }, + "type" : "array" + }, + "comments" : { + "items" : { + "$ref" : "#/components/schemas/Comment" + }, + "type" : "array" + }, + "created" : { + "format" : "date-time", + "type" : "string" + }, + "details" : { + "example" : { + "description" : "my little incident" + }, + "properties" : { }, + "type" : "object" + }, + "files" : { + "items" : { + "$ref" : "#/components/schemas/File" + }, + "type" : "array" + }, + "id" : { + "example" : 123, + "format" : "int64", + "type" : "integer" + }, + "modified" : { + "format" : "date-time", + "type" : "string" + }, + "name" : { + "example" : "WannyCry", + "type" : "string" + }, + "owner" : { + "example" : "bob", + "type" : "string" + }, + "playbooks" : { + "items" : { + "$ref" : "#/components/schemas/PlaybookTemplateForm" + }, + "type" : "array" + }, + "read" : { + "example" : [ "bob" ], + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "references" : { + "items" : { + "$ref" : "#/components/schemas/Reference" + }, + "type" : "array" + }, + "schema" : { + "example" : "{}", + "type" : "string" + }, + "status" : { + "example" : "open", + "type" : "string" + }, + "type" : { + "example" : "incident", + "type" : "string" + }, + "write" : { + "example" : [ "alice" ], + "items" : { + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "name", "status", "type" ], + "type" : "object" + }, + "TicketList" : { + "properties" : { + "count" : { + "example" : 3.0, + "type" : "number" + }, + "tickets" : { + "items" : { + "$ref" : "#/components/schemas/TicketSimpleResponse" + }, + "type" : "array" + } + }, + "required" : [ "count", "tickets" ], + "type" : "object" + }, + "TicketResponse" : { + "properties" : { + "artifacts" : { + "items" : { + "$ref" : "#/components/schemas/Artifact" + }, + "type" : "array" + }, + "comments" : { + "items" : { + "$ref" : "#/components/schemas/Comment" + }, + "type" : "array" + }, + "created" : { + "format" : "date-time", + "type" : "string" + }, + "details" : { + "example" : { + "description" : "my little incident" + }, + "properties" : { }, + "type" : "object" + }, + "files" : { + "items" : { + "$ref" : "#/components/schemas/File" + }, + "type" : "array" + }, + "id" : { + "example" : 123, + "format" : "int64", + "type" : "integer" + }, + "modified" : { + "format" : "date-time", + "type" : "string" + }, + "name" : { + "example" : "WannyCry", + "type" : "string" + }, + "owner" : { + "example" : "bob", + "type" : "string" + }, + "playbooks" : { + "additionalProperties" : { + "$ref" : "#/components/schemas/PlaybookResponse" + }, + "type" : "object" + }, + "read" : { + "example" : [ "bob" ], + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "references" : { + "items" : { + "$ref" : "#/components/schemas/Reference" + }, + "type" : "array" + }, + "schema" : { + "example" : "{}", + "type" : "string" + }, + "status" : { + "example" : "open", + "type" : "string" + }, + "type" : { + "example" : "incident", + "type" : "string" + }, + "write" : { + "example" : [ "alice" ], + "items" : { + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "created", "id", "modified", "name", "schema", "status", "type" ], + "type" : "object" + }, + "TicketSimpleResponse" : { + "properties" : { + "artifacts" : { + "items" : { + "$ref" : "#/components/schemas/Artifact" + }, + "type" : "array" + }, + "comments" : { + "items" : { + "$ref" : "#/components/schemas/Comment" + }, + "type" : "array" + }, + "created" : { + "format" : "date-time", + "type" : "string" + }, + "details" : { + "example" : { + "description" : "my little incident" + }, + "properties" : { }, + "type" : "object" + }, + "files" : { + "items" : { + "$ref" : "#/components/schemas/File" + }, + "type" : "array" + }, + "id" : { + "example" : 123, + "format" : "int64", + "type" : "integer" + }, + "modified" : { + "format" : "date-time", + "type" : "string" + }, + "name" : { + "example" : "WannyCry", + "type" : "string" + }, + "owner" : { + "example" : "bob", + "type" : "string" + }, + "playbooks" : { + "additionalProperties" : { + "$ref" : "#/components/schemas/Playbook" + }, + "type" : "object" + }, + "read" : { + "example" : [ "bob" ], + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "references" : { + "items" : { + "$ref" : "#/components/schemas/Reference" + }, + "type" : "array" + }, + "schema" : { + "example" : "{}", + "type" : "string" + }, + "status" : { + "example" : "open", + "type" : "string" + }, + "type" : { + "example" : "incident", + "type" : "string" + }, + "write" : { + "example" : [ "alice" ], + "items" : { + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "created", "id", "modified", "name", "schema", "status", "type" ], + "type" : "object" + }, + "TicketTemplate" : { + "properties" : { + "name" : { + "type" : "string" + }, + "schema" : { + "type" : "string" + } + }, + "required" : [ "name", "schema" ], + "type" : "object" + }, + "TicketTemplateForm" : { + "properties" : { + "id" : { + "type" : "string" + }, + "name" : { + "type" : "string" + }, + "schema" : { + "type" : "string" + } + }, + "required" : [ "name", "schema" ], + "type" : "object" + }, + "TicketTemplateResponse" : { + "properties" : { + "id" : { + "type" : "string" + }, + "name" : { + "type" : "string" + }, + "schema" : { + "type" : "string" + } + }, + "required" : [ "id", "name", "schema" ], + "type" : "object" + }, + "TicketType" : { + "properties" : { + "default_groups" : { + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "default_playbooks" : { + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "default_template" : { + "type" : "string" + }, + "icon" : { + "type" : "string" + }, + "name" : { + "type" : "string" + } + }, + "required" : [ "default_playbooks", "default_template", "icon", "name" ], + "type" : "object" + }, + "TicketTypeForm" : { + "properties" : { + "default_groups" : { + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "default_playbooks" : { + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "default_template" : { + "type" : "string" + }, + "icon" : { + "type" : "string" + }, + "id" : { + "type" : "string" + }, + "name" : { + "type" : "string" + } + }, + "required" : [ "default_playbooks", "default_template", "icon", "name" ], + "type" : "object" + }, + "TicketTypeResponse" : { + "properties" : { + "default_groups" : { + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "default_playbooks" : { + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "default_template" : { + "type" : "string" + }, + "icon" : { + "type" : "string" + }, + "id" : { + "type" : "string" + }, + "name" : { + "type" : "string" + } + }, + "required" : [ "default_playbooks", "default_template", "icon", "id", "name" ], + "type" : "object" + }, + "TicketWithTickets" : { + "properties" : { + "artifacts" : { + "items" : { + "$ref" : "#/components/schemas/Artifact" + }, + "type" : "array" + }, + "comments" : { + "items" : { + "$ref" : "#/components/schemas/Comment" + }, + "type" : "array" + }, + "created" : { + "format" : "date-time", + "type" : "string" + }, + "details" : { + "example" : { + "description" : "my little incident" + }, + "properties" : { }, + "type" : "object" + }, + "files" : { + "items" : { + "$ref" : "#/components/schemas/File" + }, + "type" : "array" + }, + "id" : { + "example" : 123, + "format" : "int64", + "type" : "integer" + }, + "modified" : { + "format" : "date-time", + "type" : "string" + }, + "name" : { + "example" : "WannyCry", + "type" : "string" + }, + "owner" : { + "example" : "bob", + "type" : "string" + }, + "playbooks" : { + "additionalProperties" : { + "$ref" : "#/components/schemas/PlaybookResponse" + }, + "type" : "object" + }, + "read" : { + "example" : [ "bob" ], + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "references" : { + "items" : { + "$ref" : "#/components/schemas/Reference" + }, + "type" : "array" + }, + "schema" : { + "example" : "{}", + "type" : "string" + }, + "status" : { + "example" : "open", + "type" : "string" + }, + "tickets" : { + "items" : { + "$ref" : "#/components/schemas/TicketSimpleResponse" + }, + "type" : "array" + }, + "type" : { + "example" : "incident", + "type" : "string" + }, + "write" : { + "example" : [ "alice" ], + "items" : { + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "created", "id", "modified", "name", "schema", "status", "type" ], + "type" : "object" + }, + "Type" : { + "properties" : { + "color" : { + "enum" : [ "error", "info", "success", "warning" ], + "title" : "Color", + "type" : "string", + "x-cols" : 3 + }, + "icon" : { + "title" : "Icon (https://materialdesignicons.com)", + "type" : "string", + "x-cols" : 3, + "x-class" : "pr-2" + }, + "id" : { + "title" : "ID", + "type" : "string", + "x-cols" : 3, + "x-class" : "pr-2" + }, + "name" : { + "title" : "Name", + "type" : "string", + "x-cols" : 3, + "x-class" : "pr-2" + } + }, + "required" : [ "icon", "id", "name" ], + "type" : "object" + }, + "User" : { + "properties" : { + "apikey" : { + "type" : "boolean" + }, + "blocked" : { + "type" : "boolean" + }, + "roles" : { + "items" : { + "type" : "string" + }, + "type" : "array" + }, + "sha256" : { + "type" : "string" + } + }, + "required" : [ "apikey", "blocked", "roles" ], + "type" : "object" + }, + "UserData" : { + "properties" : { + "email" : { + "type" : "string" + }, + "image" : { + "type" : "string", + "x-display" : "custom-avatar" + }, + "name" : { + "type" : "string" + }, + "timeformat" : { + "title" : "Time Format (https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens)", + "type" : "string" + } + }, + "type" : "object" + }, + "UserDataResponse" : { + "properties" : { + "email" : { + "type" : "string" + }, + "id" : { + "type" : "string" + }, + "image" : { + "type" : "string", + "x-display" : "custom-avatar" + }, + "name" : { + "type" : "string" + }, + "timeformat" : { + "title" : "Time Format (https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens)", + "type" : "string" + } + }, + "required" : [ "id" ], + "type" : "object" + }, + "UserForm" : { + "properties" : { + "apikey" : { + "type" : "boolean" + }, + "blocked" : { + "type" : "boolean" + }, + "id" : { + "type" : "string" + }, + "roles" : { + "items" : { + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "apikey", "blocked", "id", "roles" ], + "type" : "object" + }, + "UserResponse" : { + "properties" : { + "apikey" : { + "type" : "boolean" + }, + "blocked" : { + "type" : "boolean" + }, + "id" : { + "type" : "string" + }, + "roles" : { + "items" : { + "type" : "string" + }, + "type" : "array" + } + }, + "required" : [ "apikey", "blocked", "id", "roles" ], + "type" : "object" + } + } + }, + "x-original-swagger-version" : "2.0" +} \ No newline at end of file diff --git a/generated/community.yml b/generated/community.yml new file mode 100644 index 0000000..26fbae4 --- /dev/null +++ b/generated/community.yml @@ -0,0 +1,6646 @@ +basePath: /api +consumes: +- application/json +definitions: + Artifact: + properties: + enrichments: + additionalProperties: + $ref: '#/definitions/Enrichment' + type: object + name: + example: 2.2.2.2 + type: string + status: + example: Unknown + type: string + type: + type: string + required: + - name + type: object + ArtifactOrigin: + properties: + artifact: + type: string + ticket_id: + format: int64 + type: integer + required: + - ticket_id + - artifact + type: object + Automation: + properties: + image: + type: string + schema: + example: '{}' + type: string + script: + type: string + type: + items: + enum: + - artifact + - playbook + - global + type: string + type: array + required: + - image + - script + - type + type: object + AutomationForm: + properties: + id: + type: string + image: + type: string + schema: + example: '{}' + type: string + script: + type: string + type: + items: + enum: + - artifact + - playbook + - global + type: string + type: array + required: + - id + - image + - script + - type + type: object + AutomationResponse: + properties: + id: + type: string + image: + type: string + schema: + example: '{}' + type: string + script: + type: string + type: + items: + enum: + - artifact + - playbook + - global + type: string + type: array + required: + - id + - image + - script + - type + type: object + Comment: + properties: + created: + format: date-time + type: string + creator: + type: string + message: + type: string + required: + - creator + - created + - message + type: object + CommentForm: + properties: + created: + format: date-time + type: string + creator: + type: string + message: + type: string + required: + - message + type: object + Context: + properties: + artifact: + $ref: '#/definitions/Artifact' + playbook: + $ref: '#/definitions/PlaybookResponse' + task: + $ref: '#/definitions/TaskResponse' + ticket: + $ref: '#/definitions/TicketResponse' + type: object + Enrichment: + properties: + created: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + data: + example: + hash: b7a067a742c20d07a7456646de89bc2d408a1153 + type: object + name: + example: hash.sha1 + type: string + required: + - name + - data + - created + type: object + EnrichmentForm: + properties: + data: + example: + hash: b7a067a742c20d07a7456646de89bc2d408a1153 + type: object + name: + example: hash.sha1 + type: string + required: + - name + - data + type: object + File: + properties: + key: + example: myfile + type: string + name: + example: notes.docx + type: string + required: + - key + - name + type: object + Job: + properties: + automation: + type: string + container: + type: string + log: + type: string + origin: + $ref: '#/definitions/Origin' + output: + type: object + payload: {} + running: + type: boolean + status: + type: string + required: + - automation + - running + - status + type: object + JobForm: + properties: + automation: + type: string + origin: + $ref: '#/definitions/Origin' + payload: {} + required: + - automation + type: object + JobResponse: + properties: + automation: + type: string + container: + type: string + id: + type: string + log: + type: string + origin: + $ref: '#/definitions/Origin' + output: + type: object + payload: {} + status: + type: string + required: + - id + - automation + - status + type: object + LogEntry: + properties: + created: + format: date-time + type: string + creator: + type: string + message: + type: string + reference: + type: string + required: + - reference + - creator + - created + - message + type: object + Message: + properties: + context: + $ref: '#/definitions/Context' + payload: + type: object + secrets: + additionalProperties: + type: string + type: object + type: object + NewUserResponse: + properties: + blocked: + type: boolean + id: + type: string + roles: + items: + type: string + type: array + secret: + type: string + required: + - id + - blocked + - roles + type: object + Origin: + properties: + artifact_origin: + $ref: '#/definitions/ArtifactOrigin' + task_origin: + $ref: '#/definitions/TaskOrigin' + type: object + Playbook: + properties: + name: + example: Phishing + type: string + tasks: + additionalProperties: + $ref: '#/definitions/Task' + type: object + required: + - name + - tasks + type: object + PlaybookResponse: + properties: + name: + example: Phishing + type: string + tasks: + additionalProperties: + $ref: '#/definitions/TaskResponse' + type: object + required: + - name + - tasks + type: object + PlaybookTemplate: + properties: + name: + type: string + yaml: + type: string + required: + - name + - yaml + type: object + PlaybookTemplateForm: + properties: + id: + type: string + yaml: + type: string + required: + - yaml + type: object + PlaybookTemplateResponse: + properties: + id: + type: string + name: + type: string + yaml: + type: string + required: + - id + - name + - yaml + type: object + Reference: + properties: + href: + example: https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0144 + type: string + name: + example: CVE-2017-0144 + type: string + required: + - name + - href + type: object + Settings: + properties: + artifactStates: + items: + $ref: '#/definitions/Type' + title: Artifact States + type: array + roles: + items: + type: string + title: Roles + type: array + ticketTypes: + items: + $ref: '#/definitions/TicketTypeResponse' + title: Ticket Types + type: array + tier: + enum: + - community + - enterprise + title: Tier + type: string + timeformat: + title: Time Format + type: string + version: + title: Version + type: string + required: + - version + - tier + - timeformat + - ticketTypes + - artifactStates + type: object + Statistics: + properties: + open_tickets_per_user: + additionalProperties: + type: integer + type: object + tickets_per_type: + additionalProperties: + type: integer + type: object + tickets_per_week: + additionalProperties: + type: integer + type: object + unassigned: + type: integer + required: + - unassigned + - open_tickets_per_user + - tickets_per_week + - tickets_per_type + type: object + Task: + properties: + automation: + type: string + closed: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + created: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + data: + type: object + done: + type: boolean + join: + example: false + type: boolean + name: + example: Inform user + type: string + next: + additionalProperties: + type: string + type: object + owner: + type: string + payload: + additionalProperties: + type: string + type: object + schema: + type: object + type: + enum: + - task + - input + - automation + example: task + type: string + required: + - name + - type + - done + - created + type: object + TaskForm: + properties: + automation: + type: string + closed: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + created: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + data: + type: object + done: + type: boolean + join: + example: false + type: boolean + name: + example: Inform user + type: string + next: + additionalProperties: + type: string + type: object + owner: + type: string + payload: + additionalProperties: + type: string + type: object + schema: + type: object + type: + enum: + - task + - input + - automation + example: task + type: string + required: + - name + - type + type: object + TaskOrigin: + properties: + playbook_id: + type: string + task_id: + type: string + ticket_id: + format: int64 + type: integer + required: + - ticket_id + - playbook_id + - task_id + type: object + TaskResponse: + properties: + active: + example: false + type: boolean + automation: + type: string + closed: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + created: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + data: + type: object + done: + type: boolean + join: + example: false + type: boolean + name: + example: Inform user + type: string + next: + additionalProperties: + type: string + type: object + order: + example: 2 + format: int64 + type: number + owner: + type: string + payload: + additionalProperties: + type: string + type: object + schema: + type: object + type: + enum: + - task + - input + - automation + example: task + type: string + required: + - name + - type + - done + - created + - order + - active + type: object + TaskWithContext: + properties: + playbook_id: + type: string + playbook_name: + type: string + task: + $ref: '#/definitions/TaskResponse' + task_id: + type: string + ticket_id: + format: int64 + type: number + ticket_name: + type: string + required: + - ticket_id + - ticket_name + - playbook_id + - playbook_name + - task_id + - task + type: object + Ticket: + properties: + artifacts: + items: + $ref: '#/definitions/Artifact' + type: array + comments: + items: + $ref: '#/definitions/Comment' + type: array + created: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + details: + example: + description: my little incident + type: object + files: + items: + $ref: '#/definitions/File' + type: array + modified: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + name: + example: WannyCry + type: string + owner: + example: bob + type: string + playbooks: + additionalProperties: + $ref: '#/definitions/Playbook' + type: object + read: + example: + - bob + items: + type: string + type: array + references: + items: + $ref: '#/definitions/Reference' + type: array + schema: + example: '{}' + type: string + status: + example: open + type: string + type: + example: incident + type: string + write: + example: + - alice + items: + type: string + type: array + required: + - name + - type + - status + - created + - modified + - schema + type: object + TicketForm: + properties: + artifacts: + items: + $ref: '#/definitions/Artifact' + type: array + comments: + items: + $ref: '#/definitions/Comment' + type: array + created: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + details: + example: + description: my little incident + type: object + files: + items: + $ref: '#/definitions/File' + type: array + id: + example: 123 + format: int64 + type: integer + modified: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + name: + example: WannyCry + type: string + owner: + example: bob + type: string + playbooks: + items: + $ref: '#/definitions/PlaybookTemplateForm' + type: array + read: + example: + - bob + items: + type: string + type: array + references: + items: + $ref: '#/definitions/Reference' + type: array + schema: + example: '{}' + type: string + status: + example: open + type: string + type: + example: incident + type: string + write: + example: + - alice + items: + type: string + type: array + required: + - name + - type + - status + type: object + TicketList: + properties: + count: + example: 3 + type: number + tickets: + items: + $ref: '#/definitions/TicketSimpleResponse' + type: array + required: + - tickets + - count + type: object + TicketResponse: + properties: + artifacts: + items: + $ref: '#/definitions/Artifact' + type: array + comments: + items: + $ref: '#/definitions/Comment' + type: array + created: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + details: + example: + description: my little incident + type: object + files: + items: + $ref: '#/definitions/File' + type: array + id: + example: 123 + format: int64 + type: integer + modified: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + name: + example: WannyCry + type: string + owner: + example: bob + type: string + playbooks: + additionalProperties: + $ref: '#/definitions/PlaybookResponse' + type: object + read: + example: + - bob + items: + type: string + type: array + references: + items: + $ref: '#/definitions/Reference' + type: array + schema: + example: '{}' + type: string + status: + example: open + type: string + type: + example: incident + type: string + write: + example: + - alice + items: + type: string + type: array + required: + - id + - name + - type + - status + - created + - modified + - schema + type: object + TicketSimpleResponse: + properties: + artifacts: + items: + $ref: '#/definitions/Artifact' + type: array + comments: + items: + $ref: '#/definitions/Comment' + type: array + created: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + details: + example: + description: my little incident + type: object + files: + items: + $ref: '#/definitions/File' + type: array + id: + example: 123 + format: int64 + type: integer + modified: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + name: + example: WannyCry + type: string + owner: + example: bob + type: string + playbooks: + additionalProperties: + $ref: '#/definitions/Playbook' + type: object + read: + example: + - bob + items: + type: string + type: array + references: + items: + $ref: '#/definitions/Reference' + type: array + schema: + example: '{}' + type: string + status: + example: open + type: string + type: + example: incident + type: string + write: + example: + - alice + items: + type: string + type: array + required: + - id + - name + - type + - status + - created + - modified + - schema + type: object + TicketTemplate: + properties: + name: + type: string + schema: + type: string + required: + - name + - schema + type: object + TicketTemplateForm: + properties: + id: + type: string + name: + type: string + schema: + type: string + required: + - name + - schema + type: object + TicketTemplateResponse: + properties: + id: + type: string + name: + type: string + schema: + type: string + required: + - id + - name + - schema + type: object + TicketType: + properties: + default_groups: + items: + type: string + type: array + default_playbooks: + items: + type: string + type: array + default_template: + type: string + icon: + type: string + name: + type: string + required: + - name + - icon + - default_template + - default_playbooks + type: object + TicketTypeForm: + properties: + default_groups: + items: + type: string + type: array + default_playbooks: + items: + type: string + type: array + default_template: + type: string + icon: + type: string + id: + type: string + name: + type: string + required: + - name + - icon + - default_template + - default_playbooks + type: object + TicketTypeResponse: + properties: + default_groups: + items: + type: string + type: array + default_playbooks: + items: + type: string + type: array + default_template: + type: string + icon: + type: string + id: + type: string + name: + type: string + required: + - id + - name + - icon + - default_template + - default_playbooks + type: object + TicketWithTickets: + properties: + artifacts: + items: + $ref: '#/definitions/Artifact' + type: array + comments: + items: + $ref: '#/definitions/Comment' + type: array + created: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + details: + example: + description: my little incident + type: object + files: + items: + $ref: '#/definitions/File' + type: array + id: + example: 123 + format: int64 + type: integer + modified: + example: 1985-04-12T23:20:50.52Z + format: date-time + type: string + name: + example: WannyCry + type: string + owner: + example: bob + type: string + playbooks: + additionalProperties: + $ref: '#/definitions/PlaybookResponse' + type: object + read: + example: + - bob + items: + type: string + type: array + references: + items: + $ref: '#/definitions/Reference' + type: array + schema: + example: '{}' + type: string + status: + example: open + type: string + tickets: + items: + $ref: '#/definitions/TicketSimpleResponse' + type: array + type: + example: incident + type: string + write: + example: + - alice + items: + type: string + type: array + required: + - id + - name + - type + - status + - created + - modified + - schema + type: object + Type: + properties: + color: + enum: + - error + - info + - success + - warning + title: Color + type: string + x-cols: 3 + icon: + title: Icon (https://materialdesignicons.com) + type: string + x-class: pr-2 + x-cols: 3 + id: + title: ID + type: string + x-class: pr-2 + x-cols: 3 + name: + title: Name + type: string + x-class: pr-2 + x-cols: 3 + required: + - id + - name + - icon + type: object + User: + properties: + apikey: + type: boolean + blocked: + type: boolean + roles: + items: + type: string + type: array + sha256: + type: string + required: + - blocked + - apikey + - roles + type: object + UserData: + properties: + email: + type: string + x-example: bob@example.org + image: + type: string + x-display: custom-avatar + name: + type: string + x-example: Robert Smith + timeformat: + title: Time Format (https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens) + type: string + type: object + UserDataResponse: + properties: + email: + type: string + x-example: bob@example.org + id: + type: string + image: + type: string + x-display: custom-avatar + name: + type: string + x-example: Robert Smith + timeformat: + title: Time Format (https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens) + type: string + required: + - id + type: object + UserForm: + properties: + apikey: + type: boolean + blocked: + type: boolean + id: + type: string + roles: + items: + type: string + type: array + required: + - id + - blocked + - roles + - apikey + type: object + UserResponse: + properties: + apikey: + type: boolean + blocked: + type: boolean + id: + type: string + roles: + items: + type: string + type: array + required: + - id + - blocked + - roles + - apikey + type: object +host: . +info: + description: API for the catalyst incident response platform. + title: "" + version: "" +paths: + /automations: + get: + operationId: listAutomations + responses: + "200": + description: successful operation + examples: + test: + - id: comment + image: docker.io/python:3 + script: "" + type: + - playbook + - id: hash.sha1 + image: docker.io/python:3 + schema: '{"title":"Input","type":"object","properties":{"default":{"type":"string","title":"Value"}},"required":["default"]}' + script: "" + type: + - global + - artifact + - playbook + - id: thehive + image: docker.io/python:3 + schema: '{"title":"TheHive credentials","type":"object","properties":{"thehiveurl":{"type":"string","title":"TheHive + URL (e.g. ''https://thehive.example.org'')"},"thehivekey":{"type":"string","title":"TheHive + API Key"},"skip_files":{"type":"boolean", "default": true, "title":"Skip + Files (much faster)"},"keep_ids":{"type":"boolean", "default": true, + "title":"Keep IDs and overwrite existing IDs"}},"required":["thehiveurl", + "thehivekey", "skip_files", "keep_ids"]}' + script: "" + type: + - global + - id: vt.hash + image: docker.io/python:3 + schema: '{"title":"Input","type":"object","properties":{"default":{"type":"string","title":"Value"}},"required":["default"]}' + script: "" + type: + - global + - artifact + - playbook + schema: + items: + $ref: '#/definitions/AutomationResponse' + type: array + security: + - roles: + - automation:read + summary: List automations + tags: + - automations + post: + operationId: createAutomation + parameters: + - description: New automation + in: body + name: automation + required: true + schema: + $ref: '#/definitions/AutomationForm' + x-example: + id: hash-sha-256 + image: docker.io/python:3 + script: | + import sys + import json + import hashlib + + + def run(msg): + sha256 = hashlib.sha256(msg['payload']['default'].encode('utf-8')) + return {'hash': sha256.hexdigest()} + + + print(json.dumps(run(json.loads(sys.argv[1])))) + type: + - global + responses: + "200": + description: successful operation + examples: + test: + id: hash-sha-256 + image: docker.io/python:3 + script: | + import sys + import json + import hashlib + + + def run(msg): + sha256 = hashlib.sha256(msg['payload']['default'].encode('utf-8')) + return {'hash': sha256.hexdigest()} + + + print(json.dumps(run(json.loads(sys.argv[1])))) + type: + - global + schema: + $ref: '#/definitions/AutomationResponse' + security: + - roles: + - automation:write + summary: Create a new automation + tags: + - automations + /automations/{id}: + delete: + operationId: deleteAutomation + parameters: + - description: Automation ID + in: path + name: id + required: true + type: string + x-example: hash.sha1 + responses: + "204": + description: successful operation + security: + - roles: + - automation:write + summary: Delete a automation + tags: + - automations + get: + operationId: getAutomation + parameters: + - description: Automation ID + in: path + name: id + required: true + type: string + x-example: hash.sha1 + responses: + "200": + description: successful operation + examples: + test: + id: hash.sha1 + image: docker.io/python:3 + schema: '{"title":"Input","type":"object","properties":{"default":{"type":"string","title":"Value"}},"required":["default"]}' + script: | + #!/usr/bin/env python + + import sys + import json + import hashlib + + + def run(msg): + sha1 = hashlib.sha1(msg['payload']['default'].encode('utf-8')) + return {"hash": sha1.hexdigest()} + + + print(json.dumps(run(json.loads(sys.argv[1])))) + type: + - global + - artifact + - playbook + schema: + $ref: '#/definitions/AutomationResponse' + security: + - roles: + - automation:read + summary: Get a single automation + tags: + - automations + put: + operationId: updateAutomation + parameters: + - description: Automation ID + in: path + name: id + required: true + type: string + x-example: hash.sha1 + - description: Automation object that needs to be added + in: body + name: automation + required: true + schema: + $ref: '#/definitions/AutomationForm' + x-example: + id: hash.sha1 + image: docker.io/python:3 + script: | + import sys + import json + import hashlib + + + def run(msg): + sha1 = hashlib.sha1(msg['payload'].encode('utf-8')) + return {'hash': sha1.hexdigest()} + + + print(json.dumps(run(json.loads(sys.argv[1])))) + type: + - global + - artifact + - playbook + responses: + "200": + description: successful operation + examples: + test: + id: hash.sha1 + image: docker.io/python:3 + script: | + import sys + import json + import hashlib + + + def run(msg): + sha1 = hashlib.sha1(msg['payload'].encode('utf-8')) + return {'hash': sha1.hexdigest()} + + + print(json.dumps(run(json.loads(sys.argv[1])))) + type: + - global + - artifact + - playbook + schema: + $ref: '#/definitions/AutomationResponse' + security: + - roles: + - automation:write + summary: Update an existing automation + tags: + - automations + /currentuser: + get: + operationId: currentUser + responses: + "200": + description: successful operation + examples: + test: + apikey: false + blocked: false + id: bob + roles: + - admin:backup:read + - admin:backup:restore + - admin:group:write + - admin:job:read + - admin:job:write + - admin:log:read + - admin:ticket:delete + - admin:user:write + - admin:userdata:read + - admin:userdata:write + - analyst:automation:read + - analyst:currentsettings:write + - analyst:currentuser:read + - analyst:currentuserdata:read + - analyst:file + - analyst:group:read + - analyst:playbook:read + - analyst:rule:read + - analyst:settings:read + - analyst:template:read + - analyst:ticket:read + - analyst:ticket:write + - analyst:tickettype:read + - analyst:user:read + - engineer:automation:write + - engineer:playbook:write + - engineer:rule:write + - engineer:template:write + - engineer:tickettype:write + schema: + $ref: '#/definitions/UserResponse' + security: + - roles: + - currentuser:read + summary: Get current user + tags: + - users + /currentuserdata: + get: + operationId: currentUserData + responses: + "200": + description: successful operation + examples: + test: + email: bob@example.org + id: bob + name: Bob Bad + schema: + $ref: '#/definitions/UserDataResponse' + security: + - roles: + - currentuserdata:read + summary: Get current user data + tags: + - userdata + put: + operationId: updateCurrentUserData + parameters: + - description: User data object that needs to be added + in: body + name: userdata + required: true + schema: + $ref: '#/definitions/UserData' + x-example: + email: bob@example.org + name: Bob Bad + responses: + "200": + description: successful operation + examples: + test: + email: bob@example.org + id: bob + name: Bob Bad + schema: + $ref: '#/definitions/UserDataResponse' + security: + - roles: + - currentuserdata:write + summary: Update current user data + tags: + - userdata + /jobs: + get: + operationId: listJobs + responses: + "200": + description: successful operation + examples: + test: + - automation: hash.sha1 + id: 99cd67131b48 + payload: test + status: created + schema: + items: + $ref: '#/definitions/JobResponse' + type: array + security: + - roles: + - job:read + summary: List jobs + tags: + - jobs + post: + operationId: runJob + parameters: + - description: New job + in: body + name: job + required: true + schema: + $ref: '#/definitions/JobForm' + x-example: + automation: hash.sha1 + message: + payload: test + responses: + "204": + description: successful operation + security: + - roles: + - job:write + summary: Start a new job + tags: + - jobs + /jobs/{id}: + get: + operationId: getJob + parameters: + - description: Job ID + in: path + name: id + required: true + type: string + x-example: 99cd67131b48 + responses: + "200": + description: successful operation + examples: + test: + automation: hash.sha1 + id: 99cd67131b48 + payload: test + status: created + schema: + $ref: '#/definitions/JobResponse' + security: + - roles: + - job:read + summary: Get a single job + tags: + - jobs + put: + operationId: updateJob + parameters: + - description: Job ID + in: path + name: id + required: true + type: string + x-example: 99cd67131b48 + - description: Job object that needs to be added + in: body + name: job + required: true + schema: + $ref: '#/definitions/Job' + x-example: + automation: hash.sha1 + id: 99cd67131b48 + payload: test + status: failed + responses: + "200": + description: successful operation + examples: + test: + automation: hash.sha1 + id: 99cd67131b48 + payload: test + status: failed + schema: + $ref: '#/definitions/JobResponse' + security: + - roles: + - job:write + summary: Update an existing job + tags: + - jobs + /logs/{reference}: + get: + operationId: getLogs + parameters: + - description: Reference + in: path + name: reference + required: true + type: string + x-example: tickets%2F294511 + responses: + "200": + description: successful operation + examples: + test: + - created: 2021-10-02T18:05:00.333535+02:00 + creator: bob + message: Fail run account resist lend solve incident centre priority + temperature. Cause change distribution examine location technique + shape partner milk customer. Rail tea plate soil report cook railway + interpretation breath action. Exercise dream accept park conclusion + addition shoot assistance may answer. Gold writer link stop combine + hear power name commitment operation. Determine lifespan support grow + degree henry exclude detail set religion. Direct library policy convention + chain retain discover ride walk student. Gather proposal select march + aspect play noise avoid encourage employ. Assessment preserve transport + combine wish influence income guess run stand. Charge limit crime + ignore statement foundation study issue stop claim. + reference: tickets/294511 + schema: + items: + $ref: '#/definitions/LogEntry' + type: array + security: + - roles: + - log:read + summary: Get log entries + tags: + - logs + /playbooks: + get: + operationId: listPlaybooks + responses: + "200": + description: successful operation + examples: + test: + - id: malware + name: Malware + yaml: | + name: Malware + tasks: + file-or-hash: + name: Do you have the file or the hash? + type: input + schema: + title: Malware + type: object + properties: + file: + type: string + title: "I have the" + enum: [ "File", "Hash" ] + next: + enter-hash: "file == 'Hash'" + upload: "file == 'File'" + + enter-hash: + name: Please enter the hash + type: input + schema: + title: Malware + type: object + properties: + hash: + type: string + title: Please enter the hash value + minlength: 32 + next: + virustotal: "hash != ''" + + upload: + name: Upload the malware + type: input + schema: + title: Malware + type: object + properties: + malware: + type: object + x-display: file + title: Please upload the malware + next: + hash: "malware" + + hash: + name: Hash the malware + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['upload'].data['malware']" + next: + virustotal: + + virustotal: + name: Send hash to VirusTotal + type: automation + automation: vt.hash + args: + hash: "playbook.tasks['enter-hash'].data['hash'] || playbook.tasks['hash'].data['hash']" + # next: + # known-malware: "score > 5" + # sandbox: "score < 6" # unknown-malware + - id: phishing + name: Phishing + yaml: | + name: Phishing + tasks: + board: + name: Board Involvement? + description: Is a board member involved? + type: input + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + next: + escalate: "boardInvolved == true" + mail-available: "boardInvolved == false" + + escalate: + name: Escalate to CISO + description: Please escalate the task to the CISO + type: task + + mail-available: + name: Mail available + type: input + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: 'yes' + type: string + required: + - mail + title: 'Yes' + - properties: + schemaKey: + const: 'no' + type: string + title: 'No' + title: Mail available + type: object + next: + block-sender: "schemaKey == 'yes'" + extract-iocs: "schemaKey == 'yes'" + search-email-gateway: "schemaKey == 'no'" + + search-email-gateway: + name: Search email gateway + description: Please search email-gateway for the phishing mail. + type: task + next: + extract-iocs: + + block-sender: + name: Block sender + type: task + next: + extract-iocs: + + extract-iocs: + name: Extract IOCs + description: Please insert the IOCs + type: input + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + next: + block-iocs: + + block-iocs: + name: Block IOCs + type: task + - id: simple + name: Simple + yaml: | + name: Simple + tasks: + input: + name: Enter something to hash + type: input + schema: + title: Something + type: object + properties: + something: + type: string + title: Something + default: "" + next: + hash: "something != ''" + + hash: + name: Hash the something + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['input'].data['something']" + next: + comment: "hash != ''" + + comment: + name: Comment the hash + type: automation + automation: comment + payload: + default: "playbook.tasks['hash'].data['hash']" + next: + done: "done" + + done: + name: You can close this case now + type: task + schema: + items: + $ref: '#/definitions/PlaybookTemplateResponse' + type: array + security: + - roles: + - playbook:read + summary: List playbooks + tags: + - playbooks + post: + operationId: createPlaybook + parameters: + - description: New playbook + in: body + name: playbook + required: true + schema: + $ref: '#/definitions/PlaybookTemplateForm' + x-example: + yaml: | + name: Simple2 + tasks: + input: + name: Upload malware if possible + type: input + schema: + title: Malware + type: object + properties: + malware: + type: string + title: Select malware + default: "" + next: + hash: "malware != ''" + + hash: + name: Hash the malware + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['input'].data['malware']" + next: + escalate: + + escalate: + name: Escalate to malware team + type: task + responses: + "200": + description: successful operation + examples: + test: + id: simple-2 + name: Simple2 + yaml: | + name: Simple2 + tasks: + input: + name: Upload malware if possible + type: input + schema: + title: Malware + type: object + properties: + malware: + type: string + title: Select malware + default: "" + next: + hash: "malware != ''" + + hash: + name: Hash the malware + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['input'].data['malware']" + next: + escalate: + + escalate: + name: Escalate to malware team + type: task + schema: + items: + $ref: '#/definitions/PlaybookTemplateResponse' + type: array + security: + - roles: + - playbook:write + summary: Create a playbook + tags: + - playbooks + /playbooks/{id}: + delete: + operationId: deletePlaybook + parameters: + - description: Playbook name + in: path + name: id + required: true + type: string + x-example: simple + responses: + "204": + description: successful operation + security: + - roles: + - playbook:write + summary: Delete a playbook + tags: + - playbooks + get: + operationId: getPlaybook + parameters: + - description: Playbook name + in: path + name: id + required: true + type: string + x-example: simple + responses: + "200": + description: successful operation + examples: + test: + id: simple + name: Simple + yaml: | + name: Simple + tasks: + input: + name: Enter something to hash + type: input + schema: + title: Something + type: object + properties: + something: + type: string + title: Something + default: "" + next: + hash: "something != ''" + + hash: + name: Hash the something + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['input'].data['something']" + next: + comment: "hash != ''" + + comment: + name: Comment the hash + type: automation + automation: comment + payload: + default: "playbook.tasks['hash'].data['hash']" + next: + done: "done" + + done: + name: You can close this case now + type: task + schema: + $ref: '#/definitions/PlaybookTemplateResponse' + security: + - roles: + - playbook:read + summary: Get a single playbook + tags: + - playbooks + put: + operationId: updatePlaybook + parameters: + - description: Playbook ID + in: path + name: id + required: true + type: string + x-example: simple + - description: Updated playbook + in: body + name: playbook + required: true + schema: + $ref: '#/definitions/PlaybookTemplateForm' + x-example: + yaml: | + name: Simple + tasks: + input: + name: Upload malware if possible + type: input + schema: + title: Malware + type: object + properties: + malware: + type: string + title: Select malware + default: "" + next: + hash: "malware != ''" + + hash: + name: Hash the malware + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['input'].data['malware']" + next: + escalate: + + escalate: + name: Escalate to malware team + type: task + responses: + "200": + description: successful operation + examples: + test: + id: simple + name: Simple + yaml: | + name: Simple + tasks: + input: + name: Upload malware if possible + type: input + schema: + title: Malware + type: object + properties: + malware: + type: string + title: Select malware + default: "" + next: + hash: "malware != ''" + + hash: + name: Hash the malware + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['input'].data['malware']" + next: + escalate: + + escalate: + name: Escalate to malware team + type: task + schema: + $ref: '#/definitions/PlaybookTemplateResponse' + security: + - roles: + - playbook:write + summary: Update an existing ticket playbook + tags: + - playbooks + /settings: + get: + operationId: getSettings + responses: + "200": + description: successful operation + examples: + test: + artifactStates: + - color: info + icon: mdi-help-circle-outline + id: unknown + name: Unknown + - color: error + icon: mdi-skull + id: malicious + name: Malicious + - color: success + icon: mdi-check + id: clean + name: Clean + roles: + - admin:backup:read + - admin:backup:restore + - admin:group:write + - admin:job:read + - admin:job:write + - admin:log:read + - admin:ticket:delete + - admin:user:write + - admin:userdata:read + - admin:userdata:write + - analyst:automation:read + - analyst:currentsettings:write + - analyst:currentuser:read + - analyst:currentuserdata:read + - analyst:file + - analyst:group:read + - analyst:playbook:read + - analyst:rule:read + - analyst:settings:read + - analyst:template:read + - analyst:ticket:read + - analyst:ticket:write + - analyst:tickettype:read + - analyst:user:read + - engineer:automation:write + - engineer:playbook:write + - engineer:rule:write + - engineer:template:write + - engineer:tickettype:write + ticketTypes: + - default_playbooks: [] + default_template: default + icon: mdi-alert + id: alert + name: Alerts + - default_playbooks: [] + default_template: default + icon: mdi-radioactive + id: incident + name: Incidents + - default_playbooks: [] + default_template: default + icon: mdi-fingerprint + id: investigation + name: Forensic Investigations + - default_playbooks: [] + default_template: default + icon: mdi-target + id: hunt + name: Threat Hunting + tier: community + timeformat: YYYY-MM-DDThh:mm:ss + version: 0.0.0-test + schema: + $ref: '#/definitions/Settings' + security: + - roles: + - settings:read + summary: Get settings + tags: + - settings + /statistics: + get: + operationId: getStatistics + responses: + "200": + description: successful operation + examples: + test: + open_tickets_per_user: {} + tickets_per_type: + alert: 2 + incident: 1 + tickets_per_week: + 2021-39: 3 + unassigned: 0 + schema: + $ref: '#/definitions/Statistics' + security: + - roles: + - ticket:read + summary: Get statistics + tags: + - statistics + /tasks: + get: + operationId: listTasks + responses: + "200": + description: successful operation + examples: + test: [] + schema: + items: + $ref: '#/definitions/TaskResponse' + type: array + security: + - roles: + - ticket:read + summary: List tasks + tags: + - tasks + /templates: + get: + operationId: listTemplates + responses: + "200": + description: successful operation + examples: + test: + - id: default + name: Default + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Default", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + schema: + items: + $ref: '#/definitions/TicketTemplateResponse' + type: array + security: + - roles: + - template:read + summary: List templates + tags: + - templates + post: + operationId: createTemplate + parameters: + - description: New template + in: body + name: template + required: true + schema: + $ref: '#/definitions/TicketTemplateForm' + x-example: + name: My Template + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + responses: + "200": + description: successful operation + examples: + test: + id: my-template + name: My Template + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + schema: + $ref: '#/definitions/TicketTemplateResponse' + security: + - roles: + - template:write + summary: Create a new template + tags: + - templates + /templates/{id}: + delete: + operationId: deleteTemplate + parameters: + - description: Template ID + in: path + name: id + required: true + type: string + x-example: default + responses: + "204": + description: successful operation + security: + - roles: + - template:write + summary: Delete a template + tags: + - templates + get: + operationId: getTemplate + parameters: + - description: Template ID + in: path + name: id + required: true + type: string + x-example: default + responses: + "200": + description: successful operation + examples: + test: + id: default + name: Default + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Default", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + schema: + $ref: '#/definitions/TicketTemplateResponse' + security: + - roles: + - template:read + summary: Get a single template + tags: + - templates + put: + operationId: updateTemplate + parameters: + - description: Template ID + in: path + name: id + required: true + type: string + x-example: default + - description: Template object that needs to be added + in: body + name: template + required: true + schema: + $ref: '#/definitions/TicketTemplateForm' + x-example: + name: My Template + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + responses: + "200": + description: successful operation + examples: + test: + id: default + name: My Template + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + schema: + $ref: '#/definitions/TicketTemplateResponse' + security: + - roles: + - template:write + summary: Update an existing template + tags: + - templates + /tickets: + get: + operationId: listTickets + parameters: + - description: Ticket Type + in: query + name: type + type: string + - default: 0 + description: Offset of the list + in: query + name: offset + type: integer + - default: 25 + description: Number of tickets + in: query + maximum: 100 + name: count + type: integer + - description: Sort columns + in: query + items: + type: string + name: sort + type: array + - description: Sort descending + in: query + items: + type: boolean + name: desc + type: array + - description: Search query + in: query + name: query + type: string + responses: + "200": + description: successful operation + examples: + test: + count: 3 + tickets: + - artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + - name: leadreintermediate.io + status: malicious + created: 2021-10-02T18:04:59.078206+02:00 + id: 8123 + modified: 2021-10-02T18:04:59.078206+02:00 + name: live zebra + owner: demo + playbooks: + phishing: + name: Phishing + tasks: + block-iocs: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block IOCs + type: task + block-sender: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block sender + next: + extract-iocs: "" + type: task + board: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + escalate: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to CISO + type: task + extract-iocs: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Extract IOCs + next: + block-iocs: "" + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + type: input + mail-available: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Mail available + next: + block-sender: schemaKey == 'yes' + extract-iocs: schemaKey == 'yes' + search-email-gateway: schemaKey == 'no' + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: "yes" + type: string + required: + - mail + title: "Yes" + - properties: + schemaKey: + const: "no" + type: string + title: "No" + title: Mail available + type: object + type: input + search-email-gateway: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Search email gateway + next: + extract-iocs: "" + type: task + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8125 + modified: 2021-10-02T18:04:59.078186+02:00 + name: phishing from selenafadel@von.com detected + owner: demo + references: + - href: https://www.seniorleading-edge.name/users/efficient + name: recovery + - href: http://www.dynamicseamless.com/clicks-and-mortar + name: force + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + type: alert + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + type: alert + schema: + $ref: '#/definitions/TicketList' + security: + - roles: + - ticket:read + summary: List tickets + tags: + - tickets + post: + operationId: createTicket + parameters: + - description: New ticket + in: body + name: ticket + required: true + schema: + $ref: '#/definitions/TicketForm' + x-example: + id: 123 + name: Wannacry infection + owner: bob + status: open + type: incident + responses: + "200": + description: successful operation + examples: + test: + created: 1985-04-12T23:20:50.52Z + id: 123 + modified: 1985-04-12T23:20:50.52Z + name: Wannacry infection + owner: bob + schema: '{}' + status: open + type: incident + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Create a new ticket + tags: + - tickets + /tickets/{id}: + delete: + operationId: deleteTicket + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8125 + responses: + "204": + description: successful operation + security: + - roles: + - ticket:delete + summary: Delete an ticket + tags: + - tickets + get: + operationId: getTicket + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8125 + responses: + "200": + description: successful operation + examples: + test: + created: 2021-10-02T18:04:59.078186+02:00 + id: 8125 + modified: 2021-10-02T18:04:59.078186+02:00 + name: phishing from selenafadel@von.com detected + owner: demo + references: + - href: https://www.seniorleading-edge.name/users/efficient + name: recovery + - href: http://www.dynamicseamless.com/clicks-and-mortar + name: force + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + tickets: + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + type: alert + type: alert + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:read + summary: Get a single ticket + tags: + - tickets + put: + operationId: updateTicket + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8125 + - description: Updated ticket + in: body + name: ticket + required: true + schema: + $ref: '#/definitions/Ticket' + x-example: + created: 2021-10-02T18:04:59.078186+02:00 + modified: 2021-10-02T18:04:59.078186+02:00 + name: phishing from selenafadel@von.org detected + owner: demo + references: + - href: https://www.seniorleading-edge.name/users/efficient + name: recovery + - href: http://www.dynamicseamless.com/clicks-and-mortar + name: force + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + type: alert + responses: + "200": + description: successful operation + examples: + test: + created: 2021-10-02T18:04:59.078186+02:00 + id: 8125 + modified: 2021-10-02T18:04:59.078186+02:00 + name: phishing from selenafadel@von.org detected + owner: demo + references: + - href: https://www.seniorleading-edge.name/users/efficient + name: recovery + - href: http://www.dynamicseamless.com/clicks-and-mortar + name: force + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + tickets: + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + type: alert + type: alert + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Update an existing ticket + tags: + - tickets + /tickets/{id}/artifacts: + post: + operationId: addArtifact + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - description: Artifact object that needs to be added + in: body + name: artifact + required: true + schema: + $ref: '#/definitions/Artifact' + x-example: + name: 2.2.2.2 + responses: + "200": + description: successful operation + examples: + test: + artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + - name: leadreintermediate.io + status: malicious + - name: 2.2.2.2 + status: unknown + type: ip + created: 2021-10-02T18:04:59.078206+02:00 + id: 8123 + modified: 2021-10-02T18:04:59.078206+02:00 + name: live zebra + owner: demo + playbooks: + phishing: + name: Phishing + tasks: + block-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block IOCs + order: 6 + type: task + block-sender: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block sender + next: + extract-iocs: "" + order: 3 + type: task + board: + active: true + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + order: 0 + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + escalate: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to CISO + order: 1 + type: task + extract-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Extract IOCs + next: + block-iocs: "" + order: 5 + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + type: input + mail-available: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Mail available + next: + block-sender: schemaKey == 'yes' + extract-iocs: schemaKey == 'yes' + search-email-gateway: schemaKey == 'no' + order: 2 + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: "yes" + type: string + required: + - mail + title: "Yes" + - properties: + schemaKey: + const: "no" + type: string + title: "No" + title: Mail available + type: object + type: input + search-email-gateway: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Search email gateway + next: + extract-iocs: "" + order: 4 + type: task + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Add a single artifact + tags: + - tickets + /tickets/{id}/artifacts/{name}: + delete: + operationId: removeArtifact + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - in: path + name: name + required: true + type: string + x-example: leadreintermediate.io + responses: + "200": + description: successful operation + examples: + test: + artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + created: 2021-10-02T18:04:59.078206+02:00 + id: 8123 + modified: 2021-10-02T18:04:59.078206+02:00 + name: live zebra + owner: demo + playbooks: + phishing: + name: Phishing + tasks: + block-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block IOCs + order: 6 + type: task + block-sender: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block sender + next: + extract-iocs: "" + order: 3 + type: task + board: + active: true + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + order: 0 + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + escalate: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to CISO + order: 1 + type: task + extract-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Extract IOCs + next: + block-iocs: "" + order: 5 + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + type: input + mail-available: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Mail available + next: + block-sender: schemaKey == 'yes' + extract-iocs: schemaKey == 'yes' + search-email-gateway: schemaKey == 'no' + order: 2 + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: "yes" + type: string + required: + - mail + title: "Yes" + - properties: + schemaKey: + const: "no" + type: string + title: "No" + title: Mail available + type: object + type: input + search-email-gateway: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Search email gateway + next: + extract-iocs: "" + order: 4 + type: task + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Remove an artifact + tags: + - tickets + get: + operationId: getArtifact + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - in: path + name: name + required: true + type: string + x-example: leadreintermediate.io + responses: + "200": + description: successful operation + examples: + test: + name: leadreintermediate.io + status: malicious + schema: + $ref: '#/definitions/Artifact' + security: + - roles: + - ticket:write + summary: Get a single artifact + tags: + - tickets + put: + operationId: setArtifact + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - in: path + name: name + required: true + type: string + x-example: leadreintermediate.io + - in: body + name: artifact + required: true + schema: + $ref: '#/definitions/Artifact' + x-example: + name: leadreintermediate.io + status: clean + responses: + "200": + description: successful operation + examples: + test: + artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + - name: leadreintermediate.io + status: clean + created: 2021-10-02T18:04:59.078206+02:00 + id: 8123 + modified: 2021-10-02T18:04:59.078206+02:00 + name: live zebra + owner: demo + playbooks: + phishing: + name: Phishing + tasks: + block-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block IOCs + order: 6 + type: task + block-sender: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block sender + next: + extract-iocs: "" + order: 3 + type: task + board: + active: true + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + order: 0 + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + escalate: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to CISO + order: 1 + type: task + extract-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Extract IOCs + next: + block-iocs: "" + order: 5 + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + type: input + mail-available: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Mail available + next: + block-sender: schemaKey == 'yes' + extract-iocs: schemaKey == 'yes' + search-email-gateway: schemaKey == 'no' + order: 2 + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: "yes" + type: string + required: + - mail + title: "Yes" + - properties: + schemaKey: + const: "no" + type: string + title: "No" + title: Mail available + type: object + type: input + search-email-gateway: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Search email gateway + next: + extract-iocs: "" + order: 4 + type: task + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Set a single artifact + tags: + - tickets + /tickets/{id}/artifacts/{name}/enrich: + post: + operationId: enrichArtifact + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - in: path + name: name + required: true + type: string + x-example: leadreintermediate.io + - in: body + name: data + required: true + schema: + $ref: '#/definitions/EnrichmentForm' + x-example: + data: + hash: b7a067a742c20d07a7456646de89bc2d408a1153 + name: hash.sha1 + responses: + "200": + description: successful operation + examples: + test: + artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + - enrichments: + hash.sha1: + created: 2021-10-03T18:44:06.488923+02:00 + data: + hash: b7a067a742c20d07a7456646de89bc2d408a1153 + name: hash.sha1 + name: leadreintermediate.io + status: malicious + created: 2021-10-02T18:04:59.078206+02:00 + id: 8123 + modified: 2021-10-02T18:04:59.078206+02:00 + name: live zebra + owner: demo + playbooks: + phishing: + name: Phishing + tasks: + block-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block IOCs + order: 6 + type: task + block-sender: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block sender + next: + extract-iocs: "" + order: 3 + type: task + board: + active: true + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + order: 0 + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + escalate: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to CISO + order: 1 + type: task + extract-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Extract IOCs + next: + block-iocs: "" + order: 5 + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + type: input + mail-available: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Mail available + next: + block-sender: schemaKey == 'yes' + extract-iocs: schemaKey == 'yes' + search-email-gateway: schemaKey == 'no' + order: 2 + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: "yes" + type: string + required: + - mail + title: "Yes" + - properties: + schemaKey: + const: "no" + type: string + title: "No" + title: Mail available + type: object + type: input + search-email-gateway: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Search email gateway + next: + extract-iocs: "" + order: 4 + type: task + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + schema: + $ref: '#/definitions/Artifact' + security: + - roles: + - ticket:write + summary: Enrich a single artifact + tags: + - tickets + /tickets/{id}/artifacts/{name}/run/{automation}: + post: + operationId: runArtifact + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - in: path + name: name + required: true + type: string + x-example: leadreintermediate.io + - in: path + name: automation + required: true + type: string + x-example: hash.sha1 + responses: + "204": + description: successful operation + security: + - roles: + - ticket:write + summary: Run automation on a single artifact + tags: + - tickets + /tickets/{id}/comments: + post: + operationId: addComment + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8125 + - description: Ticket comment + in: body + name: comment + required: true + schema: + $ref: '#/definitions/CommentForm' + x-example: + message: My first comment + responses: + "200": + description: successful operation + examples: + test: + comments: + - created: 2021-10-02T18:04:59.078186+02:00 + creator: bob + message: My first comment + created: 2021-10-02T18:04:59.078186+02:00 + id: 8125 + modified: 2021-10-02T18:04:59.078186+02:00 + name: phishing from selenafadel@von.com detected + owner: demo + references: + - href: https://www.seniorleading-edge.name/users/efficient + name: recovery + - href: http://www.dynamicseamless.com/clicks-and-mortar + name: force + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + tickets: + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + type: alert + type: alert + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Add ticket comment + tags: + - tickets + /tickets/{id}/comments/{commentID}: + delete: + description: Comment will be removed from the ticket. + operationId: removeComment + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - description: Comment ID to remove + in: path + name: commentID + required: true + type: integer + x-example: 0 + responses: + "200": + description: successful operation + examples: + test: + artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + - name: leadreintermediate.io + status: malicious + created: 2021-10-02T18:04:59.078206+02:00 + id: 8123 + modified: 2021-10-02T18:04:59.078206+02:00 + name: live zebra + owner: demo + playbooks: + phishing: + name: Phishing + tasks: + block-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block IOCs + order: 6 + type: task + block-sender: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block sender + next: + extract-iocs: "" + order: 3 + type: task + board: + active: true + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + order: 0 + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + escalate: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to CISO + order: 1 + type: task + extract-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Extract IOCs + next: + block-iocs: "" + order: 5 + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + type: input + mail-available: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Mail available + next: + block-sender: schemaKey == 'yes' + extract-iocs: schemaKey == 'yes' + search-email-gateway: schemaKey == 'no' + order: 2 + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: "yes" + type: string + required: + - mail + title: "Yes" + - properties: + schemaKey: + const: "no" + type: string + title: "No" + title: Mail available + type: object + type: input + search-email-gateway: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Search email gateway + next: + extract-iocs: "" + order: 4 + type: task + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Remove an comment from an ticket + tags: + - tickets + /tickets/{id}/files: + put: + description: Link files to an ticket. The files themself will be stored in object + storage. + operationId: linkFiles + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8125 + - description: Added files + in: body + name: files + required: true + schema: + items: + $ref: '#/definitions/File' + type: array + x-example: + - key: myfile + name: document.doc + responses: + "200": + description: successful operation + examples: + test: + created: 2021-10-02T18:04:59.078186+02:00 + files: + - key: myfile + name: document.doc + id: 8125 + modified: 2021-10-02T18:04:59.078186+02:00 + name: phishing from selenafadel@von.com detected + owner: demo + references: + - href: https://www.seniorleading-edge.name/users/efficient + name: recovery + - href: http://www.dynamicseamless.com/clicks-and-mortar + name: force + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + tickets: + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + type: alert + type: alert + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Link files to an ticket + tags: + - tickets + /tickets/{id}/playbooks: + post: + operationId: addTicketPlaybook + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8125 + - description: Ticket playbook object that needs to be added + in: body + name: playbook + required: true + schema: + $ref: '#/definitions/PlaybookTemplateForm' + x-example: + yaml: | + name: Simple + tasks: + input: + name: Upload malware if possible + type: input + schema: + title: Malware + type: object + properties: + malware: + type: string + title: Select malware + default: "" + next: + hash: "malware != ''" + + hash: + name: Hash the malware + type: automation + automation: hash.sha1 + payload: + default: "playbook.tasks['input'].data['malware']" + next: + escalate: + + escalate: + name: Escalate to malware team + type: task + responses: + "200": + description: successful operation + examples: + test: + created: 1985-04-12T23:20:50.52Z + id: 8125 + modified: 1985-04-12T23:20:50.52Z + name: phishing from selenafadel@von.com detected + owner: demo + playbooks: + simple: + name: Simple + tasks: + escalate: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to malware team + order: 2 + type: task + hash: + active: false + automation: hash.sha1 + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Hash the malware + next: + escalate: "" + order: 1 + payload: + default: playbook.tasks['input'].data['malware'] + type: automation + input: + active: true + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Upload malware if possible + next: + hash: malware != '' + order: 0 + schema: + properties: + malware: + default: "" + title: Select malware + type: string + title: Malware + type: object + type: input + references: + - href: https://www.seniorleading-edge.name/users/efficient + name: recovery + - href: http://www.dynamicseamless.com/clicks-and-mortar + name: force + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + tickets: + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + type: alert + type: alert + schema: + $ref: '#/definitions/TicketResponse' + summary: Add a new ticket playbook + tags: + - tickets + /tickets/{id}/playbooks/{playbookID}: + delete: + operationId: removeTicketPlaybook + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - description: Playbook ID + in: path + name: playbookID + required: true + type: string + x-example: phishing + responses: + "200": + description: successful operation + examples: + test: + artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + - name: leadreintermediate.io + status: malicious + created: 1985-04-12T23:20:50.52Z + id: 8123 + modified: 1985-04-12T23:20:50.52Z + name: live zebra + owner: demo + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Remove an ticket playbook + tags: + - tickets + /tickets/{id}/playbooks/{playbookID}/task/{taskID}: + put: + operationId: setTask + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - description: Playbook ID + in: path + name: playbookID + required: true + type: string + x-example: phishing + - description: Task ID + in: path + name: taskID + required: true + type: string + x-example: board + - description: Task + in: body + name: task + required: true + schema: + $ref: '#/definitions/Task' + x-example: + active: true + data: + boardInvolved: true + done: false + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + order: 0 + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + responses: + "200": + description: successful operation + examples: + test: + artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + - name: leadreintermediate.io + status: malicious + created: 2021-10-02T18:04:59.078206+02:00 + id: 8123 + modified: 2021-10-02T18:04:59.078206+02:00 + name: live zebra + owner: demo + playbooks: + phishing: + name: Phishing + tasks: + block-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block IOCs + order: 6 + type: task + block-sender: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block sender + next: + extract-iocs: "" + order: 3 + type: task + board: + active: true + created: 2021-10-02T18:04:59.078186+02:00 + data: + boardInvolved: true + done: false + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + order: 0 + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + escalate: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to CISO + order: 1 + type: task + extract-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Extract IOCs + next: + block-iocs: "" + order: 5 + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + type: input + mail-available: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Mail available + next: + block-sender: schemaKey == 'yes' + extract-iocs: schemaKey == 'yes' + search-email-gateway: schemaKey == 'no' + order: 2 + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: "yes" + type: string + required: + - mail + title: "Yes" + - properties: + schemaKey: + const: "no" + type: string + title: "No" + title: Mail available + type: object + type: input + search-email-gateway: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Search email gateway + next: + extract-iocs: "" + order: 4 + type: task + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Set a ticket playbook task + tags: + - tickets + /tickets/{id}/playbooks/{playbookID}/task/{taskID}/complete: + put: + operationId: completeTask + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - description: Playbook ID + in: path + name: playbookID + required: true + type: string + x-example: phishing + - description: Task ID + in: path + name: taskID + required: true + type: string + x-example: board + - description: Ticket playbook object that needs to be added + in: body + name: data + required: true + schema: + type: object + x-example: + boardInvolved: true + responses: + "200": + description: successful operation + examples: + test: + artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + - name: leadreintermediate.io + status: malicious + created: 2021-10-02T18:04:59.078206+02:00 + id: 8123 + modified: 2021-10-02T18:04:59.078206+02:00 + name: live zebra + owner: demo + playbooks: + phishing: + name: Phishing + tasks: + block-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block IOCs + order: 6 + type: task + block-sender: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block sender + next: + extract-iocs: "" + order: 3 + type: task + board: + active: false + closed: 2021-10-02T18:04:59.078186+02:00 + created: 2021-10-02T18:04:59.078186+02:00 + data: + boardInvolved: true + done: true + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + order: 0 + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + escalate: + active: true + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to CISO + order: 1 + type: task + extract-iocs: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Extract IOCs + next: + block-iocs: "" + order: 5 + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + type: input + mail-available: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Mail available + next: + block-sender: schemaKey == 'yes' + extract-iocs: schemaKey == 'yes' + search-email-gateway: schemaKey == 'no' + order: 2 + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: "yes" + type: string + required: + - mail + title: "Yes" + - properties: + schemaKey: + const: "no" + type: string + title: "No" + title: Mail available + type: object + type: input + search-email-gateway: + active: false + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Search email gateway + next: + extract-iocs: "" + order: 4 + type: task + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Complete ticket playbook task + tags: + - tickets + /tickets/{id}/playbooks/{playbookID}/task/{taskID}/run: + post: + operationId: runTask + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8123 + - description: Playbook ID + in: path + name: playbookID + required: true + type: string + x-example: phishing + - description: Task ID + in: path + name: taskID + required: true + type: string + x-example: board + responses: + "204": + description: successful operation + security: + - roles: + - ticket:write + summary: Run ticket playbook task + tags: + - tickets + /tickets/{id}/references: + put: + operationId: setReferences + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8125 + - description: All ticket references + in: body + name: references + required: true + schema: + items: + $ref: '#/definitions/Reference' + type: array + x-example: + - href: http://www.leadscalable.biz/envisioneer + name: fund + responses: + "200": + description: successful operation + examples: + test: + created: 2021-10-02T18:04:59.078186+02:00 + id: 8125 + modified: 2021-10-02T18:04:59.078186+02:00 + name: phishing from selenafadel@von.com detected + owner: demo + references: + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + tickets: + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + type: alert + type: alert + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Set ticket references + tags: + - tickets + /tickets/{id}/schema: + put: + operationId: setSchema + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8125 + - description: New ticket schema + in: body + name: schema + schema: + type: string + x-example: '{}' + responses: + "200": + description: successful operation + examples: + test: + created: 2021-10-02T18:04:59.078186+02:00 + id: 8125 + modified: 2021-10-02T18:04:59.078186+02:00 + name: phishing from selenafadel@von.com detected + owner: demo + references: + - href: https://www.seniorleading-edge.name/users/efficient + name: recovery + - href: http://www.dynamicseamless.com/clicks-and-mortar + name: force + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + tickets: + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + type: alert + type: alert + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Set ticket schema + tags: + - tickets + /tickets/{id}/tickets: + delete: + operationId: unlinkTicket + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8126 + - description: Added ticket ID + in: body + name: linkedID + required: true + schema: + format: int64 + type: integer + x-example: 8125 + responses: + "200": + description: successful operation + examples: + test: + created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + type: alert + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Unlink an ticket to an ticket + tags: + - tickets + patch: + operationId: linkTicket + parameters: + - description: Ticket ID + format: int64 + in: path + name: id + required: true + type: integer + x-example: 8126 + - description: Added ticket ID + in: body + name: linkedID + required: true + schema: + format: int64 + type: integer + x-example: 8123 + responses: + "200": + description: successful operation + examples: + test: + created: 2021-10-02T18:04:59.078186+02:00 + id: 8126 + modified: 2021-10-02T18:04:59.078186+02:00 + name: Surfaceintroduce virus detected + owner: demo + references: + - href: http://www.centralworld-class.io/synthesize + name: university + - href: https://www.futurevirtual.org/supply-chains/markets/sticky/iterate + name: goal + - href: http://www.chiefsyndicate.io/action-items + name: unemployment + schema: '{}' + status: closed + tickets: + - artifacts: + - name: 94d5cab6f5fe3422a447ab15436e7a672bc0c09a + status: unknown + - name: http://www.customerviral.io/scalable/vertical/killer + status: clean + - name: leadreintermediate.io + status: malicious + created: 2021-10-02T18:04:59.078206+02:00 + id: 8123 + modified: 2021-10-02T18:04:59.078206+02:00 + name: live zebra + owner: demo + playbooks: + phishing: + name: Phishing + tasks: + block-iocs: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block IOCs + type: task + block-sender: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Block sender + next: + extract-iocs: "" + type: task + board: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Board Involvement? + next: + escalate: boardInvolved == true + mail-available: boardInvolved == false + schema: + properties: + boardInvolved: + default: false + title: A board member is involved. + type: boolean + required: + - boardInvolved + title: Board Involvement? + type: object + type: input + escalate: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Escalate to CISO + type: task + extract-iocs: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Extract IOCs + next: + block-iocs: "" + schema: + properties: + iocs: + items: + type: string + title: IOCs + type: array + title: Extract IOCs + type: object + type: input + mail-available: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Mail available + next: + block-sender: schemaKey == 'yes' + extract-iocs: schemaKey == 'yes' + search-email-gateway: schemaKey == 'no' + schema: + oneOf: + - properties: + mail: + title: Mail + type: string + x-display: textarea + schemaKey: + const: "yes" + type: string + required: + - mail + title: "Yes" + - properties: + schemaKey: + const: "no" + type: string + title: "No" + title: Mail available + type: object + type: input + search-email-gateway: + created: 2021-10-02T18:04:59.078186+02:00 + done: false + name: Search email gateway + next: + extract-iocs: "" + type: task + references: + - href: https://www.leadmaximize.net/e-services/back-end + name: performance + - href: http://www.corporateinteractive.name/rich + name: autumn + - href: https://www.corporateintuitive.org/intuitive/platforms/integrate + name: suggest + schema: | + { + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://example.com/object1618746510.json", + "title": "Event", + "type": "object", + "required": [ + "severity", + "description", + "tlp" + ], + "properties": { + "severity": { + "$id": "#root/severity", + "title": "Severity", + "type": "string", + "default": "Medium", + "nx-enum": [ + "Low", + "Medium", + "High" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "Low", + "title": "Low", + "icon": "mdi-chevron-up" + }, + { + "const": "Medium", + "title": "Medium", + "icon": "mdi-chevron-double-up" + }, + { + "const": "High", + "title": "High", + "icon": "mdi-chevron-triple-up" + } + ] + }, + "tlp": { + "$id": "#root/tlp", + "title": "TLP", + "type": "string", + "nx-enum": [ + "White", + "Green", + "Amber", + "Red" + ], + "x-cols": 6, + "x-class": "pr-2", + "x-display": "icon", + "x-itemIcon": "icon", + "oneOf": [ + { + "const": "White", + "title": "White", + "icon": "mdi-alpha-w" + }, + { + "const": "Green", + "title": "Green", + "icon": "mdi-alpha-g" + }, + { + "const": "Amber", + "title": "Amber", + "icon": "mdi-alpha-a" + }, + { + "const": "Red", + "title": "Red", + "icon": "mdi-alpha-r" + } + ] + }, + "description": { + "$id": "#root/description", + "title": "Description", + "type": "string", + "x-display": "textarea", + "x-class": "pr-2" + } + } + } + status: closed + type: incident + - created: 2021-10-02T18:04:59.078186+02:00 + id: 8125 + modified: 2021-10-02T18:04:59.078186+02:00 + name: phishing from selenafadel@von.com detected + owner: demo + references: + - href: https://www.seniorleading-edge.name/users/efficient + name: recovery + - href: http://www.dynamicseamless.com/clicks-and-mortar + name: force + - href: http://www.leadscalable.biz/envisioneer + name: fund + schema: '{}' + status: closed + type: alert + type: alert + schema: + $ref: '#/definitions/TicketResponse' + security: + - roles: + - ticket:write + summary: Link an ticket to an ticket + tags: + - tickets + /tickets/batch: + post: + operationId: createTicketBatch + parameters: + - description: New ticket + in: body + name: ticket + required: true + schema: + items: + $ref: '#/definitions/TicketForm' + type: array + x-example: + - id: 123 + name: Wannacry infection + owner: bob + status: open + type: incident + responses: + "204": + description: successful operation + security: + - roles: + - ticket:write + summary: Create a new tickets in batch + tags: + - tickets + /tickettypes: + get: + operationId: listTicketTypes + responses: + "200": + description: successful operation + examples: + test: + - default_playbooks: [] + default_template: default + icon: mdi-alert + id: alert + name: Alerts + - default_playbooks: [] + default_template: default + icon: mdi-radioactive + id: incident + name: Incidents + - default_playbooks: [] + default_template: default + icon: mdi-fingerprint + id: investigation + name: Forensic Investigations + - default_playbooks: [] + default_template: default + icon: mdi-target + id: hunt + name: Threat Hunting + schema: + items: + $ref: '#/definitions/TicketTypeResponse' + type: array + security: + - roles: + - tickettype:read + summary: List tickettypes + tags: + - tickettypes + post: + operationId: createTicketType + parameters: + - description: New tickettype + in: body + name: tickettype + required: true + schema: + $ref: '#/definitions/TicketTypeForm' + x-example: + default_playbooks: [] + default_template: default + icon: mdi-newspaper-variant-outline + name: TI Tickets + responses: + "200": + description: successful operation + examples: + test: + default_playbooks: [] + default_template: default + icon: mdi-newspaper-variant-outline + id: ti-tickets + name: TI Tickets + schema: + $ref: '#/definitions/TicketTypeResponse' + security: + - roles: + - tickettype:write + summary: Create a new tickettype + tags: + - tickettypes + /tickettypes/{id}: + delete: + operationId: deleteTicketType + parameters: + - description: TicketType ID + in: path + name: id + required: true + type: string + x-example: alert + responses: + "204": + description: successful operation + security: + - roles: + - tickettype:write + summary: Delete a tickettype + tags: + - tickettypes + get: + operationId: getTicketType + parameters: + - description: TicketType ID + in: path + name: id + required: true + type: string + x-example: alert + responses: + "200": + description: successful operation + examples: + test: + default_playbooks: [] + default_template: default + icon: mdi-alert + id: alert + name: Alerts + schema: + $ref: '#/definitions/TicketTypeResponse' + security: + - roles: + - tickettype:read + summary: Get a single tickettype + tags: + - tickettypes + put: + operationId: updateTicketType + parameters: + - description: TicketType ID + in: path + name: id + required: true + type: string + x-example: alert + - description: TicketType object that needs to be added + in: body + name: tickettype + required: true + schema: + $ref: '#/definitions/TicketTypeForm' + x-example: + default_playbooks: [] + default_template: default + icon: mdi-bell + id: alert + name: Alerts + responses: + "200": + description: successful operation + examples: + test: + default_playbooks: [] + default_template: default + icon: mdi-bell + id: alert + name: Alerts + schema: + $ref: '#/definitions/TicketTypeResponse' + security: + - roles: + - tickettype:write + summary: Update an existing tickettype + tags: + - tickettypes + /userdata: + get: + operationId: listUserData + responses: + "200": + description: successful operation + examples: + test: + - email: bob@example.org + id: bob + name: Bob Bad + schema: + items: + $ref: '#/definitions/UserDataResponse' + type: array + security: + - roles: + - userdata:read + summary: List userdata + tags: + - userdata + /userdata/{id}: + get: + operationId: getUserData + parameters: + - description: User Data ID + in: path + name: id + required: true + type: string + x-example: bob + responses: + "200": + description: successful operation + examples: + test: + email: bob@example.org + id: bob + name: Bob Bad + schema: + $ref: '#/definitions/UserDataResponse' + security: + - roles: + - userdata:read + summary: Get a single user data + tags: + - userdata + put: + operationId: updateUserData + parameters: + - description: User Data ID + in: path + name: id + required: true + type: string + x-example: bob + - description: User data object that needs to be added + in: body + name: userdata + required: true + schema: + $ref: '#/definitions/UserData' + x-example: + blocked: false + email: bob@example.org + name: Bob Bad + responses: + "200": + description: successful operation + examples: + test: + email: bob@example.org + id: bob + name: Bob Bad + schema: + $ref: '#/definitions/UserDataResponse' + security: + - roles: + - userdata:write + summary: Update an existing user data + tags: + - userdata + /users: + get: + operationId: listUsers + responses: + "200": + description: successful operation + examples: + test: + - apikey: false + blocked: false + id: bob + roles: + - admin:backup:read + - admin:backup:restore + - admin:group:write + - admin:job:read + - admin:job:write + - admin:log:read + - admin:ticket:delete + - admin:user:write + - admin:userdata:read + - admin:userdata:write + - analyst:automation:read + - analyst:currentsettings:write + - analyst:currentuser:read + - analyst:currentuserdata:read + - analyst:file + - analyst:group:read + - analyst:playbook:read + - analyst:rule:read + - analyst:settings:read + - analyst:template:read + - analyst:ticket:read + - analyst:ticket:write + - analyst:tickettype:read + - analyst:user:read + - engineer:automation:write + - engineer:playbook:write + - engineer:rule:write + - engineer:template:write + - engineer:tickettype:write + - apikey: true + blocked: false + id: script + roles: + - analyst:automation:read + - analyst:currentsettings:write + - analyst:currentuser:read + - analyst:currentuserdata:read + - analyst:file + - analyst:group:read + - analyst:playbook:read + - analyst:rule:read + - analyst:settings:read + - analyst:template:read + - analyst:ticket:read + - analyst:ticket:write + - analyst:tickettype:read + - analyst:user:read + - engineer:automation:write + - engineer:playbook:write + - engineer:rule:write + - engineer:template:write + - engineer:tickettype:write + schema: + items: + $ref: '#/definitions/UserResponse' + type: array + security: + - roles: + - user:read + summary: List users + tags: + - users + post: + operationId: createUser + parameters: + - description: user object that needs to be added + in: body + name: user + required: true + schema: + $ref: '#/definitions/UserForm' + x-example: + id: syncscript + roles: + - analyst + responses: + "200": + description: successful operation + examples: + test: + blocked: false + id: syncscript + roles: + - analyst:automation:read + - analyst:currentsettings:write + - analyst:currentuser:read + - analyst:currentuserdata:read + - analyst:file + - analyst:group:read + - analyst:playbook:read + - analyst:rule:read + - analyst:settings:read + - analyst:template:read + - analyst:ticket:read + - analyst:ticket:write + - analyst:tickettype:read + - analyst:user:read + secret: v39bOuobnlEljfWzjAgoKzhmnh1xSMxH + schema: + $ref: '#/definitions/NewUserResponse' + security: + - roles: + - user:write + summary: Create user + tags: + - users + /users/{id}: + delete: + operationId: deleteUser + parameters: + - description: user ID + in: path + name: id + required: true + type: string + x-example: script + responses: + "204": + description: successful operation + security: + - roles: + - user:write + summary: Delete user + tags: + - users + get: + operationId: getUser + parameters: + - description: user ID + in: path + name: id + required: true + type: string + x-example: script + responses: + "200": + description: successful operation + examples: + test: + apikey: true + blocked: false + id: script + roles: + - analyst:automation:read + - analyst:currentsettings:write + - analyst:currentuser:read + - analyst:currentuserdata:read + - analyst:file + - analyst:group:read + - analyst:playbook:read + - analyst:rule:read + - analyst:settings:read + - analyst:template:read + - analyst:ticket:read + - analyst:ticket:write + - analyst:tickettype:read + - analyst:user:read + - engineer:automation:write + - engineer:playbook:write + - engineer:rule:write + - engineer:template:write + - engineer:tickettype:write + schema: + $ref: '#/definitions/UserResponse' + security: + - roles: + - user:read + summary: Get a single user + tags: + - users + put: + operationId: updateUser + parameters: + - description: Template ID + in: path + name: id + required: true + type: string + x-example: bob + - description: user object that needs to be added + in: body + name: user + required: true + schema: + $ref: '#/definitions/UserForm' + x-example: + roles: + - analyst + - admin + responses: + "200": + description: successful operation + examples: + test: + apikey: false + blocked: false + id: bob + roles: + - admin:backup:read + - admin:backup:restore + - admin:group:write + - admin:job:read + - admin:job:write + - admin:log:read + - admin:ticket:delete + - admin:user:write + - admin:userdata:read + - admin:userdata:write + - analyst:automation:read + - analyst:currentsettings:write + - analyst:currentuser:read + - analyst:currentuserdata:read + - analyst:file + - analyst:group:read + - analyst:playbook:read + - analyst:rule:read + - analyst:settings:read + - analyst:template:read + - analyst:ticket:read + - analyst:ticket:write + - analyst:tickettype:read + - analyst:user:read + - engineer:automation:write + - engineer:playbook:write + - engineer:rule:write + - engineer:template:write + - engineer:tickettype:write + schema: + $ref: '#/definitions/UserResponse' + security: + - roles: + - user:write + summary: Update user + tags: + - users +produces: +- application/json +schemes: +- http +swagger: "2.0" + diff --git a/generated/models/models.go b/generated/models/models.go new file mode 100755 index 0000000..3cb7667 --- /dev/null +++ b/generated/models/models.go @@ -0,0 +1,643 @@ +package models + +import ( + "fmt" + "strings" + "time" + + "github.com/xeipuuv/gojsonschema" +) + +var ( + schemaLoader = gojsonschema.NewSchemaLoader() + ArtifactSchema = new(gojsonschema.Schema) + ArtifactOriginSchema = new(gojsonschema.Schema) + AutomationSchema = new(gojsonschema.Schema) + AutomationFormSchema = new(gojsonschema.Schema) + AutomationResponseSchema = new(gojsonschema.Schema) + CommentSchema = new(gojsonschema.Schema) + CommentFormSchema = new(gojsonschema.Schema) + ContextSchema = new(gojsonschema.Schema) + EnrichmentSchema = new(gojsonschema.Schema) + EnrichmentFormSchema = new(gojsonschema.Schema) + FileSchema = new(gojsonschema.Schema) + JobSchema = new(gojsonschema.Schema) + JobFormSchema = new(gojsonschema.Schema) + JobResponseSchema = new(gojsonschema.Schema) + LogEntrySchema = new(gojsonschema.Schema) + MessageSchema = new(gojsonschema.Schema) + NewUserResponseSchema = new(gojsonschema.Schema) + OriginSchema = new(gojsonschema.Schema) + PlaybookSchema = new(gojsonschema.Schema) + PlaybookResponseSchema = new(gojsonschema.Schema) + PlaybookTemplateSchema = new(gojsonschema.Schema) + PlaybookTemplateFormSchema = new(gojsonschema.Schema) + PlaybookTemplateResponseSchema = new(gojsonschema.Schema) + ReferenceSchema = new(gojsonschema.Schema) + SettingsSchema = new(gojsonschema.Schema) + StatisticsSchema = new(gojsonschema.Schema) + TaskSchema = new(gojsonschema.Schema) + TaskFormSchema = new(gojsonschema.Schema) + TaskOriginSchema = new(gojsonschema.Schema) + TaskResponseSchema = new(gojsonschema.Schema) + TaskWithContextSchema = new(gojsonschema.Schema) + TicketSchema = new(gojsonschema.Schema) + TicketFormSchema = new(gojsonschema.Schema) + TicketListSchema = new(gojsonschema.Schema) + TicketResponseSchema = new(gojsonschema.Schema) + TicketSimpleResponseSchema = new(gojsonschema.Schema) + TicketTemplateSchema = new(gojsonschema.Schema) + TicketTemplateFormSchema = new(gojsonschema.Schema) + TicketTemplateResponseSchema = new(gojsonschema.Schema) + TicketTypeSchema = new(gojsonschema.Schema) + TicketTypeFormSchema = new(gojsonschema.Schema) + TicketTypeResponseSchema = new(gojsonschema.Schema) + TicketWithTicketsSchema = new(gojsonschema.Schema) + TypeSchema = new(gojsonschema.Schema) + UserSchema = new(gojsonschema.Schema) + UserDataSchema = new(gojsonschema.Schema) + UserDataResponseSchema = new(gojsonschema.Schema) + UserFormSchema = new(gojsonschema.Schema) + UserResponseSchema = new(gojsonschema.Schema) +) + +func init() { + err := schemaLoader.AddSchemas( + gojsonschema.NewStringLoader(`{"type":"object","required":["name"],"x-embed":"","properties":{"enrichments":{"type":"object","additionalProperties":{"$ref":"#/definitions/Enrichment"}},"name":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"}},"$id":"#/definitions/Artifact"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["ticket_id","artifact"],"x-embed":"","properties":{"artifact":{"type":"string"},"ticket_id":{"format":"int64","type":"integer"}},"$id":"#/definitions/ArtifactOrigin"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["image","script","type"],"x-embed":"","properties":{"image":{"type":"string"},"schema":{"type":"string"},"script":{"type":"string"},"type":{"items":{"type":"string","enum":["artifact","playbook","global"]},"type":"array"}},"$id":"#/definitions/Automation"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["id","image","script","type"],"x-embed":"","properties":{"id":{"type":"string"},"image":{"type":"string"},"schema":{"type":"string"},"script":{"type":"string"},"type":{"items":{"type":"string","enum":["artifact","playbook","global"]},"type":"array"}},"$id":"#/definitions/AutomationForm"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["id","image","script","type"],"x-embed":"","properties":{"id":{"type":"string"},"image":{"type":"string"},"schema":{"type":"string"},"script":{"type":"string"},"type":{"items":{"type":"string","enum":["artifact","playbook","global"]},"type":"array"}},"$id":"#/definitions/AutomationResponse"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["creator","created","message"],"x-embed":"","properties":{"created":{"format":"date-time","type":"string"},"creator":{"type":"string"},"message":{"type":"string"}},"$id":"#/definitions/Comment"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["message"],"x-embed":"","properties":{"created":{"format":"date-time","type":"string"},"creator":{"type":"string"},"message":{"type":"string"}},"$id":"#/definitions/CommentForm"}`), + gojsonschema.NewStringLoader(`{"type":"object","x-embed":"","properties":{"artifact":{"$ref":"#/definitions/Artifact"},"playbook":{"$ref":"#/definitions/PlaybookResponse"},"task":{"$ref":"#/definitions/TaskResponse"},"ticket":{"$ref":"#/definitions/TicketResponse"}},"$id":"#/definitions/Context"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["name","data","created"],"x-embed":"","properties":{"created":{"format":"date-time","type":"string"},"data":{"type":"object"},"name":{"type":"string"}},"$id":"#/definitions/Enrichment"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["name","data"],"x-embed":"","properties":{"data":{"type":"object"},"name":{"type":"string"}},"$id":"#/definitions/EnrichmentForm"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["key","name"],"x-embed":"","properties":{"key":{"type":"string"},"name":{"type":"string"}},"$id":"#/definitions/File"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["automation","running","status"],"x-embed":"","properties":{"automation":{"type":"string"},"container":{"type":"string"},"log":{"type":"string"},"origin":{"$ref":"#/definitions/Origin"},"output":{"type":"object"},"payload":{},"running":{"type":"boolean"},"status":{"type":"string"}},"$id":"#/definitions/Job"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["automation"],"x-embed":"","properties":{"automation":{"type":"string"},"origin":{"$ref":"#/definitions/Origin"},"payload":{}},"$id":"#/definitions/JobForm"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["id","automation","status"],"x-embed":"","properties":{"automation":{"type":"string"},"container":{"type":"string"},"id":{"type":"string"},"log":{"type":"string"},"origin":{"$ref":"#/definitions/Origin"},"output":{"type":"object"},"payload":{},"status":{"type":"string"}},"$id":"#/definitions/JobResponse"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["reference","creator","created","message"],"x-embed":"","properties":{"created":{"format":"date-time","type":"string"},"creator":{"type":"string"},"message":{"type":"string"},"reference":{"type":"string"}},"$id":"#/definitions/LogEntry"}`), + gojsonschema.NewStringLoader(`{"type":"object","x-embed":"","properties":{"context":{"$ref":"#/definitions/Context"},"payload":{"type":"object"},"secrets":{"type":"object","additionalProperties":{"type":"string"}}},"$id":"#/definitions/Message"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["id","blocked","roles"],"x-embed":"","properties":{"blocked":{"type":"boolean"},"id":{"type":"string"},"roles":{"items":{"type":"string"},"type":"array"},"secret":{"type":"string"}},"$id":"#/definitions/NewUserResponse"}`), + gojsonschema.NewStringLoader(`{"type":"object","x-embed":"","properties":{"artifact_origin":{"$ref":"#/definitions/ArtifactOrigin"},"task_origin":{"$ref":"#/definitions/TaskOrigin"}},"$id":"#/definitions/Origin"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["name","tasks"],"x-embed":"","properties":{"name":{"type":"string"},"tasks":{"type":"object","additionalProperties":{"$ref":"#/definitions/Task"}}},"$id":"#/definitions/Playbook"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["name","tasks"],"x-embed":"","properties":{"name":{"type":"string"},"tasks":{"type":"object","additionalProperties":{"$ref":"#/definitions/TaskResponse"}}},"$id":"#/definitions/PlaybookResponse"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["name","yaml"],"x-embed":"","properties":{"name":{"type":"string"},"yaml":{"type":"string"}},"$id":"#/definitions/PlaybookTemplate"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["yaml"],"x-embed":"","properties":{"id":{"type":"string"},"yaml":{"type":"string"}},"$id":"#/definitions/PlaybookTemplateForm"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["id","name","yaml"],"x-embed":"","properties":{"id":{"type":"string"},"name":{"type":"string"},"yaml":{"type":"string"}},"$id":"#/definitions/PlaybookTemplateResponse"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["name","href"],"x-embed":"","properties":{"href":{"type":"string"},"name":{"type":"string"}},"$id":"#/definitions/Reference"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["version","tier","timeformat","ticketTypes","artifactStates"],"x-embed":"","properties":{"artifactStates":{"title":"Artifact States","items":{"$ref":"#/definitions/Type"},"type":"array"},"roles":{"title":"Roles","items":{"type":"string"},"type":"array"},"ticketTypes":{"title":"Ticket Types","items":{"$ref":"#/definitions/TicketTypeResponse"},"type":"array"},"tier":{"title":"Tier","type":"string","enum":["community","enterprise"]},"timeformat":{"title":"Time Format","type":"string"},"version":{"title":"Version","type":"string"}},"$id":"#/definitions/Settings"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["unassigned","open_tickets_per_user","tickets_per_week","tickets_per_type"],"x-embed":"","properties":{"open_tickets_per_user":{"type":"object","additionalProperties":{"type":"integer"}},"tickets_per_type":{"type":"object","additionalProperties":{"type":"integer"}},"tickets_per_week":{"type":"object","additionalProperties":{"type":"integer"}},"unassigned":{"type":"integer"}},"$id":"#/definitions/Statistics"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["name","type","done","created"],"x-embed":"","properties":{"automation":{"type":"string"},"closed":{"format":"date-time","type":"string"},"created":{"format":"date-time","type":"string"},"data":{"type":"object"},"done":{"type":"boolean"},"join":{"type":"boolean"},"name":{"type":"string"},"next":{"type":"object","additionalProperties":{"type":"string"}},"owner":{"type":"string"},"payload":{"type":"object","additionalProperties":{"type":"string"}},"schema":{"type":"object"},"type":{"type":"string","enum":["task","input","automation"]}},"$id":"#/definitions/Task"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["name","type"],"x-embed":"","properties":{"automation":{"type":"string"},"closed":{"format":"date-time","type":"string"},"created":{"format":"date-time","type":"string"},"data":{"type":"object"},"done":{"type":"boolean"},"join":{"type":"boolean"},"name":{"type":"string"},"next":{"type":"object","additionalProperties":{"type":"string"}},"owner":{"type":"string"},"payload":{"type":"object","additionalProperties":{"type":"string"}},"schema":{"type":"object"},"type":{"type":"string","enum":["task","input","automation"]}},"$id":"#/definitions/TaskForm"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["ticket_id","playbook_id","task_id"],"x-embed":"","properties":{"playbook_id":{"type":"string"},"task_id":{"type":"string"},"ticket_id":{"format":"int64","type":"integer"}},"$id":"#/definitions/TaskOrigin"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["name","type","done","created","order","active"],"x-embed":"","properties":{"active":{"type":"boolean"},"automation":{"type":"string"},"closed":{"format":"date-time","type":"string"},"created":{"format":"date-time","type":"string"},"data":{"type":"object"},"done":{"type":"boolean"},"join":{"type":"boolean"},"name":{"type":"string"},"next":{"type":"object","additionalProperties":{"type":"string"}},"order":{"format":"int64","type":"number"},"owner":{"type":"string"},"payload":{"type":"object","additionalProperties":{"type":"string"}},"schema":{"type":"object"},"type":{"type":"string","enum":["task","input","automation"]}},"$id":"#/definitions/TaskResponse"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["ticket_id","ticket_name","playbook_id","playbook_name","task_id","task"],"x-embed":"","properties":{"playbook_id":{"type":"string"},"playbook_name":{"type":"string"},"task":{"$ref":"#/definitions/TaskResponse"},"task_id":{"type":"string"},"ticket_id":{"format":"int64","type":"number"},"ticket_name":{"type":"string"}},"$id":"#/definitions/TaskWithContext"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["name","type","status","created","modified","schema"],"x-embed":"","properties":{"artifacts":{"items":{"$ref":"#/definitions/Artifact"},"type":"array"},"comments":{"items":{"$ref":"#/definitions/Comment"},"type":"array"},"created":{"format":"date-time","type":"string"},"details":{"type":"object"},"files":{"items":{"$ref":"#/definitions/File"},"type":"array"},"modified":{"format":"date-time","type":"string"},"name":{"type":"string"},"owner":{"type":"string"},"playbooks":{"type":"object","additionalProperties":{"$ref":"#/definitions/Playbook"}},"read":{"items":{"type":"string"},"type":"array"},"references":{"items":{"$ref":"#/definitions/Reference"},"type":"array"},"schema":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"},"write":{"items":{"type":"string"},"type":"array"}},"$id":"#/definitions/Ticket"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["name","type","status"],"x-embed":"","properties":{"artifacts":{"items":{"$ref":"#/definitions/Artifact"},"type":"array"},"comments":{"items":{"$ref":"#/definitions/Comment"},"type":"array"},"created":{"format":"date-time","type":"string"},"details":{"type":"object"},"files":{"items":{"$ref":"#/definitions/File"},"type":"array"},"id":{"format":"int64","type":"integer"},"modified":{"format":"date-time","type":"string"},"name":{"type":"string"},"owner":{"type":"string"},"playbooks":{"items":{"$ref":"#/definitions/PlaybookTemplateForm"},"type":"array"},"read":{"items":{"type":"string"},"type":"array"},"references":{"items":{"$ref":"#/definitions/Reference"},"type":"array"},"schema":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"},"write":{"items":{"type":"string"},"type":"array"}},"$id":"#/definitions/TicketForm"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["tickets","count"],"x-embed":"","properties":{"count":{"type":"number"},"tickets":{"items":{"$ref":"#/definitions/TicketSimpleResponse"},"type":"array"}},"$id":"#/definitions/TicketList"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["id","name","type","status","created","modified","schema"],"x-embed":"","properties":{"artifacts":{"items":{"$ref":"#/definitions/Artifact"},"type":"array"},"comments":{"items":{"$ref":"#/definitions/Comment"},"type":"array"},"created":{"format":"date-time","type":"string"},"details":{"type":"object"},"files":{"items":{"$ref":"#/definitions/File"},"type":"array"},"id":{"format":"int64","type":"integer"},"modified":{"format":"date-time","type":"string"},"name":{"type":"string"},"owner":{"type":"string"},"playbooks":{"type":"object","additionalProperties":{"$ref":"#/definitions/PlaybookResponse"}},"read":{"items":{"type":"string"},"type":"array"},"references":{"items":{"$ref":"#/definitions/Reference"},"type":"array"},"schema":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"},"write":{"items":{"type":"string"},"type":"array"}},"$id":"#/definitions/TicketResponse"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["id","name","type","status","created","modified","schema"],"x-embed":"","properties":{"artifacts":{"items":{"$ref":"#/definitions/Artifact"},"type":"array"},"comments":{"items":{"$ref":"#/definitions/Comment"},"type":"array"},"created":{"format":"date-time","type":"string"},"details":{"type":"object"},"files":{"items":{"$ref":"#/definitions/File"},"type":"array"},"id":{"format":"int64","type":"integer"},"modified":{"format":"date-time","type":"string"},"name":{"type":"string"},"owner":{"type":"string"},"playbooks":{"type":"object","additionalProperties":{"$ref":"#/definitions/Playbook"}},"read":{"items":{"type":"string"},"type":"array"},"references":{"items":{"$ref":"#/definitions/Reference"},"type":"array"},"schema":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"},"write":{"items":{"type":"string"},"type":"array"}},"$id":"#/definitions/TicketSimpleResponse"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["name","schema"],"x-embed":"","properties":{"name":{"type":"string"},"schema":{"type":"string"}},"$id":"#/definitions/TicketTemplate"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["name","schema"],"x-embed":"","properties":{"id":{"type":"string"},"name":{"type":"string"},"schema":{"type":"string"}},"$id":"#/definitions/TicketTemplateForm"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["id","name","schema"],"x-embed":"","properties":{"id":{"type":"string"},"name":{"type":"string"},"schema":{"type":"string"}},"$id":"#/definitions/TicketTemplateResponse"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["name","icon","default_template","default_playbooks"],"x-embed":"","properties":{"default_groups":{"items":{"type":"string"},"type":"array"},"default_playbooks":{"items":{"type":"string"},"type":"array"},"default_template":{"type":"string"},"icon":{"type":"string"},"name":{"type":"string"}},"$id":"#/definitions/TicketType"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["name","icon","default_template","default_playbooks"],"x-embed":"","properties":{"default_groups":{"items":{"type":"string"},"type":"array"},"default_playbooks":{"items":{"type":"string"},"type":"array"},"default_template":{"type":"string"},"icon":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"}},"$id":"#/definitions/TicketTypeForm"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["id","name","icon","default_template","default_playbooks"],"x-embed":"","properties":{"default_groups":{"items":{"type":"string"},"type":"array"},"default_playbooks":{"items":{"type":"string"},"type":"array"},"default_template":{"type":"string"},"icon":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"}},"$id":"#/definitions/TicketTypeResponse"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["id","name","type","status","created","modified","schema"],"x-embed":"","properties":{"artifacts":{"items":{"$ref":"#/definitions/Artifact"},"type":"array"},"comments":{"items":{"$ref":"#/definitions/Comment"},"type":"array"},"created":{"format":"date-time","type":"string"},"details":{"type":"object"},"files":{"items":{"$ref":"#/definitions/File"},"type":"array"},"id":{"format":"int64","type":"integer"},"modified":{"format":"date-time","type":"string"},"name":{"type":"string"},"owner":{"type":"string"},"playbooks":{"type":"object","additionalProperties":{"$ref":"#/definitions/PlaybookResponse"}},"read":{"items":{"type":"string"},"type":"array"},"references":{"items":{"$ref":"#/definitions/Reference"},"type":"array"},"schema":{"type":"string"},"status":{"type":"string"},"tickets":{"items":{"$ref":"#/definitions/TicketSimpleResponse"},"type":"array"},"type":{"type":"string"},"write":{"items":{"type":"string"},"type":"array"}},"$id":"#/definitions/TicketWithTickets"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["id","name","icon"],"x-embed":"","properties":{"color":{"title":"Color","type":"string","enum":["error","info","success","warning"]},"icon":{"title":"Icon (https://materialdesignicons.com)","type":"string"},"id":{"title":"ID","type":"string"},"name":{"title":"Name","type":"string"}},"$id":"#/definitions/Type"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["blocked","apikey","roles"],"x-embed":"","properties":{"apikey":{"type":"boolean"},"blocked":{"type":"boolean"},"roles":{"items":{"type":"string"},"type":"array"},"sha256":{"type":"string"}},"$id":"#/definitions/User"}`), + gojsonschema.NewStringLoader(`{"type":"object","x-embed":"","properties":{"email":{"type":"string"},"image":{"type":"string"},"name":{"type":"string"},"timeformat":{"title":"Time Format (https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens)","type":"string"}},"$id":"#/definitions/UserData"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["id"],"x-embed":"","properties":{"email":{"type":"string"},"id":{"type":"string"},"image":{"type":"string"},"name":{"type":"string"},"timeformat":{"title":"Time Format (https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens)","type":"string"}},"$id":"#/definitions/UserDataResponse"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["id","blocked","roles","apikey"],"x-embed":"","properties":{"apikey":{"type":"boolean"},"blocked":{"type":"boolean"},"id":{"type":"string"},"roles":{"items":{"type":"string"},"type":"array"}},"$id":"#/definitions/UserForm"}`), + gojsonschema.NewStringLoader(`{"type":"object","required":["id","blocked","roles","apikey"],"x-embed":"","properties":{"apikey":{"type":"boolean"},"blocked":{"type":"boolean"},"id":{"type":"string"},"roles":{"items":{"type":"string"},"type":"array"}},"$id":"#/definitions/UserResponse"}`), + ) + if err != nil { + panic(err) + } + + ArtifactSchema = mustCompile(`#/definitions/Artifact`) + ArtifactOriginSchema = mustCompile(`#/definitions/ArtifactOrigin`) + AutomationSchema = mustCompile(`#/definitions/Automation`) + AutomationFormSchema = mustCompile(`#/definitions/AutomationForm`) + AutomationResponseSchema = mustCompile(`#/definitions/AutomationResponse`) + CommentSchema = mustCompile(`#/definitions/Comment`) + CommentFormSchema = mustCompile(`#/definitions/CommentForm`) + ContextSchema = mustCompile(`#/definitions/Context`) + EnrichmentSchema = mustCompile(`#/definitions/Enrichment`) + EnrichmentFormSchema = mustCompile(`#/definitions/EnrichmentForm`) + FileSchema = mustCompile(`#/definitions/File`) + JobSchema = mustCompile(`#/definitions/Job`) + JobFormSchema = mustCompile(`#/definitions/JobForm`) + JobResponseSchema = mustCompile(`#/definitions/JobResponse`) + LogEntrySchema = mustCompile(`#/definitions/LogEntry`) + MessageSchema = mustCompile(`#/definitions/Message`) + NewUserResponseSchema = mustCompile(`#/definitions/NewUserResponse`) + OriginSchema = mustCompile(`#/definitions/Origin`) + PlaybookSchema = mustCompile(`#/definitions/Playbook`) + PlaybookResponseSchema = mustCompile(`#/definitions/PlaybookResponse`) + PlaybookTemplateSchema = mustCompile(`#/definitions/PlaybookTemplate`) + PlaybookTemplateFormSchema = mustCompile(`#/definitions/PlaybookTemplateForm`) + PlaybookTemplateResponseSchema = mustCompile(`#/definitions/PlaybookTemplateResponse`) + ReferenceSchema = mustCompile(`#/definitions/Reference`) + SettingsSchema = mustCompile(`#/definitions/Settings`) + StatisticsSchema = mustCompile(`#/definitions/Statistics`) + TaskSchema = mustCompile(`#/definitions/Task`) + TaskFormSchema = mustCompile(`#/definitions/TaskForm`) + TaskOriginSchema = mustCompile(`#/definitions/TaskOrigin`) + TaskResponseSchema = mustCompile(`#/definitions/TaskResponse`) + TaskWithContextSchema = mustCompile(`#/definitions/TaskWithContext`) + TicketSchema = mustCompile(`#/definitions/Ticket`) + TicketFormSchema = mustCompile(`#/definitions/TicketForm`) + TicketListSchema = mustCompile(`#/definitions/TicketList`) + TicketResponseSchema = mustCompile(`#/definitions/TicketResponse`) + TicketSimpleResponseSchema = mustCompile(`#/definitions/TicketSimpleResponse`) + TicketTemplateSchema = mustCompile(`#/definitions/TicketTemplate`) + TicketTemplateFormSchema = mustCompile(`#/definitions/TicketTemplateForm`) + TicketTemplateResponseSchema = mustCompile(`#/definitions/TicketTemplateResponse`) + TicketTypeSchema = mustCompile(`#/definitions/TicketType`) + TicketTypeFormSchema = mustCompile(`#/definitions/TicketTypeForm`) + TicketTypeResponseSchema = mustCompile(`#/definitions/TicketTypeResponse`) + TicketWithTicketsSchema = mustCompile(`#/definitions/TicketWithTickets`) + TypeSchema = mustCompile(`#/definitions/Type`) + UserSchema = mustCompile(`#/definitions/User`) + UserDataSchema = mustCompile(`#/definitions/UserData`) + UserDataResponseSchema = mustCompile(`#/definitions/UserDataResponse`) + UserFormSchema = mustCompile(`#/definitions/UserForm`) + UserResponseSchema = mustCompile(`#/definitions/UserResponse`) +} + +type Artifact struct { + Enrichments map[string]*Enrichment `json:"enrichments,omitempty"` + Name string `json:"name"` + Status *string `json:"status,omitempty"` + Type *string `json:"type,omitempty"` +} + +type ArtifactOrigin struct { + Artifact string `json:"artifact"` + TicketId int64 `json:"ticket_id"` +} + +type Automation struct { + Image string `json:"image"` + Schema *string `json:"schema,omitempty"` + Script string `json:"script"` + Type []string `json:"type"` +} + +type AutomationForm struct { + ID string `json:"id"` + Image string `json:"image"` + Schema *string `json:"schema,omitempty"` + Script string `json:"script"` + Type []string `json:"type"` +} + +type AutomationResponse struct { + ID string `json:"id"` + Image string `json:"image"` + Schema *string `json:"schema,omitempty"` + Script string `json:"script"` + Type []string `json:"type"` +} + +type Comment struct { + Created time.Time `json:"created"` + Creator string `json:"creator"` + Message string `json:"message"` +} + +type CommentForm struct { + Created *time.Time `json:"created,omitempty"` + Creator *string `json:"creator,omitempty"` + Message string `json:"message"` +} + +type Context struct { + Artifact *Artifact `json:"artifact,omitempty"` + Playbook *PlaybookResponse `json:"playbook,omitempty"` + Task *TaskResponse `json:"task,omitempty"` + Ticket *TicketResponse `json:"ticket,omitempty"` +} + +type Enrichment struct { + Created time.Time `json:"created"` + Data interface{} `json:"data"` + Name string `json:"name"` +} + +type EnrichmentForm struct { + Data interface{} `json:"data"` + Name string `json:"name"` +} + +type File struct { + Key string `json:"key"` + Name string `json:"name"` +} + +type Job struct { + Automation string `json:"automation"` + Container *string `json:"container,omitempty"` + Log *string `json:"log,omitempty"` + Origin *Origin `json:"origin,omitempty"` + Output interface{} `json:"output,omitempty"` + Payload interface{} `json:"payload,omitempty"` + Running bool `json:"running"` + Status string `json:"status"` +} + +type JobForm struct { + Automation string `json:"automation"` + Origin *Origin `json:"origin,omitempty"` + Payload interface{} `json:"payload,omitempty"` +} + +type JobResponse struct { + Automation string `json:"automation"` + Container *string `json:"container,omitempty"` + ID string `json:"id"` + Log *string `json:"log,omitempty"` + Origin *Origin `json:"origin,omitempty"` + Output interface{} `json:"output,omitempty"` + Payload interface{} `json:"payload,omitempty"` + Status string `json:"status"` +} + +type LogEntry struct { + Created time.Time `json:"created"` + Creator string `json:"creator"` + Message string `json:"message"` + Reference string `json:"reference"` +} + +type Message struct { + Context *Context `json:"context,omitempty"` + Payload interface{} `json:"payload,omitempty"` + Secrets map[string]string `json:"secrets,omitempty"` +} + +type NewUserResponse struct { + Blocked bool `json:"blocked"` + ID string `json:"id"` + Roles []string `json:"roles"` + Secret *string `json:"secret,omitempty"` +} + +type Origin struct { + ArtifactOrigin *ArtifactOrigin `json:"artifact_origin,omitempty"` + TaskOrigin *TaskOrigin `json:"task_origin,omitempty"` +} + +type Playbook struct { + Name string `json:"name"` + Tasks map[string]*Task `json:"tasks"` +} + +type PlaybookResponse struct { + Name string `json:"name"` + Tasks map[string]*TaskResponse `json:"tasks"` +} + +type PlaybookTemplate struct { + Name string `json:"name"` + Yaml string `json:"yaml"` +} + +type PlaybookTemplateForm struct { + ID *string `json:"id,omitempty"` + Yaml string `json:"yaml"` +} + +type PlaybookTemplateResponse struct { + ID string `json:"id"` + Name string `json:"name"` + Yaml string `json:"yaml"` +} + +type Reference struct { + Href string `json:"href"` + Name string `json:"name"` +} + +type Settings struct { + ArtifactStates []*Type `json:"artifactStates"` + Roles []string `json:"roles,omitempty"` + TicketTypes []*TicketTypeResponse `json:"ticketTypes"` + Tier string `json:"tier"` + Timeformat string `json:"timeformat"` + Version string `json:"version"` +} + +type Statistics struct { + OpenTicketsPerUser map[string]int `json:"open_tickets_per_user"` + TicketsPerType map[string]int `json:"tickets_per_type"` + TicketsPerWeek map[string]int `json:"tickets_per_week"` + Unassigned int `json:"unassigned"` +} + +type Task struct { + Automation *string `json:"automation,omitempty"` + Closed *time.Time `json:"closed,omitempty"` + Created time.Time `json:"created"` + Data interface{} `json:"data,omitempty"` + Done bool `json:"done"` + Join *bool `json:"join,omitempty"` + Name string `json:"name"` + Next map[string]string `json:"next,omitempty"` + Owner *string `json:"owner,omitempty"` + Payload map[string]string `json:"payload,omitempty"` + Schema interface{} `json:"schema,omitempty"` + Type string `json:"type"` +} + +type TaskForm struct { + Automation *string `json:"automation,omitempty"` + Closed *time.Time `json:"closed,omitempty"` + Created *time.Time `json:"created,omitempty"` + Data interface{} `json:"data,omitempty"` + Done *bool `json:"done,omitempty"` + Join *bool `json:"join,omitempty"` + Name string `json:"name"` + Next map[string]string `json:"next,omitempty"` + Owner *string `json:"owner,omitempty"` + Payload map[string]string `json:"payload,omitempty"` + Schema interface{} `json:"schema,omitempty"` + Type string `json:"type"` +} + +type TaskOrigin struct { + PlaybookId string `json:"playbook_id"` + TaskId string `json:"task_id"` + TicketId int64 `json:"ticket_id"` +} + +type TaskResponse struct { + Active bool `json:"active"` + Automation *string `json:"automation,omitempty"` + Closed *time.Time `json:"closed,omitempty"` + Created time.Time `json:"created"` + Data interface{} `json:"data,omitempty"` + Done bool `json:"done"` + Join *bool `json:"join,omitempty"` + Name string `json:"name"` + Next map[string]string `json:"next,omitempty"` + Order int64 `json:"order"` + Owner *string `json:"owner,omitempty"` + Payload map[string]string `json:"payload,omitempty"` + Schema interface{} `json:"schema,omitempty"` + Type string `json:"type"` +} + +type TaskWithContext struct { + PlaybookId string `json:"playbook_id"` + PlaybookName string `json:"playbook_name"` + Task TaskResponse `json:"task"` + TaskId string `json:"task_id"` + TicketId int64 `json:"ticket_id"` + TicketName string `json:"ticket_name"` +} + +type Ticket struct { + Artifacts []*Artifact `json:"artifacts,omitempty"` + Comments []*Comment `json:"comments,omitempty"` + Created time.Time `json:"created"` + Details interface{} `json:"details,omitempty"` + Files []*File `json:"files,omitempty"` + Modified time.Time `json:"modified"` + Name string `json:"name"` + Owner *string `json:"owner,omitempty"` + Playbooks map[string]*Playbook `json:"playbooks,omitempty"` + Read []string `json:"read,omitempty"` + References []*Reference `json:"references,omitempty"` + Schema string `json:"schema"` + Status string `json:"status"` + Type string `json:"type"` + Write []string `json:"write,omitempty"` +} + +type TicketForm struct { + Artifacts []*Artifact `json:"artifacts,omitempty"` + Comments []*Comment `json:"comments,omitempty"` + Created *time.Time `json:"created,omitempty"` + Details interface{} `json:"details,omitempty"` + Files []*File `json:"files,omitempty"` + ID *int64 `json:"id,omitempty"` + Modified *time.Time `json:"modified,omitempty"` + Name string `json:"name"` + Owner *string `json:"owner,omitempty"` + Playbooks []*PlaybookTemplateForm `json:"playbooks,omitempty"` + Read []string `json:"read,omitempty"` + References []*Reference `json:"references,omitempty"` + Schema *string `json:"schema,omitempty"` + Status string `json:"status"` + Type string `json:"type"` + Write []string `json:"write,omitempty"` +} + +type TicketList struct { + Count int `json:"count"` + Tickets []*TicketSimpleResponse `json:"tickets"` +} + +type TicketResponse struct { + Artifacts []*Artifact `json:"artifacts,omitempty"` + Comments []*Comment `json:"comments,omitempty"` + Created time.Time `json:"created"` + Details interface{} `json:"details,omitempty"` + Files []*File `json:"files,omitempty"` + ID int64 `json:"id"` + Modified time.Time `json:"modified"` + Name string `json:"name"` + Owner *string `json:"owner,omitempty"` + Playbooks map[string]*PlaybookResponse `json:"playbooks,omitempty"` + Read []string `json:"read,omitempty"` + References []*Reference `json:"references,omitempty"` + Schema string `json:"schema"` + Status string `json:"status"` + Type string `json:"type"` + Write []string `json:"write,omitempty"` +} + +type TicketSimpleResponse struct { + Artifacts []*Artifact `json:"artifacts,omitempty"` + Comments []*Comment `json:"comments,omitempty"` + Created time.Time `json:"created"` + Details interface{} `json:"details,omitempty"` + Files []*File `json:"files,omitempty"` + ID int64 `json:"id"` + Modified time.Time `json:"modified"` + Name string `json:"name"` + Owner *string `json:"owner,omitempty"` + Playbooks map[string]*Playbook `json:"playbooks,omitempty"` + Read []string `json:"read,omitempty"` + References []*Reference `json:"references,omitempty"` + Schema string `json:"schema"` + Status string `json:"status"` + Type string `json:"type"` + Write []string `json:"write,omitempty"` +} + +type TicketTemplate struct { + Name string `json:"name"` + Schema string `json:"schema"` +} + +type TicketTemplateForm struct { + ID *string `json:"id,omitempty"` + Name string `json:"name"` + Schema string `json:"schema"` +} + +type TicketTemplateResponse struct { + ID string `json:"id"` + Name string `json:"name"` + Schema string `json:"schema"` +} + +type TicketType struct { + DefaultGroups []string `json:"default_groups,omitempty"` + DefaultPlaybooks []string `json:"default_playbooks"` + DefaultTemplate string `json:"default_template"` + Icon string `json:"icon"` + Name string `json:"name"` +} + +type TicketTypeForm struct { + DefaultGroups []string `json:"default_groups,omitempty"` + DefaultPlaybooks []string `json:"default_playbooks"` + DefaultTemplate string `json:"default_template"` + Icon string `json:"icon"` + ID *string `json:"id,omitempty"` + Name string `json:"name"` +} + +type TicketTypeResponse struct { + DefaultGroups []string `json:"default_groups,omitempty"` + DefaultPlaybooks []string `json:"default_playbooks"` + DefaultTemplate string `json:"default_template"` + Icon string `json:"icon"` + ID string `json:"id"` + Name string `json:"name"` +} + +type TicketWithTickets struct { + Artifacts []*Artifact `json:"artifacts,omitempty"` + Comments []*Comment `json:"comments,omitempty"` + Created time.Time `json:"created"` + Details interface{} `json:"details,omitempty"` + Files []*File `json:"files,omitempty"` + ID int64 `json:"id"` + Modified time.Time `json:"modified"` + Name string `json:"name"` + Owner *string `json:"owner,omitempty"` + Playbooks map[string]*PlaybookResponse `json:"playbooks,omitempty"` + Read []string `json:"read,omitempty"` + References []*Reference `json:"references,omitempty"` + Schema string `json:"schema"` + Status string `json:"status"` + Tickets []*TicketSimpleResponse `json:"tickets,omitempty"` + Type string `json:"type"` + Write []string `json:"write,omitempty"` +} + +type Type struct { + Color *string `json:"color,omitempty"` + Icon string `json:"icon"` + ID string `json:"id"` + Name string `json:"name"` +} + +type User struct { + Apikey bool `json:"apikey"` + Blocked bool `json:"blocked"` + Roles []string `json:"roles"` + Sha256 *string `json:"sha256,omitempty"` +} + +type UserData struct { + Email *string `json:"email,omitempty"` + Image *string `json:"image,omitempty"` + Name *string `json:"name,omitempty"` + Timeformat *string `json:"timeformat,omitempty"` +} + +type UserDataResponse struct { + Email *string `json:"email,omitempty"` + ID string `json:"id"` + Image *string `json:"image,omitempty"` + Name *string `json:"name,omitempty"` + Timeformat *string `json:"timeformat,omitempty"` +} + +type UserForm struct { + Apikey bool `json:"apikey"` + Blocked bool `json:"blocked"` + ID string `json:"id"` + Roles []string `json:"roles"` +} + +type UserResponse struct { + Apikey bool `json:"apikey"` + Blocked bool `json:"blocked"` + ID string `json:"id"` + Roles []string `json:"roles"` +} + +func mustCompile(uri string) *gojsonschema.Schema { + s, err := schemaLoader.Compile(gojsonschema.NewReferenceLoader(uri)) + if err != nil { + panic(err) + } + return s +} + +func validate(s *gojsonschema.Schema, b []byte) error { + res, err := s.Validate(gojsonschema.NewStringLoader(string(b))) + if err != nil { + return err + } + + if len(res.Errors()) > 0 { + var l []string + for _, e := range res.Errors() { + l = append(l, e.String()) + } + return fmt.Errorf("validation failed: %v", strings.Join(l, ", ")) + } + return nil +} + +const ( + SettingsTierCommunity = "community" + + SettingsTierEnterprise = "enterprise" + + TaskTypeTask = "task" + + TaskTypeInput = "input" + + TaskTypeAutomation = "automation" + + TaskFormTypeTask = "task" + + TaskFormTypeInput = "input" + + TaskFormTypeAutomation = "automation" + + TaskResponseTypeTask = "task" + + TaskResponseTypeInput = "input" + + TaskResponseTypeAutomation = "automation" + + TypeColorError = "error" + + TypeColorInfo = "info" + + TypeColorSuccess = "success" + + TypeColorWarning = "warning" +) diff --git a/generated/restapi/api.go b/generated/restapi/api.go new file mode 100644 index 0000000..b56ed31 --- /dev/null +++ b/generated/restapi/api.go @@ -0,0 +1,252 @@ +package restapi + +import ( + "context" + "log" + "net/http" + "os" + "os/signal" + "syscall" + "time" + + "github.com/gin-gonic/gin" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/automations" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/jobs" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/logs" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/playbooks" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/settings" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/statistics" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/tasks" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/templates" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/tickets" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/tickettypes" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/userdata" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/users" + "github.com/SecurityBrewery/catalyst/role" +) + +// Service is the interface that must be implemented in order to provide +// business logic for the Server service. +type Service interface { + AddArtifact(ctx context.Context, params *tickets.AddArtifactParams) *api.Response + AddComment(ctx context.Context, params *tickets.AddCommentParams) *api.Response + AddTicketPlaybook(ctx context.Context, params *tickets.AddTicketPlaybookParams) *api.Response + CompleteTask(ctx context.Context, params *tickets.CompleteTaskParams) *api.Response + CreateAutomation(ctx context.Context, params *automations.CreateAutomationParams) *api.Response + CreatePlaybook(ctx context.Context, params *playbooks.CreatePlaybookParams) *api.Response + CreateTemplate(ctx context.Context, params *templates.CreateTemplateParams) *api.Response + CreateTicket(ctx context.Context, params *tickets.CreateTicketParams) *api.Response + CreateTicketBatch(ctx context.Context, params *tickets.CreateTicketBatchParams) *api.Response + CreateTicketType(ctx context.Context, params *tickettypes.CreateTicketTypeParams) *api.Response + CreateUser(ctx context.Context, params *users.CreateUserParams) *api.Response + CurrentUser(ctx context.Context) *api.Response + CurrentUserData(ctx context.Context) *api.Response + DeleteAutomation(ctx context.Context, params *automations.DeleteAutomationParams) *api.Response + DeletePlaybook(ctx context.Context, params *playbooks.DeletePlaybookParams) *api.Response + DeleteTemplate(ctx context.Context, params *templates.DeleteTemplateParams) *api.Response + DeleteTicket(ctx context.Context, params *tickets.DeleteTicketParams) *api.Response + DeleteTicketType(ctx context.Context, params *tickettypes.DeleteTicketTypeParams) *api.Response + DeleteUser(ctx context.Context, params *users.DeleteUserParams) *api.Response + EnrichArtifact(ctx context.Context, params *tickets.EnrichArtifactParams) *api.Response + GetArtifact(ctx context.Context, params *tickets.GetArtifactParams) *api.Response + GetAutomation(ctx context.Context, params *automations.GetAutomationParams) *api.Response + GetJob(ctx context.Context, params *jobs.GetJobParams) *api.Response + GetLogs(ctx context.Context, params *logs.GetLogsParams) *api.Response + GetPlaybook(ctx context.Context, params *playbooks.GetPlaybookParams) *api.Response + GetSettings(ctx context.Context) *api.Response + GetStatistics(ctx context.Context) *api.Response + GetTemplate(ctx context.Context, params *templates.GetTemplateParams) *api.Response + GetTicket(ctx context.Context, params *tickets.GetTicketParams) *api.Response + GetTicketType(ctx context.Context, params *tickettypes.GetTicketTypeParams) *api.Response + GetUser(ctx context.Context, params *users.GetUserParams) *api.Response + GetUserData(ctx context.Context, params *userdata.GetUserDataParams) *api.Response + LinkFiles(ctx context.Context, params *tickets.LinkFilesParams) *api.Response + LinkTicket(ctx context.Context, params *tickets.LinkTicketParams) *api.Response + ListAutomations(ctx context.Context) *api.Response + ListJobs(ctx context.Context) *api.Response + ListPlaybooks(ctx context.Context) *api.Response + ListTasks(ctx context.Context) *api.Response + ListTemplates(ctx context.Context) *api.Response + ListTicketTypes(ctx context.Context) *api.Response + ListTickets(ctx context.Context, params *tickets.ListTicketsParams) *api.Response + ListUserData(ctx context.Context) *api.Response + ListUsers(ctx context.Context) *api.Response + RemoveArtifact(ctx context.Context, params *tickets.RemoveArtifactParams) *api.Response + RemoveComment(ctx context.Context, params *tickets.RemoveCommentParams) *api.Response + RemoveTicketPlaybook(ctx context.Context, params *tickets.RemoveTicketPlaybookParams) *api.Response + RunArtifact(ctx context.Context, params *tickets.RunArtifactParams) *api.Response + RunJob(ctx context.Context, params *jobs.RunJobParams) *api.Response + RunTask(ctx context.Context, params *tickets.RunTaskParams) *api.Response + SetArtifact(ctx context.Context, params *tickets.SetArtifactParams) *api.Response + SetReferences(ctx context.Context, params *tickets.SetReferencesParams) *api.Response + SetSchema(ctx context.Context, params *tickets.SetSchemaParams) *api.Response + SetTask(ctx context.Context, params *tickets.SetTaskParams) *api.Response + UnlinkTicket(ctx context.Context, params *tickets.UnlinkTicketParams) *api.Response + UpdateAutomation(ctx context.Context, params *automations.UpdateAutomationParams) *api.Response + UpdateCurrentUserData(ctx context.Context, params *userdata.UpdateCurrentUserDataParams) *api.Response + UpdateJob(ctx context.Context, params *jobs.UpdateJobParams) *api.Response + UpdatePlaybook(ctx context.Context, params *playbooks.UpdatePlaybookParams) *api.Response + UpdateTemplate(ctx context.Context, params *templates.UpdateTemplateParams) *api.Response + UpdateTicket(ctx context.Context, params *tickets.UpdateTicketParams) *api.Response + UpdateTicketType(ctx context.Context, params *tickettypes.UpdateTicketTypeParams) *api.Response + UpdateUser(ctx context.Context, params *users.UpdateUserParams) *api.Response + UpdateUserData(ctx context.Context, params *userdata.UpdateUserDataParams) *api.Response +} + +// Config defines the config options for the API server. +type Config struct { + Address string + InsecureHTTP bool + TLSCertFile string + TLSKeyFile string +} + +// Server defines the Server service. +type Server struct { + *gin.Engine + config *Config + server *http.Server + service Service + + ApiGroup *gin.RouterGroup + + RoleAuth func([]role.Role) gin.HandlerFunc +} + +// New initializes a new Server service. +func New(svc Service, config *Config) *Server { + engine := gin.New() + engine.Use(gin.Recovery()) + + return &Server{ + Engine: engine, + service: svc, + config: config, + server: &http.Server{ + Addr: config.Address, + Handler: engine, + ReadTimeout: 10 * time.Second, + WriteTimeout: 10 * time.Second, + }, + + ApiGroup: engine.Group("/api"), + + RoleAuth: func(i []role.Role) gin.HandlerFunc { return func(c *gin.Context) { c.Next() } }, + } +} + +// ConfigureRoutes configures the routes for the Server service. +// Configuring of routes includes setting up Auth if it is enabled. +func (s *Server) ConfigureRoutes() { + s.ApiGroup.POST("/tickets/:id/artifacts", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.AddArtifactEndpoint(s.service.AddArtifact)) + s.ApiGroup.POST("/tickets/:id/comments", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.AddCommentEndpoint(s.service.AddComment)) + s.ApiGroup.POST("/tickets/:id/playbooks", s.RoleAuth([]role.Role{}), tickets.AddTicketPlaybookEndpoint(s.service.AddTicketPlaybook)) + s.ApiGroup.PUT("/tickets/:id/playbooks/:playbookID/task/:taskID/complete", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.CompleteTaskEndpoint(s.service.CompleteTask)) + s.ApiGroup.POST("/automations", s.RoleAuth([]role.Role{role.AutomationWrite}), automations.CreateAutomationEndpoint(s.service.CreateAutomation)) + s.ApiGroup.POST("/playbooks", s.RoleAuth([]role.Role{role.PlaybookWrite}), playbooks.CreatePlaybookEndpoint(s.service.CreatePlaybook)) + s.ApiGroup.POST("/templates", s.RoleAuth([]role.Role{role.TemplateWrite}), templates.CreateTemplateEndpoint(s.service.CreateTemplate)) + s.ApiGroup.POST("/tickets", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.CreateTicketEndpoint(s.service.CreateTicket)) + s.ApiGroup.POST("/tickets/batch", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.CreateTicketBatchEndpoint(s.service.CreateTicketBatch)) + s.ApiGroup.POST("/tickettypes", s.RoleAuth([]role.Role{role.TickettypeWrite}), tickettypes.CreateTicketTypeEndpoint(s.service.CreateTicketType)) + s.ApiGroup.POST("/users", s.RoleAuth([]role.Role{role.UserWrite}), users.CreateUserEndpoint(s.service.CreateUser)) + s.ApiGroup.GET("/currentuser", s.RoleAuth([]role.Role{role.CurrentuserRead}), users.CurrentUserEndpoint(s.service.CurrentUser)) + s.ApiGroup.GET("/currentuserdata", s.RoleAuth([]role.Role{role.CurrentuserdataRead}), userdata.CurrentUserDataEndpoint(s.service.CurrentUserData)) + s.ApiGroup.DELETE("/automations/:id", s.RoleAuth([]role.Role{role.AutomationWrite}), automations.DeleteAutomationEndpoint(s.service.DeleteAutomation)) + s.ApiGroup.DELETE("/playbooks/:id", s.RoleAuth([]role.Role{role.PlaybookWrite}), playbooks.DeletePlaybookEndpoint(s.service.DeletePlaybook)) + s.ApiGroup.DELETE("/templates/:id", s.RoleAuth([]role.Role{role.TemplateWrite}), templates.DeleteTemplateEndpoint(s.service.DeleteTemplate)) + s.ApiGroup.DELETE("/tickets/:id", s.RoleAuth([]role.Role{role.TicketDelete}), tickets.DeleteTicketEndpoint(s.service.DeleteTicket)) + s.ApiGroup.DELETE("/tickettypes/:id", s.RoleAuth([]role.Role{role.TickettypeWrite}), tickettypes.DeleteTicketTypeEndpoint(s.service.DeleteTicketType)) + s.ApiGroup.DELETE("/users/:id", s.RoleAuth([]role.Role{role.UserWrite}), users.DeleteUserEndpoint(s.service.DeleteUser)) + s.ApiGroup.POST("/tickets/:id/artifacts/:name/enrich", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.EnrichArtifactEndpoint(s.service.EnrichArtifact)) + s.ApiGroup.GET("/tickets/:id/artifacts/:name", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.GetArtifactEndpoint(s.service.GetArtifact)) + s.ApiGroup.GET("/automations/:id", s.RoleAuth([]role.Role{role.AutomationRead}), automations.GetAutomationEndpoint(s.service.GetAutomation)) + s.ApiGroup.GET("/jobs/:id", s.RoleAuth([]role.Role{role.JobRead}), jobs.GetJobEndpoint(s.service.GetJob)) + s.ApiGroup.GET("/logs/:reference", s.RoleAuth([]role.Role{role.LogRead}), logs.GetLogsEndpoint(s.service.GetLogs)) + s.ApiGroup.GET("/playbooks/:id", s.RoleAuth([]role.Role{role.PlaybookRead}), playbooks.GetPlaybookEndpoint(s.service.GetPlaybook)) + s.ApiGroup.GET("/settings", s.RoleAuth([]role.Role{role.SettingsRead}), settings.GetSettingsEndpoint(s.service.GetSettings)) + s.ApiGroup.GET("/statistics", s.RoleAuth([]role.Role{role.TicketRead}), statistics.GetStatisticsEndpoint(s.service.GetStatistics)) + s.ApiGroup.GET("/templates/:id", s.RoleAuth([]role.Role{role.TemplateRead}), templates.GetTemplateEndpoint(s.service.GetTemplate)) + s.ApiGroup.GET("/tickets/:id", s.RoleAuth([]role.Role{role.TicketRead}), tickets.GetTicketEndpoint(s.service.GetTicket)) + s.ApiGroup.GET("/tickettypes/:id", s.RoleAuth([]role.Role{role.TickettypeRead}), tickettypes.GetTicketTypeEndpoint(s.service.GetTicketType)) + s.ApiGroup.GET("/users/:id", s.RoleAuth([]role.Role{role.UserRead}), users.GetUserEndpoint(s.service.GetUser)) + s.ApiGroup.GET("/userdata/:id", s.RoleAuth([]role.Role{role.UserdataRead}), userdata.GetUserDataEndpoint(s.service.GetUserData)) + s.ApiGroup.PUT("/tickets/:id/files", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.LinkFilesEndpoint(s.service.LinkFiles)) + s.ApiGroup.PATCH("/tickets/:id/tickets", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.LinkTicketEndpoint(s.service.LinkTicket)) + s.ApiGroup.GET("/automations", s.RoleAuth([]role.Role{role.AutomationRead}), automations.ListAutomationsEndpoint(s.service.ListAutomations)) + s.ApiGroup.GET("/jobs", s.RoleAuth([]role.Role{role.JobRead}), jobs.ListJobsEndpoint(s.service.ListJobs)) + s.ApiGroup.GET("/playbooks", s.RoleAuth([]role.Role{role.PlaybookRead}), playbooks.ListPlaybooksEndpoint(s.service.ListPlaybooks)) + s.ApiGroup.GET("/tasks", s.RoleAuth([]role.Role{role.TicketRead}), tasks.ListTasksEndpoint(s.service.ListTasks)) + s.ApiGroup.GET("/templates", s.RoleAuth([]role.Role{role.TemplateRead}), templates.ListTemplatesEndpoint(s.service.ListTemplates)) + s.ApiGroup.GET("/tickettypes", s.RoleAuth([]role.Role{role.TickettypeRead}), tickettypes.ListTicketTypesEndpoint(s.service.ListTicketTypes)) + s.ApiGroup.GET("/tickets", s.RoleAuth([]role.Role{role.TicketRead}), tickets.ListTicketsEndpoint(s.service.ListTickets)) + s.ApiGroup.GET("/userdata", s.RoleAuth([]role.Role{role.UserdataRead}), userdata.ListUserDataEndpoint(s.service.ListUserData)) + s.ApiGroup.GET("/users", s.RoleAuth([]role.Role{role.UserRead}), users.ListUsersEndpoint(s.service.ListUsers)) + s.ApiGroup.DELETE("/tickets/:id/artifacts/:name", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.RemoveArtifactEndpoint(s.service.RemoveArtifact)) + s.ApiGroup.DELETE("/tickets/:id/comments/:commentID", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.RemoveCommentEndpoint(s.service.RemoveComment)) + s.ApiGroup.DELETE("/tickets/:id/playbooks/:playbookID", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.RemoveTicketPlaybookEndpoint(s.service.RemoveTicketPlaybook)) + s.ApiGroup.POST("/tickets/:id/artifacts/:name/run/:automation", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.RunArtifactEndpoint(s.service.RunArtifact)) + s.ApiGroup.POST("/jobs", s.RoleAuth([]role.Role{role.JobWrite}), jobs.RunJobEndpoint(s.service.RunJob)) + s.ApiGroup.POST("/tickets/:id/playbooks/:playbookID/task/:taskID/run", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.RunTaskEndpoint(s.service.RunTask)) + s.ApiGroup.PUT("/tickets/:id/artifacts/:name", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.SetArtifactEndpoint(s.service.SetArtifact)) + s.ApiGroup.PUT("/tickets/:id/references", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.SetReferencesEndpoint(s.service.SetReferences)) + s.ApiGroup.PUT("/tickets/:id/schema", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.SetSchemaEndpoint(s.service.SetSchema)) + s.ApiGroup.PUT("/tickets/:id/playbooks/:playbookID/task/:taskID", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.SetTaskEndpoint(s.service.SetTask)) + s.ApiGroup.DELETE("/tickets/:id/tickets", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.UnlinkTicketEndpoint(s.service.UnlinkTicket)) + s.ApiGroup.PUT("/automations/:id", s.RoleAuth([]role.Role{role.AutomationWrite}), automations.UpdateAutomationEndpoint(s.service.UpdateAutomation)) + s.ApiGroup.PUT("/currentuserdata", s.RoleAuth([]role.Role{role.CurrentuserdataWrite}), userdata.UpdateCurrentUserDataEndpoint(s.service.UpdateCurrentUserData)) + s.ApiGroup.PUT("/jobs/:id", s.RoleAuth([]role.Role{role.JobWrite}), jobs.UpdateJobEndpoint(s.service.UpdateJob)) + s.ApiGroup.PUT("/playbooks/:id", s.RoleAuth([]role.Role{role.PlaybookWrite}), playbooks.UpdatePlaybookEndpoint(s.service.UpdatePlaybook)) + s.ApiGroup.PUT("/templates/:id", s.RoleAuth([]role.Role{role.TemplateWrite}), templates.UpdateTemplateEndpoint(s.service.UpdateTemplate)) + s.ApiGroup.PUT("/tickets/:id", s.RoleAuth([]role.Role{role.TicketWrite}), tickets.UpdateTicketEndpoint(s.service.UpdateTicket)) + s.ApiGroup.PUT("/tickettypes/:id", s.RoleAuth([]role.Role{role.TickettypeWrite}), tickettypes.UpdateTicketTypeEndpoint(s.service.UpdateTicketType)) + s.ApiGroup.PUT("/users/:id", s.RoleAuth([]role.Role{role.UserWrite}), users.UpdateUserEndpoint(s.service.UpdateUser)) + s.ApiGroup.PUT("/userdata/:id", s.RoleAuth([]role.Role{role.UserdataWrite}), userdata.UpdateUserDataEndpoint(s.service.UpdateUserData)) +} + +// run the Server. It will listen on either HTTP or HTTPS depending on the +// config passed to NewServer. +func (s *Server) run() error { + log.Printf("Serving on address %s\n", s.server.Addr) + if s.config.InsecureHTTP { + return s.server.ListenAndServe() + } + return s.server.ListenAndServeTLS(s.config.TLSCertFile, s.config.TLSKeyFile) +} + +// Shutdown will gracefully shutdown the Server. +func (s *Server) Shutdown() error { + return s.server.Shutdown(context.Background()) +} + +// RunWithSigHandler runs the Server with SIGTERM handling automatically +// enabled. The server will listen for a SIGTERM signal and gracefully shutdown +// the web server. +// It's possible to optionally pass any number shutdown functions which will +// execute one by one after the webserver has been shutdown successfully. +func (s *Server) RunWithSigHandler(shutdown ...func() error) error { + sigCh := make(chan os.Signal, 1) + signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM) + + go func() { + <-sigCh + s.Shutdown() + }() + + err := s.run() + if err != nil { + if err != http.ErrServerClosed { + return err + } + } + + for _, fn := range shutdown { + err := fn() + if err != nil { + return err + } + } + + return nil +} diff --git a/generated/restapi/api/response.go b/generated/restapi/api/response.go new file mode 100644 index 0000000..a11347a --- /dev/null +++ b/generated/restapi/api/response.go @@ -0,0 +1,6 @@ +package api + +type Response struct { + Code int + Body interface{} +} diff --git a/generated/restapi/embedded_spec.go b/generated/restapi/embedded_spec.go new file mode 100644 index 0000000..2aba816 --- /dev/null +++ b/generated/restapi/embedded_spec.go @@ -0,0 +1,14076 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package restapi + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "encoding/json" +) + +var ( + // SwaggerJSON embedded version of the swagger document used at generation time + SwaggerJSON json.RawMessage + // FlatSwaggerJSON embedded flattened version of the swagger document used at generation time + FlatSwaggerJSON json.RawMessage +) + +func init() { + SwaggerJSON = json.RawMessage([]byte(`{ + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "schemes": [ + "http" + ], + "swagger": "2.0", + "info": { + "description": "API for the catalyst incident response platform." + }, + "host": ".", + "basePath": "/api", + "paths": { + "/automations": { + "get": { + "security": [ + { + "roles": [ + "automation:read" + ] + } + ], + "tags": [ + "automations" + ], + "summary": "List automations", + "operationId": "listAutomations", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/AutomationResponse" + } + }, + "examples": { + "test": [ + { + "id": "comment", + "image": "docker.io/python:3", + "script": "", + "type": [ + "playbook" + ] + }, + { + "id": "hash.sha1", + "image": "docker.io/python:3", + "schema": "{\"title\":\"Input\",\"type\":\"object\",\"properties\":{\"default\":{\"type\":\"string\",\"title\":\"Value\"}},\"required\":[\"default\"]}", + "script": "", + "type": [ + "global", + "artifact", + "playbook" + ] + }, + { + "id": "thehive", + "image": "docker.io/python:3", + "schema": "{\"title\":\"TheHive credentials\",\"type\":\"object\",\"properties\":{\"thehiveurl\":{\"type\":\"string\",\"title\":\"TheHive URL (e.g. 'https://thehive.example.org')\"},\"thehivekey\":{\"type\":\"string\",\"title\":\"TheHive API Key\"},\"skip_files\":{\"type\":\"boolean\", \"default\": true, \"title\":\"Skip Files (much faster)\"},\"keep_ids\":{\"type\":\"boolean\", \"default\": true, \"title\":\"Keep IDs and overwrite existing IDs\"}},\"required\":[\"thehiveurl\", \"thehivekey\", \"skip_files\", \"keep_ids\"]}", + "script": "", + "type": [ + "global" + ] + }, + { + "id": "vt.hash", + "image": "docker.io/python:3", + "schema": "{\"title\":\"Input\",\"type\":\"object\",\"properties\":{\"default\":{\"type\":\"string\",\"title\":\"Value\"}},\"required\":[\"default\"]}", + "script": "", + "type": [ + "global", + "artifact", + "playbook" + ] + } + ] + } + } + } + }, + "post": { + "security": [ + { + "roles": [ + "automation:write" + ] + } + ], + "tags": [ + "automations" + ], + "summary": "Create a new automation", + "operationId": "createAutomation", + "parameters": [ + { + "x-example": { + "id": "hash-sha-256", + "image": "docker.io/python:3", + "script": "import sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha256 = hashlib.sha256(msg['payload']['default'].encode('utf-8'))\n return {'hash': sha256.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", + "type": [ + "global" + ] + }, + "description": "New automation", + "name": "automation", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/AutomationForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/AutomationResponse" + }, + "examples": { + "test": { + "id": "hash-sha-256", + "image": "docker.io/python:3", + "script": "import sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha256 = hashlib.sha256(msg['payload']['default'].encode('utf-8'))\n return {'hash': sha256.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", + "type": [ + "global" + ] + } + } + } + } + } + }, + "/automations/{id}": { + "get": { + "security": [ + { + "roles": [ + "automation:read" + ] + } + ], + "tags": [ + "automations" + ], + "summary": "Get a single automation", + "operationId": "getAutomation", + "parameters": [ + { + "type": "string", + "x-example": "hash.sha1", + "description": "Automation ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/AutomationResponse" + }, + "examples": { + "test": { + "id": "hash.sha1", + "image": "docker.io/python:3", + "schema": "{\"title\":\"Input\",\"type\":\"object\",\"properties\":{\"default\":{\"type\":\"string\",\"title\":\"Value\"}},\"required\":[\"default\"]}", + "script": "#!/usr/bin/env python\n\nimport sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha1 = hashlib.sha1(msg['payload']['default'].encode('utf-8'))\n return {\"hash\": sha1.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", + "type": [ + "global", + "artifact", + "playbook" + ] + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "automation:write" + ] + } + ], + "tags": [ + "automations" + ], + "summary": "Update an existing automation", + "operationId": "updateAutomation", + "parameters": [ + { + "type": "string", + "x-example": "hash.sha1", + "description": "Automation ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "id": "hash.sha1", + "image": "docker.io/python:3", + "script": "import sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha1 = hashlib.sha1(msg['payload'].encode('utf-8'))\n return {'hash': sha1.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", + "type": [ + "global", + "artifact", + "playbook" + ] + }, + "description": "Automation object that needs to be added", + "name": "automation", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/AutomationForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/AutomationResponse" + }, + "examples": { + "test": { + "id": "hash.sha1", + "image": "docker.io/python:3", + "script": "import sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha1 = hashlib.sha1(msg['payload'].encode('utf-8'))\n return {'hash': sha1.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", + "type": [ + "global", + "artifact", + "playbook" + ] + } + } + } + } + }, + "delete": { + "security": [ + { + "roles": [ + "automation:write" + ] + } + ], + "tags": [ + "automations" + ], + "summary": "Delete a automation", + "operationId": "deleteAutomation", + "parameters": [ + { + "type": "string", + "x-example": "hash.sha1", + "description": "Automation ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + }, + "/currentuser": { + "get": { + "security": [ + { + "roles": [ + "currentuser:read" + ] + } + ], + "tags": [ + "users" + ], + "summary": "Get current user", + "operationId": "currentUser", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/UserResponse" + }, + "examples": { + "test": { + "apikey": false, + "blocked": false, + "id": "bob", + "roles": [ + "admin:backup:read", + "admin:backup:restore", + "admin:group:write", + "admin:job:read", + "admin:job:write", + "admin:log:read", + "admin:ticket:delete", + "admin:user:write", + "admin:userdata:read", + "admin:userdata:write", + "analyst:automation:read", + "analyst:currentsettings:write", + "analyst:currentuser:read", + "analyst:currentuserdata:read", + "analyst:file", + "analyst:group:read", + "analyst:playbook:read", + "analyst:rule:read", + "analyst:settings:read", + "analyst:template:read", + "analyst:ticket:read", + "analyst:ticket:write", + "analyst:tickettype:read", + "analyst:user:read", + "engineer:automation:write", + "engineer:playbook:write", + "engineer:rule:write", + "engineer:template:write", + "engineer:tickettype:write" + ] + } + } + } + } + } + }, + "/currentuserdata": { + "get": { + "security": [ + { + "roles": [ + "currentuserdata:read" + ] + } + ], + "tags": [ + "userdata" + ], + "summary": "Get current user data", + "operationId": "currentUserData", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/UserDataResponse" + }, + "examples": { + "test": { + "email": "bob@example.org", + "id": "bob", + "name": "Bob Bad" + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "currentuserdata:write" + ] + } + ], + "tags": [ + "userdata" + ], + "summary": "Update current user data", + "operationId": "updateCurrentUserData", + "parameters": [ + { + "x-example": { + "email": "bob@example.org", + "name": "Bob Bad" + }, + "description": "User data object that needs to be added", + "name": "userdata", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UserData" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/UserDataResponse" + }, + "examples": { + "test": { + "email": "bob@example.org", + "id": "bob", + "name": "Bob Bad" + } + } + } + } + } + }, + "/jobs": { + "get": { + "security": [ + { + "roles": [ + "job:read" + ] + } + ], + "tags": [ + "jobs" + ], + "summary": "List jobs", + "operationId": "listJobs", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/JobResponse" + } + }, + "examples": { + "test": [ + { + "automation": "hash.sha1", + "id": "99cd67131b48", + "payload": "test", + "status": "created" + } + ] + } + } + } + }, + "post": { + "security": [ + { + "roles": [ + "job:write" + ] + } + ], + "tags": [ + "jobs" + ], + "summary": "Start a new job", + "operationId": "runJob", + "parameters": [ + { + "x-example": { + "automation": "hash.sha1", + "message": { + "payload": "test" + } + }, + "description": "New job", + "name": "job", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/JobForm" + } + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + }, + "/jobs/{id}": { + "get": { + "security": [ + { + "roles": [ + "job:read" + ] + } + ], + "tags": [ + "jobs" + ], + "summary": "Get a single job", + "operationId": "getJob", + "parameters": [ + { + "type": "string", + "x-example": "99cd67131b48", + "description": "Job ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/JobResponse" + }, + "examples": { + "test": { + "automation": "hash.sha1", + "id": "99cd67131b48", + "payload": "test", + "status": "created" + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "job:write" + ] + } + ], + "tags": [ + "jobs" + ], + "summary": "Update an existing job", + "operationId": "updateJob", + "parameters": [ + { + "type": "string", + "x-example": "99cd67131b48", + "description": "Job ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "automation": "hash.sha1", + "id": "99cd67131b48", + "payload": "test", + "status": "failed" + }, + "description": "Job object that needs to be added", + "name": "job", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Job" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/JobResponse" + }, + "examples": { + "test": { + "automation": "hash.sha1", + "id": "99cd67131b48", + "payload": "test", + "status": "failed" + } + } + } + } + } + }, + "/logs/{reference}": { + "get": { + "security": [ + { + "roles": [ + "log:read" + ] + } + ], + "tags": [ + "logs" + ], + "summary": "Get log entries", + "operationId": "getLogs", + "parameters": [ + { + "type": "string", + "x-example": "tickets%2F294511", + "description": "Reference", + "name": "reference", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/LogEntry" + } + }, + "examples": { + "test": [ + { + "created": "2021-10-02T18:05:00.333535+02:00", + "creator": "bob", + "message": "Fail run account resist lend solve incident centre priority temperature. Cause change distribution examine location technique shape partner milk customer. Rail tea plate soil report cook railway interpretation breath action. Exercise dream accept park conclusion addition shoot assistance may answer. Gold writer link stop combine hear power name commitment operation. Determine lifespan support grow degree henry exclude detail set religion. Direct library policy convention chain retain discover ride walk student. Gather proposal select march aspect play noise avoid encourage employ. Assessment preserve transport combine wish influence income guess run stand. Charge limit crime ignore statement foundation study issue stop claim.", + "reference": "tickets/294511" + } + ] + } + } + } + } + }, + "/playbooks": { + "get": { + "security": [ + { + "roles": [ + "playbook:read" + ] + } + ], + "tags": [ + "playbooks" + ], + "summary": "List playbooks", + "operationId": "listPlaybooks", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PlaybookTemplateResponse" + } + }, + "examples": { + "test": [ + { + "id": "malware", + "name": "Malware", + "yaml": "name: Malware\ntasks:\n file-or-hash:\n name: Do you have the file or the hash?\n type: input\n schema:\n title: Malware\n type: object\n properties:\n file:\n type: string\n title: \"I have the\"\n enum: [ \"File\", \"Hash\" ]\n next:\n enter-hash: \"file == 'Hash'\"\n upload: \"file == 'File'\"\n\n enter-hash:\n name: Please enter the hash\n type: input\n schema:\n title: Malware\n type: object\n properties:\n hash:\n type: string\n title: Please enter the hash value\n minlength: 32\n next:\n virustotal: \"hash != ''\"\n\n upload:\n name: Upload the malware\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: object\n x-display: file\n title: Please upload the malware\n next:\n hash: \"malware\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['upload'].data['malware']\"\n next:\n virustotal:\n\n virustotal:\n name: Send hash to VirusTotal\n type: automation\n automation: vt.hash\n args:\n hash: \"playbook.tasks['enter-hash'].data['hash'] || playbook.tasks['hash'].data['hash']\"\n # next:\n # known-malware: \"score \u003e 5\"\n # sandbox: \"score \u003c 6\" # unknown-malware\n" + }, + { + "id": "phishing", + "name": "Phishing", + "yaml": "name: Phishing\ntasks:\n board:\n name: Board Involvement?\n description: Is a board member involved?\n type: input\n schema:\n properties:\n boardInvolved:\n default: false\n title: A board member is involved.\n type: boolean\n required:\n - boardInvolved\n title: Board Involvement?\n type: object\n next:\n escalate: \"boardInvolved == true\"\n mail-available: \"boardInvolved == false\"\n\n escalate:\n name: Escalate to CISO\n description: Please escalate the task to the CISO\n type: task\n\n mail-available:\n name: Mail available\n type: input\n schema:\n oneOf:\n - properties:\n mail:\n title: Mail\n type: string\n x-display: textarea\n schemaKey:\n const: 'yes'\n type: string\n required:\n - mail\n title: 'Yes'\n - properties:\n schemaKey:\n const: 'no'\n type: string\n title: 'No'\n title: Mail available\n type: object\n next:\n block-sender: \"schemaKey == 'yes'\"\n extract-iocs: \"schemaKey == 'yes'\"\n search-email-gateway: \"schemaKey == 'no'\"\n\n search-email-gateway:\n name: Search email gateway\n description: Please search email-gateway for the phishing mail.\n type: task\n next:\n extract-iocs:\n\n block-sender:\n name: Block sender\n type: task\n next:\n extract-iocs:\n\n extract-iocs:\n name: Extract IOCs\n description: Please insert the IOCs\n type: input\n schema:\n properties:\n iocs:\n items:\n type: string\n title: IOCs\n type: array\n title: Extract IOCs\n type: object\n next:\n block-iocs:\n\n block-iocs:\n name: Block IOCs\n type: task\n" + }, + { + "id": "simple", + "name": "Simple", + "yaml": "name: Simple\ntasks:\n input:\n name: Enter something to hash\n type: input\n schema:\n title: Something\n type: object\n properties:\n something:\n type: string\n title: Something\n default: \"\"\n next:\n hash: \"something != ''\"\n\n hash:\n name: Hash the something\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['something']\"\n next:\n comment: \"hash != ''\"\n\n comment:\n name: Comment the hash\n type: automation\n automation: comment\n payload:\n default: \"playbook.tasks['hash'].data['hash']\"\n next:\n done: \"done\"\n\n done:\n name: You can close this case now\n type: task\n" + } + ] + } + } + } + }, + "post": { + "security": [ + { + "roles": [ + "playbook:write" + ] + } + ], + "tags": [ + "playbooks" + ], + "summary": "Create a playbook", + "operationId": "createPlaybook", + "parameters": [ + { + "x-example": { + "yaml": "name: Simple2\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n" + }, + "description": "New playbook", + "name": "playbook", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PlaybookTemplateForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PlaybookTemplateResponse" + } + }, + "examples": { + "test": { + "id": "simple-2", + "name": "Simple2", + "yaml": "name: Simple2\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n" + } + } + } + } + } + }, + "/playbooks/{id}": { + "get": { + "security": [ + { + "roles": [ + "playbook:read" + ] + } + ], + "tags": [ + "playbooks" + ], + "summary": "Get a single playbook", + "operationId": "getPlaybook", + "parameters": [ + { + "type": "string", + "x-example": "simple", + "description": "Playbook name", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/PlaybookTemplateResponse" + }, + "examples": { + "test": { + "id": "simple", + "name": "Simple", + "yaml": "name: Simple\ntasks:\n input:\n name: Enter something to hash\n type: input\n schema:\n title: Something\n type: object\n properties:\n something:\n type: string\n title: Something\n default: \"\"\n next:\n hash: \"something != ''\"\n\n hash:\n name: Hash the something\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['something']\"\n next:\n comment: \"hash != ''\"\n\n comment:\n name: Comment the hash\n type: automation\n automation: comment\n payload:\n default: \"playbook.tasks['hash'].data['hash']\"\n next:\n done: \"done\"\n\n done:\n name: You can close this case now\n type: task\n" + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "playbook:write" + ] + } + ], + "tags": [ + "playbooks" + ], + "summary": "Update an existing ticket playbook", + "operationId": "updatePlaybook", + "parameters": [ + { + "type": "string", + "x-example": "simple", + "description": "Playbook ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "yaml": "name: Simple\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n" + }, + "description": "Updated playbook", + "name": "playbook", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PlaybookTemplateForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/PlaybookTemplateResponse" + }, + "examples": { + "test": { + "id": "simple", + "name": "Simple", + "yaml": "name: Simple\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n" + } + } + } + } + }, + "delete": { + "security": [ + { + "roles": [ + "playbook:write" + ] + } + ], + "tags": [ + "playbooks" + ], + "summary": "Delete a playbook", + "operationId": "deletePlaybook", + "parameters": [ + { + "type": "string", + "x-example": "simple", + "description": "Playbook name", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + }, + "/settings": { + "get": { + "security": [ + { + "roles": [ + "settings:read" + ] + } + ], + "tags": [ + "settings" + ], + "summary": "Get settings", + "operationId": "getSettings", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Settings" + }, + "examples": { + "test": { + "artifactStates": [ + { + "color": "info", + "icon": "mdi-help-circle-outline", + "id": "unknown", + "name": "Unknown" + }, + { + "color": "error", + "icon": "mdi-skull", + "id": "malicious", + "name": "Malicious" + }, + { + "color": "success", + "icon": "mdi-check", + "id": "clean", + "name": "Clean" + } + ], + "roles": [ + "admin:backup:read", + "admin:backup:restore", + "admin:group:write", + "admin:job:read", + "admin:job:write", + "admin:log:read", + "admin:ticket:delete", + "admin:user:write", + "admin:userdata:read", + "admin:userdata:write", + "analyst:automation:read", + "analyst:currentsettings:write", + "analyst:currentuser:read", + "analyst:currentuserdata:read", + "analyst:file", + "analyst:group:read", + "analyst:playbook:read", + "analyst:rule:read", + "analyst:settings:read", + "analyst:template:read", + "analyst:ticket:read", + "analyst:ticket:write", + "analyst:tickettype:read", + "analyst:user:read", + "engineer:automation:write", + "engineer:playbook:write", + "engineer:rule:write", + "engineer:template:write", + "engineer:tickettype:write" + ], + "ticketTypes": [ + { + "default_playbooks": null, + "default_template": "default", + "icon": "mdi-alert", + "id": "alert", + "name": "Alerts" + }, + { + "default_playbooks": null, + "default_template": "default", + "icon": "mdi-radioactive", + "id": "incident", + "name": "Incidents" + }, + { + "default_playbooks": null, + "default_template": "default", + "icon": "mdi-fingerprint", + "id": "investigation", + "name": "Forensic Investigations" + }, + { + "default_playbooks": null, + "default_template": "default", + "icon": "mdi-target", + "id": "hunt", + "name": "Threat Hunting" + } + ], + "tier": "community", + "timeformat": "YYYY-MM-DDThh:mm:ss", + "version": "0.0.0-test" + } + } + } + } + } + }, + "/statistics": { + "get": { + "security": [ + { + "roles": [ + "ticket:read" + ] + } + ], + "tags": [ + "statistics" + ], + "summary": "Get statistics", + "operationId": "getStatistics", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Statistics" + }, + "examples": { + "test": { + "open_tickets_per_user": {}, + "tickets_per_type": { + "alert": 2, + "incident": 1 + }, + "tickets_per_week": { + "2021-39": 3 + }, + "unassigned": 0 + } + } + } + } + } + }, + "/tasks": { + "get": { + "security": [ + { + "roles": [ + "ticket:read" + ] + } + ], + "tags": [ + "tasks" + ], + "summary": "List tasks", + "operationId": "listTasks", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TaskResponse" + } + }, + "examples": { + "test": null + } + } + } + } + }, + "/templates": { + "get": { + "security": [ + { + "roles": [ + "template:read" + ] + } + ], + "tags": [ + "templates" + ], + "summary": "List templates", + "operationId": "listTemplates", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TicketTemplateResponse" + } + }, + "examples": { + "test": [ + { + "id": "default", + "name": "Default", + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Default\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + } + ] + } + } + } + }, + "post": { + "security": [ + { + "roles": [ + "template:write" + ] + } + ], + "tags": [ + "templates" + ], + "summary": "Create a new template", + "operationId": "createTemplate", + "parameters": [ + { + "x-example": { + "name": "My Template", + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + }, + "description": "New template", + "name": "template", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/TicketTemplateForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketTemplateResponse" + }, + "examples": { + "test": { + "id": "my-template", + "name": "My Template", + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + } + } + } + } + } + }, + "/templates/{id}": { + "get": { + "security": [ + { + "roles": [ + "template:read" + ] + } + ], + "tags": [ + "templates" + ], + "summary": "Get a single template", + "operationId": "getTemplate", + "parameters": [ + { + "type": "string", + "x-example": "default", + "description": "Template ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketTemplateResponse" + }, + "examples": { + "test": { + "id": "default", + "name": "Default", + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Default\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "template:write" + ] + } + ], + "tags": [ + "templates" + ], + "summary": "Update an existing template", + "operationId": "updateTemplate", + "parameters": [ + { + "type": "string", + "x-example": "default", + "description": "Template ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "name": "My Template", + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + }, + "description": "Template object that needs to be added", + "name": "template", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/TicketTemplateForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketTemplateResponse" + }, + "examples": { + "test": { + "id": "default", + "name": "My Template", + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + } + } + } + } + }, + "delete": { + "security": [ + { + "roles": [ + "template:write" + ] + } + ], + "tags": [ + "templates" + ], + "summary": "Delete a template", + "operationId": "deleteTemplate", + "parameters": [ + { + "type": "string", + "x-example": "default", + "description": "Template ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + }, + "/tickets": { + "get": { + "security": [ + { + "roles": [ + "ticket:read" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "List tickets", + "operationId": "listTickets", + "parameters": [ + { + "type": "string", + "description": "Ticket Type", + "name": "type", + "in": "query" + }, + { + "type": "integer", + "default": 0, + "description": "Offset of the list", + "name": "offset", + "in": "query" + }, + { + "maximum": 100, + "type": "integer", + "default": 25, + "description": "Number of tickets", + "name": "count", + "in": "query" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "description": "Sort columns", + "name": "sort", + "in": "query" + }, + { + "type": "array", + "items": { + "type": "boolean" + }, + "description": "Sort descending", + "name": "desc", + "in": "query" + }, + { + "type": "string", + "description": "Search query", + "name": "query", + "in": "query" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketList" + }, + "examples": { + "test": { + "count": 3, + "tickets": [ + { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + }, + { + "name": "leadreintermediate.io", + "status": "malicious" + } + ], + "created": "2021-10-02T18:04:59.078206+02:00", + "id": 8123, + "modified": "2021-10-02T18:04:59.078206+02:00", + "name": "live zebra", + "owner": "demo", + "playbooks": { + "phishing": { + "name": "Phishing", + "tasks": { + "block-iocs": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block IOCs", + "type": "task" + }, + "block-sender": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block sender", + "next": { + "extract-iocs": "" + }, + "type": "task" + }, + "board": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "escalate": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to CISO", + "type": "task" + }, + "extract-iocs": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Extract IOCs", + "next": { + "block-iocs": "" + }, + "schema": { + "properties": { + "iocs": { + "items": { + "type": "string" + }, + "title": "IOCs", + "type": "array" + } + }, + "title": "Extract IOCs", + "type": "object" + }, + "type": "input" + }, + "mail-available": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Mail available", + "next": { + "block-sender": "schemaKey == 'yes'", + "extract-iocs": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'" + }, + "schema": { + "oneOf": [ + { + "properties": { + "mail": { + "title": "Mail", + "type": "string", + "x-display": "textarea" + }, + "schemaKey": { + "const": "yes", + "type": "string" + } + }, + "required": [ + "mail" + ], + "title": "Yes" + }, + { + "properties": { + "schemaKey": { + "const": "no", + "type": "string" + } + }, + "title": "No" + } + ], + "title": "Mail available", + "type": "object" + }, + "type": "input" + }, + "search-email-gateway": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Search email gateway", + "next": { + "extract-iocs": "" + }, + "type": "task" + } + } + } + }, + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + }, + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8125, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "phishing from selenafadel@von.com detected", + "owner": "demo", + "references": [ + { + "href": "https://www.seniorleading-edge.name/users/efficient", + "name": "recovery" + }, + { + "href": "http://www.dynamicseamless.com/clicks-and-mortar", + "name": "force" + }, + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + }, + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + ] + } + } + } + } + }, + "post": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Create a new ticket", + "operationId": "createTicket", + "parameters": [ + { + "x-example": { + "id": 123, + "name": "Wannacry infection", + "owner": "bob", + "status": "open", + "type": "incident" + }, + "description": "New ticket", + "name": "ticket", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/TicketForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "created": "1985-04-12T23:20:50.52Z", + "id": 123, + "modified": "1985-04-12T23:20:50.52Z", + "name": "Wannacry infection", + "owner": "bob", + "schema": "{}", + "status": "open", + "type": "incident" + } + } + } + } + } + }, + "/tickets/batch": { + "post": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Create a new tickets in batch", + "operationId": "createTicketBatch", + "parameters": [ + { + "x-example": [ + { + "id": 123, + "name": "Wannacry infection", + "owner": "bob", + "status": "open", + "type": "incident" + } + ], + "description": "New ticket", + "name": "ticket", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TicketForm" + } + } + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + }, + "/tickets/{id}": { + "get": { + "security": [ + { + "roles": [ + "ticket:read" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Get a single ticket", + "operationId": "getTicket", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8125, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8125, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "phishing from selenafadel@von.com detected", + "owner": "demo", + "references": [ + { + "href": "https://www.seniorleading-edge.name/users/efficient", + "name": "recovery" + }, + { + "href": "http://www.dynamicseamless.com/clicks-and-mortar", + "name": "force" + }, + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "tickets": [ + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + ], + "type": "alert" + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Update an existing ticket", + "operationId": "updateTicket", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8125, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "created": "2021-10-02T18:04:59.078186+02:00", + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "phishing from selenafadel@von.org detected", + "owner": "demo", + "references": [ + { + "href": "https://www.seniorleading-edge.name/users/efficient", + "name": "recovery" + }, + { + "href": "http://www.dynamicseamless.com/clicks-and-mortar", + "name": "force" + }, + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + }, + "description": "Updated ticket", + "name": "ticket", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Ticket" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8125, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "phishing from selenafadel@von.org detected", + "owner": "demo", + "references": [ + { + "href": "https://www.seniorleading-edge.name/users/efficient", + "name": "recovery" + }, + { + "href": "http://www.dynamicseamless.com/clicks-and-mortar", + "name": "force" + }, + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "tickets": [ + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + ], + "type": "alert" + } + } + } + } + }, + "delete": { + "security": [ + { + "roles": [ + "ticket:delete" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Delete an ticket", + "operationId": "deleteTicket", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8125, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + }, + "/tickets/{id}/artifacts": { + "post": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Add a single artifact", + "operationId": "addArtifact", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "name": "2.2.2.2" + }, + "description": "Artifact object that needs to be added", + "name": "artifact", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Artifact" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + }, + { + "name": "leadreintermediate.io", + "status": "malicious" + }, + { + "name": "2.2.2.2", + "status": "unknown", + "type": "ip" + } + ], + "created": "2021-10-02T18:04:59.078206+02:00", + "id": 8123, + "modified": "2021-10-02T18:04:59.078206+02:00", + "name": "live zebra", + "owner": "demo", + "playbooks": { + "phishing": { + "name": "Phishing", + "tasks": { + "block-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block IOCs", + "order": 6, + "type": "task" + }, + "block-sender": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block sender", + "next": { + "extract-iocs": "" + }, + "order": 3, + "type": "task" + }, + "board": { + "active": true, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "order": 0, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "escalate": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to CISO", + "order": 1, + "type": "task" + }, + "extract-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Extract IOCs", + "next": { + "block-iocs": "" + }, + "order": 5, + "schema": { + "properties": { + "iocs": { + "items": { + "type": "string" + }, + "title": "IOCs", + "type": "array" + } + }, + "title": "Extract IOCs", + "type": "object" + }, + "type": "input" + }, + "mail-available": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Mail available", + "next": { + "block-sender": "schemaKey == 'yes'", + "extract-iocs": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'" + }, + "order": 2, + "schema": { + "oneOf": [ + { + "properties": { + "mail": { + "title": "Mail", + "type": "string", + "x-display": "textarea" + }, + "schemaKey": { + "const": "yes", + "type": "string" + } + }, + "required": [ + "mail" + ], + "title": "Yes" + }, + { + "properties": { + "schemaKey": { + "const": "no", + "type": "string" + } + }, + "title": "No" + } + ], + "title": "Mail available", + "type": "object" + }, + "type": "input" + }, + "search-email-gateway": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Search email gateway", + "next": { + "extract-iocs": "" + }, + "order": 4, + "type": "task" + } + } + } + }, + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + } + } + } + } + } + }, + "/tickets/{id}/artifacts/{name}": { + "get": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Get a single artifact", + "operationId": "getArtifact", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "leadreintermediate.io", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Artifact" + }, + "examples": { + "test": { + "name": "leadreintermediate.io", + "status": "malicious" + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Set a single artifact", + "operationId": "setArtifact", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "leadreintermediate.io", + "name": "name", + "in": "path", + "required": true + }, + { + "x-example": { + "name": "leadreintermediate.io", + "status": "clean" + }, + "name": "artifact", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Artifact" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + }, + { + "name": "leadreintermediate.io", + "status": "clean" + } + ], + "created": "2021-10-02T18:04:59.078206+02:00", + "id": 8123, + "modified": "2021-10-02T18:04:59.078206+02:00", + "name": "live zebra", + "owner": "demo", + "playbooks": { + "phishing": { + "name": "Phishing", + "tasks": { + "block-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block IOCs", + "order": 6, + "type": "task" + }, + "block-sender": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block sender", + "next": { + "extract-iocs": "" + }, + "order": 3, + "type": "task" + }, + "board": { + "active": true, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "order": 0, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "escalate": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to CISO", + "order": 1, + "type": "task" + }, + "extract-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Extract IOCs", + "next": { + "block-iocs": "" + }, + "order": 5, + "schema": { + "properties": { + "iocs": { + "items": { + "type": "string" + }, + "title": "IOCs", + "type": "array" + } + }, + "title": "Extract IOCs", + "type": "object" + }, + "type": "input" + }, + "mail-available": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Mail available", + "next": { + "block-sender": "schemaKey == 'yes'", + "extract-iocs": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'" + }, + "order": 2, + "schema": { + "oneOf": [ + { + "properties": { + "mail": { + "title": "Mail", + "type": "string", + "x-display": "textarea" + }, + "schemaKey": { + "const": "yes", + "type": "string" + } + }, + "required": [ + "mail" + ], + "title": "Yes" + }, + { + "properties": { + "schemaKey": { + "const": "no", + "type": "string" + } + }, + "title": "No" + } + ], + "title": "Mail available", + "type": "object" + }, + "type": "input" + }, + "search-email-gateway": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Search email gateway", + "next": { + "extract-iocs": "" + }, + "order": 4, + "type": "task" + } + } + } + }, + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + } + } + } + } + }, + "delete": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Remove an artifact", + "operationId": "removeArtifact", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "leadreintermediate.io", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + } + ], + "created": "2021-10-02T18:04:59.078206+02:00", + "id": 8123, + "modified": "2021-10-02T18:04:59.078206+02:00", + "name": "live zebra", + "owner": "demo", + "playbooks": { + "phishing": { + "name": "Phishing", + "tasks": { + "block-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block IOCs", + "order": 6, + "type": "task" + }, + "block-sender": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block sender", + "next": { + "extract-iocs": "" + }, + "order": 3, + "type": "task" + }, + "board": { + "active": true, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "order": 0, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "escalate": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to CISO", + "order": 1, + "type": "task" + }, + "extract-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Extract IOCs", + "next": { + "block-iocs": "" + }, + "order": 5, + "schema": { + "properties": { + "iocs": { + "items": { + "type": "string" + }, + "title": "IOCs", + "type": "array" + } + }, + "title": "Extract IOCs", + "type": "object" + }, + "type": "input" + }, + "mail-available": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Mail available", + "next": { + "block-sender": "schemaKey == 'yes'", + "extract-iocs": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'" + }, + "order": 2, + "schema": { + "oneOf": [ + { + "properties": { + "mail": { + "title": "Mail", + "type": "string", + "x-display": "textarea" + }, + "schemaKey": { + "const": "yes", + "type": "string" + } + }, + "required": [ + "mail" + ], + "title": "Yes" + }, + { + "properties": { + "schemaKey": { + "const": "no", + "type": "string" + } + }, + "title": "No" + } + ], + "title": "Mail available", + "type": "object" + }, + "type": "input" + }, + "search-email-gateway": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Search email gateway", + "next": { + "extract-iocs": "" + }, + "order": 4, + "type": "task" + } + } + } + }, + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + } + } + } + } + } + }, + "/tickets/{id}/artifacts/{name}/enrich": { + "post": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Enrich a single artifact", + "operationId": "enrichArtifact", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "leadreintermediate.io", + "name": "name", + "in": "path", + "required": true + }, + { + "x-example": { + "data": { + "hash": "b7a067a742c20d07a7456646de89bc2d408a1153" + }, + "name": "hash.sha1" + }, + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EnrichmentForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Artifact" + }, + "examples": { + "test": { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + }, + { + "enrichments": { + "hash.sha1": { + "created": "2021-10-03T18:44:06.488923+02:00", + "data": { + "hash": "b7a067a742c20d07a7456646de89bc2d408a1153" + }, + "name": "hash.sha1" + } + }, + "name": "leadreintermediate.io", + "status": "malicious" + } + ], + "created": "2021-10-02T18:04:59.078206+02:00", + "id": 8123, + "modified": "2021-10-02T18:04:59.078206+02:00", + "name": "live zebra", + "owner": "demo", + "playbooks": { + "phishing": { + "name": "Phishing", + "tasks": { + "block-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block IOCs", + "order": 6, + "type": "task" + }, + "block-sender": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block sender", + "next": { + "extract-iocs": "" + }, + "order": 3, + "type": "task" + }, + "board": { + "active": true, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "order": 0, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "escalate": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to CISO", + "order": 1, + "type": "task" + }, + "extract-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Extract IOCs", + "next": { + "block-iocs": "" + }, + "order": 5, + "schema": { + "properties": { + "iocs": { + "items": { + "type": "string" + }, + "title": "IOCs", + "type": "array" + } + }, + "title": "Extract IOCs", + "type": "object" + }, + "type": "input" + }, + "mail-available": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Mail available", + "next": { + "block-sender": "schemaKey == 'yes'", + "extract-iocs": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'" + }, + "order": 2, + "schema": { + "oneOf": [ + { + "properties": { + "mail": { + "title": "Mail", + "type": "string", + "x-display": "textarea" + }, + "schemaKey": { + "const": "yes", + "type": "string" + } + }, + "required": [ + "mail" + ], + "title": "Yes" + }, + { + "properties": { + "schemaKey": { + "const": "no", + "type": "string" + } + }, + "title": "No" + } + ], + "title": "Mail available", + "type": "object" + }, + "type": "input" + }, + "search-email-gateway": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Search email gateway", + "next": { + "extract-iocs": "" + }, + "order": 4, + "type": "task" + } + } + } + }, + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + } + } + } + } + } + }, + "/tickets/{id}/artifacts/{name}/run/{automation}": { + "post": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Run automation on a single artifact", + "operationId": "runArtifact", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "leadreintermediate.io", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "hash.sha1", + "name": "automation", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + }, + "/tickets/{id}/comments": { + "post": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Add ticket comment", + "operationId": "addComment", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8125, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "message": "My first comment" + }, + "description": "Ticket comment", + "name": "comment", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CommentForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "comments": [ + { + "created": "2021-10-02T18:04:59.078186+02:00", + "creator": "bob", + "message": "My first comment" + } + ], + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8125, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "phishing from selenafadel@von.com detected", + "owner": "demo", + "references": [ + { + "href": "https://www.seniorleading-edge.name/users/efficient", + "name": "recovery" + }, + { + "href": "http://www.dynamicseamless.com/clicks-and-mortar", + "name": "force" + }, + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "tickets": [ + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + ], + "type": "alert" + } + } + } + } + } + }, + "/tickets/{id}/comments/{commentID}": { + "delete": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "description": "Comment will be removed from the ticket.", + "tags": [ + "tickets" + ], + "summary": "Remove an comment from an ticket", + "operationId": "removeComment", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "integer", + "x-example": 0, + "description": "Comment ID to remove", + "name": "commentID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + }, + { + "name": "leadreintermediate.io", + "status": "malicious" + } + ], + "created": "2021-10-02T18:04:59.078206+02:00", + "id": 8123, + "modified": "2021-10-02T18:04:59.078206+02:00", + "name": "live zebra", + "owner": "demo", + "playbooks": { + "phishing": { + "name": "Phishing", + "tasks": { + "block-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block IOCs", + "order": 6, + "type": "task" + }, + "block-sender": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block sender", + "next": { + "extract-iocs": "" + }, + "order": 3, + "type": "task" + }, + "board": { + "active": true, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "order": 0, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "escalate": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to CISO", + "order": 1, + "type": "task" + }, + "extract-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Extract IOCs", + "next": { + "block-iocs": "" + }, + "order": 5, + "schema": { + "properties": { + "iocs": { + "items": { + "type": "string" + }, + "title": "IOCs", + "type": "array" + } + }, + "title": "Extract IOCs", + "type": "object" + }, + "type": "input" + }, + "mail-available": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Mail available", + "next": { + "block-sender": "schemaKey == 'yes'", + "extract-iocs": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'" + }, + "order": 2, + "schema": { + "oneOf": [ + { + "properties": { + "mail": { + "title": "Mail", + "type": "string", + "x-display": "textarea" + }, + "schemaKey": { + "const": "yes", + "type": "string" + } + }, + "required": [ + "mail" + ], + "title": "Yes" + }, + { + "properties": { + "schemaKey": { + "const": "no", + "type": "string" + } + }, + "title": "No" + } + ], + "title": "Mail available", + "type": "object" + }, + "type": "input" + }, + "search-email-gateway": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Search email gateway", + "next": { + "extract-iocs": "" + }, + "order": 4, + "type": "task" + } + } + } + }, + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + } + } + } + } + } + }, + "/tickets/{id}/files": { + "put": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "description": "Link files to an ticket. The files themself will be stored in object storage.", + "tags": [ + "tickets" + ], + "summary": "Link files to an ticket", + "operationId": "linkFiles", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8125, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": [ + { + "key": "myfile", + "name": "document.doc" + } + ], + "description": "Added files", + "name": "files", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/File" + } + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "created": "2021-10-02T18:04:59.078186+02:00", + "files": [ + { + "key": "myfile", + "name": "document.doc" + } + ], + "id": 8125, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "phishing from selenafadel@von.com detected", + "owner": "demo", + "references": [ + { + "href": "https://www.seniorleading-edge.name/users/efficient", + "name": "recovery" + }, + { + "href": "http://www.dynamicseamless.com/clicks-and-mortar", + "name": "force" + }, + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "tickets": [ + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + ], + "type": "alert" + } + } + } + } + } + }, + "/tickets/{id}/playbooks": { + "post": { + "tags": [ + "tickets" + ], + "summary": "Add a new ticket playbook", + "operationId": "addTicketPlaybook", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8125, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "yaml": "name: Simple\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n" + }, + "description": "Ticket playbook object that needs to be added", + "name": "playbook", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PlaybookTemplateForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "created": "1985-04-12T23:20:50.52Z", + "id": 8125, + "modified": "1985-04-12T23:20:50.52Z", + "name": "phishing from selenafadel@von.com detected", + "owner": "demo", + "playbooks": { + "simple": { + "name": "Simple", + "tasks": { + "escalate": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to malware team", + "order": 2, + "type": "task" + }, + "hash": { + "active": false, + "automation": "hash.sha1", + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Hash the malware", + "next": { + "escalate": "" + }, + "order": 1, + "payload": { + "default": "playbook.tasks['input'].data['malware']" + }, + "type": "automation" + }, + "input": { + "active": true, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Upload malware if possible", + "next": { + "hash": "malware != ''" + }, + "order": 0, + "schema": { + "properties": { + "malware": { + "default": "", + "title": "Select malware", + "type": "string" + } + }, + "title": "Malware", + "type": "object" + }, + "type": "input" + } + } + } + }, + "references": [ + { + "href": "https://www.seniorleading-edge.name/users/efficient", + "name": "recovery" + }, + { + "href": "http://www.dynamicseamless.com/clicks-and-mortar", + "name": "force" + }, + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "tickets": [ + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + ], + "type": "alert" + } + } + } + } + } + }, + "/tickets/{id}/playbooks/{playbookID}": { + "delete": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Remove an ticket playbook", + "operationId": "removeTicketPlaybook", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "phishing", + "description": "Playbook ID", + "name": "playbookID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + }, + { + "name": "leadreintermediate.io", + "status": "malicious" + } + ], + "created": "1985-04-12T23:20:50.52Z", + "id": 8123, + "modified": "1985-04-12T23:20:50.52Z", + "name": "live zebra", + "owner": "demo", + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + } + } + } + } + } + }, + "/tickets/{id}/playbooks/{playbookID}/task/{taskID}": { + "put": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Set a ticket playbook task", + "operationId": "setTask", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "phishing", + "description": "Playbook ID", + "name": "playbookID", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "board", + "description": "Task ID", + "name": "taskID", + "in": "path", + "required": true + }, + { + "x-example": { + "active": true, + "data": { + "boardInvolved": true + }, + "done": false, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "order": 0, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "description": "Task", + "name": "task", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Task" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + }, + { + "name": "leadreintermediate.io", + "status": "malicious" + } + ], + "created": "2021-10-02T18:04:59.078206+02:00", + "id": 8123, + "modified": "2021-10-02T18:04:59.078206+02:00", + "name": "live zebra", + "owner": "demo", + "playbooks": { + "phishing": { + "name": "Phishing", + "tasks": { + "block-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block IOCs", + "order": 6, + "type": "task" + }, + "block-sender": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block sender", + "next": { + "extract-iocs": "" + }, + "order": 3, + "type": "task" + }, + "board": { + "active": true, + "created": "2021-10-02T18:04:59.078186+02:00", + "data": { + "boardInvolved": true + }, + "done": false, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "order": 0, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "escalate": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to CISO", + "order": 1, + "type": "task" + }, + "extract-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Extract IOCs", + "next": { + "block-iocs": "" + }, + "order": 5, + "schema": { + "properties": { + "iocs": { + "items": { + "type": "string" + }, + "title": "IOCs", + "type": "array" + } + }, + "title": "Extract IOCs", + "type": "object" + }, + "type": "input" + }, + "mail-available": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Mail available", + "next": { + "block-sender": "schemaKey == 'yes'", + "extract-iocs": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'" + }, + "order": 2, + "schema": { + "oneOf": [ + { + "properties": { + "mail": { + "title": "Mail", + "type": "string", + "x-display": "textarea" + }, + "schemaKey": { + "const": "yes", + "type": "string" + } + }, + "required": [ + "mail" + ], + "title": "Yes" + }, + { + "properties": { + "schemaKey": { + "const": "no", + "type": "string" + } + }, + "title": "No" + } + ], + "title": "Mail available", + "type": "object" + }, + "type": "input" + }, + "search-email-gateway": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Search email gateway", + "next": { + "extract-iocs": "" + }, + "order": 4, + "type": "task" + } + } + } + }, + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + } + } + } + } + } + }, + "/tickets/{id}/playbooks/{playbookID}/task/{taskID}/complete": { + "put": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Complete ticket playbook task", + "operationId": "completeTask", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "phishing", + "description": "Playbook ID", + "name": "playbookID", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "board", + "description": "Task ID", + "name": "taskID", + "in": "path", + "required": true + }, + { + "x-example": { + "boardInvolved": true + }, + "description": "Ticket playbook object that needs to be added", + "name": "data", + "in": "body", + "required": true, + "schema": { + "type": "object" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + }, + { + "name": "leadreintermediate.io", + "status": "malicious" + } + ], + "created": "2021-10-02T18:04:59.078206+02:00", + "id": 8123, + "modified": "2021-10-02T18:04:59.078206+02:00", + "name": "live zebra", + "owner": "demo", + "playbooks": { + "phishing": { + "name": "Phishing", + "tasks": { + "block-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block IOCs", + "order": 6, + "type": "task" + }, + "block-sender": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block sender", + "next": { + "extract-iocs": "" + }, + "order": 3, + "type": "task" + }, + "board": { + "active": false, + "closed": "2021-10-02T18:04:59.078186+02:00", + "created": "2021-10-02T18:04:59.078186+02:00", + "data": { + "boardInvolved": true + }, + "done": true, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "order": 0, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "escalate": { + "active": true, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to CISO", + "order": 1, + "type": "task" + }, + "extract-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Extract IOCs", + "next": { + "block-iocs": "" + }, + "order": 5, + "schema": { + "properties": { + "iocs": { + "items": { + "type": "string" + }, + "title": "IOCs", + "type": "array" + } + }, + "title": "Extract IOCs", + "type": "object" + }, + "type": "input" + }, + "mail-available": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Mail available", + "next": { + "block-sender": "schemaKey == 'yes'", + "extract-iocs": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'" + }, + "order": 2, + "schema": { + "oneOf": [ + { + "properties": { + "mail": { + "title": "Mail", + "type": "string", + "x-display": "textarea" + }, + "schemaKey": { + "const": "yes", + "type": "string" + } + }, + "required": [ + "mail" + ], + "title": "Yes" + }, + { + "properties": { + "schemaKey": { + "const": "no", + "type": "string" + } + }, + "title": "No" + } + ], + "title": "Mail available", + "type": "object" + }, + "type": "input" + }, + "search-email-gateway": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Search email gateway", + "next": { + "extract-iocs": "" + }, + "order": 4, + "type": "task" + } + } + } + }, + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + } + } + } + } + } + }, + "/tickets/{id}/playbooks/{playbookID}/task/{taskID}/run": { + "post": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Run ticket playbook task", + "operationId": "runTask", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "phishing", + "description": "Playbook ID", + "name": "playbookID", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "board", + "description": "Task ID", + "name": "taskID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + }, + "/tickets/{id}/references": { + "put": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Set ticket references", + "operationId": "setReferences", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8125, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": [ + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "description": "All ticket references", + "name": "references", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8125, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "phishing from selenafadel@von.com detected", + "owner": "demo", + "references": [ + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "tickets": [ + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + ], + "type": "alert" + } + } + } + } + } + }, + "/tickets/{id}/schema": { + "put": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Set ticket schema", + "operationId": "setSchema", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8125, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": "{}", + "description": "New ticket schema", + "name": "schema", + "in": "body", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8125, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "phishing from selenafadel@von.com detected", + "owner": "demo", + "references": [ + { + "href": "https://www.seniorleading-edge.name/users/efficient", + "name": "recovery" + }, + { + "href": "http://www.dynamicseamless.com/clicks-and-mortar", + "name": "force" + }, + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "tickets": [ + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + ], + "type": "alert" + } + } + } + } + } + }, + "/tickets/{id}/tickets": { + "delete": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Unlink an ticket to an ticket", + "operationId": "unlinkTicket", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8126, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": 8125, + "description": "Added ticket ID", + "name": "linkedID", + "in": "body", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + } + } + } + }, + "patch": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Link an ticket to an ticket", + "operationId": "linkTicket", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8126, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": 8123, + "description": "Added ticket ID", + "name": "linkedID", + "in": "body", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "tickets": [ + { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + }, + { + "name": "leadreintermediate.io", + "status": "malicious" + } + ], + "created": "2021-10-02T18:04:59.078206+02:00", + "id": 8123, + "modified": "2021-10-02T18:04:59.078206+02:00", + "name": "live zebra", + "owner": "demo", + "playbooks": { + "phishing": { + "name": "Phishing", + "tasks": { + "block-iocs": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block IOCs", + "type": "task" + }, + "block-sender": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block sender", + "next": { + "extract-iocs": "" + }, + "type": "task" + }, + "board": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "escalate": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to CISO", + "type": "task" + }, + "extract-iocs": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Extract IOCs", + "next": { + "block-iocs": "" + }, + "schema": { + "properties": { + "iocs": { + "items": { + "type": "string" + }, + "title": "IOCs", + "type": "array" + } + }, + "title": "Extract IOCs", + "type": "object" + }, + "type": "input" + }, + "mail-available": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Mail available", + "next": { + "block-sender": "schemaKey == 'yes'", + "extract-iocs": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'" + }, + "schema": { + "oneOf": [ + { + "properties": { + "mail": { + "title": "Mail", + "type": "string", + "x-display": "textarea" + }, + "schemaKey": { + "const": "yes", + "type": "string" + } + }, + "required": [ + "mail" + ], + "title": "Yes" + }, + { + "properties": { + "schemaKey": { + "const": "no", + "type": "string" + } + }, + "title": "No" + } + ], + "title": "Mail available", + "type": "object" + }, + "type": "input" + }, + "search-email-gateway": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Search email gateway", + "next": { + "extract-iocs": "" + }, + "type": "task" + } + } + } + }, + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + }, + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8125, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "phishing from selenafadel@von.com detected", + "owner": "demo", + "references": [ + { + "href": "https://www.seniorleading-edge.name/users/efficient", + "name": "recovery" + }, + { + "href": "http://www.dynamicseamless.com/clicks-and-mortar", + "name": "force" + }, + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + ], + "type": "alert" + } + } + } + } + } + }, + "/tickettypes": { + "get": { + "security": [ + { + "roles": [ + "tickettype:read" + ] + } + ], + "tags": [ + "tickettypes" + ], + "summary": "List tickettypes", + "operationId": "listTicketTypes", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TicketTypeResponse" + } + }, + "examples": { + "test": [ + { + "default_playbooks": null, + "default_template": "default", + "icon": "mdi-alert", + "id": "alert", + "name": "Alerts" + }, + { + "default_playbooks": null, + "default_template": "default", + "icon": "mdi-radioactive", + "id": "incident", + "name": "Incidents" + }, + { + "default_playbooks": null, + "default_template": "default", + "icon": "mdi-fingerprint", + "id": "investigation", + "name": "Forensic Investigations" + }, + { + "default_playbooks": null, + "default_template": "default", + "icon": "mdi-target", + "id": "hunt", + "name": "Threat Hunting" + } + ] + } + } + } + }, + "post": { + "security": [ + { + "roles": [ + "tickettype:write" + ] + } + ], + "tags": [ + "tickettypes" + ], + "summary": "Create a new tickettype", + "operationId": "createTicketType", + "parameters": [ + { + "x-example": { + "default_playbooks": null, + "default_template": "default", + "icon": "mdi-newspaper-variant-outline", + "name": "TI Tickets" + }, + "description": "New tickettype", + "name": "tickettype", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/TicketTypeForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketTypeResponse" + }, + "examples": { + "test": { + "default_playbooks": null, + "default_template": "default", + "icon": "mdi-newspaper-variant-outline", + "id": "ti-tickets", + "name": "TI Tickets" + } + } + } + } + } + }, + "/tickettypes/{id}": { + "get": { + "security": [ + { + "roles": [ + "tickettype:read" + ] + } + ], + "tags": [ + "tickettypes" + ], + "summary": "Get a single tickettype", + "operationId": "getTicketType", + "parameters": [ + { + "type": "string", + "x-example": "alert", + "description": "TicketType ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketTypeResponse" + }, + "examples": { + "test": { + "default_playbooks": null, + "default_template": "default", + "icon": "mdi-alert", + "id": "alert", + "name": "Alerts" + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "tickettype:write" + ] + } + ], + "tags": [ + "tickettypes" + ], + "summary": "Update an existing tickettype", + "operationId": "updateTicketType", + "parameters": [ + { + "type": "string", + "x-example": "alert", + "description": "TicketType ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "default_playbooks": null, + "default_template": "default", + "icon": "mdi-bell", + "id": "alert", + "name": "Alerts" + }, + "description": "TicketType object that needs to be added", + "name": "tickettype", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/TicketTypeForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketTypeResponse" + }, + "examples": { + "test": { + "default_playbooks": null, + "default_template": "default", + "icon": "mdi-bell", + "id": "alert", + "name": "Alerts" + } + } + } + } + }, + "delete": { + "security": [ + { + "roles": [ + "tickettype:write" + ] + } + ], + "tags": [ + "tickettypes" + ], + "summary": "Delete a tickettype", + "operationId": "deleteTicketType", + "parameters": [ + { + "type": "string", + "x-example": "alert", + "description": "TicketType ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + }, + "/userdata": { + "get": { + "security": [ + { + "roles": [ + "userdata:read" + ] + } + ], + "tags": [ + "userdata" + ], + "summary": "List userdata", + "operationId": "listUserData", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/UserDataResponse" + } + }, + "examples": { + "test": [ + { + "email": "bob@example.org", + "id": "bob", + "name": "Bob Bad" + } + ] + } + } + } + } + }, + "/userdata/{id}": { + "get": { + "security": [ + { + "roles": [ + "userdata:read" + ] + } + ], + "tags": [ + "userdata" + ], + "summary": "Get a single user data", + "operationId": "getUserData", + "parameters": [ + { + "type": "string", + "x-example": "bob", + "description": "User Data ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/UserDataResponse" + }, + "examples": { + "test": { + "email": "bob@example.org", + "id": "bob", + "name": "Bob Bad" + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "userdata:write" + ] + } + ], + "tags": [ + "userdata" + ], + "summary": "Update an existing user data", + "operationId": "updateUserData", + "parameters": [ + { + "type": "string", + "x-example": "bob", + "description": "User Data ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "blocked": false, + "email": "bob@example.org", + "name": "Bob Bad" + }, + "description": "User data object that needs to be added", + "name": "userdata", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UserData" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/UserDataResponse" + }, + "examples": { + "test": { + "email": "bob@example.org", + "id": "bob", + "name": "Bob Bad" + } + } + } + } + } + }, + "/users": { + "get": { + "security": [ + { + "roles": [ + "user:read" + ] + } + ], + "tags": [ + "users" + ], + "summary": "List users", + "operationId": "listUsers", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/UserResponse" + } + }, + "examples": { + "test": [ + { + "apikey": false, + "blocked": false, + "id": "bob", + "roles": [ + "admin:backup:read", + "admin:backup:restore", + "admin:group:write", + "admin:job:read", + "admin:job:write", + "admin:log:read", + "admin:ticket:delete", + "admin:user:write", + "admin:userdata:read", + "admin:userdata:write", + "analyst:automation:read", + "analyst:currentsettings:write", + "analyst:currentuser:read", + "analyst:currentuserdata:read", + "analyst:file", + "analyst:group:read", + "analyst:playbook:read", + "analyst:rule:read", + "analyst:settings:read", + "analyst:template:read", + "analyst:ticket:read", + "analyst:ticket:write", + "analyst:tickettype:read", + "analyst:user:read", + "engineer:automation:write", + "engineer:playbook:write", + "engineer:rule:write", + "engineer:template:write", + "engineer:tickettype:write" + ] + }, + { + "apikey": true, + "blocked": false, + "id": "script", + "roles": [ + "analyst:automation:read", + "analyst:currentsettings:write", + "analyst:currentuser:read", + "analyst:currentuserdata:read", + "analyst:file", + "analyst:group:read", + "analyst:playbook:read", + "analyst:rule:read", + "analyst:settings:read", + "analyst:template:read", + "analyst:ticket:read", + "analyst:ticket:write", + "analyst:tickettype:read", + "analyst:user:read", + "engineer:automation:write", + "engineer:playbook:write", + "engineer:rule:write", + "engineer:template:write", + "engineer:tickettype:write" + ] + } + ] + } + } + } + }, + "post": { + "security": [ + { + "roles": [ + "user:write" + ] + } + ], + "tags": [ + "users" + ], + "summary": "Create user", + "operationId": "createUser", + "parameters": [ + { + "x-example": { + "id": "syncscript", + "roles": [ + "analyst" + ] + }, + "description": "user object that needs to be added", + "name": "user", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UserForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/NewUserResponse" + }, + "examples": { + "test": { + "blocked": false, + "id": "syncscript", + "roles": [ + "analyst:automation:read", + "analyst:currentsettings:write", + "analyst:currentuser:read", + "analyst:currentuserdata:read", + "analyst:file", + "analyst:group:read", + "analyst:playbook:read", + "analyst:rule:read", + "analyst:settings:read", + "analyst:template:read", + "analyst:ticket:read", + "analyst:ticket:write", + "analyst:tickettype:read", + "analyst:user:read" + ], + "secret": "v39bOuobnlEljfWzjAgoKzhmnh1xSMxH" + } + } + } + } + } + }, + "/users/{id}": { + "get": { + "security": [ + { + "roles": [ + "user:read" + ] + } + ], + "tags": [ + "users" + ], + "summary": "Get a single user", + "operationId": "getUser", + "parameters": [ + { + "type": "string", + "x-example": "script", + "description": "user ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/UserResponse" + }, + "examples": { + "test": { + "apikey": true, + "blocked": false, + "id": "script", + "roles": [ + "analyst:automation:read", + "analyst:currentsettings:write", + "analyst:currentuser:read", + "analyst:currentuserdata:read", + "analyst:file", + "analyst:group:read", + "analyst:playbook:read", + "analyst:rule:read", + "analyst:settings:read", + "analyst:template:read", + "analyst:ticket:read", + "analyst:ticket:write", + "analyst:tickettype:read", + "analyst:user:read", + "engineer:automation:write", + "engineer:playbook:write", + "engineer:rule:write", + "engineer:template:write", + "engineer:tickettype:write" + ] + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "user:write" + ] + } + ], + "tags": [ + "users" + ], + "summary": "Update user", + "operationId": "updateUser", + "parameters": [ + { + "type": "string", + "x-example": "bob", + "description": "Template ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "roles": [ + "analyst", + "admin" + ] + }, + "description": "user object that needs to be added", + "name": "user", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UserForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/UserResponse" + }, + "examples": { + "test": { + "apikey": false, + "blocked": false, + "id": "bob", + "roles": [ + "admin:backup:read", + "admin:backup:restore", + "admin:group:write", + "admin:job:read", + "admin:job:write", + "admin:log:read", + "admin:ticket:delete", + "admin:user:write", + "admin:userdata:read", + "admin:userdata:write", + "analyst:automation:read", + "analyst:currentsettings:write", + "analyst:currentuser:read", + "analyst:currentuserdata:read", + "analyst:file", + "analyst:group:read", + "analyst:playbook:read", + "analyst:rule:read", + "analyst:settings:read", + "analyst:template:read", + "analyst:ticket:read", + "analyst:ticket:write", + "analyst:tickettype:read", + "analyst:user:read", + "engineer:automation:write", + "engineer:playbook:write", + "engineer:rule:write", + "engineer:template:write", + "engineer:tickettype:write" + ] + } + } + } + } + }, + "delete": { + "security": [ + { + "roles": [ + "user:write" + ] + } + ], + "tags": [ + "users" + ], + "summary": "Delete user", + "operationId": "deleteUser", + "parameters": [ + { + "type": "string", + "x-example": "script", + "description": "user ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + } + }, + "definitions": { + "Artifact": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "enrichments": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Enrichment" + } + }, + "name": { + "type": "string", + "example": "2.2.2.2" + }, + "status": { + "type": "string", + "example": "Unknown" + }, + "type": { + "type": "string" + } + } + }, + "ArtifactOrigin": { + "type": "object", + "required": [ + "ticket_id", + "artifact" + ], + "properties": { + "artifact": { + "type": "string" + }, + "ticket_id": { + "type": "integer", + "format": "int64" + } + } + }, + "Automation": { + "type": "object", + "required": [ + "image", + "script", + "type" + ], + "properties": { + "image": { + "type": "string" + }, + "schema": { + "type": "string", + "example": "{}" + }, + "script": { + "type": "string" + }, + "type": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "artifact", + "playbook", + "global" + ] + } + } + } + }, + "AutomationForm": { + "type": "object", + "required": [ + "id", + "image", + "script", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "image": { + "type": "string" + }, + "schema": { + "type": "string", + "example": "{}" + }, + "script": { + "type": "string" + }, + "type": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "artifact", + "playbook", + "global" + ] + } + } + } + }, + "AutomationResponse": { + "type": "object", + "required": [ + "id", + "image", + "script", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "image": { + "type": "string" + }, + "schema": { + "type": "string", + "example": "{}" + }, + "script": { + "type": "string" + }, + "type": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "artifact", + "playbook", + "global" + ] + } + } + } + }, + "Comment": { + "type": "object", + "required": [ + "creator", + "created", + "message" + ], + "properties": { + "created": { + "type": "string", + "format": "date-time" + }, + "creator": { + "type": "string" + }, + "message": { + "type": "string" + } + } + }, + "CommentForm": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "created": { + "type": "string", + "format": "date-time" + }, + "creator": { + "type": "string" + }, + "message": { + "type": "string" + } + } + }, + "Context": { + "type": "object", + "properties": { + "artifact": { + "$ref": "#/definitions/Artifact" + }, + "playbook": { + "$ref": "#/definitions/PlaybookResponse" + }, + "task": { + "$ref": "#/definitions/TaskResponse" + }, + "ticket": { + "$ref": "#/definitions/TicketResponse" + } + } + }, + "Enrichment": { + "type": "object", + "required": [ + "name", + "data", + "created" + ], + "properties": { + "created": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "data": { + "type": "object", + "example": { + "hash": "b7a067a742c20d07a7456646de89bc2d408a1153" + } + }, + "name": { + "type": "string", + "example": "hash.sha1" + } + } + }, + "EnrichmentForm": { + "type": "object", + "required": [ + "name", + "data" + ], + "properties": { + "data": { + "type": "object", + "example": { + "hash": "b7a067a742c20d07a7456646de89bc2d408a1153" + } + }, + "name": { + "type": "string", + "example": "hash.sha1" + } + } + }, + "File": { + "type": "object", + "required": [ + "key", + "name" + ], + "properties": { + "key": { + "type": "string", + "example": "myfile" + }, + "name": { + "type": "string", + "example": "notes.docx" + } + } + }, + "Job": { + "type": "object", + "required": [ + "automation", + "running", + "status" + ], + "properties": { + "automation": { + "type": "string" + }, + "container": { + "type": "string" + }, + "log": { + "type": "string" + }, + "origin": { + "$ref": "#/definitions/Origin" + }, + "output": { + "type": "object" + }, + "payload": {}, + "running": { + "type": "boolean" + }, + "status": { + "type": "string" + } + } + }, + "JobForm": { + "type": "object", + "required": [ + "automation" + ], + "properties": { + "automation": { + "type": "string" + }, + "origin": { + "$ref": "#/definitions/Origin" + }, + "payload": {} + } + }, + "JobResponse": { + "type": "object", + "required": [ + "id", + "automation", + "status" + ], + "properties": { + "automation": { + "type": "string" + }, + "container": { + "type": "string" + }, + "id": { + "type": "string" + }, + "log": { + "type": "string" + }, + "origin": { + "$ref": "#/definitions/Origin" + }, + "output": { + "type": "object" + }, + "payload": {}, + "status": { + "type": "string" + } + } + }, + "LogEntry": { + "type": "object", + "required": [ + "reference", + "creator", + "created", + "message" + ], + "properties": { + "created": { + "type": "string", + "format": "date-time" + }, + "creator": { + "type": "string" + }, + "message": { + "type": "string" + }, + "reference": { + "type": "string" + } + } + }, + "Message": { + "type": "object", + "properties": { + "context": { + "$ref": "#/definitions/Context" + }, + "payload": { + "type": "object" + }, + "secrets": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "NewUserResponse": { + "type": "object", + "required": [ + "id", + "blocked", + "roles" + ], + "properties": { + "blocked": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "type": "string" + } + }, + "secret": { + "type": "string" + } + } + }, + "Origin": { + "type": "object", + "properties": { + "artifact_origin": { + "$ref": "#/definitions/ArtifactOrigin" + }, + "task_origin": { + "$ref": "#/definitions/TaskOrigin" + } + } + }, + "Playbook": { + "type": "object", + "required": [ + "name", + "tasks" + ], + "properties": { + "name": { + "type": "string", + "example": "Phishing" + }, + "tasks": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Task" + } + } + } + }, + "PlaybookResponse": { + "type": "object", + "required": [ + "name", + "tasks" + ], + "properties": { + "name": { + "type": "string", + "example": "Phishing" + }, + "tasks": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/TaskResponse" + } + } + } + }, + "PlaybookTemplate": { + "type": "object", + "required": [ + "name", + "yaml" + ], + "properties": { + "name": { + "type": "string" + }, + "yaml": { + "type": "string" + } + } + }, + "PlaybookTemplateForm": { + "type": "object", + "required": [ + "yaml" + ], + "properties": { + "id": { + "type": "string" + }, + "yaml": { + "type": "string" + } + } + }, + "PlaybookTemplateResponse": { + "type": "object", + "required": [ + "id", + "name", + "yaml" + ], + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "yaml": { + "type": "string" + } + } + }, + "Reference": { + "type": "object", + "required": [ + "name", + "href" + ], + "properties": { + "href": { + "type": "string", + "example": "https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0144" + }, + "name": { + "type": "string", + "example": "CVE-2017-0144" + } + } + }, + "Settings": { + "type": "object", + "required": [ + "version", + "tier", + "timeformat", + "ticketTypes", + "artifactStates" + ], + "properties": { + "artifactStates": { + "type": "array", + "title": "Artifact States", + "items": { + "$ref": "#/definitions/Type" + } + }, + "roles": { + "type": "array", + "title": "Roles", + "items": { + "type": "string" + } + }, + "ticketTypes": { + "type": "array", + "title": "Ticket Types", + "items": { + "$ref": "#/definitions/TicketTypeResponse" + } + }, + "tier": { + "type": "string", + "title": "Tier", + "enum": [ + "community", + "enterprise" + ] + }, + "timeformat": { + "type": "string", + "title": "Time Format" + }, + "version": { + "type": "string", + "title": "Version" + } + } + }, + "Statistics": { + "type": "object", + "required": [ + "unassigned", + "open_tickets_per_user", + "tickets_per_week", + "tickets_per_type" + ], + "properties": { + "open_tickets_per_user": { + "type": "object", + "additionalProperties": { + "type": "integer" + } + }, + "tickets_per_type": { + "type": "object", + "additionalProperties": { + "type": "integer" + } + }, + "tickets_per_week": { + "type": "object", + "additionalProperties": { + "type": "integer" + } + }, + "unassigned": { + "type": "integer" + } + } + }, + "Task": { + "type": "object", + "required": [ + "name", + "type", + "done", + "created" + ], + "properties": { + "automation": { + "type": "string" + }, + "closed": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "created": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "data": { + "type": "object" + }, + "done": { + "type": "boolean" + }, + "join": { + "type": "boolean", + "example": false + }, + "name": { + "type": "string", + "example": "Inform user" + }, + "next": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "owner": { + "type": "string" + }, + "payload": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "schema": { + "type": "object" + }, + "type": { + "type": "string", + "enum": [ + "task", + "input", + "automation" + ], + "example": "task" + } + } + }, + "TaskForm": { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "automation": { + "type": "string" + }, + "closed": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "created": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "data": { + "type": "object" + }, + "done": { + "type": "boolean" + }, + "join": { + "type": "boolean", + "example": false + }, + "name": { + "type": "string", + "example": "Inform user" + }, + "next": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "owner": { + "type": "string" + }, + "payload": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "schema": { + "type": "object" + }, + "type": { + "type": "string", + "enum": [ + "task", + "input", + "automation" + ], + "example": "task" + } + } + }, + "TaskOrigin": { + "type": "object", + "required": [ + "ticket_id", + "playbook_id", + "task_id" + ], + "properties": { + "playbook_id": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "ticket_id": { + "type": "integer", + "format": "int64" + } + } + }, + "TaskResponse": { + "type": "object", + "required": [ + "name", + "type", + "done", + "created", + "order", + "active" + ], + "properties": { + "active": { + "type": "boolean", + "example": false + }, + "automation": { + "type": "string" + }, + "closed": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "created": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "data": { + "type": "object" + }, + "done": { + "type": "boolean" + }, + "join": { + "type": "boolean", + "example": false + }, + "name": { + "type": "string", + "example": "Inform user" + }, + "next": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "order": { + "type": "number", + "format": "int64", + "example": 2 + }, + "owner": { + "type": "string" + }, + "payload": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "schema": { + "type": "object" + }, + "type": { + "type": "string", + "enum": [ + "task", + "input", + "automation" + ], + "example": "task" + } + } + }, + "TaskWithContext": { + "type": "object", + "required": [ + "ticket_id", + "ticket_name", + "playbook_id", + "playbook_name", + "task_id", + "task" + ], + "properties": { + "playbook_id": { + "type": "string" + }, + "playbook_name": { + "type": "string" + }, + "task": { + "$ref": "#/definitions/TaskResponse" + }, + "task_id": { + "type": "string" + }, + "ticket_id": { + "type": "number", + "format": "int64" + }, + "ticket_name": { + "type": "string" + } + } + }, + "Ticket": { + "type": "object", + "required": [ + "name", + "type", + "status", + "created", + "modified", + "schema" + ], + "properties": { + "artifacts": { + "type": "array", + "items": { + "$ref": "#/definitions/Artifact" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/definitions/Comment" + } + }, + "created": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "details": { + "type": "object", + "example": { + "description": "my little incident" + } + }, + "files": { + "type": "array", + "items": { + "$ref": "#/definitions/File" + } + }, + "modified": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "name": { + "type": "string", + "example": "WannyCry" + }, + "owner": { + "type": "string", + "example": "bob" + }, + "playbooks": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Playbook" + } + }, + "read": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "bob" + ] + }, + "references": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + }, + "schema": { + "type": "string", + "example": "{}" + }, + "status": { + "type": "string", + "example": "open" + }, + "type": { + "type": "string", + "example": "incident" + }, + "write": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "alice" + ] + } + } + }, + "TicketForm": { + "type": "object", + "required": [ + "name", + "type", + "status" + ], + "properties": { + "artifacts": { + "type": "array", + "items": { + "$ref": "#/definitions/Artifact" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/definitions/Comment" + } + }, + "created": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "details": { + "type": "object", + "example": { + "description": "my little incident" + } + }, + "files": { + "type": "array", + "items": { + "$ref": "#/definitions/File" + } + }, + "id": { + "type": "integer", + "format": "int64", + "example": 123 + }, + "modified": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "name": { + "type": "string", + "example": "WannyCry" + }, + "owner": { + "type": "string", + "example": "bob" + }, + "playbooks": { + "type": "array", + "items": { + "$ref": "#/definitions/PlaybookTemplateForm" + } + }, + "read": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "bob" + ] + }, + "references": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + }, + "schema": { + "type": "string", + "example": "{}" + }, + "status": { + "type": "string", + "example": "open" + }, + "type": { + "type": "string", + "example": "incident" + }, + "write": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "alice" + ] + } + } + }, + "TicketList": { + "type": "object", + "required": [ + "tickets", + "count" + ], + "properties": { + "count": { + "type": "number", + "example": 3 + }, + "tickets": { + "type": "array", + "items": { + "$ref": "#/definitions/TicketSimpleResponse" + } + } + } + }, + "TicketResponse": { + "type": "object", + "required": [ + "id", + "name", + "type", + "status", + "created", + "modified", + "schema" + ], + "properties": { + "artifacts": { + "type": "array", + "items": { + "$ref": "#/definitions/Artifact" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/definitions/Comment" + } + }, + "created": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "details": { + "type": "object", + "example": { + "description": "my little incident" + } + }, + "files": { + "type": "array", + "items": { + "$ref": "#/definitions/File" + } + }, + "id": { + "type": "integer", + "format": "int64", + "example": 123 + }, + "modified": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "name": { + "type": "string", + "example": "WannyCry" + }, + "owner": { + "type": "string", + "example": "bob" + }, + "playbooks": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/PlaybookResponse" + } + }, + "read": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "bob" + ] + }, + "references": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + }, + "schema": { + "type": "string", + "example": "{}" + }, + "status": { + "type": "string", + "example": "open" + }, + "type": { + "type": "string", + "example": "incident" + }, + "write": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "alice" + ] + } + } + }, + "TicketSimpleResponse": { + "type": "object", + "required": [ + "id", + "name", + "type", + "status", + "created", + "modified", + "schema" + ], + "properties": { + "artifacts": { + "type": "array", + "items": { + "$ref": "#/definitions/Artifact" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/definitions/Comment" + } + }, + "created": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "details": { + "type": "object", + "example": { + "description": "my little incident" + } + }, + "files": { + "type": "array", + "items": { + "$ref": "#/definitions/File" + } + }, + "id": { + "type": "integer", + "format": "int64", + "example": 123 + }, + "modified": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "name": { + "type": "string", + "example": "WannyCry" + }, + "owner": { + "type": "string", + "example": "bob" + }, + "playbooks": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Playbook" + } + }, + "read": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "bob" + ] + }, + "references": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + }, + "schema": { + "type": "string", + "example": "{}" + }, + "status": { + "type": "string", + "example": "open" + }, + "type": { + "type": "string", + "example": "incident" + }, + "write": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "alice" + ] + } + } + }, + "TicketTemplate": { + "type": "object", + "required": [ + "name", + "schema" + ], + "properties": { + "name": { + "type": "string" + }, + "schema": { + "type": "string" + } + } + }, + "TicketTemplateForm": { + "type": "object", + "required": [ + "name", + "schema" + ], + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "schema": { + "type": "string" + } + } + }, + "TicketTemplateResponse": { + "type": "object", + "required": [ + "id", + "name", + "schema" + ], + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "schema": { + "type": "string" + } + } + }, + "TicketType": { + "type": "object", + "required": [ + "name", + "icon", + "default_template", + "default_playbooks" + ], + "properties": { + "default_groups": { + "type": "array", + "items": { + "type": "string" + } + }, + "default_playbooks": { + "type": "array", + "items": { + "type": "string" + } + }, + "default_template": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "TicketTypeForm": { + "type": "object", + "required": [ + "name", + "icon", + "default_template", + "default_playbooks" + ], + "properties": { + "default_groups": { + "type": "array", + "items": { + "type": "string" + } + }, + "default_playbooks": { + "type": "array", + "items": { + "type": "string" + } + }, + "default_template": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "TicketTypeResponse": { + "type": "object", + "required": [ + "id", + "name", + "icon", + "default_template", + "default_playbooks" + ], + "properties": { + "default_groups": { + "type": "array", + "items": { + "type": "string" + } + }, + "default_playbooks": { + "type": "array", + "items": { + "type": "string" + } + }, + "default_template": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "TicketWithTickets": { + "type": "object", + "required": [ + "id", + "name", + "type", + "status", + "created", + "modified", + "schema" + ], + "properties": { + "artifacts": { + "type": "array", + "items": { + "$ref": "#/definitions/Artifact" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/definitions/Comment" + } + }, + "created": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "details": { + "type": "object", + "example": { + "description": "my little incident" + } + }, + "files": { + "type": "array", + "items": { + "$ref": "#/definitions/File" + } + }, + "id": { + "type": "integer", + "format": "int64", + "example": 123 + }, + "modified": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "name": { + "type": "string", + "example": "WannyCry" + }, + "owner": { + "type": "string", + "example": "bob" + }, + "playbooks": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/PlaybookResponse" + } + }, + "read": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "bob" + ] + }, + "references": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + }, + "schema": { + "type": "string", + "example": "{}" + }, + "status": { + "type": "string", + "example": "open" + }, + "tickets": { + "type": "array", + "items": { + "$ref": "#/definitions/TicketSimpleResponse" + } + }, + "type": { + "type": "string", + "example": "incident" + }, + "write": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "alice" + ] + } + } + }, + "Type": { + "type": "object", + "required": [ + "id", + "name", + "icon" + ], + "properties": { + "color": { + "type": "string", + "title": "Color", + "enum": [ + "error", + "info", + "success", + "warning" + ], + "x-cols": 3 + }, + "icon": { + "type": "string", + "title": "Icon (https://materialdesignicons.com)", + "x-class": "pr-2", + "x-cols": 3 + }, + "id": { + "type": "string", + "title": "ID", + "x-class": "pr-2", + "x-cols": 3 + }, + "name": { + "type": "string", + "title": "Name", + "x-class": "pr-2", + "x-cols": 3 + } + } + }, + "User": { + "type": "object", + "required": [ + "blocked", + "apikey", + "roles" + ], + "properties": { + "apikey": { + "type": "boolean" + }, + "blocked": { + "type": "boolean" + }, + "roles": { + "type": "array", + "items": { + "type": "string" + } + }, + "sha256": { + "type": "string" + } + } + }, + "UserData": { + "type": "object", + "properties": { + "email": { + "type": "string", + "x-example": "bob@example.org" + }, + "image": { + "type": "string", + "x-display": "custom-avatar" + }, + "name": { + "type": "string", + "x-example": "Robert Smith" + }, + "timeformat": { + "type": "string", + "title": "Time Format (https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens)" + } + } + }, + "UserDataResponse": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "email": { + "type": "string", + "x-example": "bob@example.org" + }, + "id": { + "type": "string" + }, + "image": { + "type": "string", + "x-display": "custom-avatar" + }, + "name": { + "type": "string", + "x-example": "Robert Smith" + }, + "timeformat": { + "type": "string", + "title": "Time Format (https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens)" + } + } + }, + "UserForm": { + "type": "object", + "required": [ + "id", + "blocked", + "roles", + "apikey" + ], + "properties": { + "apikey": { + "type": "boolean" + }, + "blocked": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "UserResponse": { + "type": "object", + "required": [ + "id", + "blocked", + "roles", + "apikey" + ], + "properties": { + "apikey": { + "type": "boolean" + }, + "blocked": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } +}`)) + FlatSwaggerJSON = json.RawMessage([]byte(`{ + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "schemes": [ + "http" + ], + "swagger": "2.0", + "info": { + "description": "API for the catalyst incident response platform." + }, + "host": ".", + "basePath": "/api", + "paths": { + "/automations": { + "get": { + "security": [ + { + "roles": [ + "automation:read" + ] + } + ], + "tags": [ + "automations" + ], + "summary": "List automations", + "operationId": "listAutomations", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/AutomationResponse" + } + }, + "examples": { + "test": [ + { + "id": "comment", + "image": "docker.io/python:3", + "script": "", + "type": [ + "playbook" + ] + }, + { + "id": "hash.sha1", + "image": "docker.io/python:3", + "schema": "{\"title\":\"Input\",\"type\":\"object\",\"properties\":{\"default\":{\"type\":\"string\",\"title\":\"Value\"}},\"required\":[\"default\"]}", + "script": "", + "type": [ + "global", + "artifact", + "playbook" + ] + }, + { + "id": "thehive", + "image": "docker.io/python:3", + "schema": "{\"title\":\"TheHive credentials\",\"type\":\"object\",\"properties\":{\"thehiveurl\":{\"type\":\"string\",\"title\":\"TheHive URL (e.g. 'https://thehive.example.org')\"},\"thehivekey\":{\"type\":\"string\",\"title\":\"TheHive API Key\"},\"skip_files\":{\"type\":\"boolean\", \"default\": true, \"title\":\"Skip Files (much faster)\"},\"keep_ids\":{\"type\":\"boolean\", \"default\": true, \"title\":\"Keep IDs and overwrite existing IDs\"}},\"required\":[\"thehiveurl\", \"thehivekey\", \"skip_files\", \"keep_ids\"]}", + "script": "", + "type": [ + "global" + ] + }, + { + "id": "vt.hash", + "image": "docker.io/python:3", + "schema": "{\"title\":\"Input\",\"type\":\"object\",\"properties\":{\"default\":{\"type\":\"string\",\"title\":\"Value\"}},\"required\":[\"default\"]}", + "script": "", + "type": [ + "global", + "artifact", + "playbook" + ] + } + ] + } + } + } + }, + "post": { + "security": [ + { + "roles": [ + "automation:write" + ] + } + ], + "tags": [ + "automations" + ], + "summary": "Create a new automation", + "operationId": "createAutomation", + "parameters": [ + { + "x-example": { + "id": "hash-sha-256", + "image": "docker.io/python:3", + "script": "import sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha256 = hashlib.sha256(msg['payload']['default'].encode('utf-8'))\n return {'hash': sha256.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", + "type": [ + "global" + ] + }, + "description": "New automation", + "name": "automation", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/AutomationForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/AutomationResponse" + }, + "examples": { + "test": { + "id": "hash-sha-256", + "image": "docker.io/python:3", + "script": "import sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha256 = hashlib.sha256(msg['payload']['default'].encode('utf-8'))\n return {'hash': sha256.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", + "type": [ + "global" + ] + } + } + } + } + } + }, + "/automations/{id}": { + "get": { + "security": [ + { + "roles": [ + "automation:read" + ] + } + ], + "tags": [ + "automations" + ], + "summary": "Get a single automation", + "operationId": "getAutomation", + "parameters": [ + { + "type": "string", + "x-example": "hash.sha1", + "description": "Automation ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/AutomationResponse" + }, + "examples": { + "test": { + "id": "hash.sha1", + "image": "docker.io/python:3", + "schema": "{\"title\":\"Input\",\"type\":\"object\",\"properties\":{\"default\":{\"type\":\"string\",\"title\":\"Value\"}},\"required\":[\"default\"]}", + "script": "#!/usr/bin/env python\n\nimport sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha1 = hashlib.sha1(msg['payload']['default'].encode('utf-8'))\n return {\"hash\": sha1.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", + "type": [ + "global", + "artifact", + "playbook" + ] + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "automation:write" + ] + } + ], + "tags": [ + "automations" + ], + "summary": "Update an existing automation", + "operationId": "updateAutomation", + "parameters": [ + { + "type": "string", + "x-example": "hash.sha1", + "description": "Automation ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "id": "hash.sha1", + "image": "docker.io/python:3", + "script": "import sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha1 = hashlib.sha1(msg['payload'].encode('utf-8'))\n return {'hash': sha1.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", + "type": [ + "global", + "artifact", + "playbook" + ] + }, + "description": "Automation object that needs to be added", + "name": "automation", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/AutomationForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/AutomationResponse" + }, + "examples": { + "test": { + "id": "hash.sha1", + "image": "docker.io/python:3", + "script": "import sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha1 = hashlib.sha1(msg['payload'].encode('utf-8'))\n return {'hash': sha1.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", + "type": [ + "global", + "artifact", + "playbook" + ] + } + } + } + } + }, + "delete": { + "security": [ + { + "roles": [ + "automation:write" + ] + } + ], + "tags": [ + "automations" + ], + "summary": "Delete a automation", + "operationId": "deleteAutomation", + "parameters": [ + { + "type": "string", + "x-example": "hash.sha1", + "description": "Automation ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + }, + "/currentuser": { + "get": { + "security": [ + { + "roles": [ + "currentuser:read" + ] + } + ], + "tags": [ + "users" + ], + "summary": "Get current user", + "operationId": "currentUser", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/UserResponse" + }, + "examples": { + "test": { + "apikey": false, + "blocked": false, + "id": "bob", + "roles": [ + "admin:backup:read", + "admin:backup:restore", + "admin:group:write", + "admin:job:read", + "admin:job:write", + "admin:log:read", + "admin:ticket:delete", + "admin:user:write", + "admin:userdata:read", + "admin:userdata:write", + "analyst:automation:read", + "analyst:currentsettings:write", + "analyst:currentuser:read", + "analyst:currentuserdata:read", + "analyst:file", + "analyst:group:read", + "analyst:playbook:read", + "analyst:rule:read", + "analyst:settings:read", + "analyst:template:read", + "analyst:ticket:read", + "analyst:ticket:write", + "analyst:tickettype:read", + "analyst:user:read", + "engineer:automation:write", + "engineer:playbook:write", + "engineer:rule:write", + "engineer:template:write", + "engineer:tickettype:write" + ] + } + } + } + } + } + }, + "/currentuserdata": { + "get": { + "security": [ + { + "roles": [ + "currentuserdata:read" + ] + } + ], + "tags": [ + "userdata" + ], + "summary": "Get current user data", + "operationId": "currentUserData", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/UserDataResponse" + }, + "examples": { + "test": { + "email": "bob@example.org", + "id": "bob", + "name": "Bob Bad" + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "currentuserdata:write" + ] + } + ], + "tags": [ + "userdata" + ], + "summary": "Update current user data", + "operationId": "updateCurrentUserData", + "parameters": [ + { + "x-example": { + "email": "bob@example.org", + "name": "Bob Bad" + }, + "description": "User data object that needs to be added", + "name": "userdata", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UserData" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/UserDataResponse" + }, + "examples": { + "test": { + "email": "bob@example.org", + "id": "bob", + "name": "Bob Bad" + } + } + } + } + } + }, + "/jobs": { + "get": { + "security": [ + { + "roles": [ + "job:read" + ] + } + ], + "tags": [ + "jobs" + ], + "summary": "List jobs", + "operationId": "listJobs", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/JobResponse" + } + }, + "examples": { + "test": [ + { + "automation": "hash.sha1", + "id": "99cd67131b48", + "payload": "test", + "status": "created" + } + ] + } + } + } + }, + "post": { + "security": [ + { + "roles": [ + "job:write" + ] + } + ], + "tags": [ + "jobs" + ], + "summary": "Start a new job", + "operationId": "runJob", + "parameters": [ + { + "x-example": { + "automation": "hash.sha1", + "message": { + "payload": "test" + } + }, + "description": "New job", + "name": "job", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/JobForm" + } + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + }, + "/jobs/{id}": { + "get": { + "security": [ + { + "roles": [ + "job:read" + ] + } + ], + "tags": [ + "jobs" + ], + "summary": "Get a single job", + "operationId": "getJob", + "parameters": [ + { + "type": "string", + "x-example": "99cd67131b48", + "description": "Job ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/JobResponse" + }, + "examples": { + "test": { + "automation": "hash.sha1", + "id": "99cd67131b48", + "payload": "test", + "status": "created" + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "job:write" + ] + } + ], + "tags": [ + "jobs" + ], + "summary": "Update an existing job", + "operationId": "updateJob", + "parameters": [ + { + "type": "string", + "x-example": "99cd67131b48", + "description": "Job ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "automation": "hash.sha1", + "id": "99cd67131b48", + "payload": "test", + "status": "failed" + }, + "description": "Job object that needs to be added", + "name": "job", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Job" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/JobResponse" + }, + "examples": { + "test": { + "automation": "hash.sha1", + "id": "99cd67131b48", + "payload": "test", + "status": "failed" + } + } + } + } + } + }, + "/logs/{reference}": { + "get": { + "security": [ + { + "roles": [ + "log:read" + ] + } + ], + "tags": [ + "logs" + ], + "summary": "Get log entries", + "operationId": "getLogs", + "parameters": [ + { + "type": "string", + "x-example": "tickets%2F294511", + "description": "Reference", + "name": "reference", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/LogEntry" + } + }, + "examples": { + "test": [ + { + "created": "2021-10-02T18:05:00.333535+02:00", + "creator": "bob", + "message": "Fail run account resist lend solve incident centre priority temperature. Cause change distribution examine location technique shape partner milk customer. Rail tea plate soil report cook railway interpretation breath action. Exercise dream accept park conclusion addition shoot assistance may answer. Gold writer link stop combine hear power name commitment operation. Determine lifespan support grow degree henry exclude detail set religion. Direct library policy convention chain retain discover ride walk student. Gather proposal select march aspect play noise avoid encourage employ. Assessment preserve transport combine wish influence income guess run stand. Charge limit crime ignore statement foundation study issue stop claim.", + "reference": "tickets/294511" + } + ] + } + } + } + } + }, + "/playbooks": { + "get": { + "security": [ + { + "roles": [ + "playbook:read" + ] + } + ], + "tags": [ + "playbooks" + ], + "summary": "List playbooks", + "operationId": "listPlaybooks", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PlaybookTemplateResponse" + } + }, + "examples": { + "test": [ + { + "id": "malware", + "name": "Malware", + "yaml": "name: Malware\ntasks:\n file-or-hash:\n name: Do you have the file or the hash?\n type: input\n schema:\n title: Malware\n type: object\n properties:\n file:\n type: string\n title: \"I have the\"\n enum: [ \"File\", \"Hash\" ]\n next:\n enter-hash: \"file == 'Hash'\"\n upload: \"file == 'File'\"\n\n enter-hash:\n name: Please enter the hash\n type: input\n schema:\n title: Malware\n type: object\n properties:\n hash:\n type: string\n title: Please enter the hash value\n minlength: 32\n next:\n virustotal: \"hash != ''\"\n\n upload:\n name: Upload the malware\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: object\n x-display: file\n title: Please upload the malware\n next:\n hash: \"malware\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['upload'].data['malware']\"\n next:\n virustotal:\n\n virustotal:\n name: Send hash to VirusTotal\n type: automation\n automation: vt.hash\n args:\n hash: \"playbook.tasks['enter-hash'].data['hash'] || playbook.tasks['hash'].data['hash']\"\n # next:\n # known-malware: \"score \u003e 5\"\n # sandbox: \"score \u003c 6\" # unknown-malware\n" + }, + { + "id": "phishing", + "name": "Phishing", + "yaml": "name: Phishing\ntasks:\n board:\n name: Board Involvement?\n description: Is a board member involved?\n type: input\n schema:\n properties:\n boardInvolved:\n default: false\n title: A board member is involved.\n type: boolean\n required:\n - boardInvolved\n title: Board Involvement?\n type: object\n next:\n escalate: \"boardInvolved == true\"\n mail-available: \"boardInvolved == false\"\n\n escalate:\n name: Escalate to CISO\n description: Please escalate the task to the CISO\n type: task\n\n mail-available:\n name: Mail available\n type: input\n schema:\n oneOf:\n - properties:\n mail:\n title: Mail\n type: string\n x-display: textarea\n schemaKey:\n const: 'yes'\n type: string\n required:\n - mail\n title: 'Yes'\n - properties:\n schemaKey:\n const: 'no'\n type: string\n title: 'No'\n title: Mail available\n type: object\n next:\n block-sender: \"schemaKey == 'yes'\"\n extract-iocs: \"schemaKey == 'yes'\"\n search-email-gateway: \"schemaKey == 'no'\"\n\n search-email-gateway:\n name: Search email gateway\n description: Please search email-gateway for the phishing mail.\n type: task\n next:\n extract-iocs:\n\n block-sender:\n name: Block sender\n type: task\n next:\n extract-iocs:\n\n extract-iocs:\n name: Extract IOCs\n description: Please insert the IOCs\n type: input\n schema:\n properties:\n iocs:\n items:\n type: string\n title: IOCs\n type: array\n title: Extract IOCs\n type: object\n next:\n block-iocs:\n\n block-iocs:\n name: Block IOCs\n type: task\n" + }, + { + "id": "simple", + "name": "Simple", + "yaml": "name: Simple\ntasks:\n input:\n name: Enter something to hash\n type: input\n schema:\n title: Something\n type: object\n properties:\n something:\n type: string\n title: Something\n default: \"\"\n next:\n hash: \"something != ''\"\n\n hash:\n name: Hash the something\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['something']\"\n next:\n comment: \"hash != ''\"\n\n comment:\n name: Comment the hash\n type: automation\n automation: comment\n payload:\n default: \"playbook.tasks['hash'].data['hash']\"\n next:\n done: \"done\"\n\n done:\n name: You can close this case now\n type: task\n" + } + ] + } + } + } + }, + "post": { + "security": [ + { + "roles": [ + "playbook:write" + ] + } + ], + "tags": [ + "playbooks" + ], + "summary": "Create a playbook", + "operationId": "createPlaybook", + "parameters": [ + { + "x-example": { + "yaml": "name: Simple2\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n" + }, + "description": "New playbook", + "name": "playbook", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PlaybookTemplateForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PlaybookTemplateResponse" + } + }, + "examples": { + "test": { + "id": "simple-2", + "name": "Simple2", + "yaml": "name: Simple2\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n" + } + } + } + } + } + }, + "/playbooks/{id}": { + "get": { + "security": [ + { + "roles": [ + "playbook:read" + ] + } + ], + "tags": [ + "playbooks" + ], + "summary": "Get a single playbook", + "operationId": "getPlaybook", + "parameters": [ + { + "type": "string", + "x-example": "simple", + "description": "Playbook name", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/PlaybookTemplateResponse" + }, + "examples": { + "test": { + "id": "simple", + "name": "Simple", + "yaml": "name: Simple\ntasks:\n input:\n name: Enter something to hash\n type: input\n schema:\n title: Something\n type: object\n properties:\n something:\n type: string\n title: Something\n default: \"\"\n next:\n hash: \"something != ''\"\n\n hash:\n name: Hash the something\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['something']\"\n next:\n comment: \"hash != ''\"\n\n comment:\n name: Comment the hash\n type: automation\n automation: comment\n payload:\n default: \"playbook.tasks['hash'].data['hash']\"\n next:\n done: \"done\"\n\n done:\n name: You can close this case now\n type: task\n" + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "playbook:write" + ] + } + ], + "tags": [ + "playbooks" + ], + "summary": "Update an existing ticket playbook", + "operationId": "updatePlaybook", + "parameters": [ + { + "type": "string", + "x-example": "simple", + "description": "Playbook ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "yaml": "name: Simple\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n" + }, + "description": "Updated playbook", + "name": "playbook", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PlaybookTemplateForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/PlaybookTemplateResponse" + }, + "examples": { + "test": { + "id": "simple", + "name": "Simple", + "yaml": "name: Simple\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n" + } + } + } + } + }, + "delete": { + "security": [ + { + "roles": [ + "playbook:write" + ] + } + ], + "tags": [ + "playbooks" + ], + "summary": "Delete a playbook", + "operationId": "deletePlaybook", + "parameters": [ + { + "type": "string", + "x-example": "simple", + "description": "Playbook name", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + }, + "/settings": { + "get": { + "security": [ + { + "roles": [ + "settings:read" + ] + } + ], + "tags": [ + "settings" + ], + "summary": "Get settings", + "operationId": "getSettings", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Settings" + }, + "examples": { + "test": { + "artifactStates": [ + { + "color": "info", + "icon": "mdi-help-circle-outline", + "id": "unknown", + "name": "Unknown" + }, + { + "color": "error", + "icon": "mdi-skull", + "id": "malicious", + "name": "Malicious" + }, + { + "color": "success", + "icon": "mdi-check", + "id": "clean", + "name": "Clean" + } + ], + "roles": [ + "admin:backup:read", + "admin:backup:restore", + "admin:group:write", + "admin:job:read", + "admin:job:write", + "admin:log:read", + "admin:ticket:delete", + "admin:user:write", + "admin:userdata:read", + "admin:userdata:write", + "analyst:automation:read", + "analyst:currentsettings:write", + "analyst:currentuser:read", + "analyst:currentuserdata:read", + "analyst:file", + "analyst:group:read", + "analyst:playbook:read", + "analyst:rule:read", + "analyst:settings:read", + "analyst:template:read", + "analyst:ticket:read", + "analyst:ticket:write", + "analyst:tickettype:read", + "analyst:user:read", + "engineer:automation:write", + "engineer:playbook:write", + "engineer:rule:write", + "engineer:template:write", + "engineer:tickettype:write" + ], + "ticketTypes": [ + { + "default_playbooks": [], + "default_template": "default", + "icon": "mdi-alert", + "id": "alert", + "name": "Alerts" + }, + { + "default_playbooks": [], + "default_template": "default", + "icon": "mdi-radioactive", + "id": "incident", + "name": "Incidents" + }, + { + "default_playbooks": [], + "default_template": "default", + "icon": "mdi-fingerprint", + "id": "investigation", + "name": "Forensic Investigations" + }, + { + "default_playbooks": [], + "default_template": "default", + "icon": "mdi-target", + "id": "hunt", + "name": "Threat Hunting" + } + ], + "tier": "community", + "timeformat": "YYYY-MM-DDThh:mm:ss", + "version": "0.0.0-test" + } + } + } + } + } + }, + "/statistics": { + "get": { + "security": [ + { + "roles": [ + "ticket:read" + ] + } + ], + "tags": [ + "statistics" + ], + "summary": "Get statistics", + "operationId": "getStatistics", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Statistics" + }, + "examples": { + "test": { + "open_tickets_per_user": {}, + "tickets_per_type": { + "alert": 2, + "incident": 1 + }, + "tickets_per_week": { + "2021-39": 3 + }, + "unassigned": 0 + } + } + } + } + } + }, + "/tasks": { + "get": { + "security": [ + { + "roles": [ + "ticket:read" + ] + } + ], + "tags": [ + "tasks" + ], + "summary": "List tasks", + "operationId": "listTasks", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TaskResponse" + } + }, + "examples": { + "test": [] + } + } + } + } + }, + "/templates": { + "get": { + "security": [ + { + "roles": [ + "template:read" + ] + } + ], + "tags": [ + "templates" + ], + "summary": "List templates", + "operationId": "listTemplates", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TicketTemplateResponse" + } + }, + "examples": { + "test": [ + { + "id": "default", + "name": "Default", + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Default\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + } + ] + } + } + } + }, + "post": { + "security": [ + { + "roles": [ + "template:write" + ] + } + ], + "tags": [ + "templates" + ], + "summary": "Create a new template", + "operationId": "createTemplate", + "parameters": [ + { + "x-example": { + "name": "My Template", + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + }, + "description": "New template", + "name": "template", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/TicketTemplateForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketTemplateResponse" + }, + "examples": { + "test": { + "id": "my-template", + "name": "My Template", + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + } + } + } + } + } + }, + "/templates/{id}": { + "get": { + "security": [ + { + "roles": [ + "template:read" + ] + } + ], + "tags": [ + "templates" + ], + "summary": "Get a single template", + "operationId": "getTemplate", + "parameters": [ + { + "type": "string", + "x-example": "default", + "description": "Template ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketTemplateResponse" + }, + "examples": { + "test": { + "id": "default", + "name": "Default", + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Default\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "template:write" + ] + } + ], + "tags": [ + "templates" + ], + "summary": "Update an existing template", + "operationId": "updateTemplate", + "parameters": [ + { + "type": "string", + "x-example": "default", + "description": "Template ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "name": "My Template", + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + }, + "description": "Template object that needs to be added", + "name": "template", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/TicketTemplateForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketTemplateResponse" + }, + "examples": { + "test": { + "id": "default", + "name": "My Template", + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n" + } + } + } + } + }, + "delete": { + "security": [ + { + "roles": [ + "template:write" + ] + } + ], + "tags": [ + "templates" + ], + "summary": "Delete a template", + "operationId": "deleteTemplate", + "parameters": [ + { + "type": "string", + "x-example": "default", + "description": "Template ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + }, + "/tickets": { + "get": { + "security": [ + { + "roles": [ + "ticket:read" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "List tickets", + "operationId": "listTickets", + "parameters": [ + { + "type": "string", + "description": "Ticket Type", + "name": "type", + "in": "query" + }, + { + "type": "integer", + "default": 0, + "description": "Offset of the list", + "name": "offset", + "in": "query" + }, + { + "maximum": 100, + "type": "integer", + "default": 25, + "description": "Number of tickets", + "name": "count", + "in": "query" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "description": "Sort columns", + "name": "sort", + "in": "query" + }, + { + "type": "array", + "items": { + "type": "boolean" + }, + "description": "Sort descending", + "name": "desc", + "in": "query" + }, + { + "type": "string", + "description": "Search query", + "name": "query", + "in": "query" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketList" + }, + "examples": { + "test": { + "count": 3, + "tickets": [ + { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + }, + { + "name": "leadreintermediate.io", + "status": "malicious" + } + ], + "created": "2021-10-02T18:04:59.078206+02:00", + "id": 8123, + "modified": "2021-10-02T18:04:59.078206+02:00", + "name": "live zebra", + "owner": "demo", + "playbooks": { + "phishing": { + "name": "Phishing", + "tasks": { + "block-iocs": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block IOCs", + "type": "task" + }, + "block-sender": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block sender", + "next": { + "extract-iocs": "" + }, + "type": "task" + }, + "board": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "escalate": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to CISO", + "type": "task" + }, + "extract-iocs": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Extract IOCs", + "next": { + "block-iocs": "" + }, + "schema": { + "properties": { + "iocs": { + "items": { + "type": "string" + }, + "title": "IOCs", + "type": "array" + } + }, + "title": "Extract IOCs", + "type": "object" + }, + "type": "input" + }, + "mail-available": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Mail available", + "next": { + "block-sender": "schemaKey == 'yes'", + "extract-iocs": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'" + }, + "schema": { + "oneOf": [ + { + "properties": { + "mail": { + "title": "Mail", + "type": "string", + "x-display": "textarea" + }, + "schemaKey": { + "const": "yes", + "type": "string" + } + }, + "required": [ + "mail" + ], + "title": "Yes" + }, + { + "properties": { + "schemaKey": { + "const": "no", + "type": "string" + } + }, + "title": "No" + } + ], + "title": "Mail available", + "type": "object" + }, + "type": "input" + }, + "search-email-gateway": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Search email gateway", + "next": { + "extract-iocs": "" + }, + "type": "task" + } + } + } + }, + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + }, + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8125, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "phishing from selenafadel@von.com detected", + "owner": "demo", + "references": [ + { + "href": "https://www.seniorleading-edge.name/users/efficient", + "name": "recovery" + }, + { + "href": "http://www.dynamicseamless.com/clicks-and-mortar", + "name": "force" + }, + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + }, + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + ] + } + } + } + } + }, + "post": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Create a new ticket", + "operationId": "createTicket", + "parameters": [ + { + "x-example": { + "id": 123, + "name": "Wannacry infection", + "owner": "bob", + "status": "open", + "type": "incident" + }, + "description": "New ticket", + "name": "ticket", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/TicketForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "created": "1985-04-12T23:20:50.52Z", + "id": 123, + "modified": "1985-04-12T23:20:50.52Z", + "name": "Wannacry infection", + "owner": "bob", + "schema": "{}", + "status": "open", + "type": "incident" + } + } + } + } + } + }, + "/tickets/batch": { + "post": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Create a new tickets in batch", + "operationId": "createTicketBatch", + "parameters": [ + { + "x-example": [ + { + "id": 123, + "name": "Wannacry infection", + "owner": "bob", + "status": "open", + "type": "incident" + } + ], + "description": "New ticket", + "name": "ticket", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TicketForm" + } + } + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + }, + "/tickets/{id}": { + "get": { + "security": [ + { + "roles": [ + "ticket:read" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Get a single ticket", + "operationId": "getTicket", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8125, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8125, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "phishing from selenafadel@von.com detected", + "owner": "demo", + "references": [ + { + "href": "https://www.seniorleading-edge.name/users/efficient", + "name": "recovery" + }, + { + "href": "http://www.dynamicseamless.com/clicks-and-mortar", + "name": "force" + }, + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "tickets": [ + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + ], + "type": "alert" + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Update an existing ticket", + "operationId": "updateTicket", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8125, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "created": "2021-10-02T18:04:59.078186+02:00", + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "phishing from selenafadel@von.org detected", + "owner": "demo", + "references": [ + { + "href": "https://www.seniorleading-edge.name/users/efficient", + "name": "recovery" + }, + { + "href": "http://www.dynamicseamless.com/clicks-and-mortar", + "name": "force" + }, + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + }, + "description": "Updated ticket", + "name": "ticket", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Ticket" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8125, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "phishing from selenafadel@von.org detected", + "owner": "demo", + "references": [ + { + "href": "https://www.seniorleading-edge.name/users/efficient", + "name": "recovery" + }, + { + "href": "http://www.dynamicseamless.com/clicks-and-mortar", + "name": "force" + }, + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "tickets": [ + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + ], + "type": "alert" + } + } + } + } + }, + "delete": { + "security": [ + { + "roles": [ + "ticket:delete" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Delete an ticket", + "operationId": "deleteTicket", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8125, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + }, + "/tickets/{id}/artifacts": { + "post": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Add a single artifact", + "operationId": "addArtifact", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "name": "2.2.2.2" + }, + "description": "Artifact object that needs to be added", + "name": "artifact", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Artifact" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + }, + { + "name": "leadreintermediate.io", + "status": "malicious" + }, + { + "name": "2.2.2.2", + "status": "unknown", + "type": "ip" + } + ], + "created": "2021-10-02T18:04:59.078206+02:00", + "id": 8123, + "modified": "2021-10-02T18:04:59.078206+02:00", + "name": "live zebra", + "owner": "demo", + "playbooks": { + "phishing": { + "name": "Phishing", + "tasks": { + "block-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block IOCs", + "order": 6, + "type": "task" + }, + "block-sender": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block sender", + "next": { + "extract-iocs": "" + }, + "order": 3, + "type": "task" + }, + "board": { + "active": true, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "order": 0, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "escalate": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to CISO", + "order": 1, + "type": "task" + }, + "extract-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Extract IOCs", + "next": { + "block-iocs": "" + }, + "order": 5, + "schema": { + "properties": { + "iocs": { + "items": { + "type": "string" + }, + "title": "IOCs", + "type": "array" + } + }, + "title": "Extract IOCs", + "type": "object" + }, + "type": "input" + }, + "mail-available": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Mail available", + "next": { + "block-sender": "schemaKey == 'yes'", + "extract-iocs": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'" + }, + "order": 2, + "schema": { + "oneOf": [ + { + "properties": { + "mail": { + "title": "Mail", + "type": "string", + "x-display": "textarea" + }, + "schemaKey": { + "const": "yes", + "type": "string" + } + }, + "required": [ + "mail" + ], + "title": "Yes" + }, + { + "properties": { + "schemaKey": { + "const": "no", + "type": "string" + } + }, + "title": "No" + } + ], + "title": "Mail available", + "type": "object" + }, + "type": "input" + }, + "search-email-gateway": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Search email gateway", + "next": { + "extract-iocs": "" + }, + "order": 4, + "type": "task" + } + } + } + }, + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + } + } + } + } + } + }, + "/tickets/{id}/artifacts/{name}": { + "get": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Get a single artifact", + "operationId": "getArtifact", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "leadreintermediate.io", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Artifact" + }, + "examples": { + "test": { + "name": "leadreintermediate.io", + "status": "malicious" + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Set a single artifact", + "operationId": "setArtifact", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "leadreintermediate.io", + "name": "name", + "in": "path", + "required": true + }, + { + "x-example": { + "name": "leadreintermediate.io", + "status": "clean" + }, + "name": "artifact", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Artifact" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + }, + { + "name": "leadreintermediate.io", + "status": "clean" + } + ], + "created": "2021-10-02T18:04:59.078206+02:00", + "id": 8123, + "modified": "2021-10-02T18:04:59.078206+02:00", + "name": "live zebra", + "owner": "demo", + "playbooks": { + "phishing": { + "name": "Phishing", + "tasks": { + "block-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block IOCs", + "order": 6, + "type": "task" + }, + "block-sender": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block sender", + "next": { + "extract-iocs": "" + }, + "order": 3, + "type": "task" + }, + "board": { + "active": true, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "order": 0, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "escalate": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to CISO", + "order": 1, + "type": "task" + }, + "extract-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Extract IOCs", + "next": { + "block-iocs": "" + }, + "order": 5, + "schema": { + "properties": { + "iocs": { + "items": { + "type": "string" + }, + "title": "IOCs", + "type": "array" + } + }, + "title": "Extract IOCs", + "type": "object" + }, + "type": "input" + }, + "mail-available": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Mail available", + "next": { + "block-sender": "schemaKey == 'yes'", + "extract-iocs": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'" + }, + "order": 2, + "schema": { + "oneOf": [ + { + "properties": { + "mail": { + "title": "Mail", + "type": "string", + "x-display": "textarea" + }, + "schemaKey": { + "const": "yes", + "type": "string" + } + }, + "required": [ + "mail" + ], + "title": "Yes" + }, + { + "properties": { + "schemaKey": { + "const": "no", + "type": "string" + } + }, + "title": "No" + } + ], + "title": "Mail available", + "type": "object" + }, + "type": "input" + }, + "search-email-gateway": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Search email gateway", + "next": { + "extract-iocs": "" + }, + "order": 4, + "type": "task" + } + } + } + }, + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + } + } + } + } + }, + "delete": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Remove an artifact", + "operationId": "removeArtifact", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "leadreintermediate.io", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + } + ], + "created": "2021-10-02T18:04:59.078206+02:00", + "id": 8123, + "modified": "2021-10-02T18:04:59.078206+02:00", + "name": "live zebra", + "owner": "demo", + "playbooks": { + "phishing": { + "name": "Phishing", + "tasks": { + "block-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block IOCs", + "order": 6, + "type": "task" + }, + "block-sender": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block sender", + "next": { + "extract-iocs": "" + }, + "order": 3, + "type": "task" + }, + "board": { + "active": true, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "order": 0, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "escalate": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to CISO", + "order": 1, + "type": "task" + }, + "extract-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Extract IOCs", + "next": { + "block-iocs": "" + }, + "order": 5, + "schema": { + "properties": { + "iocs": { + "items": { + "type": "string" + }, + "title": "IOCs", + "type": "array" + } + }, + "title": "Extract IOCs", + "type": "object" + }, + "type": "input" + }, + "mail-available": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Mail available", + "next": { + "block-sender": "schemaKey == 'yes'", + "extract-iocs": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'" + }, + "order": 2, + "schema": { + "oneOf": [ + { + "properties": { + "mail": { + "title": "Mail", + "type": "string", + "x-display": "textarea" + }, + "schemaKey": { + "const": "yes", + "type": "string" + } + }, + "required": [ + "mail" + ], + "title": "Yes" + }, + { + "properties": { + "schemaKey": { + "const": "no", + "type": "string" + } + }, + "title": "No" + } + ], + "title": "Mail available", + "type": "object" + }, + "type": "input" + }, + "search-email-gateway": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Search email gateway", + "next": { + "extract-iocs": "" + }, + "order": 4, + "type": "task" + } + } + } + }, + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + } + } + } + } + } + }, + "/tickets/{id}/artifacts/{name}/enrich": { + "post": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Enrich a single artifact", + "operationId": "enrichArtifact", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "leadreintermediate.io", + "name": "name", + "in": "path", + "required": true + }, + { + "x-example": { + "data": { + "hash": "b7a067a742c20d07a7456646de89bc2d408a1153" + }, + "name": "hash.sha1" + }, + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/EnrichmentForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Artifact" + }, + "examples": { + "test": { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + }, + { + "enrichments": { + "hash.sha1": { + "created": "2021-10-03T18:44:06.488923+02:00", + "data": { + "hash": "b7a067a742c20d07a7456646de89bc2d408a1153" + }, + "name": "hash.sha1" + } + }, + "name": "leadreintermediate.io", + "status": "malicious" + } + ], + "created": "2021-10-02T18:04:59.078206+02:00", + "id": 8123, + "modified": "2021-10-02T18:04:59.078206+02:00", + "name": "live zebra", + "owner": "demo", + "playbooks": { + "phishing": { + "name": "Phishing", + "tasks": { + "block-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block IOCs", + "order": 6, + "type": "task" + }, + "block-sender": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block sender", + "next": { + "extract-iocs": "" + }, + "order": 3, + "type": "task" + }, + "board": { + "active": true, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "order": 0, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "escalate": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to CISO", + "order": 1, + "type": "task" + }, + "extract-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Extract IOCs", + "next": { + "block-iocs": "" + }, + "order": 5, + "schema": { + "properties": { + "iocs": { + "items": { + "type": "string" + }, + "title": "IOCs", + "type": "array" + } + }, + "title": "Extract IOCs", + "type": "object" + }, + "type": "input" + }, + "mail-available": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Mail available", + "next": { + "block-sender": "schemaKey == 'yes'", + "extract-iocs": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'" + }, + "order": 2, + "schema": { + "oneOf": [ + { + "properties": { + "mail": { + "title": "Mail", + "type": "string", + "x-display": "textarea" + }, + "schemaKey": { + "const": "yes", + "type": "string" + } + }, + "required": [ + "mail" + ], + "title": "Yes" + }, + { + "properties": { + "schemaKey": { + "const": "no", + "type": "string" + } + }, + "title": "No" + } + ], + "title": "Mail available", + "type": "object" + }, + "type": "input" + }, + "search-email-gateway": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Search email gateway", + "next": { + "extract-iocs": "" + }, + "order": 4, + "type": "task" + } + } + } + }, + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + } + } + } + } + } + }, + "/tickets/{id}/artifacts/{name}/run/{automation}": { + "post": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Run automation on a single artifact", + "operationId": "runArtifact", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "leadreintermediate.io", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "hash.sha1", + "name": "automation", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + }, + "/tickets/{id}/comments": { + "post": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Add ticket comment", + "operationId": "addComment", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8125, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "message": "My first comment" + }, + "description": "Ticket comment", + "name": "comment", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CommentForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "comments": [ + { + "created": "2021-10-02T18:04:59.078186+02:00", + "creator": "bob", + "message": "My first comment" + } + ], + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8125, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "phishing from selenafadel@von.com detected", + "owner": "demo", + "references": [ + { + "href": "https://www.seniorleading-edge.name/users/efficient", + "name": "recovery" + }, + { + "href": "http://www.dynamicseamless.com/clicks-and-mortar", + "name": "force" + }, + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "tickets": [ + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + ], + "type": "alert" + } + } + } + } + } + }, + "/tickets/{id}/comments/{commentID}": { + "delete": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "description": "Comment will be removed from the ticket.", + "tags": [ + "tickets" + ], + "summary": "Remove an comment from an ticket", + "operationId": "removeComment", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "integer", + "x-example": 0, + "description": "Comment ID to remove", + "name": "commentID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + }, + { + "name": "leadreintermediate.io", + "status": "malicious" + } + ], + "created": "2021-10-02T18:04:59.078206+02:00", + "id": 8123, + "modified": "2021-10-02T18:04:59.078206+02:00", + "name": "live zebra", + "owner": "demo", + "playbooks": { + "phishing": { + "name": "Phishing", + "tasks": { + "block-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block IOCs", + "order": 6, + "type": "task" + }, + "block-sender": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block sender", + "next": { + "extract-iocs": "" + }, + "order": 3, + "type": "task" + }, + "board": { + "active": true, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "order": 0, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "escalate": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to CISO", + "order": 1, + "type": "task" + }, + "extract-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Extract IOCs", + "next": { + "block-iocs": "" + }, + "order": 5, + "schema": { + "properties": { + "iocs": { + "items": { + "type": "string" + }, + "title": "IOCs", + "type": "array" + } + }, + "title": "Extract IOCs", + "type": "object" + }, + "type": "input" + }, + "mail-available": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Mail available", + "next": { + "block-sender": "schemaKey == 'yes'", + "extract-iocs": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'" + }, + "order": 2, + "schema": { + "oneOf": [ + { + "properties": { + "mail": { + "title": "Mail", + "type": "string", + "x-display": "textarea" + }, + "schemaKey": { + "const": "yes", + "type": "string" + } + }, + "required": [ + "mail" + ], + "title": "Yes" + }, + { + "properties": { + "schemaKey": { + "const": "no", + "type": "string" + } + }, + "title": "No" + } + ], + "title": "Mail available", + "type": "object" + }, + "type": "input" + }, + "search-email-gateway": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Search email gateway", + "next": { + "extract-iocs": "" + }, + "order": 4, + "type": "task" + } + } + } + }, + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + } + } + } + } + } + }, + "/tickets/{id}/files": { + "put": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "description": "Link files to an ticket. The files themself will be stored in object storage.", + "tags": [ + "tickets" + ], + "summary": "Link files to an ticket", + "operationId": "linkFiles", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8125, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": [ + { + "key": "myfile", + "name": "document.doc" + } + ], + "description": "Added files", + "name": "files", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/File" + } + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "created": "2021-10-02T18:04:59.078186+02:00", + "files": [ + { + "key": "myfile", + "name": "document.doc" + } + ], + "id": 8125, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "phishing from selenafadel@von.com detected", + "owner": "demo", + "references": [ + { + "href": "https://www.seniorleading-edge.name/users/efficient", + "name": "recovery" + }, + { + "href": "http://www.dynamicseamless.com/clicks-and-mortar", + "name": "force" + }, + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "tickets": [ + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + ], + "type": "alert" + } + } + } + } + } + }, + "/tickets/{id}/playbooks": { + "post": { + "tags": [ + "tickets" + ], + "summary": "Add a new ticket playbook", + "operationId": "addTicketPlaybook", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8125, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "yaml": "name: Simple\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n" + }, + "description": "Ticket playbook object that needs to be added", + "name": "playbook", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PlaybookTemplateForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "created": "1985-04-12T23:20:50.52Z", + "id": 8125, + "modified": "1985-04-12T23:20:50.52Z", + "name": "phishing from selenafadel@von.com detected", + "owner": "demo", + "playbooks": { + "simple": { + "name": "Simple", + "tasks": { + "escalate": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to malware team", + "order": 2, + "type": "task" + }, + "hash": { + "active": false, + "automation": "hash.sha1", + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Hash the malware", + "next": { + "escalate": "" + }, + "order": 1, + "payload": { + "default": "playbook.tasks['input'].data['malware']" + }, + "type": "automation" + }, + "input": { + "active": true, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Upload malware if possible", + "next": { + "hash": "malware != ''" + }, + "order": 0, + "schema": { + "properties": { + "malware": { + "default": "", + "title": "Select malware", + "type": "string" + } + }, + "title": "Malware", + "type": "object" + }, + "type": "input" + } + } + } + }, + "references": [ + { + "href": "https://www.seniorleading-edge.name/users/efficient", + "name": "recovery" + }, + { + "href": "http://www.dynamicseamless.com/clicks-and-mortar", + "name": "force" + }, + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "tickets": [ + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + ], + "type": "alert" + } + } + } + } + } + }, + "/tickets/{id}/playbooks/{playbookID}": { + "delete": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Remove an ticket playbook", + "operationId": "removeTicketPlaybook", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "phishing", + "description": "Playbook ID", + "name": "playbookID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + }, + { + "name": "leadreintermediate.io", + "status": "malicious" + } + ], + "created": "1985-04-12T23:20:50.52Z", + "id": 8123, + "modified": "1985-04-12T23:20:50.52Z", + "name": "live zebra", + "owner": "demo", + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + } + } + } + } + } + }, + "/tickets/{id}/playbooks/{playbookID}/task/{taskID}": { + "put": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Set a ticket playbook task", + "operationId": "setTask", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "phishing", + "description": "Playbook ID", + "name": "playbookID", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "board", + "description": "Task ID", + "name": "taskID", + "in": "path", + "required": true + }, + { + "x-example": { + "active": true, + "data": { + "boardInvolved": true + }, + "done": false, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "order": 0, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "description": "Task", + "name": "task", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/Task" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + }, + { + "name": "leadreintermediate.io", + "status": "malicious" + } + ], + "created": "2021-10-02T18:04:59.078206+02:00", + "id": 8123, + "modified": "2021-10-02T18:04:59.078206+02:00", + "name": "live zebra", + "owner": "demo", + "playbooks": { + "phishing": { + "name": "Phishing", + "tasks": { + "block-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block IOCs", + "order": 6, + "type": "task" + }, + "block-sender": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block sender", + "next": { + "extract-iocs": "" + }, + "order": 3, + "type": "task" + }, + "board": { + "active": true, + "created": "2021-10-02T18:04:59.078186+02:00", + "data": { + "boardInvolved": true + }, + "done": false, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "order": 0, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "escalate": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to CISO", + "order": 1, + "type": "task" + }, + "extract-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Extract IOCs", + "next": { + "block-iocs": "" + }, + "order": 5, + "schema": { + "properties": { + "iocs": { + "items": { + "type": "string" + }, + "title": "IOCs", + "type": "array" + } + }, + "title": "Extract IOCs", + "type": "object" + }, + "type": "input" + }, + "mail-available": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Mail available", + "next": { + "block-sender": "schemaKey == 'yes'", + "extract-iocs": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'" + }, + "order": 2, + "schema": { + "oneOf": [ + { + "properties": { + "mail": { + "title": "Mail", + "type": "string", + "x-display": "textarea" + }, + "schemaKey": { + "const": "yes", + "type": "string" + } + }, + "required": [ + "mail" + ], + "title": "Yes" + }, + { + "properties": { + "schemaKey": { + "const": "no", + "type": "string" + } + }, + "title": "No" + } + ], + "title": "Mail available", + "type": "object" + }, + "type": "input" + }, + "search-email-gateway": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Search email gateway", + "next": { + "extract-iocs": "" + }, + "order": 4, + "type": "task" + } + } + } + }, + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + } + } + } + } + } + }, + "/tickets/{id}/playbooks/{playbookID}/task/{taskID}/complete": { + "put": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Complete ticket playbook task", + "operationId": "completeTask", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "phishing", + "description": "Playbook ID", + "name": "playbookID", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "board", + "description": "Task ID", + "name": "taskID", + "in": "path", + "required": true + }, + { + "x-example": { + "boardInvolved": true + }, + "description": "Ticket playbook object that needs to be added", + "name": "data", + "in": "body", + "required": true, + "schema": { + "type": "object" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + }, + { + "name": "leadreintermediate.io", + "status": "malicious" + } + ], + "created": "2021-10-02T18:04:59.078206+02:00", + "id": 8123, + "modified": "2021-10-02T18:04:59.078206+02:00", + "name": "live zebra", + "owner": "demo", + "playbooks": { + "phishing": { + "name": "Phishing", + "tasks": { + "block-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block IOCs", + "order": 6, + "type": "task" + }, + "block-sender": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block sender", + "next": { + "extract-iocs": "" + }, + "order": 3, + "type": "task" + }, + "board": { + "active": false, + "closed": "2021-10-02T18:04:59.078186+02:00", + "created": "2021-10-02T18:04:59.078186+02:00", + "data": { + "boardInvolved": true + }, + "done": true, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "order": 0, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "escalate": { + "active": true, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to CISO", + "order": 1, + "type": "task" + }, + "extract-iocs": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Extract IOCs", + "next": { + "block-iocs": "" + }, + "order": 5, + "schema": { + "properties": { + "iocs": { + "items": { + "type": "string" + }, + "title": "IOCs", + "type": "array" + } + }, + "title": "Extract IOCs", + "type": "object" + }, + "type": "input" + }, + "mail-available": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Mail available", + "next": { + "block-sender": "schemaKey == 'yes'", + "extract-iocs": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'" + }, + "order": 2, + "schema": { + "oneOf": [ + { + "properties": { + "mail": { + "title": "Mail", + "type": "string", + "x-display": "textarea" + }, + "schemaKey": { + "const": "yes", + "type": "string" + } + }, + "required": [ + "mail" + ], + "title": "Yes" + }, + { + "properties": { + "schemaKey": { + "const": "no", + "type": "string" + } + }, + "title": "No" + } + ], + "title": "Mail available", + "type": "object" + }, + "type": "input" + }, + "search-email-gateway": { + "active": false, + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Search email gateway", + "next": { + "extract-iocs": "" + }, + "order": 4, + "type": "task" + } + } + } + }, + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + } + } + } + } + } + }, + "/tickets/{id}/playbooks/{playbookID}/task/{taskID}/run": { + "post": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Run ticket playbook task", + "operationId": "runTask", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8123, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "phishing", + "description": "Playbook ID", + "name": "playbookID", + "in": "path", + "required": true + }, + { + "type": "string", + "x-example": "board", + "description": "Task ID", + "name": "taskID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + }, + "/tickets/{id}/references": { + "put": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Set ticket references", + "operationId": "setReferences", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8125, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": [ + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "description": "All ticket references", + "name": "references", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8125, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "phishing from selenafadel@von.com detected", + "owner": "demo", + "references": [ + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "tickets": [ + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + ], + "type": "alert" + } + } + } + } + } + }, + "/tickets/{id}/schema": { + "put": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Set ticket schema", + "operationId": "setSchema", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8125, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": "{}", + "description": "New ticket schema", + "name": "schema", + "in": "body", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8125, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "phishing from selenafadel@von.com detected", + "owner": "demo", + "references": [ + { + "href": "https://www.seniorleading-edge.name/users/efficient", + "name": "recovery" + }, + { + "href": "http://www.dynamicseamless.com/clicks-and-mortar", + "name": "force" + }, + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "tickets": [ + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + ], + "type": "alert" + } + } + } + } + } + }, + "/tickets/{id}/tickets": { + "delete": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Unlink an ticket to an ticket", + "operationId": "unlinkTicket", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8126, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": 8125, + "description": "Added ticket ID", + "name": "linkedID", + "in": "body", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + } + } + } + }, + "patch": { + "security": [ + { + "roles": [ + "ticket:write" + ] + } + ], + "tags": [ + "tickets" + ], + "summary": "Link an ticket to an ticket", + "operationId": "linkTicket", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-example": 8126, + "description": "Ticket ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": 8123, + "description": "Added ticket ID", + "name": "linkedID", + "in": "body", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketResponse" + }, + "examples": { + "test": { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8126, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "Surfaceintroduce virus detected", + "owner": "demo", + "references": [ + { + "href": "http://www.centralworld-class.io/synthesize", + "name": "university" + }, + { + "href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", + "name": "goal" + }, + { + "href": "http://www.chiefsyndicate.io/action-items", + "name": "unemployment" + } + ], + "schema": "{}", + "status": "closed", + "tickets": [ + { + "artifacts": [ + { + "name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", + "status": "unknown" + }, + { + "name": "http://www.customerviral.io/scalable/vertical/killer", + "status": "clean" + }, + { + "name": "leadreintermediate.io", + "status": "malicious" + } + ], + "created": "2021-10-02T18:04:59.078206+02:00", + "id": 8123, + "modified": "2021-10-02T18:04:59.078206+02:00", + "name": "live zebra", + "owner": "demo", + "playbooks": { + "phishing": { + "name": "Phishing", + "tasks": { + "block-iocs": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block IOCs", + "type": "task" + }, + "block-sender": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Block sender", + "next": { + "extract-iocs": "" + }, + "type": "task" + }, + "board": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Board Involvement?", + "next": { + "escalate": "boardInvolved == true", + "mail-available": "boardInvolved == false" + }, + "schema": { + "properties": { + "boardInvolved": { + "default": false, + "title": "A board member is involved.", + "type": "boolean" + } + }, + "required": [ + "boardInvolved" + ], + "title": "Board Involvement?", + "type": "object" + }, + "type": "input" + }, + "escalate": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Escalate to CISO", + "type": "task" + }, + "extract-iocs": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Extract IOCs", + "next": { + "block-iocs": "" + }, + "schema": { + "properties": { + "iocs": { + "items": { + "type": "string" + }, + "title": "IOCs", + "type": "array" + } + }, + "title": "Extract IOCs", + "type": "object" + }, + "type": "input" + }, + "mail-available": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Mail available", + "next": { + "block-sender": "schemaKey == 'yes'", + "extract-iocs": "schemaKey == 'yes'", + "search-email-gateway": "schemaKey == 'no'" + }, + "schema": { + "oneOf": [ + { + "properties": { + "mail": { + "title": "Mail", + "type": "string", + "x-display": "textarea" + }, + "schemaKey": { + "const": "yes", + "type": "string" + } + }, + "required": [ + "mail" + ], + "title": "Yes" + }, + { + "properties": { + "schemaKey": { + "const": "no", + "type": "string" + } + }, + "title": "No" + } + ], + "title": "Mail available", + "type": "object" + }, + "type": "input" + }, + "search-email-gateway": { + "created": "2021-10-02T18:04:59.078186+02:00", + "done": false, + "name": "Search email gateway", + "next": { + "extract-iocs": "" + }, + "type": "task" + } + } + } + }, + "references": [ + { + "href": "https://www.leadmaximize.net/e-services/back-end", + "name": "performance" + }, + { + "href": "http://www.corporateinteractive.name/rich", + "name": "autumn" + }, + { + "href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", + "name": "suggest" + } + ], + "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", + "status": "closed", + "type": "incident" + }, + { + "created": "2021-10-02T18:04:59.078186+02:00", + "id": 8125, + "modified": "2021-10-02T18:04:59.078186+02:00", + "name": "phishing from selenafadel@von.com detected", + "owner": "demo", + "references": [ + { + "href": "https://www.seniorleading-edge.name/users/efficient", + "name": "recovery" + }, + { + "href": "http://www.dynamicseamless.com/clicks-and-mortar", + "name": "force" + }, + { + "href": "http://www.leadscalable.biz/envisioneer", + "name": "fund" + } + ], + "schema": "{}", + "status": "closed", + "type": "alert" + } + ], + "type": "alert" + } + } + } + } + } + }, + "/tickettypes": { + "get": { + "security": [ + { + "roles": [ + "tickettype:read" + ] + } + ], + "tags": [ + "tickettypes" + ], + "summary": "List tickettypes", + "operationId": "listTicketTypes", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TicketTypeResponse" + } + }, + "examples": { + "test": [ + { + "default_playbooks": [], + "default_template": "default", + "icon": "mdi-alert", + "id": "alert", + "name": "Alerts" + }, + { + "default_playbooks": [], + "default_template": "default", + "icon": "mdi-radioactive", + "id": "incident", + "name": "Incidents" + }, + { + "default_playbooks": [], + "default_template": "default", + "icon": "mdi-fingerprint", + "id": "investigation", + "name": "Forensic Investigations" + }, + { + "default_playbooks": [], + "default_template": "default", + "icon": "mdi-target", + "id": "hunt", + "name": "Threat Hunting" + } + ] + } + } + } + }, + "post": { + "security": [ + { + "roles": [ + "tickettype:write" + ] + } + ], + "tags": [ + "tickettypes" + ], + "summary": "Create a new tickettype", + "operationId": "createTicketType", + "parameters": [ + { + "x-example": { + "default_playbooks": [], + "default_template": "default", + "icon": "mdi-newspaper-variant-outline", + "name": "TI Tickets" + }, + "description": "New tickettype", + "name": "tickettype", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/TicketTypeForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketTypeResponse" + }, + "examples": { + "test": { + "default_playbooks": [], + "default_template": "default", + "icon": "mdi-newspaper-variant-outline", + "id": "ti-tickets", + "name": "TI Tickets" + } + } + } + } + } + }, + "/tickettypes/{id}": { + "get": { + "security": [ + { + "roles": [ + "tickettype:read" + ] + } + ], + "tags": [ + "tickettypes" + ], + "summary": "Get a single tickettype", + "operationId": "getTicketType", + "parameters": [ + { + "type": "string", + "x-example": "alert", + "description": "TicketType ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketTypeResponse" + }, + "examples": { + "test": { + "default_playbooks": [], + "default_template": "default", + "icon": "mdi-alert", + "id": "alert", + "name": "Alerts" + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "tickettype:write" + ] + } + ], + "tags": [ + "tickettypes" + ], + "summary": "Update an existing tickettype", + "operationId": "updateTicketType", + "parameters": [ + { + "type": "string", + "x-example": "alert", + "description": "TicketType ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "default_playbooks": [], + "default_template": "default", + "icon": "mdi-bell", + "id": "alert", + "name": "Alerts" + }, + "description": "TicketType object that needs to be added", + "name": "tickettype", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/TicketTypeForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/TicketTypeResponse" + }, + "examples": { + "test": { + "default_playbooks": [], + "default_template": "default", + "icon": "mdi-bell", + "id": "alert", + "name": "Alerts" + } + } + } + } + }, + "delete": { + "security": [ + { + "roles": [ + "tickettype:write" + ] + } + ], + "tags": [ + "tickettypes" + ], + "summary": "Delete a tickettype", + "operationId": "deleteTicketType", + "parameters": [ + { + "type": "string", + "x-example": "alert", + "description": "TicketType ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + }, + "/userdata": { + "get": { + "security": [ + { + "roles": [ + "userdata:read" + ] + } + ], + "tags": [ + "userdata" + ], + "summary": "List userdata", + "operationId": "listUserData", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/UserDataResponse" + } + }, + "examples": { + "test": [ + { + "email": "bob@example.org", + "id": "bob", + "name": "Bob Bad" + } + ] + } + } + } + } + }, + "/userdata/{id}": { + "get": { + "security": [ + { + "roles": [ + "userdata:read" + ] + } + ], + "tags": [ + "userdata" + ], + "summary": "Get a single user data", + "operationId": "getUserData", + "parameters": [ + { + "type": "string", + "x-example": "bob", + "description": "User Data ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/UserDataResponse" + }, + "examples": { + "test": { + "email": "bob@example.org", + "id": "bob", + "name": "Bob Bad" + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "userdata:write" + ] + } + ], + "tags": [ + "userdata" + ], + "summary": "Update an existing user data", + "operationId": "updateUserData", + "parameters": [ + { + "type": "string", + "x-example": "bob", + "description": "User Data ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "blocked": false, + "email": "bob@example.org", + "name": "Bob Bad" + }, + "description": "User data object that needs to be added", + "name": "userdata", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UserData" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/UserDataResponse" + }, + "examples": { + "test": { + "email": "bob@example.org", + "id": "bob", + "name": "Bob Bad" + } + } + } + } + } + }, + "/users": { + "get": { + "security": [ + { + "roles": [ + "user:read" + ] + } + ], + "tags": [ + "users" + ], + "summary": "List users", + "operationId": "listUsers", + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/UserResponse" + } + }, + "examples": { + "test": [ + { + "apikey": false, + "blocked": false, + "id": "bob", + "roles": [ + "admin:backup:read", + "admin:backup:restore", + "admin:group:write", + "admin:job:read", + "admin:job:write", + "admin:log:read", + "admin:ticket:delete", + "admin:user:write", + "admin:userdata:read", + "admin:userdata:write", + "analyst:automation:read", + "analyst:currentsettings:write", + "analyst:currentuser:read", + "analyst:currentuserdata:read", + "analyst:file", + "analyst:group:read", + "analyst:playbook:read", + "analyst:rule:read", + "analyst:settings:read", + "analyst:template:read", + "analyst:ticket:read", + "analyst:ticket:write", + "analyst:tickettype:read", + "analyst:user:read", + "engineer:automation:write", + "engineer:playbook:write", + "engineer:rule:write", + "engineer:template:write", + "engineer:tickettype:write" + ] + }, + { + "apikey": true, + "blocked": false, + "id": "script", + "roles": [ + "analyst:automation:read", + "analyst:currentsettings:write", + "analyst:currentuser:read", + "analyst:currentuserdata:read", + "analyst:file", + "analyst:group:read", + "analyst:playbook:read", + "analyst:rule:read", + "analyst:settings:read", + "analyst:template:read", + "analyst:ticket:read", + "analyst:ticket:write", + "analyst:tickettype:read", + "analyst:user:read", + "engineer:automation:write", + "engineer:playbook:write", + "engineer:rule:write", + "engineer:template:write", + "engineer:tickettype:write" + ] + } + ] + } + } + } + }, + "post": { + "security": [ + { + "roles": [ + "user:write" + ] + } + ], + "tags": [ + "users" + ], + "summary": "Create user", + "operationId": "createUser", + "parameters": [ + { + "x-example": { + "id": "syncscript", + "roles": [ + "analyst" + ] + }, + "description": "user object that needs to be added", + "name": "user", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UserForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/NewUserResponse" + }, + "examples": { + "test": { + "blocked": false, + "id": "syncscript", + "roles": [ + "analyst:automation:read", + "analyst:currentsettings:write", + "analyst:currentuser:read", + "analyst:currentuserdata:read", + "analyst:file", + "analyst:group:read", + "analyst:playbook:read", + "analyst:rule:read", + "analyst:settings:read", + "analyst:template:read", + "analyst:ticket:read", + "analyst:ticket:write", + "analyst:tickettype:read", + "analyst:user:read" + ], + "secret": "v39bOuobnlEljfWzjAgoKzhmnh1xSMxH" + } + } + } + } + } + }, + "/users/{id}": { + "get": { + "security": [ + { + "roles": [ + "user:read" + ] + } + ], + "tags": [ + "users" + ], + "summary": "Get a single user", + "operationId": "getUser", + "parameters": [ + { + "type": "string", + "x-example": "script", + "description": "user ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/UserResponse" + }, + "examples": { + "test": { + "apikey": true, + "blocked": false, + "id": "script", + "roles": [ + "analyst:automation:read", + "analyst:currentsettings:write", + "analyst:currentuser:read", + "analyst:currentuserdata:read", + "analyst:file", + "analyst:group:read", + "analyst:playbook:read", + "analyst:rule:read", + "analyst:settings:read", + "analyst:template:read", + "analyst:ticket:read", + "analyst:ticket:write", + "analyst:tickettype:read", + "analyst:user:read", + "engineer:automation:write", + "engineer:playbook:write", + "engineer:rule:write", + "engineer:template:write", + "engineer:tickettype:write" + ] + } + } + } + } + }, + "put": { + "security": [ + { + "roles": [ + "user:write" + ] + } + ], + "tags": [ + "users" + ], + "summary": "Update user", + "operationId": "updateUser", + "parameters": [ + { + "type": "string", + "x-example": "bob", + "description": "Template ID", + "name": "id", + "in": "path", + "required": true + }, + { + "x-example": { + "roles": [ + "analyst", + "admin" + ] + }, + "description": "user object that needs to be added", + "name": "user", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UserForm" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/UserResponse" + }, + "examples": { + "test": { + "apikey": false, + "blocked": false, + "id": "bob", + "roles": [ + "admin:backup:read", + "admin:backup:restore", + "admin:group:write", + "admin:job:read", + "admin:job:write", + "admin:log:read", + "admin:ticket:delete", + "admin:user:write", + "admin:userdata:read", + "admin:userdata:write", + "analyst:automation:read", + "analyst:currentsettings:write", + "analyst:currentuser:read", + "analyst:currentuserdata:read", + "analyst:file", + "analyst:group:read", + "analyst:playbook:read", + "analyst:rule:read", + "analyst:settings:read", + "analyst:template:read", + "analyst:ticket:read", + "analyst:ticket:write", + "analyst:tickettype:read", + "analyst:user:read", + "engineer:automation:write", + "engineer:playbook:write", + "engineer:rule:write", + "engineer:template:write", + "engineer:tickettype:write" + ] + } + } + } + } + }, + "delete": { + "security": [ + { + "roles": [ + "user:write" + ] + } + ], + "tags": [ + "users" + ], + "summary": "Delete user", + "operationId": "deleteUser", + "parameters": [ + { + "type": "string", + "x-example": "script", + "description": "user ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "successful operation" + } + } + } + } + }, + "definitions": { + "Artifact": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "enrichments": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Enrichment" + } + }, + "name": { + "type": "string", + "example": "2.2.2.2" + }, + "status": { + "type": "string", + "example": "Unknown" + }, + "type": { + "type": "string" + } + } + }, + "ArtifactOrigin": { + "type": "object", + "required": [ + "ticket_id", + "artifact" + ], + "properties": { + "artifact": { + "type": "string" + }, + "ticket_id": { + "type": "integer", + "format": "int64" + } + } + }, + "Automation": { + "type": "object", + "required": [ + "image", + "script", + "type" + ], + "properties": { + "image": { + "type": "string" + }, + "schema": { + "type": "string", + "example": "{}" + }, + "script": { + "type": "string" + }, + "type": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "artifact", + "playbook", + "global" + ] + } + } + } + }, + "AutomationForm": { + "type": "object", + "required": [ + "id", + "image", + "script", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "image": { + "type": "string" + }, + "schema": { + "type": "string", + "example": "{}" + }, + "script": { + "type": "string" + }, + "type": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "artifact", + "playbook", + "global" + ] + } + } + } + }, + "AutomationResponse": { + "type": "object", + "required": [ + "id", + "image", + "script", + "type" + ], + "properties": { + "id": { + "type": "string" + }, + "image": { + "type": "string" + }, + "schema": { + "type": "string", + "example": "{}" + }, + "script": { + "type": "string" + }, + "type": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "artifact", + "playbook", + "global" + ] + } + } + } + }, + "Comment": { + "type": "object", + "required": [ + "creator", + "created", + "message" + ], + "properties": { + "created": { + "type": "string", + "format": "date-time" + }, + "creator": { + "type": "string" + }, + "message": { + "type": "string" + } + } + }, + "CommentForm": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "created": { + "type": "string", + "format": "date-time" + }, + "creator": { + "type": "string" + }, + "message": { + "type": "string" + } + } + }, + "Context": { + "type": "object", + "properties": { + "artifact": { + "$ref": "#/definitions/Artifact" + }, + "playbook": { + "$ref": "#/definitions/PlaybookResponse" + }, + "task": { + "$ref": "#/definitions/TaskResponse" + }, + "ticket": { + "$ref": "#/definitions/TicketResponse" + } + } + }, + "Enrichment": { + "type": "object", + "required": [ + "name", + "data", + "created" + ], + "properties": { + "created": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "data": { + "type": "object", + "example": { + "hash": "b7a067a742c20d07a7456646de89bc2d408a1153" + } + }, + "name": { + "type": "string", + "example": "hash.sha1" + } + } + }, + "EnrichmentForm": { + "type": "object", + "required": [ + "name", + "data" + ], + "properties": { + "data": { + "type": "object", + "example": { + "hash": "b7a067a742c20d07a7456646de89bc2d408a1153" + } + }, + "name": { + "type": "string", + "example": "hash.sha1" + } + } + }, + "File": { + "type": "object", + "required": [ + "key", + "name" + ], + "properties": { + "key": { + "type": "string", + "example": "myfile" + }, + "name": { + "type": "string", + "example": "notes.docx" + } + } + }, + "Job": { + "type": "object", + "required": [ + "automation", + "running", + "status" + ], + "properties": { + "automation": { + "type": "string" + }, + "container": { + "type": "string" + }, + "log": { + "type": "string" + }, + "origin": { + "$ref": "#/definitions/Origin" + }, + "output": { + "type": "object" + }, + "payload": {}, + "running": { + "type": "boolean" + }, + "status": { + "type": "string" + } + } + }, + "JobForm": { + "type": "object", + "required": [ + "automation" + ], + "properties": { + "automation": { + "type": "string" + }, + "origin": { + "$ref": "#/definitions/Origin" + }, + "payload": {} + } + }, + "JobResponse": { + "type": "object", + "required": [ + "id", + "automation", + "status" + ], + "properties": { + "automation": { + "type": "string" + }, + "container": { + "type": "string" + }, + "id": { + "type": "string" + }, + "log": { + "type": "string" + }, + "origin": { + "$ref": "#/definitions/Origin" + }, + "output": { + "type": "object" + }, + "payload": {}, + "status": { + "type": "string" + } + } + }, + "LogEntry": { + "type": "object", + "required": [ + "reference", + "creator", + "created", + "message" + ], + "properties": { + "created": { + "type": "string", + "format": "date-time" + }, + "creator": { + "type": "string" + }, + "message": { + "type": "string" + }, + "reference": { + "type": "string" + } + } + }, + "Message": { + "type": "object", + "properties": { + "context": { + "$ref": "#/definitions/Context" + }, + "payload": { + "type": "object" + }, + "secrets": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "NewUserResponse": { + "type": "object", + "required": [ + "id", + "blocked", + "roles" + ], + "properties": { + "blocked": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "type": "string" + } + }, + "secret": { + "type": "string" + } + } + }, + "Origin": { + "type": "object", + "properties": { + "artifact_origin": { + "$ref": "#/definitions/ArtifactOrigin" + }, + "task_origin": { + "$ref": "#/definitions/TaskOrigin" + } + } + }, + "Playbook": { + "type": "object", + "required": [ + "name", + "tasks" + ], + "properties": { + "name": { + "type": "string", + "example": "Phishing" + }, + "tasks": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Task" + } + } + } + }, + "PlaybookResponse": { + "type": "object", + "required": [ + "name", + "tasks" + ], + "properties": { + "name": { + "type": "string", + "example": "Phishing" + }, + "tasks": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/TaskResponse" + } + } + } + }, + "PlaybookTemplate": { + "type": "object", + "required": [ + "name", + "yaml" + ], + "properties": { + "name": { + "type": "string" + }, + "yaml": { + "type": "string" + } + } + }, + "PlaybookTemplateForm": { + "type": "object", + "required": [ + "yaml" + ], + "properties": { + "id": { + "type": "string" + }, + "yaml": { + "type": "string" + } + } + }, + "PlaybookTemplateResponse": { + "type": "object", + "required": [ + "id", + "name", + "yaml" + ], + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "yaml": { + "type": "string" + } + } + }, + "Reference": { + "type": "object", + "required": [ + "name", + "href" + ], + "properties": { + "href": { + "type": "string", + "example": "https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2017-0144" + }, + "name": { + "type": "string", + "example": "CVE-2017-0144" + } + } + }, + "Settings": { + "type": "object", + "required": [ + "version", + "tier", + "timeformat", + "ticketTypes", + "artifactStates" + ], + "properties": { + "artifactStates": { + "type": "array", + "title": "Artifact States", + "items": { + "$ref": "#/definitions/Type" + } + }, + "roles": { + "type": "array", + "title": "Roles", + "items": { + "type": "string" + } + }, + "ticketTypes": { + "type": "array", + "title": "Ticket Types", + "items": { + "$ref": "#/definitions/TicketTypeResponse" + } + }, + "tier": { + "type": "string", + "title": "Tier", + "enum": [ + "community", + "enterprise" + ] + }, + "timeformat": { + "type": "string", + "title": "Time Format" + }, + "version": { + "type": "string", + "title": "Version" + } + } + }, + "Statistics": { + "type": "object", + "required": [ + "unassigned", + "open_tickets_per_user", + "tickets_per_week", + "tickets_per_type" + ], + "properties": { + "open_tickets_per_user": { + "type": "object", + "additionalProperties": { + "type": "integer" + } + }, + "tickets_per_type": { + "type": "object", + "additionalProperties": { + "type": "integer" + } + }, + "tickets_per_week": { + "type": "object", + "additionalProperties": { + "type": "integer" + } + }, + "unassigned": { + "type": "integer" + } + } + }, + "Task": { + "type": "object", + "required": [ + "name", + "type", + "done", + "created" + ], + "properties": { + "automation": { + "type": "string" + }, + "closed": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "created": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "data": { + "type": "object" + }, + "done": { + "type": "boolean" + }, + "join": { + "type": "boolean", + "example": false + }, + "name": { + "type": "string", + "example": "Inform user" + }, + "next": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "owner": { + "type": "string" + }, + "payload": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "schema": { + "type": "object" + }, + "type": { + "type": "string", + "enum": [ + "task", + "input", + "automation" + ], + "example": "task" + } + } + }, + "TaskForm": { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "automation": { + "type": "string" + }, + "closed": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "created": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "data": { + "type": "object" + }, + "done": { + "type": "boolean" + }, + "join": { + "type": "boolean", + "example": false + }, + "name": { + "type": "string", + "example": "Inform user" + }, + "next": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "owner": { + "type": "string" + }, + "payload": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "schema": { + "type": "object" + }, + "type": { + "type": "string", + "enum": [ + "task", + "input", + "automation" + ], + "example": "task" + } + } + }, + "TaskOrigin": { + "type": "object", + "required": [ + "ticket_id", + "playbook_id", + "task_id" + ], + "properties": { + "playbook_id": { + "type": "string" + }, + "task_id": { + "type": "string" + }, + "ticket_id": { + "type": "integer", + "format": "int64" + } + } + }, + "TaskResponse": { + "type": "object", + "required": [ + "name", + "type", + "done", + "created", + "order", + "active" + ], + "properties": { + "active": { + "type": "boolean", + "example": false + }, + "automation": { + "type": "string" + }, + "closed": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "created": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "data": { + "type": "object" + }, + "done": { + "type": "boolean" + }, + "join": { + "type": "boolean", + "example": false + }, + "name": { + "type": "string", + "example": "Inform user" + }, + "next": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "order": { + "type": "number", + "format": "int64", + "example": 2 + }, + "owner": { + "type": "string" + }, + "payload": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "schema": { + "type": "object" + }, + "type": { + "type": "string", + "enum": [ + "task", + "input", + "automation" + ], + "example": "task" + } + } + }, + "TaskWithContext": { + "type": "object", + "required": [ + "ticket_id", + "ticket_name", + "playbook_id", + "playbook_name", + "task_id", + "task" + ], + "properties": { + "playbook_id": { + "type": "string" + }, + "playbook_name": { + "type": "string" + }, + "task": { + "$ref": "#/definitions/TaskResponse" + }, + "task_id": { + "type": "string" + }, + "ticket_id": { + "type": "number", + "format": "int64" + }, + "ticket_name": { + "type": "string" + } + } + }, + "Ticket": { + "type": "object", + "required": [ + "name", + "type", + "status", + "created", + "modified", + "schema" + ], + "properties": { + "artifacts": { + "type": "array", + "items": { + "$ref": "#/definitions/Artifact" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/definitions/Comment" + } + }, + "created": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "details": { + "type": "object", + "example": { + "description": "my little incident" + } + }, + "files": { + "type": "array", + "items": { + "$ref": "#/definitions/File" + } + }, + "modified": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "name": { + "type": "string", + "example": "WannyCry" + }, + "owner": { + "type": "string", + "example": "bob" + }, + "playbooks": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Playbook" + } + }, + "read": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "bob" + ] + }, + "references": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + }, + "schema": { + "type": "string", + "example": "{}" + }, + "status": { + "type": "string", + "example": "open" + }, + "type": { + "type": "string", + "example": "incident" + }, + "write": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "alice" + ] + } + } + }, + "TicketForm": { + "type": "object", + "required": [ + "name", + "type", + "status" + ], + "properties": { + "artifacts": { + "type": "array", + "items": { + "$ref": "#/definitions/Artifact" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/definitions/Comment" + } + }, + "created": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "details": { + "type": "object", + "example": { + "description": "my little incident" + } + }, + "files": { + "type": "array", + "items": { + "$ref": "#/definitions/File" + } + }, + "id": { + "type": "integer", + "format": "int64", + "example": 123 + }, + "modified": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "name": { + "type": "string", + "example": "WannyCry" + }, + "owner": { + "type": "string", + "example": "bob" + }, + "playbooks": { + "type": "array", + "items": { + "$ref": "#/definitions/PlaybookTemplateForm" + } + }, + "read": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "bob" + ] + }, + "references": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + }, + "schema": { + "type": "string", + "example": "{}" + }, + "status": { + "type": "string", + "example": "open" + }, + "type": { + "type": "string", + "example": "incident" + }, + "write": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "alice" + ] + } + } + }, + "TicketList": { + "type": "object", + "required": [ + "tickets", + "count" + ], + "properties": { + "count": { + "type": "number", + "example": 3 + }, + "tickets": { + "type": "array", + "items": { + "$ref": "#/definitions/TicketSimpleResponse" + } + } + } + }, + "TicketResponse": { + "type": "object", + "required": [ + "id", + "name", + "type", + "status", + "created", + "modified", + "schema" + ], + "properties": { + "artifacts": { + "type": "array", + "items": { + "$ref": "#/definitions/Artifact" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/definitions/Comment" + } + }, + "created": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "details": { + "type": "object", + "example": { + "description": "my little incident" + } + }, + "files": { + "type": "array", + "items": { + "$ref": "#/definitions/File" + } + }, + "id": { + "type": "integer", + "format": "int64", + "example": 123 + }, + "modified": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "name": { + "type": "string", + "example": "WannyCry" + }, + "owner": { + "type": "string", + "example": "bob" + }, + "playbooks": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/PlaybookResponse" + } + }, + "read": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "bob" + ] + }, + "references": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + }, + "schema": { + "type": "string", + "example": "{}" + }, + "status": { + "type": "string", + "example": "open" + }, + "type": { + "type": "string", + "example": "incident" + }, + "write": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "alice" + ] + } + } + }, + "TicketSimpleResponse": { + "type": "object", + "required": [ + "id", + "name", + "type", + "status", + "created", + "modified", + "schema" + ], + "properties": { + "artifacts": { + "type": "array", + "items": { + "$ref": "#/definitions/Artifact" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/definitions/Comment" + } + }, + "created": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "details": { + "type": "object", + "example": { + "description": "my little incident" + } + }, + "files": { + "type": "array", + "items": { + "$ref": "#/definitions/File" + } + }, + "id": { + "type": "integer", + "format": "int64", + "example": 123 + }, + "modified": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "name": { + "type": "string", + "example": "WannyCry" + }, + "owner": { + "type": "string", + "example": "bob" + }, + "playbooks": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Playbook" + } + }, + "read": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "bob" + ] + }, + "references": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + }, + "schema": { + "type": "string", + "example": "{}" + }, + "status": { + "type": "string", + "example": "open" + }, + "type": { + "type": "string", + "example": "incident" + }, + "write": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "alice" + ] + } + } + }, + "TicketTemplate": { + "type": "object", + "required": [ + "name", + "schema" + ], + "properties": { + "name": { + "type": "string" + }, + "schema": { + "type": "string" + } + } + }, + "TicketTemplateForm": { + "type": "object", + "required": [ + "name", + "schema" + ], + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "schema": { + "type": "string" + } + } + }, + "TicketTemplateResponse": { + "type": "object", + "required": [ + "id", + "name", + "schema" + ], + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "schema": { + "type": "string" + } + } + }, + "TicketType": { + "type": "object", + "required": [ + "name", + "icon", + "default_template", + "default_playbooks" + ], + "properties": { + "default_groups": { + "type": "array", + "items": { + "type": "string" + } + }, + "default_playbooks": { + "type": "array", + "items": { + "type": "string" + } + }, + "default_template": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "TicketTypeForm": { + "type": "object", + "required": [ + "name", + "icon", + "default_template", + "default_playbooks" + ], + "properties": { + "default_groups": { + "type": "array", + "items": { + "type": "string" + } + }, + "default_playbooks": { + "type": "array", + "items": { + "type": "string" + } + }, + "default_template": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "TicketTypeResponse": { + "type": "object", + "required": [ + "id", + "name", + "icon", + "default_template", + "default_playbooks" + ], + "properties": { + "default_groups": { + "type": "array", + "items": { + "type": "string" + } + }, + "default_playbooks": { + "type": "array", + "items": { + "type": "string" + } + }, + "default_template": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "TicketWithTickets": { + "type": "object", + "required": [ + "id", + "name", + "type", + "status", + "created", + "modified", + "schema" + ], + "properties": { + "artifacts": { + "type": "array", + "items": { + "$ref": "#/definitions/Artifact" + } + }, + "comments": { + "type": "array", + "items": { + "$ref": "#/definitions/Comment" + } + }, + "created": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "details": { + "type": "object", + "example": { + "description": "my little incident" + } + }, + "files": { + "type": "array", + "items": { + "$ref": "#/definitions/File" + } + }, + "id": { + "type": "integer", + "format": "int64", + "example": 123 + }, + "modified": { + "type": "string", + "format": "date-time", + "example": "1985-04-12T23:20:50.52Z" + }, + "name": { + "type": "string", + "example": "WannyCry" + }, + "owner": { + "type": "string", + "example": "bob" + }, + "playbooks": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/PlaybookResponse" + } + }, + "read": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "bob" + ] + }, + "references": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + }, + "schema": { + "type": "string", + "example": "{}" + }, + "status": { + "type": "string", + "example": "open" + }, + "tickets": { + "type": "array", + "items": { + "$ref": "#/definitions/TicketSimpleResponse" + } + }, + "type": { + "type": "string", + "example": "incident" + }, + "write": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "alice" + ] + } + } + }, + "Type": { + "type": "object", + "required": [ + "id", + "name", + "icon" + ], + "properties": { + "color": { + "type": "string", + "title": "Color", + "enum": [ + "error", + "info", + "success", + "warning" + ], + "x-cols": 3 + }, + "icon": { + "type": "string", + "title": "Icon (https://materialdesignicons.com)", + "x-class": "pr-2", + "x-cols": 3 + }, + "id": { + "type": "string", + "title": "ID", + "x-class": "pr-2", + "x-cols": 3 + }, + "name": { + "type": "string", + "title": "Name", + "x-class": "pr-2", + "x-cols": 3 + } + } + }, + "User": { + "type": "object", + "required": [ + "blocked", + "apikey", + "roles" + ], + "properties": { + "apikey": { + "type": "boolean" + }, + "blocked": { + "type": "boolean" + }, + "roles": { + "type": "array", + "items": { + "type": "string" + } + }, + "sha256": { + "type": "string" + } + } + }, + "UserData": { + "type": "object", + "properties": { + "email": { + "type": "string", + "x-example": "bob@example.org" + }, + "image": { + "type": "string", + "x-display": "custom-avatar" + }, + "name": { + "type": "string", + "x-example": "Robert Smith" + }, + "timeformat": { + "type": "string", + "title": "Time Format (https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens)" + } + } + }, + "UserDataResponse": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "email": { + "type": "string", + "x-example": "bob@example.org" + }, + "id": { + "type": "string" + }, + "image": { + "type": "string", + "x-display": "custom-avatar" + }, + "name": { + "type": "string", + "x-example": "Robert Smith" + }, + "timeformat": { + "type": "string", + "title": "Time Format (https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens)" + } + } + }, + "UserForm": { + "type": "object", + "required": [ + "id", + "blocked", + "roles", + "apikey" + ], + "properties": { + "apikey": { + "type": "boolean" + }, + "blocked": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "UserResponse": { + "type": "object", + "required": [ + "id", + "blocked", + "roles", + "apikey" + ], + "properties": { + "apikey": { + "type": "boolean" + }, + "blocked": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } +}`)) +} diff --git a/generated/restapi/operations/automations/create_automation_parameters.go b/generated/restapi/operations/automations/create_automation_parameters.go new file mode 100644 index 0000000..2fb2634 --- /dev/null +++ b/generated/restapi/operations/automations/create_automation_parameters.go @@ -0,0 +1,90 @@ +package automations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// CreateAutomationEndpoint executes the core logic of the related +// route endpoint. +func CreateAutomationEndpoint(handler func(ctx context.Context, params *CreateAutomationParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewCreateAutomationParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewCreateAutomationParams creates a new CreateAutomationParams object +// with the default values initialized. +func NewCreateAutomationParams() *CreateAutomationParams { + var () + return &CreateAutomationParams{} +} + +// CreateAutomationParams contains all the bound params for the create automation operation +// typically these are obtained from a http.Request +// +// swagger:parameters createAutomation +type CreateAutomationParams struct { + + /*New automation + Required: true + In: body + */ + Automation *models.AutomationForm +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *CreateAutomationParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if runtime.HasBody(ctx.Request) { + var body models.AutomationForm + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("automation", "body", "")) + } else { + res = append(res, errors.NewParseError("automation", "body", "", err)) + } + + } else { + o.Automation = &body + } + } else { + res = append(res, errors.Required("automation", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/automations/delete_automation_parameters.go b/generated/restapi/operations/automations/delete_automation_parameters.go new file mode 100644 index 0000000..8aef194 --- /dev/null +++ b/generated/restapi/operations/automations/delete_automation_parameters.go @@ -0,0 +1,87 @@ +package automations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// DeleteAutomationEndpoint executes the core logic of the related +// route endpoint. +func DeleteAutomationEndpoint(handler func(ctx context.Context, params *DeleteAutomationParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewDeleteAutomationParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewDeleteAutomationParams creates a new DeleteAutomationParams object +// with the default values initialized. +func NewDeleteAutomationParams() *DeleteAutomationParams { + var () + return &DeleteAutomationParams{} +} + +// DeleteAutomationParams contains all the bound params for the delete automation operation +// typically these are obtained from a http.Request +// +// swagger:parameters deleteAutomation +type DeleteAutomationParams struct { + + /*Automation ID + Required: true + In: path + */ + ID string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *DeleteAutomationParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *DeleteAutomationParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.ID = raw + + return nil +} diff --git a/generated/restapi/operations/automations/get_automation_parameters.go b/generated/restapi/operations/automations/get_automation_parameters.go new file mode 100644 index 0000000..ff5907c --- /dev/null +++ b/generated/restapi/operations/automations/get_automation_parameters.go @@ -0,0 +1,87 @@ +package automations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// GetAutomationEndpoint executes the core logic of the related +// route endpoint. +func GetAutomationEndpoint(handler func(ctx context.Context, params *GetAutomationParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewGetAutomationParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewGetAutomationParams creates a new GetAutomationParams object +// with the default values initialized. +func NewGetAutomationParams() *GetAutomationParams { + var () + return &GetAutomationParams{} +} + +// GetAutomationParams contains all the bound params for the get automation operation +// typically these are obtained from a http.Request +// +// swagger:parameters getAutomation +type GetAutomationParams struct { + + /*Automation ID + Required: true + In: path + */ + ID string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *GetAutomationParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetAutomationParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.ID = raw + + return nil +} diff --git a/generated/restapi/operations/automations/list_automations_parameters.go b/generated/restapi/operations/automations/list_automations_parameters.go new file mode 100644 index 0000000..68673db --- /dev/null +++ b/generated/restapi/operations/automations/list_automations_parameters.go @@ -0,0 +1,55 @@ +package automations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// ListAutomationsEndpoint executes the core logic of the related +// route endpoint. +func ListAutomationsEndpoint(handler func(ctx context.Context) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + resp := handler(ctx) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewListAutomationsParams creates a new ListAutomationsParams object +// with the default values initialized. +func NewListAutomationsParams() *ListAutomationsParams { + var () + return &ListAutomationsParams{} +} + +// ListAutomationsParams contains all the bound params for the list automations operation +// typically these are obtained from a http.Request +// +// swagger:parameters listAutomations +type ListAutomationsParams struct { +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *ListAutomationsParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/automations/update_automation_parameters.go b/generated/restapi/operations/automations/update_automation_parameters.go new file mode 100644 index 0000000..785fe06 --- /dev/null +++ b/generated/restapi/operations/automations/update_automation_parameters.go @@ -0,0 +1,111 @@ +package automations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// UpdateAutomationEndpoint executes the core logic of the related +// route endpoint. +func UpdateAutomationEndpoint(handler func(ctx context.Context, params *UpdateAutomationParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewUpdateAutomationParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewUpdateAutomationParams creates a new UpdateAutomationParams object +// with the default values initialized. +func NewUpdateAutomationParams() *UpdateAutomationParams { + var () + return &UpdateAutomationParams{} +} + +// UpdateAutomationParams contains all the bound params for the update automation operation +// typically these are obtained from a http.Request +// +// swagger:parameters updateAutomation +type UpdateAutomationParams struct { + + /*Automation object that needs to be added + Required: true + In: body + */ + Automation *models.AutomationForm + /*Automation ID + Required: true + In: path + */ + ID string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *UpdateAutomationParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if runtime.HasBody(ctx.Request) { + var body models.AutomationForm + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("automation", "body", "")) + } else { + res = append(res, errors.NewParseError("automation", "body", "", err)) + } + + } else { + o.Automation = &body + } + } else { + res = append(res, errors.Required("automation", "body", "")) + } + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *UpdateAutomationParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.ID = raw + + return nil +} diff --git a/generated/restapi/operations/jobs/get_job_parameters.go b/generated/restapi/operations/jobs/get_job_parameters.go new file mode 100644 index 0000000..d51044c --- /dev/null +++ b/generated/restapi/operations/jobs/get_job_parameters.go @@ -0,0 +1,87 @@ +package jobs + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// GetJobEndpoint executes the core logic of the related +// route endpoint. +func GetJobEndpoint(handler func(ctx context.Context, params *GetJobParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewGetJobParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewGetJobParams creates a new GetJobParams object +// with the default values initialized. +func NewGetJobParams() *GetJobParams { + var () + return &GetJobParams{} +} + +// GetJobParams contains all the bound params for the get job operation +// typically these are obtained from a http.Request +// +// swagger:parameters getJob +type GetJobParams struct { + + /*Job ID + Required: true + In: path + */ + ID string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *GetJobParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetJobParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.ID = raw + + return nil +} diff --git a/generated/restapi/operations/jobs/list_jobs_parameters.go b/generated/restapi/operations/jobs/list_jobs_parameters.go new file mode 100644 index 0000000..ab90ddb --- /dev/null +++ b/generated/restapi/operations/jobs/list_jobs_parameters.go @@ -0,0 +1,55 @@ +package jobs + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// ListJobsEndpoint executes the core logic of the related +// route endpoint. +func ListJobsEndpoint(handler func(ctx context.Context) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + resp := handler(ctx) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewListJobsParams creates a new ListJobsParams object +// with the default values initialized. +func NewListJobsParams() *ListJobsParams { + var () + return &ListJobsParams{} +} + +// ListJobsParams contains all the bound params for the list jobs operation +// typically these are obtained from a http.Request +// +// swagger:parameters listJobs +type ListJobsParams struct { +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *ListJobsParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/jobs/run_job_parameters.go b/generated/restapi/operations/jobs/run_job_parameters.go new file mode 100644 index 0000000..5480d1d --- /dev/null +++ b/generated/restapi/operations/jobs/run_job_parameters.go @@ -0,0 +1,90 @@ +package jobs + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// RunJobEndpoint executes the core logic of the related +// route endpoint. +func RunJobEndpoint(handler func(ctx context.Context, params *RunJobParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewRunJobParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewRunJobParams creates a new RunJobParams object +// with the default values initialized. +func NewRunJobParams() *RunJobParams { + var () + return &RunJobParams{} +} + +// RunJobParams contains all the bound params for the run job operation +// typically these are obtained from a http.Request +// +// swagger:parameters runJob +type RunJobParams struct { + + /*New job + Required: true + In: body + */ + Job *models.JobForm +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *RunJobParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if runtime.HasBody(ctx.Request) { + var body models.JobForm + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("job", "body", "")) + } else { + res = append(res, errors.NewParseError("job", "body", "", err)) + } + + } else { + o.Job = &body + } + } else { + res = append(res, errors.Required("job", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/jobs/update_job_parameters.go b/generated/restapi/operations/jobs/update_job_parameters.go new file mode 100644 index 0000000..caeab53 --- /dev/null +++ b/generated/restapi/operations/jobs/update_job_parameters.go @@ -0,0 +1,111 @@ +package jobs + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// UpdateJobEndpoint executes the core logic of the related +// route endpoint. +func UpdateJobEndpoint(handler func(ctx context.Context, params *UpdateJobParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewUpdateJobParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewUpdateJobParams creates a new UpdateJobParams object +// with the default values initialized. +func NewUpdateJobParams() *UpdateJobParams { + var () + return &UpdateJobParams{} +} + +// UpdateJobParams contains all the bound params for the update job operation +// typically these are obtained from a http.Request +// +// swagger:parameters updateJob +type UpdateJobParams struct { + + /*Job ID + Required: true + In: path + */ + ID string + /*Job object that needs to be added + Required: true + In: body + */ + Job *models.Job +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *UpdateJobParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if runtime.HasBody(ctx.Request) { + var body models.Job + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("job", "body", "")) + } else { + res = append(res, errors.NewParseError("job", "body", "", err)) + } + + } else { + o.Job = &body + } + } else { + res = append(res, errors.Required("job", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *UpdateJobParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.ID = raw + + return nil +} diff --git a/generated/restapi/operations/logs/get_logs_parameters.go b/generated/restapi/operations/logs/get_logs_parameters.go new file mode 100644 index 0000000..29236d5 --- /dev/null +++ b/generated/restapi/operations/logs/get_logs_parameters.go @@ -0,0 +1,87 @@ +package logs + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// GetLogsEndpoint executes the core logic of the related +// route endpoint. +func GetLogsEndpoint(handler func(ctx context.Context, params *GetLogsParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewGetLogsParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewGetLogsParams creates a new GetLogsParams object +// with the default values initialized. +func NewGetLogsParams() *GetLogsParams { + var () + return &GetLogsParams{} +} + +// GetLogsParams contains all the bound params for the get logs operation +// typically these are obtained from a http.Request +// +// swagger:parameters getLogs +type GetLogsParams struct { + + /*Reference + Required: true + In: path + */ + Reference string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *GetLogsParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rReference := []string{ctx.Param("reference")} + if err := o.bindReference(rReference, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetLogsParams) bindReference(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.Reference = raw + + return nil +} diff --git a/generated/restapi/operations/playbooks/create_playbook_parameters.go b/generated/restapi/operations/playbooks/create_playbook_parameters.go new file mode 100644 index 0000000..1f80305 --- /dev/null +++ b/generated/restapi/operations/playbooks/create_playbook_parameters.go @@ -0,0 +1,90 @@ +package playbooks + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// CreatePlaybookEndpoint executes the core logic of the related +// route endpoint. +func CreatePlaybookEndpoint(handler func(ctx context.Context, params *CreatePlaybookParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewCreatePlaybookParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewCreatePlaybookParams creates a new CreatePlaybookParams object +// with the default values initialized. +func NewCreatePlaybookParams() *CreatePlaybookParams { + var () + return &CreatePlaybookParams{} +} + +// CreatePlaybookParams contains all the bound params for the create playbook operation +// typically these are obtained from a http.Request +// +// swagger:parameters createPlaybook +type CreatePlaybookParams struct { + + /*New playbook + Required: true + In: body + */ + Playbook *models.PlaybookTemplateForm +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *CreatePlaybookParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if runtime.HasBody(ctx.Request) { + var body models.PlaybookTemplateForm + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("playbook", "body", "")) + } else { + res = append(res, errors.NewParseError("playbook", "body", "", err)) + } + + } else { + o.Playbook = &body + } + } else { + res = append(res, errors.Required("playbook", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/playbooks/delete_playbook_parameters.go b/generated/restapi/operations/playbooks/delete_playbook_parameters.go new file mode 100644 index 0000000..ba16dd7 --- /dev/null +++ b/generated/restapi/operations/playbooks/delete_playbook_parameters.go @@ -0,0 +1,87 @@ +package playbooks + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// DeletePlaybookEndpoint executes the core logic of the related +// route endpoint. +func DeletePlaybookEndpoint(handler func(ctx context.Context, params *DeletePlaybookParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewDeletePlaybookParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewDeletePlaybookParams creates a new DeletePlaybookParams object +// with the default values initialized. +func NewDeletePlaybookParams() *DeletePlaybookParams { + var () + return &DeletePlaybookParams{} +} + +// DeletePlaybookParams contains all the bound params for the delete playbook operation +// typically these are obtained from a http.Request +// +// swagger:parameters deletePlaybook +type DeletePlaybookParams struct { + + /*Playbook name + Required: true + In: path + */ + ID string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *DeletePlaybookParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *DeletePlaybookParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.ID = raw + + return nil +} diff --git a/generated/restapi/operations/playbooks/get_playbook_parameters.go b/generated/restapi/operations/playbooks/get_playbook_parameters.go new file mode 100644 index 0000000..8aed8d2 --- /dev/null +++ b/generated/restapi/operations/playbooks/get_playbook_parameters.go @@ -0,0 +1,87 @@ +package playbooks + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// GetPlaybookEndpoint executes the core logic of the related +// route endpoint. +func GetPlaybookEndpoint(handler func(ctx context.Context, params *GetPlaybookParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewGetPlaybookParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewGetPlaybookParams creates a new GetPlaybookParams object +// with the default values initialized. +func NewGetPlaybookParams() *GetPlaybookParams { + var () + return &GetPlaybookParams{} +} + +// GetPlaybookParams contains all the bound params for the get playbook operation +// typically these are obtained from a http.Request +// +// swagger:parameters getPlaybook +type GetPlaybookParams struct { + + /*Playbook name + Required: true + In: path + */ + ID string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *GetPlaybookParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetPlaybookParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.ID = raw + + return nil +} diff --git a/generated/restapi/operations/playbooks/list_playbooks_parameters.go b/generated/restapi/operations/playbooks/list_playbooks_parameters.go new file mode 100644 index 0000000..d63dc77 --- /dev/null +++ b/generated/restapi/operations/playbooks/list_playbooks_parameters.go @@ -0,0 +1,55 @@ +package playbooks + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// ListPlaybooksEndpoint executes the core logic of the related +// route endpoint. +func ListPlaybooksEndpoint(handler func(ctx context.Context) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + resp := handler(ctx) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewListPlaybooksParams creates a new ListPlaybooksParams object +// with the default values initialized. +func NewListPlaybooksParams() *ListPlaybooksParams { + var () + return &ListPlaybooksParams{} +} + +// ListPlaybooksParams contains all the bound params for the list playbooks operation +// typically these are obtained from a http.Request +// +// swagger:parameters listPlaybooks +type ListPlaybooksParams struct { +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *ListPlaybooksParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/playbooks/update_playbook_parameters.go b/generated/restapi/operations/playbooks/update_playbook_parameters.go new file mode 100644 index 0000000..ae3d524 --- /dev/null +++ b/generated/restapi/operations/playbooks/update_playbook_parameters.go @@ -0,0 +1,111 @@ +package playbooks + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// UpdatePlaybookEndpoint executes the core logic of the related +// route endpoint. +func UpdatePlaybookEndpoint(handler func(ctx context.Context, params *UpdatePlaybookParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewUpdatePlaybookParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewUpdatePlaybookParams creates a new UpdatePlaybookParams object +// with the default values initialized. +func NewUpdatePlaybookParams() *UpdatePlaybookParams { + var () + return &UpdatePlaybookParams{} +} + +// UpdatePlaybookParams contains all the bound params for the update playbook operation +// typically these are obtained from a http.Request +// +// swagger:parameters updatePlaybook +type UpdatePlaybookParams struct { + + /*Playbook ID + Required: true + In: path + */ + ID string + /*Updated playbook + Required: true + In: body + */ + Playbook *models.PlaybookTemplateForm +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *UpdatePlaybookParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if runtime.HasBody(ctx.Request) { + var body models.PlaybookTemplateForm + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("playbook", "body", "")) + } else { + res = append(res, errors.NewParseError("playbook", "body", "", err)) + } + + } else { + o.Playbook = &body + } + } else { + res = append(res, errors.Required("playbook", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *UpdatePlaybookParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.ID = raw + + return nil +} diff --git a/generated/restapi/operations/settings/get_settings_parameters.go b/generated/restapi/operations/settings/get_settings_parameters.go new file mode 100644 index 0000000..a6f9a19 --- /dev/null +++ b/generated/restapi/operations/settings/get_settings_parameters.go @@ -0,0 +1,55 @@ +package settings + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// GetSettingsEndpoint executes the core logic of the related +// route endpoint. +func GetSettingsEndpoint(handler func(ctx context.Context) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + resp := handler(ctx) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewGetSettingsParams creates a new GetSettingsParams object +// with the default values initialized. +func NewGetSettingsParams() *GetSettingsParams { + var () + return &GetSettingsParams{} +} + +// GetSettingsParams contains all the bound params for the get settings operation +// typically these are obtained from a http.Request +// +// swagger:parameters getSettings +type GetSettingsParams struct { +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *GetSettingsParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/statistics/get_statistics_parameters.go b/generated/restapi/operations/statistics/get_statistics_parameters.go new file mode 100644 index 0000000..ae3626e --- /dev/null +++ b/generated/restapi/operations/statistics/get_statistics_parameters.go @@ -0,0 +1,55 @@ +package statistics + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// GetStatisticsEndpoint executes the core logic of the related +// route endpoint. +func GetStatisticsEndpoint(handler func(ctx context.Context) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + resp := handler(ctx) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewGetStatisticsParams creates a new GetStatisticsParams object +// with the default values initialized. +func NewGetStatisticsParams() *GetStatisticsParams { + var () + return &GetStatisticsParams{} +} + +// GetStatisticsParams contains all the bound params for the get statistics operation +// typically these are obtained from a http.Request +// +// swagger:parameters getStatistics +type GetStatisticsParams struct { +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *GetStatisticsParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/tasks/list_tasks_parameters.go b/generated/restapi/operations/tasks/list_tasks_parameters.go new file mode 100644 index 0000000..4fd738b --- /dev/null +++ b/generated/restapi/operations/tasks/list_tasks_parameters.go @@ -0,0 +1,55 @@ +package tasks + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// ListTasksEndpoint executes the core logic of the related +// route endpoint. +func ListTasksEndpoint(handler func(ctx context.Context) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + resp := handler(ctx) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewListTasksParams creates a new ListTasksParams object +// with the default values initialized. +func NewListTasksParams() *ListTasksParams { + var () + return &ListTasksParams{} +} + +// ListTasksParams contains all the bound params for the list tasks operation +// typically these are obtained from a http.Request +// +// swagger:parameters listTasks +type ListTasksParams struct { +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *ListTasksParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/templates/create_template_parameters.go b/generated/restapi/operations/templates/create_template_parameters.go new file mode 100644 index 0000000..4ba64e0 --- /dev/null +++ b/generated/restapi/operations/templates/create_template_parameters.go @@ -0,0 +1,90 @@ +package templates + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// CreateTemplateEndpoint executes the core logic of the related +// route endpoint. +func CreateTemplateEndpoint(handler func(ctx context.Context, params *CreateTemplateParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewCreateTemplateParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewCreateTemplateParams creates a new CreateTemplateParams object +// with the default values initialized. +func NewCreateTemplateParams() *CreateTemplateParams { + var () + return &CreateTemplateParams{} +} + +// CreateTemplateParams contains all the bound params for the create template operation +// typically these are obtained from a http.Request +// +// swagger:parameters createTemplate +type CreateTemplateParams struct { + + /*New template + Required: true + In: body + */ + Template *models.TicketTemplateForm +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *CreateTemplateParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if runtime.HasBody(ctx.Request) { + var body models.TicketTemplateForm + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("template", "body", "")) + } else { + res = append(res, errors.NewParseError("template", "body", "", err)) + } + + } else { + o.Template = &body + } + } else { + res = append(res, errors.Required("template", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/templates/delete_template_parameters.go b/generated/restapi/operations/templates/delete_template_parameters.go new file mode 100644 index 0000000..951de04 --- /dev/null +++ b/generated/restapi/operations/templates/delete_template_parameters.go @@ -0,0 +1,87 @@ +package templates + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// DeleteTemplateEndpoint executes the core logic of the related +// route endpoint. +func DeleteTemplateEndpoint(handler func(ctx context.Context, params *DeleteTemplateParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewDeleteTemplateParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewDeleteTemplateParams creates a new DeleteTemplateParams object +// with the default values initialized. +func NewDeleteTemplateParams() *DeleteTemplateParams { + var () + return &DeleteTemplateParams{} +} + +// DeleteTemplateParams contains all the bound params for the delete template operation +// typically these are obtained from a http.Request +// +// swagger:parameters deleteTemplate +type DeleteTemplateParams struct { + + /*Template ID + Required: true + In: path + */ + ID string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *DeleteTemplateParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *DeleteTemplateParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.ID = raw + + return nil +} diff --git a/generated/restapi/operations/templates/get_template_parameters.go b/generated/restapi/operations/templates/get_template_parameters.go new file mode 100644 index 0000000..44e7020 --- /dev/null +++ b/generated/restapi/operations/templates/get_template_parameters.go @@ -0,0 +1,87 @@ +package templates + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// GetTemplateEndpoint executes the core logic of the related +// route endpoint. +func GetTemplateEndpoint(handler func(ctx context.Context, params *GetTemplateParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewGetTemplateParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewGetTemplateParams creates a new GetTemplateParams object +// with the default values initialized. +func NewGetTemplateParams() *GetTemplateParams { + var () + return &GetTemplateParams{} +} + +// GetTemplateParams contains all the bound params for the get template operation +// typically these are obtained from a http.Request +// +// swagger:parameters getTemplate +type GetTemplateParams struct { + + /*Template ID + Required: true + In: path + */ + ID string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *GetTemplateParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetTemplateParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.ID = raw + + return nil +} diff --git a/generated/restapi/operations/templates/list_templates_parameters.go b/generated/restapi/operations/templates/list_templates_parameters.go new file mode 100644 index 0000000..2f2e255 --- /dev/null +++ b/generated/restapi/operations/templates/list_templates_parameters.go @@ -0,0 +1,55 @@ +package templates + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// ListTemplatesEndpoint executes the core logic of the related +// route endpoint. +func ListTemplatesEndpoint(handler func(ctx context.Context) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + resp := handler(ctx) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewListTemplatesParams creates a new ListTemplatesParams object +// with the default values initialized. +func NewListTemplatesParams() *ListTemplatesParams { + var () + return &ListTemplatesParams{} +} + +// ListTemplatesParams contains all the bound params for the list templates operation +// typically these are obtained from a http.Request +// +// swagger:parameters listTemplates +type ListTemplatesParams struct { +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *ListTemplatesParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/templates/update_template_parameters.go b/generated/restapi/operations/templates/update_template_parameters.go new file mode 100644 index 0000000..66fd60e --- /dev/null +++ b/generated/restapi/operations/templates/update_template_parameters.go @@ -0,0 +1,111 @@ +package templates + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// UpdateTemplateEndpoint executes the core logic of the related +// route endpoint. +func UpdateTemplateEndpoint(handler func(ctx context.Context, params *UpdateTemplateParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewUpdateTemplateParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewUpdateTemplateParams creates a new UpdateTemplateParams object +// with the default values initialized. +func NewUpdateTemplateParams() *UpdateTemplateParams { + var () + return &UpdateTemplateParams{} +} + +// UpdateTemplateParams contains all the bound params for the update template operation +// typically these are obtained from a http.Request +// +// swagger:parameters updateTemplate +type UpdateTemplateParams struct { + + /*Template ID + Required: true + In: path + */ + ID string + /*Template object that needs to be added + Required: true + In: body + */ + Template *models.TicketTemplateForm +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *UpdateTemplateParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if runtime.HasBody(ctx.Request) { + var body models.TicketTemplateForm + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("template", "body", "")) + } else { + res = append(res, errors.NewParseError("template", "body", "", err)) + } + + } else { + o.Template = &body + } + } else { + res = append(res, errors.Required("template", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *UpdateTemplateParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.ID = raw + + return nil +} diff --git a/generated/restapi/operations/tickets/add_artifact_parameters.go b/generated/restapi/operations/tickets/add_artifact_parameters.go new file mode 100644 index 0000000..60cbf17 --- /dev/null +++ b/generated/restapi/operations/tickets/add_artifact_parameters.go @@ -0,0 +1,116 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// AddArtifactEndpoint executes the core logic of the related +// route endpoint. +func AddArtifactEndpoint(handler func(ctx context.Context, params *AddArtifactParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewAddArtifactParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewAddArtifactParams creates a new AddArtifactParams object +// with the default values initialized. +func NewAddArtifactParams() *AddArtifactParams { + var () + return &AddArtifactParams{} +} + +// AddArtifactParams contains all the bound params for the add artifact operation +// typically these are obtained from a http.Request +// +// swagger:parameters addArtifact +type AddArtifactParams struct { + + /*Artifact object that needs to be added + Required: true + In: body + */ + Artifact *models.Artifact + /*Ticket ID + Required: true + In: path + */ + ID int64 +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *AddArtifactParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if runtime.HasBody(ctx.Request) { + var body models.Artifact + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("artifact", "body", "")) + } else { + res = append(res, errors.NewParseError("artifact", "body", "", err)) + } + + } else { + o.Artifact = &body + } + } else { + res = append(res, errors.Required("artifact", "body", "")) + } + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddArtifactParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} diff --git a/generated/restapi/operations/tickets/add_comment_parameters.go b/generated/restapi/operations/tickets/add_comment_parameters.go new file mode 100644 index 0000000..52608e2 --- /dev/null +++ b/generated/restapi/operations/tickets/add_comment_parameters.go @@ -0,0 +1,116 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// AddCommentEndpoint executes the core logic of the related +// route endpoint. +func AddCommentEndpoint(handler func(ctx context.Context, params *AddCommentParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewAddCommentParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewAddCommentParams creates a new AddCommentParams object +// with the default values initialized. +func NewAddCommentParams() *AddCommentParams { + var () + return &AddCommentParams{} +} + +// AddCommentParams contains all the bound params for the add comment operation +// typically these are obtained from a http.Request +// +// swagger:parameters addComment +type AddCommentParams struct { + + /*Ticket comment + Required: true + In: body + */ + Comment *models.CommentForm + /*Ticket ID + Required: true + In: path + */ + ID int64 +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *AddCommentParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if runtime.HasBody(ctx.Request) { + var body models.CommentForm + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("comment", "body", "")) + } else { + res = append(res, errors.NewParseError("comment", "body", "", err)) + } + + } else { + o.Comment = &body + } + } else { + res = append(res, errors.Required("comment", "body", "")) + } + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddCommentParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} diff --git a/generated/restapi/operations/tickets/add_ticket_playbook_parameters.go b/generated/restapi/operations/tickets/add_ticket_playbook_parameters.go new file mode 100644 index 0000000..261ea32 --- /dev/null +++ b/generated/restapi/operations/tickets/add_ticket_playbook_parameters.go @@ -0,0 +1,116 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// AddTicketPlaybookEndpoint executes the core logic of the related +// route endpoint. +func AddTicketPlaybookEndpoint(handler func(ctx context.Context, params *AddTicketPlaybookParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewAddTicketPlaybookParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewAddTicketPlaybookParams creates a new AddTicketPlaybookParams object +// with the default values initialized. +func NewAddTicketPlaybookParams() *AddTicketPlaybookParams { + var () + return &AddTicketPlaybookParams{} +} + +// AddTicketPlaybookParams contains all the bound params for the add ticket playbook operation +// typically these are obtained from a http.Request +// +// swagger:parameters addTicketPlaybook +type AddTicketPlaybookParams struct { + + /*Ticket ID + Required: true + In: path + */ + ID int64 + /*Ticket playbook object that needs to be added + Required: true + In: body + */ + Playbook *models.PlaybookTemplateForm +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *AddTicketPlaybookParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if runtime.HasBody(ctx.Request) { + var body models.PlaybookTemplateForm + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("playbook", "body", "")) + } else { + res = append(res, errors.NewParseError("playbook", "body", "", err)) + } + + } else { + o.Playbook = &body + } + } else { + res = append(res, errors.Required("playbook", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddTicketPlaybookParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} diff --git a/generated/restapi/operations/tickets/complete_task_parameters.go b/generated/restapi/operations/tickets/complete_task_parameters.go new file mode 100644 index 0000000..f53bb27 --- /dev/null +++ b/generated/restapi/operations/tickets/complete_task_parameters.go @@ -0,0 +1,157 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// CompleteTaskEndpoint executes the core logic of the related +// route endpoint. +func CompleteTaskEndpoint(handler func(ctx context.Context, params *CompleteTaskParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewCompleteTaskParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewCompleteTaskParams creates a new CompleteTaskParams object +// with the default values initialized. +func NewCompleteTaskParams() *CompleteTaskParams { + var () + return &CompleteTaskParams{} +} + +// CompleteTaskParams contains all the bound params for the complete task operation +// typically these are obtained from a http.Request +// +// swagger:parameters completeTask +type CompleteTaskParams struct { + + /*Ticket playbook object that needs to be added + Required: true + In: body + */ + Data interface{} + /*Ticket ID + Required: true + In: path + */ + ID int64 + /*Playbook ID + Required: true + In: path + */ + PlaybookID string + /*Task ID + Required: true + In: path + */ + TaskID string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *CompleteTaskParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if runtime.HasBody(ctx.Request) { + var body interface{} + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("data", "body", "")) + } else { + res = append(res, errors.NewParseError("data", "body", "", err)) + } + + } else { + o.Data = body + } + } else { + res = append(res, errors.Required("data", "body", "")) + } + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + rPlaybookID := []string{ctx.Param("playbookID")} + if err := o.bindPlaybookID(rPlaybookID, true); err != nil { + res = append(res, err) + } + + rTaskID := []string{ctx.Param("taskID")} + if err := o.bindTaskID(rTaskID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *CompleteTaskParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} + +func (o *CompleteTaskParams) bindPlaybookID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.PlaybookID = raw + + return nil +} + +func (o *CompleteTaskParams) bindTaskID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.TaskID = raw + + return nil +} diff --git a/generated/restapi/operations/tickets/create_ticket_batch_parameters.go b/generated/restapi/operations/tickets/create_ticket_batch_parameters.go new file mode 100644 index 0000000..56abf52 --- /dev/null +++ b/generated/restapi/operations/tickets/create_ticket_batch_parameters.go @@ -0,0 +1,90 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// CreateTicketBatchEndpoint executes the core logic of the related +// route endpoint. +func CreateTicketBatchEndpoint(handler func(ctx context.Context, params *CreateTicketBatchParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewCreateTicketBatchParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewCreateTicketBatchParams creates a new CreateTicketBatchParams object +// with the default values initialized. +func NewCreateTicketBatchParams() *CreateTicketBatchParams { + var () + return &CreateTicketBatchParams{} +} + +// CreateTicketBatchParams contains all the bound params for the create ticket batch operation +// typically these are obtained from a http.Request +// +// swagger:parameters createTicketBatch +type CreateTicketBatchParams struct { + + /*New ticket + Required: true + In: body + */ + Ticket []*models.TicketForm +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *CreateTicketBatchParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if runtime.HasBody(ctx.Request) { + var body []*models.TicketForm + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("ticket", "body", "")) + } else { + res = append(res, errors.NewParseError("ticket", "body", "", err)) + } + + } else { + o.Ticket = body + } + } else { + res = append(res, errors.Required("ticket", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/tickets/create_ticket_parameters.go b/generated/restapi/operations/tickets/create_ticket_parameters.go new file mode 100644 index 0000000..e5ec2fc --- /dev/null +++ b/generated/restapi/operations/tickets/create_ticket_parameters.go @@ -0,0 +1,90 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// CreateTicketEndpoint executes the core logic of the related +// route endpoint. +func CreateTicketEndpoint(handler func(ctx context.Context, params *CreateTicketParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewCreateTicketParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewCreateTicketParams creates a new CreateTicketParams object +// with the default values initialized. +func NewCreateTicketParams() *CreateTicketParams { + var () + return &CreateTicketParams{} +} + +// CreateTicketParams contains all the bound params for the create ticket operation +// typically these are obtained from a http.Request +// +// swagger:parameters createTicket +type CreateTicketParams struct { + + /*New ticket + Required: true + In: body + */ + Ticket *models.TicketForm +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *CreateTicketParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if runtime.HasBody(ctx.Request) { + var body models.TicketForm + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("ticket", "body", "")) + } else { + res = append(res, errors.NewParseError("ticket", "body", "", err)) + } + + } else { + o.Ticket = &body + } + } else { + res = append(res, errors.Required("ticket", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/tickets/delete_ticket_parameters.go b/generated/restapi/operations/tickets/delete_ticket_parameters.go new file mode 100644 index 0000000..77352e0 --- /dev/null +++ b/generated/restapi/operations/tickets/delete_ticket_parameters.go @@ -0,0 +1,92 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// DeleteTicketEndpoint executes the core logic of the related +// route endpoint. +func DeleteTicketEndpoint(handler func(ctx context.Context, params *DeleteTicketParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewDeleteTicketParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewDeleteTicketParams creates a new DeleteTicketParams object +// with the default values initialized. +func NewDeleteTicketParams() *DeleteTicketParams { + var () + return &DeleteTicketParams{} +} + +// DeleteTicketParams contains all the bound params for the delete ticket operation +// typically these are obtained from a http.Request +// +// swagger:parameters deleteTicket +type DeleteTicketParams struct { + + /*Ticket ID + Required: true + In: path + */ + ID int64 +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *DeleteTicketParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *DeleteTicketParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} diff --git a/generated/restapi/operations/tickets/enrich_artifact_parameters.go b/generated/restapi/operations/tickets/enrich_artifact_parameters.go new file mode 100644 index 0000000..e94aaef --- /dev/null +++ b/generated/restapi/operations/tickets/enrich_artifact_parameters.go @@ -0,0 +1,137 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// EnrichArtifactEndpoint executes the core logic of the related +// route endpoint. +func EnrichArtifactEndpoint(handler func(ctx context.Context, params *EnrichArtifactParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewEnrichArtifactParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewEnrichArtifactParams creates a new EnrichArtifactParams object +// with the default values initialized. +func NewEnrichArtifactParams() *EnrichArtifactParams { + var () + return &EnrichArtifactParams{} +} + +// EnrichArtifactParams contains all the bound params for the enrich artifact operation +// typically these are obtained from a http.Request +// +// swagger:parameters enrichArtifact +type EnrichArtifactParams struct { + + /* + Required: true + In: body + */ + Data *models.EnrichmentForm + /*Ticket ID + Required: true + In: path + */ + ID int64 + /* + Required: true + In: path + */ + Name string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *EnrichArtifactParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if runtime.HasBody(ctx.Request) { + var body models.EnrichmentForm + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("data", "body", "")) + } else { + res = append(res, errors.NewParseError("data", "body", "", err)) + } + + } else { + o.Data = &body + } + } else { + res = append(res, errors.Required("data", "body", "")) + } + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + rName := []string{ctx.Param("name")} + if err := o.bindName(rName, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *EnrichArtifactParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} + +func (o *EnrichArtifactParams) bindName(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.Name = raw + + return nil +} diff --git a/generated/restapi/operations/tickets/get_artifact_parameters.go b/generated/restapi/operations/tickets/get_artifact_parameters.go new file mode 100644 index 0000000..3329a11 --- /dev/null +++ b/generated/restapi/operations/tickets/get_artifact_parameters.go @@ -0,0 +1,113 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// GetArtifactEndpoint executes the core logic of the related +// route endpoint. +func GetArtifactEndpoint(handler func(ctx context.Context, params *GetArtifactParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewGetArtifactParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewGetArtifactParams creates a new GetArtifactParams object +// with the default values initialized. +func NewGetArtifactParams() *GetArtifactParams { + var () + return &GetArtifactParams{} +} + +// GetArtifactParams contains all the bound params for the get artifact operation +// typically these are obtained from a http.Request +// +// swagger:parameters getArtifact +type GetArtifactParams struct { + + /*Ticket ID + Required: true + In: path + */ + ID int64 + /* + Required: true + In: path + */ + Name string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *GetArtifactParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + rName := []string{ctx.Param("name")} + if err := o.bindName(rName, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetArtifactParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} + +func (o *GetArtifactParams) bindName(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.Name = raw + + return nil +} diff --git a/generated/restapi/operations/tickets/get_ticket_parameters.go b/generated/restapi/operations/tickets/get_ticket_parameters.go new file mode 100644 index 0000000..1616efc --- /dev/null +++ b/generated/restapi/operations/tickets/get_ticket_parameters.go @@ -0,0 +1,92 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// GetTicketEndpoint executes the core logic of the related +// route endpoint. +func GetTicketEndpoint(handler func(ctx context.Context, params *GetTicketParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewGetTicketParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewGetTicketParams creates a new GetTicketParams object +// with the default values initialized. +func NewGetTicketParams() *GetTicketParams { + var () + return &GetTicketParams{} +} + +// GetTicketParams contains all the bound params for the get ticket operation +// typically these are obtained from a http.Request +// +// swagger:parameters getTicket +type GetTicketParams struct { + + /*Ticket ID + Required: true + In: path + */ + ID int64 +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *GetTicketParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetTicketParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} diff --git a/generated/restapi/operations/tickets/link_files_parameters.go b/generated/restapi/operations/tickets/link_files_parameters.go new file mode 100644 index 0000000..23eab37 --- /dev/null +++ b/generated/restapi/operations/tickets/link_files_parameters.go @@ -0,0 +1,116 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// LinkFilesEndpoint executes the core logic of the related +// route endpoint. +func LinkFilesEndpoint(handler func(ctx context.Context, params *LinkFilesParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewLinkFilesParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewLinkFilesParams creates a new LinkFilesParams object +// with the default values initialized. +func NewLinkFilesParams() *LinkFilesParams { + var () + return &LinkFilesParams{} +} + +// LinkFilesParams contains all the bound params for the link files operation +// typically these are obtained from a http.Request +// +// swagger:parameters linkFiles +type LinkFilesParams struct { + + /*Added files + Required: true + In: body + */ + Files []*models.File + /*Ticket ID + Required: true + In: path + */ + ID int64 +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *LinkFilesParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if runtime.HasBody(ctx.Request) { + var body []*models.File + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("files", "body", "")) + } else { + res = append(res, errors.NewParseError("files", "body", "", err)) + } + + } else { + o.Files = body + } + } else { + res = append(res, errors.Required("files", "body", "")) + } + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *LinkFilesParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} diff --git a/generated/restapi/operations/tickets/link_ticket_parameters.go b/generated/restapi/operations/tickets/link_ticket_parameters.go new file mode 100644 index 0000000..c86d899 --- /dev/null +++ b/generated/restapi/operations/tickets/link_ticket_parameters.go @@ -0,0 +1,115 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// LinkTicketEndpoint executes the core logic of the related +// route endpoint. +func LinkTicketEndpoint(handler func(ctx context.Context, params *LinkTicketParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewLinkTicketParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewLinkTicketParams creates a new LinkTicketParams object +// with the default values initialized. +func NewLinkTicketParams() *LinkTicketParams { + var () + return &LinkTicketParams{} +} + +// LinkTicketParams contains all the bound params for the link ticket operation +// typically these are obtained from a http.Request +// +// swagger:parameters linkTicket +type LinkTicketParams struct { + + /*Ticket ID + Required: true + In: path + */ + ID int64 + /*Added ticket ID + Required: true + In: body + */ + LinkedID int64 +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *LinkTicketParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if runtime.HasBody(ctx.Request) { + var body int64 + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("linkedId", "body", "")) + } else { + res = append(res, errors.NewParseError("linkedId", "body", "", err)) + } + + } else { + o.LinkedID = body + } + } else { + res = append(res, errors.Required("linkedId", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *LinkTicketParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} diff --git a/generated/restapi/operations/tickets/list_tickets_parameters.go b/generated/restapi/operations/tickets/list_tickets_parameters.go new file mode 100644 index 0000000..4c230f7 --- /dev/null +++ b/generated/restapi/operations/tickets/list_tickets_parameters.go @@ -0,0 +1,269 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "fmt" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/swag" + "github.com/go-openapi/validate" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// ListTicketsEndpoint executes the core logic of the related +// route endpoint. +func ListTicketsEndpoint(handler func(ctx context.Context, params *ListTicketsParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewListTicketsParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewListTicketsParams creates a new ListTicketsParams object +// with the default values initialized. +func NewListTicketsParams() *ListTicketsParams { + var ( + countDefault = int64(25) + offsetDefault = int64(0) + ) + return &ListTicketsParams{ + Count: &countDefault, + + Offset: &offsetDefault, + } +} + +// ListTicketsParams contains all the bound params for the list tickets operation +// typically these are obtained from a http.Request +// +// swagger:parameters listTickets +type ListTicketsParams struct { + + /*Number of tickets + Maximum: 100 + In: query + Default: 25 + */ + Count *int64 + /*Sort descending + In: query + */ + Desc []bool + /*Offset of the list + In: query + Default: 0 + */ + Offset *int64 + /*Search query + In: query + */ + Query *string + /*Sort columns + In: query + */ + Sort []string + /*Ticket Type + In: query + */ + Type *string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *ListTicketsParams) ReadRequest(ctx *gin.Context) error { + var res []error + qs := runtime.Values(ctx.Request.URL.Query()) + + qCount, qhkCount, _ := qs.GetOK("count") + if err := o.bindCount(qCount, qhkCount); err != nil { + res = append(res, err) + } + + qDesc, qhkDesc, _ := qs.GetOK("desc") + if err := o.bindDesc(qDesc, qhkDesc); err != nil { + res = append(res, err) + } + + qOffset, qhkOffset, _ := qs.GetOK("offset") + if err := o.bindOffset(qOffset, qhkOffset); err != nil { + res = append(res, err) + } + + qQuery, qhkQuery, _ := qs.GetOK("query") + if err := o.bindQuery(qQuery, qhkQuery); err != nil { + res = append(res, err) + } + + qSort, qhkSort, _ := qs.GetOK("sort") + if err := o.bindSort(qSort, qhkSort); err != nil { + res = append(res, err) + } + + qType, qhkType, _ := qs.GetOK("type") + if err := o.bindType(qType, qhkType); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ListTicketsParams) bindCount(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + if raw == "" { // empty values pass all other validations + var countDefault int64 = int64(25) + o.Count = &countDefault + return nil + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("count", "query", "int64", raw) + } + o.Count = &value + + if err := o.validateCount(); err != nil { + return err + } + + return nil +} + +func (o *ListTicketsParams) validateCount() error { + + if err := validate.MaximumInt("count", "query", int64(*o.Count), 100, false); err != nil { + return err + } + + return nil +} + +func (o *ListTicketsParams) bindDesc(rawData []string, hasKey bool) error { + + var qvDesc string + if len(rawData) > 0 { + qvDesc = rawData[len(rawData)-1] + } + + descIC := swag.SplitByFormat(qvDesc, "") + + if len(descIC) == 0 { + return nil + } + + var descIR []bool + for i, descIV := range descIC { + descI, err := swag.ConvertBool(descIV) + if err != nil { + return errors.InvalidType(fmt.Sprintf("%s.%v", "desc", i), "query", "bool", descI) + } + + descIR = append(descIR, descI) + } + + o.Desc = descIR + + return nil +} + +func (o *ListTicketsParams) bindOffset(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + if raw == "" { // empty values pass all other validations + var offsetDefault int64 = int64(0) + o.Offset = &offsetDefault + return nil + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("offset", "query", "int64", raw) + } + o.Offset = &value + + return nil +} + +func (o *ListTicketsParams) bindQuery(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + if raw == "" { // empty values pass all other validations + return nil + } + + o.Query = &raw + + return nil +} + +func (o *ListTicketsParams) bindSort(rawData []string, hasKey bool) error { + + var qvSort string + if len(rawData) > 0 { + qvSort = rawData[len(rawData)-1] + } + + sortIC := swag.SplitByFormat(qvSort, "") + + if len(sortIC) == 0 { + return nil + } + + var sortIR []string + for _, sortIV := range sortIC { + sortI := sortIV + + sortIR = append(sortIR, sortI) + } + + o.Sort = sortIR + + return nil +} + +func (o *ListTicketsParams) bindType(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + if raw == "" { // empty values pass all other validations + return nil + } + + o.Type = &raw + + return nil +} diff --git a/generated/restapi/operations/tickets/remove_artifact_parameters.go b/generated/restapi/operations/tickets/remove_artifact_parameters.go new file mode 100644 index 0000000..4003d41 --- /dev/null +++ b/generated/restapi/operations/tickets/remove_artifact_parameters.go @@ -0,0 +1,113 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// RemoveArtifactEndpoint executes the core logic of the related +// route endpoint. +func RemoveArtifactEndpoint(handler func(ctx context.Context, params *RemoveArtifactParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewRemoveArtifactParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewRemoveArtifactParams creates a new RemoveArtifactParams object +// with the default values initialized. +func NewRemoveArtifactParams() *RemoveArtifactParams { + var () + return &RemoveArtifactParams{} +} + +// RemoveArtifactParams contains all the bound params for the remove artifact operation +// typically these are obtained from a http.Request +// +// swagger:parameters removeArtifact +type RemoveArtifactParams struct { + + /*Ticket ID + Required: true + In: path + */ + ID int64 + /* + Required: true + In: path + */ + Name string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *RemoveArtifactParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + rName := []string{ctx.Param("name")} + if err := o.bindName(rName, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *RemoveArtifactParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} + +func (o *RemoveArtifactParams) bindName(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.Name = raw + + return nil +} diff --git a/generated/restapi/operations/tickets/remove_comment_parameters.go b/generated/restapi/operations/tickets/remove_comment_parameters.go new file mode 100644 index 0000000..4ff85d2 --- /dev/null +++ b/generated/restapi/operations/tickets/remove_comment_parameters.go @@ -0,0 +1,117 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// RemoveCommentEndpoint executes the core logic of the related +// route endpoint. +func RemoveCommentEndpoint(handler func(ctx context.Context, params *RemoveCommentParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewRemoveCommentParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewRemoveCommentParams creates a new RemoveCommentParams object +// with the default values initialized. +func NewRemoveCommentParams() *RemoveCommentParams { + var () + return &RemoveCommentParams{} +} + +// RemoveCommentParams contains all the bound params for the remove comment operation +// typically these are obtained from a http.Request +// +// swagger:parameters removeComment +type RemoveCommentParams struct { + + /*Comment ID to remove + Required: true + In: path + */ + CommentID int64 + /*Ticket ID + Required: true + In: path + */ + ID int64 +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *RemoveCommentParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rCommentID := []string{ctx.Param("commentID")} + if err := o.bindCommentID(rCommentID, true); err != nil { + res = append(res, err) + } + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *RemoveCommentParams) bindCommentID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("commentID", "path", "int64", raw) + } + o.CommentID = value + + return nil +} + +func (o *RemoveCommentParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} diff --git a/generated/restapi/operations/tickets/remove_ticket_playbook_parameters.go b/generated/restapi/operations/tickets/remove_ticket_playbook_parameters.go new file mode 100644 index 0000000..a7fe504 --- /dev/null +++ b/generated/restapi/operations/tickets/remove_ticket_playbook_parameters.go @@ -0,0 +1,113 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// RemoveTicketPlaybookEndpoint executes the core logic of the related +// route endpoint. +func RemoveTicketPlaybookEndpoint(handler func(ctx context.Context, params *RemoveTicketPlaybookParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewRemoveTicketPlaybookParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewRemoveTicketPlaybookParams creates a new RemoveTicketPlaybookParams object +// with the default values initialized. +func NewRemoveTicketPlaybookParams() *RemoveTicketPlaybookParams { + var () + return &RemoveTicketPlaybookParams{} +} + +// RemoveTicketPlaybookParams contains all the bound params for the remove ticket playbook operation +// typically these are obtained from a http.Request +// +// swagger:parameters removeTicketPlaybook +type RemoveTicketPlaybookParams struct { + + /*Ticket ID + Required: true + In: path + */ + ID int64 + /*Playbook ID + Required: true + In: path + */ + PlaybookID string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *RemoveTicketPlaybookParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + rPlaybookID := []string{ctx.Param("playbookID")} + if err := o.bindPlaybookID(rPlaybookID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *RemoveTicketPlaybookParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} + +func (o *RemoveTicketPlaybookParams) bindPlaybookID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.PlaybookID = raw + + return nil +} diff --git a/generated/restapi/operations/tickets/run_artifact_parameters.go b/generated/restapi/operations/tickets/run_artifact_parameters.go new file mode 100644 index 0000000..6a4cee4 --- /dev/null +++ b/generated/restapi/operations/tickets/run_artifact_parameters.go @@ -0,0 +1,134 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// RunArtifactEndpoint executes the core logic of the related +// route endpoint. +func RunArtifactEndpoint(handler func(ctx context.Context, params *RunArtifactParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewRunArtifactParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewRunArtifactParams creates a new RunArtifactParams object +// with the default values initialized. +func NewRunArtifactParams() *RunArtifactParams { + var () + return &RunArtifactParams{} +} + +// RunArtifactParams contains all the bound params for the run artifact operation +// typically these are obtained from a http.Request +// +// swagger:parameters runArtifact +type RunArtifactParams struct { + + /* + Required: true + In: path + */ + Automation string + /*Ticket ID + Required: true + In: path + */ + ID int64 + /* + Required: true + In: path + */ + Name string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *RunArtifactParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rAutomation := []string{ctx.Param("automation")} + if err := o.bindAutomation(rAutomation, true); err != nil { + res = append(res, err) + } + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + rName := []string{ctx.Param("name")} + if err := o.bindName(rName, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *RunArtifactParams) bindAutomation(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.Automation = raw + + return nil +} + +func (o *RunArtifactParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} + +func (o *RunArtifactParams) bindName(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.Name = raw + + return nil +} diff --git a/generated/restapi/operations/tickets/run_task_parameters.go b/generated/restapi/operations/tickets/run_task_parameters.go new file mode 100644 index 0000000..f16a10b --- /dev/null +++ b/generated/restapi/operations/tickets/run_task_parameters.go @@ -0,0 +1,134 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// RunTaskEndpoint executes the core logic of the related +// route endpoint. +func RunTaskEndpoint(handler func(ctx context.Context, params *RunTaskParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewRunTaskParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewRunTaskParams creates a new RunTaskParams object +// with the default values initialized. +func NewRunTaskParams() *RunTaskParams { + var () + return &RunTaskParams{} +} + +// RunTaskParams contains all the bound params for the run task operation +// typically these are obtained from a http.Request +// +// swagger:parameters runTask +type RunTaskParams struct { + + /*Ticket ID + Required: true + In: path + */ + ID int64 + /*Playbook ID + Required: true + In: path + */ + PlaybookID string + /*Task ID + Required: true + In: path + */ + TaskID string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *RunTaskParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + rPlaybookID := []string{ctx.Param("playbookID")} + if err := o.bindPlaybookID(rPlaybookID, true); err != nil { + res = append(res, err) + } + + rTaskID := []string{ctx.Param("taskID")} + if err := o.bindTaskID(rTaskID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *RunTaskParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} + +func (o *RunTaskParams) bindPlaybookID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.PlaybookID = raw + + return nil +} + +func (o *RunTaskParams) bindTaskID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.TaskID = raw + + return nil +} diff --git a/generated/restapi/operations/tickets/set_artifact_parameters.go b/generated/restapi/operations/tickets/set_artifact_parameters.go new file mode 100644 index 0000000..50c573f --- /dev/null +++ b/generated/restapi/operations/tickets/set_artifact_parameters.go @@ -0,0 +1,137 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// SetArtifactEndpoint executes the core logic of the related +// route endpoint. +func SetArtifactEndpoint(handler func(ctx context.Context, params *SetArtifactParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewSetArtifactParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewSetArtifactParams creates a new SetArtifactParams object +// with the default values initialized. +func NewSetArtifactParams() *SetArtifactParams { + var () + return &SetArtifactParams{} +} + +// SetArtifactParams contains all the bound params for the set artifact operation +// typically these are obtained from a http.Request +// +// swagger:parameters setArtifact +type SetArtifactParams struct { + + /* + Required: true + In: body + */ + Artifact *models.Artifact + /*Ticket ID + Required: true + In: path + */ + ID int64 + /* + Required: true + In: path + */ + Name string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *SetArtifactParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if runtime.HasBody(ctx.Request) { + var body models.Artifact + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("artifact", "body", "")) + } else { + res = append(res, errors.NewParseError("artifact", "body", "", err)) + } + + } else { + o.Artifact = &body + } + } else { + res = append(res, errors.Required("artifact", "body", "")) + } + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + rName := []string{ctx.Param("name")} + if err := o.bindName(rName, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *SetArtifactParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} + +func (o *SetArtifactParams) bindName(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.Name = raw + + return nil +} diff --git a/generated/restapi/operations/tickets/set_references_parameters.go b/generated/restapi/operations/tickets/set_references_parameters.go new file mode 100644 index 0000000..99d1206 --- /dev/null +++ b/generated/restapi/operations/tickets/set_references_parameters.go @@ -0,0 +1,116 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// SetReferencesEndpoint executes the core logic of the related +// route endpoint. +func SetReferencesEndpoint(handler func(ctx context.Context, params *SetReferencesParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewSetReferencesParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewSetReferencesParams creates a new SetReferencesParams object +// with the default values initialized. +func NewSetReferencesParams() *SetReferencesParams { + var () + return &SetReferencesParams{} +} + +// SetReferencesParams contains all the bound params for the set references operation +// typically these are obtained from a http.Request +// +// swagger:parameters setReferences +type SetReferencesParams struct { + + /*Ticket ID + Required: true + In: path + */ + ID int64 + /*All ticket references + Required: true + In: body + */ + References []*models.Reference +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *SetReferencesParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if runtime.HasBody(ctx.Request) { + var body []*models.Reference + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("references", "body", "")) + } else { + res = append(res, errors.NewParseError("references", "body", "", err)) + } + + } else { + o.References = body + } + } else { + res = append(res, errors.Required("references", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *SetReferencesParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} diff --git a/generated/restapi/operations/tickets/set_schema_parameters.go b/generated/restapi/operations/tickets/set_schema_parameters.go new file mode 100644 index 0000000..f93406d --- /dev/null +++ b/generated/restapi/operations/tickets/set_schema_parameters.go @@ -0,0 +1,106 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// SetSchemaEndpoint executes the core logic of the related +// route endpoint. +func SetSchemaEndpoint(handler func(ctx context.Context, params *SetSchemaParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewSetSchemaParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewSetSchemaParams creates a new SetSchemaParams object +// with the default values initialized. +func NewSetSchemaParams() *SetSchemaParams { + var () + return &SetSchemaParams{} +} + +// SetSchemaParams contains all the bound params for the set schema operation +// typically these are obtained from a http.Request +// +// swagger:parameters setSchema +type SetSchemaParams struct { + + /*Ticket ID + Required: true + In: path + */ + ID int64 + /*New ticket schema + In: body + */ + Schema string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *SetSchemaParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if runtime.HasBody(ctx.Request) { + var body string + if err := ctx.BindJSON(&body); err != nil { + res = append(res, errors.NewParseError("schema", "body", "", err)) + } else { + o.Schema = body + } + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *SetSchemaParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} diff --git a/generated/restapi/operations/tickets/set_task_parameters.go b/generated/restapi/operations/tickets/set_task_parameters.go new file mode 100644 index 0000000..3fd05ca --- /dev/null +++ b/generated/restapi/operations/tickets/set_task_parameters.go @@ -0,0 +1,158 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// SetTaskEndpoint executes the core logic of the related +// route endpoint. +func SetTaskEndpoint(handler func(ctx context.Context, params *SetTaskParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewSetTaskParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewSetTaskParams creates a new SetTaskParams object +// with the default values initialized. +func NewSetTaskParams() *SetTaskParams { + var () + return &SetTaskParams{} +} + +// SetTaskParams contains all the bound params for the set task operation +// typically these are obtained from a http.Request +// +// swagger:parameters setTask +type SetTaskParams struct { + + /*Ticket ID + Required: true + In: path + */ + ID int64 + /*Playbook ID + Required: true + In: path + */ + PlaybookID string + /*Task + Required: true + In: body + */ + Task *models.Task + /*Task ID + Required: true + In: path + */ + TaskID string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *SetTaskParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + rPlaybookID := []string{ctx.Param("playbookID")} + if err := o.bindPlaybookID(rPlaybookID, true); err != nil { + res = append(res, err) + } + + if runtime.HasBody(ctx.Request) { + var body models.Task + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("task", "body", "")) + } else { + res = append(res, errors.NewParseError("task", "body", "", err)) + } + + } else { + o.Task = &body + } + } else { + res = append(res, errors.Required("task", "body", "")) + } + + rTaskID := []string{ctx.Param("taskID")} + if err := o.bindTaskID(rTaskID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *SetTaskParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} + +func (o *SetTaskParams) bindPlaybookID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.PlaybookID = raw + + return nil +} + +func (o *SetTaskParams) bindTaskID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.TaskID = raw + + return nil +} diff --git a/generated/restapi/operations/tickets/unlink_ticket_parameters.go b/generated/restapi/operations/tickets/unlink_ticket_parameters.go new file mode 100644 index 0000000..fc3ff3a --- /dev/null +++ b/generated/restapi/operations/tickets/unlink_ticket_parameters.go @@ -0,0 +1,115 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// UnlinkTicketEndpoint executes the core logic of the related +// route endpoint. +func UnlinkTicketEndpoint(handler func(ctx context.Context, params *UnlinkTicketParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewUnlinkTicketParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewUnlinkTicketParams creates a new UnlinkTicketParams object +// with the default values initialized. +func NewUnlinkTicketParams() *UnlinkTicketParams { + var () + return &UnlinkTicketParams{} +} + +// UnlinkTicketParams contains all the bound params for the unlink ticket operation +// typically these are obtained from a http.Request +// +// swagger:parameters unlinkTicket +type UnlinkTicketParams struct { + + /*Ticket ID + Required: true + In: path + */ + ID int64 + /*Added ticket ID + Required: true + In: body + */ + LinkedID int64 +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *UnlinkTicketParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if runtime.HasBody(ctx.Request) { + var body int64 + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("linkedId", "body", "")) + } else { + res = append(res, errors.NewParseError("linkedId", "body", "", err)) + } + + } else { + o.LinkedID = body + } + } else { + res = append(res, errors.Required("linkedId", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *UnlinkTicketParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} diff --git a/generated/restapi/operations/tickets/update_ticket_parameters.go b/generated/restapi/operations/tickets/update_ticket_parameters.go new file mode 100644 index 0000000..ebd673f --- /dev/null +++ b/generated/restapi/operations/tickets/update_ticket_parameters.go @@ -0,0 +1,116 @@ +package tickets + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/swag" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// UpdateTicketEndpoint executes the core logic of the related +// route endpoint. +func UpdateTicketEndpoint(handler func(ctx context.Context, params *UpdateTicketParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewUpdateTicketParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewUpdateTicketParams creates a new UpdateTicketParams object +// with the default values initialized. +func NewUpdateTicketParams() *UpdateTicketParams { + var () + return &UpdateTicketParams{} +} + +// UpdateTicketParams contains all the bound params for the update ticket operation +// typically these are obtained from a http.Request +// +// swagger:parameters updateTicket +type UpdateTicketParams struct { + + /*Ticket ID + Required: true + In: path + */ + ID int64 + /*Updated ticket + Required: true + In: body + */ + Ticket *models.Ticket +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *UpdateTicketParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if runtime.HasBody(ctx.Request) { + var body models.Ticket + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("ticket", "body", "")) + } else { + res = append(res, errors.NewParseError("ticket", "body", "", err)) + } + + } else { + o.Ticket = &body + } + } else { + res = append(res, errors.Required("ticket", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *UpdateTicketParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + value, err := swag.ConvertInt64(raw) + if err != nil { + return errors.InvalidType("id", "path", "int64", raw) + } + o.ID = value + + return nil +} diff --git a/generated/restapi/operations/tickettypes/create_ticket_type_parameters.go b/generated/restapi/operations/tickettypes/create_ticket_type_parameters.go new file mode 100644 index 0000000..034d5ed --- /dev/null +++ b/generated/restapi/operations/tickettypes/create_ticket_type_parameters.go @@ -0,0 +1,90 @@ +package tickettypes + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// CreateTicketTypeEndpoint executes the core logic of the related +// route endpoint. +func CreateTicketTypeEndpoint(handler func(ctx context.Context, params *CreateTicketTypeParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewCreateTicketTypeParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewCreateTicketTypeParams creates a new CreateTicketTypeParams object +// with the default values initialized. +func NewCreateTicketTypeParams() *CreateTicketTypeParams { + var () + return &CreateTicketTypeParams{} +} + +// CreateTicketTypeParams contains all the bound params for the create ticket type operation +// typically these are obtained from a http.Request +// +// swagger:parameters createTicketType +type CreateTicketTypeParams struct { + + /*New tickettype + Required: true + In: body + */ + Tickettype *models.TicketTypeForm +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *CreateTicketTypeParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if runtime.HasBody(ctx.Request) { + var body models.TicketTypeForm + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("tickettype", "body", "")) + } else { + res = append(res, errors.NewParseError("tickettype", "body", "", err)) + } + + } else { + o.Tickettype = &body + } + } else { + res = append(res, errors.Required("tickettype", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/tickettypes/delete_ticket_type_parameters.go b/generated/restapi/operations/tickettypes/delete_ticket_type_parameters.go new file mode 100644 index 0000000..98e677d --- /dev/null +++ b/generated/restapi/operations/tickettypes/delete_ticket_type_parameters.go @@ -0,0 +1,87 @@ +package tickettypes + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// DeleteTicketTypeEndpoint executes the core logic of the related +// route endpoint. +func DeleteTicketTypeEndpoint(handler func(ctx context.Context, params *DeleteTicketTypeParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewDeleteTicketTypeParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewDeleteTicketTypeParams creates a new DeleteTicketTypeParams object +// with the default values initialized. +func NewDeleteTicketTypeParams() *DeleteTicketTypeParams { + var () + return &DeleteTicketTypeParams{} +} + +// DeleteTicketTypeParams contains all the bound params for the delete ticket type operation +// typically these are obtained from a http.Request +// +// swagger:parameters deleteTicketType +type DeleteTicketTypeParams struct { + + /*TicketType ID + Required: true + In: path + */ + ID string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *DeleteTicketTypeParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *DeleteTicketTypeParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.ID = raw + + return nil +} diff --git a/generated/restapi/operations/tickettypes/get_ticket_type_parameters.go b/generated/restapi/operations/tickettypes/get_ticket_type_parameters.go new file mode 100644 index 0000000..70ad526 --- /dev/null +++ b/generated/restapi/operations/tickettypes/get_ticket_type_parameters.go @@ -0,0 +1,87 @@ +package tickettypes + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// GetTicketTypeEndpoint executes the core logic of the related +// route endpoint. +func GetTicketTypeEndpoint(handler func(ctx context.Context, params *GetTicketTypeParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewGetTicketTypeParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewGetTicketTypeParams creates a new GetTicketTypeParams object +// with the default values initialized. +func NewGetTicketTypeParams() *GetTicketTypeParams { + var () + return &GetTicketTypeParams{} +} + +// GetTicketTypeParams contains all the bound params for the get ticket type operation +// typically these are obtained from a http.Request +// +// swagger:parameters getTicketType +type GetTicketTypeParams struct { + + /*TicketType ID + Required: true + In: path + */ + ID string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *GetTicketTypeParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetTicketTypeParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.ID = raw + + return nil +} diff --git a/generated/restapi/operations/tickettypes/list_ticket_types_parameters.go b/generated/restapi/operations/tickettypes/list_ticket_types_parameters.go new file mode 100644 index 0000000..607dcc3 --- /dev/null +++ b/generated/restapi/operations/tickettypes/list_ticket_types_parameters.go @@ -0,0 +1,55 @@ +package tickettypes + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// ListTicketTypesEndpoint executes the core logic of the related +// route endpoint. +func ListTicketTypesEndpoint(handler func(ctx context.Context) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + resp := handler(ctx) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewListTicketTypesParams creates a new ListTicketTypesParams object +// with the default values initialized. +func NewListTicketTypesParams() *ListTicketTypesParams { + var () + return &ListTicketTypesParams{} +} + +// ListTicketTypesParams contains all the bound params for the list ticket types operation +// typically these are obtained from a http.Request +// +// swagger:parameters listTicketTypes +type ListTicketTypesParams struct { +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *ListTicketTypesParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/tickettypes/update_ticket_type_parameters.go b/generated/restapi/operations/tickettypes/update_ticket_type_parameters.go new file mode 100644 index 0000000..9c7b323 --- /dev/null +++ b/generated/restapi/operations/tickettypes/update_ticket_type_parameters.go @@ -0,0 +1,111 @@ +package tickettypes + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// UpdateTicketTypeEndpoint executes the core logic of the related +// route endpoint. +func UpdateTicketTypeEndpoint(handler func(ctx context.Context, params *UpdateTicketTypeParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewUpdateTicketTypeParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewUpdateTicketTypeParams creates a new UpdateTicketTypeParams object +// with the default values initialized. +func NewUpdateTicketTypeParams() *UpdateTicketTypeParams { + var () + return &UpdateTicketTypeParams{} +} + +// UpdateTicketTypeParams contains all the bound params for the update ticket type operation +// typically these are obtained from a http.Request +// +// swagger:parameters updateTicketType +type UpdateTicketTypeParams struct { + + /*TicketType ID + Required: true + In: path + */ + ID string + /*TicketType object that needs to be added + Required: true + In: body + */ + Tickettype *models.TicketTypeForm +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *UpdateTicketTypeParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if runtime.HasBody(ctx.Request) { + var body models.TicketTypeForm + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("tickettype", "body", "")) + } else { + res = append(res, errors.NewParseError("tickettype", "body", "", err)) + } + + } else { + o.Tickettype = &body + } + } else { + res = append(res, errors.Required("tickettype", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *UpdateTicketTypeParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.ID = raw + + return nil +} diff --git a/generated/restapi/operations/userdata/current_user_data_parameters.go b/generated/restapi/operations/userdata/current_user_data_parameters.go new file mode 100644 index 0000000..800485a --- /dev/null +++ b/generated/restapi/operations/userdata/current_user_data_parameters.go @@ -0,0 +1,55 @@ +package userdata + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// CurrentUserDataEndpoint executes the core logic of the related +// route endpoint. +func CurrentUserDataEndpoint(handler func(ctx context.Context) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + resp := handler(ctx) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewCurrentUserDataParams creates a new CurrentUserDataParams object +// with the default values initialized. +func NewCurrentUserDataParams() *CurrentUserDataParams { + var () + return &CurrentUserDataParams{} +} + +// CurrentUserDataParams contains all the bound params for the current user data operation +// typically these are obtained from a http.Request +// +// swagger:parameters currentUserData +type CurrentUserDataParams struct { +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *CurrentUserDataParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/userdata/get_user_data_parameters.go b/generated/restapi/operations/userdata/get_user_data_parameters.go new file mode 100644 index 0000000..c255598 --- /dev/null +++ b/generated/restapi/operations/userdata/get_user_data_parameters.go @@ -0,0 +1,87 @@ +package userdata + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// GetUserDataEndpoint executes the core logic of the related +// route endpoint. +func GetUserDataEndpoint(handler func(ctx context.Context, params *GetUserDataParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewGetUserDataParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewGetUserDataParams creates a new GetUserDataParams object +// with the default values initialized. +func NewGetUserDataParams() *GetUserDataParams { + var () + return &GetUserDataParams{} +} + +// GetUserDataParams contains all the bound params for the get user data operation +// typically these are obtained from a http.Request +// +// swagger:parameters getUserData +type GetUserDataParams struct { + + /*User Data ID + Required: true + In: path + */ + ID string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *GetUserDataParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetUserDataParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.ID = raw + + return nil +} diff --git a/generated/restapi/operations/userdata/list_user_data_parameters.go b/generated/restapi/operations/userdata/list_user_data_parameters.go new file mode 100644 index 0000000..fff2a0d --- /dev/null +++ b/generated/restapi/operations/userdata/list_user_data_parameters.go @@ -0,0 +1,55 @@ +package userdata + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// ListUserDataEndpoint executes the core logic of the related +// route endpoint. +func ListUserDataEndpoint(handler func(ctx context.Context) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + resp := handler(ctx) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewListUserDataParams creates a new ListUserDataParams object +// with the default values initialized. +func NewListUserDataParams() *ListUserDataParams { + var () + return &ListUserDataParams{} +} + +// ListUserDataParams contains all the bound params for the list user data operation +// typically these are obtained from a http.Request +// +// swagger:parameters listUserData +type ListUserDataParams struct { +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *ListUserDataParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/userdata/update_current_user_data_parameters.go b/generated/restapi/operations/userdata/update_current_user_data_parameters.go new file mode 100644 index 0000000..2b926ba --- /dev/null +++ b/generated/restapi/operations/userdata/update_current_user_data_parameters.go @@ -0,0 +1,90 @@ +package userdata + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// UpdateCurrentUserDataEndpoint executes the core logic of the related +// route endpoint. +func UpdateCurrentUserDataEndpoint(handler func(ctx context.Context, params *UpdateCurrentUserDataParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewUpdateCurrentUserDataParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewUpdateCurrentUserDataParams creates a new UpdateCurrentUserDataParams object +// with the default values initialized. +func NewUpdateCurrentUserDataParams() *UpdateCurrentUserDataParams { + var () + return &UpdateCurrentUserDataParams{} +} + +// UpdateCurrentUserDataParams contains all the bound params for the update current user data operation +// typically these are obtained from a http.Request +// +// swagger:parameters updateCurrentUserData +type UpdateCurrentUserDataParams struct { + + /*User data object that needs to be added + Required: true + In: body + */ + Userdata *models.UserData +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *UpdateCurrentUserDataParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if runtime.HasBody(ctx.Request) { + var body models.UserData + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("userdata", "body", "")) + } else { + res = append(res, errors.NewParseError("userdata", "body", "", err)) + } + + } else { + o.Userdata = &body + } + } else { + res = append(res, errors.Required("userdata", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/userdata/update_user_data_parameters.go b/generated/restapi/operations/userdata/update_user_data_parameters.go new file mode 100644 index 0000000..4212316 --- /dev/null +++ b/generated/restapi/operations/userdata/update_user_data_parameters.go @@ -0,0 +1,111 @@ +package userdata + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// UpdateUserDataEndpoint executes the core logic of the related +// route endpoint. +func UpdateUserDataEndpoint(handler func(ctx context.Context, params *UpdateUserDataParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewUpdateUserDataParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewUpdateUserDataParams creates a new UpdateUserDataParams object +// with the default values initialized. +func NewUpdateUserDataParams() *UpdateUserDataParams { + var () + return &UpdateUserDataParams{} +} + +// UpdateUserDataParams contains all the bound params for the update user data operation +// typically these are obtained from a http.Request +// +// swagger:parameters updateUserData +type UpdateUserDataParams struct { + + /*User Data ID + Required: true + In: path + */ + ID string + /*User data object that needs to be added + Required: true + In: body + */ + Userdata *models.UserData +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *UpdateUserDataParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if runtime.HasBody(ctx.Request) { + var body models.UserData + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("userdata", "body", "")) + } else { + res = append(res, errors.NewParseError("userdata", "body", "", err)) + } + + } else { + o.Userdata = &body + } + } else { + res = append(res, errors.Required("userdata", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *UpdateUserDataParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.ID = raw + + return nil +} diff --git a/generated/restapi/operations/users/create_user_parameters.go b/generated/restapi/operations/users/create_user_parameters.go new file mode 100644 index 0000000..d345bae --- /dev/null +++ b/generated/restapi/operations/users/create_user_parameters.go @@ -0,0 +1,90 @@ +package users + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// CreateUserEndpoint executes the core logic of the related +// route endpoint. +func CreateUserEndpoint(handler func(ctx context.Context, params *CreateUserParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewCreateUserParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewCreateUserParams creates a new CreateUserParams object +// with the default values initialized. +func NewCreateUserParams() *CreateUserParams { + var () + return &CreateUserParams{} +} + +// CreateUserParams contains all the bound params for the create user operation +// typically these are obtained from a http.Request +// +// swagger:parameters createUser +type CreateUserParams struct { + + /*user object that needs to be added + Required: true + In: body + */ + User *models.UserForm +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *CreateUserParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if runtime.HasBody(ctx.Request) { + var body models.UserForm + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("user", "body", "")) + } else { + res = append(res, errors.NewParseError("user", "body", "", err)) + } + + } else { + o.User = &body + } + } else { + res = append(res, errors.Required("user", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/users/current_user_parameters.go b/generated/restapi/operations/users/current_user_parameters.go new file mode 100644 index 0000000..28420e0 --- /dev/null +++ b/generated/restapi/operations/users/current_user_parameters.go @@ -0,0 +1,55 @@ +package users + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// CurrentUserEndpoint executes the core logic of the related +// route endpoint. +func CurrentUserEndpoint(handler func(ctx context.Context) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + resp := handler(ctx) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewCurrentUserParams creates a new CurrentUserParams object +// with the default values initialized. +func NewCurrentUserParams() *CurrentUserParams { + var () + return &CurrentUserParams{} +} + +// CurrentUserParams contains all the bound params for the current user operation +// typically these are obtained from a http.Request +// +// swagger:parameters currentUser +type CurrentUserParams struct { +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *CurrentUserParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/users/delete_user_parameters.go b/generated/restapi/operations/users/delete_user_parameters.go new file mode 100644 index 0000000..3c7ccea --- /dev/null +++ b/generated/restapi/operations/users/delete_user_parameters.go @@ -0,0 +1,87 @@ +package users + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// DeleteUserEndpoint executes the core logic of the related +// route endpoint. +func DeleteUserEndpoint(handler func(ctx context.Context, params *DeleteUserParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewDeleteUserParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewDeleteUserParams creates a new DeleteUserParams object +// with the default values initialized. +func NewDeleteUserParams() *DeleteUserParams { + var () + return &DeleteUserParams{} +} + +// DeleteUserParams contains all the bound params for the delete user operation +// typically these are obtained from a http.Request +// +// swagger:parameters deleteUser +type DeleteUserParams struct { + + /*user ID + Required: true + In: path + */ + ID string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *DeleteUserParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *DeleteUserParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.ID = raw + + return nil +} diff --git a/generated/restapi/operations/users/get_user_parameters.go b/generated/restapi/operations/users/get_user_parameters.go new file mode 100644 index 0000000..2f3230e --- /dev/null +++ b/generated/restapi/operations/users/get_user_parameters.go @@ -0,0 +1,87 @@ +package users + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// GetUserEndpoint executes the core logic of the related +// route endpoint. +func GetUserEndpoint(handler func(ctx context.Context, params *GetUserParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewGetUserParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewGetUserParams creates a new GetUserParams object +// with the default values initialized. +func NewGetUserParams() *GetUserParams { + var () + return &GetUserParams{} +} + +// GetUserParams contains all the bound params for the get user operation +// typically these are obtained from a http.Request +// +// swagger:parameters getUser +type GetUserParams struct { + + /*user ID + Required: true + In: path + */ + ID string +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *GetUserParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetUserParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.ID = raw + + return nil +} diff --git a/generated/restapi/operations/users/list_users_parameters.go b/generated/restapi/operations/users/list_users_parameters.go new file mode 100644 index 0000000..b6c664b --- /dev/null +++ b/generated/restapi/operations/users/list_users_parameters.go @@ -0,0 +1,55 @@ +package users + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// ListUsersEndpoint executes the core logic of the related +// route endpoint. +func ListUsersEndpoint(handler func(ctx context.Context) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + resp := handler(ctx) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewListUsersParams creates a new ListUsersParams object +// with the default values initialized. +func NewListUsersParams() *ListUsersParams { + var () + return &ListUsersParams{} +} + +// ListUsersParams contains all the bound params for the list users operation +// typically these are obtained from a http.Request +// +// swagger:parameters listUsers +type ListUsersParams struct { +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *ListUsersParams) ReadRequest(ctx *gin.Context) error { + var res []error + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/generated/restapi/operations/users/update_user_parameters.go b/generated/restapi/operations/users/update_user_parameters.go new file mode 100644 index 0000000..9ad2352 --- /dev/null +++ b/generated/restapi/operations/users/update_user_parameters.go @@ -0,0 +1,111 @@ +package users + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "io" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// UpdateUserEndpoint executes the core logic of the related +// route endpoint. +func UpdateUserEndpoint(handler func(ctx context.Context, params *UpdateUserParams) *api.Response) gin.HandlerFunc { + return func(ctx *gin.Context) { + + // generate params from request + params := NewUpdateUserParams() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + + resp := handler(ctx, params) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// NewUpdateUserParams creates a new UpdateUserParams object +// with the default values initialized. +func NewUpdateUserParams() *UpdateUserParams { + var () + return &UpdateUserParams{} +} + +// UpdateUserParams contains all the bound params for the update user operation +// typically these are obtained from a http.Request +// +// swagger:parameters updateUser +type UpdateUserParams struct { + + /*Template ID + Required: true + In: path + */ + ID string + /*user object that needs to be added + Required: true + In: body + */ + User *models.UserForm +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func (o *UpdateUserParams) ReadRequest(ctx *gin.Context) error { + var res []error + + rID := []string{ctx.Param("id")} + if err := o.bindID(rID, true); err != nil { + res = append(res, err) + } + + if runtime.HasBody(ctx.Request) { + var body models.UserForm + if err := ctx.BindJSON(&body); err != nil { + if err == io.EOF { + res = append(res, errors.Required("user", "body", "")) + } else { + res = append(res, errors.NewParseError("user", "body", "", err)) + } + + } else { + o.User = &body + } + } else { + res = append(res, errors.Required("user", "body", "")) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *UpdateUserParams) bindID(rawData []string, hasKey bool) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + o.ID = raw + + return nil +} diff --git a/generated/test/api_server_test.go b/generated/test/api_server_test.go new file mode 100644 index 0000000..62dad9c --- /dev/null +++ b/generated/test/api_server_test.go @@ -0,0 +1,675 @@ +package test + +import ( + "bytes" + "encoding/json" + "io" + "net/http" + "net/http/httptest" + "testing" + + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" + "github.com/tidwall/gjson" + "github.com/tidwall/sjson" + + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/test" +) + +func TestService(t *testing.T) { + gin.SetMode(gin.TestMode) + + type args struct { + method string + url string + data interface{} + } + type want struct { + status int + body interface{} + } + tests := []struct { + name string + args args + want want + }{ + + { + name: "AddArtifact", + args: args{method: "POST", url: "/api/tickets/8123/artifacts", data: map[string]interface{}{"name": "2.2.2.2"}}, + want: want{ + status: 200, + body: map[string]interface{}{"artifacts": []interface{}{map[string]interface{}{"name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", "status": "unknown"}, map[string]interface{}{"name": "http://www.customerviral.io/scalable/vertical/killer", "status": "clean"}, map[string]interface{}{"name": "leadreintermediate.io", "status": "malicious"}, map[string]interface{}{"name": "2.2.2.2", "status": "unknown", "type": "ip"}}, "created": "2021-10-02T18:04:59.078206+02:00", "id": 8123, "modified": "2021-10-02T18:04:59.078206+02:00", "name": "live zebra", "owner": "demo", "playbooks": map[string]interface{}{"phishing": map[string]interface{}{"name": "Phishing", "tasks": map[string]interface{}{"block-iocs": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Block IOCs", "order": 6, "type": "task"}, "block-sender": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Block sender", "next": map[string]interface{}{"extract-iocs": ""}, "order": 3, "type": "task"}, "board": map[string]interface{}{"active": true, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Board Involvement?", "next": map[string]interface{}{"escalate": "boardInvolved == true", "mail-available": "boardInvolved == false"}, "order": 0, "schema": map[string]interface{}{"properties": map[string]interface{}{"boardInvolved": map[string]interface{}{"default": false, "title": "A board member is involved.", "type": "boolean"}}, "required": []interface{}{"boardInvolved"}, "title": "Board Involvement?", "type": "object"}, "type": "input"}, "escalate": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Escalate to CISO", "order": 1, "type": "task"}, "extract-iocs": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Extract IOCs", "next": map[string]interface{}{"block-iocs": ""}, "order": 5, "schema": map[string]interface{}{"properties": map[string]interface{}{"iocs": map[string]interface{}{"items": map[string]interface{}{"type": "string"}, "title": "IOCs", "type": "array"}}, "title": "Extract IOCs", "type": "object"}, "type": "input"}, "mail-available": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Mail available", "next": map[string]interface{}{"block-sender": "schemaKey == 'yes'", "extract-iocs": "schemaKey == 'yes'", "search-email-gateway": "schemaKey == 'no'"}, "order": 2, "schema": map[string]interface{}{"oneOf": []interface{}{map[string]interface{}{"properties": map[string]interface{}{"mail": map[string]interface{}{"title": "Mail", "type": "string", "x-display": "textarea"}, "schemaKey": map[string]interface{}{"const": "yes", "type": "string"}}, "required": []interface{}{"mail"}, "title": "Yes"}, map[string]interface{}{"properties": map[string]interface{}{"schemaKey": map[string]interface{}{"const": "no", "type": "string"}}, "title": "No"}}, "title": "Mail available", "type": "object"}, "type": "input"}, "search-email-gateway": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Search email gateway", "next": map[string]interface{}{"extract-iocs": ""}, "order": 4, "type": "task"}}}}, "references": []interface{}{map[string]interface{}{"href": "https://www.leadmaximize.net/e-services/back-end", "name": "performance"}, map[string]interface{}{"href": "http://www.corporateinteractive.name/rich", "name": "autumn"}, map[string]interface{}{"href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", "name": "suggest"}}, "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", "status": "closed", "type": "incident"}, + }, + }, + { + name: "AddComment", + args: args{method: "POST", url: "/api/tickets/8125/comments", data: map[string]interface{}{"message": "My first comment"}}, + want: want{ + status: 200, + body: map[string]interface{}{"comments": []interface{}{map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "creator": "bob", "message": "My first comment"}}, "created": "2021-10-02T18:04:59.078186+02:00", "id": 8125, "modified": "2021-10-02T18:04:59.078186+02:00", "name": "phishing from selenafadel@von.com detected", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "https://www.seniorleading-edge.name/users/efficient", "name": "recovery"}, map[string]interface{}{"href": "http://www.dynamicseamless.com/clicks-and-mortar", "name": "force"}, map[string]interface{}{"href": "http://www.leadscalable.biz/envisioneer", "name": "fund"}}, "schema": "{}", "status": "closed", "tickets": []interface{}{map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "id": 8126, "modified": "2021-10-02T18:04:59.078186+02:00", "name": "Surfaceintroduce virus detected", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "http://www.centralworld-class.io/synthesize", "name": "university"}, map[string]interface{}{"href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", "name": "goal"}, map[string]interface{}{"href": "http://www.chiefsyndicate.io/action-items", "name": "unemployment"}}, "schema": "{}", "status": "closed", "type": "alert"}}, "type": "alert"}, + }, + }, + { + name: "AddTicketPlaybook", + args: args{method: "POST", url: "/api/tickets/8125/playbooks", data: map[string]interface{}{"yaml": "name: Simple\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n"}}, + want: want{ + status: 200, + body: map[string]interface{}{"created": "1985-04-12T23:20:50.52Z", "id": 8125, "modified": "1985-04-12T23:20:50.52Z", "name": "phishing from selenafadel@von.com detected", "owner": "demo", "playbooks": map[string]interface{}{"simple": map[string]interface{}{"name": "Simple", "tasks": map[string]interface{}{"escalate": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Escalate to malware team", "order": 2, "type": "task"}, "hash": map[string]interface{}{"active": false, "automation": "hash.sha1", "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Hash the malware", "next": map[string]interface{}{"escalate": ""}, "order": 1, "payload": map[string]interface{}{"default": "playbook.tasks['input'].data['malware']"}, "type": "automation"}, "input": map[string]interface{}{"active": true, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Upload malware if possible", "next": map[string]interface{}{"hash": "malware != ''"}, "order": 0, "schema": map[string]interface{}{"properties": map[string]interface{}{"malware": map[string]interface{}{"default": "", "title": "Select malware", "type": "string"}}, "title": "Malware", "type": "object"}, "type": "input"}}}}, "references": []interface{}{map[string]interface{}{"href": "https://www.seniorleading-edge.name/users/efficient", "name": "recovery"}, map[string]interface{}{"href": "http://www.dynamicseamless.com/clicks-and-mortar", "name": "force"}, map[string]interface{}{"href": "http://www.leadscalable.biz/envisioneer", "name": "fund"}}, "schema": "{}", "status": "closed", "tickets": []interface{}{map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "id": 8126, "modified": "2021-10-02T18:04:59.078186+02:00", "name": "Surfaceintroduce virus detected", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "http://www.centralworld-class.io/synthesize", "name": "university"}, map[string]interface{}{"href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", "name": "goal"}, map[string]interface{}{"href": "http://www.chiefsyndicate.io/action-items", "name": "unemployment"}}, "schema": "{}", "status": "closed", "type": "alert"}}, "type": "alert"}, + }, + }, + { + name: "CompleteTask", + args: args{method: "PUT", url: "/api/tickets/8123/playbooks/phishing/task/board/complete", data: map[string]interface{}{"boardInvolved": true}}, + want: want{ + status: 200, + body: map[string]interface{}{"artifacts": []interface{}{map[string]interface{}{"name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", "status": "unknown"}, map[string]interface{}{"name": "http://www.customerviral.io/scalable/vertical/killer", "status": "clean"}, map[string]interface{}{"name": "leadreintermediate.io", "status": "malicious"}}, "created": "2021-10-02T18:04:59.078206+02:00", "id": 8123, "modified": "2021-10-02T18:04:59.078206+02:00", "name": "live zebra", "owner": "demo", "playbooks": map[string]interface{}{"phishing": map[string]interface{}{"name": "Phishing", "tasks": map[string]interface{}{"block-iocs": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Block IOCs", "order": 6, "type": "task"}, "block-sender": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Block sender", "next": map[string]interface{}{"extract-iocs": ""}, "order": 3, "type": "task"}, "board": map[string]interface{}{"active": false, "closed": "2021-10-02T18:04:59.078186+02:00", "created": "2021-10-02T18:04:59.078186+02:00", "data": map[string]interface{}{"boardInvolved": true}, "done": true, "name": "Board Involvement?", "next": map[string]interface{}{"escalate": "boardInvolved == true", "mail-available": "boardInvolved == false"}, "order": 0, "schema": map[string]interface{}{"properties": map[string]interface{}{"boardInvolved": map[string]interface{}{"default": false, "title": "A board member is involved.", "type": "boolean"}}, "required": []interface{}{"boardInvolved"}, "title": "Board Involvement?", "type": "object"}, "type": "input"}, "escalate": map[string]interface{}{"active": true, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Escalate to CISO", "order": 1, "type": "task"}, "extract-iocs": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Extract IOCs", "next": map[string]interface{}{"block-iocs": ""}, "order": 5, "schema": map[string]interface{}{"properties": map[string]interface{}{"iocs": map[string]interface{}{"items": map[string]interface{}{"type": "string"}, "title": "IOCs", "type": "array"}}, "title": "Extract IOCs", "type": "object"}, "type": "input"}, "mail-available": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Mail available", "next": map[string]interface{}{"block-sender": "schemaKey == 'yes'", "extract-iocs": "schemaKey == 'yes'", "search-email-gateway": "schemaKey == 'no'"}, "order": 2, "schema": map[string]interface{}{"oneOf": []interface{}{map[string]interface{}{"properties": map[string]interface{}{"mail": map[string]interface{}{"title": "Mail", "type": "string", "x-display": "textarea"}, "schemaKey": map[string]interface{}{"const": "yes", "type": "string"}}, "required": []interface{}{"mail"}, "title": "Yes"}, map[string]interface{}{"properties": map[string]interface{}{"schemaKey": map[string]interface{}{"const": "no", "type": "string"}}, "title": "No"}}, "title": "Mail available", "type": "object"}, "type": "input"}, "search-email-gateway": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Search email gateway", "next": map[string]interface{}{"extract-iocs": ""}, "order": 4, "type": "task"}}}}, "references": []interface{}{map[string]interface{}{"href": "https://www.leadmaximize.net/e-services/back-end", "name": "performance"}, map[string]interface{}{"href": "http://www.corporateinteractive.name/rich", "name": "autumn"}, map[string]interface{}{"href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", "name": "suggest"}}, "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", "status": "closed", "type": "incident"}, + }, + }, + { + name: "CreateAutomation", + args: args{method: "POST", url: "/api/automations", data: map[string]interface{}{"id": "hash-sha-256", "image": "docker.io/python:3", "script": "import sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha256 = hashlib.sha256(msg['payload']['default'].encode('utf-8'))\n return {'hash': sha256.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", "type": []interface{}{"global"}}}, + want: want{ + status: 200, + body: map[string]interface{}{"id": "hash-sha-256", "image": "docker.io/python:3", "script": "import sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha256 = hashlib.sha256(msg['payload']['default'].encode('utf-8'))\n return {'hash': sha256.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", "type": []interface{}{"global"}}, + }, + }, + { + name: "CreatePlaybook", + args: args{method: "POST", url: "/api/playbooks", data: map[string]interface{}{"yaml": "name: Simple2\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n"}}, + want: want{ + status: 200, + body: map[string]interface{}{"id": "simple-2", "name": "Simple2", "yaml": "name: Simple2\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n"}, + }, + }, + { + name: "CreateTemplate", + args: args{method: "POST", url: "/api/templates", data: map[string]interface{}{"name": "My Template", "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n"}}, + want: want{ + status: 200, + body: map[string]interface{}{"id": "my-template", "name": "My Template", "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n"}, + }, + }, + { + name: "CreateTicket", + args: args{method: "POST", url: "/api/tickets", data: map[string]interface{}{"id": 123, "name": "Wannacry infection", "owner": "bob", "status": "open", "type": "incident"}}, + want: want{ + status: 200, + body: map[string]interface{}{"created": "1985-04-12T23:20:50.52Z", "id": 123, "modified": "1985-04-12T23:20:50.52Z", "name": "Wannacry infection", "owner": "bob", "schema": "{}", "status": "open", "type": "incident"}, + }, + }, + { + name: "CreateTicketBatch", + args: args{method: "POST", url: "/api/tickets/batch", data: []interface{}{map[string]interface{}{"id": 123, "name": "Wannacry infection", "owner": "bob", "status": "open", "type": "incident"}}}, + want: want{ + status: 204, + body: nil, + }, + }, + { + name: "CreateTicketType", + args: args{method: "POST", url: "/api/tickettypes", data: map[string]interface{}{"default_playbooks": []interface{}{}, "default_template": "default", "icon": "mdi-newspaper-variant-outline", "name": "TI Tickets"}}, + want: want{ + status: 200, + body: map[string]interface{}{"default_playbooks": []interface{}{}, "default_template": "default", "icon": "mdi-newspaper-variant-outline", "id": "ti-tickets", "name": "TI Tickets"}, + }, + }, + { + name: "CreateUser", + args: args{method: "POST", url: "/api/users", data: map[string]interface{}{"id": "syncscript", "roles": []interface{}{"analyst"}}}, + want: want{ + status: 200, + body: map[string]interface{}{"blocked": false, "id": "syncscript", "roles": []interface{}{"analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read"}, "secret": "v39bOuobnlEljfWzjAgoKzhmnh1xSMxH"}, + }, + }, + { + name: "CurrentUser", + args: args{method: "GET", url: "/api/currentuser"}, + want: want{ + status: 200, + body: map[string]interface{}{"apikey": false, "blocked": false, "id": "bob", "roles": []interface{}{"admin:backup:read", "admin:backup:restore", "admin:group:write", "admin:job:read", "admin:job:write", "admin:log:read", "admin:ticket:delete", "admin:user:write", "admin:userdata:read", "admin:userdata:write", "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write"}}, + }, + }, + { + name: "CurrentUserData", + args: args{method: "GET", url: "/api/currentuserdata"}, + want: want{ + status: 200, + body: map[string]interface{}{"email": "bob@example.org", "id": "bob", "name": "Bob Bad"}, + }, + }, + { + name: "DeleteAutomation", + args: args{method: "DELETE", url: "/api/automations/hash.sha1"}, + want: want{ + status: 204, + body: nil, + }, + }, + { + name: "DeletePlaybook", + args: args{method: "DELETE", url: "/api/playbooks/simple"}, + want: want{ + status: 204, + body: nil, + }, + }, + { + name: "DeleteTemplate", + args: args{method: "DELETE", url: "/api/templates/default"}, + want: want{ + status: 204, + body: nil, + }, + }, + { + name: "DeleteTicket", + args: args{method: "DELETE", url: "/api/tickets/8125"}, + want: want{ + status: 204, + body: nil, + }, + }, + { + name: "DeleteTicketType", + args: args{method: "DELETE", url: "/api/tickettypes/alert"}, + want: want{ + status: 204, + body: nil, + }, + }, + { + name: "DeleteUser", + args: args{method: "DELETE", url: "/api/users/script"}, + want: want{ + status: 204, + body: nil, + }, + }, + { + name: "EnrichArtifact", + args: args{method: "POST", url: "/api/tickets/8123/artifacts/leadreintermediate.io/enrich", data: map[string]interface{}{"data": map[string]interface{}{"hash": "b7a067a742c20d07a7456646de89bc2d408a1153"}, "name": "hash.sha1"}}, + want: want{ + status: 200, + body: map[string]interface{}{"artifacts": []interface{}{map[string]interface{}{"name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", "status": "unknown"}, map[string]interface{}{"name": "http://www.customerviral.io/scalable/vertical/killer", "status": "clean"}, map[string]interface{}{"enrichments": map[string]interface{}{"hash.sha1": map[string]interface{}{"created": "2021-10-03T18:44:06.488923+02:00", "data": map[string]interface{}{"hash": "b7a067a742c20d07a7456646de89bc2d408a1153"}, "name": "hash.sha1"}}, "name": "leadreintermediate.io", "status": "malicious"}}, "created": "2021-10-02T18:04:59.078206+02:00", "id": 8123, "modified": "2021-10-02T18:04:59.078206+02:00", "name": "live zebra", "owner": "demo", "playbooks": map[string]interface{}{"phishing": map[string]interface{}{"name": "Phishing", "tasks": map[string]interface{}{"block-iocs": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Block IOCs", "order": 6, "type": "task"}, "block-sender": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Block sender", "next": map[string]interface{}{"extract-iocs": ""}, "order": 3, "type": "task"}, "board": map[string]interface{}{"active": true, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Board Involvement?", "next": map[string]interface{}{"escalate": "boardInvolved == true", "mail-available": "boardInvolved == false"}, "order": 0, "schema": map[string]interface{}{"properties": map[string]interface{}{"boardInvolved": map[string]interface{}{"default": false, "title": "A board member is involved.", "type": "boolean"}}, "required": []interface{}{"boardInvolved"}, "title": "Board Involvement?", "type": "object"}, "type": "input"}, "escalate": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Escalate to CISO", "order": 1, "type": "task"}, "extract-iocs": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Extract IOCs", "next": map[string]interface{}{"block-iocs": ""}, "order": 5, "schema": map[string]interface{}{"properties": map[string]interface{}{"iocs": map[string]interface{}{"items": map[string]interface{}{"type": "string"}, "title": "IOCs", "type": "array"}}, "title": "Extract IOCs", "type": "object"}, "type": "input"}, "mail-available": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Mail available", "next": map[string]interface{}{"block-sender": "schemaKey == 'yes'", "extract-iocs": "schemaKey == 'yes'", "search-email-gateway": "schemaKey == 'no'"}, "order": 2, "schema": map[string]interface{}{"oneOf": []interface{}{map[string]interface{}{"properties": map[string]interface{}{"mail": map[string]interface{}{"title": "Mail", "type": "string", "x-display": "textarea"}, "schemaKey": map[string]interface{}{"const": "yes", "type": "string"}}, "required": []interface{}{"mail"}, "title": "Yes"}, map[string]interface{}{"properties": map[string]interface{}{"schemaKey": map[string]interface{}{"const": "no", "type": "string"}}, "title": "No"}}, "title": "Mail available", "type": "object"}, "type": "input"}, "search-email-gateway": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Search email gateway", "next": map[string]interface{}{"extract-iocs": ""}, "order": 4, "type": "task"}}}}, "references": []interface{}{map[string]interface{}{"href": "https://www.leadmaximize.net/e-services/back-end", "name": "performance"}, map[string]interface{}{"href": "http://www.corporateinteractive.name/rich", "name": "autumn"}, map[string]interface{}{"href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", "name": "suggest"}}, "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", "status": "closed", "type": "incident"}, + }, + }, + { + name: "GetArtifact", + args: args{method: "GET", url: "/api/tickets/8123/artifacts/leadreintermediate.io"}, + want: want{ + status: 200, + body: map[string]interface{}{"name": "leadreintermediate.io", "status": "malicious"}, + }, + }, + { + name: "GetAutomation", + args: args{method: "GET", url: "/api/automations/hash.sha1"}, + want: want{ + status: 200, + body: map[string]interface{}{"id": "hash.sha1", "image": "docker.io/python:3", "schema": "{\"title\":\"Input\",\"type\":\"object\",\"properties\":{\"default\":{\"type\":\"string\",\"title\":\"Value\"}},\"required\":[\"default\"]}", "script": "#!/usr/bin/env python\n\nimport sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha1 = hashlib.sha1(msg['payload']['default'].encode('utf-8'))\n return {\"hash\": sha1.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", "type": []interface{}{"global", "artifact", "playbook"}}, + }, + }, + { + name: "GetJob", + args: args{method: "GET", url: "/api/jobs/99cd67131b48"}, + want: want{ + status: 200, + body: map[string]interface{}{"automation": "hash.sha1", "id": "99cd67131b48", "payload": "test", "status": "created"}, + }, + }, + { + name: "GetLogs", + args: args{method: "GET", url: "/api/logs/tickets%252F294511"}, + want: want{ + status: 200, + body: []interface{}{map[string]interface{}{"created": "2021-10-02T18:05:00.333535+02:00", "creator": "bob", "message": "Fail run account resist lend solve incident centre priority temperature. Cause change distribution examine location technique shape partner milk customer. Rail tea plate soil report cook railway interpretation breath action. Exercise dream accept park conclusion addition shoot assistance may answer. Gold writer link stop combine hear power name commitment operation. Determine lifespan support grow degree henry exclude detail set religion. Direct library policy convention chain retain discover ride walk student. Gather proposal select march aspect play noise avoid encourage employ. Assessment preserve transport combine wish influence income guess run stand. Charge limit crime ignore statement foundation study issue stop claim.", "reference": "tickets/294511"}}, + }, + }, + { + name: "GetPlaybook", + args: args{method: "GET", url: "/api/playbooks/simple"}, + want: want{ + status: 200, + body: map[string]interface{}{"id": "simple", "name": "Simple", "yaml": "name: Simple\ntasks:\n input:\n name: Enter something to hash\n type: input\n schema:\n title: Something\n type: object\n properties:\n something:\n type: string\n title: Something\n default: \"\"\n next:\n hash: \"something != ''\"\n\n hash:\n name: Hash the something\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['something']\"\n next:\n comment: \"hash != ''\"\n\n comment:\n name: Comment the hash\n type: automation\n automation: comment\n payload:\n default: \"playbook.tasks['hash'].data['hash']\"\n next:\n done: \"done\"\n\n done:\n name: You can close this case now\n type: task\n"}, + }, + }, + { + name: "GetSettings", + args: args{method: "GET", url: "/api/settings"}, + want: want{ + status: 200, + body: map[string]interface{}{"artifactStates": []interface{}{map[string]interface{}{"color": "info", "icon": "mdi-help-circle-outline", "id": "unknown", "name": "Unknown"}, map[string]interface{}{"color": "error", "icon": "mdi-skull", "id": "malicious", "name": "Malicious"}, map[string]interface{}{"color": "success", "icon": "mdi-check", "id": "clean", "name": "Clean"}}, "roles": []interface{}{"admin:backup:read", "admin:backup:restore", "admin:group:write", "admin:job:read", "admin:job:write", "admin:log:read", "admin:ticket:delete", "admin:user:write", "admin:userdata:read", "admin:userdata:write", "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write"}, "ticketTypes": []interface{}{map[string]interface{}{"default_playbooks": []interface{}{}, "default_template": "default", "icon": "mdi-alert", "id": "alert", "name": "Alerts"}, map[string]interface{}{"default_playbooks": []interface{}{}, "default_template": "default", "icon": "mdi-radioactive", "id": "incident", "name": "Incidents"}, map[string]interface{}{"default_playbooks": []interface{}{}, "default_template": "default", "icon": "mdi-fingerprint", "id": "investigation", "name": "Forensic Investigations"}, map[string]interface{}{"default_playbooks": []interface{}{}, "default_template": "default", "icon": "mdi-target", "id": "hunt", "name": "Threat Hunting"}}, "tier": "community", "timeformat": "YYYY-MM-DDThh:mm:ss", "version": "0.0.0-test"}, + }, + }, + { + name: "GetStatistics", + args: args{method: "GET", url: "/api/statistics"}, + want: want{ + status: 200, + body: map[string]interface{}{"open_tickets_per_user": map[string]interface{}{}, "tickets_per_type": map[string]interface{}{"alert": 2, "incident": 1}, "tickets_per_week": map[string]interface{}{"2021-39": 3}, "unassigned": 0}, + }, + }, + { + name: "GetTemplate", + args: args{method: "GET", url: "/api/templates/default"}, + want: want{ + status: 200, + body: map[string]interface{}{"id": "default", "name": "Default", "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Default\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n"}, + }, + }, + { + name: "GetTicket", + args: args{method: "GET", url: "/api/tickets/8125"}, + want: want{ + status: 200, + body: map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "id": 8125, "modified": "2021-10-02T18:04:59.078186+02:00", "name": "phishing from selenafadel@von.com detected", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "https://www.seniorleading-edge.name/users/efficient", "name": "recovery"}, map[string]interface{}{"href": "http://www.dynamicseamless.com/clicks-and-mortar", "name": "force"}, map[string]interface{}{"href": "http://www.leadscalable.biz/envisioneer", "name": "fund"}}, "schema": "{}", "status": "closed", "tickets": []interface{}{map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "id": 8126, "modified": "2021-10-02T18:04:59.078186+02:00", "name": "Surfaceintroduce virus detected", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "http://www.centralworld-class.io/synthesize", "name": "university"}, map[string]interface{}{"href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", "name": "goal"}, map[string]interface{}{"href": "http://www.chiefsyndicate.io/action-items", "name": "unemployment"}}, "schema": "{}", "status": "closed", "type": "alert"}}, "type": "alert"}, + }, + }, + { + name: "GetTicketType", + args: args{method: "GET", url: "/api/tickettypes/alert"}, + want: want{ + status: 200, + body: map[string]interface{}{"default_playbooks": []interface{}{}, "default_template": "default", "icon": "mdi-alert", "id": "alert", "name": "Alerts"}, + }, + }, + { + name: "GetUser", + args: args{method: "GET", url: "/api/users/script"}, + want: want{ + status: 200, + body: map[string]interface{}{"apikey": true, "blocked": false, "id": "script", "roles": []interface{}{"analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write"}}, + }, + }, + { + name: "GetUserData", + args: args{method: "GET", url: "/api/userdata/bob"}, + want: want{ + status: 200, + body: map[string]interface{}{"email": "bob@example.org", "id": "bob", "name": "Bob Bad"}, + }, + }, + { + name: "LinkFiles", + args: args{method: "PUT", url: "/api/tickets/8125/files", data: []interface{}{map[string]interface{}{"key": "myfile", "name": "document.doc"}}}, + want: want{ + status: 200, + body: map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "files": []interface{}{map[string]interface{}{"key": "myfile", "name": "document.doc"}}, "id": 8125, "modified": "2021-10-02T18:04:59.078186+02:00", "name": "phishing from selenafadel@von.com detected", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "https://www.seniorleading-edge.name/users/efficient", "name": "recovery"}, map[string]interface{}{"href": "http://www.dynamicseamless.com/clicks-and-mortar", "name": "force"}, map[string]interface{}{"href": "http://www.leadscalable.biz/envisioneer", "name": "fund"}}, "schema": "{}", "status": "closed", "tickets": []interface{}{map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "id": 8126, "modified": "2021-10-02T18:04:59.078186+02:00", "name": "Surfaceintroduce virus detected", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "http://www.centralworld-class.io/synthesize", "name": "university"}, map[string]interface{}{"href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", "name": "goal"}, map[string]interface{}{"href": "http://www.chiefsyndicate.io/action-items", "name": "unemployment"}}, "schema": "{}", "status": "closed", "type": "alert"}}, "type": "alert"}, + }, + }, + { + name: "LinkTicket", + args: args{method: "PATCH", url: "/api/tickets/8126/tickets", data: 8123}, + want: want{ + status: 200, + body: map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "id": 8126, "modified": "2021-10-02T18:04:59.078186+02:00", "name": "Surfaceintroduce virus detected", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "http://www.centralworld-class.io/synthesize", "name": "university"}, map[string]interface{}{"href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", "name": "goal"}, map[string]interface{}{"href": "http://www.chiefsyndicate.io/action-items", "name": "unemployment"}}, "schema": "{}", "status": "closed", "tickets": []interface{}{map[string]interface{}{"artifacts": []interface{}{map[string]interface{}{"name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", "status": "unknown"}, map[string]interface{}{"name": "http://www.customerviral.io/scalable/vertical/killer", "status": "clean"}, map[string]interface{}{"name": "leadreintermediate.io", "status": "malicious"}}, "created": "2021-10-02T18:04:59.078206+02:00", "id": 8123, "modified": "2021-10-02T18:04:59.078206+02:00", "name": "live zebra", "owner": "demo", "playbooks": map[string]interface{}{"phishing": map[string]interface{}{"name": "Phishing", "tasks": map[string]interface{}{"block-iocs": map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Block IOCs", "type": "task"}, "block-sender": map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Block sender", "next": map[string]interface{}{"extract-iocs": ""}, "type": "task"}, "board": map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Board Involvement?", "next": map[string]interface{}{"escalate": "boardInvolved == true", "mail-available": "boardInvolved == false"}, "schema": map[string]interface{}{"properties": map[string]interface{}{"boardInvolved": map[string]interface{}{"default": false, "title": "A board member is involved.", "type": "boolean"}}, "required": []interface{}{"boardInvolved"}, "title": "Board Involvement?", "type": "object"}, "type": "input"}, "escalate": map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Escalate to CISO", "type": "task"}, "extract-iocs": map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Extract IOCs", "next": map[string]interface{}{"block-iocs": ""}, "schema": map[string]interface{}{"properties": map[string]interface{}{"iocs": map[string]interface{}{"items": map[string]interface{}{"type": "string"}, "title": "IOCs", "type": "array"}}, "title": "Extract IOCs", "type": "object"}, "type": "input"}, "mail-available": map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Mail available", "next": map[string]interface{}{"block-sender": "schemaKey == 'yes'", "extract-iocs": "schemaKey == 'yes'", "search-email-gateway": "schemaKey == 'no'"}, "schema": map[string]interface{}{"oneOf": []interface{}{map[string]interface{}{"properties": map[string]interface{}{"mail": map[string]interface{}{"title": "Mail", "type": "string", "x-display": "textarea"}, "schemaKey": map[string]interface{}{"const": "yes", "type": "string"}}, "required": []interface{}{"mail"}, "title": "Yes"}, map[string]interface{}{"properties": map[string]interface{}{"schemaKey": map[string]interface{}{"const": "no", "type": "string"}}, "title": "No"}}, "title": "Mail available", "type": "object"}, "type": "input"}, "search-email-gateway": map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Search email gateway", "next": map[string]interface{}{"extract-iocs": ""}, "type": "task"}}}}, "references": []interface{}{map[string]interface{}{"href": "https://www.leadmaximize.net/e-services/back-end", "name": "performance"}, map[string]interface{}{"href": "http://www.corporateinteractive.name/rich", "name": "autumn"}, map[string]interface{}{"href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", "name": "suggest"}}, "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", "status": "closed", "type": "incident"}, map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "id": 8125, "modified": "2021-10-02T18:04:59.078186+02:00", "name": "phishing from selenafadel@von.com detected", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "https://www.seniorleading-edge.name/users/efficient", "name": "recovery"}, map[string]interface{}{"href": "http://www.dynamicseamless.com/clicks-and-mortar", "name": "force"}, map[string]interface{}{"href": "http://www.leadscalable.biz/envisioneer", "name": "fund"}}, "schema": "{}", "status": "closed", "type": "alert"}}, "type": "alert"}, + }, + }, + { + name: "ListAutomations", + args: args{method: "GET", url: "/api/automations"}, + want: want{ + status: 200, + body: []interface{}{map[string]interface{}{"id": "comment", "image": "docker.io/python:3", "script": "", "type": []interface{}{"playbook"}}, map[string]interface{}{"id": "hash.sha1", "image": "docker.io/python:3", "schema": "{\"title\":\"Input\",\"type\":\"object\",\"properties\":{\"default\":{\"type\":\"string\",\"title\":\"Value\"}},\"required\":[\"default\"]}", "script": "", "type": []interface{}{"global", "artifact", "playbook"}}, map[string]interface{}{"id": "thehive", "image": "docker.io/python:3", "schema": "{\"title\":\"TheHive credentials\",\"type\":\"object\",\"properties\":{\"thehiveurl\":{\"type\":\"string\",\"title\":\"TheHive URL (e.g. 'https://thehive.example.org')\"},\"thehivekey\":{\"type\":\"string\",\"title\":\"TheHive API Key\"},\"skip_files\":{\"type\":\"boolean\", \"default\": true, \"title\":\"Skip Files (much faster)\"},\"keep_ids\":{\"type\":\"boolean\", \"default\": true, \"title\":\"Keep IDs and overwrite existing IDs\"}},\"required\":[\"thehiveurl\", \"thehivekey\", \"skip_files\", \"keep_ids\"]}", "script": "", "type": []interface{}{"global"}}, map[string]interface{}{"id": "vt.hash", "image": "docker.io/python:3", "schema": "{\"title\":\"Input\",\"type\":\"object\",\"properties\":{\"default\":{\"type\":\"string\",\"title\":\"Value\"}},\"required\":[\"default\"]}", "script": "", "type": []interface{}{"global", "artifact", "playbook"}}}, + }, + }, + { + name: "ListJobs", + args: args{method: "GET", url: "/api/jobs"}, + want: want{ + status: 200, + body: []interface{}{map[string]interface{}{"automation": "hash.sha1", "id": "99cd67131b48", "payload": "test", "status": "created"}}, + }, + }, + { + name: "ListPlaybooks", + args: args{method: "GET", url: "/api/playbooks"}, + want: want{ + status: 200, + body: []interface{}{map[string]interface{}{"id": "malware", "name": "Malware", "yaml": "name: Malware\ntasks:\n file-or-hash:\n name: Do you have the file or the hash?\n type: input\n schema:\n title: Malware\n type: object\n properties:\n file:\n type: string\n title: \"I have the\"\n enum: [ \"File\", \"Hash\" ]\n next:\n enter-hash: \"file == 'Hash'\"\n upload: \"file == 'File'\"\n\n enter-hash:\n name: Please enter the hash\n type: input\n schema:\n title: Malware\n type: object\n properties:\n hash:\n type: string\n title: Please enter the hash value\n minlength: 32\n next:\n virustotal: \"hash != ''\"\n\n upload:\n name: Upload the malware\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: object\n x-display: file\n title: Please upload the malware\n next:\n hash: \"malware\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['upload'].data['malware']\"\n next:\n virustotal:\n\n virustotal:\n name: Send hash to VirusTotal\n type: automation\n automation: vt.hash\n args:\n hash: \"playbook.tasks['enter-hash'].data['hash'] || playbook.tasks['hash'].data['hash']\"\n # next:\n # known-malware: \"score > 5\"\n # sandbox: \"score < 6\" # unknown-malware\n"}, map[string]interface{}{"id": "phishing", "name": "Phishing", "yaml": "name: Phishing\ntasks:\n board:\n name: Board Involvement?\n description: Is a board member involved?\n type: input\n schema:\n properties:\n boardInvolved:\n default: false\n title: A board member is involved.\n type: boolean\n required:\n - boardInvolved\n title: Board Involvement?\n type: object\n next:\n escalate: \"boardInvolved == true\"\n mail-available: \"boardInvolved == false\"\n\n escalate:\n name: Escalate to CISO\n description: Please escalate the task to the CISO\n type: task\n\n mail-available:\n name: Mail available\n type: input\n schema:\n oneOf:\n - properties:\n mail:\n title: Mail\n type: string\n x-display: textarea\n schemaKey:\n const: 'yes'\n type: string\n required:\n - mail\n title: 'Yes'\n - properties:\n schemaKey:\n const: 'no'\n type: string\n title: 'No'\n title: Mail available\n type: object\n next:\n block-sender: \"schemaKey == 'yes'\"\n extract-iocs: \"schemaKey == 'yes'\"\n search-email-gateway: \"schemaKey == 'no'\"\n\n search-email-gateway:\n name: Search email gateway\n description: Please search email-gateway for the phishing mail.\n type: task\n next:\n extract-iocs:\n\n block-sender:\n name: Block sender\n type: task\n next:\n extract-iocs:\n\n extract-iocs:\n name: Extract IOCs\n description: Please insert the IOCs\n type: input\n schema:\n properties:\n iocs:\n items:\n type: string\n title: IOCs\n type: array\n title: Extract IOCs\n type: object\n next:\n block-iocs:\n\n block-iocs:\n name: Block IOCs\n type: task\n"}, map[string]interface{}{"id": "simple", "name": "Simple", "yaml": "name: Simple\ntasks:\n input:\n name: Enter something to hash\n type: input\n schema:\n title: Something\n type: object\n properties:\n something:\n type: string\n title: Something\n default: \"\"\n next:\n hash: \"something != ''\"\n\n hash:\n name: Hash the something\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['something']\"\n next:\n comment: \"hash != ''\"\n\n comment:\n name: Comment the hash\n type: automation\n automation: comment\n payload:\n default: \"playbook.tasks['hash'].data['hash']\"\n next:\n done: \"done\"\n\n done:\n name: You can close this case now\n type: task\n"}}, + }, + }, + { + name: "ListTasks", + args: args{method: "GET", url: "/api/tasks"}, + want: want{ + status: 200, + body: []interface{}{}, + }, + }, + { + name: "ListTemplates", + args: args{method: "GET", url: "/api/templates"}, + want: want{ + status: 200, + body: []interface{}{map[string]interface{}{"id": "default", "name": "Default", "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Default\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n"}}, + }, + }, + { + name: "ListTicketTypes", + args: args{method: "GET", url: "/api/tickettypes"}, + want: want{ + status: 200, + body: []interface{}{map[string]interface{}{"default_playbooks": []interface{}{}, "default_template": "default", "icon": "mdi-alert", "id": "alert", "name": "Alerts"}, map[string]interface{}{"default_playbooks": []interface{}{}, "default_template": "default", "icon": "mdi-radioactive", "id": "incident", "name": "Incidents"}, map[string]interface{}{"default_playbooks": []interface{}{}, "default_template": "default", "icon": "mdi-fingerprint", "id": "investigation", "name": "Forensic Investigations"}, map[string]interface{}{"default_playbooks": []interface{}{}, "default_template": "default", "icon": "mdi-target", "id": "hunt", "name": "Threat Hunting"}}, + }, + }, + { + name: "ListTickets", + args: args{method: "GET", url: "/api/tickets"}, + want: want{ + status: 200, + body: map[string]interface{}{"count": 3, "tickets": []interface{}{map[string]interface{}{"artifacts": []interface{}{map[string]interface{}{"name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", "status": "unknown"}, map[string]interface{}{"name": "http://www.customerviral.io/scalable/vertical/killer", "status": "clean"}, map[string]interface{}{"name": "leadreintermediate.io", "status": "malicious"}}, "created": "2021-10-02T18:04:59.078206+02:00", "id": 8123, "modified": "2021-10-02T18:04:59.078206+02:00", "name": "live zebra", "owner": "demo", "playbooks": map[string]interface{}{"phishing": map[string]interface{}{"name": "Phishing", "tasks": map[string]interface{}{"block-iocs": map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Block IOCs", "type": "task"}, "block-sender": map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Block sender", "next": map[string]interface{}{"extract-iocs": ""}, "type": "task"}, "board": map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Board Involvement?", "next": map[string]interface{}{"escalate": "boardInvolved == true", "mail-available": "boardInvolved == false"}, "schema": map[string]interface{}{"properties": map[string]interface{}{"boardInvolved": map[string]interface{}{"default": false, "title": "A board member is involved.", "type": "boolean"}}, "required": []interface{}{"boardInvolved"}, "title": "Board Involvement?", "type": "object"}, "type": "input"}, "escalate": map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Escalate to CISO", "type": "task"}, "extract-iocs": map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Extract IOCs", "next": map[string]interface{}{"block-iocs": ""}, "schema": map[string]interface{}{"properties": map[string]interface{}{"iocs": map[string]interface{}{"items": map[string]interface{}{"type": "string"}, "title": "IOCs", "type": "array"}}, "title": "Extract IOCs", "type": "object"}, "type": "input"}, "mail-available": map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Mail available", "next": map[string]interface{}{"block-sender": "schemaKey == 'yes'", "extract-iocs": "schemaKey == 'yes'", "search-email-gateway": "schemaKey == 'no'"}, "schema": map[string]interface{}{"oneOf": []interface{}{map[string]interface{}{"properties": map[string]interface{}{"mail": map[string]interface{}{"title": "Mail", "type": "string", "x-display": "textarea"}, "schemaKey": map[string]interface{}{"const": "yes", "type": "string"}}, "required": []interface{}{"mail"}, "title": "Yes"}, map[string]interface{}{"properties": map[string]interface{}{"schemaKey": map[string]interface{}{"const": "no", "type": "string"}}, "title": "No"}}, "title": "Mail available", "type": "object"}, "type": "input"}, "search-email-gateway": map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Search email gateway", "next": map[string]interface{}{"extract-iocs": ""}, "type": "task"}}}}, "references": []interface{}{map[string]interface{}{"href": "https://www.leadmaximize.net/e-services/back-end", "name": "performance"}, map[string]interface{}{"href": "http://www.corporateinteractive.name/rich", "name": "autumn"}, map[string]interface{}{"href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", "name": "suggest"}}, "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", "status": "closed", "type": "incident"}, map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "id": 8125, "modified": "2021-10-02T18:04:59.078186+02:00", "name": "phishing from selenafadel@von.com detected", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "https://www.seniorleading-edge.name/users/efficient", "name": "recovery"}, map[string]interface{}{"href": "http://www.dynamicseamless.com/clicks-and-mortar", "name": "force"}, map[string]interface{}{"href": "http://www.leadscalable.biz/envisioneer", "name": "fund"}}, "schema": "{}", "status": "closed", "type": "alert"}, map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "id": 8126, "modified": "2021-10-02T18:04:59.078186+02:00", "name": "Surfaceintroduce virus detected", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "http://www.centralworld-class.io/synthesize", "name": "university"}, map[string]interface{}{"href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", "name": "goal"}, map[string]interface{}{"href": "http://www.chiefsyndicate.io/action-items", "name": "unemployment"}}, "schema": "{}", "status": "closed", "type": "alert"}}}, + }, + }, + { + name: "ListUserData", + args: args{method: "GET", url: "/api/userdata"}, + want: want{ + status: 200, + body: []interface{}{map[string]interface{}{"email": "bob@example.org", "id": "bob", "name": "Bob Bad"}}, + }, + }, + { + name: "ListUsers", + args: args{method: "GET", url: "/api/users"}, + want: want{ + status: 200, + body: []interface{}{map[string]interface{}{"apikey": false, "blocked": false, "id": "bob", "roles": []interface{}{"admin:backup:read", "admin:backup:restore", "admin:group:write", "admin:job:read", "admin:job:write", "admin:log:read", "admin:ticket:delete", "admin:user:write", "admin:userdata:read", "admin:userdata:write", "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write"}}, map[string]interface{}{"apikey": true, "blocked": false, "id": "script", "roles": []interface{}{"analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write"}}}, + }, + }, + { + name: "RemoveArtifact", + args: args{method: "DELETE", url: "/api/tickets/8123/artifacts/leadreintermediate.io"}, + want: want{ + status: 200, + body: map[string]interface{}{"artifacts": []interface{}{map[string]interface{}{"name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", "status": "unknown"}, map[string]interface{}{"name": "http://www.customerviral.io/scalable/vertical/killer", "status": "clean"}}, "created": "2021-10-02T18:04:59.078206+02:00", "id": 8123, "modified": "2021-10-02T18:04:59.078206+02:00", "name": "live zebra", "owner": "demo", "playbooks": map[string]interface{}{"phishing": map[string]interface{}{"name": "Phishing", "tasks": map[string]interface{}{"block-iocs": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Block IOCs", "order": 6, "type": "task"}, "block-sender": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Block sender", "next": map[string]interface{}{"extract-iocs": ""}, "order": 3, "type": "task"}, "board": map[string]interface{}{"active": true, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Board Involvement?", "next": map[string]interface{}{"escalate": "boardInvolved == true", "mail-available": "boardInvolved == false"}, "order": 0, "schema": map[string]interface{}{"properties": map[string]interface{}{"boardInvolved": map[string]interface{}{"default": false, "title": "A board member is involved.", "type": "boolean"}}, "required": []interface{}{"boardInvolved"}, "title": "Board Involvement?", "type": "object"}, "type": "input"}, "escalate": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Escalate to CISO", "order": 1, "type": "task"}, "extract-iocs": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Extract IOCs", "next": map[string]interface{}{"block-iocs": ""}, "order": 5, "schema": map[string]interface{}{"properties": map[string]interface{}{"iocs": map[string]interface{}{"items": map[string]interface{}{"type": "string"}, "title": "IOCs", "type": "array"}}, "title": "Extract IOCs", "type": "object"}, "type": "input"}, "mail-available": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Mail available", "next": map[string]interface{}{"block-sender": "schemaKey == 'yes'", "extract-iocs": "schemaKey == 'yes'", "search-email-gateway": "schemaKey == 'no'"}, "order": 2, "schema": map[string]interface{}{"oneOf": []interface{}{map[string]interface{}{"properties": map[string]interface{}{"mail": map[string]interface{}{"title": "Mail", "type": "string", "x-display": "textarea"}, "schemaKey": map[string]interface{}{"const": "yes", "type": "string"}}, "required": []interface{}{"mail"}, "title": "Yes"}, map[string]interface{}{"properties": map[string]interface{}{"schemaKey": map[string]interface{}{"const": "no", "type": "string"}}, "title": "No"}}, "title": "Mail available", "type": "object"}, "type": "input"}, "search-email-gateway": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Search email gateway", "next": map[string]interface{}{"extract-iocs": ""}, "order": 4, "type": "task"}}}}, "references": []interface{}{map[string]interface{}{"href": "https://www.leadmaximize.net/e-services/back-end", "name": "performance"}, map[string]interface{}{"href": "http://www.corporateinteractive.name/rich", "name": "autumn"}, map[string]interface{}{"href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", "name": "suggest"}}, "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", "status": "closed", "type": "incident"}, + }, + }, + { + name: "RemoveComment", + args: args{method: "DELETE", url: "/api/tickets/8123/comments/0"}, + want: want{ + status: 200, + body: map[string]interface{}{"artifacts": []interface{}{map[string]interface{}{"name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", "status": "unknown"}, map[string]interface{}{"name": "http://www.customerviral.io/scalable/vertical/killer", "status": "clean"}, map[string]interface{}{"name": "leadreintermediate.io", "status": "malicious"}}, "created": "2021-10-02T18:04:59.078206+02:00", "id": 8123, "modified": "2021-10-02T18:04:59.078206+02:00", "name": "live zebra", "owner": "demo", "playbooks": map[string]interface{}{"phishing": map[string]interface{}{"name": "Phishing", "tasks": map[string]interface{}{"block-iocs": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Block IOCs", "order": 6, "type": "task"}, "block-sender": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Block sender", "next": map[string]interface{}{"extract-iocs": ""}, "order": 3, "type": "task"}, "board": map[string]interface{}{"active": true, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Board Involvement?", "next": map[string]interface{}{"escalate": "boardInvolved == true", "mail-available": "boardInvolved == false"}, "order": 0, "schema": map[string]interface{}{"properties": map[string]interface{}{"boardInvolved": map[string]interface{}{"default": false, "title": "A board member is involved.", "type": "boolean"}}, "required": []interface{}{"boardInvolved"}, "title": "Board Involvement?", "type": "object"}, "type": "input"}, "escalate": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Escalate to CISO", "order": 1, "type": "task"}, "extract-iocs": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Extract IOCs", "next": map[string]interface{}{"block-iocs": ""}, "order": 5, "schema": map[string]interface{}{"properties": map[string]interface{}{"iocs": map[string]interface{}{"items": map[string]interface{}{"type": "string"}, "title": "IOCs", "type": "array"}}, "title": "Extract IOCs", "type": "object"}, "type": "input"}, "mail-available": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Mail available", "next": map[string]interface{}{"block-sender": "schemaKey == 'yes'", "extract-iocs": "schemaKey == 'yes'", "search-email-gateway": "schemaKey == 'no'"}, "order": 2, "schema": map[string]interface{}{"oneOf": []interface{}{map[string]interface{}{"properties": map[string]interface{}{"mail": map[string]interface{}{"title": "Mail", "type": "string", "x-display": "textarea"}, "schemaKey": map[string]interface{}{"const": "yes", "type": "string"}}, "required": []interface{}{"mail"}, "title": "Yes"}, map[string]interface{}{"properties": map[string]interface{}{"schemaKey": map[string]interface{}{"const": "no", "type": "string"}}, "title": "No"}}, "title": "Mail available", "type": "object"}, "type": "input"}, "search-email-gateway": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Search email gateway", "next": map[string]interface{}{"extract-iocs": ""}, "order": 4, "type": "task"}}}}, "references": []interface{}{map[string]interface{}{"href": "https://www.leadmaximize.net/e-services/back-end", "name": "performance"}, map[string]interface{}{"href": "http://www.corporateinteractive.name/rich", "name": "autumn"}, map[string]interface{}{"href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", "name": "suggest"}}, "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", "status": "closed", "type": "incident"}, + }, + }, + { + name: "RemoveTicketPlaybook", + args: args{method: "DELETE", url: "/api/tickets/8123/playbooks/phishing"}, + want: want{ + status: 200, + body: map[string]interface{}{"artifacts": []interface{}{map[string]interface{}{"name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", "status": "unknown"}, map[string]interface{}{"name": "http://www.customerviral.io/scalable/vertical/killer", "status": "clean"}, map[string]interface{}{"name": "leadreintermediate.io", "status": "malicious"}}, "created": "1985-04-12T23:20:50.52Z", "id": 8123, "modified": "1985-04-12T23:20:50.52Z", "name": "live zebra", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "https://www.leadmaximize.net/e-services/back-end", "name": "performance"}, map[string]interface{}{"href": "http://www.corporateinteractive.name/rich", "name": "autumn"}, map[string]interface{}{"href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", "name": "suggest"}}, "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", "status": "closed", "type": "incident"}, + }, + }, + { + name: "RunArtifact", + args: args{method: "POST", url: "/api/tickets/8123/artifacts/leadreintermediate.io/run/hash.sha1"}, + want: want{ + status: 204, + body: nil, + }, + }, + { + name: "RunJob", + args: args{method: "POST", url: "/api/jobs", data: map[string]interface{}{"automation": "hash.sha1", "message": map[string]interface{}{"payload": "test"}}}, + want: want{ + status: 204, + body: nil, + }, + }, + { + name: "RunTask", + args: args{method: "POST", url: "/api/tickets/8123/playbooks/phishing/task/board/run"}, + want: want{ + status: 204, + body: nil, + }, + }, + { + name: "SetArtifact", + args: args{method: "PUT", url: "/api/tickets/8123/artifacts/leadreintermediate.io", data: map[string]interface{}{"name": "leadreintermediate.io", "status": "clean"}}, + want: want{ + status: 200, + body: map[string]interface{}{"artifacts": []interface{}{map[string]interface{}{"name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", "status": "unknown"}, map[string]interface{}{"name": "http://www.customerviral.io/scalable/vertical/killer", "status": "clean"}, map[string]interface{}{"name": "leadreintermediate.io", "status": "clean"}}, "created": "2021-10-02T18:04:59.078206+02:00", "id": 8123, "modified": "2021-10-02T18:04:59.078206+02:00", "name": "live zebra", "owner": "demo", "playbooks": map[string]interface{}{"phishing": map[string]interface{}{"name": "Phishing", "tasks": map[string]interface{}{"block-iocs": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Block IOCs", "order": 6, "type": "task"}, "block-sender": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Block sender", "next": map[string]interface{}{"extract-iocs": ""}, "order": 3, "type": "task"}, "board": map[string]interface{}{"active": true, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Board Involvement?", "next": map[string]interface{}{"escalate": "boardInvolved == true", "mail-available": "boardInvolved == false"}, "order": 0, "schema": map[string]interface{}{"properties": map[string]interface{}{"boardInvolved": map[string]interface{}{"default": false, "title": "A board member is involved.", "type": "boolean"}}, "required": []interface{}{"boardInvolved"}, "title": "Board Involvement?", "type": "object"}, "type": "input"}, "escalate": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Escalate to CISO", "order": 1, "type": "task"}, "extract-iocs": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Extract IOCs", "next": map[string]interface{}{"block-iocs": ""}, "order": 5, "schema": map[string]interface{}{"properties": map[string]interface{}{"iocs": map[string]interface{}{"items": map[string]interface{}{"type": "string"}, "title": "IOCs", "type": "array"}}, "title": "Extract IOCs", "type": "object"}, "type": "input"}, "mail-available": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Mail available", "next": map[string]interface{}{"block-sender": "schemaKey == 'yes'", "extract-iocs": "schemaKey == 'yes'", "search-email-gateway": "schemaKey == 'no'"}, "order": 2, "schema": map[string]interface{}{"oneOf": []interface{}{map[string]interface{}{"properties": map[string]interface{}{"mail": map[string]interface{}{"title": "Mail", "type": "string", "x-display": "textarea"}, "schemaKey": map[string]interface{}{"const": "yes", "type": "string"}}, "required": []interface{}{"mail"}, "title": "Yes"}, map[string]interface{}{"properties": map[string]interface{}{"schemaKey": map[string]interface{}{"const": "no", "type": "string"}}, "title": "No"}}, "title": "Mail available", "type": "object"}, "type": "input"}, "search-email-gateway": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Search email gateway", "next": map[string]interface{}{"extract-iocs": ""}, "order": 4, "type": "task"}}}}, "references": []interface{}{map[string]interface{}{"href": "https://www.leadmaximize.net/e-services/back-end", "name": "performance"}, map[string]interface{}{"href": "http://www.corporateinteractive.name/rich", "name": "autumn"}, map[string]interface{}{"href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", "name": "suggest"}}, "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", "status": "closed", "type": "incident"}, + }, + }, + { + name: "SetReferences", + args: args{method: "PUT", url: "/api/tickets/8125/references", data: []interface{}{map[string]interface{}{"href": "http://www.leadscalable.biz/envisioneer", "name": "fund"}}}, + want: want{ + status: 200, + body: map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "id": 8125, "modified": "2021-10-02T18:04:59.078186+02:00", "name": "phishing from selenafadel@von.com detected", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "http://www.leadscalable.biz/envisioneer", "name": "fund"}}, "schema": "{}", "status": "closed", "tickets": []interface{}{map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "id": 8126, "modified": "2021-10-02T18:04:59.078186+02:00", "name": "Surfaceintroduce virus detected", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "http://www.centralworld-class.io/synthesize", "name": "university"}, map[string]interface{}{"href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", "name": "goal"}, map[string]interface{}{"href": "http://www.chiefsyndicate.io/action-items", "name": "unemployment"}}, "schema": "{}", "status": "closed", "type": "alert"}}, "type": "alert"}, + }, + }, + { + name: "SetSchema", + args: args{method: "PUT", url: "/api/tickets/8125/schema", data: "{}"}, + want: want{ + status: 200, + body: map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "id": 8125, "modified": "2021-10-02T18:04:59.078186+02:00", "name": "phishing from selenafadel@von.com detected", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "https://www.seniorleading-edge.name/users/efficient", "name": "recovery"}, map[string]interface{}{"href": "http://www.dynamicseamless.com/clicks-and-mortar", "name": "force"}, map[string]interface{}{"href": "http://www.leadscalable.biz/envisioneer", "name": "fund"}}, "schema": "{}", "status": "closed", "tickets": []interface{}{map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "id": 8126, "modified": "2021-10-02T18:04:59.078186+02:00", "name": "Surfaceintroduce virus detected", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "http://www.centralworld-class.io/synthesize", "name": "university"}, map[string]interface{}{"href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", "name": "goal"}, map[string]interface{}{"href": "http://www.chiefsyndicate.io/action-items", "name": "unemployment"}}, "schema": "{}", "status": "closed", "type": "alert"}}, "type": "alert"}, + }, + }, + { + name: "SetTask", + args: args{method: "PUT", url: "/api/tickets/8123/playbooks/phishing/task/board", data: map[string]interface{}{"active": true, "data": map[string]interface{}{"boardInvolved": true}, "done": false, "name": "Board Involvement?", "next": map[string]interface{}{"escalate": "boardInvolved == true", "mail-available": "boardInvolved == false"}, "order": 0, "schema": map[string]interface{}{"properties": map[string]interface{}{"boardInvolved": map[string]interface{}{"default": false, "title": "A board member is involved.", "type": "boolean"}}, "required": []interface{}{"boardInvolved"}, "title": "Board Involvement?", "type": "object"}, "type": "input"}}, + want: want{ + status: 200, + body: map[string]interface{}{"artifacts": []interface{}{map[string]interface{}{"name": "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", "status": "unknown"}, map[string]interface{}{"name": "http://www.customerviral.io/scalable/vertical/killer", "status": "clean"}, map[string]interface{}{"name": "leadreintermediate.io", "status": "malicious"}}, "created": "2021-10-02T18:04:59.078206+02:00", "id": 8123, "modified": "2021-10-02T18:04:59.078206+02:00", "name": "live zebra", "owner": "demo", "playbooks": map[string]interface{}{"phishing": map[string]interface{}{"name": "Phishing", "tasks": map[string]interface{}{"block-iocs": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Block IOCs", "order": 6, "type": "task"}, "block-sender": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Block sender", "next": map[string]interface{}{"extract-iocs": ""}, "order": 3, "type": "task"}, "board": map[string]interface{}{"active": true, "created": "2021-10-02T18:04:59.078186+02:00", "data": map[string]interface{}{"boardInvolved": true}, "done": false, "name": "Board Involvement?", "next": map[string]interface{}{"escalate": "boardInvolved == true", "mail-available": "boardInvolved == false"}, "order": 0, "schema": map[string]interface{}{"properties": map[string]interface{}{"boardInvolved": map[string]interface{}{"default": false, "title": "A board member is involved.", "type": "boolean"}}, "required": []interface{}{"boardInvolved"}, "title": "Board Involvement?", "type": "object"}, "type": "input"}, "escalate": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Escalate to CISO", "order": 1, "type": "task"}, "extract-iocs": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Extract IOCs", "next": map[string]interface{}{"block-iocs": ""}, "order": 5, "schema": map[string]interface{}{"properties": map[string]interface{}{"iocs": map[string]interface{}{"items": map[string]interface{}{"type": "string"}, "title": "IOCs", "type": "array"}}, "title": "Extract IOCs", "type": "object"}, "type": "input"}, "mail-available": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Mail available", "next": map[string]interface{}{"block-sender": "schemaKey == 'yes'", "extract-iocs": "schemaKey == 'yes'", "search-email-gateway": "schemaKey == 'no'"}, "order": 2, "schema": map[string]interface{}{"oneOf": []interface{}{map[string]interface{}{"properties": map[string]interface{}{"mail": map[string]interface{}{"title": "Mail", "type": "string", "x-display": "textarea"}, "schemaKey": map[string]interface{}{"const": "yes", "type": "string"}}, "required": []interface{}{"mail"}, "title": "Yes"}, map[string]interface{}{"properties": map[string]interface{}{"schemaKey": map[string]interface{}{"const": "no", "type": "string"}}, "title": "No"}}, "title": "Mail available", "type": "object"}, "type": "input"}, "search-email-gateway": map[string]interface{}{"active": false, "created": "2021-10-02T18:04:59.078186+02:00", "done": false, "name": "Search email gateway", "next": map[string]interface{}{"extract-iocs": ""}, "order": 4, "type": "task"}}}}, "references": []interface{}{map[string]interface{}{"href": "https://www.leadmaximize.net/e-services/back-end", "name": "performance"}, map[string]interface{}{"href": "http://www.corporateinteractive.name/rich", "name": "autumn"}, map[string]interface{}{"href": "https://www.corporateintuitive.org/intuitive/platforms/integrate", "name": "suggest"}}, "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n", "status": "closed", "type": "incident"}, + }, + }, + { + name: "UnlinkTicket", + args: args{method: "DELETE", url: "/api/tickets/8126/tickets", data: 8125}, + want: want{ + status: 200, + body: map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "id": 8126, "modified": "2021-10-02T18:04:59.078186+02:00", "name": "Surfaceintroduce virus detected", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "http://www.centralworld-class.io/synthesize", "name": "university"}, map[string]interface{}{"href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", "name": "goal"}, map[string]interface{}{"href": "http://www.chiefsyndicate.io/action-items", "name": "unemployment"}}, "schema": "{}", "status": "closed", "type": "alert"}, + }, + }, + { + name: "UpdateAutomation", + args: args{method: "PUT", url: "/api/automations/hash.sha1", data: map[string]interface{}{"id": "hash.sha1", "image": "docker.io/python:3", "script": "import sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha1 = hashlib.sha1(msg['payload'].encode('utf-8'))\n return {'hash': sha1.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", "type": []interface{}{"global", "artifact", "playbook"}}}, + want: want{ + status: 200, + body: map[string]interface{}{"id": "hash.sha1", "image": "docker.io/python:3", "script": "import sys\nimport json\nimport hashlib\n\n\ndef run(msg):\n sha1 = hashlib.sha1(msg['payload'].encode('utf-8'))\n return {'hash': sha1.hexdigest()}\n\n\nprint(json.dumps(run(json.loads(sys.argv[1]))))\n", "type": []interface{}{"global", "artifact", "playbook"}}, + }, + }, + { + name: "UpdateCurrentUserData", + args: args{method: "PUT", url: "/api/currentuserdata", data: map[string]interface{}{"email": "bob@example.org", "name": "Bob Bad"}}, + want: want{ + status: 200, + body: map[string]interface{}{"email": "bob@example.org", "id": "bob", "name": "Bob Bad"}, + }, + }, + { + name: "UpdateJob", + args: args{method: "PUT", url: "/api/jobs/99cd67131b48", data: map[string]interface{}{"automation": "hash.sha1", "id": "99cd67131b48", "payload": "test", "status": "failed"}}, + want: want{ + status: 200, + body: map[string]interface{}{"automation": "hash.sha1", "id": "99cd67131b48", "payload": "test", "status": "failed"}, + }, + }, + { + name: "UpdatePlaybook", + args: args{method: "PUT", url: "/api/playbooks/simple", data: map[string]interface{}{"yaml": "name: Simple\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n"}}, + want: want{ + status: 200, + body: map[string]interface{}{"id": "simple", "name": "Simple", "yaml": "name: Simple\ntasks:\n input:\n name: Upload malware if possible\n type: input\n schema:\n title: Malware\n type: object\n properties:\n malware:\n type: string\n title: Select malware\n default: \"\"\n next:\n hash: \"malware != ''\"\n\n hash:\n name: Hash the malware\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['malware']\"\n next:\n escalate:\n\n escalate:\n name: Escalate to malware team\n type: task\n"}, + }, + }, + { + name: "UpdateTemplate", + args: args{method: "PUT", url: "/api/templates/default", data: map[string]interface{}{"name": "My Template", "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n"}}, + want: want{ + status: 200, + body: map[string]interface{}{"id": "default", "name": "My Template", "schema": "{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n"}, + }, + }, + { + name: "UpdateTicket", + args: args{method: "PUT", url: "/api/tickets/8125", data: map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "modified": "2021-10-02T18:04:59.078186+02:00", "name": "phishing from selenafadel@von.org detected", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "https://www.seniorleading-edge.name/users/efficient", "name": "recovery"}, map[string]interface{}{"href": "http://www.dynamicseamless.com/clicks-and-mortar", "name": "force"}, map[string]interface{}{"href": "http://www.leadscalable.biz/envisioneer", "name": "fund"}}, "schema": "{}", "status": "closed", "type": "alert"}}, + want: want{ + status: 200, + body: map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "id": 8125, "modified": "2021-10-02T18:04:59.078186+02:00", "name": "phishing from selenafadel@von.org detected", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "https://www.seniorleading-edge.name/users/efficient", "name": "recovery"}, map[string]interface{}{"href": "http://www.dynamicseamless.com/clicks-and-mortar", "name": "force"}, map[string]interface{}{"href": "http://www.leadscalable.biz/envisioneer", "name": "fund"}}, "schema": "{}", "status": "closed", "tickets": []interface{}{map[string]interface{}{"created": "2021-10-02T18:04:59.078186+02:00", "id": 8126, "modified": "2021-10-02T18:04:59.078186+02:00", "name": "Surfaceintroduce virus detected", "owner": "demo", "references": []interface{}{map[string]interface{}{"href": "http://www.centralworld-class.io/synthesize", "name": "university"}, map[string]interface{}{"href": "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", "name": "goal"}, map[string]interface{}{"href": "http://www.chiefsyndicate.io/action-items", "name": "unemployment"}}, "schema": "{}", "status": "closed", "type": "alert"}}, "type": "alert"}, + }, + }, + { + name: "UpdateTicketType", + args: args{method: "PUT", url: "/api/tickettypes/alert", data: map[string]interface{}{"default_playbooks": []interface{}{}, "default_template": "default", "icon": "mdi-bell", "id": "alert", "name": "Alerts"}}, + want: want{ + status: 200, + body: map[string]interface{}{"default_playbooks": []interface{}{}, "default_template": "default", "icon": "mdi-bell", "id": "alert", "name": "Alerts"}, + }, + }, + { + name: "UpdateUser", + args: args{method: "PUT", url: "/api/users/bob", data: map[string]interface{}{"roles": []interface{}{"analyst", "admin"}}}, + want: want{ + status: 200, + body: map[string]interface{}{"apikey": false, "blocked": false, "id": "bob", "roles": []interface{}{"admin:backup:read", "admin:backup:restore", "admin:group:write", "admin:job:read", "admin:job:write", "admin:log:read", "admin:ticket:delete", "admin:user:write", "admin:userdata:read", "admin:userdata:write", "analyst:automation:read", "analyst:currentsettings:write", "analyst:currentuser:read", "analyst:currentuserdata:read", "analyst:file", "analyst:group:read", "analyst:playbook:read", "analyst:rule:read", "analyst:settings:read", "analyst:template:read", "analyst:ticket:read", "analyst:ticket:write", "analyst:tickettype:read", "analyst:user:read", "engineer:automation:write", "engineer:playbook:write", "engineer:rule:write", "engineer:template:write", "engineer:tickettype:write"}}, + }, + }, + { + name: "UpdateUserData", + args: args{method: "PUT", url: "/api/userdata/bob", data: map[string]interface{}{"blocked": false, "email": "bob@example.org", "name": "Bob Bad"}}, + want: want{ + status: 200, + body: map[string]interface{}{"email": "bob@example.org", "id": "bob", "name": "Bob Bad"}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctx, _, _, _, _, db, _, server, cleanup, err := test.Server(t) + if err != nil { + t.Fatal(err) + } + defer cleanup() + + if err := test.SetupTestData(ctx, db); err != nil { + t.Fatal(err) + } + + setUser := func(context *gin.Context) { + busdb.SetContext(context, test.Bob) + } + server.ApiGroup.Use(setUser) + + server.ConfigureRoutes() + w := httptest.NewRecorder() + + // setup request + var req *http.Request + if tt.args.data != nil { + b, err := json.Marshal(tt.args.data) + if err != nil { + t.Fatal(err) + } + + req = httptest.NewRequest(tt.args.method, tt.args.url, bytes.NewBuffer(b)) + req.Header.Set("Content-Type", "application/json") + } else { + req = httptest.NewRequest(tt.args.method, tt.args.url, nil) + } + + // run request + server.ServeHTTP(w, req) + + result := w.Result() + + // assert results + if result.StatusCode != tt.want.status { + msg, _ := io.ReadAll(result.Body) + + t.Fatalf("Status got = %v, want %v: %s", result.Status, tt.want.status, msg) + } + if tt.want.status != http.StatusNoContent { + jsonEqual(t, result.Body, tt.want.body) + } + }) + } +} + +func jsonEqual(t *testing.T, got io.Reader, want interface{}) { + var gotObject, wantObject interface{} + + // load bytes + wantBytes, err := json.Marshal(want) + if err != nil { + t.Fatal(err) + } + gotBytes, err := io.ReadAll(got) + if err != nil { + t.Fatal(err) + } + + fields := []string{ + "created", "modified", "logs.0.created", + "artifacts.0.enrichments.hash\\.sha1.created", + "artifacts.1.enrichments.hash\\.sha1.created", + "artifacts.2.enrichments.hash\\.sha1.created", + + "playbooks.simple.tasks.input.created", + "playbooks.simple.tasks.hash.created", + "playbooks.simple.tasks.escalate.created", + + "playbooks.phishing.tasks.input.created", + "playbooks.phishing.tasks.hash.created", + "playbooks.phishing.tasks.escalate.created", + + "playbooks.phishing.tasks.block-ioc.created", + "playbooks.phishing.tasks.block-iocs.created", + "playbooks.phishing.tasks.block-sender.created", + "playbooks.phishing.tasks.board.created", + "playbooks.phishing.tasks.board.closed", + "playbooks.phishing.tasks.escalate.created", + "playbooks.phishing.tasks.extract-iocs.created", + "playbooks.phishing.tasks.fetch-iocs.created", + "playbooks.phishing.tasks.mail-available.created", + "playbooks.phishing.tasks.search-email-gateway.created", + + "0.playbooks.phishing.tasks.block-ioc.created", + "0.playbooks.phishing.tasks.block-iocs.created", + "0.playbooks.phishing.tasks.block-sender.created", + "0.playbooks.phishing.tasks.board.created", + "0.playbooks.phishing.tasks.escalate.created", + "0.playbooks.phishing.tasks.extract-iocs.created", + "0.playbooks.phishing.tasks.fetch-iocs.created", + "0.playbooks.phishing.tasks.mail-available.created", + "0.playbooks.phishing.tasks.search-email-gateway.created", + + "tickets.0.playbooks.phishing.tasks.block-ioc.created", + "tickets.0.playbooks.phishing.tasks.block-iocs.created", + "tickets.0.playbooks.phishing.tasks.block-sender.created", + "tickets.0.playbooks.phishing.tasks.board.created", + "tickets.0.playbooks.phishing.tasks.escalate.created", + "tickets.0.playbooks.phishing.tasks.extract-iocs.created", + "tickets.0.playbooks.phishing.tasks.fetch-iocs.created", + "tickets.0.playbooks.phishing.tasks.mail-available.created", + "tickets.0.playbooks.phishing.tasks.search-email-gateway.created", + + "secret", "0.created", "comments.0.created", + } + for _, field := range fields { + gField := gjson.GetBytes(wantBytes, field) + if gField.Exists() && gjson.GetBytes(gotBytes, field).Exists() { + gotBytes, err = sjson.SetBytes(gotBytes, field, gField.Value()) + if err != nil { + t.Fatal(err) + } + } + } + + // normalize bytes + if err = json.Unmarshal(wantBytes, &wantObject); err != nil { + t.Fatal(err) + } + if err := json.Unmarshal(gotBytes, &gotObject); err != nil { + t.Fatal(string(gotBytes), err) + } + + // compare + assert.Equal(t, wantObject, gotObject) +} diff --git a/generator/generator.go b/generator/generator.go new file mode 100644 index 0000000..35e5604 --- /dev/null +++ b/generator/generator.go @@ -0,0 +1,342 @@ +package main + +import ( + "bytes" + "embed" + "encoding/json" + "flag" + "fmt" + "go/format" + "log" + "net/url" + "os" + "path" + "strings" + "text/template" + + "github.com/go-openapi/analysis" + "github.com/go-swagger/go-swagger/generator" + "github.com/iancoleman/strcase" + "github.com/tidwall/sjson" + "gopkg.in/yaml.v3" +) + +//go:embed templates/simplemodel.gotmpl +var model embed.FS + +func gotype(name string, s Schema, required []string) string { + _, x := sgotype(name, s, required, false) + return x +} + +func sgotype(name string, s Schema, required []string, nopointer bool) (bool, string) { + req := "" + if !nopointer && !contains(required, name) { + req = "*" + } + + if s.Ref != "" { + return false, req + path.Base(s.Ref) + } + + primitive := false + t := "" + + switch s.Type { + case "string": + if s.Format == "date-time" { + t = req + "time.Time" + } else { + t = req + "string" + primitive = true + } + case "boolean": + t = req + "bool" + primitive = true + case "object": + if s.AdditionalProperties != nil { + subPrimitive, subType := sgotype(name, *s.AdditionalProperties, required, true) + if subPrimitive { + t = "map[string]" + subType + } else { + t = "map[string]*" + subType + } + } else { + t = "interface{}" + } + case "number", "integer": + if s.Format != "" { + t = req + s.Format + } else { + t = req + "int" + } + primitive = true + case "array": + subPrimitive, subType := sgotype(name, *s.Items, required, true) + if subPrimitive { + t = "[]" + subType + } else { + t = "[]*" + subType + } + case "": + t = "interface{}" + default: + panic(fmt.Sprintf("%#v", s)) + } + + return primitive, t +} + +func omitempty(name string, required []string) bool { + return !contains(required, name) +} + +func contains(required []string, name string) bool { + for _, r := range required { + if r == name { + return true + } + } + return false +} + +func tojson(name string, i Definition) string { + b, _ := json.Marshal(i) + b, _ = sjson.SetBytes(b, "$id", "#/definitions/"+name) + return string(b) +} + +func camel(s string) string { + if s == "id" { + return "ID" + } + return strcase.ToCamel(s) +} + +func main() { + flag.Parse() + p := flag.Arg(0) + + log.SetFlags(log.LstdFlags | log.Lshortfile) + f, err := os.Open("generated/community.yml") + if err != nil { + log.Fatalln(err) + } + defer f.Close() + + s := Swagger{} + dec := yaml.NewDecoder(f) + err = dec.Decode(&s) + if err != nil { + log.Fatalln(err) + } + + t := template.New("simplemodel.gotmpl") + t.Funcs(map[string]interface{}{ + "camel": camel, + "gotype": gotype, + "omitempty": omitempty, + "tojson": tojson, + }) + templ := template.Must(t.ParseFS(model, "templates/simplemodel.gotmpl")) + + err = os.MkdirAll("generated/models", os.ModePerm) + if err != nil { + log.Fatalln(err) + } + + buf := bytes.NewBufferString("") + + props := map[string][]string{} + for defName, definition := range s.Definitions { + for propName := range definition.Properties { + props[defName] = append(props[defName], propName) + } + } + + // for _, definition := range s.Definitions { + // if definition.Embed != "" { + // if parentProps, ok := props[definition.Embed]; ok { + // for _, parentProp := range parentProps { + // delete(definition.Properties, parentProp) + // } + // } + // } + // } + + err = templ.Execute(buf, &s) + if err != nil { + log.Fatalln(err) + } + + fmtCode, err := format.Source(buf.Bytes()) + if err != nil { + log.Println(err) + fmtCode = buf.Bytes() + } + + err = os.WriteFile("generated/models/models.go", fmtCode, os.ModePerm) + if err != nil { + log.Fatalln(err) + } + + generator.FuncMapFunc = func(opts *generator.LanguageOpts) template.FuncMap { + df := generator.DefaultFuncMap(opts) + + df["path"] = func(basePath, lpath string, parameters generator.GenParameters) string { + u := url.URL{Path: path.Join(basePath, lpath)} + q := u.Query() + for _, p := range parameters { + if p.Location == "path" { + if example, ok := p.Extensions["x-example"]; ok { + u.Path = strings.ReplaceAll(u.Path, "{"+p.Name+"}", fmt.Sprint(example)) + } + } + if p.Location == "query" { + if example, ok := p.Extensions["x-example"]; ok { + q.Set(p.Name, fmt.Sprint(example)) + } + } + } + u.RawQuery = q.Encode() + return u.String() + } + df["body"] = func(parameters generator.GenParameters) interface{} { + for _, p := range parameters { + if p.Location == "body" { + if example, ok := p.Extensions["x-example"]; ok { + return example + } + } + } + return nil + } + df["ginizePath"] = func(path string) string { + return strings.Replace(strings.Replace(path, "{", ":", -1), "}", "", -1) + } + df["export"] = func(name string) string { + return strings.ToUpper(name[0:1]) + name[1:] + } + df["basePaths"] = func(operations []generator.GenOperation) []string { + var l []string + var seen = map[string]bool{} + for _, operation := range operations { + if _, ok := seen[operation.BasePath]; !ok { + l = append(l, strings.TrimPrefix(operation.BasePath, "/")) + seen[operation.BasePath] = true + } + } + return l + } + df["roles"] = func(reqs []analysis.SecurityRequirement) string { + for _, req := range reqs { + if req.Name == "roles" { + var roles []string + for _, scope := range req.Scopes { + roles = append(roles, "role."+strcase.ToCamel(strings.ReplaceAll(scope, ":", "_"))) + // roles = append(roles, permission.FromString(scope)) + } + return strings.Join(roles, ", ") + } + } + return "" + } + return df + } + + opts := &generator.GenOpts{ + Spec: "generated/community.yml", + Target: "generated", + APIPackage: "operations", + ModelPackage: "models", + ServerPackage: "restapi", + ClientPackage: "client", + DefaultScheme: "http", + IncludeModel: true, + IncludeValidator: true, + IncludeHandler: true, + IncludeParameters: true, + IncludeResponses: true, + IncludeURLBuilder: true, + IncludeMain: true, + IncludeSupport: true, + ValidateSpec: true, + FlattenOpts: &analysis.FlattenOpts{ + Minimal: true, + Verbose: true, + }, + Name: "catalyst-test", + FlagStrategy: "go-flags", + CompatibilityMode: "modern", + Sections: generator.SectionOpts{ + Application: []generator.TemplateOpts{ + { + Name: "api-server-test", + Source: path.Join(p, "templates/api_server_test.gotmpl"), + Target: "{{ .Target }}/test", + FileName: "api_server_test.go", + }, + // { + // Name: "configure", + // Source: "generator/config.gotmpl", + // Target: "{{ joinFilePath .Target .ServerPackage }}", + // FileName: "config.go", + // SkipExists: false, + // SkipFormat: false, + // }, + { + Name: "embedded_spec", + Source: "asset:swaggerJsonEmbed", + Target: "{{ joinFilePath .Target .ServerPackage }}", + FileName: "embedded_spec.go", + }, + { + Name: "server", + Source: path.Join(p, "templates/api.gotmpl"), + Target: "{{ joinFilePath .Target .ServerPackage }}", + FileName: "api.go", + }, + { + Name: "response.go", + Source: path.Join(p, "templates/response.gotmpl"), + Target: "{{ .Target }}/restapi/api", + FileName: "response.go", + }, + }, + Operations: []generator.TemplateOpts{ + { + Name: "parameters", + Source: path.Join(p, "templates/parameter.gotmpl"), + Target: "{{ if gt (len .Tags) 0 }}{{ joinFilePath .Target .ServerPackage .APIPackage .Package }}{{ else }}{{ joinFilePath .Target .ServerPackage .Package }}{{ end }}", + FileName: "{{ (snakize (pascalize .Name)) }}_parameters.go", + }, + }, + Models: []generator.TemplateOpts{ + { + Name: "definition", + Source: "asset:model", + Target: "{{ joinFilePath .Target .ModelPackage }}/old", + FileName: "{{ (snakize (pascalize .Name)) }}.go", + }, + // { + // Name: "model", + // Source: "generator/model.gotmpl", + // Target: "{{ joinFilePath .Target .ModelPackage }}/old2", + // FileName: "{{ (snakize (pascalize .Name)) }}.go", + // }, + }, + }, + } + + err = opts.EnsureDefaults() + if err != nil { + log.Fatalln(err) + } + + err = generator.GenerateServer("catalyst", nil, nil, opts) + if err != nil { + log.Fatalln(err) + } + // loads.Spec() + // swagger. +} diff --git a/generator/swagger.go b/generator/swagger.go new file mode 100644 index 0000000..b27d7cd --- /dev/null +++ b/generator/swagger.go @@ -0,0 +1,61 @@ +package main + +type Swagger struct { + Swagger string `yaml:"swagger" json:"swagger"` + Info Info `yaml:"info" json:"info"` + Paths map[string]PathItem `yaml:"paths" json:"paths"` + Definitions map[string]Definition `yaml:"definitions" json:"definitions"` +} + +type Info struct { + Version string `yaml:"version" json:"version"` + Title string `yaml:"title" json:"title"` +} + +type PathItem struct { + Get Operation `yaml:"get" json:"get"` + Post Operation `yaml:"post" json:"post"` +} + +type Operation struct { + Tags []string `yaml:"tags" json:"tags"` + Summary string `yaml:"summary" json:"summary"` + Description string `yaml:"description" json:"description"` + OperationID string `yaml:"operationId" json:"operationId"` + Parameters []Parameter `yaml:"parameters" json:"parameters"` + Responses map[string]Response `yaml:"responses" json:"responses"` +} + +type Parameter struct { + // Description string `yaml:"description" json:"description"` + Name string `yaml:"name" json:"name"` + In string `yaml:"in" json:"in"` + Required bool `yaml:"required" json:"required"` + Schema Schema `yaml:"schema" json:"schema"` + Direct Schema `yaml:"-,inline" json:"-,inline"` +} + +type Schema struct { + Ref string `yaml:"$ref,omitempty" json:"$ref,omitempty"` + Format string `yaml:"format,omitempty" json:"format,omitempty"` + Title string `yaml:"title,omitempty" json:"title,omitempty"` + Description string `yaml:"description" json:"description,omitempty"` + Default interface{} `yaml:"default,omitempty" json:"default,omitempty"` + Maximum interface{} `yaml:"maximum,omitempty" json:"maximum,omitempty"` + Items *Schema `yaml:"items,omitempty" json:"items,omitempty"` + Type string `yaml:"type" json:"type,omitempty"` + AdditionalProperties *Schema `yaml:"additionalProperties,omitempty" json:"additionalProperties,omitempty"` + Enum []string `yaml:"enum,omitempty" json:"enum,omitempty"` +} + +type Response struct { + Description string `yaml:"description" json:"description"` + Schema Schema `yaml:"schema" json:"schema"` +} + +type Definition struct { + Type string `yaml:"type" json:"type"` + Required []string `yaml:"required,omitempty" json:"required,omitempty"` + Embed string `yaml:"x-embed" json:"x-embed"` + Properties map[string]Schema `yaml:"properties" json:"properties"` +} diff --git a/generator/templates/api.gotmpl b/generator/templates/api.gotmpl new file mode 100644 index 0000000..9e49a8e --- /dev/null +++ b/generator/templates/api.gotmpl @@ -0,0 +1,124 @@ +package {{ .APIPackage }} + +import ( + "context" + "log" + "net/http" + "os" + "os/signal" + "syscall" + "time" + "strings" + + "golang.org/x/oauth2" + + "github.com/gin-gonic/gin" + {{range .DefaultImports}}{{printf "%q" .}} + {{end}} + {{range $key, $value := .Imports}}{{$key}} {{ printf "%q" $value}} + {{end}} + "github.com/SecurityBrewery/catalyst/generated/restapi/api" + "github.com/SecurityBrewery/catalyst/role" +) + +// Service is the interface that must be implemented in order to provide +// business logic for the Server service. +type Service interface { + {{range .Operations}}{{ pascalize .Name }}(ctx context.Context{{ if .Params }}, params *{{.Package}}.{{ pascalize .Name }}Params{{ end }}) *api.Response +{{end}} +} + +// Config defines the config options for the API server. +type Config struct { + Address string + InsecureHTTP bool + TLSCertFile string + TLSKeyFile string +} + +// Server defines the Server service. +type Server struct { + *gin.Engine + config *Config + server *http.Server + service Service + + {{ range .Operations | basePaths }}{{ . | export }}Group *gin.RouterGroup +{{end}} + + RoleAuth func([]role.Role) gin.HandlerFunc +} + +// New initializes a new Server service. +func New(svc Service, config *Config) *Server { + engine := gin.New() + engine.Use(gin.Recovery()) + + return &Server{ + Engine: engine, + service: svc, + config: config, + server: &http.Server{ + Addr: config.Address, + Handler: engine, + ReadTimeout: 10 * time.Second, + WriteTimeout: 10 * time.Second, + }, + + {{range .Operations | basePaths }}{{ . | export }}Group: engine.Group("/{{.}}"), +{{end}} + RoleAuth: func(i []role.Role) gin.HandlerFunc { return func(c *gin.Context) { c.Next() } }, + } +} + +// ConfigureRoutes configures the routes for the Server service. +// Configuring of routes includes setting up Auth if it is enabled. +func (s *Server) ConfigureRoutes() { + {{range .Operations}}s.{{ slice .BasePath 1 | export }}Group.{{.Method}}({{ .Path | ginizePath | printf "%q" }}, s.RoleAuth([]role.Role{ {{ .SecurityRequirements | roles }} }), {{.Package}}.{{ pascalize .Name }}Endpoint(s.service.{{ pascalize .Name }})) +{{end}}} + +// run the Server. It will listen on either HTTP or HTTPS depending on the +// config passed to NewServer. +func (s *Server) run() error { + log.Printf("Serving on address %s\n", s.server.Addr) + if s.config.InsecureHTTP { + return s.server.ListenAndServe() + } + return s.server.ListenAndServeTLS(s.config.TLSCertFile, s.config.TLSKeyFile) +} + +// Shutdown will gracefully shutdown the Server. +func (s *Server) Shutdown() error { + return s.server.Shutdown(context.Background()) +} + +// RunWithSigHandler runs the Server with SIGTERM handling automatically +// enabled. The server will listen for a SIGTERM signal and gracefully shutdown +// the web server. +// It's possible to optionally pass any number shutdown functions which will +// execute one by one after the webserver has been shutdown successfully. +func (s *Server) RunWithSigHandler(shutdown ...func() error) error { + sigCh := make(chan os.Signal, 1) + signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM) + + go func() { + <-sigCh + s.Shutdown() + }() + + err := s.run() + if err != nil { + if err != http.ErrServerClosed { + return err + } + } + + for _, fn := range shutdown { + err := fn() + if err != nil { + return err + } + } + + return nil +} diff --git a/generator/templates/api_server_test.gotmpl b/generator/templates/api_server_test.gotmpl new file mode 100644 index 0000000..f988782 --- /dev/null +++ b/generator/templates/api_server_test.gotmpl @@ -0,0 +1,184 @@ +package test + +import ( + "bytes" + "context" + "encoding/json" + "github.com/SecurityBrewery/catalyst/database" + "github.com/go-openapi/swag" + "io" + "net/http" + "net/http/httptest" + "testing" + "time" + + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" + "github.com/tidwall/gjson" + "github.com/tidwall/sjson" + + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/test" +) + +func TestService(t *testing.T) { + gin.SetMode(gin.TestMode) + + type args struct { + method string + url string + data interface{} + } + type want struct { + status int + body interface{} + } + tests := []struct { + name string + args args + want want + }{ + {{range .Operations}} + { + name: "{{ pascalize .Name }}", + args: args{method: "{{ .Method }}", url: {{ path .BasePath .Path .Params | printf "%#v" }}{{ if .Params | body }}, data: {{ .Params | body | printf "%#v" }}{{ end }}}, + want: want{ + status: {{ with index .Responses 0 }}{{ .Code }}, + body: {{ if ne (len .Examples) 0 }}{{ with index .Examples 0 }}{{ .Example | printf "%#v" }}{{ end }}{{ else }}nil{{ end }}{{ end }}, + }, + }, {{ end }} + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctx, _, _, _, _, db, _, server, cleanup, err := test.Server(t) + if err != nil { + t.Fatal(err) + } + defer cleanup() + + if err := test.SetupTestData(ctx, db); err != nil { + t.Fatal(err) + } + + setUser := func(context *gin.Context) { + busdb.SetContext(context, test.Bob) + } + server.ApiGroup.Use(setUser) + + server.ConfigureRoutes() + w := httptest.NewRecorder() + + // setup request + var req *http.Request + if tt.args.data != nil { + b, err := json.Marshal(tt.args.data) + if err != nil { + t.Fatal(err) + } + + req = httptest.NewRequest(tt.args.method, tt.args.url, bytes.NewBuffer(b)) + req.Header.Set("Content-Type", "application/json") + } else { + req = httptest.NewRequest(tt.args.method, tt.args.url, nil) + } + + // run request + server.ServeHTTP(w, req) + + result := w.Result() + + // assert results + if result.StatusCode != tt.want.status { + msg, _ := io.ReadAll(result.Body) + + t.Fatalf("Status got = %v, want %v: %s", result.Status, tt.want.status, msg) + } + if tt.want.status != http.StatusNoContent { + jsonEqual(t, result.Body, tt.want.body) + } + }) + } +} + +func jsonEqual(t *testing.T, got io.Reader, want interface{}) { + var gotObject, wantObject interface{} + + // load bytes + wantBytes, err := json.Marshal(want) + if err != nil { + t.Fatal(err) + } + gotBytes, err := io.ReadAll(got) + if err != nil { + t.Fatal(err) + } + + fields := []string{ + "created", "modified", "logs.0.created", + "artifacts.0.enrichments.hash\\.sha1.created", + "artifacts.1.enrichments.hash\\.sha1.created", + "artifacts.2.enrichments.hash\\.sha1.created", + + "playbooks.simple.tasks.input.created", + "playbooks.simple.tasks.hash.created", + "playbooks.simple.tasks.escalate.created", + + "playbooks.phishing.tasks.input.created", + "playbooks.phishing.tasks.hash.created", + "playbooks.phishing.tasks.escalate.created", + + "playbooks.phishing.tasks.block-ioc.created", + "playbooks.phishing.tasks.block-iocs.created", + "playbooks.phishing.tasks.block-sender.created", + "playbooks.phishing.tasks.board.created", + "playbooks.phishing.tasks.board.closed", + "playbooks.phishing.tasks.escalate.created", + "playbooks.phishing.tasks.extract-iocs.created", + "playbooks.phishing.tasks.fetch-iocs.created", + "playbooks.phishing.tasks.mail-available.created", + "playbooks.phishing.tasks.search-email-gateway.created", + + "0.playbooks.phishing.tasks.block-ioc.created", + "0.playbooks.phishing.tasks.block-iocs.created", + "0.playbooks.phishing.tasks.block-sender.created", + "0.playbooks.phishing.tasks.board.created", + "0.playbooks.phishing.tasks.escalate.created", + "0.playbooks.phishing.tasks.extract-iocs.created", + "0.playbooks.phishing.tasks.fetch-iocs.created", + "0.playbooks.phishing.tasks.mail-available.created", + "0.playbooks.phishing.tasks.search-email-gateway.created", + + "tickets.0.playbooks.phishing.tasks.block-ioc.created", + "tickets.0.playbooks.phishing.tasks.block-iocs.created", + "tickets.0.playbooks.phishing.tasks.block-sender.created", + "tickets.0.playbooks.phishing.tasks.board.created", + "tickets.0.playbooks.phishing.tasks.escalate.created", + "tickets.0.playbooks.phishing.tasks.extract-iocs.created", + "tickets.0.playbooks.phishing.tasks.fetch-iocs.created", + "tickets.0.playbooks.phishing.tasks.mail-available.created", + "tickets.0.playbooks.phishing.tasks.search-email-gateway.created", + + "secret", "0.created", "comments.0.created", + } + for _, field := range fields { + gField := gjson.GetBytes(wantBytes, field) + if gField.Exists() && gjson.GetBytes(gotBytes, field).Exists() { + gotBytes, err = sjson.SetBytes(gotBytes, field, gField.Value()) + if err != nil { + t.Fatal(err) + } + } + } + + // normalize bytes + if err = json.Unmarshal(wantBytes, &wantObject); err != nil { + t.Fatal(err) + } + if err := json.Unmarshal(gotBytes, &gotObject); err != nil { + t.Fatal(string(gotBytes), err) + } + + // compare + assert.Equal(t, wantObject, gotObject) +} diff --git a/generator/templates/parameter.gotmpl b/generator/templates/parameter.gotmpl new file mode 100644 index 0000000..d10eb1a --- /dev/null +++ b/generator/templates/parameter.gotmpl @@ -0,0 +1,347 @@ +{{ define "sliceparamvalidator"}} +{{ if or .MinItems .MaxItems }} +{{ camelize .Name }}Size := int64(len({{ if and (not .IsArray) (not .HasDiscriminator) (not .IsInterface) (not .IsStream) .IsNullable }}*{{ end }}{{ .ValueExpression }})) +{{ end }} +{{ if .MinItems }} +if err := validate.MinItems({{ .Path }}, {{ printf "%q" .Location }}, {{ camelize .Name }}Size, {{ .MinItems }}); err != nil { + return err +} +{{ end }} +{{ if .MaxItems }} +if err := validate.MaxItems({{ .Path }}, {{ printf "%q" .Location }}, {{ camelize .Name }}Size, {{.MaxItems}}); err != nil { + return err +} +{{ end }} +{{ if .UniqueItems }} +if err := validate.UniqueItems({{ .Path }}, {{ printf "%q" .Location }}, {{ if and (not .IsArray) (not .HasDiscriminator) (not .IsInterface) (not .IsStream) .IsNullable }}*{{ end }}{{ .ValueExpression }}); err != nil { + return err +} +{{ end }} +{{ if .Enum }} +if err := validate.Enum({{ .Path }}, {{ printf "%q" .Location }}, {{ if and (not .IsArray) (not .HasDiscriminator) (not .IsInterface) (not .IsStream) .IsNullable }}*{{ end }}{{ .ValueExpression }}, {{ .Enum }}); err != nil { + return err +} +{{ end }} +{{ end }} +{{ define "customValidationPrimitive" }} +{{if .MinLength}} +if err := validate.MinLength({{ if .Path }}{{ .Path }}{{else}}""{{end}}, {{ printf "%q" .Location }}, {{ if .IsNullable }}(*{{ end }}{{.ValueExpression}}{{ if .IsNullable }}){{ end }}{{ if .IsCustomFormatter }}.String(){{ end }}, {{.MinLength}}); err != nil { + return err +} +{{end}} +{{if .MaxLength}} +if err := validate.MaxLength({{ if .Path }}{{ .Path }}{{else}}""{{end}}, {{ printf "%q" .Location }}, {{ if .IsNullable }}(*{{ end }}{{.ValueExpression}}{{ if .IsNullable }}){{ end }}{{ if .IsCustomFormatter }}.String(){{ end }}, {{.MaxLength}}); err != nil { + return err +} +{{end}} +{{if .Pattern}} +if err := validate.Pattern({{ if .Path }}{{ .Path }}{{else}}""{{end}}, {{ printf "%q" .Location }}, {{ if .IsNullable }}(*{{ end }}{{.ValueExpression}}{{ if .IsNullable }}){{ end }}{{ if .IsCustomFormatter }}.String(){{ end }}, `{{.Pattern}}`); err != nil { + return err +} +{{end}} +{{if .Minimum}} +if err := validate.Minimum{{ if eq .SwaggerType "integer" }}Int{{ end }}({{ if .Path }}{{ .Path }}{{else}}""{{end}}, {{ printf "%q" .Location }}, {{ if eq .SwaggerType "integer" }}int{{ else }}float{{ end }}64({{ if .IsNullable }}*{{ end }}{{.ValueExpression}}), {{.Minimum}}, {{.ExclusiveMinimum}}); err != nil { + return err +} +{{end}} +{{if .Maximum}} +if err := validate.Maximum{{ if eq .SwaggerType "integer" }}Int{{ end }}({{ if .Path }}{{ .Path }}{{else}}""{{end}}, {{ printf "%q" .Location }}, {{ if eq .SwaggerType "integer" }}int{{ else }}float{{ end }}64({{ if .IsNullable }}*{{ end }}{{.ValueExpression}}), {{.Maximum}}, {{.ExclusiveMaximum}}); err != nil { + return err +} +{{end}} +{{if .MultipleOf}} +if err := validate.MultipleOf({{ if .Path }}{{ .Path }}{{else}}""{{end}}, {{ printf "%q" .Location }}, float64({{ if .IsNullable }}*{{ end }}{{.ValueExpression}}), {{.MultipleOf}}); err != nil { + return err +} +{{end}} +{{if .Enum}} +if err := validate.Enum({{ if .Path }}{{ .Path }}{{else}}""{{end}}, {{ printf "%q" .Location }}, {{ if and (not .IsArray) (not .HasDiscriminator) (not .IsInterface) .IsNullable }}*{{ end }}{{.ValueExpression}}{{ if .IsCustomFormatter }}.String(){{ end }}, {{ printf "%#v" .Enum}}); err != nil { + return err +} +{{end}} +{{end}} +{{ define "propertyparamvalidator" }} +{{ if .IsPrimitive }}{{ template "customValidationPrimitive" . }}{{ end }} +{{ if .IsCustomFormatter }} +if err := validate.FormatOf({{.Path}}, "{{.Location}}", "{{.SwaggerFormat}}", {{.ValueExpression}}.String(), formats); err != nil { + return err +}{{ end }} +{{ if .IsArray }}{{ template "sliceparamvalidator" . }}{{ end -}} +{{ end }} +{{define "bindprimitiveparam" }} +{{ end }} +{{ define "sliceparambinder" }} +var {{ varname .Child.ValueExpression }}R {{ .GoType }} +for {{ if or .Child.HasValidations .Child.Converter .Child.IsCustomFormatter }}{{ .IndexVar }}{{ else }}_{{ end }}, {{ varname .Child.ValueExpression }}V := range {{ varname .Child.ValueExpression }}C { + {{ if or .Child.IsArray -}} + {{ .Child.Child.ValueExpression }}C := swag.SplitByFormat({{ varname .Child.ValueExpression }}V, {{ printf "%q" .Child.CollectionFormat }}) + {{ template "sliceparambinder" .Child }} + {{- else -}} + {{ if .Child.Converter -}} + {{ varname .Child.ValueExpression }}, err := {{ .Child.Converter }}({{ varname .Child.ValueExpression }}V) + if err != nil { + return errors.InvalidType({{ .Child.Path }}, {{ printf "%q" .Child.Location }}, "{{ .Child.GoType }}", {{ varname .Child.ValueExpression }}) + } + {{- else if .Child.IsCustomFormatter -}} + {{ varname .Child.ValueExpression }}, err := formats.Parse({{ varname .Child.ValueExpression }}V) + if err != nil { + return errors.InvalidType({{ .Child.Path }}, {{ printf "%q" .Child.Location }}, "{{ .Child.GoType }}", {{ varname .Child.ValueExpression }}) + } + {{- else -}} + {{ varname .Child.ValueExpression }} := {{ varname .Child.ValueExpression }}V + {{ end }} + {{- end }} + + {{ template "propertyparamvalidator" .Child }} + {{ varname .Child.ValueExpression }}R = append({{ varname .Child.ValueExpression }}R, {{ varname .Child.ValueExpression }}) +} +{{ end }} +package {{ .Package }} + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-openapi/errors" + "github.com/go-openapi/validate" + "github.com/go-openapi/runtime" + "github.com/go-openapi/runtime/middleware" + "github.com/go-openapi/swag" + + strfmt "github.com/go-openapi/strfmt" + + {{ range .DefaultImports }}{{ printf "%q" .}} + {{ end }} + {{ range $key, $value := .Imports }}{{ $key }} {{ printf "%q" $value }} + {{ end }} + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +// {{ pascalize .Name }}Endpoint executes the core logic of the related +// route endpoint. +func {{ pascalize .Name }}Endpoint(handler func(ctx context.Context{{ if .Params }}, params *{{ pascalize .Name }}Params{{ end }}) *api.Response) gin.HandlerFunc { + return func (ctx *gin.Context) { + + {{ if .Params }}// generate params from request + params := New{{ pascalize .Name }}Params() + err := params.ReadRequest(ctx) + if err != nil { + errObj := err.(*errors.CompositeError) + ctx.Writer.Header().Set("Content-Type", "application/problem+json") + ctx.JSON(int(errObj.Code()), gin.H{"error": errObj.Error()}) + return + } + {{ end }} + + resp := handler(ctx{{ if .Params }}, params{{end}}) + + switch resp.Code { + case http.StatusNoContent: + ctx.AbortWithStatus(resp.Code) + default: + ctx.JSON(resp.Code, resp.Body) + } + } +} + +// New{{ pascalize .Name }}Params creates a new {{ pascalize .Name }}Params object +// with the default values initialized. +func New{{ pascalize .Name }}Params() *{{ pascalize .Name }}Params { + var ( + {{ range .Params }}{{ if .HasDefault }}{{ if not .IsFileParam }}{{ varname .ID}}Default = {{ if .IsPrimitive}}{{.GoType}}({{ end}}{{ printf "%#v" .Default }}{{ if .IsPrimitive }}){{ end }} + {{ end }}{{ end }}{{end}} + ) + return &{{ pascalize .Name }}Params{ {{ range .Params }}{{ if .HasDefault }} + {{ pascalize .ID}}: {{ if and (not .IsArray) (not .HasDiscriminator) (not .IsInterface) (not .IsStream) .IsNullable }}&{{ end }}{{ varname .ID }}Default, + {{ end }}{{ end }} } +} + +// {{ pascalize .Name }}Params contains all the bound params for the {{ humanize .Name }} operation +// typically these are obtained from a http.Request +// +// swagger:parameters {{ .Name }} +type {{ pascalize .Name }}Params struct { + + {{ range .Params }}/*{{ if .Description }}{{ .Description }}{{ end }}{{ if .Required }} + Required: true{{ end }}{{ if .Maximum }} + Maximum: {{ if .ExclusiveMaximum }}< {{ end }}{{ .Maximum }}{{ end }}{{ if .Minimum }} + Minimum: {{ if .ExclusiveMinimum }}> {{ end }}{{ .Minimum }}{{ end }}{{ if .MultipleOf }} + Multiple Of: {{ .MultipleOf }}{{ end }}{{ if .MaxLength }} + Max Length: {{ .MaxLength }}{{ end }}{{ if .MinLength }} + Min Length: {{ .MinLength }}{{ end }}{{ if .Pattern }} + Pattern: {{ .Pattern }}{{ end }}{{ if .MaxItems }} + Max Items: {{ .MaxItems }}{{ end }}{{ if .MinItems }} + Min Items: {{ .MinItems }}{{ end }}{{ if .UniqueItems }} + Unique: true{{ end }}{{ if .Location }} + In: {{ .Location }}{{ end }}{{ if .CollectionFormat }} + Collection Format: {{ .CollectionFormat }}{{ end }}{{ if .HasDefault }} + Default: {{ printf "%#v" .Default }}{{ end }} + */ + {{ if not .Schema }}{{ pascalize .ID }} {{ if and (not .IsArray) (not .HasDiscriminator) (not .IsInterface) (not .IsFileParam) (not .IsStream) .IsNullable }}*{{ end }}{{.GoType}}{{ else }}{{ pascalize .Name }} {{ if and (not .Schema.IsBaseType) .IsNullable (not .Schema.IsStream) }}*{{ end }}{{.GoType}}{{ end }} + {{ end}} +} + +// ReadRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls +func ({{ .ReceiverName }} *{{ pascalize .Name }}Params) ReadRequest(ctx *gin.Context) error { + var res []error + {{ if .HasQueryParams }}qs := runtime.Values(ctx.Request.URL.Query()){{ end }} + + {{ if .HasFormParams }}if err := ctx.Request.ParseMultipartForm(32 << 20); err != nil { + if err != http.ErrNotMultipart { + return err + } else if err := ctx.Request.ParseForm(); err != nil { + return err + } + }{{ if .HasFormValueParams }} + fds := runtime.Values(ctx.Request.Form) + {{ end }}{{ end }} + + {{ range .Params }} + {{ if not .IsArray }}{{ if .IsQueryParam }}q{{ pascalize .Name }}, qhk{{ pascalize .Name }}, _ := qs.GetOK({{ .Path }}) + if err := {{ .ReceiverName }}.bind{{ pascalize .ID }}(q{{ pascalize .Name }}, qhk{{ pascalize .Name }}); err != nil { + res = append(res, err) + } + {{ else if .IsPathParam }}r{{ pascalize .Name }} := []string{ctx.Param({{ .Path }})} + if err := {{ .ReceiverName }}.bind{{ pascalize .ID }}(r{{ pascalize .Name }}, true); err != nil { + res = append(res, err) + } + {{ else if .IsHeaderParam }}if err := {{ .ReceiverName }}.bind{{ pascalize .ID }}(ctx.Request.Header[http.CanonicalHeaderKey({{ .Path }})], true); err != nil { + res = append(res, err) + } + {{ else if .IsFormParam }}{{if .IsFileParam }}{{ camelize .Name }}, {{ camelize .Name }}Header, err := ctx.Request.FormFile({{ .Path }}) + if err != nil { + res = append(res, errors.New(400, "reading file %q failed: %v", {{ printf "%q" (camelize .Name) }}, err)) + } else { + {{ .ReceiverName }}.{{ pascalize .Name }} = &runtime.File{Data: {{ camelize .Name }}, Header: {{ camelize .Name }}Header} + } + {{ else }}fd{{ pascalize .Name }}, fdhk{{ pascalize .Name }}, _ := fds.GetOK({{ .Path }}) + if err := {{ .ReceiverName }}.bind{{ pascalize .ID }}(fd{{ pascalize .Name }}, fdhk{{ pascalize .Name }}); err != nil { + res = append(res, err) + } + {{ end }}{{ end }} + {{ else if .IsArray }}{{ if .IsQueryParam }}q{{ pascalize .Name }}, qhk{{ pascalize .Name }}, _ := qs.GetOK({{ .Path }}) + if err := {{ .ReceiverName }}.bind{{ pascalize .ID }}(q{{ pascalize .Name }}, qhk{{ pascalize .Name }}); err != nil { + res = append(res, err) + } + {{ else if and .IsFormParam }}fd{{ pascalize .Name }}, fdhk{{ pascalize .Name }}, _ := fds.GetOK({{ .Path }}) + if err := {{ .ReceiverName }}.bind{{ pascalize .ID }}(fd{{ pascalize .Name }}, fdhk{{ pascalize .Name }}); err != nil { + res = append(res, err) + } + {{ end }}{{ end }} + + {{ if and .IsBodyParam .Schema }}if runtime.HasBody(ctx.Request) { + {{ if .Schema.IsStream }}{{ .ReceiverName }}.{{ pascalize .Name }} = ctx.Request.Body + {{ else }}{{ if and .Schema.IsBaseType .Schema.IsExported }}body, err := {{ .ModelsPackage }}.Unmarshal{{ dropPackage .GoType }}{{ if .IsArray }}Slice{{ end }}(ctx.Request.Body, route.Consumer) + if err != nil { {{ if .Required }} + if err == io.EOF { + err = errors.Required({{ .Path }}, {{ printf "%q" .Location }}, "") + } + {{ end }}res = append(res, err) + {{ else }}var body {{ .GoType }} + if err := ctx.BindJSON(&body); err != nil { {{ if .Required }} + if err == io.EOF { + res = append(res, errors.Required({{ printf "%q" (camelize .Name) }}, {{ printf "%q" .Location }}, "")) + } else { {{ end }} + res = append(res, errors.NewParseError({{ printf "%q" (camelize .Name) }}, {{ printf "%q" .Location }}, "", err)){{ if .Required }} + } + {{ end }} + {{ end }}} else { + {{ .ReceiverName }}.{{ pascalize .Name }} = {{ if and (not .Schema.IsBaseType) .IsNullable }}&{{ end }}body + }{{ end }} + }{{ if .Required }} else { + res = append(res, errors.Required({{ printf "%q" (camelize .Name) }}, {{ printf "%q" .Location }}, "")) + } {{ end }} + + {{ end }} + {{ end }} + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +{{ $className := (pascalize .Name) }} +{{ range .Params }} +{{ if not (or .IsBodyParam .IsFileParam) }} +{{ if or .IsPrimitive .IsCustomFormatter }} +func ({{ .ReceiverName }} *{{ $className }}Params) bind{{ pascalize .ID }}(rawData []string, hasKey bool) error { + {{ if and (not .IsPathParam) .Required }}if !hasKey { + return errors.Required({{ .Path }}, {{ printf "%q" .Location }}, rawData) + } + {{ end }}var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + {{ if and (not .IsPathParam) .Required (not .AllowEmptyValue) }}if err := validate.RequiredString({{ .Path }}, {{ printf "%q" .Location }}, raw); err != nil { + return err + } + {{ else if and ( not .IsPathParam ) (or (not .Required) .AllowEmptyValue) }}if raw == "" { // empty values pass all other validations + {{ if .HasDefault }}var {{ camelize .Name}}Default {{ if not .IsFileParam }}{{ .GoType }}{{ else }}os.File{{end}} = {{ if .IsPrimitive}}{{.GoType}}({{ end}}{{ printf "%#v" .Default }}{{ if .IsPrimitive }}){{ end }} + {{ .ValueExpression }} = {{ if and (not .IsArray) (not .HasDiscriminator) (or .IsNullable ) (not .IsStream) }}&{{ end }}{{ camelize .Name }}Default + {{ end }}return nil + } + {{ end }} + {{ if .Converter }}value, err := {{ .Converter }}(raw) + if err != nil { + return errors.InvalidType({{ .Path }}, {{ printf "%q" .Location }}, {{ printf "%q" .GoType }}, raw) + } + {{ .ValueExpression }} = {{ if .IsNullable }}&{{ end }}value + {{ else if .IsCustomFormatter }}value, err := formats.Parse({{ printf "%q" .SwaggerFormat }}, raw) + if err != nil { + return errors.InvalidType({{ .Path }}, {{ printf "%q" .Location }}, {{ printf "%q" .GoType }}, raw) + } + {{ .ValueExpression }} = {{ if and (not .IsArray) (not .HasDiscriminator) (not .IsFileParam) (not .IsStream) (not .IsNullable) }}*{{ end }}(value.(*{{ .GoType }})) + {{else}}{{ .ValueExpression }} = {{ if .IsNullable }}&{{ end }}raw + {{ end }} + {{if .HasValidations }}if err := {{ .ReceiverName }}.validate{{ pascalize .ID }}(); err != nil { + return err + } + {{ end }} + return nil +} +{{else if .IsArray}} +func ({{ .ReceiverName }} *{{ $className }}Params) bind{{ pascalize .ID }}(rawData []string, hasKey bool) error { + {{if .Required }}if !hasKey { + return errors.Required({{ .Path }}, {{ printf "%q" .Location }}, rawData) + } + {{ end }} + {{ if eq .CollectionFormat "multi" }}{{ varname .Child.ValueExpression }}C := rawData{{ else }}var qv{{ pascalize .Name }} string + if len(rawData) > 0 { + qv{{ pascalize .Name }} = rawData[len(rawData) - 1] + } + + {{ varname .Child.ValueExpression }}C := swag.SplitByFormat(qv{{ pascalize .Name }}, {{ printf "%q" .CollectionFormat }}){{ end }} + {{if and .Required (not .AllowEmptyValue) }} + if len({{ varname .Child.ValueExpression }}C) == 0 { + return errors.Required({{ .Path }}, {{ printf "%q" .Location }}, {{ varname .Child.ValueExpression }}C) + } + {{ end }} + {{ if not .Required }}{{ if .HasDefault }}defValue := swag.SplitByFormat({{ .Default }}, {{ printf "%q" .CollectionFormat }}) + if len({{ varname .Child.ValueExpression }}C) == 0 && len(defValue) > 0 { + {{ .ValueExpression }} = defValue + {{ else }}if len({{ varname .Child.ValueExpression }}C) == 0 { + return nil{{ end }} + }{{ end }} + {{ template "sliceparambinder" . }} + {{ .ValueExpression }} = {{ varname .Child.ValueExpression }}R + {{ if .HasSliceValidations }}if err := {{ .ReceiverName }}.validate{{ pascalize .ID }}(); err != nil { + return err + } + {{ end }} + + return nil +} +{{ end }} +{{ if or .HasValidations .HasSliceValidations }} +func ({{ .ReceiverName }} *{{ $className }}Params) validate{{ pascalize .ID }}() error { + {{ template "propertyparamvalidator" . }} + return nil +} +{{ end }} +{{ end }} +{{ end }} diff --git a/generator/templates/response.gotmpl b/generator/templates/response.gotmpl new file mode 100644 index 0000000..a24ac14 --- /dev/null +++ b/generator/templates/response.gotmpl @@ -0,0 +1,6 @@ +package api + +type Response struct { + Code int + Body interface{} +} diff --git a/generator/templates/simplemodel.gotmpl b/generator/templates/simplemodel.gotmpl new file mode 100644 index 0000000..169d2a5 --- /dev/null +++ b/generator/templates/simplemodel.gotmpl @@ -0,0 +1,64 @@ +{{- /*gotype: github.com/SecurityBrewery/catalyst/generator.Swagger */ -}} +package models + +import ( + "fmt" + "strings" + "time" + + "github.com/xeipuuv/gojsonschema" +) + +var ( + schemaLoader = gojsonschema.NewSchemaLoader() + {{ range $index, $element := .Definitions }}{{ $index }}Schema = new(gojsonschema.Schema) +{{ end }}) + +func init() { + err := schemaLoader.AddSchemas( + {{ range $index, $element := .Definitions }}gojsonschema.NewStringLoader(`{{ tojson $index $element }}`), + {{ end }} + ) + if err != nil { + panic(err) + } + + {{ range $index, $element := .Definitions }}{{ $index }}Schema = mustCompile(`#/definitions/{{ $index }}`) +{{ end }}} + +{{ range $index, $element := .Definitions }} +type {{ $index }} struct { + {{ range $pindex, $pelement := .Properties }} {{ camel $pindex }} {{ gotype $pindex $pelement $element.Required }} `json:"{{ $pindex }}{{ if omitempty $pindex $element.Required }},omitempty{{ end }}"` +{{ end }}} + +{{ end }} + +func mustCompile(uri string) *gojsonschema.Schema { + s, err := schemaLoader.Compile(gojsonschema.NewReferenceLoader(uri)) + if err != nil { + panic(err) + } + return s +} + +func validate(s *gojsonschema.Schema, b []byte) error { + res, err := s.Validate(gojsonschema.NewStringLoader(string(b))) + if err != nil { + return err + } + + if len(res.Errors()) > 0 { + var l []string + for _, e := range res.Errors() { + l = append(l, e.String()) + } + return fmt.Errorf("validation failed: %v", strings.Join(l, ", ")) + } + return nil +} + +const ( +{{ range $index, $element := .Definitions }}{{ range $pindex, $pelement := .Properties }}{{ range $eindex, $eelement := .Enum }} +{{ $index | camel }}{{ $pindex | camel }}{{ $eelement | camel }} = "{{ $eelement }}" +{{ end }}{{ end }}{{ end }} +) diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..e9cfd8a --- /dev/null +++ b/go.mod @@ -0,0 +1,66 @@ +module github.com/SecurityBrewery/catalyst + +go 1.16 + +require ( + github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect + github.com/Microsoft/go-winio v0.5.1 // indirect + github.com/alecthomas/kong v0.2.17 + github.com/alecthomas/kong-yaml v0.1.1 + github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211101200231-0802afb9c160 + github.com/arangodb/go-driver v1.2.1 + github.com/aws/aws-sdk-go v1.41.19 + github.com/bits-and-blooms/bitset v1.2.1 // indirect + github.com/blevesearch/bleve/v2 v2.2.2 + github.com/bmizerany/pat v0.0.0-20210406213842-e4b6760bdd6f // indirect + github.com/containerd/containerd v1.5.8 // indirect + github.com/coreos/go-oidc/v3 v3.1.0 + // github.com/docker/docker v1.13.1 + github.com/docker/docker v17.12.0-ce-rc1.0.20201201034508-7d75c1d40d88+incompatible + github.com/docker/go-connections v0.4.0 // indirect + github.com/eclipse/paho.mqtt.golang v1.3.5 // indirect + github.com/emitter-io/go/v2 v2.0.9 + github.com/gin-contrib/cors v1.3.1 + github.com/gin-contrib/sessions v0.0.4 + github.com/gin-gonic/gin v1.7.4 + github.com/go-openapi/analysis v0.21.1 + github.com/go-openapi/errors v0.20.1 + github.com/go-openapi/runtime v0.21.0 + github.com/go-openapi/swag v0.19.15 + github.com/go-openapi/validate v0.20.3 + github.com/go-playground/validator/v10 v10.9.0 // indirect + github.com/go-stack/stack v1.8.1 // indirect + github.com/go-swagger/go-swagger v0.27.0 + github.com/gobwas/ws v1.1.0 + github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.3.0 + github.com/gorilla/mux v1.8.0 // indirect + github.com/gorilla/sessions v1.2.1 // indirect + github.com/iancoleman/strcase v0.2.0 + github.com/icza/dyno v0.0.0-20210726202311-f1bafe5d9996 + github.com/imdario/mergo v0.3.12 + github.com/json-iterator/go v1.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mingrammer/commonregex v1.0.1 + github.com/mitchellh/mapstructure v1.4.2 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/stretchr/testify v1.7.0 + github.com/tidwall/gjson v1.11.0 + github.com/tidwall/sjson v1.2.3 + github.com/tus/tusd v1.8.0 + github.com/ugorji/go v1.2.6 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect + github.com/xeipuuv/gojsonschema v1.2.0 + go.etcd.io/bbolt v1.3.6 // indirect + go.mongodb.org/mongo-driver v1.7.4 // indirect + golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect + golang.org/x/net v0.0.0-20211105192438-b53810dc28af + golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 + golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c // indirect + gopkg.in/square/go-jose.v2 v2.6.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b + +) + +replace github.com/xeipuuv/gojsonschema => github.com/warjiang/gojsonschema v1.2.1-0.20210329105853-aa9f9a8cfec7 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..224ecfb --- /dev/null +++ b/go.sum @@ -0,0 +1,1724 @@ +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.18.2/go.mod h1:AiIj7BWXyhO5gGVmYJ+S8tbkCx3yb0IMjua8Aw4naVM= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= +github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= +github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= +github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= +github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= +github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= +github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/RoaringBitmap/roaring v0.9.4 h1:ckvZSX5gwCRaJYBNe7syNawCU5oruY9gQmjXlp4riwo= +github.com/RoaringBitmap/roaring v0.9.4/go.mod h1:icnadbWcNyfEHlYdr+tDlOTih1Bf/h+rzPpv4sbomAA= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= +github.com/alecthomas/kong v0.2.12/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE= +github.com/alecthomas/kong v0.2.17 h1:URDISCI96MIgcIlQyoCAlhOmrSw6pZScBNkctg8r0W0= +github.com/alecthomas/kong v0.2.17/go.mod h1:ka3VZ8GZNPXv9Ov+j4YNLkI8mTuhXyr/0ktSlqIydQQ= +github.com/alecthomas/kong-yaml v0.1.1 h1:FOzG9AfTze44xhbuC4AJbDsSSgviRstBvKEGO4PaeTQ= +github.com/alecthomas/kong-yaml v0.1.1/go.mod h1:RcZd2uNxAnzxASa+z6rzD+ldFG60hdR2nCzlHOpPCBE= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211101200231-0802afb9c160 h1:7qzNO1wqchnLQf8sOapBujDO/mFu8gYW/9jGZl1l96E= +github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211101200231-0802afb9c160/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= +github.com/antonlindstrom/pgstore v0.0.0-20200229204646-b08ebf1105e0/go.mod h1:2Ti6VUHVxpC0VSmTZzEvpzysnaGAfGBOoMIz5ykPyyw= +github.com/arangodb/go-driver v1.2.1 h1:HREDHhDmzdIWxHmfkfTESbYUnRjESjPh4WUuXq7FZa8= +github.com/arangodb/go-driver v1.2.1/go.mod h1:zdDkJJnCj8DAkfbtIjIXnsTrWIiy6VhP3Vy14p+uQeY= +github.com/arangodb/go-velocypack v0.0.0-20200318135517-5af53c29c67e h1:Xg+hGrY2LcQBbxd0ZFdbGSyRKTYMZCfBbw/pMJFOk1g= +github.com/arangodb/go-velocypack v0.0.0-20200318135517-5af53c29c67e/go.mod h1:mq7Shfa/CaixoDxiyAAc5jZ6CVBAyPaNQCGS7mkj4Ho= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= +github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= +github.com/aws/aws-sdk-go v1.41.13/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go v1.41.19 h1:9QR2WTNj5bFdrNjRY9SeoG+3hwQmKXGX16851vdh+N8= +github.com/aws/aws-sdk-go v1.41.19/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.2.1 h1:M+/hrU9xlMp7t4TyTDQW97d3tRPVuKFC6zBEK16QnXY= +github.com/bits-and-blooms/bitset v1.2.1/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blevesearch/bleve/v2 v2.2.2 h1:kBLSCEcAs7VvH4S/JkpYwR4Jnpuv/3FNl6LWg6fqCmY= +github.com/blevesearch/bleve/v2 v2.2.2/go.mod h1:D5bhQ5baElbPGQARUm4j+NrWlrmIrndMJqviN+U9ndk= +github.com/blevesearch/bleve_index_api v1.0.1 h1:nx9++0hnyiGOHJwQQYfsUGzpRdEVE5LsylmmngQvaFk= +github.com/blevesearch/bleve_index_api v1.0.1/go.mod h1:fiwKS0xLEm+gBRgv5mumf0dhgFr2mDgZah1pqv1c1M4= +github.com/blevesearch/go-porterstemmer v1.0.3 h1:GtmsqID0aZdCSNiY8SkuPJ12pD4jI+DdXTAn4YRcHCo= +github.com/blevesearch/go-porterstemmer v1.0.3/go.mod h1:angGc5Ht+k2xhJdZi511LtmxuEf0OVpvUUNrwmM1P7M= +github.com/blevesearch/mmap-go v1.0.2/go.mod h1:ol2qBqYaOUsGdm7aRMRrYGgPvnwLe6Y+7LMvAB5IbSA= +github.com/blevesearch/mmap-go v1.0.3 h1:7QkALgFNooSq3a46AE+pWeKASAZc9SiNFJhDGF1NDx4= +github.com/blevesearch/mmap-go v1.0.3/go.mod h1:pYvKl/grLQrBxuaRYgoTssa4rVujYYeenDp++2E+yvs= +github.com/blevesearch/scorch_segment_api/v2 v2.1.0 h1:NFwteOpZEvJk5Vg0H6gD0hxupsG3JYocE4DBvsA2GZI= +github.com/blevesearch/scorch_segment_api/v2 v2.1.0/go.mod h1:uch7xyyO/Alxkuxa+CGs79vw0QY8BENSBjg6Mw5L5DE= +github.com/blevesearch/segment v0.9.0 h1:5lG7yBCx98or7gK2cHMKPukPZ/31Kag7nONpoBt22Ac= +github.com/blevesearch/segment v0.9.0/go.mod h1:9PfHYUdQCgHktBgvtUOF4x+pc4/l8rdH0u5spnW85UQ= +github.com/blevesearch/snowballstem v0.9.0 h1:lMQ189YspGP6sXvZQ4WZ+MLawfV8wOmPoD/iWeNXm8s= +github.com/blevesearch/snowballstem v0.9.0/go.mod h1:PivSj3JMc8WuaFkTSRDW2SlrulNWPl4ABg1tC/hlgLs= +github.com/blevesearch/upsidedown_store_api v1.0.1 h1:1SYRwyoFLwG3sj0ed89RLtM15amfX2pXlYbFOnF8zNU= +github.com/blevesearch/upsidedown_store_api v1.0.1/go.mod h1:MQDVGpHZrpe3Uy26zJBf/a8h0FZY6xJbthIMm8myH2Q= +github.com/blevesearch/vellum v1.0.7 h1:+vn8rfyCRHxKVRgDLeR0FAXej2+6mEb5Q15aQE/XESQ= +github.com/blevesearch/vellum v1.0.7/go.mod h1:doBZpmRhwTsASB4QdUZANlJvqVAUdUyX0ZK7QJCTeBE= +github.com/blevesearch/zapx/v11 v11.3.1 h1:X88o7rxOK4bTB2SSwvSWMc6dFhFtQoF3n06q5h/Vhps= +github.com/blevesearch/zapx/v11 v11.3.1/go.mod h1:YzTfUm4kS3e8OmTXDHVV8OzC5MWPO/VPJZQgPNVb4Lc= +github.com/blevesearch/zapx/v12 v12.3.1 h1:SNG60aOBXQ64d3rPiUFuxWsyHTW6h9jKlBKSKMUdxdc= +github.com/blevesearch/zapx/v12 v12.3.1/go.mod h1:RMl6lOZqF+sTxKvhQDJ5yK2LT3Mu7E2p/jGdjAaiRxs= +github.com/blevesearch/zapx/v13 v13.3.1 h1:Aj5iQBXJ7xaGZLxwdueadC/s6vJ5/Jo3klKJfFDjpio= +github.com/blevesearch/zapx/v13 v13.3.1/go.mod h1:eppobNM35U4C22yDvTuxV9xPqo10pwfP/jugL4INWG4= +github.com/blevesearch/zapx/v14 v14.3.1 h1:UyCe63mk9ZcEqgxyMS3Ab3ZC3lhDp1UJktvp31U5KA8= +github.com/blevesearch/zapx/v14 v14.3.1/go.mod h1:zXNcVzukh0AvG57oUtT1T0ndi09H0kELNaNmekEy0jw= +github.com/blevesearch/zapx/v15 v15.3.1 h1:TWm6h55pzmLCbKSFb/dgUVSg98LlYUPqtI/MhTHmZAA= +github.com/blevesearch/zapx/v15 v15.3.1/go.mod h1:C+f/97ZzTzK6vt/7sVlZdzZxKu+5+j4SrGCvr9dJzaY= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= +github.com/bmizerany/pat v0.0.0-20210406213842-e4b6760bdd6f h1:gOO/tNZMjjvTKZWpY7YnXC72ULNLErRtp94LountVE8= +github.com/bmizerany/pat v0.0.0-20210406213842-e4b6760bdd6f/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= +github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff/go.mod h1:+RTT1BOk5P97fT2CiHkbFQwkK3mjsFAP6zCYV2aXtjw= +github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= +github.com/bradleypeabody/gorilla-sessions-memcache v0.0.0-20181103040241-659414f458e1/go.mod h1:dkChI7Tbtx7H1Tj7TqGSZMOeGpMP5gLHtjroHd4agiI= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= +github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= +github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= +github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= +github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= +github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= +github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= +github.com/containerd/containerd v1.5.8 h1:NmkCC1/QxyZFBny8JogwLpOy2f+VEbO/f6bV2Mqtwuw= +github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= +github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= +github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= +github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= +github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= +github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= +github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= +github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= +github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= +github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= +github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= +github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= +github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-iptables v0.4.3/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-oidc v2.2.1+incompatible h1:mh48q/BqXqgjVHpy2ZY7WnWAbenxRjsz9N1i1YxjHAk= +github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-oidc/v3 v3.1.0 h1:6avEvcdvTa1qYsOZ6I5PRkSYHzpTNWgKYmaJfaYbrRw= +github.com/coreos/go-oidc/v3 v3.1.0/go.mod h1:rEJ/idjfUyfkBit1eI1fvyr+64/g9dcKpAm8MJMesvo= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/couchbase/ghistogram v0.1.0/go.mod h1:s1Jhy76zqfEecpNWJfWUiKZookAFaiGOEoyzgHt9i7k= +github.com/couchbase/moss v0.1.0/go.mod h1:9MaHIaRuy9pvLPUJxB8sh8OrLfyDczECVL37grCIubs= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= +github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dchest/uniuri v0.0.0-20160212164326-8902c56451e9/go.mod h1:GgB8SF9nRG+GqaDtLcwJZsQFhcogVCJ79j4EdT0c2V4= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v17.12.0-ce-rc1.0.20201201034508-7d75c1d40d88+incompatible h1:rsPfdypSNWulLrsXo3WiBdlNQpokgBqfWLjEa/aXiBc= +github.com/docker/docker v17.12.0-ce-rc1.0.20201201034508-7d75c1d40d88+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= +github.com/eclipse/paho.mqtt.golang v1.3.5 h1:sWtmgNxYM9P2sP+xEItMozsR3w0cqZFlqnNN1bdl41Y= +github.com/eclipse/paho.mqtt.golang v1.3.5/go.mod h1:eTzb4gxwwyWpqBUHGQZ4ABAV7+Jgm1PklsYT/eo8Hcc= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emitter-io/go/v2 v2.0.9 h1:qA+cnG3kS2uLzo5ETFY6zbHBGl+FmNj0cGf3da7foA4= +github.com/emitter-io/go/v2 v2.0.9/go.mod h1:St++epE1u/6ueCVw47xhu4shpkGNxKRVtkWv4Xi33mg= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/cors v1.3.1 h1:doAsuITavI4IOcd0Y19U4B+O0dNWihRyX//nn4sEmgA= +github.com/gin-contrib/cors v1.3.1/go.mod h1:jjEJ4268OPZUcU7k9Pm653S7lXUGcqMADzFA61xsmDk= +github.com/gin-contrib/sessions v0.0.4 h1:gq4fNa1Zmp564iHP5G6EBuktilEos8VKhe2sza1KMgo= +github.com/gin-contrib/sessions v0.0.4/go.mod h1:pQ3sIyviBBGcxgyR8mkeJuXbeV3h3NYmhJADQTq5+Vo= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= +github.com/gin-gonic/gin v1.7.4 h1:QmUZXrvJ9qZ3GfWvQ+2wnW/1ePrTEJqPKMYEU3lD/DM= +github.com/gin-gonic/gin v1.7.4/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= +github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= +github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= +github.com/go-openapi/analysis v0.19.16/go.mod h1:GLInF007N83Ad3m8a/CbQ5TPzdnGT7workfHwuVjNVk= +github.com/go-openapi/analysis v0.20.0/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og= +github.com/go-openapi/analysis v0.20.1/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og= +github.com/go-openapi/analysis v0.21.1 h1:krcNCEvCttpSUFBPOrfvn7nniejvrOkoNYRlZwQFpEs= +github.com/go-openapi/analysis v0.21.1/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= +github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.19.7/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.20.0/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.20.1 h1:j23mMDtRxMwIobkpId7sWh7Ddcx4ivaoqUbfXx5P+a8= +github.com/go-openapi/errors v0.20.1/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= +github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= +github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= +github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= +github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= +github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= +github.com/go-openapi/loads v0.19.6/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= +github.com/go-openapi/loads v0.19.7/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= +github.com/go-openapi/loads v0.20.0/go.mod h1:2LhKquiE513rN5xC6Aan6lYOSddlL8Mp20AW9kpviM4= +github.com/go-openapi/loads v0.20.2/go.mod h1:hTVUotJ+UonAMMZsvakEgmWKgtulweO9vYP2bQYKA/o= +github.com/go-openapi/loads v0.21.0 h1:jYtUO4wwP7psAweisP/MDoOpdzsYEESdoPcsWjHDR68= +github.com/go-openapi/loads v0.21.0/go.mod h1:rHYve9nZrQ4CJhyeIIFJINGCg1tQpx2yJrrNo8sf1ws= +github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= +github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= +github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= +github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= +github.com/go-openapi/runtime v0.19.16/go.mod h1:5P9104EJgYcizotuXhEuUrzVc+j1RiSjahULvYmlv98= +github.com/go-openapi/runtime v0.19.24/go.mod h1:Lm9YGCeecBnUUkFTxPC4s1+lwrkJ0pthx8YvyjCfkgk= +github.com/go-openapi/runtime v0.19.27/go.mod h1:BvrQtn6iVb2QmiVXRsFAm6ZCAZBpbVKFfN6QWCp582M= +github.com/go-openapi/runtime v0.21.0 h1:giZ8eT26R+/rx6RX2MkYjZPY8vPYVKDhP/mOazrQHzM= +github.com/go-openapi/runtime v0.21.0/go.mod h1:aQg+kaIQEn+A2CRSY1TxbM8+sT9g2V3aLc1FbIAnbbs= +github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/spec v0.19.15/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= +github.com/go-openapi/spec v0.20.0/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= +github.com/go-openapi/spec v0.20.1/go.mod h1:93x7oh+d+FQsmsieroS4cmR3u0p/ywH649a3qwC9OsQ= +github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= +github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M= +github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= +github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= +github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= +github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= +github.com/go-openapi/strfmt v0.19.11/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= +github.com/go-openapi/strfmt v0.20.0/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= +github.com/go-openapi/strfmt v0.20.1/go.mod h1:43urheQI9dNtE5lTZQfuFJvjYJKPrxicATpEfZwHUNk= +github.com/go-openapi/strfmt v0.20.2/go.mod h1:43urheQI9dNtE5lTZQfuFJvjYJKPrxicATpEfZwHUNk= +github.com/go-openapi/strfmt v0.21.0 h1:hX2qEZKmYks+t0hKeb4VTJpUm2UYsdL3+DCid5swxIs= +github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= +github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= +github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= +github.com/go-openapi/swag v0.19.12/go.mod h1:eFdyEBkTdoAf/9RXBvj4cr1nH7GD8Kzo5HTt47gr72M= +github.com/go-openapi/swag v0.19.13/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= +github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= +github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= +github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= +github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= +github.com/go-openapi/validate v0.19.12/go.mod h1:Rzou8hA/CBw8donlS6WNEUQupNvUZ0waH08tGe6kAQ4= +github.com/go-openapi/validate v0.19.15/go.mod h1:tbn/fdOwYHgrhPBzidZfJC2MIVvs9GA7monOmWBbeCI= +github.com/go-openapi/validate v0.20.1/go.mod h1:b60iJT+xNNLfaQJUqLI7946tYiFEOuE9E4k54HpKcJ0= +github.com/go-openapi/validate v0.20.2/go.mod h1:e7OJoKNgd0twXZwIn0A43tHbvIcr/rZIVCbJBpTUoY0= +github.com/go-openapi/validate v0.20.3 h1:GZPPhhKSZrE8HjB4eEkoYAZmoWA4+tCemSgINH1/vKw= +github.com/go-openapi/validate v0.20.3/go.mod h1:goDdqVGiigM3jChcrYJxD2joalke3ZXeftD16byIjA4= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-playground/validator/v10 v10.9.0 h1:NgTtmN58D0m8+UuxtYmGztBJB7VnPgjj221I1QHci2A= +github.com/go-playground/validator/v10 v10.9.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= +github.com/go-swagger/go-swagger v0.27.0 h1:K7+nkBuf4oS1jTBrdvWqYFpqD69V5CN8HamZzCDDhAI= +github.com/go-swagger/go-swagger v0.27.0/go.mod h1:WodZVysInJilkW7e6IRw+dZGp5yW6rlMFZ4cb+THl9A= +github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013/go.mod h1:b65mBPzqzZWxOZGxSWrqs4GInLIn+u99Q9q7p+GKni0= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.1.0 h1:7RFti/xnNkMJnrK7D1yQ/iCIB5OrrY/54/H930kIbHA= +github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= +github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= +github.com/gorilla/sessions v1.2.0/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/icza/dyno v0.0.0-20210726202311-f1bafe5d9996 h1:ReG4j9+RbIOX2sR0cwPRpPXPaN+O/Hf59Npw3Iv118E= +github.com/icza/dyno v0.0.0-20210726202311-f1bafe5d9996/go.mod h1:c1tRKs5Tx7E2+uHGSyyncziFjvGpgv4H2HrqXeUQ/Uk= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/kidstuff/mongostore v0.0.0-20181113001930-e650cd85ee4b/go.mod h1:g2nVr8KZVXJSS97Jo8pJ0jgq29P6H7dG0oplUA86MQw= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/kljensen/snowball v0.6.0/go.mod h1:27N7E8fVU5H68RlUmnWwZCfxgt4POBJfENGMvNRhldw= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/memcachier/mc v2.0.1+incompatible/go.mod h1:7bkvFE61leUBvXz+yxsOnGBQSZpBSPIMUQSmmSHvuXc= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mingrammer/commonregex v1.0.1 h1:QY0Z1Bl80jw9M3+488HJXPWnZmvtu3UdvxyodP2FTyY= +github.com/mingrammer/commonregex v1.0.1/go.mod h1:/HNZq7qReKgXBxJxce5SOxf33y0il/ZqL4Kxgo2NLcA= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo= +github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM= +github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= +github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= +github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/pquerna/cachecontrol v0.0.0-20201205024021-ac21108117ac/go.mod h1:hoLfEwdY11HjRfKFH6KqnPsfxlo3BP6bJehpDv8t6sQ= +github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/quasoft/memstore v0.0.0-20191010062613-2bce066d2b0b/go.mod h1:wTPjTepVu7uJBYgZ0SdWHQlIas582j6cn2jgk4DDdlg= +github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.19.0/go.mod h1:IzD0RJ65iWH0w97OQQebJEvTZYvsCUm9WVLWBQrJRjo= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sethgrid/pester v0.0.0-20190127155807-68a33a018ad0/go.mod h1:Ad7IjTpvzZO8Fl0vh9AzQ+j/jYZfyp2diGwI8m5q+ns= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= +github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/steveyen/gtreap v0.1.0 h1:CjhzTa274PyJLJuMZwIzCO1PfC00oRa8d1Kc78bFXJM= +github.com/steveyen/gtreap v0.1.0/go.mod h1:kl/5J7XbrOmlIbYIXdRHDDE5QxHqpk0cmkT7Z4dM9/Y= +github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.11.0 h1:C16pk7tQNiH6VlCrtIXL1w8GaOsi1X3W8KDkE1BuYd4= +github.com/tidwall/gjson v1.11.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.3 h1:5+deguEhHSEjmuICXZ21uSSsXotWMA0orU783+Z7Cp8= +github.com/tidwall/sjson v1.2.3/go.mod h1:5WdjKx3AQMvCJ4RG6/2UYT7dLrGvJUV1x4jdTAyGvZs= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM= +github.com/tus/tusd v1.8.0 h1:QODQ5uMhL2tFX3Ouk7rUHHqPqeDBvi2+gYIoyUO0n8Q= +github.com/tus/tusd v1.8.0/go.mod h1:stZzKpol4qz7lX2HXy/1H526dn5mRnkIICTW2lrh9NM= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go v1.2.6 h1:tGiWC9HENWE2tqYycIqFTNorMmFRVhNwCpDOpWqnk8E= +github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ= +github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= +github.com/vimeo/go-util v1.4.1/go.mod h1:r+yspV//C48HeMXV8nEvtUeNiIiGfVv3bbEHzOgudwE= +github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/warjiang/gojsonschema v1.2.1-0.20210329105853-aa9f9a8cfec7 h1:tBx6st54ijBCqyKdj6uE+6J+q/xT1GvD0+JNAMt7zJs= +github.com/warjiang/gojsonschema v1.2.1-0.20210329105853-aa9f9a8cfec7/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= +github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= +go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= +go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= +go.mongodb.org/mongo-driver v1.4.3/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= +go.mongodb.org/mongo-driver v1.4.4/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= +go.mongodb.org/mongo-driver v1.4.6/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= +go.mongodb.org/mongo-driver v1.5.1/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS4xxMmUqw= +go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= +go.mongodb.org/mongo-driver v1.7.4 h1:sllcioag8Mec0LYkftYWq+cKNPIR4Kqq3iv9ZXY0g/E= +go.mongodb.org/mongo-driver v1.7.4/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200505041828-1ed23360d12c/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210331060903-cb1fcc7394e5/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211105192438-b53810dc28af h1:SMeNJG/vclJ5wyBBd4xupMsSJIHTd1coW9g7q6KOjmY= +golang.org/x/net v0.0.0-20211105192438-b53810dc28af/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210323180902-22b0adad7558/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181221143128-b4a75ba826a6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c h1:+8miTPjMCTXwih7BQmvWwd0PjdBZq2MKp/qQaahSzEM= +golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= +google.golang.org/api v0.60.0/go.mod h1:d7rl65NZAkEQ90JFzqBjcRq1TVeG5ZoGV3sSpEnnVb4= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211016002631-37fc39342514/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211021150943-2b146023228c h1:FqrtZMB5Wr+/RecOM3uPJNPfWR8Upb5hAPnt7PU6i4k= +google.golang.org/genproto v0.0.0-20211021150943-2b146023228c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/Acconut/lockfile.v1 v1.1.0/go.mod h1:6UCz3wJ8tSFUsPR6uP/j8uegEtDuEEqFxlpi0JI4Umw= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= +gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= +gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= +k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= +k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= +k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= +k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= +k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= +k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= +k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= +k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= +k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= +k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= +k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= +k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/hooks/hooks.go b/hooks/hooks.go new file mode 100644 index 0000000..bffa129 --- /dev/null +++ b/hooks/hooks.go @@ -0,0 +1,52 @@ +package hooks + +import ( + "context" + + "github.com/arangodb/go-driver" + "github.com/gin-gonic/gin" + + "github.com/SecurityBrewery/catalyst/index" +) + +type Hooks struct { + DatabaseAfterConnectFuncs []func(ctx context.Context, client driver.Client, name string) + IngestionFilterFunc func(ctx context.Context, index *index.Index) (string, error) + TicketReadFilterFunc func(ctx context.Context) (string, map[string]interface{}, error) + TicketWriteFilterFunc func(ctx context.Context) (string, map[string]interface{}, error) + GetGroupsFunc func(ctx context.Context, username string) ([]string, error) +} + +func (h *Hooks) DatabaseAfterConnect(ctx context.Context, client driver.Client, name string) { + for _, f := range h.DatabaseAfterConnectFuncs { + f(ctx, client, name) + } +} + +func (h *Hooks) IngestionFilter(ctx context.Context, index *index.Index) (string, error) { + if h.IngestionFilterFunc != nil { + return h.IngestionFilterFunc(ctx, index) + } + return "[]", nil +} + +func (h *Hooks) TicketReadFilter(ctx context.Context) (string, map[string]interface{}, error) { + if h.TicketReadFilterFunc != nil { + return h.TicketReadFilterFunc(ctx) + } + return "", nil, nil +} + +func (h *Hooks) TicketWriteFilter(ctx context.Context) (string, map[string]interface{}, error) { + if h.TicketWriteFilterFunc != nil { + return h.TicketWriteFilterFunc(ctx) + } + return "", nil, nil +} + +func (h *Hooks) GetGroups(ctx *gin.Context, username string) ([]string, error) { + if h.GetGroupsFunc != nil { + return h.GetGroupsFunc(ctx, username) + } + return nil, nil +} diff --git a/index/index.go b/index/index.go new file mode 100644 index 0000000..e54bee3 --- /dev/null +++ b/index/index.go @@ -0,0 +1,80 @@ +package index + +import ( + "errors" + "fmt" + "log" + "os" + + "github.com/blevesearch/bleve/v2" + + "github.com/SecurityBrewery/catalyst/generated/models" +) + +type Index struct { + name string + internal bleve.Index +} + +func New(name string) (*Index, error) { + var err error + var bleveIndex bleve.Index + if _, oerr := os.Stat(name); os.IsNotExist(oerr) { + bleveIndex, err = bleve.New(name, bleve.NewIndexMapping()) + } else { + bleveIndex, err = bleve.Open(name) + } + if err != nil { + return nil, err + } + + return &Index{name: name, internal: bleveIndex}, nil +} + +func (i *Index) Index(incidents []*models.TicketSimpleResponse) { + b := i.internal.NewBatch() + for _, incident := range incidents { + if incident.ID == 0 { + log.Println(errors.New("no ID"), incident) + continue + } + + err := b.Index(fmt.Sprint(incident.ID), incident) + if err != nil { + log.Println(err) + } + } + err := i.internal.Batch(b) + if err != nil { + log.Println(err) + } +} + +func (i *Index) Search(term string) (ids []string, err error) { + query := bleve.NewQueryStringQuery(term) + result, err := i.internal.Search(bleve.NewSearchRequestOptions(query, 10000, 0, false)) + if err != nil { + return nil, err + } + for _, match := range result.Hits { + ids = append(ids, match.ID) + } + return ids, nil +} + +func (i *Index) Truncate() error { + err := i.internal.Close() + if err != nil { + return err + } + err = os.RemoveAll(i.name) + if err != nil { + return err + } + index, err := bleve.New(i.name, bleve.NewIndexMapping()) + if err != nil { + return err + } + i.internal = index + return nil +} diff --git a/index/index_test.go b/index/index_test.go new file mode 100644 index 0000000..24fd248 --- /dev/null +++ b/index/index_test.go @@ -0,0 +1,83 @@ +package index_test + +import ( + "reflect" + "testing" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/test" +) + +func TestIndex(t *testing.T) { + type args struct { + term string + } + tests := []struct { + name string + args args + wantIds []string + wantErr bool + }{ + {name: "Exists", args: args{"foo"}, wantIds: []string{"1"}}, + {name: "Not exists", args: args{"bar"}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + i, cleanup, err := test.Index(t) + if err != nil { + t.Fatal(err) + } + defer cleanup() + + i.Index([]*models.TicketSimpleResponse{ + {ID: 0, Name: "bar"}, + {ID: 1, Name: "foo"}, + }) + + gotIds, err := i.Search(tt.args.term) + if (err != nil) != tt.wantErr { + t.Errorf("Search() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(gotIds, tt.wantIds) { + t.Errorf("Search() gotIds = %v, want %v", gotIds, tt.wantIds) + } + }) + } +} + +func TestIndex_Truncate(t *testing.T) { + tests := []struct { + name string + wantErr bool + }{ + {name: "Truncate"}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + i, cleanup, err := test.Index(t) + if err != nil { + t.Fatal(err) + } + defer cleanup() + + i.Index([]*models.TicketSimpleResponse{ + {ID: 0, Name: "bar"}, + {ID: 1, Name: "foo"}, + }) + + if err := i.Truncate(); (err != nil) != tt.wantErr { + t.Errorf("Truncate() error = %v, wantErr %v", err, tt.wantErr) + } + + ids, err := i.Search("foo") + if err != nil { + t.Fatal(err) + } + + if ids != nil { + t.Fatal("should return no results") + } + }) + } +} diff --git a/pointer/pointer.go b/pointer/pointer.go new file mode 100644 index 0000000..33b94df --- /dev/null +++ b/pointer/pointer.go @@ -0,0 +1,19 @@ +package pointer + +import "time" + +func String(v string) *string { + return &v +} + +func Int64(v int64) *int64 { + return &v +} + +func Bool(v bool) *bool { + return &v +} + +func Time(v time.Time) *time.Time { + return &v +} diff --git a/restore.go b/restore.go new file mode 100644 index 0000000..276cc3c --- /dev/null +++ b/restore.go @@ -0,0 +1,169 @@ +package catalyst + +import ( + "archive/zip" + "bytes" + "context" + "errors" + "fmt" + "io" + "io/fs" + "log" + "net/http" + "os" + "os/exec" + "path" + "strings" + + "github.com/aws/aws-sdk-go/service/s3" + "github.com/aws/aws-sdk-go/service/s3/s3manager" + "github.com/gin-gonic/gin" + + "github.com/SecurityBrewery/catalyst/database" + "github.com/SecurityBrewery/catalyst/pointer" + "github.com/SecurityBrewery/catalyst/storage" +) + +func RestoreHandler(catalystStorage *storage.Storage, db *database.Database, c *database.Config) gin.HandlerFunc { + return func(context *gin.Context) { + uf, err := context.FormFile("backup") + if err != nil { + log.Println(err) + context.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + } + + f, err := uf.Open() + if err != nil { + log.Println(err) + context.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + } + defer f.Close() + + if err = Restore(context, catalystStorage, db, c, f, uf.Size); err != nil { + log.Println(err) + context.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + } + } +} + +func Restore(ctx context.Context, catalystStorage *storage.Storage, db *database.Database, c *database.Config, r io.Reader, size int64) error { + b, err := io.ReadAll(r) + if err != nil { + return err + } + + ra := bytes.NewReader(b) + fsys, err := zip.NewReader(ra, size) + if err != nil { + return err + } + + if fsys.Comment != GetVersion() { + return errors.New(fmt.Sprintf("wrong version, got: %s, want: %s", fsys.Comment, GetVersion())) + } + + dir, err := os.MkdirTemp("", "catalyst-restore") + if err != nil { + return err + } + defer os.RemoveAll(dir) + + if err = unzip(fsys, dir); err != nil { + return err + } + + if err := restoreS3(catalystStorage, path.Join(dir, "minio")); err != nil { + return err + } + + if err := arangorestore(path.Join(dir, "arango"), c); err != nil { + return err + } + + return db.IndexRebuild(ctx) +} + +func restoreS3(catalystStorage *storage.Storage, p string) error { + minioDir := os.DirFS(p) + + entries, err := fs.ReadDir(minioDir, ".") + if err != nil { + return err + } + + for _, entry := range entries { + if err := restoreBucket(catalystStorage, entry, minioDir); err != nil { + return err + } + } + return nil +} + +func restoreBucket(catalystStorage *storage.Storage, entry fs.DirEntry, minioDir fs.FS) error { + _, err := catalystStorage.S3().CreateBucket(&s3.CreateBucketInput{Bucket: pointer.String(entry.Name())}) + if err != nil { + return err + } + + uploader := catalystStorage.Uploader() + + f, err := minioDir.Open(entry.Name()) + if err != nil { + return err + } + defer f.Close() + + err = fs.WalkDir(minioDir, ".", func(path string, d fs.DirEntry, err error) error { + if err != nil { + return nil + } + _, err = uploader.Upload(&s3manager.UploadInput{Body: f, Bucket: pointer.String(entry.Name()), Key: pointer.String(path)}) + return err + }) + if err != nil { + return err + } + return nil +} + +func unzip(archive *zip.Reader, dir string) error { + return fs.WalkDir(archive, "arango", func(p string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + + if d.IsDir() { + _ = os.MkdirAll(path.Join(dir, p), os.ModePerm) + return nil + } + + f, err := archive.Open(p) + if err != nil { + return err + } + defer f.Close() + + b, err := io.ReadAll(f) + if err != nil { + return err + } + + return os.WriteFile(path.Join(dir, p), b, os.ModePerm) + }) +} + +func arangorestore(dir string, config *database.Config) error { + host := strings.Replace(config.Host, "http", "tcp", 1) + + name := config.Name + if config.Name == "" { + name = database.Name + } + args := []string{ + "--input-directory", dir, "--server.endpoint", host, + "--server.username", config.User, "--server.password", config.Password, + "--server.database", name, + } + cmd := exec.Command("arangorestore", args...) + return cmd.Run() +} diff --git a/role/role.go b/role/role.go new file mode 100644 index 0000000..46d3d02 --- /dev/null +++ b/role/role.go @@ -0,0 +1,179 @@ +package role + +import ( + "errors" + "sort" + "strings" + + "github.com/SecurityBrewery/catalyst/generated/models" +) + +type Role string + +const ( + Analyst string = "analyst" + Engineer string = "engineer" + Admin string = "admin" + + AutomationRead Role = "analyst:automation:read" + CurrentuserdataRead Role = "analyst:currentuserdata:read" + CurrentuserdataWrite Role = "analyst:currentsettings:write" + CurrentuserRead Role = "analyst:currentuser:read" + FileReadWrite Role = "analyst:file" + GroupRead Role = "analyst:group:read" + PlaybookRead Role = "analyst:playbook:read" + RuleRead Role = "analyst:rule:read" + SettingsRead Role = "analyst:settings:read" + TemplateRead Role = "analyst:template:read" + TicketRead Role = "analyst:ticket:read" + TickettypeRead Role = "analyst:tickettype:read" + TicketWrite Role = "analyst:ticket:write" + UserRead Role = "analyst:user:read" + + AutomationWrite Role = "engineer:automation:write" + PlaybookWrite Role = "engineer:playbook:write" + RuleWrite Role = "engineer:rule:write" + TemplateWrite Role = "engineer:template:write" + TickettypeWrite Role = "engineer:tickettype:write" + + BackupRead Role = "admin:backup:read" + BackupRestore Role = "admin:backup:restore" + GroupWrite Role = "admin:group:write" + JobWrite Role = "admin:job:write" + JobRead Role = "admin:job:read" + LogRead Role = "admin:log:read" + UserdataRead Role = "admin:userdata:read" + UserdataWrite Role = "admin:userdata:write" + TicketDelete Role = "admin:ticket:delete" + UserWrite Role = "admin:user:write" +) + +func (p Role) String() string { + return string(p) +} + +func UserHasRoles(user *models.UserResponse, roles []Role) bool { + hasRoles := true + for _, role := range roles { + if !UserHasRole(user, role) { + hasRoles = false + break + } + } + return hasRoles +} + +func UserHasRole(user *models.UserResponse, role Role) bool { + return ContainsRole(FromStrings(user.Roles), role) +} + +func ContainsRole(roles []Role, role Role) bool { + for _, r := range roles { + if r.String() == role.String() { // || strings.HasPrefix(role.String(), r.String()+":") + return true + } + } + return false +} + +func Explodes(s []string) []Role { + var roles []Role + for _, e := range s { + roles = append(roles, Explode(e)...) + } + roles = unique(roles) + sort.Slice(roles, func(i, j int) bool { + return roles[i].String() < roles[j].String() + }) + + return roles +} + +func Explode(s string) []Role { + var roles []Role + + switch s { + case Admin: + roles = append(roles, listPrefix(Admin)...) + fallthrough + case Engineer: + roles = append(roles, listPrefix(Engineer)...) + fallthrough + case Analyst: + roles = append(roles, listPrefix(Analyst)...) + return roles + } + + for _, role := range List() { + if role.String() == s { + roles = append(roles, role) + } + } + + return roles +} + +func listPrefix(s string) []Role { + var roles []Role + + for _, role := range List() { + if strings.HasPrefix(role.String(), s+":") { + roles = append(roles, role) + } + } + + return roles +} + +func unique(l []Role) []Role { + keys := make(map[Role]bool) + var list []Role + for _, entry := range l { + if _, value := keys[entry]; !value { + keys[entry] = true + list = append(list, entry) + } + } + return list +} + +func List() []Role { + return []Role{ + AutomationRead, CurrentuserdataRead, CurrentuserdataWrite, + CurrentuserRead, FileReadWrite, GroupRead, PlaybookRead, RuleRead, + UserdataRead, SettingsRead, TemplateRead, TicketRead, TickettypeRead, + TicketWrite, UserRead, AutomationWrite, PlaybookWrite, RuleWrite, + TemplateWrite, TickettypeWrite, BackupRead, BackupRestore, GroupWrite, + LogRead, UserdataWrite, TicketDelete, UserWrite, JobRead, JobWrite, + } +} + +func fromString(s string) (Role, error) { + for _, role := range List() { + if role.String() == s { + return role, nil + } + } + + return "", errors.New("unknown role") +} + +func Strings(roles []Role) []string { + var s []string + for _, role := range roles { + s = append(s, role.String()) + } + return s +} + +func FromStrings(s []string) []Role { + var roles []Role + for _, e := range s { + role, err := fromString(e) + if err != nil { + continue + } + roles = append(roles, role) + } + return roles +} diff --git a/server.go b/server.go new file mode 100644 index 0000000..3643123 --- /dev/null +++ b/server.go @@ -0,0 +1,143 @@ +package catalyst + +import ( + "context" + "time" + + "github.com/gin-contrib/cors" + "github.com/gin-contrib/sessions" + "github.com/gin-contrib/sessions/cookie" + + "github.com/SecurityBrewery/catalyst/automation" + "github.com/SecurityBrewery/catalyst/bus" + "github.com/SecurityBrewery/catalyst/database" + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi" + "github.com/SecurityBrewery/catalyst/hooks" + "github.com/SecurityBrewery/catalyst/index" + "github.com/SecurityBrewery/catalyst/role" + "github.com/SecurityBrewery/catalyst/service" + "github.com/SecurityBrewery/catalyst/storage" +) + +type Config struct { + IndexPath string + DB *database.Config + Storage *storage.Config + Bus *bus.Config + + UISettings *models.Settings + Secret []byte + Auth *AuthConfig + ExternalAddress string + InitialAPIKey string +} + +type Server struct { + Bus *bus.Bus + DB *database.Database + Index *index.Index + Storage *storage.Storage + Server *restapi.Server +} + +func New(hooks *hooks.Hooks, config *Config) (*Server, error) { + ctx := context.Background() + ctx, cancel := context.WithTimeout(ctx, time.Second*30) + defer cancel() + + err := config.Auth.Load(ctx) + if err != nil { + return nil, err + } + + catalystStorage, err := storage.New(config.Storage) + if err != nil { + return nil, err + } + + catalystIndex, err := index.New(config.IndexPath) + if err != nil { + return nil, err + } + + catalystBus, err := bus.New(config.Bus) + if err != nil { + return nil, err + } + + catalystDatabase, err := database.New(ctx, catalystIndex, catalystBus, hooks, config.DB) + if err != nil { + return nil, err + } + + err = automation.New(config.Bus.APIUrl, config.InitialAPIKey, catalystBus, catalystDatabase) + if err != nil { + return nil, err + } + + catalystService, err := service.New(catalystBus, catalystDatabase, catalystStorage, config.UISettings) + if err != nil { + return nil, err + } + + if config.InitialAPIKey != "" { + _ = catalystDatabase.UserDelete(ctx, "setup") + + ctx = busdb.UserContext(ctx, &models.UserResponse{ + ID: "setup", + Roles: role.Strings(role.Explode(role.Admin)), + Apikey: false, + Blocked: false, + }) + _, err = catalystDatabase.UserCreateSetupAPIKey(ctx, config.InitialAPIKey) + if err != nil { + return nil, err + } + } + + apiServer, err := setupAPI(catalystService, catalystStorage, catalystDatabase, config.DB, catalystBus, config) + if err != nil { + return nil, err + } + + return &Server{ + Bus: catalystBus, + DB: catalystDatabase, + Index: catalystIndex, + Storage: catalystStorage, + Server: apiServer, + }, nil +} + +func setupAPI(catalystService *service.Service, catalystStorage *storage.Storage, catalystDatabase *database.Database, dbConfig *database.Config, bus *bus.Bus, config *Config) (*restapi.Server, error) { + // session + store := cookie.NewStore(config.Secret) + setSession := sessions.Sessions(SessionName, store) + + authenticate := Authenticate(catalystDatabase, config.Auth) + + // create server + apiServer := restapi.New(catalystService, &restapi.Config{Address: "0.0.0.0:8000", InsecureHTTP: true}) + apiServer.UseRawPath = true + + apiServer.ApiGroup.Use(setSession, authenticate, AuthorizeBlockedUser) + apiServer.RoleAuth = AuthorizeRole + + apiServer.ConfigureRoutes() + apiServer.ApiGroup.HEAD("/files/:ticketID/upload/:id", AuthorizeRole([]role.Role{role.FileReadWrite}), upload(catalystStorage.S3(), config.ExternalAddress)) + apiServer.ApiGroup.PATCH("/files/:ticketID/upload/:id", AuthorizeRole([]role.Role{role.FileReadWrite}), upload(catalystStorage.S3(), config.ExternalAddress)) + apiServer.ApiGroup.POST("/files/:ticketID/upload", AuthorizeRole([]role.Role{role.FileReadWrite}), upload(catalystStorage.S3(), config.ExternalAddress)) + apiServer.ApiGroup.GET("/files/:ticketID/download/:key", AuthorizeRole([]role.Role{role.FileReadWrite}), download(catalystStorage.Downloader())) + + apiServer.ApiGroup.GET("/backup/create", AuthorizeRole([]role.Role{role.BackupRead}), BackupHandler(catalystStorage, dbConfig)) + apiServer.ApiGroup.POST("/backup/restore", AuthorizeRole([]role.Role{role.BackupRestore}), RestoreHandler(catalystStorage, catalystDatabase, dbConfig)) + + apiServer.GET("/callback", setSession, callback(config.Auth)) + apiServer.Any("/wss", setSession, authenticate, AuthorizeBlockedUser, handleWebSocket(bus)) + apiServer.NoRoute(setSession, authenticate, AuthorizeBlockedUser, static) + + apiServer.Use(cors.Default()) + return apiServer, nil +} diff --git a/service/artifact.go b/service/artifact.go new file mode 100644 index 0000000..a5a960a --- /dev/null +++ b/service/artifact.go @@ -0,0 +1,34 @@ +package service + +import ( + "context" + + "github.com/google/uuid" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/tickets" +) + +func (s *Service) RunArtifact(ctx context.Context, params *tickets.RunArtifactParams) *api.Response { + artifact, err := s.database.ArtifactGet(ctx, params.ID, params.Name) + if err != nil { + return response(nil, err) + } + + jobID := uuid.NewString() + origin := &models.Origin{ArtifactOrigin: &models.ArtifactOrigin{TicketId: params.ID, Artifact: params.Name}} + return response(nil, s.bus.PublishJob(jobID, params.Automation, params.Name, &models.Context{Artifact: artifact}, origin)) +} + +func (s *Service) EnrichArtifact(ctx context.Context, params *tickets.EnrichArtifactParams) *api.Response { + return response(s.database.EnrichArtifact(ctx, params.ID, params.Name, params.Data)) +} + +func (s *Service) SetArtifact(ctx context.Context, params *tickets.SetArtifactParams) *api.Response { + return response(s.database.ArtifactUpdate(ctx, params.ID, params.Name, params.Artifact)) +} + +func (s *Service) GetArtifact(ctx context.Context, params *tickets.GetArtifactParams) *api.Response { + return response(s.database.ArtifactGet(ctx, params.ID, params.Name)) +} diff --git a/service/automation.go b/service/automation.go new file mode 100644 index 0000000..1461619 --- /dev/null +++ b/service/automation.go @@ -0,0 +1,28 @@ +package service + +import ( + "context" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/automations" +) + +func (s *Service) CreateAutomation(ctx context.Context, params *automations.CreateAutomationParams) *api.Response { + return response(s.database.AutomationCreate(ctx, params.Automation)) +} + +func (s *Service) GetAutomation(ctx context.Context, params *automations.GetAutomationParams) *api.Response { + return response(s.database.AutomationGet(ctx, params.ID)) +} + +func (s *Service) UpdateAutomation(ctx context.Context, params *automations.UpdateAutomationParams) *api.Response { + return response(s.database.AutomationUpdate(ctx, params.ID, params.Automation)) +} + +func (s *Service) DeleteAutomation(ctx context.Context, params *automations.DeleteAutomationParams) *api.Response { + return response(nil, s.database.AutomationDelete(ctx, params.ID)) +} + +func (s *Service) ListAutomations(ctx context.Context) *api.Response { + return response(s.database.AutomationList(ctx)) +} diff --git a/service/job.go b/service/job.go new file mode 100644 index 0000000..cc5bf03 --- /dev/null +++ b/service/job.go @@ -0,0 +1,29 @@ +package service + +import ( + "context" + + "github.com/google/uuid" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/jobs" +) + +func (s *Service) RunJob(_ context.Context, params *jobs.RunJobParams) *api.Response { + msgContext := &models.Context{} + jobID := uuid.NewString() + return response(nil, s.bus.PublishJob(jobID, params.Job.Automation, params.Job.Payload, msgContext, params.Job.Origin)) +} + +func (s *Service) GetJob(ctx context.Context, params *jobs.GetJobParams) *api.Response { + return response(s.database.JobGet(ctx, params.ID)) +} + +func (s *Service) ListJobs(ctx context.Context) *api.Response { + return response(s.database.JobList(ctx)) +} + +func (s *Service) UpdateJob(ctx context.Context, params *jobs.UpdateJobParams) *api.Response { + return response(s.database.JobUpdate(ctx, params.ID, params.Job)) +} diff --git a/service/log.go b/service/log.go new file mode 100644 index 0000000..4c8892f --- /dev/null +++ b/service/log.go @@ -0,0 +1,14 @@ +package service + +import ( + "context" + "net/url" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/logs" +) + +func (s *Service) GetLogs(ctx context.Context, params *logs.GetLogsParams) *api.Response { + id, _ := url.QueryUnescape(params.Reference) + return response(s.database.LogList(ctx, id)) +} diff --git a/service/playbook.go b/service/playbook.go new file mode 100644 index 0000000..c36430f --- /dev/null +++ b/service/playbook.go @@ -0,0 +1,53 @@ +package service + +import ( + "context" + "fmt" + "strings" + + "github.com/xeipuuv/gojsonschema" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/playbooks" +) + +func (s *Service) CreatePlaybook(ctx context.Context, params *playbooks.CreatePlaybookParams) *api.Response { + return response(s.database.PlaybookCreate(ctx, params.Playbook)) +} + +func (s *Service) GetPlaybook(ctx context.Context, params *playbooks.GetPlaybookParams) *api.Response { + return response(s.database.PlaybookGet(ctx, params.ID)) +} + +func (s *Service) UpdatePlaybook(ctx context.Context, params *playbooks.UpdatePlaybookParams) *api.Response { + if err := validate(params.Playbook, models.PlaybookTemplateFormSchema); err != nil { + return response(nil, err) + } + + return response(s.database.PlaybookUpdate(ctx, params.ID, params.Playbook)) +} + +func (s *Service) DeletePlaybook(ctx context.Context, params *playbooks.DeletePlaybookParams) *api.Response { + return response(nil, s.database.PlaybookDelete(ctx, params.ID)) +} + +func (s *Service) ListPlaybooks(ctx context.Context) *api.Response { + return response(s.database.PlaybookList(ctx)) +} + +func validate(e interface{}, schema *gojsonschema.Schema) error { + res, err := schema.Validate(gojsonschema.NewGoLoader(e)) + if err != nil { + return err + } + + if len(res.Errors()) > 0 { + var l []string + for _, e := range res.Errors() { + l = append(l, e.String()) + } + return fmt.Errorf("validation failed: %v", strings.Join(l, ", ")) + } + return nil +} diff --git a/service/service.go b/service/service.go new file mode 100644 index 0000000..9e23fa7 --- /dev/null +++ b/service/service.go @@ -0,0 +1,51 @@ +package service + +import ( + "errors" + "log" + "net/http" + + "github.com/arangodb/go-driver" + "github.com/gin-gonic/gin" + + "github.com/SecurityBrewery/catalyst/bus" + "github.com/SecurityBrewery/catalyst/database" + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" + "github.com/SecurityBrewery/catalyst/storage" +) + +type Service struct { + bus *bus.Bus + database *database.Database + settings *models.Settings + storage *storage.Storage +} + +func New(bus *bus.Bus, database *database.Database, storage *storage.Storage, settings *models.Settings) (*Service, error) { + return &Service{database: database, bus: bus, settings: settings, storage: storage}, nil +} + +func (s *Service) Healthy() bool { + return true +} + +func response(v interface{}, err error) *api.Response { + if err != nil { + log.Println(err) + return &api.Response{Code: httpStatus(err), Body: gin.H{"error": err.Error()}} + } + if v == nil { + return &api.Response{Code: http.StatusNoContent, Body: v} + } + return &api.Response{Code: http.StatusOK, Body: v} +} + +func httpStatus(err error) int { + ae := driver.ArangoError{} + if errors.As(err, &ae) { + return ae.Code + } + + return http.StatusInternalServerError +} diff --git a/service/statistics.go b/service/statistics.go new file mode 100644 index 0000000..f0ea6f2 --- /dev/null +++ b/service/statistics.go @@ -0,0 +1,11 @@ +package service + +import ( + "context" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +func (s *Service) GetStatistics(ctx context.Context) *api.Response { + return response(s.database.Statistics(ctx)) +} diff --git a/service/task.go b/service/task.go new file mode 100644 index 0000000..5343f9e --- /dev/null +++ b/service/task.go @@ -0,0 +1,11 @@ +package service + +import ( + "context" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" +) + +func (s *Service) ListTasks(ctx context.Context) *api.Response { + return response(s.database.TaskList(ctx)) +} diff --git a/service/template.go b/service/template.go new file mode 100644 index 0000000..3321fe2 --- /dev/null +++ b/service/template.go @@ -0,0 +1,28 @@ +package service + +import ( + "context" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/templates" +) + +func (s *Service) CreateTemplate(ctx context.Context, params *templates.CreateTemplateParams) *api.Response { + return response(s.database.TemplateCreate(ctx, params.Template)) +} + +func (s *Service) GetTemplate(ctx context.Context, params *templates.GetTemplateParams) *api.Response { + return response(s.database.TemplateGet(ctx, params.ID)) +} + +func (s *Service) UpdateTemplate(ctx context.Context, params *templates.UpdateTemplateParams) *api.Response { + return response(s.database.TemplateUpdate(ctx, params.ID, params.Template)) +} + +func (s *Service) DeleteTemplate(ctx context.Context, params *templates.DeleteTemplateParams) *api.Response { + return response(nil, s.database.TemplateDelete(ctx, params.ID)) +} + +func (s *Service) ListTemplates(ctx context.Context) *api.Response { + return response(s.database.TemplateList(ctx)) +} diff --git a/service/ticket.go b/service/ticket.go new file mode 100644 index 0000000..bf4a71d --- /dev/null +++ b/service/ticket.go @@ -0,0 +1,52 @@ +package service + +import ( + "context" + "fmt" + + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/tickets" +) + +func (s *Service) CreateTicket(ctx context.Context, params *tickets.CreateTicketParams) *api.Response { + createdTickets, err := s.database.TicketBatchCreate(ctx, []*models.TicketForm{params.Ticket}) + if len(createdTickets) > 0 { + return response(createdTickets[0], err) + } + return response(nil, err) +} + +func (s *Service) CreateTicketBatch(ctx context.Context, params *tickets.CreateTicketBatchParams) *api.Response { + _, err := s.database.TicketBatchCreate(ctx, params.Ticket) + return response(nil, err) +} + +func (s *Service) GetTicket(ctx context.Context, params *tickets.GetTicketParams) *api.Response { + return response(s.database.TicketGet(ctx, params.ID)) +} + +func (s *Service) UpdateTicket(ctx context.Context, params *tickets.UpdateTicketParams) *api.Response { + return response(s.database.TicketUpdate(ctx, params.ID, params.Ticket)) +} + +func (s *Service) DeleteTicket(ctx context.Context, params *tickets.DeleteTicketParams) *api.Response { + if err := s.database.TicketDelete(ctx, params.ID); err != nil { + return response(nil, err) + } + + _ = s.storage.DeleteBucket(fmt.Sprint(params.ID)) + return response(nil, nil) +} + +func (s *Service) ListTickets(ctx context.Context, params *tickets.ListTicketsParams) *api.Response { + q := "" + if params.Query != nil && *params.Query != "" { + q = *params.Query + } + t := "" + if params.Type != nil && *params.Type != "" { + t = *params.Type + } + return response(s.database.TicketList(ctx, t, q, params.Sort, params.Desc, *params.Offset, *params.Count)) +} diff --git a/service/ticket_field.go b/service/ticket_field.go new file mode 100644 index 0000000..d01adaf --- /dev/null +++ b/service/ticket_field.go @@ -0,0 +1,74 @@ +package service + +import ( + "context" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/tickets" +) + +func (s *Service) AddArtifact(ctx context.Context, params *tickets.AddArtifactParams) *api.Response { + return response(s.database.AddArtifact(ctx, params.ID, params.Artifact)) +} + +func (s *Service) RemoveArtifact(ctx context.Context, params *tickets.RemoveArtifactParams) *api.Response { + return response(s.database.RemoveArtifact(ctx, params.ID, params.Name)) +} + +func (s *Service) SetSchema(ctx context.Context, params *tickets.SetSchemaParams) *api.Response { + return response(s.database.SetTemplate(ctx, params.ID, params.Schema)) +} + +func (s *Service) AddComment(ctx context.Context, params *tickets.AddCommentParams) *api.Response { + return response(s.database.AddComment(ctx, params.ID, params.Comment)) +} + +func (s *Service) RemoveComment(ctx context.Context, params *tickets.RemoveCommentParams) *api.Response { + return response(s.database.RemoveComment(ctx, params.ID, params.CommentID)) +} + +func (s *Service) LinkTicket(ctx context.Context, params *tickets.LinkTicketParams) *api.Response { + err := s.database.RelatedCreate(ctx, params.ID, params.LinkedID) + if err != nil { + return response(nil, err) + } + + return s.GetTicket(ctx, &tickets.GetTicketParams{ID: params.ID}) +} + +func (s *Service) UnlinkTicket(ctx context.Context, params *tickets.UnlinkTicketParams) *api.Response { + err := s.database.RelatedRemove(ctx, params.ID, params.LinkedID) + if err != nil { + return response(nil, err) + } + + return s.GetTicket(ctx, &tickets.GetTicketParams{ID: params.ID}) +} + +func (s Service) SetReferences(ctx context.Context, params *tickets.SetReferencesParams) *api.Response { + return response(s.database.SetReferences(ctx, params.ID, params.References)) +} + +func (s Service) LinkFiles(ctx context.Context, params *tickets.LinkFilesParams) *api.Response { + return response(s.database.LinkFiles(ctx, params.ID, params.Files)) +} + +func (s Service) AddTicketPlaybook(ctx context.Context, params *tickets.AddTicketPlaybookParams) *api.Response { + return response(s.database.AddTicketPlaybook(ctx, params.ID, params.Playbook)) +} + +func (s Service) RemoveTicketPlaybook(ctx context.Context, params *tickets.RemoveTicketPlaybookParams) *api.Response { + return response(s.database.RemoveTicketPlaybook(ctx, params.ID, params.PlaybookID)) +} + +func (s Service) CompleteTask(ctx context.Context, params *tickets.CompleteTaskParams) *api.Response { + return response(s.database.TaskComplete(ctx, params.ID, params.PlaybookID, params.TaskID, params.Data)) +} + +func (s Service) SetTask(ctx context.Context, params *tickets.SetTaskParams) *api.Response { + return response(s.database.TaskUpdate(ctx, params.ID, params.PlaybookID, params.TaskID, params.Task)) +} + +func (s *Service) RunTask(ctx context.Context, params *tickets.RunTaskParams) *api.Response { + return response(nil, s.database.TaskRun(ctx, params.ID, params.PlaybookID, params.TaskID)) +} diff --git a/service/tickettype.go b/service/tickettype.go new file mode 100644 index 0000000..e42346a --- /dev/null +++ b/service/tickettype.go @@ -0,0 +1,28 @@ +package service + +import ( + "context" + + "github.com/SecurityBrewery/catalyst/generated/restapi/api" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/tickettypes" +) + +func (s *Service) CreateTicketType(ctx context.Context, params *tickettypes.CreateTicketTypeParams) *api.Response { + return response(s.database.TicketTypeCreate(ctx, params.Tickettype)) +} + +func (s *Service) GetTicketType(ctx context.Context, params *tickettypes.GetTicketTypeParams) *api.Response { + return response(s.database.TicketTypeGet(ctx, params.ID)) +} + +func (s *Service) UpdateTicketType(ctx context.Context, params *tickettypes.UpdateTicketTypeParams) *api.Response { + return response(s.database.TicketTypeUpdate(ctx, params.ID, params.Tickettype)) +} + +func (s *Service) DeleteTicketType(ctx context.Context, params *tickettypes.DeleteTicketTypeParams) *api.Response { + return response(nil, s.database.TicketTypeDelete(ctx, params.ID)) +} + +func (s *Service) ListTicketTypes(ctx context.Context) *api.Response { + return response(s.database.TicketTypeList(ctx)) +} diff --git a/service/uisettings.go b/service/uisettings.go new file mode 100644 index 0000000..56c48d8 --- /dev/null +++ b/service/uisettings.go @@ -0,0 +1,46 @@ +package service + +import ( + "context" + "errors" + "sort" + + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" + "github.com/SecurityBrewery/catalyst/role" +) + +func (s *Service) GetSettings(ctx context.Context) *api.Response { + user, ok := busdb.UserFromContext(ctx) + if !ok { + return response(nil, errors.New("no user in context")) + } + + setting, err := s.database.UserDataGet(ctx, user.ID) + if err != nil { + return response(nil, err) + } + + settings := mergeSettings(s.settings, setting) + + ticketTypeList, err := s.database.TicketTypeList(ctx) + if err != nil { + return response(nil, err) + } + + settings.TicketTypes = ticketTypeList + + return response(settings, nil) +} + +func mergeSettings(globalSettings *models.Settings, user *models.UserDataResponse) *models.Settings { + if user.Timeformat != nil { + globalSettings.Timeformat = *user.Timeformat + } + roles := role.Strings(role.List()) + sort.Strings(roles) + globalSettings.Roles = roles + + return globalSettings +} diff --git a/service/user.go b/service/user.go new file mode 100644 index 0000000..56c7fea --- /dev/null +++ b/service/user.go @@ -0,0 +1,38 @@ +package service + +import ( + "context" + "errors" + + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/users" +) + +func (s *Service) GetUser(ctx context.Context, params *users.GetUserParams) *api.Response { + return response(s.database.UserGet(ctx, params.ID)) +} + +func (s *Service) ListUsers(ctx context.Context) *api.Response { + return response(s.database.UserList(ctx)) +} + +func (s *Service) CreateUser(ctx context.Context, params *users.CreateUserParams) *api.Response { + return response(s.database.UserCreate(ctx, params.User)) +} + +func (s *Service) DeleteUser(ctx context.Context, params *users.DeleteUserParams) *api.Response { + return response(nil, s.database.UserDelete(ctx, params.ID)) +} + +func (s *Service) CurrentUser(ctx context.Context) *api.Response { + user, ok := busdb.UserFromContext(ctx) + if !ok { + return response(nil, errors.New("no user in context")) + } + return response(user, nil) +} + +func (s *Service) UpdateUser(ctx context.Context, params *users.UpdateUserParams) *api.Response { + return response(s.database.UserUpdate(ctx, params.ID, params.User)) +} diff --git a/service/userdata.go b/service/userdata.go new file mode 100644 index 0000000..7e8e10e --- /dev/null +++ b/service/userdata.go @@ -0,0 +1,39 @@ +package service + +import ( + "context" + "errors" + + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/restapi/api" + "github.com/SecurityBrewery/catalyst/generated/restapi/operations/userdata" +) + +func (s *Service) GetUserData(ctx context.Context, params *userdata.GetUserDataParams) *api.Response { + return response(s.database.UserDataGet(ctx, params.ID)) +} + +func (s *Service) ListUserData(ctx context.Context) *api.Response { + return response(s.database.UserDataList(ctx)) +} + +func (s *Service) UpdateUserData(ctx context.Context, params *userdata.UpdateUserDataParams) *api.Response { + return response(s.database.UserDataUpdate(ctx, params.ID, params.Userdata)) +} + +func (s *Service) CurrentUserData(ctx context.Context) *api.Response { + user, ok := busdb.UserFromContext(ctx) + if !ok { + return response(nil, errors.New("no user in context")) + } + return s.GetUserData(ctx, &userdata.GetUserDataParams{ID: user.ID}) +} + +func (s *Service) UpdateCurrentUserData(ctx context.Context, params *userdata.UpdateCurrentUserDataParams) *api.Response { + user, ok := busdb.UserFromContext(ctx) + if !ok { + return response(nil, errors.New("no user in context")) + } + + return response(s.database.UserDataUpdate(ctx, user.ID, params.Userdata)) +} diff --git a/start_dev.sh b/start_dev.sh new file mode 100644 index 0000000..ae152c3 --- /dev/null +++ b/start_dev.sh @@ -0,0 +1,20 @@ +export SECRET=4ef5b29539b70233dd40c02a1799d25079595565e05a193b09da2c3e60ada1cd + +export OIDC_ISSUER=http://localhost:9002/auth/realms/catalyst +export OIDC_CLIENT_SECRET=d3ec0d91-b6ea-482d-8a4e-2f5a7ca0b4cb + +export ARANGO_DB_HOST=http://localhost:8529 +export ARANGO_DB_PASSWORD=foobar +export S3_HOST=http://localhost:9000 +export S3_PASSWORD=minio123 +export EMITTER_IO_HOST=tcp://localhost:9001 +export EMITTER_IO_KEY=A9RysEsPJni8RaHeg_K0FKXQNfBrUyw- + +export AUTH_BLOCK_NEW=false +export AUTH_DEFAULT_ROLES=analyst,admin + +export EXTERNAL_ADDRESS=http://localhost +export CATALYST_ADDRESS=http://host.docker.internal +export INITIAL_API_KEY=d0169af94c40981eb4452a42fae536b6caa9be3a + +go run cmd/catalyst-dev/*.go diff --git a/static.go b/static.go new file mode 100644 index 0000000..7ecc7ef --- /dev/null +++ b/static.go @@ -0,0 +1,24 @@ +package catalyst + +import ( + "io/fs" + "net/http" + "strings" + + "github.com/gin-gonic/gin" + + "github.com/SecurityBrewery/catalyst/ui" +) + +func static(ctx *gin.Context) { + fsys, _ := fs.Sub(ui.UI, "dist") + + upath := strings.TrimPrefix(ctx.Request.URL.Path, "/") + + if _, err := fs.Stat(fsys, upath); err != nil { + ctx.Request.URL.Path = "/" + ctx.Request.URL.RawPath = "/" + } + + http.FileServer(http.FS(fsys)).ServeHTTP(ctx.Writer, ctx.Request) +} diff --git a/storage/storage.go b/storage/storage.go new file mode 100644 index 0000000..25472d4 --- /dev/null +++ b/storage/storage.go @@ -0,0 +1,71 @@ +package storage + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/s3" + "github.com/aws/aws-sdk-go/service/s3/s3manager" + + "github.com/SecurityBrewery/catalyst/pointer" +) + +type Storage struct { + session *session.Session +} + +type Config struct { + Host string + User string + Password string +} + +func New(config *Config) (*Storage, error) { + s, err := session.NewSession(&aws.Config{ + Credentials: credentials.NewStaticCredentials(config.User, config.Password, ""), + Endpoint: aws.String(config.Host), + Region: aws.String("us-east-1"), + DisableSSL: aws.Bool(true), + S3ForcePathStyle: aws.Bool(true), + }) + return &Storage{s}, err +} + +func (s *Storage) S3() *s3.S3 { + return s3.New(s.session) +} + +func (s *Storage) Downloader() *s3manager.Downloader { + d := s3manager.NewDownloader(s.session) + d.Concurrency = 1 + return d +} + +func (s *Storage) Uploader() *s3manager.Uploader { + d := s3manager.NewUploader(s.session) + d.Concurrency = 1 + return d +} + +func (s *Storage) DeleteBucket(name string) error { + _, err := s.S3().DeleteBucket(&s3.DeleteBucketInput{Bucket: pointer.String("catalyst-" + name)}) + return err +} + +func CreateBucket(client *s3.S3, ticketID string) error { + _, err := client.CreateBucket(&s3.CreateBucketInput{Bucket: pointer.String("catalyst-" + ticketID)}) + if err == nil { + err = client.WaitUntilBucketExists(&s3.HeadBucketInput{Bucket: pointer.String("catalyst-" + ticketID)}) + if err != nil { + return err + } + } else { + awsError, ok := err.(awserr.Error) + if !ok || (awsError.Code() != s3.ErrCodeBucketAlreadyExists && awsError.Code() != s3.ErrCodeBucketAlreadyOwnedByYou) { + return err + } + return nil + } + return err +} diff --git a/test/data.go b/test/data.go new file mode 100644 index 0000000..fcbd4ab --- /dev/null +++ b/test/data.go @@ -0,0 +1,93 @@ +package test + +import ( + "context" + "time" + + "github.com/SecurityBrewery/catalyst/database" + "github.com/SecurityBrewery/catalyst/database/migrations" + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/pointer" +) + +var bobSetting = &models.UserData{Email: pointer.String("bob@example.org"), Name: pointer.String("Bob Bad")} +var bobForm = &models.UserForm{ID: "bob", Blocked: false, Roles: []string{"admin"}} +var Bob = &models.UserResponse{ID: "bob", Blocked: false, Roles: []string{"admin"}} + +func SetupTestData(ctx context.Context, db *database.Database) error { + if err := db.UserDataCreate(ctx, "bob", bobSetting); err != nil { + return err + } + + if _, err := db.UserCreate(ctx, bobForm); err != nil { + return err + } + if _, err := db.UserCreate(ctx, &models.UserForm{ID: "script", Roles: []string{"engineer"}, Apikey: true}); err != nil { + return err + } + + if _, err := db.TicketBatchCreate(ctx, []*models.TicketForm{ + { + ID: pointer.Int64(8125), + Created: parse("2021-10-02T18:04:59.078186+02:00"), + Modified: parse("2021-10-02T18:04:59.078186+02:00"), + Name: "phishing from selenafadel@von.com detected", + Owner: pointer.String("demo"), + References: []*models.Reference{{Href: "https://www.seniorleading-edge.name/users/efficient", Name: "recovery"}, {Href: "http://www.dynamicseamless.com/clicks-and-mortar", Name: "force"}, {Href: "http://www.leadscalable.biz/envisioneer", Name: "fund"}}, + Schema: pointer.String("{}"), + Status: "closed", + Type: "alert", + }, { + ID: pointer.Int64(8126), + Created: parse("2021-10-02T18:04:59.078186+02:00"), + Modified: parse("2021-10-02T18:04:59.078186+02:00"), + Name: "Surfaceintroduce virus detected", + Owner: pointer.String("demo"), + References: []*models.Reference{{Href: "http://www.centralworld-class.io/synthesize", Name: "university"}, {Href: "https://www.futurevirtual.org/supply-chains/markets/sticky/iterate", Name: "goal"}, {Href: "http://www.chiefsyndicate.io/action-items", Name: "unemployment"}}, + Schema: pointer.String("{}"), + Status: "closed", + Type: "alert", + }, { + ID: pointer.Int64(8123), + Created: parse("2021-10-02T18:04:59.078206+02:00"), + Modified: parse("2021-10-02T18:04:59.078206+02:00"), + Artifacts: []*models.Artifact{ + {Name: "94d5cab6f5fe3422a447ab15436e7a672bc0c09a", Status: pointer.String("unknown")}, + {Name: "http://www.customerviral.io/scalable/vertical/killer", Status: pointer.String("clean")}, + {Name: "leadreintermediate.io", Status: pointer.String("malicious")}, + }, + Name: "live zebra", + Owner: pointer.String("demo"), + References: []*models.Reference{{Href: "https://www.leadmaximize.net/e-services/back-end", Name: "performance"}, {Href: "http://www.corporateinteractive.name/rich", Name: "autumn"}, {Href: "https://www.corporateintuitive.org/intuitive/platforms/integrate", Name: "suggest"}}, + Schema: pointer.String("{\n \"definitions\": {},\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://example.com/object1618746510.json\",\n \"title\": \"Event\",\n \"type\": \"object\",\n \"required\": [\n \"severity\",\n \"description\",\n \"tlp\"\n ],\n \"properties\": {\n \"severity\": {\n \"$id\": \"#root/severity\",\n \"title\": \"Severity\",\n \"type\": \"string\",\n \"default\": \"Medium\",\n \"nx-enum\": [\n \"Low\",\n \"Medium\",\n \"High\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"Low\",\n \"title\": \"Low\",\n \"icon\": \"mdi-chevron-up\"\n },\n {\n \"const\": \"Medium\",\n \"title\": \"Medium\",\n \"icon\": \"mdi-chevron-double-up\"\n },\n {\n \"const\": \"High\",\n \"title\": \"High\",\n \"icon\": \"mdi-chevron-triple-up\"\n }\n ]\n },\n \"tlp\": {\n \"$id\": \"#root/tlp\",\n \"title\": \"TLP\",\n \"type\": \"string\",\n \"nx-enum\": [\n \"White\",\n \"Green\",\n \"Amber\",\n \"Red\"\n ],\n \"x-cols\": 6,\n \"x-class\": \"pr-2\",\n \"x-display\": \"icon\",\n \"x-itemIcon\": \"icon\",\n \"oneOf\": [\n {\n \"const\": \"White\",\n \"title\": \"White\",\n \"icon\": \"mdi-alpha-w\"\n },\n {\n \"const\": \"Green\",\n \"title\": \"Green\",\n \"icon\": \"mdi-alpha-g\"\n },\n {\n \"const\": \"Amber\",\n \"title\": \"Amber\",\n \"icon\": \"mdi-alpha-a\"\n },\n {\n \"const\": \"Red\",\n \"title\": \"Red\",\n \"icon\": \"mdi-alpha-r\"\n }\n ]\n },\n \"description\": {\n \"$id\": \"#root/description\",\n \"title\": \"Description\",\n \"type\": \"string\",\n \"x-display\": \"textarea\",\n \"x-class\": \"pr-2\"\n }\n }\n}\n"), + Status: "closed", + Type: "incident", + Playbooks: []*models.PlaybookTemplateForm{ + {Yaml: migrations.PhishingPlaybook}, + }, + }, + }); err != nil { + return err + } + + if err := db.RelatedCreate(ctx, 8125, 8126); err != nil { + return err + } + if _, err := db.PlaybookCreate(ctx, &models.PlaybookTemplateForm{Yaml: "name: Simple\ntasks:\n input:\n name: Enter something to hash\n type: input\n schema:\n title: Something\n type: object\n properties:\n something:\n type: string\n title: Something\n default: \"\"\n next:\n hash: \"something != ''\"\n\n hash:\n name: Hash the something\n type: automation\n automation: hash.sha1\n payload:\n default: \"playbook.tasks['input'].data['something']\"\n next:\n comment: \"hash != ''\"\n\n comment:\n name: Comment the hash\n type: automation\n automation: comment\n payload:\n default: \"playbook.tasks['hash'].data['hash']\"\n next:\n done: \"done\"\n\n done:\n name: You can close this case now\n type: task\n"}); err != nil { + return err + } + + if _, err := db.LogCreate(ctx, "tickets/294511", "Fail run account resist lend solve incident centre priority temperature. Cause change distribution examine location technique shape partner milk customer. Rail tea plate soil report cook railway interpretation breath action. Exercise dream accept park conclusion addition shoot assistance may answer. Gold writer link stop combine hear power name commitment operation. Determine lifespan support grow degree henry exclude detail set religion. Direct library policy convention chain retain discover ride walk student. Gather proposal select march aspect play noise avoid encourage employ. Assessment preserve transport combine wish influence income guess run stand. Charge limit crime ignore statement foundation study issue stop claim."); err != nil { + return err + } + + return nil +} + +func parse(s string) *time.Time { + modified, err := time.Parse(time.RFC3339, s) + if err != nil { + panic(err) + } + return &modified +} diff --git a/test/server_test.go b/test/server_test.go new file mode 100644 index 0000000..d12b1dc --- /dev/null +++ b/test/server_test.go @@ -0,0 +1,104 @@ +package test + +import ( + "bytes" + "encoding/json" + "io" + "net/http" + "net/http/httptest" + "reflect" + "testing" + + "github.com/gin-gonic/gin" + + "github.com/SecurityBrewery/catalyst/database/busdb" +) + +func TestService(t *testing.T) { + gin.SetMode(gin.TestMode) + + type args struct { + method string + url string + data interface{} + } + type want struct { + status int + body interface{} + } + tests := []struct { + name string + args args + want want + }{ + {name: "GetUser not existing", args: args{method: http.MethodGet, url: "/api/users/123"}, want: want{status: http.StatusNotFound, body: gin.H{"error": "document not found"}}}, + {name: "ListUsers", args: args{method: http.MethodGet, url: "/api/users"}, want: want{status: http.StatusOK}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, _, _, _, _, _, _, server, cleanup, err := Server(t) + if err != nil { + t.Fatal(err) + } + defer cleanup() + + setUser := func(context *gin.Context) { + busdb.SetContext(context, Bob) + } + server.Use(setUser) + + server.ConfigureRoutes() + w := httptest.NewRecorder() + + // setup request + var req *http.Request + if tt.args.data != nil { + b, err := json.Marshal(tt.args.data) + if err != nil { + t.Fatal(err) + } + + req = httptest.NewRequest(tt.args.method, tt.args.url, bytes.NewBuffer(b)) + req.Header.Set("Content-Type", "application/json") + } else { + req = httptest.NewRequest(tt.args.method, tt.args.url, nil) + } + + // run request + server.ServeHTTP(w, req) + + result := w.Result() + + // assert results + if result.StatusCode != tt.want.status { + t.Fatalf("Status got = %v, want %v", result.Status, tt.want.status) + } + if tt.want.status != http.StatusNoContent { + jsonEqual(t, result.Body, tt.want.body) + } + }) + } +} + +func jsonEqual(t *testing.T, got io.Reader, want interface{}) { + var j, j2 interface{} + c, err := io.ReadAll(got) + if err != nil { + t.Fatal(err) + } + if err := json.Unmarshal(c, &j); err != nil { + t.Fatal(string(c), err) + } + + b, err := json.Marshal(want) + if err != nil { + t.Fatal(err) + } + if err = json.Unmarshal(b, &j2); err != nil { + t.Fatal(err) + } + + if !reflect.DeepEqual(j2, j) { + t.Errorf("Body got = %T:%v, want %T:%v", j, j, j2, j2) + } +} diff --git a/test/test.go b/test/test.go new file mode 100644 index 0000000..e6f1929 --- /dev/null +++ b/test/test.go @@ -0,0 +1,213 @@ +package test + +import ( + "context" + "log" + "net/http/httptest" + "os" + "path" + "strings" + "testing" + + "github.com/arangodb/go-driver" + "github.com/coreos/go-oidc/v3/oidc" + "github.com/gin-gonic/gin" + "golang.org/x/oauth2" + + "github.com/SecurityBrewery/catalyst" + "github.com/SecurityBrewery/catalyst/bus" + "github.com/SecurityBrewery/catalyst/database" + "github.com/SecurityBrewery/catalyst/database/busdb" + "github.com/SecurityBrewery/catalyst/generated/models" + "github.com/SecurityBrewery/catalyst/generated/restapi" + "github.com/SecurityBrewery/catalyst/hooks" + "github.com/SecurityBrewery/catalyst/index" + "github.com/SecurityBrewery/catalyst/pointer" + "github.com/SecurityBrewery/catalyst/service" + "github.com/SecurityBrewery/catalyst/storage" +) + +func Context() context.Context { + w := httptest.NewRecorder() + gctx, _ := gin.CreateTestContext(w) + busdb.SetContext(gctx, Bob) + return gctx +} + +func Config(ctx context.Context) (*catalyst.Config, error) { + config := &catalyst.Config{ + IndexPath: "index.bleve", + DB: &database.Config{ + Host: "http://localhost:8529", + User: "root", + Password: "foobar", + }, + Storage: &storage.Config{ + Host: "http://localhost:9000", + User: "minio", + Password: "minio123", + }, + Bus: &bus.Config{ + Host: "tcp://localhost:9001", + Key: "A9RysEsPJni8RaHeg_K0FKXQNfBrUyw-", + APIUrl: "http://localhost:8002/api", + }, + UISettings: &models.Settings{ + ArtifactStates: []*models.Type{ + {Icon: "mdi-help-circle-outline", ID: "unknown", Name: "Unknown", Color: pointer.String(models.TypeColorInfo)}, + {Icon: "mdi-skull", ID: "malicious", Name: "Malicious", Color: pointer.String(models.TypeColorError)}, + {Icon: "mdi-check", ID: "clean", Name: "Clean", Color: pointer.String(models.TypeColorSuccess)}, + }, + TicketTypes: []*models.TicketTypeResponse{ + {ID: "alert", Icon: "mdi-alert", Name: "Alerts"}, + {ID: "incident", Icon: "mdi-radioactive", Name: "Incidents"}, + {ID: "investigation", Icon: "mdi-fingerprint", Name: "Forensic Investigations"}, + {ID: "hunt", Icon: "mdi-target", Name: "Threat Hunting"}, + }, + Version: "0.0.0-test", + Tier: models.SettingsTierCommunity, + Timeformat: "YYYY-MM-DDThh:mm:ss", + }, + Secret: []byte("4ef5b29539b70233dd40c02a1799d25079595565e05a193b09da2c3e60ada1cd"), + Auth: &catalyst.AuthConfig{ + OIDCIssuer: "http://localhost:9002/auth/realms/catalyst", + OAuth2: &oauth2.Config{ + ClientID: "catalyst", + ClientSecret: "13d4a081-7395-4f71-a911-bc098d8d3c45", + RedirectURL: "http://localhost:8002/callback", + Scopes: []string{oidc.ScopeOpenID, "profile", "email"}, + }, + // OIDCClaimUsername: "", + // OIDCClaimEmail: "", + // OIDCClaimName: "", + // AuthBlockNew: false, + // AuthDefaultRoles: nil, + }, + } + err := config.Auth.Load(ctx) + if err != nil { + return nil, err + } + + return config, err +} + +func Index(t *testing.T) (*index.Index, func(), error) { + dir, err := os.MkdirTemp("", "catalyst-test-"+cleanName(t)) + if err != nil { + return nil, nil, err + } + + catalystIndex, err := index.New(path.Join(dir, "index.bleve")) + if err != nil { + return nil, nil, err + } + return catalystIndex, func() { os.RemoveAll(dir) }, nil +} + +func Bus(t *testing.T) (context.Context, *catalyst.Config, *bus.Bus, error) { + ctx := Context() + + config, err := Config(ctx) + if err != nil { + t.Fatal(err) + } + + catalystBus, err := bus.New(config.Bus) + if err != nil { + t.Fatal(err) + } + return ctx, config, catalystBus, err +} + +func DB(t *testing.T) (context.Context, *catalyst.Config, *bus.Bus, *index.Index, *storage.Storage, *database.Database, func(), error) { + ctx, config, rbus, err := Bus(t) + if err != nil { + return nil, nil, nil, nil, nil, nil, nil, err + } + + catalystStorage, err := storage.New(config.Storage) + if err != nil { + return nil, nil, nil, nil, nil, nil, nil, err + } + + catalystIndex, cleanup, err := Index(t) + if err != nil { + return nil, nil, nil, nil, nil, nil, nil, err + } + + c := config.DB + c.Name = cleanName(t) + db, err := database.New(ctx, catalystIndex, rbus, &hooks.Hooks{ + DatabaseAfterConnectFuncs: []func(ctx context.Context, client driver.Client, name string){Clear}, + }, c) + if err != nil { + return nil, nil, nil, nil, nil, nil, nil, err + } + + _, err = db.JobCreate(ctx, "99cd67131b48", &models.JobForm{ + Automation: "hash.sha1", + Payload: "test", + Origin: nil, + }) + if err != nil { + return nil, nil, nil, nil, nil, nil, nil, err + } + + return ctx, config, rbus, catalystIndex, catalystStorage, db, func() { + err := db.Remove(context.Background()) + if err != nil { + log.Println(err) + } + cleanup() + }, err +} + +func Service(t *testing.T) (context.Context, *catalyst.Config, *bus.Bus, *index.Index, *storage.Storage, *database.Database, *service.Service, func(), error) { + ctx, config, rbus, catalystIndex, catalystStorage, db, cleanup, err := DB(t) + if err != nil { + t.Fatal(err) + } + + catalystService, err := service.New(rbus, db, catalystStorage, config.UISettings) + if err != nil { + t.Fatal(err) + } + + return ctx, config, rbus, catalystIndex, catalystStorage, db, catalystService, cleanup, err +} + +func Server(t *testing.T) (context.Context, *catalyst.Config, *bus.Bus, *index.Index, *storage.Storage, *database.Database, *service.Service, *restapi.Server, func(), error) { + ctx, config, rbus, catalystIndex, catalystStorage, db, catalystService, cleanup, err := Service(t) + if err != nil { + t.Fatal(err) + } + + catalystServer := restapi.New(catalystService, &restapi.Config{Address: "0.0.0.0:8000", InsecureHTTP: true}) + + return ctx, config, rbus, catalystIndex, catalystStorage, db, catalystService, catalystServer, cleanup, err +} + +func cleanName(t *testing.T) string { + name := t.Name() + name = strings.ReplaceAll(name, " ", "") + name = strings.ReplaceAll(name, "/", "_") + return strings.ReplaceAll(name, "#", "_") +} + +func Clear(ctx context.Context, client driver.Client, name string) { + if exists, _ := client.DatabaseExists(ctx, name); exists { + if db, err := client.Database(ctx, name); err == nil { + if exists, _ = db.GraphExists(ctx, database.TicketArtifactsGraphName); exists { + if g, err := db.Graph(ctx, database.TicketArtifactsGraphName); err == nil { + if err := g.Remove(ctx); err != nil { + log.Println(err) + } + } + } + if err := db.Remove(ctx); err != nil { + log.Println(err) + } + } + } +} diff --git a/ui/.browserslistrc b/ui/.browserslistrc new file mode 100644 index 0000000..214388f --- /dev/null +++ b/ui/.browserslistrc @@ -0,0 +1,3 @@ +> 1% +last 2 versions +not dead diff --git a/ui/.eslintrc.js b/ui/.eslintrc.js new file mode 100644 index 0000000..ba02536 --- /dev/null +++ b/ui/.eslintrc.js @@ -0,0 +1,30 @@ +module.exports = { + root: true, + env: { + node: true, + }, + extends: [ + "plugin:vue/essential", + "eslint:recommended", + "@vue/typescript/recommended", + ], + parserOptions: { + ecmaVersion: 2020, + }, + rules: { + "no-console": process.env.NODE_ENV === "production" ? "warn" : "off", + "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off", + 'vue/valid-v-slot': ['error', { + allowModifiers: true, + }], + }, + overrides: [ + { + files: ["**/__tests__/*.{j,t}s?(x)", "**/tests/unit/**/*.spec.{j,t}s?(x)"], + env: { + jest: true, + }, + }, + ], + ignorePatterns: ["src/suggestions/grammar/*.js", "src/views/playbook/vue-blocks/"], +}; diff --git a/ui/README.md b/ui/README.md new file mode 100644 index 0000000..609de9f --- /dev/null +++ b/ui/README.md @@ -0,0 +1,27 @@ +## Project setup + +``` +yarn install +``` + +### Compiles and hot-reloads for development + +``` +yarn serve +``` + +### Compiles and minifies for production + +``` +yarn build +``` + +### Lints and fixes files + +``` +yarn lint +``` + +### Customize configuration + +See [Configuration Reference](https://cli.vuejs.org/config/). diff --git a/ui/babel.config.js b/ui/babel.config.js new file mode 100644 index 0000000..e955840 --- /dev/null +++ b/ui/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + '@vue/cli-plugin-babel/preset' + ] +} diff --git a/ui/jest.config.js b/ui/jest.config.js new file mode 100644 index 0000000..f9d5bfe --- /dev/null +++ b/ui/jest.config.js @@ -0,0 +1,3 @@ +module.exports = { + preset: "@vue/cli-plugin-unit-jest/presets/typescript-and-babel", +}; diff --git a/ui/package.json b/ui/package.json new file mode 100644 index 0000000..068ce51 --- /dev/null +++ b/ui/package.json @@ -0,0 +1,82 @@ +{ + "name": "catalyst", + "version": "0.2.0", + "private": true, + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build", + "test": "vue-cli-service test:unit", + "lint": "vue-cli-service lint" + }, + "dependencies": { + "@koumoul/vjsf": "2.0.3", + "@mdi/font": "5.9.55", + "@mdi/util": "^0.3.2", + "@types/luxon": "^1.27.0", + "@types/prismjs": "^1.16.5", + "@uppy/core": "^1.18.0", + "@uppy/tus": "^1.8.7", + "@uppy/vue": "^0.2.1", + "ajv": "^8.6.3", + "ant-design-vue": "^1.7.8", + "antlr4": "^4.9.2", + "axios": "^0.21.1", + "chart.js": "2", + "core-js": "^3.15.2", + "graphlib": "^2.1.8", + "json-schema-editor-vue": "^1.2.5", + "just-kebab-case": "^1.1.0", + "less": "3.0.4", + "less-loader": "5.0.0", + "lodash": "^4.17.21", + "luxon": "^1.27.0", + "register-service-worker": "^1.7.2", + "swagger-ui": "^3.50.0", + "vue": "2.6.14", + "vue-axios": "^3.2.4", + "vue-chartjs": "^3.5.1", + "vue-class-component": "^7.2.6", + "vue-cropperjs": "^4.2.0", + "vue-d3-network": "^0.1.28", + "vue-lodash": "^2.1.2", + "vue-luxon": "^0.10.0", + "vue-markdown": "^2.2.4", + "vue-native-websocket": "^2.0.14", + "vue-pipeline": "^1.0.12", + "vue-prism-editor": "^1.2.2", + "vue-property-decorator": "^9.1.2", + "vue-router": "^3.2.0", + "vuetify": "2.4.6", + "vuex": "^3.6.2", + "yaml": "^1.10.2" + }, + "devDependencies": { + "@testing-library/vue": "^5.6.2", + "@types/jest": "^26.0.23", + "@types/lodash": "^4.14.168", + "@types/vue-markdown": "^2.2.1", + "@typescript-eslint/eslint-plugin": "^4.22.1", + "@typescript-eslint/parser": "^4.22.1", + "@vue/cli-plugin-babel": "^4.5.12", + "@vue/cli-plugin-eslint": "^4.5.12", + "@vue/cli-plugin-pwa": "^4.5.12", + "@vue/cli-plugin-router": "^4.5.12", + "@vue/cli-plugin-typescript": "^4.5.12", + "@vue/cli-plugin-unit-jest": "^4.5.12", + "@vue/cli-plugin-vuex": "^4.5.12", + "@vue/cli-service": "^4.5.12", + "@vue/compiler-sfc": "^3.1.2", + "@vue/eslint-config-typescript": "^7.0.0", + "@vue/test-utils": "^1.2.0", + "babel-eslint": "^10.1.0", + "eslint": "^7.25.0", + "eslint-plugin-jest": "^24.3.6", + "eslint-plugin-vue": "^7.9.0", + "sass": "1.32.12", + "sass-loader": "^10", + "typescript": "^4.2.4", + "vue-cli-plugin-vuetify": "~2.3.1", + "vue-template-compiler": "^2.6.14", + "vuetify-loader": "1.7.2" + } +} diff --git a/ui/public/favicon.ico b/ui/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8a916b29c5e09e6fc058b1c308f6968fb5c62c53 GIT binary patch literal 33310 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 QF8_6IW<8hyGBOAJe@gIv@Bjb+ literal 0 HcmV?d00001 diff --git a/ui/public/flask.svg b/ui/public/flask.svg new file mode 100644 index 0000000..f758b78 --- /dev/null +++ b/ui/public/flask.svg @@ -0,0 +1,125 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui/public/flask_white.svg b/ui/public/flask_white.svg new file mode 100644 index 0000000..1476170 --- /dev/null +++ b/ui/public/flask_white.svg @@ -0,0 +1,130 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui/public/img/icons/android-chrome-192x192.png b/ui/public/img/icons/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..fa3c74d6ea100d2670fdc21aae1623fbb437ad1f GIT binary patch literal 9609 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 literal 0 HcmV?d00001 diff --git a/ui/public/img/icons/android-chrome-512x512.png b/ui/public/img/icons/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..5cef2efb673bf906785d20cbdbce36d47ea91e18 GIT binary patch literal 33814 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 u%n;gf_2}x%mdpb*Zr#s#C?yL9D zx&Qm`>-+wGRb5r7?yl;(-#Pzz)z#It_1#y;5!5t-AaDSHpJu$8`wswsZvnu)0Ps2h zYy*G*0P+CP1psdWz{3D=2>^V6o+}6fe2#JSoOr)LP;;;dzsdJ~y8RCTFckoL0YC*o zQ1swqAi_fc@JYs0&HOb4f|@}tmm4JYl~Q>7mjDnl!Z)<7rG97~ybtg(7Bl?b_x(xc zxyLh>I+oAc!P?ij;mQ04!vL?-L_1Vh;?lYr1DlL65=TMrQuGU6vf z&lBMrqTd1l3jkn_af(|3U_E07)CMH|@%ZNUW&rp*@-u`91fvQTnQ1a6$vr8=&k6r& z05}5x_RQz={O|F)I{vHK?*!sR9m5kKMr9wrUL zkp8wg2!ceI697&DfUPzY1d%U+w|^+6kf4@g{w)Bo)FOH^VR``IXydpdp~rE3?#vQF zo47yTJ_G<(7kJK20N96{Ujo61qOY%yOaF72^e5+)B049T$GBFmAbu`>Uw?l;F%(`8 z1%Q4|{K0@0_$e`s3AqXd2u2P@a+B%uq-Czq^+wVVX!8#hx@6g3&II4%rWFimgV+1| z`kHtSLLeA1Fyh}I0JgJGC)xkq0I)BaDP-;p1#T8$Hre-mWQ2Co0+x39D31sU1S1A! z{(R0z=zt}#kT|CqVs560PZ`hc@XW8tC@V^+F;nZ?+!+=KMuP#qZ$*EIIKROhTOIW& z6(&N&U*j|8HS!jd-Aqg-3?LX$FzNhjivf^GkvRWpXUr2T!FCAC18@eIBMczeSwhyu zY$$c{O6CgL;rMe}l!YH(F|cGP+?Hl37C6g8`tAnI}}Pun7SEh8~NIQ;MC=H4ieLi3t6bN+K*X>ln!c2r9Mt z@!V{8Yq16u`k7aAUTH#_RLi3o39CGL%?^{$SFl>4Av3n#T}R(j4nd93S7uc;3i@?~C^Z zm_o<2RdTmpJcW9Psg`$G6FfPJNWUM>3}rHQI>u7gVAFNcw-FNa^xzMq2L%03QT^ z8CLi)%>mU>9`hQWA=)%1z%vtj19G_>nPIUeFbwcv^B%YcvYGF#TrM}k*#6oF5eSOH z5E+FdZ)F6?S9s5P9_aGqDL6QBn?0eFx`stlZN>aPHtN`Ey^IG&Cg%Siq!_@SQGrqtg#sDOh-v)q*R)};Qlj@zU9-pM~ zgTz=&TM%LXJ%%Y+_|kT^>3NX2QB$NvqG)aqwLl(6jfw`cuZ(y560PqryP?6c7f}MsTP_ohgJtYc6 zk)8iD(Vuskhz!=-7m5NMO|g4?euU*j>xxpw2pjX#3sBYqA^zZloS3wCWMJILBC{7p54W{6^uAI zkunnno#IyuB&Fy)M+I>998b&f<(pxS1%L-k44*$2706-K>3vqtLBgAYk!y#fD2*9& zh~dg>vCr1T-f?XC&ykQ>FIADbXd~ZN?)@l#lp2X&G66Bp6YkRL5L_F@+M7n(-8x>SnYF zG04C0*2Mz(1-=T&-XVaAuy>J0!PgZCY8saGf22V7mNL%pcLCrB0PsBTF|gVke?nS7 zOdvtcgGFz!SgnVdJiN&!u^GnP{%@uUxE6SkXP5eD4m_1JcEqa z!>lnV!~}6QDIa-~(qw~8^b@2WNHFTKDm3>1fO}XABW{2E32lzCv;ZGt9y5V4acKHO zzQE9|xDH5&Ur>wD z9le;sN^-69eSZ=+mvEDeVFE01-eL6@#PdfP;jdzw!<(DT@T)-`UEGv0;nIVQ zlZ?|J_O(W$YyW}z6a<1%2NGgWPY*T1EMz^y0Sj$jMRh(%yeZ4~^fU-8Yqt9d3Xl(GhxuFy&egkh@02$r*x9>Bw9TE0W||}(iaHILRufKAuy`E+}VTA z<06roMHrs|fKveA{cI>MJ+2zBHK_AU7(yB{}gnRPv$6)RRG{0CtI!62kae7Zfs z%u(EMePS;wnr&gQs4Oy%!9#%;xspd<_$b z7HC|UnLT9sT*~+6@)Bfgre|Fo_P!Hk)b=QL-z?$~G$7c53zUYhTSKLYa5muh@*oIK z4}###dO2oPJ6NBEe!he6A`>(ynC*Y4y>XFkV?QJ%Iabq$y^XetJ$McE+!3`c0|1VoK|zrl%c-?TkQn-jcb7FPMc%=~~kaK<_o5&*NjM zG$N5G69|fen#pOflp&nvI$(f@?OK0+1cHiSO=~X107n|)b4?+dK2(^-MwKMYli_3l zfnX#V;2^th$SRfKr>PPq5C#y`Dg$6d2&YJ#69fSczx@Us0HEvn05I7^mv{!cL4OPYr<;9Z zU$M^F=KfQC-%rdC5(W^|JPI|$RG0``Vz#_XB1}-16XXh&LIh=$Lfk8*5Q4fuN=xJ| zb}<~A%`?=A=ks@Tbi`ZXE1U|^Wvy@;RAnmtzk;0xcV2zpcg_4wdmM?GMOAp0nE73` z%AxlQf`A5N>B)5Fd0S=wm!N83k(%-5`h7!mv_F6%K=w?|#Ic%U5)CosNNH=DbvG}? zX3TgTjdn3iD-6deXvy$0KN6F%x=f=|8nbf@bOqc#~kvzEa^|az#Def89UGf zf|8IjBJnOFdW+EhjD$5(^ES~WGi{W_mlA_=~MdU_HyKsc4UN?PDti#h3i z_L^mR`gPG787FoH^?>enr)%2y*5OnMbdh5^8Q0NAyXLO2_=CY5Qc ze@zLC((4{>`87fjf}(acPHtGiOCHDxW}(oaoWq>d|KfyODM*``Qf=~A?k|uW(|ZH( zal|+h78Mke{y(xJD}xH#h$%`vj2N@k>f24pR~%|FDUVovhBF?TO#%VW(vtMwn{SP0 zW)JM-p+dM@$tJIcDZ(6ayI;Y#e1d0?=w(HcpkTSPxqTz8NaZ$vnN2Unro!!A4IhBO zoZ!R?RTdWIB@$SS82k_VFh7uAczA$ERO%LL~7Jc}CD48t_H3{^FWxBCHr#+)~mJG!ujlYP_@`O^YgpxyWVjFd=>QKZz(-&Y{%bzQwA zy~-_-U{3!UyMGv>&wlAx`s{+ijxRZRpDs}Hu-Qz1i%SH?LUJg@@&8VN5{WGU@J{~u zg$e2$+_7UL1s4>M{y!M25|BQRnJd)H2K)xrcW}Kin`DZ_SU^f?z!^;X@sfw-Xaf&d zp;`@U!O7P55K=$@0Ny9bv9T%n&;fqEK*__otVyI=y{Zc<)mJR|&n3qAKq<+8G(TH;ZI2y32y!{GSdE>{2*-SGM zxG`bO(f2j0HZp%S;eSwh?!(G+mC9xYozQdftW%zQ(SX^M89(qGuA}}s>dCQY^Zm>y zHu>6=iwgtPaV6v*V(FhKc0wba*4zz*Ft%(Sux9X*4@|QynRp0 zxRtZqri}|Hx1gERzkSUC0RHv@B@#atEl{7yp5u9#FBnMnbcW9z`bX6|E*EAes4ya0 zG+}&g+C)+ti8jD%h(AYWPB1|1sf2GcN~94Y!bfd@<`LeW8O|HuWQZUA4M%yglU{UA(zzU6L-mnF@a)!!A9k|$7-T~UQ6ueh=>Pr z4#lAVZf>)qTHPeU>qyovEQFhJ)C-y2Hr(%?uwrJ*bt`7JELuLZrEB@j78Rda6VSbS9BS4ijY+hQJ4W2O{<;`5{~K+bXKxz8)lJuVS~ZEbNvBy7zTnlW_t zSv@rnwv7^UiEQ-o%5$$)p8K52x;b*-F)yLoGWm{&Tz~2G79{w5`;3-w`Aj@+sBh1j zm|r&4$!~c2ER|O(1iwE{kg*Z#$8b$s%QKQ10xYIYNw0S#wz+HPH>Yj?aPb)^{Z*Kq z6f?nyGk|4s8Lbd$gUB~{N_p-%%5x7Fy9SV%rXQ&(^c%y&tdy?C+yw$bi@Qk3$Q%Fd|o0UJp;8T z{eP7z{kLS5YDMCYqCTTX{OQ^NBTU*EA25qBZ?H7<+y%;WA5>X)j>={pRG#aFp8J~e z+zkUE+C-REC+5Oz6tRjNd3}Fqw1C?3u&b6%M{_4KiHHgGZS)21a@5-SC#uK{^3$eB zoJv|i7+{o%-&z{|9_;CjXZq{oD|CLtzkEii`L!VZQ?vm^pR$@@b?9|4v&0UxeFEia zDUSpnMYA|_B}+5(ZJ6(>6|<7WzdUg!sAYFMs{8E+Q41*W`(sDgTwnElUr(XtCDww` zFL{WzxyMPbDC`+*m}7{4V(m!(!ACPfNDL8$U-OzFB8iUq2qN^D*rUg5lPY?Sq&A2T z5kF~x%?}mP0y859SpC>Xl>Q#mOC-J}$+6lhdH6W5YDDR;Grj;SeBp?g0SXnbHNxRq zz@Ntn-c6j?6q@R&ZA)%b;eZz4{nKmswo5UEYM`z?S@K|#UTglRMjYSKKeiUw_+Yvg zh)zbePjl3&2M$zz-!>KGwLd^wfHK8DlP&bMk@WgpvgE-JAqZ8F>r&yfhs4hBXcJ&f zX@Rzk>VLAZ9}sDQNowg-M{R!P3Zn)3l%)l_%|5bN3y3c;%G=x{>E9Pg{}sPf>Z!Qo zp`oR}%>cv%>+g5fvSM0bMzdOR&mOA3dxZ+3sE{@-S&780(lj%=Vb60@OCENtRpHa` zQp#(NL!YBfe6?`sdmskro$IP)MYTZW3v66;9z}$Ba*Ui~oU$kV!@~`f_Eyqs0$&6d z)%qLT|E=#C=`Xf_Q7w?osI_y7X#rw}X0@Z^g@_3TC&%W<7W&bV{y$7jdToE*5PnN7 zhdoFAkQUhf_y7Y$#c?TG;4Vk4Ydx75fG5YOMB+GZ3dz#F;Uj*M{(B|1xohXwNdMQ) zk;qR8#2;w@SO2``-T_mn-C}|vl4GO=+GL8v$VPsCn=1XcJ)=}>Q!M#K`WKP@1++lB zWdNEiWg+qAWS~3(*2q0J9}Y`k!J?dC(;fevb+l zePE#Ep@9qDs*xSu_(0(rp+s0TdrHgz)}oOf062iOKzDbygheZn{#0Rz{iiEeuEg7~ zq)vHw`zDe8)$#?hY5f8P{DEnX>RCUZGXbBydiz*dG+0Zv{{_jChp5~+u*#jq@vV+S z-1#Wi0)_BD?c z(gK0W*~D5vP=*Fz%`T5J$)dxa0e;!Y0E;INFn|z#Rkc9A)m5uz7l{fPGib}=Yp83C zLZUn(bUB%_IA&c?0<4NptohlN*z6Md016{O;Y-I1#Quc=s;&h(igk_6ny7OE8yB4) z=LA?=YQSrRa6_kPfD+Nu)5FUiXuvJ4H8RAX$Htdr_){35y1qc$5N41Ghpx|lftx_e z3W;ttLQD%a(Euf&qoaeT(!bBwc@8juiT^)ypfJENI>Y@>4UAJv^#L#+F#ja#7E2V$ zu~O+zkRKonPy%TFq%nnVX8UVZLIe1{Dtz`}VSuVLKqh8@px6wdS%v{xPcFm&G)QYQ z`2oTJ46vLz!5uGM5>Jh=7=R){mk9$@7zGM~ z;6b**kTHPC11z~v!l1+G0|c$bOrXdK?p*r6yfQS60WK8=sN4j)+tvW44k%)P_0xm_ zhLHhsPervr=}vIO7&|uqWhfJ9iueGPJHfxptLM>q4bk$4Nn4mCc{fbJg4TBnM|jOhAQjd#haU1}cQJ zo8>7HwvKm*l|u&&3p4JJN+EW~FOjY7WR5Va33~n9NDH*d7{r~8{Dd?$?uo(X510O1 z-?)L-0C5cvvWn10ctxn7M3^`9r1w z*4>w60NxF@=7~?LAPA}S!Iu8KN&eep|I6UqGGI2p5CfdVTOpGr5iBCKVRj-XApHTA zOaJYb^BbE!GnzFM?AY>Z9Qk3=-`*jB3%2(m^9M~^L5ZMtNVfF)d20sEKvgKu3%qr4 zG!vAWLZS&uxA~Q6iCoEI|8Wk$WPS(Y{(4+`n)Ijm{|#0|Pw2l~24Gs?#1t)%G=+4I z0JFo#8-HL|VS*B*zOppHnzYdPFF2=w|t#Y;$OeubY1ioefNHv>BFTz z+5S}3E7E@_v;akf_5^^9gG?dYA3!GP>rmkfN5ZHvgs4bh(BNrFtj#Fn&GPf z6G!H=L9bxymJ(yBOn@i9;+n`5LPm%uNK9&oquSV6U{2d4)jw~N+Whb&wQ}}EwQR;j zE$Q_^=|9cUQh()r`>C$w)3nV$$m~hC`|+G0rcafDegI90L$zv5qdU!)o-3>g{OC6R z1Gg_x`8TJiaN+*Cfd>79MmXV9jtb^FD)+dfw*Sdd9rrov?HP_vWG%TPx-MgKS}?~NlT-!!f}Y=_zvT8Z2Yo~R+z=Yqk*+7+tLR8I!ua;&?qM` z2PJuEoqT~41bIXF111j-J=1Vv_B-A1Lgfymtp&rx07e@$vD??OIuz6fap4>c(gw%~ zIn4}>Z~%{A#({zOJ`p}6dKz~^(H_Lv_VhO){tp z<9Nk}I8f#Z%=g2;GxHs4%4bslc>wqjWqO79M{jN@{|8{@=+ywQnb)S<%^Gq_`wk%G zI|P8G0Psyyv8x?k6hdP5j4(*@;}>uK8C(is!tAR6a0iZ5$E_tn5Ui)GoT0x1h`y^0 z0I(JSo&|uL0O0e!@3-K0+}YWgi1XL;TGamsa~^W3S#wnP00000NkvXXu0mjfvkdbp literal 0 HcmV?d00001 diff --git a/ui/public/img/icons/android-chrome-maskable-512x512.png b/ui/public/img/icons/android-chrome-maskable-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..5cef2efb673bf906785d20cbdbce36d47ea91e18 GIT binary patch literal 33814 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 literal 0 HcmV?d00001 diff --git a/ui/public/img/icons/apple-touch-icon-152x152.png b/ui/public/img/icons/apple-touch-icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..a62830bf860454a4c995ab92ebb1c24f41e86f43 GIT binary patch literal 7497 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 literal 0 HcmV?d00001 diff --git a/ui/public/img/icons/apple-touch-icon-180x180.png b/ui/public/img/icons/apple-touch-icon-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..576825d2ccf398abdb026c92bf527120a2c9943c GIT binary patch literal 9004 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 S=h#{R0000h=>(5CI%2u!vfI| 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 literal 0 HcmV?d00001 diff --git a/ui/public/img/icons/apple-touch-icon-76x76.png b/ui/public/img/icons/apple-touch-icon-76x76.png new file mode 100644 index 0000000000000000000000000000000000000000..0d99887371bd9dd780bfbbacf6d567c5073469e0 GIT binary patch literal 3285 zcmV;`3@Y=9P)OtW-96ns{l5PG^Sv3*o1_guNt9A`vV9DIn*nS^+_nJt zD}bXD=NXw&4GvgJDc=4WfTB{0k^*2Kfb;o0K0gdY?!76~0C@R)p8Jdd_d@^{oRA#%(Y_W81ZID;xI`>|zNssK~NfnqhPXK}Xq_+0|nZDOMutc?=104V7N7)H~Z2u=@mvYvgll*OGwUB28=Yv}{4ib|d@EKvZKidtGQ&UE4~3+6ErYt0965r7jMP^|+x;}{CS9RTLJObNpXax4#Ere&%(l^TYtqy=xbEgVYyiz^d%$bJui z1Ev(iMu^S6Bt^pa%l_?--6}ZSzfGkLQzO^BD%4Q=4+G$^i~(6H*ERyUMM}|pybr)1 zlJ`wTLnSD6V%+PhNXCiidj*(VY}g^-d=S8=032#dKsH!SMf`>83@X{Gkp#eT0KQWw z6zWHDZmD)w^PpikSTg`z##K})>D-l&J0*Bs2;e%lU5Rt~v&GW${xz(^){dnGusZ2E zIewwqG}&7b0Ivf$*}fQ7-xHD=a)L-mO31(I15tJ2N)6)w*cNL3rb8LsFZqIDfNs} z>Umy)1KzHxJNvvK_&K?@ zC7DvCqMtLKbuJKy_#<*r#;qo-5_A``iQfYQl}}U z<|w7uZq1Qpt7UebBg`r~ z@sn9^Uqwa)tcn*sMB+HU_xuEyUQIMAubsET_T?!V)Qxsf;tbx7m%+18B+Cnqw1C>@ znDh<92Xvu;wMW)Q#0-hZqjjD~fp0`h|0d$P1Dvd3fqfx00T_l4hV9B`8O-m^V1P`t z^L|gaAIJdJQ!bmKAlqQJM+sb&m+}K)Stv70wUIKx9Y_q^d}Rg_ZdHR_2jz*p=!FY1 z6!;mP%hnlo<+2_HEN0t)R+j9D-<4Q2%;5Z6Ud-~ENSOfGV6zV3!6;6kdlia=h%Ss? zxy_?Ro~Lt-798&9QsCc8fqxYR{;}rR>bjVD4sg|4-*Z=b#eppzP|QTEeqmvr6SmBW zpJ5V*84$o?FJ&I`X2UL`_0cn5nL%ydNjlebvJU)DQsB>{z+X;*Pdeul1zDoNR}}d3 z1xS{Rvt44GWusBu_Qv{r?udrh_jK0vK6{0ylwJdb1f_COq`fGbq$v|BQWx`(Cnz>2 z5mD4}X^z%IdwyjQjmIhYcsEq;h zy?v{*#xu|Jy!zr`&lyUS641UbW?}NN45c6y^@@8GmO~S%-t|Qa8W@-u90n!cj&$II z7`!sWBFbe$+1^BffBbNUiR7|gajoA(k7iF9T;*Th)$F%+w>0*2-Q)dtVEd}xh=>pt zo`;Hjd4ZFMX{hj6{BYst6u;q!BK@DaMC-gr=b9o0he0!a%rb3Ql{28}GQ+Ykzy^MS z0{?mn{LdTv7Wf~d!2bdT{>3`*@7007nXicgpSCaask6C}y6*94+ruXsZy7s)@RCGn zXz~CSDZ?yJh57X$BDL!QMXes`T%%!@0V@`&Dlveuy0SeJ07VSorG3j(KGvSa;3K~3 zT;fOFEz_gU#h&ha>6R#FS$+ppbda!Y;!`FJ3nRkwz-1ah=_gOt)aq%Sn;tV~B%mrp z*jEM+36SGsfe#({tkwo(9r(0unXfyWv%2eEPjC6hYzp&xp&}xnc-5pxnN&prtvo30 zt1$mOvnzV#Hbv{0T}_r@j;<=W3;iOWz!3%(Z4@U|?YU07FG>JzP|>U5_6{)K+KMH6CD9Rn1(Mb}VPmm}S#+ z_tHk%xBE#Iu`NUKF@9!i_{WW9D3@;zQYh{+QGMUW$Ys`e1Lm@9aFwW~u&l51cCBNz z}rRu4BM}Fwe&S zM@}Vp+yKkiTD<@kslAU^1gUxg0aI;0ZEo?YYpG!v^>y4znkYnAAX%m`zW>dGGGJ$! z5{{xs74~So;c)hloDNMWVBxx$VO_Deq@i7pb9fPgUv7DMLc>I;-Es9k21R=Vb@-nJT5t|aRW@1mo9xjPPhvpvrO%N zNORyyLB=pGR?o2)YHuWZw2}6%Y@*KQtcmn{pSxBf{eu0G{q+-4?}vPuvxt`$kT7UP z6Tt3h=2*^!ZXm`!6P(T3TSZ=Xeb*UqBt56+^^D`wIw>*nZzZT}Ro%(NSq zs|#^1IYH|$sB(7OKERQHdNyWSQ9~08v3+BwFc!jgDGZBLEXKV#u8D+MaXO?FPavO~ z1ZzSn7ARLO?1S*%CEQ^CM8OOy)NJ3zN~*6f3pMzK#cIfZt!4gK%vo6cmcaTS-mT4{ T?)W#S00000NkvXXu0mjf90WH> literal 0 HcmV?d00001 diff --git a/ui/public/img/icons/apple-touch-icon.png b/ui/public/img/icons/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..576825d2ccf398abdb026c92bf527120a2c9943c GIT binary patch literal 9004 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 S=h#{R0000RQ|aTHn%4F-T1NCd|&d^x;( z&-vW*z2}K+TEJ!<1)c%-ft`*0Ef@a^Q@|UZ3zIRt}0mdaDdwK zSzyReJA*){8w5T0#jg;9@)``?=>AmPuK3!DR{jr5;8es>esidhcit*R4 z+wZ4UN2PAFZP@XYvEwP#Y@6CK&tLp>Sj$WK#|u-ByvMzoViXS_)QkR$YaUFJ__J(%v%pwMfBLa&QzXZmb4 nf6kWYhSjQGaMQrAg&q6_UAJl8+b&gu00000NkvXXu0mjfoQxQj literal 0 HcmV?d00001 diff --git a/ui/public/img/icons/favicon-32x32.png b/ui/public/img/icons/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..e586f11d465246740068370c780b015873969f03 GIT binary patch literal 1273 zcmV9I zTHAOH$OzySKudUU4dqx5T#}?d(Z#qPPTnjPT5m$#w@JW0;053?aAP9AhSXnbJzw8? ziMcrOB5 zfSVdBLTYMH4xWX;pCa;Rn1TtBjldnrA=Qu;JOhEnVe~Eo?mUIS{Q3!au?Q>*BljNQ z+ByR5bs1^g2&P6LIR{<~^ZqN~(Yho0Tj1$a?g`@u=j0*O0`!W=Ln3k|kgpS?PydcM zj!&AN&bjeNFCvMk-VUw!O*n||3Tu*1@ZXmv-7&5#P>Vh}0cV2jf@+KOwPz_E%)0|C z4NmLV%nFy0N%hn4f=J*a8~D|T*tCc>Lb*+dhsNxZJqTmKM8zRZ0sfqfs`i#pblz`FOUf zYMkl}5!W48j$KV$GQ{PSP(42q_~&f3NsbH<)MKrb}08lpAtUZnH+Y z>om%lVJkKnx6T-U8I3Cg?}^oqt*WuAndE|cp3%F^Fu3XhIa*XL7al;SsyZ`(r^j3hJb}1uD!$e)8Bb=b`|Uo}jRse2 zjy1~Rih1XKATeyt`(jQhOw{hxMtip|Rj1nO35d9KwRGg%1W1%$i++h5UYmeB4?GM$ zVjkGKVqQW8!3VJ zdDV_4ceE|zx?88%>hb-)6mt?SoRfg~ejXw4x(sepjWV$-HmNH%x!})e>V4Ft+R^L= zH)OQCbxItUdVLla`Ht|xjV%LKjZl3MtLnDTtLpd0X_R$ZNT1c5_fgtuG3$ChH*)x= z7p+y*xIA#Ph#Ol5@K)|M>VI4PPRd8rZJ)1h^Hg}mJ0wo~#OaEj jXkn^);*j6-v?BZ;|Jog9L4YGl00000NkvXXu0mjfB0^>m literal 0 HcmV?d00001 diff --git a/ui/public/img/icons/msapplication-icon-144x144.png b/ui/public/img/icons/msapplication-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..9ebb285bb04b4cd906a71ede737df517ec685ff5 GIT binary patch literal 7043 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 literal 0 HcmV?d00001 diff --git a/ui/public/img/icons/mstile-150x150.png b/ui/public/img/icons/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..a740f77d1f1c92fe865a72baf32db33d0966ff23 GIT binary patch literal 7326 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 Eg3xCI@Bjb+ literal 0 HcmV?d00001 diff --git a/ui/public/img/icons/safari-pinned-tab.svg b/ui/public/img/icons/safari-pinned-tab.svg new file mode 100644 index 0000000..1476170 --- /dev/null +++ b/ui/public/img/icons/safari-pinned-tab.svg @@ -0,0 +1,130 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui/public/index.html b/ui/public/index.html new file mode 100644 index 0000000..bb8b158 --- /dev/null +++ b/ui/public/index.html @@ -0,0 +1,19 @@ + + + + + + + + Catalyst + + + +

    + + + + + diff --git a/ui/public/manifest.json b/ui/public/manifest.json new file mode 100644 index 0000000..2c3ebae --- /dev/null +++ b/ui/public/manifest.json @@ -0,0 +1,76 @@ +{ + "icons": [ + { + "src": "./img/icons/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "./img/icons/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "./img/icons/android-chrome-maskable-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "./img/icons/android-chrome-maskable-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "./img/icons/apple-touch-icon-60x60.png", + "sizes": "60x60", + "type": "image/png" + }, + { + "src": "./img/icons/apple-touch-icon-76x76.png", + "sizes": "76x76", + "type": "image/png" + }, + { + "src": "./img/icons/apple-touch-icon-120x120.png", + "sizes": "120x120", + "type": "image/png" + }, + { + "src": "./img/icons/apple-touch-icon-152x152.png", + "sizes": "152x152", + "type": "image/png" + }, + { + "src": "./img/icons/apple-touch-icon-180x180.png", + "sizes": "180x180", + "type": "image/png" + }, + { + "src": "./img/icons/apple-touch-icon.png", + "sizes": "180x180", + "type": "image/png" + }, + { + "src": "./img/icons/favicon-16x16.png", + "sizes": "16x16", + "type": "image/png" + }, + { + "src": "./img/icons/favicon-32x32.png", + "sizes": "32x32", + "type": "image/png" + }, + { + "src": "./img/icons/msapplication-icon-144x144.png", + "sizes": "144x144", + "type": "image/png" + }, + { + "src": "./img/icons/mstile-150x150.png", + "sizes": "150x150", + "type": "image/png" + } + ] +} \ No newline at end of file diff --git a/ui/public/silent-renew-oidc.html b/ui/public/silent-renew-oidc.html new file mode 100644 index 0000000..1022e8b --- /dev/null +++ b/ui/public/silent-renew-oidc.html @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ui/src/App.vue b/ui/src/App.vue new file mode 100644 index 0000000..e065924 --- /dev/null +++ b/ui/src/App.vue @@ -0,0 +1,248 @@ + + + + + diff --git a/ui/src/client/.npmignore b/ui/src/client/.npmignore new file mode 100644 index 0000000..999d88d --- /dev/null +++ b/ui/src/client/.npmignore @@ -0,0 +1 @@ +# empty npmignore to ensure all required files (e.g., in the dist folder) are published by npm \ No newline at end of file diff --git a/ui/src/client/api.ts b/ui/src/client/api.ts new file mode 100644 index 0000000..4f7f2fd --- /dev/null +++ b/ui/src/client/api.ts @@ -0,0 +1,8104 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * + * API for the catalyst incident response platform. + * + * The version of the OpenAPI document: + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import { Configuration } from './configuration'; +import globalAxios, { AxiosPromise, AxiosInstance } from 'axios'; +// Some imports not used depending on template conditions +// @ts-ignore +import { DUMMY_BASE_URL, assertParamExists, setApiKeyToObject, setBasicAuthToObject, setBearerAuthToObject, setOAuthToObject, setSearchParams, serializeDataIfNeeded, toPathString, createRequestFunction } from './common'; +// @ts-ignore +import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } from './base'; + +/** + * + * @export + * @interface Artifact + */ +export interface Artifact { + /** + * + * @type {{ [key: string]: Enrichment; }} + * @memberof Artifact + */ + enrichments?: { [key: string]: Enrichment; }; + /** + * + * @type {string} + * @memberof Artifact + */ + name: string; + /** + * + * @type {string} + * @memberof Artifact + */ + status?: string; + /** + * + * @type {string} + * @memberof Artifact + */ + type?: string; +} +/** + * + * @export + * @interface ArtifactOrigin + */ +export interface ArtifactOrigin { + /** + * + * @type {string} + * @memberof ArtifactOrigin + */ + artifact: string; + /** + * + * @type {number} + * @memberof ArtifactOrigin + */ + ticket_id: number; +} +/** + * + * @export + * @interface Automation + */ +export interface Automation { + /** + * + * @type {string} + * @memberof Automation + */ + image: string; + /** + * + * @type {string} + * @memberof Automation + */ + schema?: string; + /** + * + * @type {string} + * @memberof Automation + */ + script: string; + /** + * + * @type {Array} + * @memberof Automation + */ + type: Array; +} + +/** + * @export + * @enum {string} + */ +export enum AutomationTypeEnum { + Artifact = 'artifact', + Playbook = 'playbook', + Global = 'global' +} + +/** + * + * @export + * @interface AutomationForm + */ +export interface AutomationForm { + /** + * + * @type {string} + * @memberof AutomationForm + */ + id: string; + /** + * + * @type {string} + * @memberof AutomationForm + */ + image: string; + /** + * + * @type {string} + * @memberof AutomationForm + */ + schema?: string; + /** + * + * @type {string} + * @memberof AutomationForm + */ + script: string; + /** + * + * @type {Array} + * @memberof AutomationForm + */ + type: Array; +} + +/** + * @export + * @enum {string} + */ +export enum AutomationFormTypeEnum { + Artifact = 'artifact', + Playbook = 'playbook', + Global = 'global' +} + +/** + * + * @export + * @interface AutomationResponse + */ +export interface AutomationResponse { + /** + * + * @type {string} + * @memberof AutomationResponse + */ + id: string; + /** + * + * @type {string} + * @memberof AutomationResponse + */ + image: string; + /** + * + * @type {string} + * @memberof AutomationResponse + */ + schema?: string; + /** + * + * @type {string} + * @memberof AutomationResponse + */ + script: string; + /** + * + * @type {Array} + * @memberof AutomationResponse + */ + type: Array; +} + +/** + * @export + * @enum {string} + */ +export enum AutomationResponseTypeEnum { + Artifact = 'artifact', + Playbook = 'playbook', + Global = 'global' +} + +/** + * + * @export + * @interface Comment + */ +export interface Comment { + /** + * + * @type {string} + * @memberof Comment + */ + created: string; + /** + * + * @type {string} + * @memberof Comment + */ + creator: string; + /** + * + * @type {string} + * @memberof Comment + */ + message: string; +} +/** + * + * @export + * @interface CommentForm + */ +export interface CommentForm { + /** + * + * @type {string} + * @memberof CommentForm + */ + created?: string; + /** + * + * @type {string} + * @memberof CommentForm + */ + creator?: string; + /** + * + * @type {string} + * @memberof CommentForm + */ + message: string; +} +/** + * + * @export + * @interface Context + */ +export interface Context { + /** + * + * @type {Artifact} + * @memberof Context + */ + artifact?: Artifact; + /** + * + * @type {PlaybookResponse} + * @memberof Context + */ + playbook?: PlaybookResponse; + /** + * + * @type {TaskResponse} + * @memberof Context + */ + task?: TaskResponse; + /** + * + * @type {TicketResponse} + * @memberof Context + */ + ticket?: TicketResponse; +} +/** + * + * @export + * @interface Enrichment + */ +export interface Enrichment { + /** + * + * @type {string} + * @memberof Enrichment + */ + created: string; + /** + * + * @type {object} + * @memberof Enrichment + */ + data: object; + /** + * + * @type {string} + * @memberof Enrichment + */ + name: string; +} +/** + * + * @export + * @interface EnrichmentForm + */ +export interface EnrichmentForm { + /** + * + * @type {object} + * @memberof EnrichmentForm + */ + data: object; + /** + * + * @type {string} + * @memberof EnrichmentForm + */ + name: string; +} +/** + * + * @export + * @interface Graph + */ +export interface Graph { + /** + * + * @type {Array} + * @memberof Graph + */ + links?: Array; + /** + * + * @type {Array} + * @memberof Graph + */ + nodes?: Array; +} +/** + * + * @export + * @interface Group + */ +export interface Group { + /** + * + * @type {string} + * @memberof Group + */ + name: string; + /** + * + * @type {Array} + * @memberof Group + */ + users: Array; +} +/** + * + * @export + * @interface GroupForm + */ +export interface GroupForm { + /** + * + * @type {string} + * @memberof GroupForm + */ + id?: string; + /** + * + * @type {string} + * @memberof GroupForm + */ + name: string; + /** + * + * @type {Array} + * @memberof GroupForm + */ + users: Array; +} +/** + * + * @export + * @interface GroupResponse + */ +export interface GroupResponse { + /** + * + * @type {string} + * @memberof GroupResponse + */ + id: string; + /** + * + * @type {string} + * @memberof GroupResponse + */ + name: string; + /** + * + * @type {Array} + * @memberof GroupResponse + */ + users: Array; +} +/** + * + * @export + * @interface Job + */ +export interface Job { + /** + * + * @type {string} + * @memberof Job + */ + automation: string; + /** + * + * @type {string} + * @memberof Job + */ + container?: string; + /** + * + * @type {string} + * @memberof Job + */ + log?: string; + /** + * + * @type {Origin} + * @memberof Job + */ + origin?: Origin; + /** + * + * @type {object} + * @memberof Job + */ + output?: object; + /** + * + * @type {object} + * @memberof Job + */ + payload?: object; + /** + * + * @type {boolean} + * @memberof Job + */ + running: boolean; + /** + * + * @type {string} + * @memberof Job + */ + status: string; +} +/** + * + * @export + * @interface JobForm + */ +export interface JobForm { + /** + * + * @type {string} + * @memberof JobForm + */ + automation: string; + /** + * + * @type {Origin} + * @memberof JobForm + */ + origin?: Origin; + /** + * + * @type {object} + * @memberof JobForm + */ + payload?: object; +} +/** + * + * @export + * @interface JobResponse + */ +export interface JobResponse { + /** + * + * @type {string} + * @memberof JobResponse + */ + automation: string; + /** + * + * @type {string} + * @memberof JobResponse + */ + container?: string; + /** + * + * @type {string} + * @memberof JobResponse + */ + id: string; + /** + * + * @type {string} + * @memberof JobResponse + */ + log?: string; + /** + * + * @type {Origin} + * @memberof JobResponse + */ + origin?: Origin; + /** + * + * @type {object} + * @memberof JobResponse + */ + output?: object; + /** + * + * @type {object} + * @memberof JobResponse + */ + payload?: object; + /** + * + * @type {string} + * @memberof JobResponse + */ + status: string; +} +/** + * + * @export + * @interface Link + */ +export interface Link { + /** + * + * @type {string} + * @memberof Link + */ + id: string; + /** + * + * @type {string} + * @memberof Link + */ + sid: string; + /** + * + * @type {string} + * @memberof Link + */ + tid: string; +} +/** + * + * @export + * @interface LogEntry + */ +export interface LogEntry { + /** + * + * @type {string} + * @memberof LogEntry + */ + created: string; + /** + * + * @type {string} + * @memberof LogEntry + */ + creator: string; + /** + * + * @type {string} + * @memberof LogEntry + */ + message: string; + /** + * + * @type {string} + * @memberof LogEntry + */ + reference: string; +} +/** + * + * @export + * @interface Message + */ +export interface Message { + /** + * + * @type {Context} + * @memberof Message + */ + context?: Context; + /** + * + * @type {object} + * @memberof Message + */ + payload?: object; + /** + * + * @type {{ [key: string]: string; }} + * @memberof Message + */ + secrets?: { [key: string]: string; }; +} +/** + * + * @export + * @interface ModelFile + */ +export interface ModelFile { + /** + * + * @type {string} + * @memberof ModelFile + */ + key: string; + /** + * + * @type {string} + * @memberof ModelFile + */ + name: string; +} +/** + * + * @export + * @interface NewUserResponse + */ +export interface NewUserResponse { + /** + * + * @type {boolean} + * @memberof NewUserResponse + */ + blocked: boolean; + /** + * + * @type {string} + * @memberof NewUserResponse + */ + id: string; + /** + * + * @type {Array} + * @memberof NewUserResponse + */ + roles: Array; + /** + * + * @type {string} + * @memberof NewUserResponse + */ + secret?: string; +} +/** + * + * @export + * @interface Node + */ +export interface Node { + /** + * + * @type {string} + * @memberof Node + */ + id: string; + /** + * + * @type {string} + * @memberof Node + */ + name: string; +} +/** + * + * @export + * @interface Origin + */ +export interface Origin { + /** + * + * @type {ArtifactOrigin} + * @memberof Origin + */ + artifact_origin?: ArtifactOrigin; + /** + * + * @type {TaskOrigin} + * @memberof Origin + */ + task_origin?: TaskOrigin; +} +/** + * + * @export + * @interface Playbook + */ +export interface Playbook { + /** + * + * @type {string} + * @memberof Playbook + */ + name: string; + /** + * + * @type {{ [key: string]: Task; }} + * @memberof Playbook + */ + tasks: { [key: string]: Task; }; +} +/** + * + * @export + * @interface PlaybookResponse + */ +export interface PlaybookResponse { + /** + * + * @type {string} + * @memberof PlaybookResponse + */ + name: string; + /** + * + * @type {{ [key: string]: TaskResponse; }} + * @memberof PlaybookResponse + */ + tasks: { [key: string]: TaskResponse; }; +} +/** + * + * @export + * @interface PlaybookTemplate + */ +export interface PlaybookTemplate { + /** + * + * @type {string} + * @memberof PlaybookTemplate + */ + name: string; + /** + * + * @type {string} + * @memberof PlaybookTemplate + */ + yaml: string; +} +/** + * + * @export + * @interface PlaybookTemplateForm + */ +export interface PlaybookTemplateForm { + /** + * + * @type {string} + * @memberof PlaybookTemplateForm + */ + id?: string; + /** + * + * @type {string} + * @memberof PlaybookTemplateForm + */ + yaml: string; +} +/** + * + * @export + * @interface PlaybookTemplateResponse + */ +export interface PlaybookTemplateResponse { + /** + * + * @type {string} + * @memberof PlaybookTemplateResponse + */ + id: string; + /** + * + * @type {string} + * @memberof PlaybookTemplateResponse + */ + name: string; + /** + * + * @type {string} + * @memberof PlaybookTemplateResponse + */ + yaml: string; +} +/** + * + * @export + * @interface Reference + */ +export interface Reference { + /** + * + * @type {string} + * @memberof Reference + */ + href: string; + /** + * + * @type {string} + * @memberof Reference + */ + name: string; +} +/** + * + * @export + * @interface Rule + */ +export interface Rule { + /** + * + * @type {string} + * @memberof Rule + */ + condition: string; + /** + * + * @type {string} + * @memberof Rule + */ + name: string; + /** + * + * @type {object} + * @memberof Rule + */ + update: object; +} +/** + * + * @export + * @interface RuleForm + */ +export interface RuleForm { + /** + * + * @type {string} + * @memberof RuleForm + */ + condition: string; + /** + * + * @type {string} + * @memberof RuleForm + */ + id?: string; + /** + * + * @type {string} + * @memberof RuleForm + */ + name: string; + /** + * + * @type {object} + * @memberof RuleForm + */ + update: object; +} +/** + * + * @export + * @interface RuleResponse + */ +export interface RuleResponse { + /** + * + * @type {string} + * @memberof RuleResponse + */ + condition: string; + /** + * + * @type {string} + * @memberof RuleResponse + */ + id: string; + /** + * + * @type {string} + * @memberof RuleResponse + */ + name: string; + /** + * + * @type {object} + * @memberof RuleResponse + */ + update: object; +} +/** + * + * @export + * @interface Settings + */ +export interface Settings { + /** + * + * @type {Array} + * @memberof Settings + */ + artifactStates: Array; + /** + * + * @type {Array} + * @memberof Settings + */ + roles?: Array; + /** + * + * @type {Array} + * @memberof Settings + */ + ticketTypes: Array; + /** + * + * @type {string} + * @memberof Settings + */ + tier: SettingsTierEnum; + /** + * + * @type {string} + * @memberof Settings + */ + timeformat: string; + /** + * + * @type {string} + * @memberof Settings + */ + version: string; +} + +/** + * @export + * @enum {string} + */ +export enum SettingsTierEnum { + Community = 'community', + Enterprise = 'enterprise' +} + +/** + * + * @export + * @interface Statistics + */ +export interface Statistics { + /** + * + * @type {{ [key: string]: number; }} + * @memberof Statistics + */ + open_tickets_per_user: { [key: string]: number; }; + /** + * + * @type {{ [key: string]: number; }} + * @memberof Statistics + */ + tickets_per_type: { [key: string]: number; }; + /** + * + * @type {{ [key: string]: number; }} + * @memberof Statistics + */ + tickets_per_week: { [key: string]: number; }; + /** + * + * @type {number} + * @memberof Statistics + */ + unassigned: number; +} +/** + * + * @export + * @interface Task + */ +export interface Task { + /** + * + * @type {string} + * @memberof Task + */ + automation?: string; + /** + * + * @type {string} + * @memberof Task + */ + closed?: string; + /** + * + * @type {string} + * @memberof Task + */ + created: string; + /** + * + * @type {object} + * @memberof Task + */ + data?: object; + /** + * + * @type {boolean} + * @memberof Task + */ + done: boolean; + /** + * + * @type {boolean} + * @memberof Task + */ + join?: boolean; + /** + * + * @type {string} + * @memberof Task + */ + name: string; + /** + * + * @type {{ [key: string]: string; }} + * @memberof Task + */ + next?: { [key: string]: string; }; + /** + * + * @type {string} + * @memberof Task + */ + owner?: string; + /** + * + * @type {{ [key: string]: string; }} + * @memberof Task + */ + payload?: { [key: string]: string; }; + /** + * + * @type {object} + * @memberof Task + */ + schema?: object; + /** + * + * @type {string} + * @memberof Task + */ + type: TaskTypeEnum; +} + +/** + * @export + * @enum {string} + */ +export enum TaskTypeEnum { + Task = 'task', + Input = 'input', + Automation = 'automation' +} + +/** + * + * @export + * @interface TaskForm + */ +export interface TaskForm { + /** + * + * @type {string} + * @memberof TaskForm + */ + automation?: string; + /** + * + * @type {string} + * @memberof TaskForm + */ + closed?: string; + /** + * + * @type {string} + * @memberof TaskForm + */ + created?: string; + /** + * + * @type {object} + * @memberof TaskForm + */ + data?: object; + /** + * + * @type {boolean} + * @memberof TaskForm + */ + done?: boolean; + /** + * + * @type {boolean} + * @memberof TaskForm + */ + join?: boolean; + /** + * + * @type {string} + * @memberof TaskForm + */ + name: string; + /** + * + * @type {{ [key: string]: string; }} + * @memberof TaskForm + */ + next?: { [key: string]: string; }; + /** + * + * @type {string} + * @memberof TaskForm + */ + owner?: string; + /** + * + * @type {{ [key: string]: string; }} + * @memberof TaskForm + */ + payload?: { [key: string]: string; }; + /** + * + * @type {object} + * @memberof TaskForm + */ + schema?: object; + /** + * + * @type {string} + * @memberof TaskForm + */ + type: TaskFormTypeEnum; +} + +/** + * @export + * @enum {string} + */ +export enum TaskFormTypeEnum { + Task = 'task', + Input = 'input', + Automation = 'automation' +} + +/** + * + * @export + * @interface TaskOrigin + */ +export interface TaskOrigin { + /** + * + * @type {string} + * @memberof TaskOrigin + */ + playbook_id: string; + /** + * + * @type {string} + * @memberof TaskOrigin + */ + task_id: string; + /** + * + * @type {number} + * @memberof TaskOrigin + */ + ticket_id: number; +} +/** + * + * @export + * @interface TaskResponse + */ +export interface TaskResponse { + /** + * + * @type {boolean} + * @memberof TaskResponse + */ + active: boolean; + /** + * + * @type {string} + * @memberof TaskResponse + */ + automation?: string; + /** + * + * @type {string} + * @memberof TaskResponse + */ + closed?: string; + /** + * + * @type {string} + * @memberof TaskResponse + */ + created: string; + /** + * + * @type {object} + * @memberof TaskResponse + */ + data?: object; + /** + * + * @type {boolean} + * @memberof TaskResponse + */ + done: boolean; + /** + * + * @type {boolean} + * @memberof TaskResponse + */ + join?: boolean; + /** + * + * @type {string} + * @memberof TaskResponse + */ + name: string; + /** + * + * @type {{ [key: string]: string; }} + * @memberof TaskResponse + */ + next?: { [key: string]: string; }; + /** + * + * @type {number} + * @memberof TaskResponse + */ + order: number; + /** + * + * @type {string} + * @memberof TaskResponse + */ + owner?: string; + /** + * + * @type {{ [key: string]: string; }} + * @memberof TaskResponse + */ + payload?: { [key: string]: string; }; + /** + * + * @type {object} + * @memberof TaskResponse + */ + schema?: object; + /** + * + * @type {string} + * @memberof TaskResponse + */ + type: TaskResponseTypeEnum; +} + +/** + * @export + * @enum {string} + */ +export enum TaskResponseTypeEnum { + Task = 'task', + Input = 'input', + Automation = 'automation' +} + +/** + * + * @export + * @interface TaskWithContext + */ +export interface TaskWithContext { + /** + * + * @type {string} + * @memberof TaskWithContext + */ + playbook_id: string; + /** + * + * @type {string} + * @memberof TaskWithContext + */ + playbook_name: string; + /** + * + * @type {TaskResponse} + * @memberof TaskWithContext + */ + task: TaskResponse; + /** + * + * @type {string} + * @memberof TaskWithContext + */ + task_id: string; + /** + * + * @type {number} + * @memberof TaskWithContext + */ + ticket_id: number; + /** + * + * @type {string} + * @memberof TaskWithContext + */ + ticket_name: string; +} +/** + * + * @export + * @interface Ticket + */ +export interface Ticket { + /** + * + * @type {Array} + * @memberof Ticket + */ + artifacts?: Array; + /** + * + * @type {Array} + * @memberof Ticket + */ + comments?: Array; + /** + * + * @type {string} + * @memberof Ticket + */ + created: string; + /** + * + * @type {object} + * @memberof Ticket + */ + details?: object; + /** + * + * @type {Array} + * @memberof Ticket + */ + files?: Array; + /** + * + * @type {string} + * @memberof Ticket + */ + modified: string; + /** + * + * @type {string} + * @memberof Ticket + */ + name: string; + /** + * + * @type {string} + * @memberof Ticket + */ + owner?: string; + /** + * + * @type {{ [key: string]: Playbook; }} + * @memberof Ticket + */ + playbooks?: { [key: string]: Playbook; }; + /** + * + * @type {Array} + * @memberof Ticket + */ + read?: Array; + /** + * + * @type {Array} + * @memberof Ticket + */ + references?: Array; + /** + * + * @type {string} + * @memberof Ticket + */ + schema: string; + /** + * + * @type {string} + * @memberof Ticket + */ + status: string; + /** + * + * @type {string} + * @memberof Ticket + */ + type: string; + /** + * + * @type {Array} + * @memberof Ticket + */ + write?: Array; +} +/** + * + * @export + * @interface TicketForm + */ +export interface TicketForm { + /** + * + * @type {Array} + * @memberof TicketForm + */ + artifacts?: Array; + /** + * + * @type {Array} + * @memberof TicketForm + */ + comments?: Array; + /** + * + * @type {string} + * @memberof TicketForm + */ + created?: string; + /** + * + * @type {object} + * @memberof TicketForm + */ + details?: object; + /** + * + * @type {Array} + * @memberof TicketForm + */ + files?: Array; + /** + * + * @type {number} + * @memberof TicketForm + */ + id?: number; + /** + * + * @type {string} + * @memberof TicketForm + */ + modified?: string; + /** + * + * @type {string} + * @memberof TicketForm + */ + name: string; + /** + * + * @type {string} + * @memberof TicketForm + */ + owner?: string; + /** + * + * @type {Array} + * @memberof TicketForm + */ + playbooks?: Array; + /** + * + * @type {Array} + * @memberof TicketForm + */ + read?: Array; + /** + * + * @type {Array} + * @memberof TicketForm + */ + references?: Array; + /** + * + * @type {string} + * @memberof TicketForm + */ + schema?: string; + /** + * + * @type {string} + * @memberof TicketForm + */ + status: string; + /** + * + * @type {string} + * @memberof TicketForm + */ + type: string; + /** + * + * @type {Array} + * @memberof TicketForm + */ + write?: Array; +} +/** + * + * @export + * @interface TicketList + */ +export interface TicketList { + /** + * + * @type {number} + * @memberof TicketList + */ + count: number; + /** + * + * @type {Array} + * @memberof TicketList + */ + tickets: Array; +} +/** + * + * @export + * @interface TicketResponse + */ +export interface TicketResponse { + /** + * + * @type {Array} + * @memberof TicketResponse + */ + artifacts?: Array; + /** + * + * @type {Array} + * @memberof TicketResponse + */ + comments?: Array; + /** + * + * @type {string} + * @memberof TicketResponse + */ + created: string; + /** + * + * @type {object} + * @memberof TicketResponse + */ + details?: object; + /** + * + * @type {Array} + * @memberof TicketResponse + */ + files?: Array; + /** + * + * @type {number} + * @memberof TicketResponse + */ + id: number; + /** + * + * @type {string} + * @memberof TicketResponse + */ + modified: string; + /** + * + * @type {string} + * @memberof TicketResponse + */ + name: string; + /** + * + * @type {string} + * @memberof TicketResponse + */ + owner?: string; + /** + * + * @type {{ [key: string]: PlaybookResponse; }} + * @memberof TicketResponse + */ + playbooks?: { [key: string]: PlaybookResponse; }; + /** + * + * @type {Array} + * @memberof TicketResponse + */ + read?: Array; + /** + * + * @type {Array} + * @memberof TicketResponse + */ + references?: Array; + /** + * + * @type {string} + * @memberof TicketResponse + */ + schema: string; + /** + * + * @type {string} + * @memberof TicketResponse + */ + status: string; + /** + * + * @type {string} + * @memberof TicketResponse + */ + type: string; + /** + * + * @type {Array} + * @memberof TicketResponse + */ + write?: Array; +} +/** + * + * @export + * @interface TicketSimpleResponse + */ +export interface TicketSimpleResponse { + /** + * + * @type {Array} + * @memberof TicketSimpleResponse + */ + artifacts?: Array; + /** + * + * @type {Array} + * @memberof TicketSimpleResponse + */ + comments?: Array; + /** + * + * @type {string} + * @memberof TicketSimpleResponse + */ + created: string; + /** + * + * @type {object} + * @memberof TicketSimpleResponse + */ + details?: object; + /** + * + * @type {Array} + * @memberof TicketSimpleResponse + */ + files?: Array; + /** + * + * @type {number} + * @memberof TicketSimpleResponse + */ + id: number; + /** + * + * @type {string} + * @memberof TicketSimpleResponse + */ + modified: string; + /** + * + * @type {string} + * @memberof TicketSimpleResponse + */ + name: string; + /** + * + * @type {string} + * @memberof TicketSimpleResponse + */ + owner?: string; + /** + * + * @type {{ [key: string]: Playbook; }} + * @memberof TicketSimpleResponse + */ + playbooks?: { [key: string]: Playbook; }; + /** + * + * @type {Array} + * @memberof TicketSimpleResponse + */ + read?: Array; + /** + * + * @type {Array} + * @memberof TicketSimpleResponse + */ + references?: Array; + /** + * + * @type {string} + * @memberof TicketSimpleResponse + */ + schema: string; + /** + * + * @type {string} + * @memberof TicketSimpleResponse + */ + status: string; + /** + * + * @type {string} + * @memberof TicketSimpleResponse + */ + type: string; + /** + * + * @type {Array} + * @memberof TicketSimpleResponse + */ + write?: Array; +} +/** + * + * @export + * @interface TicketTemplate + */ +export interface TicketTemplate { + /** + * + * @type {string} + * @memberof TicketTemplate + */ + name: string; + /** + * + * @type {string} + * @memberof TicketTemplate + */ + schema: string; +} +/** + * + * @export + * @interface TicketTemplateForm + */ +export interface TicketTemplateForm { + /** + * + * @type {string} + * @memberof TicketTemplateForm + */ + id?: string; + /** + * + * @type {string} + * @memberof TicketTemplateForm + */ + name: string; + /** + * + * @type {string} + * @memberof TicketTemplateForm + */ + schema: string; +} +/** + * + * @export + * @interface TicketTemplateResponse + */ +export interface TicketTemplateResponse { + /** + * + * @type {string} + * @memberof TicketTemplateResponse + */ + id: string; + /** + * + * @type {string} + * @memberof TicketTemplateResponse + */ + name: string; + /** + * + * @type {string} + * @memberof TicketTemplateResponse + */ + schema: string; +} +/** + * + * @export + * @interface TicketType + */ +export interface TicketType { + /** + * + * @type {Array} + * @memberof TicketType + */ + default_groups?: Array; + /** + * + * @type {Array} + * @memberof TicketType + */ + default_playbooks: Array; + /** + * + * @type {string} + * @memberof TicketType + */ + default_template: string; + /** + * + * @type {string} + * @memberof TicketType + */ + icon: string; + /** + * + * @type {string} + * @memberof TicketType + */ + name: string; +} +/** + * + * @export + * @interface TicketTypeForm + */ +export interface TicketTypeForm { + /** + * + * @type {Array} + * @memberof TicketTypeForm + */ + default_groups?: Array; + /** + * + * @type {Array} + * @memberof TicketTypeForm + */ + default_playbooks: Array; + /** + * + * @type {string} + * @memberof TicketTypeForm + */ + default_template: string; + /** + * + * @type {string} + * @memberof TicketTypeForm + */ + icon: string; + /** + * + * @type {string} + * @memberof TicketTypeForm + */ + id?: string; + /** + * + * @type {string} + * @memberof TicketTypeForm + */ + name: string; +} +/** + * + * @export + * @interface TicketTypeResponse + */ +export interface TicketTypeResponse { + /** + * + * @type {Array} + * @memberof TicketTypeResponse + */ + default_groups?: Array; + /** + * + * @type {Array} + * @memberof TicketTypeResponse + */ + default_playbooks: Array; + /** + * + * @type {string} + * @memberof TicketTypeResponse + */ + default_template: string; + /** + * + * @type {string} + * @memberof TicketTypeResponse + */ + icon: string; + /** + * + * @type {string} + * @memberof TicketTypeResponse + */ + id: string; + /** + * + * @type {string} + * @memberof TicketTypeResponse + */ + name: string; +} +/** + * + * @export + * @interface TicketWithTickets + */ +export interface TicketWithTickets { + /** + * + * @type {Array} + * @memberof TicketWithTickets + */ + artifacts?: Array; + /** + * + * @type {Array} + * @memberof TicketWithTickets + */ + comments?: Array; + /** + * + * @type {string} + * @memberof TicketWithTickets + */ + created: string; + /** + * + * @type {object} + * @memberof TicketWithTickets + */ + details?: object; + /** + * + * @type {Array} + * @memberof TicketWithTickets + */ + files?: Array; + /** + * + * @type {number} + * @memberof TicketWithTickets + */ + id: number; + /** + * + * @type {string} + * @memberof TicketWithTickets + */ + modified: string; + /** + * + * @type {string} + * @memberof TicketWithTickets + */ + name: string; + /** + * + * @type {string} + * @memberof TicketWithTickets + */ + owner?: string; + /** + * + * @type {{ [key: string]: PlaybookResponse; }} + * @memberof TicketWithTickets + */ + playbooks?: { [key: string]: PlaybookResponse; }; + /** + * + * @type {Array} + * @memberof TicketWithTickets + */ + read?: Array; + /** + * + * @type {Array} + * @memberof TicketWithTickets + */ + references?: Array; + /** + * + * @type {string} + * @memberof TicketWithTickets + */ + schema: string; + /** + * + * @type {string} + * @memberof TicketWithTickets + */ + status: string; + /** + * + * @type {Array} + * @memberof TicketWithTickets + */ + tickets?: Array; + /** + * + * @type {string} + * @memberof TicketWithTickets + */ + type: string; + /** + * + * @type {Array} + * @memberof TicketWithTickets + */ + write?: Array; +} +/** + * + * @export + * @interface Type + */ +export interface Type { + /** + * + * @type {string} + * @memberof Type + */ + color?: TypeColorEnum; + /** + * + * @type {string} + * @memberof Type + */ + icon: string; + /** + * + * @type {string} + * @memberof Type + */ + id: string; + /** + * + * @type {string} + * @memberof Type + */ + name: string; +} + +/** + * @export + * @enum {string} + */ +export enum TypeColorEnum { + Error = 'error', + Info = 'info', + Success = 'success', + Warning = 'warning' +} + +/** + * + * @export + * @interface User + */ +export interface User { + /** + * + * @type {boolean} + * @memberof User + */ + apikey: boolean; + /** + * + * @type {boolean} + * @memberof User + */ + blocked: boolean; + /** + * + * @type {Array} + * @memberof User + */ + roles: Array; + /** + * + * @type {string} + * @memberof User + */ + sha256?: string; +} +/** + * + * @export + * @interface UserData + */ +export interface UserData { + /** + * + * @type {string} + * @memberof UserData + */ + email?: string; + /** + * + * @type {string} + * @memberof UserData + */ + image?: string; + /** + * + * @type {string} + * @memberof UserData + */ + name?: string; + /** + * + * @type {string} + * @memberof UserData + */ + timeformat?: string; +} +/** + * + * @export + * @interface UserDataResponse + */ +export interface UserDataResponse { + /** + * + * @type {string} + * @memberof UserDataResponse + */ + email?: string; + /** + * + * @type {string} + * @memberof UserDataResponse + */ + id: string; + /** + * + * @type {string} + * @memberof UserDataResponse + */ + image?: string; + /** + * + * @type {string} + * @memberof UserDataResponse + */ + name?: string; + /** + * + * @type {string} + * @memberof UserDataResponse + */ + timeformat?: string; +} +/** + * + * @export + * @interface UserForm + */ +export interface UserForm { + /** + * + * @type {boolean} + * @memberof UserForm + */ + apikey: boolean; + /** + * + * @type {boolean} + * @memberof UserForm + */ + blocked: boolean; + /** + * + * @type {string} + * @memberof UserForm + */ + id: string; + /** + * + * @type {Array} + * @memberof UserForm + */ + roles: Array; +} +/** + * + * @export + * @interface UserResponse + */ +export interface UserResponse { + /** + * + * @type {boolean} + * @memberof UserResponse + */ + apikey: boolean; + /** + * + * @type {boolean} + * @memberof UserResponse + */ + blocked: boolean; + /** + * + * @type {string} + * @memberof UserResponse + */ + id: string; + /** + * + * @type {Array} + * @memberof UserResponse + */ + roles: Array; +} + +/** + * AutomationsApi - axios parameter creator + * @export + */ +export const AutomationsApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @summary Create a new automation + * @param {AutomationForm} automation New automation + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createAutomation: async (automation: AutomationForm, options: any = {}): Promise => { + // verify required parameter 'automation' is not null or undefined + assertParamExists('createAutomation', 'automation', automation) + const localVarPath = `/automations`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(automation, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Delete a automation + * @param {string} id Automation ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deleteAutomation: async (id: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('deleteAutomation', 'id', id) + const localVarPath = `/automations/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Get a single automation + * @param {string} id Automation ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getAutomation: async (id: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('getAutomation', 'id', id) + const localVarPath = `/automations/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary List automations + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listAutomations: async (options: any = {}): Promise => { + const localVarPath = `/automations`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Update an existing automation + * @param {string} id Automation ID + * @param {AutomationForm} automation Automation object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateAutomation: async (id: string, automation: AutomationForm, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('updateAutomation', 'id', id) + // verify required parameter 'automation' is not null or undefined + assertParamExists('updateAutomation', 'automation', automation) + const localVarPath = `/automations/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(automation, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * AutomationsApi - functional programming interface + * @export + */ +export const AutomationsApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = AutomationsApiAxiosParamCreator(configuration) + return { + /** + * + * @summary Create a new automation + * @param {AutomationForm} automation New automation + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async createAutomation(automation: AutomationForm, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.createAutomation(automation, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Delete a automation + * @param {string} id Automation ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async deleteAutomation(id: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.deleteAutomation(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Get a single automation + * @param {string} id Automation ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getAutomation(id: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getAutomation(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary List automations + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async listAutomations(options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { + const localVarAxiosArgs = await localVarAxiosParamCreator.listAutomations(options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Update an existing automation + * @param {string} id Automation ID + * @param {AutomationForm} automation Automation object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async updateAutomation(id: string, automation: AutomationForm, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.updateAutomation(id, automation, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * AutomationsApi - factory interface + * @export + */ +export const AutomationsApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = AutomationsApiFp(configuration) + return { + /** + * + * @summary Create a new automation + * @param {AutomationForm} automation New automation + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createAutomation(automation: AutomationForm, options?: any): AxiosPromise { + return localVarFp.createAutomation(automation, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Delete a automation + * @param {string} id Automation ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deleteAutomation(id: string, options?: any): AxiosPromise { + return localVarFp.deleteAutomation(id, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Get a single automation + * @param {string} id Automation ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getAutomation(id: string, options?: any): AxiosPromise { + return localVarFp.getAutomation(id, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary List automations + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listAutomations(options?: any): AxiosPromise> { + return localVarFp.listAutomations(options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Update an existing automation + * @param {string} id Automation ID + * @param {AutomationForm} automation Automation object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateAutomation(id: string, automation: AutomationForm, options?: any): AxiosPromise { + return localVarFp.updateAutomation(id, automation, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * AutomationsApi - object-oriented interface + * @export + * @class AutomationsApi + * @extends {BaseAPI} + */ +export class AutomationsApi extends BaseAPI { + /** + * + * @summary Create a new automation + * @param {AutomationForm} automation New automation + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof AutomationsApi + */ + public createAutomation(automation: AutomationForm, options?: any) { + return AutomationsApiFp(this.configuration).createAutomation(automation, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Delete a automation + * @param {string} id Automation ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof AutomationsApi + */ + public deleteAutomation(id: string, options?: any) { + return AutomationsApiFp(this.configuration).deleteAutomation(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Get a single automation + * @param {string} id Automation ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof AutomationsApi + */ + public getAutomation(id: string, options?: any) { + return AutomationsApiFp(this.configuration).getAutomation(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary List automations + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof AutomationsApi + */ + public listAutomations(options?: any) { + return AutomationsApiFp(this.configuration).listAutomations(options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Update an existing automation + * @param {string} id Automation ID + * @param {AutomationForm} automation Automation object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof AutomationsApi + */ + public updateAutomation(id: string, automation: AutomationForm, options?: any) { + return AutomationsApiFp(this.configuration).updateAutomation(id, automation, options).then((request) => request(this.axios, this.basePath)); + } +} + + +/** + * GraphApi - axios parameter creator + * @export + */ +export const GraphApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @summary Graph + * @param {string} col Graph Start + * @param {string} id Graph Start + * @param {number} depth Graph Start + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + graph: async (col: string, id: string, depth: number, options: any = {}): Promise => { + // verify required parameter 'col' is not null or undefined + assertParamExists('graph', 'col', col) + // verify required parameter 'id' is not null or undefined + assertParamExists('graph', 'id', id) + // verify required parameter 'depth' is not null or undefined + assertParamExists('graph', 'depth', depth) + const localVarPath = `/graph/{col}/{id}` + .replace(`{${"col"}}`, encodeURIComponent(String(col))) + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + if (depth !== undefined) { + localVarQueryParameter['depth'] = depth; + } + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * GraphApi - functional programming interface + * @export + */ +export const GraphApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = GraphApiAxiosParamCreator(configuration) + return { + /** + * + * @summary Graph + * @param {string} col Graph Start + * @param {string} id Graph Start + * @param {number} depth Graph Start + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async graph(col: string, id: string, depth: number, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.graph(col, id, depth, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * GraphApi - factory interface + * @export + */ +export const GraphApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = GraphApiFp(configuration) + return { + /** + * + * @summary Graph + * @param {string} col Graph Start + * @param {string} id Graph Start + * @param {number} depth Graph Start + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + graph(col: string, id: string, depth: number, options?: any): AxiosPromise { + return localVarFp.graph(col, id, depth, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * GraphApi - object-oriented interface + * @export + * @class GraphApi + * @extends {BaseAPI} + */ +export class GraphApi extends BaseAPI { + /** + * + * @summary Graph + * @param {string} col Graph Start + * @param {string} id Graph Start + * @param {number} depth Graph Start + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof GraphApi + */ + public graph(col: string, id: string, depth: number, options?: any) { + return GraphApiFp(this.configuration).graph(col, id, depth, options).then((request) => request(this.axios, this.basePath)); + } +} + + +/** + * GroupsApi - axios parameter creator + * @export + */ +export const GroupsApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @summary Create a new group + * @param {GroupForm} group New group + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createGroup: async (group: GroupForm, options: any = {}): Promise => { + // verify required parameter 'group' is not null or undefined + assertParamExists('createGroup', 'group', group) + const localVarPath = `/groups`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(group, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Delete a group + * @param {string} id Group ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deleteGroup: async (id: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('deleteGroup', 'id', id) + const localVarPath = `/groups/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Get a single group + * @param {string} id Group ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getGroup: async (id: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('getGroup', 'id', id) + const localVarPath = `/groups/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary List groups + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listGroups: async (options: any = {}): Promise => { + const localVarPath = `/groups`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Update an existing group + * @param {string} id Group ID + * @param {Group} group Group object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateGroup: async (id: string, group: Group, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('updateGroup', 'id', id) + // verify required parameter 'group' is not null or undefined + assertParamExists('updateGroup', 'group', group) + const localVarPath = `/groups/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(group, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * GroupsApi - functional programming interface + * @export + */ +export const GroupsApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = GroupsApiAxiosParamCreator(configuration) + return { + /** + * + * @summary Create a new group + * @param {GroupForm} group New group + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async createGroup(group: GroupForm, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.createGroup(group, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Delete a group + * @param {string} id Group ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async deleteGroup(id: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.deleteGroup(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Get a single group + * @param {string} id Group ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getGroup(id: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getGroup(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary List groups + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async listGroups(options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { + const localVarAxiosArgs = await localVarAxiosParamCreator.listGroups(options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Update an existing group + * @param {string} id Group ID + * @param {Group} group Group object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async updateGroup(id: string, group: Group, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.updateGroup(id, group, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * GroupsApi - factory interface + * @export + */ +export const GroupsApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = GroupsApiFp(configuration) + return { + /** + * + * @summary Create a new group + * @param {GroupForm} group New group + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createGroup(group: GroupForm, options?: any): AxiosPromise { + return localVarFp.createGroup(group, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Delete a group + * @param {string} id Group ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deleteGroup(id: string, options?: any): AxiosPromise { + return localVarFp.deleteGroup(id, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Get a single group + * @param {string} id Group ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getGroup(id: string, options?: any): AxiosPromise { + return localVarFp.getGroup(id, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary List groups + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listGroups(options?: any): AxiosPromise> { + return localVarFp.listGroups(options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Update an existing group + * @param {string} id Group ID + * @param {Group} group Group object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateGroup(id: string, group: Group, options?: any): AxiosPromise { + return localVarFp.updateGroup(id, group, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * GroupsApi - object-oriented interface + * @export + * @class GroupsApi + * @extends {BaseAPI} + */ +export class GroupsApi extends BaseAPI { + /** + * + * @summary Create a new group + * @param {GroupForm} group New group + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof GroupsApi + */ + public createGroup(group: GroupForm, options?: any) { + return GroupsApiFp(this.configuration).createGroup(group, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Delete a group + * @param {string} id Group ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof GroupsApi + */ + public deleteGroup(id: string, options?: any) { + return GroupsApiFp(this.configuration).deleteGroup(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Get a single group + * @param {string} id Group ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof GroupsApi + */ + public getGroup(id: string, options?: any) { + return GroupsApiFp(this.configuration).getGroup(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary List groups + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof GroupsApi + */ + public listGroups(options?: any) { + return GroupsApiFp(this.configuration).listGroups(options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Update an existing group + * @param {string} id Group ID + * @param {Group} group Group object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof GroupsApi + */ + public updateGroup(id: string, group: Group, options?: any) { + return GroupsApiFp(this.configuration).updateGroup(id, group, options).then((request) => request(this.axios, this.basePath)); + } +} + + +/** + * JobsApi - axios parameter creator + * @export + */ +export const JobsApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @summary Get a single job + * @param {string} id Job ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getJob: async (id: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('getJob', 'id', id) + const localVarPath = `/jobs/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary List jobs + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listJobs: async (options: any = {}): Promise => { + const localVarPath = `/jobs`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Start a new job + * @param {JobForm} job New job + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + runJob: async (job: JobForm, options: any = {}): Promise => { + // verify required parameter 'job' is not null or undefined + assertParamExists('runJob', 'job', job) + const localVarPath = `/jobs`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(job, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Update an existing job + * @param {string} id Job ID + * @param {Job} job Job object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateJob: async (id: string, job: Job, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('updateJob', 'id', id) + // verify required parameter 'job' is not null or undefined + assertParamExists('updateJob', 'job', job) + const localVarPath = `/jobs/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(job, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * JobsApi - functional programming interface + * @export + */ +export const JobsApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = JobsApiAxiosParamCreator(configuration) + return { + /** + * + * @summary Get a single job + * @param {string} id Job ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getJob(id: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getJob(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary List jobs + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async listJobs(options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { + const localVarAxiosArgs = await localVarAxiosParamCreator.listJobs(options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Start a new job + * @param {JobForm} job New job + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async runJob(job: JobForm, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.runJob(job, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Update an existing job + * @param {string} id Job ID + * @param {Job} job Job object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async updateJob(id: string, job: Job, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.updateJob(id, job, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * JobsApi - factory interface + * @export + */ +export const JobsApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = JobsApiFp(configuration) + return { + /** + * + * @summary Get a single job + * @param {string} id Job ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getJob(id: string, options?: any): AxiosPromise { + return localVarFp.getJob(id, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary List jobs + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listJobs(options?: any): AxiosPromise> { + return localVarFp.listJobs(options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Start a new job + * @param {JobForm} job New job + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + runJob(job: JobForm, options?: any): AxiosPromise { + return localVarFp.runJob(job, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Update an existing job + * @param {string} id Job ID + * @param {Job} job Job object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateJob(id: string, job: Job, options?: any): AxiosPromise { + return localVarFp.updateJob(id, job, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * JobsApi - object-oriented interface + * @export + * @class JobsApi + * @extends {BaseAPI} + */ +export class JobsApi extends BaseAPI { + /** + * + * @summary Get a single job + * @param {string} id Job ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof JobsApi + */ + public getJob(id: string, options?: any) { + return JobsApiFp(this.configuration).getJob(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary List jobs + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof JobsApi + */ + public listJobs(options?: any) { + return JobsApiFp(this.configuration).listJobs(options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Start a new job + * @param {JobForm} job New job + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof JobsApi + */ + public runJob(job: JobForm, options?: any) { + return JobsApiFp(this.configuration).runJob(job, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Update an existing job + * @param {string} id Job ID + * @param {Job} job Job object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof JobsApi + */ + public updateJob(id: string, job: Job, options?: any) { + return JobsApiFp(this.configuration).updateJob(id, job, options).then((request) => request(this.axios, this.basePath)); + } +} + + +/** + * LogsApi - axios parameter creator + * @export + */ +export const LogsApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @summary Get log entries + * @param {string} reference Reference + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getLogs: async (reference: string, options: any = {}): Promise => { + // verify required parameter 'reference' is not null or undefined + assertParamExists('getLogs', 'reference', reference) + const localVarPath = `/logs/{reference}` + .replace(`{${"reference"}}`, encodeURIComponent(String(reference))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * LogsApi - functional programming interface + * @export + */ +export const LogsApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = LogsApiAxiosParamCreator(configuration) + return { + /** + * + * @summary Get log entries + * @param {string} reference Reference + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getLogs(reference: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getLogs(reference, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * LogsApi - factory interface + * @export + */ +export const LogsApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = LogsApiFp(configuration) + return { + /** + * + * @summary Get log entries + * @param {string} reference Reference + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getLogs(reference: string, options?: any): AxiosPromise> { + return localVarFp.getLogs(reference, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * LogsApi - object-oriented interface + * @export + * @class LogsApi + * @extends {BaseAPI} + */ +export class LogsApi extends BaseAPI { + /** + * + * @summary Get log entries + * @param {string} reference Reference + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof LogsApi + */ + public getLogs(reference: string, options?: any) { + return LogsApiFp(this.configuration).getLogs(reference, options).then((request) => request(this.axios, this.basePath)); + } +} + + +/** + * PlaybooksApi - axios parameter creator + * @export + */ +export const PlaybooksApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @summary Create a playbook + * @param {PlaybookTemplateForm} playbook New playbook + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createPlaybook: async (playbook: PlaybookTemplateForm, options: any = {}): Promise => { + // verify required parameter 'playbook' is not null or undefined + assertParamExists('createPlaybook', 'playbook', playbook) + const localVarPath = `/playbooks`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(playbook, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Delete a playbook + * @param {string} id Playbook name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deletePlaybook: async (id: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('deletePlaybook', 'id', id) + const localVarPath = `/playbooks/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Get a single playbook + * @param {string} id Playbook name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getPlaybook: async (id: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('getPlaybook', 'id', id) + const localVarPath = `/playbooks/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary List playbooks + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listPlaybooks: async (options: any = {}): Promise => { + const localVarPath = `/playbooks`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Update an existing ticket playbook + * @param {string} id Playbook ID + * @param {PlaybookTemplateForm} playbook Updated playbook + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updatePlaybook: async (id: string, playbook: PlaybookTemplateForm, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('updatePlaybook', 'id', id) + // verify required parameter 'playbook' is not null or undefined + assertParamExists('updatePlaybook', 'playbook', playbook) + const localVarPath = `/playbooks/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(playbook, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * PlaybooksApi - functional programming interface + * @export + */ +export const PlaybooksApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = PlaybooksApiAxiosParamCreator(configuration) + return { + /** + * + * @summary Create a playbook + * @param {PlaybookTemplateForm} playbook New playbook + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async createPlaybook(playbook: PlaybookTemplateForm, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { + const localVarAxiosArgs = await localVarAxiosParamCreator.createPlaybook(playbook, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Delete a playbook + * @param {string} id Playbook name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async deletePlaybook(id: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.deletePlaybook(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Get a single playbook + * @param {string} id Playbook name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getPlaybook(id: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getPlaybook(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary List playbooks + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async listPlaybooks(options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { + const localVarAxiosArgs = await localVarAxiosParamCreator.listPlaybooks(options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Update an existing ticket playbook + * @param {string} id Playbook ID + * @param {PlaybookTemplateForm} playbook Updated playbook + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async updatePlaybook(id: string, playbook: PlaybookTemplateForm, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.updatePlaybook(id, playbook, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * PlaybooksApi - factory interface + * @export + */ +export const PlaybooksApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = PlaybooksApiFp(configuration) + return { + /** + * + * @summary Create a playbook + * @param {PlaybookTemplateForm} playbook New playbook + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createPlaybook(playbook: PlaybookTemplateForm, options?: any): AxiosPromise> { + return localVarFp.createPlaybook(playbook, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Delete a playbook + * @param {string} id Playbook name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deletePlaybook(id: string, options?: any): AxiosPromise { + return localVarFp.deletePlaybook(id, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Get a single playbook + * @param {string} id Playbook name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getPlaybook(id: string, options?: any): AxiosPromise { + return localVarFp.getPlaybook(id, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary List playbooks + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listPlaybooks(options?: any): AxiosPromise> { + return localVarFp.listPlaybooks(options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Update an existing ticket playbook + * @param {string} id Playbook ID + * @param {PlaybookTemplateForm} playbook Updated playbook + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updatePlaybook(id: string, playbook: PlaybookTemplateForm, options?: any): AxiosPromise { + return localVarFp.updatePlaybook(id, playbook, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * PlaybooksApi - object-oriented interface + * @export + * @class PlaybooksApi + * @extends {BaseAPI} + */ +export class PlaybooksApi extends BaseAPI { + /** + * + * @summary Create a playbook + * @param {PlaybookTemplateForm} playbook New playbook + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaybooksApi + */ + public createPlaybook(playbook: PlaybookTemplateForm, options?: any) { + return PlaybooksApiFp(this.configuration).createPlaybook(playbook, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Delete a playbook + * @param {string} id Playbook name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaybooksApi + */ + public deletePlaybook(id: string, options?: any) { + return PlaybooksApiFp(this.configuration).deletePlaybook(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Get a single playbook + * @param {string} id Playbook name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaybooksApi + */ + public getPlaybook(id: string, options?: any) { + return PlaybooksApiFp(this.configuration).getPlaybook(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary List playbooks + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaybooksApi + */ + public listPlaybooks(options?: any) { + return PlaybooksApiFp(this.configuration).listPlaybooks(options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Update an existing ticket playbook + * @param {string} id Playbook ID + * @param {PlaybookTemplateForm} playbook Updated playbook + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaybooksApi + */ + public updatePlaybook(id: string, playbook: PlaybookTemplateForm, options?: any) { + return PlaybooksApiFp(this.configuration).updatePlaybook(id, playbook, options).then((request) => request(this.axios, this.basePath)); + } +} + + +/** + * RulesApi - axios parameter creator + * @export + */ +export const RulesApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @summary Create a rule + * @param {RuleForm} rule New rule + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createRule: async (rule: RuleForm, options: any = {}): Promise => { + // verify required parameter 'rule' is not null or undefined + assertParamExists('createRule', 'rule', rule) + const localVarPath = `/rules`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(rule, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Delete a rule + * @param {string} id Rule name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deleteRule: async (id: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('deleteRule', 'id', id) + const localVarPath = `/rules/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Get a single rule + * @param {string} id Rule name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getRule: async (id: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('getRule', 'id', id) + const localVarPath = `/rules/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary List rules + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listRules: async (options: any = {}): Promise => { + const localVarPath = `/rules`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Update an existing ticket rule + * @param {string} id Rule ID + * @param {RuleForm} rule Updated rule + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateRule: async (id: string, rule: RuleForm, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('updateRule', 'id', id) + // verify required parameter 'rule' is not null or undefined + assertParamExists('updateRule', 'rule', rule) + const localVarPath = `/rules/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(rule, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * RulesApi - functional programming interface + * @export + */ +export const RulesApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = RulesApiAxiosParamCreator(configuration) + return { + /** + * + * @summary Create a rule + * @param {RuleForm} rule New rule + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async createRule(rule: RuleForm, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { + const localVarAxiosArgs = await localVarAxiosParamCreator.createRule(rule, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Delete a rule + * @param {string} id Rule name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async deleteRule(id: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.deleteRule(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Get a single rule + * @param {string} id Rule name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getRule(id: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getRule(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary List rules + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async listRules(options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { + const localVarAxiosArgs = await localVarAxiosParamCreator.listRules(options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Update an existing ticket rule + * @param {string} id Rule ID + * @param {RuleForm} rule Updated rule + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async updateRule(id: string, rule: RuleForm, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.updateRule(id, rule, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * RulesApi - factory interface + * @export + */ +export const RulesApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = RulesApiFp(configuration) + return { + /** + * + * @summary Create a rule + * @param {RuleForm} rule New rule + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createRule(rule: RuleForm, options?: any): AxiosPromise> { + return localVarFp.createRule(rule, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Delete a rule + * @param {string} id Rule name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deleteRule(id: string, options?: any): AxiosPromise { + return localVarFp.deleteRule(id, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Get a single rule + * @param {string} id Rule name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getRule(id: string, options?: any): AxiosPromise { + return localVarFp.getRule(id, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary List rules + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listRules(options?: any): AxiosPromise> { + return localVarFp.listRules(options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Update an existing ticket rule + * @param {string} id Rule ID + * @param {RuleForm} rule Updated rule + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateRule(id: string, rule: RuleForm, options?: any): AxiosPromise { + return localVarFp.updateRule(id, rule, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * RulesApi - object-oriented interface + * @export + * @class RulesApi + * @extends {BaseAPI} + */ +export class RulesApi extends BaseAPI { + /** + * + * @summary Create a rule + * @param {RuleForm} rule New rule + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof RulesApi + */ + public createRule(rule: RuleForm, options?: any) { + return RulesApiFp(this.configuration).createRule(rule, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Delete a rule + * @param {string} id Rule name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof RulesApi + */ + public deleteRule(id: string, options?: any) { + return RulesApiFp(this.configuration).deleteRule(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Get a single rule + * @param {string} id Rule name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof RulesApi + */ + public getRule(id: string, options?: any) { + return RulesApiFp(this.configuration).getRule(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary List rules + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof RulesApi + */ + public listRules(options?: any) { + return RulesApiFp(this.configuration).listRules(options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Update an existing ticket rule + * @param {string} id Rule ID + * @param {RuleForm} rule Updated rule + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof RulesApi + */ + public updateRule(id: string, rule: RuleForm, options?: any) { + return RulesApiFp(this.configuration).updateRule(id, rule, options).then((request) => request(this.axios, this.basePath)); + } +} + + +/** + * SettingsApi - axios parameter creator + * @export + */ +export const SettingsApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @summary Get settings + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getSettings: async (options: any = {}): Promise => { + const localVarPath = `/settings`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * SettingsApi - functional programming interface + * @export + */ +export const SettingsApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = SettingsApiAxiosParamCreator(configuration) + return { + /** + * + * @summary Get settings + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getSettings(options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getSettings(options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * SettingsApi - factory interface + * @export + */ +export const SettingsApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = SettingsApiFp(configuration) + return { + /** + * + * @summary Get settings + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getSettings(options?: any): AxiosPromise { + return localVarFp.getSettings(options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * SettingsApi - object-oriented interface + * @export + * @class SettingsApi + * @extends {BaseAPI} + */ +export class SettingsApi extends BaseAPI { + /** + * + * @summary Get settings + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof SettingsApi + */ + public getSettings(options?: any) { + return SettingsApiFp(this.configuration).getSettings(options).then((request) => request(this.axios, this.basePath)); + } +} + + +/** + * StatisticsApi - axios parameter creator + * @export + */ +export const StatisticsApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @summary Get statistics + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getStatistics: async (options: any = {}): Promise => { + const localVarPath = `/statistics`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * StatisticsApi - functional programming interface + * @export + */ +export const StatisticsApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = StatisticsApiAxiosParamCreator(configuration) + return { + /** + * + * @summary Get statistics + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getStatistics(options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getStatistics(options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * StatisticsApi - factory interface + * @export + */ +export const StatisticsApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = StatisticsApiFp(configuration) + return { + /** + * + * @summary Get statistics + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getStatistics(options?: any): AxiosPromise { + return localVarFp.getStatistics(options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * StatisticsApi - object-oriented interface + * @export + * @class StatisticsApi + * @extends {BaseAPI} + */ +export class StatisticsApi extends BaseAPI { + /** + * + * @summary Get statistics + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof StatisticsApi + */ + public getStatistics(options?: any) { + return StatisticsApiFp(this.configuration).getStatistics(options).then((request) => request(this.axios, this.basePath)); + } +} + + +/** + * TasksApi - axios parameter creator + * @export + */ +export const TasksApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @summary List tasks + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listTasks: async (options: any = {}): Promise => { + const localVarPath = `/tasks`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * TasksApi - functional programming interface + * @export + */ +export const TasksApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = TasksApiAxiosParamCreator(configuration) + return { + /** + * + * @summary List tasks + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async listTasks(options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { + const localVarAxiosArgs = await localVarAxiosParamCreator.listTasks(options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * TasksApi - factory interface + * @export + */ +export const TasksApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = TasksApiFp(configuration) + return { + /** + * + * @summary List tasks + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listTasks(options?: any): AxiosPromise> { + return localVarFp.listTasks(options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * TasksApi - object-oriented interface + * @export + * @class TasksApi + * @extends {BaseAPI} + */ +export class TasksApi extends BaseAPI { + /** + * + * @summary List tasks + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TasksApi + */ + public listTasks(options?: any) { + return TasksApiFp(this.configuration).listTasks(options).then((request) => request(this.axios, this.basePath)); + } +} + + +/** + * TemplatesApi - axios parameter creator + * @export + */ +export const TemplatesApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @summary Create a new template + * @param {TicketTemplateForm} template New template + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createTemplate: async (template: TicketTemplateForm, options: any = {}): Promise => { + // verify required parameter 'template' is not null or undefined + assertParamExists('createTemplate', 'template', template) + const localVarPath = `/templates`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(template, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Delete a template + * @param {string} id Template ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deleteTemplate: async (id: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('deleteTemplate', 'id', id) + const localVarPath = `/templates/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Get a single template + * @param {string} id Template ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getTemplate: async (id: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('getTemplate', 'id', id) + const localVarPath = `/templates/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary List templates + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listTemplates: async (options: any = {}): Promise => { + const localVarPath = `/templates`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Update an existing template + * @param {string} id Template ID + * @param {TicketTemplateForm} template Template object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateTemplate: async (id: string, template: TicketTemplateForm, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('updateTemplate', 'id', id) + // verify required parameter 'template' is not null or undefined + assertParamExists('updateTemplate', 'template', template) + const localVarPath = `/templates/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(template, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * TemplatesApi - functional programming interface + * @export + */ +export const TemplatesApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = TemplatesApiAxiosParamCreator(configuration) + return { + /** + * + * @summary Create a new template + * @param {TicketTemplateForm} template New template + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async createTemplate(template: TicketTemplateForm, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.createTemplate(template, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Delete a template + * @param {string} id Template ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async deleteTemplate(id: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.deleteTemplate(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Get a single template + * @param {string} id Template ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getTemplate(id: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getTemplate(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary List templates + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async listTemplates(options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { + const localVarAxiosArgs = await localVarAxiosParamCreator.listTemplates(options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Update an existing template + * @param {string} id Template ID + * @param {TicketTemplateForm} template Template object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async updateTemplate(id: string, template: TicketTemplateForm, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.updateTemplate(id, template, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * TemplatesApi - factory interface + * @export + */ +export const TemplatesApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = TemplatesApiFp(configuration) + return { + /** + * + * @summary Create a new template + * @param {TicketTemplateForm} template New template + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createTemplate(template: TicketTemplateForm, options?: any): AxiosPromise { + return localVarFp.createTemplate(template, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Delete a template + * @param {string} id Template ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deleteTemplate(id: string, options?: any): AxiosPromise { + return localVarFp.deleteTemplate(id, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Get a single template + * @param {string} id Template ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getTemplate(id: string, options?: any): AxiosPromise { + return localVarFp.getTemplate(id, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary List templates + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listTemplates(options?: any): AxiosPromise> { + return localVarFp.listTemplates(options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Update an existing template + * @param {string} id Template ID + * @param {TicketTemplateForm} template Template object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateTemplate(id: string, template: TicketTemplateForm, options?: any): AxiosPromise { + return localVarFp.updateTemplate(id, template, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * TemplatesApi - object-oriented interface + * @export + * @class TemplatesApi + * @extends {BaseAPI} + */ +export class TemplatesApi extends BaseAPI { + /** + * + * @summary Create a new template + * @param {TicketTemplateForm} template New template + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TemplatesApi + */ + public createTemplate(template: TicketTemplateForm, options?: any) { + return TemplatesApiFp(this.configuration).createTemplate(template, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Delete a template + * @param {string} id Template ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TemplatesApi + */ + public deleteTemplate(id: string, options?: any) { + return TemplatesApiFp(this.configuration).deleteTemplate(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Get a single template + * @param {string} id Template ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TemplatesApi + */ + public getTemplate(id: string, options?: any) { + return TemplatesApiFp(this.configuration).getTemplate(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary List templates + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TemplatesApi + */ + public listTemplates(options?: any) { + return TemplatesApiFp(this.configuration).listTemplates(options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Update an existing template + * @param {string} id Template ID + * @param {TicketTemplateForm} template Template object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TemplatesApi + */ + public updateTemplate(id: string, template: TicketTemplateForm, options?: any) { + return TemplatesApiFp(this.configuration).updateTemplate(id, template, options).then((request) => request(this.axios, this.basePath)); + } +} + + +/** + * TicketsApi - axios parameter creator + * @export + */ +export const TicketsApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @summary Add a single artifact + * @param {number} id Ticket ID + * @param {Artifact} artifact Artifact object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + addArtifact: async (id: number, artifact: Artifact, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('addArtifact', 'id', id) + // verify required parameter 'artifact' is not null or undefined + assertParamExists('addArtifact', 'artifact', artifact) + const localVarPath = `/tickets/{id}/artifacts` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(artifact, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Add ticket comment + * @param {number} id Ticket ID + * @param {CommentForm} comment Ticket comment + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + addComment: async (id: number, comment: CommentForm, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('addComment', 'id', id) + // verify required parameter 'comment' is not null or undefined + assertParamExists('addComment', 'comment', comment) + const localVarPath = `/tickets/{id}/comments` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(comment, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Add a new ticket playbook + * @param {number} id Ticket ID + * @param {PlaybookTemplateForm} playbook Ticket playbook object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + addTicketPlaybook: async (id: number, playbook: PlaybookTemplateForm, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('addTicketPlaybook', 'id', id) + // verify required parameter 'playbook' is not null or undefined + assertParamExists('addTicketPlaybook', 'playbook', playbook) + const localVarPath = `/tickets/{id}/playbooks` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(playbook, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Complete ticket playbook task + * @param {number} id Ticket ID + * @param {string} playbookID Playbook ID + * @param {string} taskID Task ID + * @param {object} data Ticket playbook object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + completeTask: async (id: number, playbookID: string, taskID: string, data: object, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('completeTask', 'id', id) + // verify required parameter 'playbookID' is not null or undefined + assertParamExists('completeTask', 'playbookID', playbookID) + // verify required parameter 'taskID' is not null or undefined + assertParamExists('completeTask', 'taskID', taskID) + // verify required parameter 'data' is not null or undefined + assertParamExists('completeTask', 'data', data) + const localVarPath = `/tickets/{id}/playbooks/{playbookID}/task/{taskID}/complete` + .replace(`{${"id"}}`, encodeURIComponent(String(id))) + .replace(`{${"playbookID"}}`, encodeURIComponent(String(playbookID))) + .replace(`{${"taskID"}}`, encodeURIComponent(String(taskID))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(data, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Create a new ticket + * @param {TicketForm} ticket New ticket + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createTicket: async (ticket: TicketForm, options: any = {}): Promise => { + // verify required parameter 'ticket' is not null or undefined + assertParamExists('createTicket', 'ticket', ticket) + const localVarPath = `/tickets`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(ticket, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Create a new tickets in batch + * @param {Array} ticket New ticket + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createTicketBatch: async (ticket: Array, options: any = {}): Promise => { + // verify required parameter 'ticket' is not null or undefined + assertParamExists('createTicketBatch', 'ticket', ticket) + const localVarPath = `/tickets/batch`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(ticket, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Delete an ticket + * @param {number} id Ticket ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deleteTicket: async (id: number, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('deleteTicket', 'id', id) + const localVarPath = `/tickets/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Enrich a single artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {EnrichmentForm} data + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + enrichArtifact: async (id: number, name: string, data: EnrichmentForm, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('enrichArtifact', 'id', id) + // verify required parameter 'name' is not null or undefined + assertParamExists('enrichArtifact', 'name', name) + // verify required parameter 'data' is not null or undefined + assertParamExists('enrichArtifact', 'data', data) + const localVarPath = `/tickets/{id}/artifacts/{name}/enrich` + .replace(`{${"id"}}`, encodeURIComponent(String(id))) + .replace(`{${"name"}}`, encodeURIComponent(String(name))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(data, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Get a single artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getArtifact: async (id: number, name: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('getArtifact', 'id', id) + // verify required parameter 'name' is not null or undefined + assertParamExists('getArtifact', 'name', name) + const localVarPath = `/tickets/{id}/artifacts/{name}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))) + .replace(`{${"name"}}`, encodeURIComponent(String(name))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Get a single ticket + * @param {number} id Ticket ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getTicket: async (id: number, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('getTicket', 'id', id) + const localVarPath = `/tickets/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Link files to an ticket. The files themself will be stored in object storage. + * @summary Link files to an ticket + * @param {number} id Ticket ID + * @param {Array} files Added files + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + linkFiles: async (id: number, files: Array, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('linkFiles', 'id', id) + // verify required parameter 'files' is not null or undefined + assertParamExists('linkFiles', 'files', files) + const localVarPath = `/tickets/{id}/files` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(files, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Link an ticket to an ticket + * @param {number} id Ticket ID + * @param {number} linkedID Added ticket ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + linkTicket: async (id: number, linkedID: number, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('linkTicket', 'id', id) + // verify required parameter 'linkedID' is not null or undefined + assertParamExists('linkTicket', 'linkedID', linkedID) + const localVarPath = `/tickets/{id}/tickets` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PATCH', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(linkedID, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary List tickets + * @param {string} [type] Ticket Type + * @param {number} [offset] Offset of the list + * @param {number} [count] Number of tickets + * @param {Array} [sort] Sort columns + * @param {Array} [desc] Sort descending + * @param {string} [query] Search query + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listTickets: async (type?: string, offset?: number, count?: number, sort?: Array, desc?: Array, query?: string, options: any = {}): Promise => { + const localVarPath = `/tickets`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + if (type !== undefined) { + localVarQueryParameter['type'] = type; + } + + if (offset !== undefined) { + localVarQueryParameter['offset'] = offset; + } + + if (count !== undefined) { + localVarQueryParameter['count'] = count; + } + + if (sort) { + localVarQueryParameter['sort'] = sort.join(COLLECTION_FORMATS.csv); + } + + if (desc) { + localVarQueryParameter['desc'] = desc.join(COLLECTION_FORMATS.csv); + } + + if (query !== undefined) { + localVarQueryParameter['query'] = query; + } + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Remove an artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + removeArtifact: async (id: number, name: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('removeArtifact', 'id', id) + // verify required parameter 'name' is not null or undefined + assertParamExists('removeArtifact', 'name', name) + const localVarPath = `/tickets/{id}/artifacts/{name}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))) + .replace(`{${"name"}}`, encodeURIComponent(String(name))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Comment will be removed from the ticket. + * @summary Remove an comment from an ticket + * @param {number} id Ticket ID + * @param {number} commentID Comment ID to remove + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + removeComment: async (id: number, commentID: number, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('removeComment', 'id', id) + // verify required parameter 'commentID' is not null or undefined + assertParamExists('removeComment', 'commentID', commentID) + const localVarPath = `/tickets/{id}/comments/{commentID}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))) + .replace(`{${"commentID"}}`, encodeURIComponent(String(commentID))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Remove an ticket playbook + * @param {number} id Ticket ID + * @param {string} playbookID Playbook ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + removeTicketPlaybook: async (id: number, playbookID: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('removeTicketPlaybook', 'id', id) + // verify required parameter 'playbookID' is not null or undefined + assertParamExists('removeTicketPlaybook', 'playbookID', playbookID) + const localVarPath = `/tickets/{id}/playbooks/{playbookID}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))) + .replace(`{${"playbookID"}}`, encodeURIComponent(String(playbookID))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Run automation on a single artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {string} automation + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + runArtifact: async (id: number, name: string, automation: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('runArtifact', 'id', id) + // verify required parameter 'name' is not null or undefined + assertParamExists('runArtifact', 'name', name) + // verify required parameter 'automation' is not null or undefined + assertParamExists('runArtifact', 'automation', automation) + const localVarPath = `/tickets/{id}/artifacts/{name}/run/{automation}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))) + .replace(`{${"name"}}`, encodeURIComponent(String(name))) + .replace(`{${"automation"}}`, encodeURIComponent(String(automation))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Run ticket playbook task + * @param {number} id Ticket ID + * @param {string} playbookID Playbook ID + * @param {string} taskID Task ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + runTask: async (id: number, playbookID: string, taskID: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('runTask', 'id', id) + // verify required parameter 'playbookID' is not null or undefined + assertParamExists('runTask', 'playbookID', playbookID) + // verify required parameter 'taskID' is not null or undefined + assertParamExists('runTask', 'taskID', taskID) + const localVarPath = `/tickets/{id}/playbooks/{playbookID}/task/{taskID}/run` + .replace(`{${"id"}}`, encodeURIComponent(String(id))) + .replace(`{${"playbookID"}}`, encodeURIComponent(String(playbookID))) + .replace(`{${"taskID"}}`, encodeURIComponent(String(taskID))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Set a single artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {Artifact} artifact + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + setArtifact: async (id: number, name: string, artifact: Artifact, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('setArtifact', 'id', id) + // verify required parameter 'name' is not null or undefined + assertParamExists('setArtifact', 'name', name) + // verify required parameter 'artifact' is not null or undefined + assertParamExists('setArtifact', 'artifact', artifact) + const localVarPath = `/tickets/{id}/artifacts/{name}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))) + .replace(`{${"name"}}`, encodeURIComponent(String(name))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(artifact, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Set ticket references + * @param {number} id Ticket ID + * @param {Array} references All ticket references + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + setReferences: async (id: number, references: Array, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('setReferences', 'id', id) + // verify required parameter 'references' is not null or undefined + assertParamExists('setReferences', 'references', references) + const localVarPath = `/tickets/{id}/references` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(references, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Set ticket schema + * @param {number} id Ticket ID + * @param {string} [schema] New ticket schema + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + setSchema: async (id: number, schema?: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('setSchema', 'id', id) + const localVarPath = `/tickets/{id}/schema` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(schema, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Set a ticket playbook task + * @param {number} id Ticket ID + * @param {string} playbookID Playbook ID + * @param {string} taskID Task ID + * @param {Task} task Task + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + setTask: async (id: number, playbookID: string, taskID: string, task: Task, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('setTask', 'id', id) + // verify required parameter 'playbookID' is not null or undefined + assertParamExists('setTask', 'playbookID', playbookID) + // verify required parameter 'taskID' is not null or undefined + assertParamExists('setTask', 'taskID', taskID) + // verify required parameter 'task' is not null or undefined + assertParamExists('setTask', 'task', task) + const localVarPath = `/tickets/{id}/playbooks/{playbookID}/task/{taskID}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))) + .replace(`{${"playbookID"}}`, encodeURIComponent(String(playbookID))) + .replace(`{${"taskID"}}`, encodeURIComponent(String(taskID))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(task, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Unlink an ticket to an ticket + * @param {number} id Ticket ID + * @param {number} linkedID Added ticket ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + unlinkTicket: async (id: number, linkedID: number, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('unlinkTicket', 'id', id) + // verify required parameter 'linkedID' is not null or undefined + assertParamExists('unlinkTicket', 'linkedID', linkedID) + const localVarPath = `/tickets/{id}/tickets` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(linkedID, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Update an existing ticket + * @param {number} id Ticket ID + * @param {Ticket} ticket Updated ticket + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateTicket: async (id: number, ticket: Ticket, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('updateTicket', 'id', id) + // verify required parameter 'ticket' is not null or undefined + assertParamExists('updateTicket', 'ticket', ticket) + const localVarPath = `/tickets/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(ticket, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * TicketsApi - functional programming interface + * @export + */ +export const TicketsApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = TicketsApiAxiosParamCreator(configuration) + return { + /** + * + * @summary Add a single artifact + * @param {number} id Ticket ID + * @param {Artifact} artifact Artifact object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async addArtifact(id: number, artifact: Artifact, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.addArtifact(id, artifact, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Add ticket comment + * @param {number} id Ticket ID + * @param {CommentForm} comment Ticket comment + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async addComment(id: number, comment: CommentForm, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.addComment(id, comment, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Add a new ticket playbook + * @param {number} id Ticket ID + * @param {PlaybookTemplateForm} playbook Ticket playbook object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async addTicketPlaybook(id: number, playbook: PlaybookTemplateForm, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.addTicketPlaybook(id, playbook, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Complete ticket playbook task + * @param {number} id Ticket ID + * @param {string} playbookID Playbook ID + * @param {string} taskID Task ID + * @param {object} data Ticket playbook object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async completeTask(id: number, playbookID: string, taskID: string, data: object, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.completeTask(id, playbookID, taskID, data, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Create a new ticket + * @param {TicketForm} ticket New ticket + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async createTicket(ticket: TicketForm, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.createTicket(ticket, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Create a new tickets in batch + * @param {Array} ticket New ticket + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async createTicketBatch(ticket: Array, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.createTicketBatch(ticket, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Delete an ticket + * @param {number} id Ticket ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async deleteTicket(id: number, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.deleteTicket(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Enrich a single artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {EnrichmentForm} data + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async enrichArtifact(id: number, name: string, data: EnrichmentForm, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.enrichArtifact(id, name, data, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Get a single artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getArtifact(id: number, name: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getArtifact(id, name, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Get a single ticket + * @param {number} id Ticket ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getTicket(id: number, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getTicket(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * Link files to an ticket. The files themself will be stored in object storage. + * @summary Link files to an ticket + * @param {number} id Ticket ID + * @param {Array} files Added files + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async linkFiles(id: number, files: Array, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.linkFiles(id, files, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Link an ticket to an ticket + * @param {number} id Ticket ID + * @param {number} linkedID Added ticket ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async linkTicket(id: number, linkedID: number, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.linkTicket(id, linkedID, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary List tickets + * @param {string} [type] Ticket Type + * @param {number} [offset] Offset of the list + * @param {number} [count] Number of tickets + * @param {Array} [sort] Sort columns + * @param {Array} [desc] Sort descending + * @param {string} [query] Search query + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async listTickets(type?: string, offset?: number, count?: number, sort?: Array, desc?: Array, query?: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.listTickets(type, offset, count, sort, desc, query, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Remove an artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async removeArtifact(id: number, name: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.removeArtifact(id, name, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * Comment will be removed from the ticket. + * @summary Remove an comment from an ticket + * @param {number} id Ticket ID + * @param {number} commentID Comment ID to remove + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async removeComment(id: number, commentID: number, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.removeComment(id, commentID, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Remove an ticket playbook + * @param {number} id Ticket ID + * @param {string} playbookID Playbook ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async removeTicketPlaybook(id: number, playbookID: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.removeTicketPlaybook(id, playbookID, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Run automation on a single artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {string} automation + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async runArtifact(id: number, name: string, automation: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.runArtifact(id, name, automation, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Run ticket playbook task + * @param {number} id Ticket ID + * @param {string} playbookID Playbook ID + * @param {string} taskID Task ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async runTask(id: number, playbookID: string, taskID: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.runTask(id, playbookID, taskID, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Set a single artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {Artifact} artifact + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async setArtifact(id: number, name: string, artifact: Artifact, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.setArtifact(id, name, artifact, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Set ticket references + * @param {number} id Ticket ID + * @param {Array} references All ticket references + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async setReferences(id: number, references: Array, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.setReferences(id, references, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Set ticket schema + * @param {number} id Ticket ID + * @param {string} [schema] New ticket schema + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async setSchema(id: number, schema?: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.setSchema(id, schema, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Set a ticket playbook task + * @param {number} id Ticket ID + * @param {string} playbookID Playbook ID + * @param {string} taskID Task ID + * @param {Task} task Task + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async setTask(id: number, playbookID: string, taskID: string, task: Task, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.setTask(id, playbookID, taskID, task, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Unlink an ticket to an ticket + * @param {number} id Ticket ID + * @param {number} linkedID Added ticket ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async unlinkTicket(id: number, linkedID: number, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.unlinkTicket(id, linkedID, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Update an existing ticket + * @param {number} id Ticket ID + * @param {Ticket} ticket Updated ticket + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async updateTicket(id: number, ticket: Ticket, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.updateTicket(id, ticket, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * TicketsApi - factory interface + * @export + */ +export const TicketsApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = TicketsApiFp(configuration) + return { + /** + * + * @summary Add a single artifact + * @param {number} id Ticket ID + * @param {Artifact} artifact Artifact object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + addArtifact(id: number, artifact: Artifact, options?: any): AxiosPromise { + return localVarFp.addArtifact(id, artifact, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Add ticket comment + * @param {number} id Ticket ID + * @param {CommentForm} comment Ticket comment + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + addComment(id: number, comment: CommentForm, options?: any): AxiosPromise { + return localVarFp.addComment(id, comment, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Add a new ticket playbook + * @param {number} id Ticket ID + * @param {PlaybookTemplateForm} playbook Ticket playbook object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + addTicketPlaybook(id: number, playbook: PlaybookTemplateForm, options?: any): AxiosPromise { + return localVarFp.addTicketPlaybook(id, playbook, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Complete ticket playbook task + * @param {number} id Ticket ID + * @param {string} playbookID Playbook ID + * @param {string} taskID Task ID + * @param {object} data Ticket playbook object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + completeTask(id: number, playbookID: string, taskID: string, data: object, options?: any): AxiosPromise { + return localVarFp.completeTask(id, playbookID, taskID, data, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Create a new ticket + * @param {TicketForm} ticket New ticket + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createTicket(ticket: TicketForm, options?: any): AxiosPromise { + return localVarFp.createTicket(ticket, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Create a new tickets in batch + * @param {Array} ticket New ticket + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createTicketBatch(ticket: Array, options?: any): AxiosPromise { + return localVarFp.createTicketBatch(ticket, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Delete an ticket + * @param {number} id Ticket ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deleteTicket(id: number, options?: any): AxiosPromise { + return localVarFp.deleteTicket(id, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Enrich a single artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {EnrichmentForm} data + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + enrichArtifact(id: number, name: string, data: EnrichmentForm, options?: any): AxiosPromise { + return localVarFp.enrichArtifact(id, name, data, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Get a single artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getArtifact(id: number, name: string, options?: any): AxiosPromise { + return localVarFp.getArtifact(id, name, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Get a single ticket + * @param {number} id Ticket ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getTicket(id: number, options?: any): AxiosPromise { + return localVarFp.getTicket(id, options).then((request) => request(axios, basePath)); + }, + /** + * Link files to an ticket. The files themself will be stored in object storage. + * @summary Link files to an ticket + * @param {number} id Ticket ID + * @param {Array} files Added files + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + linkFiles(id: number, files: Array, options?: any): AxiosPromise { + return localVarFp.linkFiles(id, files, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Link an ticket to an ticket + * @param {number} id Ticket ID + * @param {number} linkedID Added ticket ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + linkTicket(id: number, linkedID: number, options?: any): AxiosPromise { + return localVarFp.linkTicket(id, linkedID, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary List tickets + * @param {string} [type] Ticket Type + * @param {number} [offset] Offset of the list + * @param {number} [count] Number of tickets + * @param {Array} [sort] Sort columns + * @param {Array} [desc] Sort descending + * @param {string} [query] Search query + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listTickets(type?: string, offset?: number, count?: number, sort?: Array, desc?: Array, query?: string, options?: any): AxiosPromise { + return localVarFp.listTickets(type, offset, count, sort, desc, query, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Remove an artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + removeArtifact(id: number, name: string, options?: any): AxiosPromise { + return localVarFp.removeArtifact(id, name, options).then((request) => request(axios, basePath)); + }, + /** + * Comment will be removed from the ticket. + * @summary Remove an comment from an ticket + * @param {number} id Ticket ID + * @param {number} commentID Comment ID to remove + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + removeComment(id: number, commentID: number, options?: any): AxiosPromise { + return localVarFp.removeComment(id, commentID, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Remove an ticket playbook + * @param {number} id Ticket ID + * @param {string} playbookID Playbook ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + removeTicketPlaybook(id: number, playbookID: string, options?: any): AxiosPromise { + return localVarFp.removeTicketPlaybook(id, playbookID, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Run automation on a single artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {string} automation + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + runArtifact(id: number, name: string, automation: string, options?: any): AxiosPromise { + return localVarFp.runArtifact(id, name, automation, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Run ticket playbook task + * @param {number} id Ticket ID + * @param {string} playbookID Playbook ID + * @param {string} taskID Task ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + runTask(id: number, playbookID: string, taskID: string, options?: any): AxiosPromise { + return localVarFp.runTask(id, playbookID, taskID, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Set a single artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {Artifact} artifact + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + setArtifact(id: number, name: string, artifact: Artifact, options?: any): AxiosPromise { + return localVarFp.setArtifact(id, name, artifact, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Set ticket references + * @param {number} id Ticket ID + * @param {Array} references All ticket references + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + setReferences(id: number, references: Array, options?: any): AxiosPromise { + return localVarFp.setReferences(id, references, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Set ticket schema + * @param {number} id Ticket ID + * @param {string} [schema] New ticket schema + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + setSchema(id: number, schema?: string, options?: any): AxiosPromise { + return localVarFp.setSchema(id, schema, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Set a ticket playbook task + * @param {number} id Ticket ID + * @param {string} playbookID Playbook ID + * @param {string} taskID Task ID + * @param {Task} task Task + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + setTask(id: number, playbookID: string, taskID: string, task: Task, options?: any): AxiosPromise { + return localVarFp.setTask(id, playbookID, taskID, task, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Unlink an ticket to an ticket + * @param {number} id Ticket ID + * @param {number} linkedID Added ticket ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + unlinkTicket(id: number, linkedID: number, options?: any): AxiosPromise { + return localVarFp.unlinkTicket(id, linkedID, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Update an existing ticket + * @param {number} id Ticket ID + * @param {Ticket} ticket Updated ticket + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateTicket(id: number, ticket: Ticket, options?: any): AxiosPromise { + return localVarFp.updateTicket(id, ticket, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * TicketsApi - object-oriented interface + * @export + * @class TicketsApi + * @extends {BaseAPI} + */ +export class TicketsApi extends BaseAPI { + /** + * + * @summary Add a single artifact + * @param {number} id Ticket ID + * @param {Artifact} artifact Artifact object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public addArtifact(id: number, artifact: Artifact, options?: any) { + return TicketsApiFp(this.configuration).addArtifact(id, artifact, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Add ticket comment + * @param {number} id Ticket ID + * @param {CommentForm} comment Ticket comment + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public addComment(id: number, comment: CommentForm, options?: any) { + return TicketsApiFp(this.configuration).addComment(id, comment, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Add a new ticket playbook + * @param {number} id Ticket ID + * @param {PlaybookTemplateForm} playbook Ticket playbook object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public addTicketPlaybook(id: number, playbook: PlaybookTemplateForm, options?: any) { + return TicketsApiFp(this.configuration).addTicketPlaybook(id, playbook, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Complete ticket playbook task + * @param {number} id Ticket ID + * @param {string} playbookID Playbook ID + * @param {string} taskID Task ID + * @param {object} data Ticket playbook object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public completeTask(id: number, playbookID: string, taskID: string, data: object, options?: any) { + return TicketsApiFp(this.configuration).completeTask(id, playbookID, taskID, data, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Create a new ticket + * @param {TicketForm} ticket New ticket + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public createTicket(ticket: TicketForm, options?: any) { + return TicketsApiFp(this.configuration).createTicket(ticket, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Create a new tickets in batch + * @param {Array} ticket New ticket + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public createTicketBatch(ticket: Array, options?: any) { + return TicketsApiFp(this.configuration).createTicketBatch(ticket, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Delete an ticket + * @param {number} id Ticket ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public deleteTicket(id: number, options?: any) { + return TicketsApiFp(this.configuration).deleteTicket(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Enrich a single artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {EnrichmentForm} data + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public enrichArtifact(id: number, name: string, data: EnrichmentForm, options?: any) { + return TicketsApiFp(this.configuration).enrichArtifact(id, name, data, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Get a single artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public getArtifact(id: number, name: string, options?: any) { + return TicketsApiFp(this.configuration).getArtifact(id, name, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Get a single ticket + * @param {number} id Ticket ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public getTicket(id: number, options?: any) { + return TicketsApiFp(this.configuration).getTicket(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Link files to an ticket. The files themself will be stored in object storage. + * @summary Link files to an ticket + * @param {number} id Ticket ID + * @param {Array} files Added files + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public linkFiles(id: number, files: Array, options?: any) { + return TicketsApiFp(this.configuration).linkFiles(id, files, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Link an ticket to an ticket + * @param {number} id Ticket ID + * @param {number} linkedID Added ticket ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public linkTicket(id: number, linkedID: number, options?: any) { + return TicketsApiFp(this.configuration).linkTicket(id, linkedID, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary List tickets + * @param {string} [type] Ticket Type + * @param {number} [offset] Offset of the list + * @param {number} [count] Number of tickets + * @param {Array} [sort] Sort columns + * @param {Array} [desc] Sort descending + * @param {string} [query] Search query + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public listTickets(type?: string, offset?: number, count?: number, sort?: Array, desc?: Array, query?: string, options?: any) { + return TicketsApiFp(this.configuration).listTickets(type, offset, count, sort, desc, query, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Remove an artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public removeArtifact(id: number, name: string, options?: any) { + return TicketsApiFp(this.configuration).removeArtifact(id, name, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Comment will be removed from the ticket. + * @summary Remove an comment from an ticket + * @param {number} id Ticket ID + * @param {number} commentID Comment ID to remove + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public removeComment(id: number, commentID: number, options?: any) { + return TicketsApiFp(this.configuration).removeComment(id, commentID, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Remove an ticket playbook + * @param {number} id Ticket ID + * @param {string} playbookID Playbook ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public removeTicketPlaybook(id: number, playbookID: string, options?: any) { + return TicketsApiFp(this.configuration).removeTicketPlaybook(id, playbookID, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Run automation on a single artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {string} automation + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public runArtifact(id: number, name: string, automation: string, options?: any) { + return TicketsApiFp(this.configuration).runArtifact(id, name, automation, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Run ticket playbook task + * @param {number} id Ticket ID + * @param {string} playbookID Playbook ID + * @param {string} taskID Task ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public runTask(id: number, playbookID: string, taskID: string, options?: any) { + return TicketsApiFp(this.configuration).runTask(id, playbookID, taskID, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Set a single artifact + * @param {number} id Ticket ID + * @param {string} name + * @param {Artifact} artifact + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public setArtifact(id: number, name: string, artifact: Artifact, options?: any) { + return TicketsApiFp(this.configuration).setArtifact(id, name, artifact, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Set ticket references + * @param {number} id Ticket ID + * @param {Array} references All ticket references + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public setReferences(id: number, references: Array, options?: any) { + return TicketsApiFp(this.configuration).setReferences(id, references, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Set ticket schema + * @param {number} id Ticket ID + * @param {string} [schema] New ticket schema + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public setSchema(id: number, schema?: string, options?: any) { + return TicketsApiFp(this.configuration).setSchema(id, schema, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Set a ticket playbook task + * @param {number} id Ticket ID + * @param {string} playbookID Playbook ID + * @param {string} taskID Task ID + * @param {Task} task Task + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public setTask(id: number, playbookID: string, taskID: string, task: Task, options?: any) { + return TicketsApiFp(this.configuration).setTask(id, playbookID, taskID, task, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Unlink an ticket to an ticket + * @param {number} id Ticket ID + * @param {number} linkedID Added ticket ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public unlinkTicket(id: number, linkedID: number, options?: any) { + return TicketsApiFp(this.configuration).unlinkTicket(id, linkedID, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Update an existing ticket + * @param {number} id Ticket ID + * @param {Ticket} ticket Updated ticket + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TicketsApi + */ + public updateTicket(id: number, ticket: Ticket, options?: any) { + return TicketsApiFp(this.configuration).updateTicket(id, ticket, options).then((request) => request(this.axios, this.basePath)); + } +} + + +/** + * TickettypesApi - axios parameter creator + * @export + */ +export const TickettypesApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @summary Create a new tickettype + * @param {TicketTypeForm} tickettype New tickettype + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createTicketType: async (tickettype: TicketTypeForm, options: any = {}): Promise => { + // verify required parameter 'tickettype' is not null or undefined + assertParamExists('createTicketType', 'tickettype', tickettype) + const localVarPath = `/tickettypes`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(tickettype, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Delete a tickettype + * @param {string} id TicketType ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deleteTicketType: async (id: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('deleteTicketType', 'id', id) + const localVarPath = `/tickettypes/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Get a single tickettype + * @param {string} id TicketType ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getTicketType: async (id: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('getTicketType', 'id', id) + const localVarPath = `/tickettypes/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary List tickettypes + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listTicketTypes: async (options: any = {}): Promise => { + const localVarPath = `/tickettypes`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Update an existing tickettype + * @param {string} id TicketType ID + * @param {TicketTypeForm} tickettype TicketType object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateTicketType: async (id: string, tickettype: TicketTypeForm, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('updateTicketType', 'id', id) + // verify required parameter 'tickettype' is not null or undefined + assertParamExists('updateTicketType', 'tickettype', tickettype) + const localVarPath = `/tickettypes/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(tickettype, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * TickettypesApi - functional programming interface + * @export + */ +export const TickettypesApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = TickettypesApiAxiosParamCreator(configuration) + return { + /** + * + * @summary Create a new tickettype + * @param {TicketTypeForm} tickettype New tickettype + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async createTicketType(tickettype: TicketTypeForm, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.createTicketType(tickettype, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Delete a tickettype + * @param {string} id TicketType ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async deleteTicketType(id: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.deleteTicketType(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Get a single tickettype + * @param {string} id TicketType ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getTicketType(id: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getTicketType(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary List tickettypes + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async listTicketTypes(options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { + const localVarAxiosArgs = await localVarAxiosParamCreator.listTicketTypes(options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Update an existing tickettype + * @param {string} id TicketType ID + * @param {TicketTypeForm} tickettype TicketType object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async updateTicketType(id: string, tickettype: TicketTypeForm, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.updateTicketType(id, tickettype, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * TickettypesApi - factory interface + * @export + */ +export const TickettypesApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = TickettypesApiFp(configuration) + return { + /** + * + * @summary Create a new tickettype + * @param {TicketTypeForm} tickettype New tickettype + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createTicketType(tickettype: TicketTypeForm, options?: any): AxiosPromise { + return localVarFp.createTicketType(tickettype, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Delete a tickettype + * @param {string} id TicketType ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deleteTicketType(id: string, options?: any): AxiosPromise { + return localVarFp.deleteTicketType(id, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Get a single tickettype + * @param {string} id TicketType ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getTicketType(id: string, options?: any): AxiosPromise { + return localVarFp.getTicketType(id, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary List tickettypes + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listTicketTypes(options?: any): AxiosPromise> { + return localVarFp.listTicketTypes(options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Update an existing tickettype + * @param {string} id TicketType ID + * @param {TicketTypeForm} tickettype TicketType object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateTicketType(id: string, tickettype: TicketTypeForm, options?: any): AxiosPromise { + return localVarFp.updateTicketType(id, tickettype, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * TickettypesApi - object-oriented interface + * @export + * @class TickettypesApi + * @extends {BaseAPI} + */ +export class TickettypesApi extends BaseAPI { + /** + * + * @summary Create a new tickettype + * @param {TicketTypeForm} tickettype New tickettype + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TickettypesApi + */ + public createTicketType(tickettype: TicketTypeForm, options?: any) { + return TickettypesApiFp(this.configuration).createTicketType(tickettype, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Delete a tickettype + * @param {string} id TicketType ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TickettypesApi + */ + public deleteTicketType(id: string, options?: any) { + return TickettypesApiFp(this.configuration).deleteTicketType(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Get a single tickettype + * @param {string} id TicketType ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TickettypesApi + */ + public getTicketType(id: string, options?: any) { + return TickettypesApiFp(this.configuration).getTicketType(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary List tickettypes + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TickettypesApi + */ + public listTicketTypes(options?: any) { + return TickettypesApiFp(this.configuration).listTicketTypes(options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Update an existing tickettype + * @param {string} id TicketType ID + * @param {TicketTypeForm} tickettype TicketType object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof TickettypesApi + */ + public updateTicketType(id: string, tickettype: TicketTypeForm, options?: any) { + return TickettypesApiFp(this.configuration).updateTicketType(id, tickettype, options).then((request) => request(this.axios, this.basePath)); + } +} + + +/** + * UserdataApi - axios parameter creator + * @export + */ +export const UserdataApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @summary Get current user data + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + currentUserData: async (options: any = {}): Promise => { + const localVarPath = `/currentuserdata`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Get a single user data + * @param {string} id User Data ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getUserData: async (id: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('getUserData', 'id', id) + const localVarPath = `/userdata/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary List userdata + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listUserData: async (options: any = {}): Promise => { + const localVarPath = `/userdata`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Update current user data + * @param {UserData} userdata User data object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateCurrentUserData: async (userdata: UserData, options: any = {}): Promise => { + // verify required parameter 'userdata' is not null or undefined + assertParamExists('updateCurrentUserData', 'userdata', userdata) + const localVarPath = `/currentuserdata`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(userdata, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Update an existing user data + * @param {string} id User Data ID + * @param {UserData} userdata User data object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateUserData: async (id: string, userdata: UserData, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('updateUserData', 'id', id) + // verify required parameter 'userdata' is not null or undefined + assertParamExists('updateUserData', 'userdata', userdata) + const localVarPath = `/userdata/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(userdata, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * UserdataApi - functional programming interface + * @export + */ +export const UserdataApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = UserdataApiAxiosParamCreator(configuration) + return { + /** + * + * @summary Get current user data + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async currentUserData(options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.currentUserData(options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Get a single user data + * @param {string} id User Data ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getUserData(id: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getUserData(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary List userdata + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async listUserData(options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { + const localVarAxiosArgs = await localVarAxiosParamCreator.listUserData(options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Update current user data + * @param {UserData} userdata User data object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async updateCurrentUserData(userdata: UserData, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.updateCurrentUserData(userdata, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Update an existing user data + * @param {string} id User Data ID + * @param {UserData} userdata User data object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async updateUserData(id: string, userdata: UserData, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.updateUserData(id, userdata, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * UserdataApi - factory interface + * @export + */ +export const UserdataApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = UserdataApiFp(configuration) + return { + /** + * + * @summary Get current user data + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + currentUserData(options?: any): AxiosPromise { + return localVarFp.currentUserData(options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Get a single user data + * @param {string} id User Data ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getUserData(id: string, options?: any): AxiosPromise { + return localVarFp.getUserData(id, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary List userdata + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listUserData(options?: any): AxiosPromise> { + return localVarFp.listUserData(options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Update current user data + * @param {UserData} userdata User data object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateCurrentUserData(userdata: UserData, options?: any): AxiosPromise { + return localVarFp.updateCurrentUserData(userdata, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Update an existing user data + * @param {string} id User Data ID + * @param {UserData} userdata User data object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateUserData(id: string, userdata: UserData, options?: any): AxiosPromise { + return localVarFp.updateUserData(id, userdata, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * UserdataApi - object-oriented interface + * @export + * @class UserdataApi + * @extends {BaseAPI} + */ +export class UserdataApi extends BaseAPI { + /** + * + * @summary Get current user data + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof UserdataApi + */ + public currentUserData(options?: any) { + return UserdataApiFp(this.configuration).currentUserData(options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Get a single user data + * @param {string} id User Data ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof UserdataApi + */ + public getUserData(id: string, options?: any) { + return UserdataApiFp(this.configuration).getUserData(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary List userdata + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof UserdataApi + */ + public listUserData(options?: any) { + return UserdataApiFp(this.configuration).listUserData(options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Update current user data + * @param {UserData} userdata User data object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof UserdataApi + */ + public updateCurrentUserData(userdata: UserData, options?: any) { + return UserdataApiFp(this.configuration).updateCurrentUserData(userdata, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Update an existing user data + * @param {string} id User Data ID + * @param {UserData} userdata User data object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof UserdataApi + */ + public updateUserData(id: string, userdata: UserData, options?: any) { + return UserdataApiFp(this.configuration).updateUserData(id, userdata, options).then((request) => request(this.axios, this.basePath)); + } +} + + +/** + * UsersApi - axios parameter creator + * @export + */ +export const UsersApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @summary Create user + * @param {UserForm} user user object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createUser: async (user: UserForm, options: any = {}): Promise => { + // verify required parameter 'user' is not null or undefined + assertParamExists('createUser', 'user', user) + const localVarPath = `/users`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(user, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Get current user + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + currentUser: async (options: any = {}): Promise => { + const localVarPath = `/currentuser`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Delete user + * @param {string} id user ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deleteUser: async (id: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('deleteUser', 'id', id) + const localVarPath = `/users/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Get a single user + * @param {string} id user ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getUser: async (id: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('getUser', 'id', id) + const localVarPath = `/users/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary List users + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listUsers: async (options: any = {}): Promise => { + const localVarPath = `/users`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Update user + * @param {string} id Template ID + * @param {UserForm} user user object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateUser: async (id: string, user: UserForm, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('updateUser', 'id', id) + // verify required parameter 'user' is not null or undefined + assertParamExists('updateUser', 'user', user) + const localVarPath = `/users/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(user, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * UsersApi - functional programming interface + * @export + */ +export const UsersApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = UsersApiAxiosParamCreator(configuration) + return { + /** + * + * @summary Create user + * @param {UserForm} user user object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async createUser(user: UserForm, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.createUser(user, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Get current user + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async currentUser(options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.currentUser(options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Delete user + * @param {string} id user ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async deleteUser(id: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.deleteUser(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Get a single user + * @param {string} id user ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getUser(id: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getUser(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary List users + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async listUsers(options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { + const localVarAxiosArgs = await localVarAxiosParamCreator.listUsers(options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @summary Update user + * @param {string} id Template ID + * @param {UserForm} user user object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async updateUser(id: string, user: UserForm, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.updateUser(id, user, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * UsersApi - factory interface + * @export + */ +export const UsersApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = UsersApiFp(configuration) + return { + /** + * + * @summary Create user + * @param {UserForm} user user object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createUser(user: UserForm, options?: any): AxiosPromise { + return localVarFp.createUser(user, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Get current user + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + currentUser(options?: any): AxiosPromise { + return localVarFp.currentUser(options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Delete user + * @param {string} id user ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + deleteUser(id: string, options?: any): AxiosPromise { + return localVarFp.deleteUser(id, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Get a single user + * @param {string} id user ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getUser(id: string, options?: any): AxiosPromise { + return localVarFp.getUser(id, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary List users + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listUsers(options?: any): AxiosPromise> { + return localVarFp.listUsers(options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Update user + * @param {string} id Template ID + * @param {UserForm} user user object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateUser(id: string, user: UserForm, options?: any): AxiosPromise { + return localVarFp.updateUser(id, user, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * UsersApi - object-oriented interface + * @export + * @class UsersApi + * @extends {BaseAPI} + */ +export class UsersApi extends BaseAPI { + /** + * + * @summary Create user + * @param {UserForm} user user object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof UsersApi + */ + public createUser(user: UserForm, options?: any) { + return UsersApiFp(this.configuration).createUser(user, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Get current user + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof UsersApi + */ + public currentUser(options?: any) { + return UsersApiFp(this.configuration).currentUser(options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Delete user + * @param {string} id user ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof UsersApi + */ + public deleteUser(id: string, options?: any) { + return UsersApiFp(this.configuration).deleteUser(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Get a single user + * @param {string} id user ID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof UsersApi + */ + public getUser(id: string, options?: any) { + return UsersApiFp(this.configuration).getUser(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary List users + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof UsersApi + */ + public listUsers(options?: any) { + return UsersApiFp(this.configuration).listUsers(options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Update user + * @param {string} id Template ID + * @param {UserForm} user user object that needs to be added + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof UsersApi + */ + public updateUser(id: string, user: UserForm, options?: any) { + return UsersApiFp(this.configuration).updateUser(id, user, options).then((request) => request(this.axios, this.basePath)); + } +} + + diff --git a/ui/src/client/base.ts b/ui/src/client/base.ts new file mode 100644 index 0000000..d4ff370 --- /dev/null +++ b/ui/src/client/base.ts @@ -0,0 +1,71 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * + * API for the catalyst incident response platform. + * + * The version of the OpenAPI document: + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import { Configuration } from "./configuration"; +// Some imports not used depending on template conditions +// @ts-ignore +import globalAxios, { AxiosPromise, AxiosInstance } from 'axios'; + +export const BASE_PATH = "http://./api".replace(/\/+$/, ""); + +/** + * + * @export + */ +export const COLLECTION_FORMATS = { + csv: ",", + ssv: " ", + tsv: "\t", + pipes: "|", +}; + +/** + * + * @export + * @interface RequestArgs + */ +export interface RequestArgs { + url: string; + options: any; +} + +/** + * + * @export + * @class BaseAPI + */ +export class BaseAPI { + protected configuration: Configuration | undefined; + + constructor(configuration?: Configuration, protected basePath: string = BASE_PATH, protected axios: AxiosInstance = globalAxios) { + if (configuration) { + this.configuration = configuration; + this.basePath = configuration.basePath || this.basePath; + } + } +}; + +/** + * + * @export + * @class RequiredError + * @extends {Error} + */ +export class RequiredError extends Error { + name: "RequiredError" = "RequiredError"; + constructor(public field: string, msg?: string) { + super(msg); + } +} diff --git a/ui/src/client/common.ts b/ui/src/client/common.ts new file mode 100644 index 0000000..3d1fd99 --- /dev/null +++ b/ui/src/client/common.ts @@ -0,0 +1,138 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * + * API for the catalyst incident response platform. + * + * The version of the OpenAPI document: + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import { Configuration } from "./configuration"; +import { RequiredError, RequestArgs } from "./base"; +import { AxiosInstance } from 'axios'; + +/** + * + * @export + */ +export const DUMMY_BASE_URL = 'https://example.com' + +/** + * + * @throws {RequiredError} + * @export + */ +export const assertParamExists = function (functionName: string, paramName: string, paramValue: unknown) { + if (paramValue === null || paramValue === undefined) { + throw new RequiredError(paramName, `Required parameter ${paramName} was null or undefined when calling ${functionName}.`); + } +} + +/** + * + * @export + */ +export const setApiKeyToObject = async function (object: any, keyParamName: string, configuration?: Configuration) { + if (configuration && configuration.apiKey) { + const localVarApiKeyValue = typeof configuration.apiKey === 'function' + ? await configuration.apiKey(keyParamName) + : await configuration.apiKey; + object[keyParamName] = localVarApiKeyValue; + } +} + +/** + * + * @export + */ +export const setBasicAuthToObject = function (object: any, configuration?: Configuration) { + if (configuration && (configuration.username || configuration.password)) { + object["auth"] = { username: configuration.username, password: configuration.password }; + } +} + +/** + * + * @export + */ +export const setBearerAuthToObject = async function (object: any, configuration?: Configuration) { + if (configuration && configuration.accessToken) { + const accessToken = typeof configuration.accessToken === 'function' + ? await configuration.accessToken() + : await configuration.accessToken; + object["Authorization"] = "Bearer " + accessToken; + } +} + +/** + * + * @export + */ +export const setOAuthToObject = async function (object: any, name: string, scopes: string[], configuration?: Configuration) { + if (configuration && configuration.accessToken) { + const localVarAccessTokenValue = typeof configuration.accessToken === 'function' + ? await configuration.accessToken(name, scopes) + : await configuration.accessToken; + object["Authorization"] = "Bearer " + localVarAccessTokenValue; + } +} + +/** + * + * @export + */ +export const setSearchParams = function (url: URL, ...objects: any[]) { + const searchParams = new URLSearchParams(url.search); + for (const object of objects) { + for (const key in object) { + if (Array.isArray(object[key])) { + searchParams.delete(key); + for (const item of object[key]) { + searchParams.append(key, item); + } + } else { + searchParams.set(key, object[key]); + } + } + } + url.search = searchParams.toString(); +} + +/** + * + * @export + */ +export const serializeDataIfNeeded = function (value: any, requestOptions: any, configuration?: Configuration) { + const nonString = typeof value !== 'string'; + const needsSerialization = nonString && configuration && configuration.isJsonMime + ? configuration.isJsonMime(requestOptions.headers['Content-Type']) + : nonString; + return needsSerialization + ? JSON.stringify(value !== undefined ? value : {}) + : (value || ""); +} + +/** + * + * @export + */ +export const toPathString = function (url: URL) { + return url.pathname + url.search + url.hash +} + +/** + * + * @export + */ +export const createRequestFunction = function (axiosArgs: RequestArgs, globalAxios: AxiosInstance, BASE_PATH: string, configuration?: Configuration) { + return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => { + const axiosRequestArgs = {...axiosArgs.options, url: (configuration?.basePath || basePath) + axiosArgs.url}; + return axios.request(axiosRequestArgs); + }; +} diff --git a/ui/src/client/configuration.ts b/ui/src/client/configuration.ts new file mode 100644 index 0000000..d88cb01 --- /dev/null +++ b/ui/src/client/configuration.ts @@ -0,0 +1,101 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * + * API for the catalyst incident response platform. + * + * The version of the OpenAPI document: + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface ConfigurationParameters { + apiKey?: string | Promise | ((name: string) => string) | ((name: string) => Promise); + username?: string; + password?: string; + accessToken?: string | Promise | ((name?: string, scopes?: string[]) => string) | ((name?: string, scopes?: string[]) => Promise); + basePath?: string; + baseOptions?: any; + formDataCtor?: new () => any; +} + +export class Configuration { + /** + * parameter for apiKey security + * @param name security name + * @memberof Configuration + */ + apiKey?: string | Promise | ((name: string) => string) | ((name: string) => Promise); + /** + * parameter for basic security + * + * @type {string} + * @memberof Configuration + */ + username?: string; + /** + * parameter for basic security + * + * @type {string} + * @memberof Configuration + */ + password?: string; + /** + * parameter for oauth2 security + * @param name security name + * @param scopes oauth2 scope + * @memberof Configuration + */ + accessToken?: string | Promise | ((name?: string, scopes?: string[]) => string) | ((name?: string, scopes?: string[]) => Promise); + /** + * override base path + * + * @type {string} + * @memberof Configuration + */ + basePath?: string; + /** + * base options for axios calls + * + * @type {any} + * @memberof Configuration + */ + baseOptions?: any; + /** + * The FormData constructor that will be used to create multipart form data + * requests. You can inject this here so that execution environments that + * do not support the FormData class can still run the generated client. + * + * @type {new () => FormData} + */ + formDataCtor?: new () => any; + + constructor(param: ConfigurationParameters = {}) { + this.apiKey = param.apiKey; + this.username = param.username; + this.password = param.password; + this.accessToken = param.accessToken; + this.basePath = param.basePath; + this.baseOptions = param.baseOptions; + this.formDataCtor = param.formDataCtor; + } + + /** + * Check if the given MIME is a JSON MIME. + * JSON MIME examples: + * application/json + * application/json; charset=UTF8 + * APPLICATION/JSON + * application/vnd.company+json + * @param mime - MIME (Multipurpose Internet Mail Extensions) + * @return True if the given MIME is JSON, false otherwise. + */ + public isJsonMime(mime: string): boolean { + const jsonMime: RegExp = new RegExp('^(application\/json|[^;/ \t]+\/[^;/ \t]+[+]json)[ \t]*(;.*)?$', 'i'); + return mime !== null && (jsonMime.test(mime) || mime.toLowerCase() === 'application/json-patch+json'); + } +} diff --git a/ui/src/client/index.ts b/ui/src/client/index.ts new file mode 100644 index 0000000..714cae3 --- /dev/null +++ b/ui/src/client/index.ts @@ -0,0 +1,18 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * + * API for the catalyst incident response platform. + * + * The version of the OpenAPI document: + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export * from "./api"; +export * from "./configuration"; + diff --git a/ui/src/components/AdvancedJSONSchemaEditor.vue b/ui/src/components/AdvancedJSONSchemaEditor.vue new file mode 100644 index 0000000..a73abf2 --- /dev/null +++ b/ui/src/components/AdvancedJSONSchemaEditor.vue @@ -0,0 +1,195 @@ + + + + + diff --git a/ui/src/components/AppLink.vue b/ui/src/components/AppLink.vue new file mode 100644 index 0000000..7734e12 --- /dev/null +++ b/ui/src/components/AppLink.vue @@ -0,0 +1,64 @@ + + + diff --git a/ui/src/components/Editor.vue b/ui/src/components/Editor.vue new file mode 100644 index 0000000..d30d9df --- /dev/null +++ b/ui/src/components/Editor.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/ui/src/components/JSONHTML.vue b/ui/src/components/JSONHTML.vue new file mode 100644 index 0000000..14b3941 --- /dev/null +++ b/ui/src/components/JSONHTML.vue @@ -0,0 +1,20 @@ + + + diff --git a/ui/src/components/List.vue b/ui/src/components/List.vue new file mode 100644 index 0000000..d97678b --- /dev/null +++ b/ui/src/components/List.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/ui/src/components/TicketList.vue b/ui/src/components/TicketList.vue new file mode 100644 index 0000000..d73ef49 --- /dev/null +++ b/ui/src/components/TicketList.vue @@ -0,0 +1,325 @@ + + + + + diff --git a/ui/src/components/Timeline.vue b/ui/src/components/Timeline.vue new file mode 100644 index 0000000..811126c --- /dev/null +++ b/ui/src/components/Timeline.vue @@ -0,0 +1,139 @@ + + + diff --git a/ui/src/components/UserDataEditor.vue b/ui/src/components/UserDataEditor.vue new file mode 100644 index 0000000..6d9a3da --- /dev/null +++ b/ui/src/components/UserDataEditor.vue @@ -0,0 +1,173 @@ + + + + + diff --git a/ui/src/components/VJsfCropImg.vue b/ui/src/components/VJsfCropImg.vue new file mode 100644 index 0000000..124a62d --- /dev/null +++ b/ui/src/components/VJsfCropImg.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/ui/src/components/charts/Bar.ts b/ui/src/components/charts/Bar.ts new file mode 100644 index 0000000..82f5c1d --- /dev/null +++ b/ui/src/components/charts/Bar.ts @@ -0,0 +1,20 @@ +import { Component, Mixins } from 'vue-property-decorator' +import {HorizontalBar, mixins} from 'vue-chartjs'; +import ChartOptions from "chart.js"; + +@Component({ + extends: HorizontalBar, + mixins: [mixins.reactiveProp], + props: { + chartOptions: { + type: ChartOptions, + default: null + } + }, +}) +export default class BarChart extends Mixins(mixins.reactiveProp, HorizontalBar) { + mounted () { + // @ts-expect-error chartOptions are not expected + this.renderChart(this.chartData, this.chartOptions); + } +} diff --git a/ui/src/components/charts/Doughnut.ts b/ui/src/components/charts/Doughnut.ts new file mode 100644 index 0000000..cccc149 --- /dev/null +++ b/ui/src/components/charts/Doughnut.ts @@ -0,0 +1,20 @@ +import { Component, Mixins } from "vue-property-decorator"; +import { mixins, Pie } from "vue-chartjs"; +import ChartOptions from "chart.js"; + +@Component({ + extends: Pie, + mixins: [mixins.reactiveProp], + props: { + chartOptions: { + type: ChartOptions, + default: null + } + } +}) +export default class DoughnutChart extends Mixins(mixins.reactiveProp, Pie) { + mounted() { + // @ts-expect-error chartOptions are not expected + this.renderChart(this.chartData, this.chartOptions); + } +} diff --git a/ui/src/components/charts/Line.ts b/ui/src/components/charts/Line.ts new file mode 100644 index 0000000..d801ed5 --- /dev/null +++ b/ui/src/components/charts/Line.ts @@ -0,0 +1,20 @@ +import { Component, Mixins } from 'vue-property-decorator' +import {Line, mixins} from 'vue-chartjs'; +import ChartOptions from "chart.js"; + +@Component({ + extends: Line, + mixins: [mixins.reactiveProp], + props: { + chartOptions: { + type: ChartOptions, + default: null, + } + }, +}) +export default class LineChart extends Mixins(mixins.reactiveProp, Line) { + mounted () { + // @ts-expect-error chartOptions are not expected + this.renderChart(this.chartData, this.chartOptions); + } +} diff --git a/ui/src/components/icons/ArangoIcon.vue b/ui/src/components/icons/ArangoIcon.vue new file mode 100644 index 0000000..e493148 --- /dev/null +++ b/ui/src/components/icons/ArangoIcon.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/ui/src/components/icons/EmitterIcon.vue b/ui/src/components/icons/EmitterIcon.vue new file mode 100644 index 0000000..b87c639 --- /dev/null +++ b/ui/src/components/icons/EmitterIcon.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/ui/src/components/icons/MinioIcon.vue b/ui/src/components/icons/MinioIcon.vue new file mode 100644 index 0000000..197ea11 --- /dev/null +++ b/ui/src/components/icons/MinioIcon.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/ui/src/components/icons/NodeRedIcon.vue b/ui/src/components/icons/NodeRedIcon.vue new file mode 100644 index 0000000..3457ea5 --- /dev/null +++ b/ui/src/components/icons/NodeRedIcon.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/ui/src/components/snippets/ArtifactSnippet.vue b/ui/src/components/snippets/ArtifactSnippet.vue new file mode 100644 index 0000000..4b573dd --- /dev/null +++ b/ui/src/components/snippets/ArtifactSnippet.vue @@ -0,0 +1,64 @@ + + + diff --git a/ui/src/components/snippets/IDSnippet.vue b/ui/src/components/snippets/IDSnippet.vue new file mode 100644 index 0000000..b80a6e7 --- /dev/null +++ b/ui/src/components/snippets/IDSnippet.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/ui/src/components/snippets/TicketSnippet.vue b/ui/src/components/snippets/TicketSnippet.vue new file mode 100644 index 0000000..3c79df5 --- /dev/null +++ b/ui/src/components/snippets/TicketSnippet.vue @@ -0,0 +1,91 @@ + + + diff --git a/ui/src/main.ts b/ui/src/main.ts new file mode 100644 index 0000000..ef7a24b --- /dev/null +++ b/ui/src/main.ts @@ -0,0 +1,86 @@ +import Vue from "vue"; +import App from "./App.vue"; +import router from "./router"; +import store from "./store"; + +import JsonSchemaEditor from "json-schema-editor-vue"; +import vuetify from "./plugins/vuetify"; +import VuePipeline from "vue-pipeline"; +import VueLodash from "vue-lodash"; +import lodash from "lodash"; +import axios from "axios"; +import { DateTime } from 'luxon'; +import VueNativeSock from 'vue-native-websocket'; +import antInputDirective from 'ant-design-vue/es/_util/antInputDirective' +import antDirective from 'ant-design-vue/es/_util/antDirective' + +import VueAxios from "vue-axios"; +import VueLuxon from "vue-luxon"; + +import "./registerServiceWorker"; + +import "json-schema-editor-vue/lib/json-schema-editor-vue.css"; +import "@mdi/font/css/materialdesignicons.css"; +import "vue-d3-network/dist/vue-d3-network.css"; +import '@koumoul/vjsf/dist/main.css' + +import { Problem } from "@/types/types"; +Vue.use(VueLodash, { lodash: lodash }); +Vue.use(antDirective); +Vue.use(antInputDirective); +Vue.use(JsonSchemaEditor); +Vue.use(VuePipeline); +Vue.use(VueAxios, axios); +Vue.use(VueLuxon); + +// import VJsf from '@koumoul/vjsf' +import VJsf from '@koumoul/vjsf/lib/VJsf.js'; +import '@koumoul/vjsf/lib/deps/third-party.js'; + +Vue.component('VJsf', VJsf) + +Vue.config.productionTip = false; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +Vue.filter("capitalize", function(value: any) { + if (!value) return ""; + return lodash.startCase(value.toString()); +}); + +Vue.filter("formatdate", function(s: string, format: string) { + if (!format) { + return DateTime.fromISO(s).toLocaleString(DateTime.DATETIME_SHORT); + } + return DateTime.fromISO(s).toFormat(format); +}); + +let protocol = "ws" +if (location.protocol === "https:") { + protocol = "wss" +} +Vue.use(VueNativeSock, protocol + '://' + location.hostname + ':'+ location.port +'/wss', { store: store, format: 'json' }) + +const v = new Vue({ + router, + vuetify, + store, + render: h => h(App) +}).$mount("#app"); + +axios.interceptors.response.use( + response => response, + error => { + console.log(error) + if (error.response.data && 'title' in error.response.data && 'detail' in error.response.data) { + const problem = error.response.data as Problem; + v.$store.dispatch("alertError", { name: problem.title, detail: problem.detail }); + return Promise.reject(error); + } + if (error.response.data && 'error' in error.response.data) { + v.$store.dispatch("alertError", { name: "Error", detail: error.response.data.error }); + return Promise.reject(error); + } + v.$store.dispatch("alertError", { name: "Error", detail: JSON.stringify(error.response.data) }); + return Promise.reject(error); + } +); diff --git a/ui/src/plugins/vuetify.ts b/ui/src/plugins/vuetify.ts new file mode 100644 index 0000000..e8a8003 --- /dev/null +++ b/ui/src/plugins/vuetify.ts @@ -0,0 +1,90 @@ +import "@mdi/font/css/materialdesignicons.css"; +import Vue from "vue"; +import Vuetify from "vuetify/lib"; +import MinioIcon from "../components/icons/MinioIcon.vue"; +import NodeRedIcon from "../components/icons/NodeRedIcon.vue"; +import ArangoIcon from "../components/icons/ArangoIcon.vue"; +import EmitterIcon from "../components/icons/EmitterIcon.vue"; + +Vue.use(Vuetify); + +export const colors = [ + '#c62828', '#6a1b9a', + '#283593', '#0277bd', + '#00695c', '#558b2f', + '#f9a825', '#ef6c00', + '#ad1457', '#4527a0', + '#1565c0', '#00838f', + '#2e7d32', '#9e9d24', + '#ff8f00', '#d84315', +] + +export default new Vuetify({ + theme: { + dark: false, + themes: { + light: { + statusbar: "#212121", // "#1c313a", + appbar: "#eeeeee", //'#28282e', + background: "#f5f5f5", //'#393a3f', + cards: "#e0e0e0", //'#393a3f', + + primary: "#607d8b", + yellow: "#FFC107", // "#FFEB3B", + error: "#C62828", // "#d32f2f", + info: "#1565C0", // "#2196F3", + success: "#2E7D32", // "#689f38", + warning: "#D84315", // "#fbc02d", + + red: "#C62828", // "#d32f2f", + }, + dark: { + // statusbar: "#d35400", + // statusbar: "#f03f24", //'#18181c', 240 63 36 + // appbar: "#212121", //'#28282e', + // background: "#303030", //'#393a3f', + // cards: "#424242", //'#393a3f', + + statusbar: "#121212", + appbar: "#212121", //'#28282e', + background: "#303030", //'#393a3f', + cards: "#424242", //'#393a3f', + + // alertmanager: "#ef6c00", + // catalyst: "#ad1457", + // blocklist: "#2e7d32", + // uploadportal: "#283593", + // search: "#c62828", + + // darksteel: "#1c313a", + // steel: "#455a64", + // lightsteel: "#718792", + primary: "#FFC107", // "#00bcd4", // "#FFEB3B", + yellow: "#FFC107", // "#FFEB3B", + // accent: "#82B1FF", + error: "#ef9a9a", // "#d32f2f", + info: "#90caf9", // "#2196F3", + success: "#a5d6a7", // "#689f38", + warning: "#ffab91", // "#fbc02d", + + red: "#C62828", // "#d32f2f", + }, + }, + }, + icons: { + values: { + minio: { + component: MinioIcon, + }, + nodered: { + component: NodeRedIcon, + }, + arango: { + component: ArangoIcon, + }, + emitter: { + component: EmitterIcon, + }, + }, + }, +}); diff --git a/ui/src/registerServiceWorker.ts b/ui/src/registerServiceWorker.ts new file mode 100644 index 0000000..1473a0a --- /dev/null +++ b/ui/src/registerServiceWorker.ts @@ -0,0 +1,34 @@ +/* eslint-disable no-console */ + +import { register } from "register-service-worker"; + +if (process.env.NODE_ENV === "production") { + register(`${process.env.BASE_URL}service-worker.js`, { + ready() { + console.log( + "App is being served from cache by a service worker.\n" + + "For more details, visit https://goo.gl/AFskqB" + ); + }, + registered() { + console.log("Service worker has been registered."); + }, + cached() { + console.log("Content has been cached for offline use."); + }, + updatefound() { + console.log("New content is downloading."); + }, + updated() { + console.log("New content is available; please refresh."); + }, + offline() { + console.log( + "No internet connection found. App is running in offline mode." + ); + }, + error(error) { + console.error("Error during service worker registration:", error); + }, + }); +} diff --git a/ui/src/router/index.ts b/ui/src/router/index.ts new file mode 100644 index 0000000..e8a7376 --- /dev/null +++ b/ui/src/router/index.ts @@ -0,0 +1,236 @@ +import Vue from "vue"; +import VueRouter, { RouteConfig, RawLocation, Route } from "vue-router"; +import ArtifactPopup from "../views/ArtifactPopup.vue"; +import Ticket from "../views/Ticket.vue"; +import TicketNew from "../views/TicketNew.vue"; +import TicketList from "../views/TicketList.vue"; +import Graph from "../views/Graph.vue"; +import Playbook from "../views/Playbook.vue"; +import PlaybookList from "../views/PlaybookList.vue"; +import Automation from "../views/Automation.vue"; +import UserData from "../views/UserData.vue"; +import Profile from "../views/Profile.vue"; +import UserDataList from "../views/UserDataList.vue"; +import AutomationList from "../views/AutomationList.vue"; +import Rule from "../views/Rule.vue"; +import RuleList from "../views/RuleList.vue"; +import Template from "../views/Template.vue"; +import TemplateList from "../views/TemplateList.vue"; +import API from "../views/API.vue"; +import User from '../views/User.vue'; +import UserList from "@/views/UserList.vue"; +import Job from '../views/Job.vue'; +import JobList from "@/views/JobList.vue"; +import GroupList from "@/views/GroupList.vue"; +import Dashboard from "@/views/Dashboard.vue"; +import Group from "@/views/Group.vue"; +import TicketType from '../views/TicketType.vue'; +import TicketTypeList from "@/views/TicketTypeList.vue"; +import TaskList from "@/views/TaskList.vue"; + +Vue.use(VueRouter); + +const originalPush = VueRouter.prototype.push; +VueRouter.prototype.push = function push(location: RawLocation): Promise { + return new Promise((resolve, reject) => { + originalPush.call(this, location, () => { + // on complete + + resolve(this.currentRoute); + }, (error) => { + // on abort + + // only ignore NavigationDuplicated error + if (error.name === 'NavigationDuplicated') { + resolve(this.currentRoute); + } else { + reject(error); + } + }); + }); +}; + + +const routes: Array = [ + { + path: "/", + name: "Catalyst", + redirect: { name: "Dashboard" }, + }, + + { + path: "/dashboard", + name: "Dashboard", + component: Dashboard, + }, + + { + path: "/profile", + name: "Profile", + component: Profile, + }, + + { + path: "/tickets/:type?", + name: "TicketList", + component: TicketList, + props: true, + }, + { + path: "/tickets/:type?/:id", + name: "Ticket", + component: Ticket, + }, + { + path: "/tickets/:type/new", + name: "TicketNew", + component: TicketNew, + }, + { + path: "/tickets/:type?/:id/artifact/:artifact", + name: "ArtifactPopup", + component: ArtifactPopup, + }, + + { + path: "/tasks", + name: "TaskList", + component: TaskList, + }, + + { + path: "/templates", + name: "TemplateList", + component: TemplateList, + children: [ + { + path: ":id", + name: "Template", + component: Template, + }, + ] + }, + + { + path: "/tickettype", + name: "TicketTypeList", + component: TicketTypeList, + children: [ + { + path: ":id", + name: "TicketType", + component: TicketType, + }, + ] + }, + + { + path: "/playbooks", + name: "PlaybookList", + component: PlaybookList, + children: [ + { + path: ":id", + name: "Playbook", + component: Playbook, + }, + ] + }, + + { + path: "/userdata", + name: "UserDataList", + component: UserDataList, + children: [ + { + path: ":id", + name: "UserData", + component: UserData, + }, + ] + }, + + { + path: "/jobs", + name: "JobList", + component: JobList, + children: [ + { + path: ":id", + name: "Job", + component: Job, + }, + ] + }, + + { + path: "/automations", + name: "AutomationList", + component: AutomationList, + children: [ + { + path: ":id", + name: "Automation", + component: Automation, + }, + ] + }, + + { + path: "/rules", + name: "RuleList", + component: RuleList, + children: [ + { + path: ":id", + name: "Rule", + component: Rule, + }, + ] + }, + + { + path: "/users", + name: "UserList", + component: UserList, + children: [ + { + path: ":id", + name: "User", + component: User, + }, + ] + }, + + { + path: "/groups", + name: "GroupList", + component: GroupList, + children: [ + { + path: ":id", + name: "Group", + component: Group, + }, + ] + }, + + { + path: "/apidocs", + name: "API", + component: API, + }, + + { + path: "/graph/:col/:id", + name: "Graph", + component: Graph, + }, +]; + +const router = new VueRouter({ + mode: 'history', + routes, +}); + +export default router; diff --git a/ui/src/sass/variables.scss.bak b/ui/src/sass/variables.scss.bak new file mode 100644 index 0000000..5db630b --- /dev/null +++ b/ui/src/sass/variables.scss.bak @@ -0,0 +1,29 @@ +// Globals +// $body-font-family: 'Work Sans', serif; +$border-radius-root: 6px; +$font-size-root: 14px; + +// Variables must come before the import +$btn-letter-spacing: 0; +$btn-font-weight: 400; +$list-item-title-font-size: 0.929rem; +$list-item-dense-title-font-size: 0.929rem; +$list-item-dense-title-font-weight: initial; +$fab-icon-sizes: ( + 'small': 20 +); +$btn-sizes: ( + 'default': 41, + 'large': 54 +); + +$headings: ( + 'h1': ( + 'size': 3.3125rem, + 'line-height': 1.15em + ), + 'h2': ( + 'size': 2.25rem, + 'line-height': 1.5em + ) +); diff --git a/ui/src/services/api.ts b/ui/src/services/api.ts new file mode 100644 index 0000000..51b032c --- /dev/null +++ b/ui/src/services/api.ts @@ -0,0 +1,78 @@ +import { + UserdataApi, + UserdataApiFactory, + AutomationsApi, + AutomationsApiFactory, + Configuration, + GraphApi, + GraphApiFactory, + GroupsApi, + GroupsApiFactory, + LogsApi, + LogsApiFactory, + PlaybooksApi, + PlaybooksApiFactory, + RulesApi, + RulesApiFactory, + StatisticsApi, + StatisticsApiFactory, + TasksApi, + TasksApiFactory, + TemplatesApi, + TemplatesApiFactory, + TicketsApi, + TicketsApiFactory, + TickettypesApi, + TickettypesApiFactory, + UsersApi, + UsersApiFactory, + SettingsApi, + SettingsApiFactory, + JobsApi, + JobsApiFactory, +} from "@/client"; + +const config = new Configuration({ + basePath: + window.location.protocol + + "//" + + window.location.hostname + + ":" + + window.location.port + + "/api" +}); + +export const API: TicketsApi & + TemplatesApi & + PlaybooksApi & + RulesApi & + AutomationsApi & + UserdataApi & + LogsApi & + GraphApi & + UsersApi & + GroupsApi & + StatisticsApi & + SettingsApi & + TickettypesApi & + JobsApi & + TasksApi = Object.assign( + {}, + TicketsApiFactory(config), + PlaybooksApiFactory(config), + TemplatesApiFactory(config), + RulesApiFactory(config), + AutomationsApiFactory(config), + SettingsApiFactory(config), + LogsApiFactory(config), + GraphApiFactory(config), + UsersApiFactory(config), + UserdataApiFactory(config), + GroupsApiFactory(config), + StatisticsApiFactory(config), + SettingsApiFactory(config), + TickettypesApiFactory(config), + TasksApiFactory(config), + SettingsApiFactory(config), + JobsApiFactory(config) +); diff --git a/ui/src/shims-tsx.d.ts b/ui/src/shims-tsx.d.ts new file mode 100644 index 0000000..2bcdf9f --- /dev/null +++ b/ui/src/shims-tsx.d.ts @@ -0,0 +1,13 @@ +import Vue, { VNode } from "vue"; + +declare global { + namespace JSX { + // tslint:disable no-empty-interface + interface Element extends VNode {} + // tslint:disable no-empty-interface + interface ElementClass extends Vue {} + interface IntrinsicElements { + [elem: string]: any; + } + } +} diff --git a/ui/src/shims-vue.d.ts b/ui/src/shims-vue.d.ts new file mode 100644 index 0000000..326b35b --- /dev/null +++ b/ui/src/shims-vue.d.ts @@ -0,0 +1,22 @@ +declare module "*.vue" { + import Vue from "vue"; + export default Vue; +} + +declare module "v-jsoneditor/src/index"; +declare module "@koumoul/vjsf"; +declare module "@koumoul/vjsf/lib/VJsf.js"; +declare module "vue-pipeline"; +declare module "json-schema-editor-vue"; +declare module "vue-json-to-html"; +declare module "vue-d3-network"; +declare module "vue-luxon"; +declare module 'swagger-ui'; +declare module 'prismjs/components/prism-core'; +declare module 'vue-native-websocket'; +declare module 'antlr4'; +declare module 'vue-cropperjs'; +declare module 'graphlib'; +declare module 'ant-design-vue/es/_util/antInputDirective'; +declare module 'flat'; +declare module 'crypto'; diff --git a/ui/src/store/index.ts b/ui/src/store/index.ts new file mode 100644 index 0000000..fd68b3b --- /dev/null +++ b/ui/src/store/index.ts @@ -0,0 +1,104 @@ +import Vue from "vue"; +import Vuex, {ActionContext} from "vuex"; +import {API} from "@/services/api"; +import {UserData, TicketList, Settings, UserResponse} from "@/client"; +import {AxiosResponse} from "axios"; +import {Alert} from "@/types/types"; +import {templateStore} from "./modules/templates"; +import {socketStore} from "@/store/modules/socket"; + +Vue.use(Vuex); + +export default new Vuex.Store({ + modules: { + templates: templateStore, + socket: socketStore, + }, + state: { + user: {} as UserResponse, + counts: {} as Record, + task_count: 0 as number, + + settings: {} as Settings, + userdata: {} as UserData, + + alert: {} as Alert, + showAlert: false as boolean, + }, + getters: { + timeformat: (state) => { + if ('timeformat' in state.settings && state.settings.timeformat) { + return state.settings.timeformat + } + return 'dd-MM-yyyy' + } + }, + mutations: { + setUser (state, msg) { + state.user = msg; + }, + setCount (state, msg) { + Vue.set(state.counts, msg.name, msg.count); + }, + setTaskCount (state, msg) { + state.task_count = msg; + }, + setUserData (state, msg: UserData) { + state.userdata = msg + }, + setSettings (state, msg: Settings) { + state.settings = msg + }, + setAlert (state, msg: Alert) { + state.showAlert = false; + state.showAlert = true; + state.alert = msg; + } + }, + actions: { + getUser (context: ActionContext) { + API.currentUser().then((response) => { + context.commit("setUser", response.data); + context.dispatch("fetchCount"); + }) + }, + getUserData (context: ActionContext) { + API.currentUserData().then((response: AxiosResponse) => { + context.commit("setUserData", response.data); + }) + }, + getSettings (context: ActionContext) { + API.getSettings().then((response: AxiosResponse) => { + context.commit("setSettings", response.data); + context.dispatch("fetchCount"); + }) + }, + fetchCount (context: ActionContext) { + if (!context.state.user.id || !context.state.settings.ticketTypes) { + return + } + + const username = context.state.user.id; + Vue.lodash.forEach(context.state.settings.ticketTypes, (t) => { + + API.listTickets(t.id,0,10,[],[], "status == 'open' AND (owner == '"+username+"' OR !owner)") + .then((response: AxiosResponse) => { + context.commit("setCount", {"name": t.id, "count": response.data.count}); + }); + API.listTasks().then((response) => { + if (response.data) { + context.commit("setTaskCount", response.data.length ); + } + }) + }) + }, + alertSuccess(context: ActionContext, msg) { + msg.type = "success" + context.commit("setAlert", msg) + }, + alertError(context: ActionContext, msg) { + msg.type = "error" + context.commit("setAlert", msg) + }, + }, +}); diff --git a/ui/src/store/modules/socket.ts b/ui/src/store/modules/socket.ts new file mode 100644 index 0000000..a3acbed --- /dev/null +++ b/ui/src/store/modules/socket.ts @@ -0,0 +1,64 @@ +import Vue from "vue"; +import Vuex, {ActionContext} from "vuex"; +import lodash from "lodash"; + +Vue.use(Vuex); + +interface State { + socket: any; +} + +export const socketStore = { + state: (): State => ({ + socket: { + isConnected: false, + message: '', + reconnectError: false, + } + }), + mutations: { + SOCKET_ONOPEN (state: State, event: any) { + // console.log("SOCKET_ONOPEN"); + Vue.prototype.$socket = event.currentTarget; + state.socket.isConnected = true; + }, + SOCKET_ONCLOSE (state: State, event: any) { + // console.log("SOCKET_ONCLOSE"); + state.socket.isConnected = false; + }, + SOCKET_ONERROR (state: State, event: any) { + // console.log("SOCKET_ONERROR"); + console.error(state, event); + }, + // default handler called for all methods + SOCKET_ONMESSAGE (state: State, message: any) { + // console.log("SOCKET_ONMESSAGE"); + state.socket.message = message; + }, + // mutations for reconnect methods + SOCKET_RECONNECT(state: State, count: any) { + // console.log("SOCKET_RECONNECT"); + console.info(state, count); + }, + SOCKET_RECONNECT_ERROR(state: State) { + // console.log("SOCKET_RECONNECT_ERROR"); + state.socket.reconnectError = true; + }, + }, + actions: { + sendMessage: function(context: ActionContext, msg: any) { + Vue.prototype.$socket.send(msg); + }, + update: function (context: ActionContext, msg: any) { + // console.log("update", msg); + if (!msg || !(lodash.has(msg, "ids")) || !msg["ids"]) { + return + } + Vue.lodash.forEach(msg["ids"], (id) => { + if (lodash.startsWith(id, "settings/")) { + context.dispatch("getSetting") + } + }); + } + } +} diff --git a/ui/src/store/modules/templates.ts b/ui/src/store/modules/templates.ts new file mode 100644 index 0000000..2d71c10 --- /dev/null +++ b/ui/src/store/modules/templates.ts @@ -0,0 +1,75 @@ +import Vue from "vue"; +import Vuex, {ActionContext} from "vuex"; +import {TicketTemplate} from "@/client"; +import {API} from "@/services/api"; +import {AxiosResponse} from "axios"; + +Vue.use(Vuex); + +interface State { + templates: Array; +} + +export const templateStore = { + state: (): State => ({ + templates: [], + }), + mutations: { + setTemplates(state: State, msg: Array) { + state.templates = msg; + }, + }, + actions: { + listTemplates(context: ActionContext) { + API.listTemplates().then((response: AxiosResponse>) => { + context.commit("setTemplates", response.data) + }); + }, + getTemplate(context: ActionContext, id: string) { + return new Promise((resolve) => { + API.getTemplate(id).then((response: AxiosResponse) => { + resolve(response.data); + }).catch(error => { + context.dispatch("alertError", {name: "Template could not be loaded", details: error}); + }); + }); + }, + addTemplate(context: ActionContext, template: TicketTemplate) { + return new Promise((resolve) => { + API.createTemplate(template).then(() => { + context.dispatch("listTemplates").then(() => { + context.dispatch("alertSuccess", {name: "Template created"}).then(() => { + resolve({}) + }); + }).catch(error => { + context.dispatch("alertError", {name: "Template created, but reload failed", details: error}); + }); + }).catch(error => { + context.dispatch("alertError", {name: "Template could not be created", details: error}); + }); + }); + }, + updateTemplate(context: ActionContext, msg: any) { + API.updateTemplate(msg.id, msg.template).then(() => { + context.dispatch("alertSuccess", {name: "Template updated"}); + }).catch(error => { + context.dispatch("alertError", {name: "Template could not be updated", details: error}); + }); + }, + deleteTemplate(context: ActionContext, id: string) { + return new Promise((resolve) => { + API.deleteTemplate(id).then(() => { + context.dispatch("listTemplates").then(() => { + context.dispatch("alertSuccess", {name: "Template deleted"}).then(() => { + resolve({}); + }); + }).catch(error => { + context.dispatch("alertError", {name: "Template deleted, but reload failed", details: error}); + }); + }).catch(error => { + context.dispatch("alertError", {name: "Template could not be deleted", details: error}); + }); + }); + }, + } +} diff --git a/ui/src/suggestions/grammar/CAQLLexer.interp b/ui/src/suggestions/grammar/CAQLLexer.interp new file mode 100644 index 0000000..7633444 --- /dev/null +++ b/ui/src/suggestions/grammar/CAQLLexer.interp @@ -0,0 +1,282 @@ +token literal names: +null +'.' +'=~' +'!~' +'==' +'!=' +'<' +'>' +'<=' +'>=' +'+' +'-' +'*' +'/' +'%' +'?' +':' +'::' +'..' +',' +'(' +')' +'{' +'}' +'[' +']' +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null + +token symbolic names: +null +DOT +T_REGEX_MATCH +T_REGEX_NON_MATCH +T_EQ +T_NE +T_LT +T_GT +T_LE +T_GE +T_PLUS +T_MINUS +T_TIMES +T_DIV +T_MOD +T_QUESTION +T_COLON +T_SCOPE +T_RANGE +T_COMMA +T_OPEN +T_CLOSE +T_OBJECT_OPEN +T_OBJECT_CLOSE +T_ARRAY_OPEN +T_ARRAY_CLOSE +T_AGGREGATE +T_ALL +T_AND +T_ANY +T_ASC +T_COLLECT +T_DESC +T_DISTINCT +T_FALSE +T_FILTER +T_FOR +T_GRAPH +T_IN +T_INBOUND +T_INSERT +T_INTO +T_K_SHORTEST_PATHS +T_LET +T_LIKE +T_LIMIT +T_NONE +T_NOT +T_NULL +T_OR +T_OUTBOUND +T_REMOVE +T_REPLACE +T_RETURN +T_SHORTEST_PATH +T_SORT +T_TRUE +T_UPDATE +T_UPSERT +T_WITH +T_KEEP +T_COUNT +T_OPTIONS +T_PRUNE +T_SEARCH +T_TO +T_CURRENT +T_NEW +T_OLD +T_STRING +T_INT +T_FLOAT +T_PARAMETER +T_QUOTED_STRING +SINGLE_LINE_COMMENT +MULTILINE_COMMENT +SPACES +UNEXPECTED_CHAR +ERROR_RECONGNIGION + +rule names: +DOT +T_REGEX_MATCH +T_REGEX_NON_MATCH +T_EQ +T_NE +T_LT +T_GT +T_LE +T_GE +T_PLUS +T_MINUS +T_TIMES +T_DIV +T_MOD +T_QUESTION +T_COLON +T_SCOPE +T_RANGE +T_COMMA +T_OPEN +T_CLOSE +T_OBJECT_OPEN +T_OBJECT_CLOSE +T_ARRAY_OPEN +T_ARRAY_CLOSE +T_AGGREGATE +T_ALL +T_AND +T_ANY +T_ASC +T_COLLECT +T_DESC +T_DISTINCT +T_FALSE +T_FILTER +T_FOR +T_GRAPH +T_IN +T_INBOUND +T_INSERT +T_INTO +T_K_SHORTEST_PATHS +T_LET +T_LIKE +T_LIMIT +T_NONE +T_NOT +T_NULL +T_OR +T_OUTBOUND +T_REMOVE +T_REPLACE +T_RETURN +T_SHORTEST_PATH +T_SORT +T_TRUE +T_UPDATE +T_UPSERT +T_WITH +T_KEEP +T_COUNT +T_OPTIONS +T_PRUNE +T_SEARCH +T_TO +T_CURRENT +T_NEW +T_OLD +T_STRING +T_INT +T_FLOAT +T_PARAMETER +T_QUOTED_STRING +SINGLE_LINE_COMMENT +MULTILINE_COMMENT +SPACES +UNEXPECTED_CHAR +HEX_DIGIT +DIGIT +A +B +C +D +E +F +G +H +I +J +K +L +M +N +O +P +Q +R +S +T +U +V +W +X +Y +Z +ERROR_RECONGNIGION + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN +null +null +ERRORCHANNEL + +mode names: +DEFAULT_MODE + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 80, 739, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 294, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 414, 10, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 426, 10, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 7, 70, 555, 10, 70, 12, 70, 14, 70, 558, 11, 70, 3, 71, 3, 71, 7, 71, 562, 10, 71, 12, 71, 14, 71, 565, 11, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 6, 71, 572, 10, 71, 13, 71, 14, 71, 573, 3, 71, 3, 71, 3, 71, 3, 71, 6, 71, 580, 10, 71, 13, 71, 14, 71, 581, 5, 71, 584, 10, 71, 3, 72, 3, 72, 7, 72, 588, 10, 72, 12, 72, 14, 72, 591, 11, 72, 3, 72, 5, 72, 594, 10, 72, 3, 72, 3, 72, 6, 72, 598, 10, 72, 13, 72, 14, 72, 599, 3, 72, 3, 72, 5, 72, 604, 10, 72, 3, 72, 6, 72, 607, 10, 72, 13, 72, 14, 72, 608, 5, 72, 611, 10, 72, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 7, 74, 622, 10, 74, 12, 74, 14, 74, 625, 11, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 7, 74, 634, 10, 74, 12, 74, 14, 74, 637, 11, 74, 3, 74, 5, 74, 640, 10, 74, 3, 75, 3, 75, 3, 75, 3, 75, 7, 75, 646, 10, 75, 12, 75, 14, 75, 649, 11, 75, 3, 75, 5, 75, 652, 10, 75, 3, 75, 3, 75, 5, 75, 656, 10, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 7, 76, 664, 10, 76, 12, 76, 14, 76, 667, 11, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 79, 3, 79, 3, 80, 3, 80, 3, 81, 3, 81, 3, 82, 3, 82, 3, 83, 3, 83, 3, 84, 3, 84, 3, 85, 3, 85, 3, 86, 3, 86, 3, 87, 3, 87, 3, 88, 3, 88, 3, 89, 3, 89, 3, 90, 3, 90, 3, 91, 3, 91, 3, 92, 3, 92, 3, 93, 3, 93, 3, 94, 3, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 98, 3, 98, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 665, 2, 108, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 2, 159, 2, 161, 2, 163, 2, 165, 2, 167, 2, 169, 2, 171, 2, 173, 2, 175, 2, 177, 2, 179, 2, 181, 2, 183, 2, 185, 2, 187, 2, 189, 2, 191, 2, 193, 2, 195, 2, 197, 2, 199, 2, 201, 2, 203, 2, 205, 2, 207, 2, 209, 2, 211, 2, 213, 80, 3, 2, 39, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 51, 59, 3, 2, 50, 51, 4, 2, 45, 45, 47, 47, 4, 2, 41, 41, 94, 94, 4, 2, 36, 36, 94, 94, 4, 2, 12, 12, 15, 15, 5, 2, 11, 13, 15, 15, 34, 34, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 50, 59, 4, 2, 67, 67, 99, 99, 4, 2, 68, 68, 100, 100, 4, 2, 69, 69, 101, 101, 4, 2, 70, 70, 102, 102, 4, 2, 71, 71, 103, 103, 4, 2, 72, 72, 104, 104, 4, 2, 73, 73, 105, 105, 4, 2, 74, 74, 106, 106, 4, 2, 75, 75, 107, 107, 4, 2, 76, 76, 108, 108, 4, 2, 77, 77, 109, 109, 4, 2, 78, 78, 110, 110, 4, 2, 79, 79, 111, 111, 4, 2, 80, 80, 112, 112, 4, 2, 81, 81, 113, 113, 4, 2, 82, 82, 114, 114, 4, 2, 83, 83, 115, 115, 4, 2, 84, 84, 116, 116, 4, 2, 85, 85, 117, 117, 4, 2, 86, 86, 118, 118, 4, 2, 87, 87, 119, 119, 4, 2, 88, 88, 120, 120, 4, 2, 89, 89, 121, 121, 4, 2, 90, 90, 122, 122, 4, 2, 91, 91, 123, 123, 4, 2, 92, 92, 124, 124, 2, 738, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 3, 215, 3, 2, 2, 2, 5, 217, 3, 2, 2, 2, 7, 220, 3, 2, 2, 2, 9, 223, 3, 2, 2, 2, 11, 226, 3, 2, 2, 2, 13, 229, 3, 2, 2, 2, 15, 231, 3, 2, 2, 2, 17, 233, 3, 2, 2, 2, 19, 236, 3, 2, 2, 2, 21, 239, 3, 2, 2, 2, 23, 241, 3, 2, 2, 2, 25, 243, 3, 2, 2, 2, 27, 245, 3, 2, 2, 2, 29, 247, 3, 2, 2, 2, 31, 249, 3, 2, 2, 2, 33, 251, 3, 2, 2, 2, 35, 253, 3, 2, 2, 2, 37, 256, 3, 2, 2, 2, 39, 259, 3, 2, 2, 2, 41, 261, 3, 2, 2, 2, 43, 263, 3, 2, 2, 2, 45, 265, 3, 2, 2, 2, 47, 267, 3, 2, 2, 2, 49, 269, 3, 2, 2, 2, 51, 271, 3, 2, 2, 2, 53, 273, 3, 2, 2, 2, 55, 283, 3, 2, 2, 2, 57, 293, 3, 2, 2, 2, 59, 295, 3, 2, 2, 2, 61, 299, 3, 2, 2, 2, 63, 303, 3, 2, 2, 2, 65, 311, 3, 2, 2, 2, 67, 316, 3, 2, 2, 2, 69, 325, 3, 2, 2, 2, 71, 331, 3, 2, 2, 2, 73, 338, 3, 2, 2, 2, 75, 342, 3, 2, 2, 2, 77, 348, 3, 2, 2, 2, 79, 351, 3, 2, 2, 2, 81, 359, 3, 2, 2, 2, 83, 366, 3, 2, 2, 2, 85, 371, 3, 2, 2, 2, 87, 388, 3, 2, 2, 2, 89, 392, 3, 2, 2, 2, 91, 397, 3, 2, 2, 2, 93, 403, 3, 2, 2, 2, 95, 413, 3, 2, 2, 2, 97, 415, 3, 2, 2, 2, 99, 425, 3, 2, 2, 2, 101, 427, 3, 2, 2, 2, 103, 436, 3, 2, 2, 2, 105, 443, 3, 2, 2, 2, 107, 451, 3, 2, 2, 2, 109, 458, 3, 2, 2, 2, 111, 472, 3, 2, 2, 2, 113, 477, 3, 2, 2, 2, 115, 482, 3, 2, 2, 2, 117, 489, 3, 2, 2, 2, 119, 496, 3, 2, 2, 2, 121, 501, 3, 2, 2, 2, 123, 506, 3, 2, 2, 2, 125, 512, 3, 2, 2, 2, 127, 520, 3, 2, 2, 2, 129, 526, 3, 2, 2, 2, 131, 533, 3, 2, 2, 2, 133, 536, 3, 2, 2, 2, 135, 544, 3, 2, 2, 2, 137, 548, 3, 2, 2, 2, 139, 552, 3, 2, 2, 2, 141, 583, 3, 2, 2, 2, 143, 593, 3, 2, 2, 2, 145, 612, 3, 2, 2, 2, 147, 639, 3, 2, 2, 2, 149, 641, 3, 2, 2, 2, 151, 659, 3, 2, 2, 2, 153, 673, 3, 2, 2, 2, 155, 677, 3, 2, 2, 2, 157, 679, 3, 2, 2, 2, 159, 681, 3, 2, 2, 2, 161, 683, 3, 2, 2, 2, 163, 685, 3, 2, 2, 2, 165, 687, 3, 2, 2, 2, 167, 689, 3, 2, 2, 2, 169, 691, 3, 2, 2, 2, 171, 693, 3, 2, 2, 2, 173, 695, 3, 2, 2, 2, 175, 697, 3, 2, 2, 2, 177, 699, 3, 2, 2, 2, 179, 701, 3, 2, 2, 2, 181, 703, 3, 2, 2, 2, 183, 705, 3, 2, 2, 2, 185, 707, 3, 2, 2, 2, 187, 709, 3, 2, 2, 2, 189, 711, 3, 2, 2, 2, 191, 713, 3, 2, 2, 2, 193, 715, 3, 2, 2, 2, 195, 717, 3, 2, 2, 2, 197, 719, 3, 2, 2, 2, 199, 721, 3, 2, 2, 2, 201, 723, 3, 2, 2, 2, 203, 725, 3, 2, 2, 2, 205, 727, 3, 2, 2, 2, 207, 729, 3, 2, 2, 2, 209, 731, 3, 2, 2, 2, 211, 733, 3, 2, 2, 2, 213, 735, 3, 2, 2, 2, 215, 216, 7, 48, 2, 2, 216, 4, 3, 2, 2, 2, 217, 218, 7, 63, 2, 2, 218, 219, 7, 128, 2, 2, 219, 6, 3, 2, 2, 2, 220, 221, 7, 35, 2, 2, 221, 222, 7, 128, 2, 2, 222, 8, 3, 2, 2, 2, 223, 224, 7, 63, 2, 2, 224, 225, 7, 63, 2, 2, 225, 10, 3, 2, 2, 2, 226, 227, 7, 35, 2, 2, 227, 228, 7, 63, 2, 2, 228, 12, 3, 2, 2, 2, 229, 230, 7, 62, 2, 2, 230, 14, 3, 2, 2, 2, 231, 232, 7, 64, 2, 2, 232, 16, 3, 2, 2, 2, 233, 234, 7, 62, 2, 2, 234, 235, 7, 63, 2, 2, 235, 18, 3, 2, 2, 2, 236, 237, 7, 64, 2, 2, 237, 238, 7, 63, 2, 2, 238, 20, 3, 2, 2, 2, 239, 240, 7, 45, 2, 2, 240, 22, 3, 2, 2, 2, 241, 242, 7, 47, 2, 2, 242, 24, 3, 2, 2, 2, 243, 244, 7, 44, 2, 2, 244, 26, 3, 2, 2, 2, 245, 246, 7, 49, 2, 2, 246, 28, 3, 2, 2, 2, 247, 248, 7, 39, 2, 2, 248, 30, 3, 2, 2, 2, 249, 250, 7, 65, 2, 2, 250, 32, 3, 2, 2, 2, 251, 252, 7, 60, 2, 2, 252, 34, 3, 2, 2, 2, 253, 254, 7, 60, 2, 2, 254, 255, 7, 60, 2, 2, 255, 36, 3, 2, 2, 2, 256, 257, 7, 48, 2, 2, 257, 258, 7, 48, 2, 2, 258, 38, 3, 2, 2, 2, 259, 260, 7, 46, 2, 2, 260, 40, 3, 2, 2, 2, 261, 262, 7, 42, 2, 2, 262, 42, 3, 2, 2, 2, 263, 264, 7, 43, 2, 2, 264, 44, 3, 2, 2, 2, 265, 266, 7, 125, 2, 2, 266, 46, 3, 2, 2, 2, 267, 268, 7, 127, 2, 2, 268, 48, 3, 2, 2, 2, 269, 270, 7, 93, 2, 2, 270, 50, 3, 2, 2, 2, 271, 272, 7, 95, 2, 2, 272, 52, 3, 2, 2, 2, 273, 274, 5, 161, 81, 2, 274, 275, 5, 173, 87, 2, 275, 276, 5, 173, 87, 2, 276, 277, 5, 195, 98, 2, 277, 278, 5, 169, 85, 2, 278, 279, 5, 173, 87, 2, 279, 280, 5, 161, 81, 2, 280, 281, 5, 199, 100, 2, 281, 282, 5, 169, 85, 2, 282, 54, 3, 2, 2, 2, 283, 284, 5, 161, 81, 2, 284, 285, 5, 183, 92, 2, 285, 286, 5, 183, 92, 2, 286, 56, 3, 2, 2, 2, 287, 288, 5, 161, 81, 2, 288, 289, 5, 187, 94, 2, 289, 290, 5, 167, 84, 2, 290, 294, 3, 2, 2, 2, 291, 292, 7, 40, 2, 2, 292, 294, 7, 40, 2, 2, 293, 287, 3, 2, 2, 2, 293, 291, 3, 2, 2, 2, 294, 58, 3, 2, 2, 2, 295, 296, 5, 161, 81, 2, 296, 297, 5, 187, 94, 2, 297, 298, 5, 209, 105, 2, 298, 60, 3, 2, 2, 2, 299, 300, 5, 161, 81, 2, 300, 301, 5, 197, 99, 2, 301, 302, 5, 165, 83, 2, 302, 62, 3, 2, 2, 2, 303, 304, 5, 165, 83, 2, 304, 305, 5, 189, 95, 2, 305, 306, 5, 183, 92, 2, 306, 307, 5, 183, 92, 2, 307, 308, 5, 169, 85, 2, 308, 309, 5, 165, 83, 2, 309, 310, 5, 199, 100, 2, 310, 64, 3, 2, 2, 2, 311, 312, 5, 167, 84, 2, 312, 313, 5, 169, 85, 2, 313, 314, 5, 197, 99, 2, 314, 315, 5, 165, 83, 2, 315, 66, 3, 2, 2, 2, 316, 317, 5, 167, 84, 2, 317, 318, 5, 177, 89, 2, 318, 319, 5, 197, 99, 2, 319, 320, 5, 199, 100, 2, 320, 321, 5, 177, 89, 2, 321, 322, 5, 187, 94, 2, 322, 323, 5, 165, 83, 2, 323, 324, 5, 199, 100, 2, 324, 68, 3, 2, 2, 2, 325, 326, 5, 171, 86, 2, 326, 327, 5, 161, 81, 2, 327, 328, 5, 183, 92, 2, 328, 329, 5, 197, 99, 2, 329, 330, 5, 169, 85, 2, 330, 70, 3, 2, 2, 2, 331, 332, 5, 171, 86, 2, 332, 333, 5, 177, 89, 2, 333, 334, 5, 183, 92, 2, 334, 335, 5, 199, 100, 2, 335, 336, 5, 169, 85, 2, 336, 337, 5, 195, 98, 2, 337, 72, 3, 2, 2, 2, 338, 339, 5, 171, 86, 2, 339, 340, 5, 189, 95, 2, 340, 341, 5, 195, 98, 2, 341, 74, 3, 2, 2, 2, 342, 343, 5, 173, 87, 2, 343, 344, 5, 195, 98, 2, 344, 345, 5, 161, 81, 2, 345, 346, 5, 191, 96, 2, 346, 347, 5, 175, 88, 2, 347, 76, 3, 2, 2, 2, 348, 349, 5, 177, 89, 2, 349, 350, 5, 187, 94, 2, 350, 78, 3, 2, 2, 2, 351, 352, 5, 177, 89, 2, 352, 353, 5, 187, 94, 2, 353, 354, 5, 163, 82, 2, 354, 355, 5, 189, 95, 2, 355, 356, 5, 201, 101, 2, 356, 357, 5, 187, 94, 2, 357, 358, 5, 167, 84, 2, 358, 80, 3, 2, 2, 2, 359, 360, 5, 177, 89, 2, 360, 361, 5, 187, 94, 2, 361, 362, 5, 197, 99, 2, 362, 363, 5, 169, 85, 2, 363, 364, 5, 195, 98, 2, 364, 365, 5, 199, 100, 2, 365, 82, 3, 2, 2, 2, 366, 367, 5, 177, 89, 2, 367, 368, 5, 187, 94, 2, 368, 369, 5, 199, 100, 2, 369, 370, 5, 189, 95, 2, 370, 84, 3, 2, 2, 2, 371, 372, 5, 181, 91, 2, 372, 373, 7, 97, 2, 2, 373, 374, 5, 197, 99, 2, 374, 375, 5, 175, 88, 2, 375, 376, 5, 189, 95, 2, 376, 377, 5, 195, 98, 2, 377, 378, 5, 199, 100, 2, 378, 379, 5, 169, 85, 2, 379, 380, 5, 197, 99, 2, 380, 381, 5, 199, 100, 2, 381, 382, 7, 97, 2, 2, 382, 383, 5, 191, 96, 2, 383, 384, 5, 161, 81, 2, 384, 385, 5, 199, 100, 2, 385, 386, 5, 175, 88, 2, 386, 387, 5, 197, 99, 2, 387, 86, 3, 2, 2, 2, 388, 389, 5, 183, 92, 2, 389, 390, 5, 169, 85, 2, 390, 391, 5, 199, 100, 2, 391, 88, 3, 2, 2, 2, 392, 393, 5, 183, 92, 2, 393, 394, 5, 177, 89, 2, 394, 395, 5, 181, 91, 2, 395, 396, 5, 169, 85, 2, 396, 90, 3, 2, 2, 2, 397, 398, 5, 183, 92, 2, 398, 399, 5, 177, 89, 2, 399, 400, 5, 185, 93, 2, 400, 401, 5, 177, 89, 2, 401, 402, 5, 199, 100, 2, 402, 92, 3, 2, 2, 2, 403, 404, 5, 187, 94, 2, 404, 405, 5, 189, 95, 2, 405, 406, 5, 187, 94, 2, 406, 407, 5, 169, 85, 2, 407, 94, 3, 2, 2, 2, 408, 409, 5, 187, 94, 2, 409, 410, 5, 189, 95, 2, 410, 411, 5, 199, 100, 2, 411, 414, 3, 2, 2, 2, 412, 414, 7, 35, 2, 2, 413, 408, 3, 2, 2, 2, 413, 412, 3, 2, 2, 2, 414, 96, 3, 2, 2, 2, 415, 416, 5, 187, 94, 2, 416, 417, 5, 201, 101, 2, 417, 418, 5, 183, 92, 2, 418, 419, 5, 183, 92, 2, 419, 98, 3, 2, 2, 2, 420, 421, 5, 189, 95, 2, 421, 422, 5, 195, 98, 2, 422, 426, 3, 2, 2, 2, 423, 424, 7, 126, 2, 2, 424, 426, 7, 126, 2, 2, 425, 420, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 426, 100, 3, 2, 2, 2, 427, 428, 5, 189, 95, 2, 428, 429, 5, 201, 101, 2, 429, 430, 5, 199, 100, 2, 430, 431, 5, 163, 82, 2, 431, 432, 5, 189, 95, 2, 432, 433, 5, 201, 101, 2, 433, 434, 5, 187, 94, 2, 434, 435, 5, 167, 84, 2, 435, 102, 3, 2, 2, 2, 436, 437, 5, 195, 98, 2, 437, 438, 5, 169, 85, 2, 438, 439, 5, 185, 93, 2, 439, 440, 5, 189, 95, 2, 440, 441, 5, 203, 102, 2, 441, 442, 5, 169, 85, 2, 442, 104, 3, 2, 2, 2, 443, 444, 5, 195, 98, 2, 444, 445, 5, 169, 85, 2, 445, 446, 5, 191, 96, 2, 446, 447, 5, 183, 92, 2, 447, 448, 5, 161, 81, 2, 448, 449, 5, 165, 83, 2, 449, 450, 5, 169, 85, 2, 450, 106, 3, 2, 2, 2, 451, 452, 5, 195, 98, 2, 452, 453, 5, 169, 85, 2, 453, 454, 5, 199, 100, 2, 454, 455, 5, 201, 101, 2, 455, 456, 5, 195, 98, 2, 456, 457, 5, 187, 94, 2, 457, 108, 3, 2, 2, 2, 458, 459, 5, 197, 99, 2, 459, 460, 5, 175, 88, 2, 460, 461, 5, 189, 95, 2, 461, 462, 5, 195, 98, 2, 462, 463, 5, 199, 100, 2, 463, 464, 5, 169, 85, 2, 464, 465, 5, 197, 99, 2, 465, 466, 5, 199, 100, 2, 466, 467, 7, 97, 2, 2, 467, 468, 5, 191, 96, 2, 468, 469, 5, 161, 81, 2, 469, 470, 5, 199, 100, 2, 470, 471, 5, 175, 88, 2, 471, 110, 3, 2, 2, 2, 472, 473, 5, 197, 99, 2, 473, 474, 5, 189, 95, 2, 474, 475, 5, 195, 98, 2, 475, 476, 5, 199, 100, 2, 476, 112, 3, 2, 2, 2, 477, 478, 5, 199, 100, 2, 478, 479, 5, 195, 98, 2, 479, 480, 5, 201, 101, 2, 480, 481, 5, 169, 85, 2, 481, 114, 3, 2, 2, 2, 482, 483, 5, 201, 101, 2, 483, 484, 5, 191, 96, 2, 484, 485, 5, 167, 84, 2, 485, 486, 5, 161, 81, 2, 486, 487, 5, 199, 100, 2, 487, 488, 5, 169, 85, 2, 488, 116, 3, 2, 2, 2, 489, 490, 5, 201, 101, 2, 490, 491, 5, 191, 96, 2, 491, 492, 5, 197, 99, 2, 492, 493, 5, 169, 85, 2, 493, 494, 5, 195, 98, 2, 494, 495, 5, 199, 100, 2, 495, 118, 3, 2, 2, 2, 496, 497, 5, 205, 103, 2, 497, 498, 5, 177, 89, 2, 498, 499, 5, 199, 100, 2, 499, 500, 5, 175, 88, 2, 500, 120, 3, 2, 2, 2, 501, 502, 5, 181, 91, 2, 502, 503, 5, 169, 85, 2, 503, 504, 5, 169, 85, 2, 504, 505, 5, 191, 96, 2, 505, 122, 3, 2, 2, 2, 506, 507, 5, 165, 83, 2, 507, 508, 5, 189, 95, 2, 508, 509, 5, 201, 101, 2, 509, 510, 5, 187, 94, 2, 510, 511, 5, 199, 100, 2, 511, 124, 3, 2, 2, 2, 512, 513, 5, 189, 95, 2, 513, 514, 5, 191, 96, 2, 514, 515, 5, 199, 100, 2, 515, 516, 5, 177, 89, 2, 516, 517, 5, 189, 95, 2, 517, 518, 5, 187, 94, 2, 518, 519, 5, 197, 99, 2, 519, 126, 3, 2, 2, 2, 520, 521, 5, 191, 96, 2, 521, 522, 5, 195, 98, 2, 522, 523, 5, 201, 101, 2, 523, 524, 5, 187, 94, 2, 524, 525, 5, 169, 85, 2, 525, 128, 3, 2, 2, 2, 526, 527, 5, 197, 99, 2, 527, 528, 5, 169, 85, 2, 528, 529, 5, 161, 81, 2, 529, 530, 5, 195, 98, 2, 530, 531, 5, 165, 83, 2, 531, 532, 5, 175, 88, 2, 532, 130, 3, 2, 2, 2, 533, 534, 5, 199, 100, 2, 534, 535, 5, 189, 95, 2, 535, 132, 3, 2, 2, 2, 536, 537, 5, 165, 83, 2, 537, 538, 5, 201, 101, 2, 538, 539, 5, 195, 98, 2, 539, 540, 5, 195, 98, 2, 540, 541, 5, 169, 85, 2, 541, 542, 5, 187, 94, 2, 542, 543, 5, 199, 100, 2, 543, 134, 3, 2, 2, 2, 544, 545, 5, 187, 94, 2, 545, 546, 5, 169, 85, 2, 546, 547, 5, 205, 103, 2, 547, 136, 3, 2, 2, 2, 548, 549, 5, 189, 95, 2, 549, 550, 5, 183, 92, 2, 550, 551, 5, 167, 84, 2, 551, 138, 3, 2, 2, 2, 552, 556, 9, 2, 2, 2, 553, 555, 9, 3, 2, 2, 554, 553, 3, 2, 2, 2, 555, 558, 3, 2, 2, 2, 556, 554, 3, 2, 2, 2, 556, 557, 3, 2, 2, 2, 557, 140, 3, 2, 2, 2, 558, 556, 3, 2, 2, 2, 559, 563, 9, 4, 2, 2, 560, 562, 5, 159, 80, 2, 561, 560, 3, 2, 2, 2, 562, 565, 3, 2, 2, 2, 563, 561, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, 584, 3, 2, 2, 2, 565, 563, 3, 2, 2, 2, 566, 584, 7, 50, 2, 2, 567, 568, 7, 50, 2, 2, 568, 569, 7, 122, 2, 2, 569, 571, 3, 2, 2, 2, 570, 572, 5, 157, 79, 2, 571, 570, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 571, 3, 2, 2, 2, 573, 574, 3, 2, 2, 2, 574, 584, 3, 2, 2, 2, 575, 576, 7, 50, 2, 2, 576, 577, 7, 100, 2, 2, 577, 579, 3, 2, 2, 2, 578, 580, 9, 5, 2, 2, 579, 578, 3, 2, 2, 2, 580, 581, 3, 2, 2, 2, 581, 579, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 584, 3, 2, 2, 2, 583, 559, 3, 2, 2, 2, 583, 566, 3, 2, 2, 2, 583, 567, 3, 2, 2, 2, 583, 575, 3, 2, 2, 2, 584, 142, 3, 2, 2, 2, 585, 589, 9, 4, 2, 2, 586, 588, 5, 159, 80, 2, 587, 586, 3, 2, 2, 2, 588, 591, 3, 2, 2, 2, 589, 587, 3, 2, 2, 2, 589, 590, 3, 2, 2, 2, 590, 594, 3, 2, 2, 2, 591, 589, 3, 2, 2, 2, 592, 594, 7, 50, 2, 2, 593, 585, 3, 2, 2, 2, 593, 592, 3, 2, 2, 2, 593, 594, 3, 2, 2, 2, 594, 595, 3, 2, 2, 2, 595, 597, 7, 48, 2, 2, 596, 598, 5, 159, 80, 2, 597, 596, 3, 2, 2, 2, 598, 599, 3, 2, 2, 2, 599, 597, 3, 2, 2, 2, 599, 600, 3, 2, 2, 2, 600, 610, 3, 2, 2, 2, 601, 603, 5, 169, 85, 2, 602, 604, 9, 6, 2, 2, 603, 602, 3, 2, 2, 2, 603, 604, 3, 2, 2, 2, 604, 606, 3, 2, 2, 2, 605, 607, 5, 159, 80, 2, 606, 605, 3, 2, 2, 2, 607, 608, 3, 2, 2, 2, 608, 606, 3, 2, 2, 2, 608, 609, 3, 2, 2, 2, 609, 611, 3, 2, 2, 2, 610, 601, 3, 2, 2, 2, 610, 611, 3, 2, 2, 2, 611, 144, 3, 2, 2, 2, 612, 613, 7, 66, 2, 2, 613, 614, 5, 139, 70, 2, 614, 146, 3, 2, 2, 2, 615, 623, 7, 41, 2, 2, 616, 617, 7, 94, 2, 2, 617, 622, 11, 2, 2, 2, 618, 619, 7, 41, 2, 2, 619, 622, 7, 41, 2, 2, 620, 622, 10, 7, 2, 2, 621, 616, 3, 2, 2, 2, 621, 618, 3, 2, 2, 2, 621, 620, 3, 2, 2, 2, 622, 625, 3, 2, 2, 2, 623, 621, 3, 2, 2, 2, 623, 624, 3, 2, 2, 2, 624, 626, 3, 2, 2, 2, 625, 623, 3, 2, 2, 2, 626, 640, 7, 41, 2, 2, 627, 635, 7, 36, 2, 2, 628, 629, 7, 94, 2, 2, 629, 634, 11, 2, 2, 2, 630, 631, 7, 36, 2, 2, 631, 634, 7, 36, 2, 2, 632, 634, 10, 8, 2, 2, 633, 628, 3, 2, 2, 2, 633, 630, 3, 2, 2, 2, 633, 632, 3, 2, 2, 2, 634, 637, 3, 2, 2, 2, 635, 633, 3, 2, 2, 2, 635, 636, 3, 2, 2, 2, 636, 638, 3, 2, 2, 2, 637, 635, 3, 2, 2, 2, 638, 640, 7, 36, 2, 2, 639, 615, 3, 2, 2, 2, 639, 627, 3, 2, 2, 2, 640, 148, 3, 2, 2, 2, 641, 642, 7, 49, 2, 2, 642, 643, 7, 49, 2, 2, 643, 647, 3, 2, 2, 2, 644, 646, 10, 9, 2, 2, 645, 644, 3, 2, 2, 2, 646, 649, 3, 2, 2, 2, 647, 645, 3, 2, 2, 2, 647, 648, 3, 2, 2, 2, 648, 655, 3, 2, 2, 2, 649, 647, 3, 2, 2, 2, 650, 652, 7, 15, 2, 2, 651, 650, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 656, 7, 12, 2, 2, 654, 656, 7, 2, 2, 3, 655, 651, 3, 2, 2, 2, 655, 654, 3, 2, 2, 2, 656, 657, 3, 2, 2, 2, 657, 658, 8, 75, 2, 2, 658, 150, 3, 2, 2, 2, 659, 660, 7, 49, 2, 2, 660, 661, 7, 44, 2, 2, 661, 665, 3, 2, 2, 2, 662, 664, 11, 2, 2, 2, 663, 662, 3, 2, 2, 2, 664, 667, 3, 2, 2, 2, 665, 666, 3, 2, 2, 2, 665, 663, 3, 2, 2, 2, 666, 668, 3, 2, 2, 2, 667, 665, 3, 2, 2, 2, 668, 669, 7, 44, 2, 2, 669, 670, 7, 49, 2, 2, 670, 671, 3, 2, 2, 2, 671, 672, 8, 76, 2, 2, 672, 152, 3, 2, 2, 2, 673, 674, 9, 10, 2, 2, 674, 675, 3, 2, 2, 2, 675, 676, 8, 77, 2, 2, 676, 154, 3, 2, 2, 2, 677, 678, 11, 2, 2, 2, 678, 156, 3, 2, 2, 2, 679, 680, 9, 11, 2, 2, 680, 158, 3, 2, 2, 2, 681, 682, 9, 12, 2, 2, 682, 160, 3, 2, 2, 2, 683, 684, 9, 13, 2, 2, 684, 162, 3, 2, 2, 2, 685, 686, 9, 14, 2, 2, 686, 164, 3, 2, 2, 2, 687, 688, 9, 15, 2, 2, 688, 166, 3, 2, 2, 2, 689, 690, 9, 16, 2, 2, 690, 168, 3, 2, 2, 2, 691, 692, 9, 17, 2, 2, 692, 170, 3, 2, 2, 2, 693, 694, 9, 18, 2, 2, 694, 172, 3, 2, 2, 2, 695, 696, 9, 19, 2, 2, 696, 174, 3, 2, 2, 2, 697, 698, 9, 20, 2, 2, 698, 176, 3, 2, 2, 2, 699, 700, 9, 21, 2, 2, 700, 178, 3, 2, 2, 2, 701, 702, 9, 22, 2, 2, 702, 180, 3, 2, 2, 2, 703, 704, 9, 23, 2, 2, 704, 182, 3, 2, 2, 2, 705, 706, 9, 24, 2, 2, 706, 184, 3, 2, 2, 2, 707, 708, 9, 25, 2, 2, 708, 186, 3, 2, 2, 2, 709, 710, 9, 26, 2, 2, 710, 188, 3, 2, 2, 2, 711, 712, 9, 27, 2, 2, 712, 190, 3, 2, 2, 2, 713, 714, 9, 28, 2, 2, 714, 192, 3, 2, 2, 2, 715, 716, 9, 29, 2, 2, 716, 194, 3, 2, 2, 2, 717, 718, 9, 30, 2, 2, 718, 196, 3, 2, 2, 2, 719, 720, 9, 31, 2, 2, 720, 198, 3, 2, 2, 2, 721, 722, 9, 32, 2, 2, 722, 200, 3, 2, 2, 2, 723, 724, 9, 33, 2, 2, 724, 202, 3, 2, 2, 2, 725, 726, 9, 34, 2, 2, 726, 204, 3, 2, 2, 2, 727, 728, 9, 35, 2, 2, 728, 206, 3, 2, 2, 2, 729, 730, 9, 36, 2, 2, 730, 208, 3, 2, 2, 2, 731, 732, 9, 37, 2, 2, 732, 210, 3, 2, 2, 2, 733, 734, 9, 38, 2, 2, 734, 212, 3, 2, 2, 2, 735, 736, 11, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 738, 8, 107, 3, 2, 738, 214, 3, 2, 2, 2, 26, 2, 293, 413, 425, 556, 563, 573, 581, 583, 589, 593, 599, 603, 608, 610, 621, 623, 633, 635, 639, 647, 651, 655, 665, 4, 2, 3, 2, 2, 4, 2] \ No newline at end of file diff --git a/ui/src/suggestions/grammar/CAQLLexer.js b/ui/src/suggestions/grammar/CAQLLexer.js new file mode 100644 index 0000000..3a65707 --- /dev/null +++ b/ui/src/suggestions/grammar/CAQLLexer.js @@ -0,0 +1,607 @@ +// Generated from CAQLLexer.g4 by ANTLR 4.9.2 +// jshint ignore: start +import antlr4 from 'antlr4'; + + + +const serializedATN = ["\u0003\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786", + "\u5964\u0002P\u02e3\b\u0001\u0004\u0002\t\u0002\u0004\u0003\t\u0003", + "\u0004\u0004\t\u0004\u0004\u0005\t\u0005\u0004\u0006\t\u0006\u0004\u0007", + "\t\u0007\u0004\b\t\b\u0004\t\t\t\u0004\n\t\n\u0004\u000b\t\u000b\u0004", + "\f\t\f\u0004\r\t\r\u0004\u000e\t\u000e\u0004\u000f\t\u000f\u0004\u0010", + "\t\u0010\u0004\u0011\t\u0011\u0004\u0012\t\u0012\u0004\u0013\t\u0013", + "\u0004\u0014\t\u0014\u0004\u0015\t\u0015\u0004\u0016\t\u0016\u0004\u0017", + "\t\u0017\u0004\u0018\t\u0018\u0004\u0019\t\u0019\u0004\u001a\t\u001a", + "\u0004\u001b\t\u001b\u0004\u001c\t\u001c\u0004\u001d\t\u001d\u0004\u001e", + "\t\u001e\u0004\u001f\t\u001f\u0004 \t \u0004!\t!\u0004\"\t\"\u0004#", + "\t#\u0004$\t$\u0004%\t%\u0004&\t&\u0004\'\t\'\u0004(\t(\u0004)\t)\u0004", + "*\t*\u0004+\t+\u0004,\t,\u0004-\t-\u0004.\t.\u0004/\t/\u00040\t0\u0004", + "1\t1\u00042\t2\u00043\t3\u00044\t4\u00045\t5\u00046\t6\u00047\t7\u0004", + "8\t8\u00049\t9\u0004:\t:\u0004;\t;\u0004<\t<\u0004=\t=\u0004>\t>\u0004", + "?\t?\u0004@\t@\u0004A\tA\u0004B\tB\u0004C\tC\u0004D\tD\u0004E\tE\u0004", + "F\tF\u0004G\tG\u0004H\tH\u0004I\tI\u0004J\tJ\u0004K\tK\u0004L\tL\u0004", + "M\tM\u0004N\tN\u0004O\tO\u0004P\tP\u0004Q\tQ\u0004R\tR\u0004S\tS\u0004", + "T\tT\u0004U\tU\u0004V\tV\u0004W\tW\u0004X\tX\u0004Y\tY\u0004Z\tZ\u0004", + "[\t[\u0004\\\t\\\u0004]\t]\u0004^\t^\u0004_\t_\u0004`\t`\u0004a\ta\u0004", + "b\tb\u0004c\tc\u0004d\td\u0004e\te\u0004f\tf\u0004g\tg\u0004h\th\u0004", + "i\ti\u0004j\tj\u0004k\tk\u0003\u0002\u0003\u0002\u0003\u0003\u0003\u0003", + "\u0003\u0003\u0003\u0004\u0003\u0004\u0003\u0004\u0003\u0005\u0003\u0005", + "\u0003\u0005\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0007\u0003\u0007", + "\u0003\b\u0003\b\u0003\t\u0003\t\u0003\t\u0003\n\u0003\n\u0003\n\u0003", + "\u000b\u0003\u000b\u0003\f\u0003\f\u0003\r\u0003\r\u0003\u000e\u0003", + "\u000e\u0003\u000f\u0003\u000f\u0003\u0010\u0003\u0010\u0003\u0011\u0003", + "\u0011\u0003\u0012\u0003\u0012\u0003\u0012\u0003\u0013\u0003\u0013\u0003", + "\u0013\u0003\u0014\u0003\u0014\u0003\u0015\u0003\u0015\u0003\u0016\u0003", + "\u0016\u0003\u0017\u0003\u0017\u0003\u0018\u0003\u0018\u0003\u0019\u0003", + "\u0019\u0003\u001a\u0003\u001a\u0003\u001b\u0003\u001b\u0003\u001b\u0003", + "\u001b\u0003\u001b\u0003\u001b\u0003\u001b\u0003\u001b\u0003\u001b\u0003", + "\u001b\u0003\u001c\u0003\u001c\u0003\u001c\u0003\u001c\u0003\u001d\u0003", + "\u001d\u0003\u001d\u0003\u001d\u0003\u001d\u0003\u001d\u0005\u001d\u0126", + "\n\u001d\u0003\u001e\u0003\u001e\u0003\u001e\u0003\u001e\u0003\u001f", + "\u0003\u001f\u0003\u001f\u0003\u001f\u0003 \u0003 \u0003 \u0003 \u0003", + " \u0003 \u0003 \u0003 \u0003!\u0003!\u0003!\u0003!\u0003!\u0003\"\u0003", + "\"\u0003\"\u0003\"\u0003\"\u0003\"\u0003\"\u0003\"\u0003\"\u0003#\u0003", + "#\u0003#\u0003#\u0003#\u0003#\u0003$\u0003$\u0003$\u0003$\u0003$\u0003", + "$\u0003$\u0003%\u0003%\u0003%\u0003%\u0003&\u0003&\u0003&\u0003&\u0003", + "&\u0003&\u0003\'\u0003\'\u0003\'\u0003(\u0003(\u0003(\u0003(\u0003(", + "\u0003(\u0003(\u0003(\u0003)\u0003)\u0003)\u0003)\u0003)\u0003)\u0003", + ")\u0003*\u0003*\u0003*\u0003*\u0003*\u0003+\u0003+\u0003+\u0003+\u0003", + "+\u0003+\u0003+\u0003+\u0003+\u0003+\u0003+\u0003+\u0003+\u0003+\u0003", + "+\u0003+\u0003+\u0003,\u0003,\u0003,\u0003,\u0003-\u0003-\u0003-\u0003", + "-\u0003-\u0003.\u0003.\u0003.\u0003.\u0003.\u0003.\u0003/\u0003/\u0003", + "/\u0003/\u0003/\u00030\u00030\u00030\u00030\u00030\u00050\u019e\n0\u0003", + "1\u00031\u00031\u00031\u00031\u00032\u00032\u00032\u00032\u00032\u0005", + "2\u01aa\n2\u00033\u00033\u00033\u00033\u00033\u00033\u00033\u00033\u0003", + "3\u00034\u00034\u00034\u00034\u00034\u00034\u00034\u00035\u00035\u0003", + "5\u00035\u00035\u00035\u00035\u00035\u00036\u00036\u00036\u00036\u0003", + "6\u00036\u00036\u00037\u00037\u00037\u00037\u00037\u00037\u00037\u0003", + "7\u00037\u00037\u00037\u00037\u00037\u00037\u00038\u00038\u00038\u0003", + "8\u00038\u00039\u00039\u00039\u00039\u00039\u0003:\u0003:\u0003:\u0003", + ":\u0003:\u0003:\u0003:\u0003;\u0003;\u0003;\u0003;\u0003;\u0003;\u0003", + ";\u0003<\u0003<\u0003<\u0003<\u0003<\u0003=\u0003=\u0003=\u0003=\u0003", + "=\u0003>\u0003>\u0003>\u0003>\u0003>\u0003>\u0003?\u0003?\u0003?\u0003", + "?\u0003?\u0003?\u0003?\u0003?\u0003@\u0003@\u0003@\u0003@\u0003@\u0003", + "@\u0003A\u0003A\u0003A\u0003A\u0003A\u0003A\u0003A\u0003B\u0003B\u0003", + "B\u0003C\u0003C\u0003C\u0003C\u0003C\u0003C\u0003C\u0003C\u0003D\u0003", + "D\u0003D\u0003D\u0003E\u0003E\u0003E\u0003E\u0003F\u0003F\u0007F\u022b", + "\nF\fF\u000eF\u022e\u000bF\u0003G\u0003G\u0007G\u0232\nG\fG\u000eG\u0235", + "\u000bG\u0003G\u0003G\u0003G\u0003G\u0003G\u0006G\u023c\nG\rG\u000e", + "G\u023d\u0003G\u0003G\u0003G\u0003G\u0006G\u0244\nG\rG\u000eG\u0245", + "\u0005G\u0248\nG\u0003H\u0003H\u0007H\u024c\nH\fH\u000eH\u024f\u000b", + "H\u0003H\u0005H\u0252\nH\u0003H\u0003H\u0006H\u0256\nH\rH\u000eH\u0257", + "\u0003H\u0003H\u0005H\u025c\nH\u0003H\u0006H\u025f\nH\rH\u000eH\u0260", + "\u0005H\u0263\nH\u0003I\u0003I\u0003I\u0003J\u0003J\u0003J\u0003J\u0003", + "J\u0003J\u0007J\u026e\nJ\fJ\u000eJ\u0271\u000bJ\u0003J\u0003J\u0003", + "J\u0003J\u0003J\u0003J\u0003J\u0007J\u027a\nJ\fJ\u000eJ\u027d\u000b", + "J\u0003J\u0005J\u0280\nJ\u0003K\u0003K\u0003K\u0003K\u0007K\u0286\n", + "K\fK\u000eK\u0289\u000bK\u0003K\u0005K\u028c\nK\u0003K\u0003K\u0005", + "K\u0290\nK\u0003K\u0003K\u0003L\u0003L\u0003L\u0003L\u0007L\u0298\n", + "L\fL\u000eL\u029b\u000bL\u0003L\u0003L\u0003L\u0003L\u0003L\u0003M\u0003", + "M\u0003M\u0003M\u0003N\u0003N\u0003O\u0003O\u0003P\u0003P\u0003Q\u0003", + "Q\u0003R\u0003R\u0003S\u0003S\u0003T\u0003T\u0003U\u0003U\u0003V\u0003", + "V\u0003W\u0003W\u0003X\u0003X\u0003Y\u0003Y\u0003Z\u0003Z\u0003[\u0003", + "[\u0003\\\u0003\\\u0003]\u0003]\u0003^\u0003^\u0003_\u0003_\u0003`\u0003", + "`\u0003a\u0003a\u0003b\u0003b\u0003c\u0003c\u0003d\u0003d\u0003e\u0003", + "e\u0003f\u0003f\u0003g\u0003g\u0003h\u0003h\u0003i\u0003i\u0003j\u0003", + "j\u0003k\u0003k\u0003k\u0003k\u0003\u0299\u0002l\u0003\u0003\u0005\u0004", + "\u0007\u0005\t\u0006\u000b\u0007\r\b\u000f\t\u0011\n\u0013\u000b\u0015", + "\f\u0017\r\u0019\u000e\u001b\u000f\u001d\u0010\u001f\u0011!\u0012#\u0013", + "%\u0014\'\u0015)\u0016+\u0017-\u0018/\u00191\u001a3\u001b5\u001c7\u001d", + "9\u001e;\u001f= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]0_1a2c3e4g5i6k7m8o", + "9q:s;u{?}@\u007fA\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008d", + "H\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009d\u0002\u009f", + "\u0002\u00a1\u0002\u00a3\u0002\u00a5\u0002\u00a7\u0002\u00a9\u0002\u00ab", + "\u0002\u00ad\u0002\u00af\u0002\u00b1\u0002\u00b3\u0002\u00b5\u0002\u00b7", + "\u0002\u00b9\u0002\u00bb\u0002\u00bd\u0002\u00bf\u0002\u00c1\u0002\u00c3", + "\u0002\u00c5\u0002\u00c7\u0002\u00c9\u0002\u00cb\u0002\u00cd\u0002\u00cf", + "\u0002\u00d1\u0002\u00d3\u0002\u00d5P\u0003\u0002\'\u0005\u0002C\\a", + "ac|\u0006\u00022;C\\aac|\u0003\u00023;\u0003\u000223\u0004\u0002--/", + "/\u0004\u0002))^^\u0004\u0002$$^^\u0004\u0002\f\f\u000f\u000f\u0005", + "\u0002\u000b\r\u000f\u000f\"\"\u0005\u00022;CHch\u0003\u00022;\u0004", + "\u0002CCcc\u0004\u0002DDdd\u0004\u0002EEee\u0004\u0002FFff\u0004\u0002", + "GGgg\u0004\u0002HHhh\u0004\u0002IIii\u0004\u0002JJjj\u0004\u0002KKk", + "k\u0004\u0002LLll\u0004\u0002MMmm\u0004\u0002NNnn\u0004\u0002OOoo\u0004", + "\u0002PPpp\u0004\u0002QQqq\u0004\u0002RRrr\u0004\u0002SSss\u0004\u0002", + "TTtt\u0004\u0002UUuu\u0004\u0002VVvv\u0004\u0002WWww\u0004\u0002XXx", + "x\u0004\u0002YYyy\u0004\u0002ZZzz\u0004\u0002[[{{\u0004\u0002\\\\||", + "\u0002\u02e2\u0002\u0003\u0003\u0002\u0002\u0002\u0002\u0005\u0003\u0002", + "\u0002\u0002\u0002\u0007\u0003\u0002\u0002\u0002\u0002\t\u0003\u0002", + "\u0002\u0002\u0002\u000b\u0003\u0002\u0002\u0002\u0002\r\u0003\u0002", + "\u0002\u0002\u0002\u000f\u0003\u0002\u0002\u0002\u0002\u0011\u0003\u0002", + "\u0002\u0002\u0002\u0013\u0003\u0002\u0002\u0002\u0002\u0015\u0003\u0002", + "\u0002\u0002\u0002\u0017\u0003\u0002\u0002\u0002\u0002\u0019\u0003\u0002", + "\u0002\u0002\u0002\u001b\u0003\u0002\u0002\u0002\u0002\u001d\u0003\u0002", + "\u0002\u0002\u0002\u001f\u0003\u0002\u0002\u0002\u0002!\u0003\u0002", + "\u0002\u0002\u0002#\u0003\u0002\u0002\u0002\u0002%\u0003\u0002\u0002", + "\u0002\u0002\'\u0003\u0002\u0002\u0002\u0002)\u0003\u0002\u0002\u0002", + "\u0002+\u0003\u0002\u0002\u0002\u0002-\u0003\u0002\u0002\u0002\u0002", + "/\u0003\u0002\u0002\u0002\u00021\u0003\u0002\u0002\u0002\u00023\u0003", + "\u0002\u0002\u0002\u00025\u0003\u0002\u0002\u0002\u00027\u0003\u0002", + "\u0002\u0002\u00029\u0003\u0002\u0002\u0002\u0002;\u0003\u0002\u0002", + "\u0002\u0002=\u0003\u0002\u0002\u0002\u0002?\u0003\u0002\u0002\u0002", + "\u0002A\u0003\u0002\u0002\u0002\u0002C\u0003\u0002\u0002\u0002\u0002", + "E\u0003\u0002\u0002\u0002\u0002G\u0003\u0002\u0002\u0002\u0002I\u0003", + "\u0002\u0002\u0002\u0002K\u0003\u0002\u0002\u0002\u0002M\u0003\u0002", + "\u0002\u0002\u0002O\u0003\u0002\u0002\u0002\u0002Q\u0003\u0002\u0002", + "\u0002\u0002S\u0003\u0002\u0002\u0002\u0002U\u0003\u0002\u0002\u0002", + "\u0002W\u0003\u0002\u0002\u0002\u0002Y\u0003\u0002\u0002\u0002\u0002", + "[\u0003\u0002\u0002\u0002\u0002]\u0003\u0002\u0002\u0002\u0002_\u0003", + "\u0002\u0002\u0002\u0002a\u0003\u0002\u0002\u0002\u0002c\u0003\u0002", + "\u0002\u0002\u0002e\u0003\u0002\u0002\u0002\u0002g\u0003\u0002\u0002", + "\u0002\u0002i\u0003\u0002\u0002\u0002\u0002k\u0003\u0002\u0002\u0002", + "\u0002m\u0003\u0002\u0002\u0002\u0002o\u0003\u0002\u0002\u0002\u0002", + "q\u0003\u0002\u0002\u0002\u0002s\u0003\u0002\u0002\u0002\u0002u\u0003", + "\u0002\u0002\u0002\u0002w\u0003\u0002\u0002\u0002\u0002y\u0003\u0002", + "\u0002\u0002\u0002{\u0003\u0002\u0002\u0002\u0002}\u0003\u0002\u0002", + "\u0002\u0002\u007f\u0003\u0002\u0002\u0002\u0002\u0081\u0003\u0002\u0002", + "\u0002\u0002\u0083\u0003\u0002\u0002\u0002\u0002\u0085\u0003\u0002\u0002", + "\u0002\u0002\u0087\u0003\u0002\u0002\u0002\u0002\u0089\u0003\u0002\u0002", + "\u0002\u0002\u008b\u0003\u0002\u0002\u0002\u0002\u008d\u0003\u0002\u0002", + "\u0002\u0002\u008f\u0003\u0002\u0002\u0002\u0002\u0091\u0003\u0002\u0002", + "\u0002\u0002\u0093\u0003\u0002\u0002\u0002\u0002\u0095\u0003\u0002\u0002", + "\u0002\u0002\u0097\u0003\u0002\u0002\u0002\u0002\u0099\u0003\u0002\u0002", + "\u0002\u0002\u009b\u0003\u0002\u0002\u0002\u0002\u00d5\u0003\u0002\u0002", + "\u0002\u0003\u00d7\u0003\u0002\u0002\u0002\u0005\u00d9\u0003\u0002\u0002", + "\u0002\u0007\u00dc\u0003\u0002\u0002\u0002\t\u00df\u0003\u0002\u0002", + "\u0002\u000b\u00e2\u0003\u0002\u0002\u0002\r\u00e5\u0003\u0002\u0002", + "\u0002\u000f\u00e7\u0003\u0002\u0002\u0002\u0011\u00e9\u0003\u0002\u0002", + "\u0002\u0013\u00ec\u0003\u0002\u0002\u0002\u0015\u00ef\u0003\u0002\u0002", + "\u0002\u0017\u00f1\u0003\u0002\u0002\u0002\u0019\u00f3\u0003\u0002\u0002", + "\u0002\u001b\u00f5\u0003\u0002\u0002\u0002\u001d\u00f7\u0003\u0002\u0002", + "\u0002\u001f\u00f9\u0003\u0002\u0002\u0002!\u00fb\u0003\u0002\u0002", + "\u0002#\u00fd\u0003\u0002\u0002\u0002%\u0100\u0003\u0002\u0002\u0002", + "\'\u0103\u0003\u0002\u0002\u0002)\u0105\u0003\u0002\u0002\u0002+\u0107", + "\u0003\u0002\u0002\u0002-\u0109\u0003\u0002\u0002\u0002/\u010b\u0003", + "\u0002\u0002\u00021\u010d\u0003\u0002\u0002\u00023\u010f\u0003\u0002", + "\u0002\u00025\u0111\u0003\u0002\u0002\u00027\u011b\u0003\u0002\u0002", + "\u00029\u0125\u0003\u0002\u0002\u0002;\u0127\u0003\u0002\u0002\u0002", + "=\u012b\u0003\u0002\u0002\u0002?\u012f\u0003\u0002\u0002\u0002A\u0137", + "\u0003\u0002\u0002\u0002C\u013c\u0003\u0002\u0002\u0002E\u0145\u0003", + "\u0002\u0002\u0002G\u014b\u0003\u0002\u0002\u0002I\u0152\u0003\u0002", + "\u0002\u0002K\u0156\u0003\u0002\u0002\u0002M\u015c\u0003\u0002\u0002", + "\u0002O\u015f\u0003\u0002\u0002\u0002Q\u0167\u0003\u0002\u0002\u0002", + "S\u016e\u0003\u0002\u0002\u0002U\u0173\u0003\u0002\u0002\u0002W\u0184", + "\u0003\u0002\u0002\u0002Y\u0188\u0003\u0002\u0002\u0002[\u018d\u0003", + "\u0002\u0002\u0002]\u0193\u0003\u0002\u0002\u0002_\u019d\u0003\u0002", + "\u0002\u0002a\u019f\u0003\u0002\u0002\u0002c\u01a9\u0003\u0002\u0002", + "\u0002e\u01ab\u0003\u0002\u0002\u0002g\u01b4\u0003\u0002\u0002\u0002", + "i\u01bb\u0003\u0002\u0002\u0002k\u01c3\u0003\u0002\u0002\u0002m\u01ca", + "\u0003\u0002\u0002\u0002o\u01d8\u0003\u0002\u0002\u0002q\u01dd\u0003", + "\u0002\u0002\u0002s\u01e2\u0003\u0002\u0002\u0002u\u01e9\u0003\u0002", + "\u0002\u0002w\u01f0\u0003\u0002\u0002\u0002y\u01f5\u0003\u0002\u0002", + "\u0002{\u01fa\u0003\u0002\u0002\u0002}\u0200\u0003\u0002\u0002\u0002", + "\u007f\u0208\u0003\u0002\u0002\u0002\u0081\u020e\u0003\u0002\u0002\u0002", + "\u0083\u0215\u0003\u0002\u0002\u0002\u0085\u0218\u0003\u0002\u0002\u0002", + "\u0087\u0220\u0003\u0002\u0002\u0002\u0089\u0224\u0003\u0002\u0002\u0002", + "\u008b\u0228\u0003\u0002\u0002\u0002\u008d\u0247\u0003\u0002\u0002\u0002", + "\u008f\u0251\u0003\u0002\u0002\u0002\u0091\u0264\u0003\u0002\u0002\u0002", + "\u0093\u027f\u0003\u0002\u0002\u0002\u0095\u0281\u0003\u0002\u0002\u0002", + "\u0097\u0293\u0003\u0002\u0002\u0002\u0099\u02a1\u0003\u0002\u0002\u0002", + "\u009b\u02a5\u0003\u0002\u0002\u0002\u009d\u02a7\u0003\u0002\u0002\u0002", + "\u009f\u02a9\u0003\u0002\u0002\u0002\u00a1\u02ab\u0003\u0002\u0002\u0002", + "\u00a3\u02ad\u0003\u0002\u0002\u0002\u00a5\u02af\u0003\u0002\u0002\u0002", + "\u00a7\u02b1\u0003\u0002\u0002\u0002\u00a9\u02b3\u0003\u0002\u0002\u0002", + "\u00ab\u02b5\u0003\u0002\u0002\u0002\u00ad\u02b7\u0003\u0002\u0002\u0002", + "\u00af\u02b9\u0003\u0002\u0002\u0002\u00b1\u02bb\u0003\u0002\u0002\u0002", + "\u00b3\u02bd\u0003\u0002\u0002\u0002\u00b5\u02bf\u0003\u0002\u0002\u0002", + "\u00b7\u02c1\u0003\u0002\u0002\u0002\u00b9\u02c3\u0003\u0002\u0002\u0002", + "\u00bb\u02c5\u0003\u0002\u0002\u0002\u00bd\u02c7\u0003\u0002\u0002\u0002", + "\u00bf\u02c9\u0003\u0002\u0002\u0002\u00c1\u02cb\u0003\u0002\u0002\u0002", + "\u00c3\u02cd\u0003\u0002\u0002\u0002\u00c5\u02cf\u0003\u0002\u0002\u0002", + "\u00c7\u02d1\u0003\u0002\u0002\u0002\u00c9\u02d3\u0003\u0002\u0002\u0002", + "\u00cb\u02d5\u0003\u0002\u0002\u0002\u00cd\u02d7\u0003\u0002\u0002\u0002", + "\u00cf\u02d9\u0003\u0002\u0002\u0002\u00d1\u02db\u0003\u0002\u0002\u0002", + "\u00d3\u02dd\u0003\u0002\u0002\u0002\u00d5\u02df\u0003\u0002\u0002\u0002", + "\u00d7\u00d8\u00070\u0002\u0002\u00d8\u0004\u0003\u0002\u0002\u0002", + "\u00d9\u00da\u0007?\u0002\u0002\u00da\u00db\u0007\u0080\u0002\u0002", + "\u00db\u0006\u0003\u0002\u0002\u0002\u00dc\u00dd\u0007#\u0002\u0002", + "\u00dd\u00de\u0007\u0080\u0002\u0002\u00de\b\u0003\u0002\u0002\u0002", + "\u00df\u00e0\u0007?\u0002\u0002\u00e0\u00e1\u0007?\u0002\u0002\u00e1", + "\n\u0003\u0002\u0002\u0002\u00e2\u00e3\u0007#\u0002\u0002\u00e3\u00e4", + "\u0007?\u0002\u0002\u00e4\f\u0003\u0002\u0002\u0002\u00e5\u00e6\u0007", + ">\u0002\u0002\u00e6\u000e\u0003\u0002\u0002\u0002\u00e7\u00e8\u0007", + "@\u0002\u0002\u00e8\u0010\u0003\u0002\u0002\u0002\u00e9\u00ea\u0007", + ">\u0002\u0002\u00ea\u00eb\u0007?\u0002\u0002\u00eb\u0012\u0003\u0002", + "\u0002\u0002\u00ec\u00ed\u0007@\u0002\u0002\u00ed\u00ee\u0007?\u0002", + "\u0002\u00ee\u0014\u0003\u0002\u0002\u0002\u00ef\u00f0\u0007-\u0002", + "\u0002\u00f0\u0016\u0003\u0002\u0002\u0002\u00f1\u00f2\u0007/\u0002", + "\u0002\u00f2\u0018\u0003\u0002\u0002\u0002\u00f3\u00f4\u0007,\u0002", + "\u0002\u00f4\u001a\u0003\u0002\u0002\u0002\u00f5\u00f6\u00071\u0002", + "\u0002\u00f6\u001c\u0003\u0002\u0002\u0002\u00f7\u00f8\u0007\'\u0002", + "\u0002\u00f8\u001e\u0003\u0002\u0002\u0002\u00f9\u00fa\u0007A\u0002", + "\u0002\u00fa \u0003\u0002\u0002\u0002\u00fb\u00fc\u0007<\u0002\u0002", + "\u00fc\"\u0003\u0002\u0002\u0002\u00fd\u00fe\u0007<\u0002\u0002\u00fe", + "\u00ff\u0007<\u0002\u0002\u00ff$\u0003\u0002\u0002\u0002\u0100\u0101", + "\u00070\u0002\u0002\u0101\u0102\u00070\u0002\u0002\u0102&\u0003\u0002", + "\u0002\u0002\u0103\u0104\u0007.\u0002\u0002\u0104(\u0003\u0002\u0002", + "\u0002\u0105\u0106\u0007*\u0002\u0002\u0106*\u0003\u0002\u0002\u0002", + "\u0107\u0108\u0007+\u0002\u0002\u0108,\u0003\u0002\u0002\u0002\u0109", + "\u010a\u0007}\u0002\u0002\u010a.\u0003\u0002\u0002\u0002\u010b\u010c", + "\u0007\u007f\u0002\u0002\u010c0\u0003\u0002\u0002\u0002\u010d\u010e", + "\u0007]\u0002\u0002\u010e2\u0003\u0002\u0002\u0002\u010f\u0110\u0007", + "_\u0002\u0002\u01104\u0003\u0002\u0002\u0002\u0111\u0112\u0005\u00a1", + "Q\u0002\u0112\u0113\u0005\u00adW\u0002\u0113\u0114\u0005\u00adW\u0002", + "\u0114\u0115\u0005\u00c3b\u0002\u0115\u0116\u0005\u00a9U\u0002\u0116", + "\u0117\u0005\u00adW\u0002\u0117\u0118\u0005\u00a1Q\u0002\u0118\u0119", + "\u0005\u00c7d\u0002\u0119\u011a\u0005\u00a9U\u0002\u011a6\u0003\u0002", + "\u0002\u0002\u011b\u011c\u0005\u00a1Q\u0002\u011c\u011d\u0005\u00b7", + "\\\u0002\u011d\u011e\u0005\u00b7\\\u0002\u011e8\u0003\u0002\u0002\u0002", + "\u011f\u0120\u0005\u00a1Q\u0002\u0120\u0121\u0005\u00bb^\u0002\u0121", + "\u0122\u0005\u00a7T\u0002\u0122\u0126\u0003\u0002\u0002\u0002\u0123", + "\u0124\u0007(\u0002\u0002\u0124\u0126\u0007(\u0002\u0002\u0125\u011f", + "\u0003\u0002\u0002\u0002\u0125\u0123\u0003\u0002\u0002\u0002\u0126:", + "\u0003\u0002\u0002\u0002\u0127\u0128\u0005\u00a1Q\u0002\u0128\u0129", + "\u0005\u00bb^\u0002\u0129\u012a\u0005\u00d1i\u0002\u012a<\u0003\u0002", + "\u0002\u0002\u012b\u012c\u0005\u00a1Q\u0002\u012c\u012d\u0005\u00c5", + "c\u0002\u012d\u012e\u0005\u00a5S\u0002\u012e>\u0003\u0002\u0002\u0002", + "\u012f\u0130\u0005\u00a5S\u0002\u0130\u0131\u0005\u00bd_\u0002\u0131", + "\u0132\u0005\u00b7\\\u0002\u0132\u0133\u0005\u00b7\\\u0002\u0133\u0134", + "\u0005\u00a9U\u0002\u0134\u0135\u0005\u00a5S\u0002\u0135\u0136\u0005", + "\u00c7d\u0002\u0136@\u0003\u0002\u0002\u0002\u0137\u0138\u0005\u00a7", + "T\u0002\u0138\u0139\u0005\u00a9U\u0002\u0139\u013a\u0005\u00c5c\u0002", + "\u013a\u013b\u0005\u00a5S\u0002\u013bB\u0003\u0002\u0002\u0002\u013c", + "\u013d\u0005\u00a7T\u0002\u013d\u013e\u0005\u00b1Y\u0002\u013e\u013f", + "\u0005\u00c5c\u0002\u013f\u0140\u0005\u00c7d\u0002\u0140\u0141\u0005", + "\u00b1Y\u0002\u0141\u0142\u0005\u00bb^\u0002\u0142\u0143\u0005\u00a5", + "S\u0002\u0143\u0144\u0005\u00c7d\u0002\u0144D\u0003\u0002\u0002\u0002", + "\u0145\u0146\u0005\u00abV\u0002\u0146\u0147\u0005\u00a1Q\u0002\u0147", + "\u0148\u0005\u00b7\\\u0002\u0148\u0149\u0005\u00c5c\u0002\u0149\u014a", + "\u0005\u00a9U\u0002\u014aF\u0003\u0002\u0002\u0002\u014b\u014c\u0005", + "\u00abV\u0002\u014c\u014d\u0005\u00b1Y\u0002\u014d\u014e\u0005\u00b7", + "\\\u0002\u014e\u014f\u0005\u00c7d\u0002\u014f\u0150\u0005\u00a9U\u0002", + "\u0150\u0151\u0005\u00c3b\u0002\u0151H\u0003\u0002\u0002\u0002\u0152", + "\u0153\u0005\u00abV\u0002\u0153\u0154\u0005\u00bd_\u0002\u0154\u0155", + "\u0005\u00c3b\u0002\u0155J\u0003\u0002\u0002\u0002\u0156\u0157\u0005", + "\u00adW\u0002\u0157\u0158\u0005\u00c3b\u0002\u0158\u0159\u0005\u00a1", + "Q\u0002\u0159\u015a\u0005\u00bf`\u0002\u015a\u015b\u0005\u00afX\u0002", + "\u015bL\u0003\u0002\u0002\u0002\u015c\u015d\u0005\u00b1Y\u0002\u015d", + "\u015e\u0005\u00bb^\u0002\u015eN\u0003\u0002\u0002\u0002\u015f\u0160", + "\u0005\u00b1Y\u0002\u0160\u0161\u0005\u00bb^\u0002\u0161\u0162\u0005", + "\u00a3R\u0002\u0162\u0163\u0005\u00bd_\u0002\u0163\u0164\u0005\u00c9", + "e\u0002\u0164\u0165\u0005\u00bb^\u0002\u0165\u0166\u0005\u00a7T\u0002", + "\u0166P\u0003\u0002\u0002\u0002\u0167\u0168\u0005\u00b1Y\u0002\u0168", + "\u0169\u0005\u00bb^\u0002\u0169\u016a\u0005\u00c5c\u0002\u016a\u016b", + "\u0005\u00a9U\u0002\u016b\u016c\u0005\u00c3b\u0002\u016c\u016d\u0005", + "\u00c7d\u0002\u016dR\u0003\u0002\u0002\u0002\u016e\u016f\u0005\u00b1", + "Y\u0002\u016f\u0170\u0005\u00bb^\u0002\u0170\u0171\u0005\u00c7d\u0002", + "\u0171\u0172\u0005\u00bd_\u0002\u0172T\u0003\u0002\u0002\u0002\u0173", + "\u0174\u0005\u00b5[\u0002\u0174\u0175\u0007a\u0002\u0002\u0175\u0176", + "\u0005\u00c5c\u0002\u0176\u0177\u0005\u00afX\u0002\u0177\u0178\u0005", + "\u00bd_\u0002\u0178\u0179\u0005\u00c3b\u0002\u0179\u017a\u0005\u00c7", + "d\u0002\u017a\u017b\u0005\u00a9U\u0002\u017b\u017c\u0005\u00c5c\u0002", + "\u017c\u017d\u0005\u00c7d\u0002\u017d\u017e\u0007a\u0002\u0002\u017e", + "\u017f\u0005\u00bf`\u0002\u017f\u0180\u0005\u00a1Q\u0002\u0180\u0181", + "\u0005\u00c7d\u0002\u0181\u0182\u0005\u00afX\u0002\u0182\u0183\u0005", + "\u00c5c\u0002\u0183V\u0003\u0002\u0002\u0002\u0184\u0185\u0005\u00b7", + "\\\u0002\u0185\u0186\u0005\u00a9U\u0002\u0186\u0187\u0005\u00c7d\u0002", + "\u0187X\u0003\u0002\u0002\u0002\u0188\u0189\u0005\u00b7\\\u0002\u0189", + "\u018a\u0005\u00b1Y\u0002\u018a\u018b\u0005\u00b5[\u0002\u018b\u018c", + "\u0005\u00a9U\u0002\u018cZ\u0003\u0002\u0002\u0002\u018d\u018e\u0005", + "\u00b7\\\u0002\u018e\u018f\u0005\u00b1Y\u0002\u018f\u0190\u0005\u00b9", + "]\u0002\u0190\u0191\u0005\u00b1Y\u0002\u0191\u0192\u0005\u00c7d\u0002", + "\u0192\\\u0003\u0002\u0002\u0002\u0193\u0194\u0005\u00bb^\u0002\u0194", + "\u0195\u0005\u00bd_\u0002\u0195\u0196\u0005\u00bb^\u0002\u0196\u0197", + "\u0005\u00a9U\u0002\u0197^\u0003\u0002\u0002\u0002\u0198\u0199\u0005", + "\u00bb^\u0002\u0199\u019a\u0005\u00bd_\u0002\u019a\u019b\u0005\u00c7", + "d\u0002\u019b\u019e\u0003\u0002\u0002\u0002\u019c\u019e\u0007#\u0002", + "\u0002\u019d\u0198\u0003\u0002\u0002\u0002\u019d\u019c\u0003\u0002\u0002", + "\u0002\u019e`\u0003\u0002\u0002\u0002\u019f\u01a0\u0005\u00bb^\u0002", + "\u01a0\u01a1\u0005\u00c9e\u0002\u01a1\u01a2\u0005\u00b7\\\u0002\u01a2", + "\u01a3\u0005\u00b7\\\u0002\u01a3b\u0003\u0002\u0002\u0002\u01a4\u01a5", + "\u0005\u00bd_\u0002\u01a5\u01a6\u0005\u00c3b\u0002\u01a6\u01aa\u0003", + "\u0002\u0002\u0002\u01a7\u01a8\u0007~\u0002\u0002\u01a8\u01aa\u0007", + "~\u0002\u0002\u01a9\u01a4\u0003\u0002\u0002\u0002\u01a9\u01a7\u0003", + "\u0002\u0002\u0002\u01aad\u0003\u0002\u0002\u0002\u01ab\u01ac\u0005", + "\u00bd_\u0002\u01ac\u01ad\u0005\u00c9e\u0002\u01ad\u01ae\u0005\u00c7", + "d\u0002\u01ae\u01af\u0005\u00a3R\u0002\u01af\u01b0\u0005\u00bd_\u0002", + "\u01b0\u01b1\u0005\u00c9e\u0002\u01b1\u01b2\u0005\u00bb^\u0002\u01b2", + "\u01b3\u0005\u00a7T\u0002\u01b3f\u0003\u0002\u0002\u0002\u01b4\u01b5", + "\u0005\u00c3b\u0002\u01b5\u01b6\u0005\u00a9U\u0002\u01b6\u01b7\u0005", + "\u00b9]\u0002\u01b7\u01b8\u0005\u00bd_\u0002\u01b8\u01b9\u0005\u00cb", + "f\u0002\u01b9\u01ba\u0005\u00a9U\u0002\u01bah\u0003\u0002\u0002\u0002", + "\u01bb\u01bc\u0005\u00c3b\u0002\u01bc\u01bd\u0005\u00a9U\u0002\u01bd", + "\u01be\u0005\u00bf`\u0002\u01be\u01bf\u0005\u00b7\\\u0002\u01bf\u01c0", + "\u0005\u00a1Q\u0002\u01c0\u01c1\u0005\u00a5S\u0002\u01c1\u01c2\u0005", + "\u00a9U\u0002\u01c2j\u0003\u0002\u0002\u0002\u01c3\u01c4\u0005\u00c3", + "b\u0002\u01c4\u01c5\u0005\u00a9U\u0002\u01c5\u01c6\u0005\u00c7d\u0002", + "\u01c6\u01c7\u0005\u00c9e\u0002\u01c7\u01c8\u0005\u00c3b\u0002\u01c8", + "\u01c9\u0005\u00bb^\u0002\u01c9l\u0003\u0002\u0002\u0002\u01ca\u01cb", + "\u0005\u00c5c\u0002\u01cb\u01cc\u0005\u00afX\u0002\u01cc\u01cd\u0005", + "\u00bd_\u0002\u01cd\u01ce\u0005\u00c3b\u0002\u01ce\u01cf\u0005\u00c7", + "d\u0002\u01cf\u01d0\u0005\u00a9U\u0002\u01d0\u01d1\u0005\u00c5c\u0002", + "\u01d1\u01d2\u0005\u00c7d\u0002\u01d2\u01d3\u0007a\u0002\u0002\u01d3", + "\u01d4\u0005\u00bf`\u0002\u01d4\u01d5\u0005\u00a1Q\u0002\u01d5\u01d6", + "\u0005\u00c7d\u0002\u01d6\u01d7\u0005\u00afX\u0002\u01d7n\u0003\u0002", + "\u0002\u0002\u01d8\u01d9\u0005\u00c5c\u0002\u01d9\u01da\u0005\u00bd", + "_\u0002\u01da\u01db\u0005\u00c3b\u0002\u01db\u01dc\u0005\u00c7d\u0002", + "\u01dcp\u0003\u0002\u0002\u0002\u01dd\u01de\u0005\u00c7d\u0002\u01de", + "\u01df\u0005\u00c3b\u0002\u01df\u01e0\u0005\u00c9e\u0002\u01e0\u01e1", + "\u0005\u00a9U\u0002\u01e1r\u0003\u0002\u0002\u0002\u01e2\u01e3\u0005", + "\u00c9e\u0002\u01e3\u01e4\u0005\u00bf`\u0002\u01e4\u01e5\u0005\u00a7", + "T\u0002\u01e5\u01e6\u0005\u00a1Q\u0002\u01e6\u01e7\u0005\u00c7d\u0002", + "\u01e7\u01e8\u0005\u00a9U\u0002\u01e8t\u0003\u0002\u0002\u0002\u01e9", + "\u01ea\u0005\u00c9e\u0002\u01ea\u01eb\u0005\u00bf`\u0002\u01eb\u01ec", + "\u0005\u00c5c\u0002\u01ec\u01ed\u0005\u00a9U\u0002\u01ed\u01ee\u0005", + "\u00c3b\u0002\u01ee\u01ef\u0005\u00c7d\u0002\u01efv\u0003\u0002\u0002", + "\u0002\u01f0\u01f1\u0005\u00cdg\u0002\u01f1\u01f2\u0005\u00b1Y\u0002", + "\u01f2\u01f3\u0005\u00c7d\u0002\u01f3\u01f4\u0005\u00afX\u0002\u01f4", + "x\u0003\u0002\u0002\u0002\u01f5\u01f6\u0005\u00b5[\u0002\u01f6\u01f7", + "\u0005\u00a9U\u0002\u01f7\u01f8\u0005\u00a9U\u0002\u01f8\u01f9\u0005", + "\u00bf`\u0002\u01f9z\u0003\u0002\u0002\u0002\u01fa\u01fb\u0005\u00a5", + "S\u0002\u01fb\u01fc\u0005\u00bd_\u0002\u01fc\u01fd\u0005\u00c9e\u0002", + "\u01fd\u01fe\u0005\u00bb^\u0002\u01fe\u01ff\u0005\u00c7d\u0002\u01ff", + "|\u0003\u0002\u0002\u0002\u0200\u0201\u0005\u00bd_\u0002\u0201\u0202", + "\u0005\u00bf`\u0002\u0202\u0203\u0005\u00c7d\u0002\u0203\u0204\u0005", + "\u00b1Y\u0002\u0204\u0205\u0005\u00bd_\u0002\u0205\u0206\u0005\u00bb", + "^\u0002\u0206\u0207\u0005\u00c5c\u0002\u0207~\u0003\u0002\u0002\u0002", + "\u0208\u0209\u0005\u00bf`\u0002\u0209\u020a\u0005\u00c3b\u0002\u020a", + "\u020b\u0005\u00c9e\u0002\u020b\u020c\u0005\u00bb^\u0002\u020c\u020d", + "\u0005\u00a9U\u0002\u020d\u0080\u0003\u0002\u0002\u0002\u020e\u020f", + "\u0005\u00c5c\u0002\u020f\u0210\u0005\u00a9U\u0002\u0210\u0211\u0005", + "\u00a1Q\u0002\u0211\u0212\u0005\u00c3b\u0002\u0212\u0213\u0005\u00a5", + "S\u0002\u0213\u0214\u0005\u00afX\u0002\u0214\u0082\u0003\u0002\u0002", + "\u0002\u0215\u0216\u0005\u00c7d\u0002\u0216\u0217\u0005\u00bd_\u0002", + "\u0217\u0084\u0003\u0002\u0002\u0002\u0218\u0219\u0005\u00a5S\u0002", + "\u0219\u021a\u0005\u00c9e\u0002\u021a\u021b\u0005\u00c3b\u0002\u021b", + "\u021c\u0005\u00c3b\u0002\u021c\u021d\u0005\u00a9U\u0002\u021d\u021e", + "\u0005\u00bb^\u0002\u021e\u021f\u0005\u00c7d\u0002\u021f\u0086\u0003", + "\u0002\u0002\u0002\u0220\u0221\u0005\u00bb^\u0002\u0221\u0222\u0005", + "\u00a9U\u0002\u0222\u0223\u0005\u00cdg\u0002\u0223\u0088\u0003\u0002", + "\u0002\u0002\u0224\u0225\u0005\u00bd_\u0002\u0225\u0226\u0005\u00b7", + "\\\u0002\u0226\u0227\u0005\u00a7T\u0002\u0227\u008a\u0003\u0002\u0002", + "\u0002\u0228\u022c\t\u0002\u0002\u0002\u0229\u022b\t\u0003\u0002\u0002", + "\u022a\u0229\u0003\u0002\u0002\u0002\u022b\u022e\u0003\u0002\u0002\u0002", + "\u022c\u022a\u0003\u0002\u0002\u0002\u022c\u022d\u0003\u0002\u0002\u0002", + "\u022d\u008c\u0003\u0002\u0002\u0002\u022e\u022c\u0003\u0002\u0002\u0002", + "\u022f\u0233\t\u0004\u0002\u0002\u0230\u0232\u0005\u009fP\u0002\u0231", + "\u0230\u0003\u0002\u0002\u0002\u0232\u0235\u0003\u0002\u0002\u0002\u0233", + "\u0231\u0003\u0002\u0002\u0002\u0233\u0234\u0003\u0002\u0002\u0002\u0234", + "\u0248\u0003\u0002\u0002\u0002\u0235\u0233\u0003\u0002\u0002\u0002\u0236", + "\u0248\u00072\u0002\u0002\u0237\u0238\u00072\u0002\u0002\u0238\u0239", + "\u0007z\u0002\u0002\u0239\u023b\u0003\u0002\u0002\u0002\u023a\u023c", + "\u0005\u009dO\u0002\u023b\u023a\u0003\u0002\u0002\u0002\u023c\u023d", + "\u0003\u0002\u0002\u0002\u023d\u023b\u0003\u0002\u0002\u0002\u023d\u023e", + "\u0003\u0002\u0002\u0002\u023e\u0248\u0003\u0002\u0002\u0002\u023f\u0240", + "\u00072\u0002\u0002\u0240\u0241\u0007d\u0002\u0002\u0241\u0243\u0003", + "\u0002\u0002\u0002\u0242\u0244\t\u0005\u0002\u0002\u0243\u0242\u0003", + "\u0002\u0002\u0002\u0244\u0245\u0003\u0002\u0002\u0002\u0245\u0243\u0003", + "\u0002\u0002\u0002\u0245\u0246\u0003\u0002\u0002\u0002\u0246\u0248\u0003", + "\u0002\u0002\u0002\u0247\u022f\u0003\u0002\u0002\u0002\u0247\u0236\u0003", + "\u0002\u0002\u0002\u0247\u0237\u0003\u0002\u0002\u0002\u0247\u023f\u0003", + "\u0002\u0002\u0002\u0248\u008e\u0003\u0002\u0002\u0002\u0249\u024d\t", + "\u0004\u0002\u0002\u024a\u024c\u0005\u009fP\u0002\u024b\u024a\u0003", + "\u0002\u0002\u0002\u024c\u024f\u0003\u0002\u0002\u0002\u024d\u024b\u0003", + "\u0002\u0002\u0002\u024d\u024e\u0003\u0002\u0002\u0002\u024e\u0252\u0003", + "\u0002\u0002\u0002\u024f\u024d\u0003\u0002\u0002\u0002\u0250\u0252\u0007", + "2\u0002\u0002\u0251\u0249\u0003\u0002\u0002\u0002\u0251\u0250\u0003", + "\u0002\u0002\u0002\u0251\u0252\u0003\u0002\u0002\u0002\u0252\u0253\u0003", + "\u0002\u0002\u0002\u0253\u0255\u00070\u0002\u0002\u0254\u0256\u0005", + "\u009fP\u0002\u0255\u0254\u0003\u0002\u0002\u0002\u0256\u0257\u0003", + "\u0002\u0002\u0002\u0257\u0255\u0003\u0002\u0002\u0002\u0257\u0258\u0003", + "\u0002\u0002\u0002\u0258\u0262\u0003\u0002\u0002\u0002\u0259\u025b\u0005", + "\u00a9U\u0002\u025a\u025c\t\u0006\u0002\u0002\u025b\u025a\u0003\u0002", + "\u0002\u0002\u025b\u025c\u0003\u0002\u0002\u0002\u025c\u025e\u0003\u0002", + "\u0002\u0002\u025d\u025f\u0005\u009fP\u0002\u025e\u025d\u0003\u0002", + "\u0002\u0002\u025f\u0260\u0003\u0002\u0002\u0002\u0260\u025e\u0003\u0002", + "\u0002\u0002\u0260\u0261\u0003\u0002\u0002\u0002\u0261\u0263\u0003\u0002", + "\u0002\u0002\u0262\u0259\u0003\u0002\u0002\u0002\u0262\u0263\u0003\u0002", + "\u0002\u0002\u0263\u0090\u0003\u0002\u0002\u0002\u0264\u0265\u0007B", + "\u0002\u0002\u0265\u0266\u0005\u008bF\u0002\u0266\u0092\u0003\u0002", + "\u0002\u0002\u0267\u026f\u0007)\u0002\u0002\u0268\u0269\u0007^\u0002", + "\u0002\u0269\u026e\u000b\u0002\u0002\u0002\u026a\u026b\u0007)\u0002", + "\u0002\u026b\u026e\u0007)\u0002\u0002\u026c\u026e\n\u0007\u0002\u0002", + "\u026d\u0268\u0003\u0002\u0002\u0002\u026d\u026a\u0003\u0002\u0002\u0002", + "\u026d\u026c\u0003\u0002\u0002\u0002\u026e\u0271\u0003\u0002\u0002\u0002", + "\u026f\u026d\u0003\u0002\u0002\u0002\u026f\u0270\u0003\u0002\u0002\u0002", + "\u0270\u0272\u0003\u0002\u0002\u0002\u0271\u026f\u0003\u0002\u0002\u0002", + "\u0272\u0280\u0007)\u0002\u0002\u0273\u027b\u0007$\u0002\u0002\u0274", + "\u0275\u0007^\u0002\u0002\u0275\u027a\u000b\u0002\u0002\u0002\u0276", + "\u0277\u0007$\u0002\u0002\u0277\u027a\u0007$\u0002\u0002\u0278\u027a", + "\n\b\u0002\u0002\u0279\u0274\u0003\u0002\u0002\u0002\u0279\u0276\u0003", + "\u0002\u0002\u0002\u0279\u0278\u0003\u0002\u0002\u0002\u027a\u027d\u0003", + "\u0002\u0002\u0002\u027b\u0279\u0003\u0002\u0002\u0002\u027b\u027c\u0003", + "\u0002\u0002\u0002\u027c\u027e\u0003\u0002\u0002\u0002\u027d\u027b\u0003", + "\u0002\u0002\u0002\u027e\u0280\u0007$\u0002\u0002\u027f\u0267\u0003", + "\u0002\u0002\u0002\u027f\u0273\u0003\u0002\u0002\u0002\u0280\u0094\u0003", + "\u0002\u0002\u0002\u0281\u0282\u00071\u0002\u0002\u0282\u0283\u0007", + "1\u0002\u0002\u0283\u0287\u0003\u0002\u0002\u0002\u0284\u0286\n\t\u0002", + "\u0002\u0285\u0284\u0003\u0002\u0002\u0002\u0286\u0289\u0003\u0002\u0002", + "\u0002\u0287\u0285\u0003\u0002\u0002\u0002\u0287\u0288\u0003\u0002\u0002", + "\u0002\u0288\u028f\u0003\u0002\u0002\u0002\u0289\u0287\u0003\u0002\u0002", + "\u0002\u028a\u028c\u0007\u000f\u0002\u0002\u028b\u028a\u0003\u0002\u0002", + "\u0002\u028b\u028c\u0003\u0002\u0002\u0002\u028c\u028d\u0003\u0002\u0002", + "\u0002\u028d\u0290\u0007\f\u0002\u0002\u028e\u0290\u0007\u0002\u0002", + "\u0003\u028f\u028b\u0003\u0002\u0002\u0002\u028f\u028e\u0003\u0002\u0002", + "\u0002\u0290\u0291\u0003\u0002\u0002\u0002\u0291\u0292\bK\u0002\u0002", + "\u0292\u0096\u0003\u0002\u0002\u0002\u0293\u0294\u00071\u0002\u0002", + "\u0294\u0295\u0007,\u0002\u0002\u0295\u0299\u0003\u0002\u0002\u0002", + "\u0296\u0298\u000b\u0002\u0002\u0002\u0297\u0296\u0003\u0002\u0002\u0002", + "\u0298\u029b\u0003\u0002\u0002\u0002\u0299\u029a\u0003\u0002\u0002\u0002", + "\u0299\u0297\u0003\u0002\u0002\u0002\u029a\u029c\u0003\u0002\u0002\u0002", + "\u029b\u0299\u0003\u0002\u0002\u0002\u029c\u029d\u0007,\u0002\u0002", + "\u029d\u029e\u00071\u0002\u0002\u029e\u029f\u0003\u0002\u0002\u0002", + "\u029f\u02a0\bL\u0002\u0002\u02a0\u0098\u0003\u0002\u0002\u0002\u02a1", + "\u02a2\t\n\u0002\u0002\u02a2\u02a3\u0003\u0002\u0002\u0002\u02a3\u02a4", + "\bM\u0002\u0002\u02a4\u009a\u0003\u0002\u0002\u0002\u02a5\u02a6\u000b", + "\u0002\u0002\u0002\u02a6\u009c\u0003\u0002\u0002\u0002\u02a7\u02a8\t", + "\u000b\u0002\u0002\u02a8\u009e\u0003\u0002\u0002\u0002\u02a9\u02aa\t", + "\f\u0002\u0002\u02aa\u00a0\u0003\u0002\u0002\u0002\u02ab\u02ac\t\r\u0002", + "\u0002\u02ac\u00a2\u0003\u0002\u0002\u0002\u02ad\u02ae\t\u000e\u0002", + "\u0002\u02ae\u00a4\u0003\u0002\u0002\u0002\u02af\u02b0\t\u000f\u0002", + "\u0002\u02b0\u00a6\u0003\u0002\u0002\u0002\u02b1\u02b2\t\u0010\u0002", + "\u0002\u02b2\u00a8\u0003\u0002\u0002\u0002\u02b3\u02b4\t\u0011\u0002", + "\u0002\u02b4\u00aa\u0003\u0002\u0002\u0002\u02b5\u02b6\t\u0012\u0002", + "\u0002\u02b6\u00ac\u0003\u0002\u0002\u0002\u02b7\u02b8\t\u0013\u0002", + "\u0002\u02b8\u00ae\u0003\u0002\u0002\u0002\u02b9\u02ba\t\u0014\u0002", + "\u0002\u02ba\u00b0\u0003\u0002\u0002\u0002\u02bb\u02bc\t\u0015\u0002", + "\u0002\u02bc\u00b2\u0003\u0002\u0002\u0002\u02bd\u02be\t\u0016\u0002", + "\u0002\u02be\u00b4\u0003\u0002\u0002\u0002\u02bf\u02c0\t\u0017\u0002", + "\u0002\u02c0\u00b6\u0003\u0002\u0002\u0002\u02c1\u02c2\t\u0018\u0002", + "\u0002\u02c2\u00b8\u0003\u0002\u0002\u0002\u02c3\u02c4\t\u0019\u0002", + "\u0002\u02c4\u00ba\u0003\u0002\u0002\u0002\u02c5\u02c6\t\u001a\u0002", + "\u0002\u02c6\u00bc\u0003\u0002\u0002\u0002\u02c7\u02c8\t\u001b\u0002", + "\u0002\u02c8\u00be\u0003\u0002\u0002\u0002\u02c9\u02ca\t\u001c\u0002", + "\u0002\u02ca\u00c0\u0003\u0002\u0002\u0002\u02cb\u02cc\t\u001d\u0002", + "\u0002\u02cc\u00c2\u0003\u0002\u0002\u0002\u02cd\u02ce\t\u001e\u0002", + "\u0002\u02ce\u00c4\u0003\u0002\u0002\u0002\u02cf\u02d0\t\u001f\u0002", + "\u0002\u02d0\u00c6\u0003\u0002\u0002\u0002\u02d1\u02d2\t \u0002\u0002", + "\u02d2\u00c8\u0003\u0002\u0002\u0002\u02d3\u02d4\t!\u0002\u0002\u02d4", + "\u00ca\u0003\u0002\u0002\u0002\u02d5\u02d6\t\"\u0002\u0002\u02d6\u00cc", + "\u0003\u0002\u0002\u0002\u02d7\u02d8\t#\u0002\u0002\u02d8\u00ce\u0003", + "\u0002\u0002\u0002\u02d9\u02da\t$\u0002\u0002\u02da\u00d0\u0003\u0002", + "\u0002\u0002\u02db\u02dc\t%\u0002\u0002\u02dc\u00d2\u0003\u0002\u0002", + "\u0002\u02dd\u02de\t&\u0002\u0002\u02de\u00d4\u0003\u0002\u0002\u0002", + "\u02df\u02e0\u000b\u0002\u0002\u0002\u02e0\u02e1\u0003\u0002\u0002\u0002", + "\u02e1\u02e2\bk\u0003\u0002\u02e2\u00d6\u0003\u0002\u0002\u0002\u001a", + "\u0002\u0125\u019d\u01a9\u022c\u0233\u023d\u0245\u0247\u024d\u0251\u0257", + "\u025b\u0260\u0262\u026d\u026f\u0279\u027b\u027f\u0287\u028b\u028f\u0299", + "\u0004\u0002\u0003\u0002\u0002\u0004\u0002"].join(""); + + +const atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN); + +const decisionsToDFA = atn.decisionToState.map( (ds, index) => new antlr4.dfa.DFA(ds, index) ); + +export default class CAQLLexer extends antlr4.Lexer { + + static grammarFileName = "CAQLLexer.g4"; + static channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN", "ERRORCHANNEL" ]; + static modeNames = [ "DEFAULT_MODE" ]; + static literalNames = [ null, "'.'", "'=~'", "'!~'", "'=='", "'!='", "'<'", + "'>'", "'<='", "'>='", "'+'", "'-'", "'*'", "'/'", + "'%'", "'?'", "':'", "'::'", "'..'", "','", "'('", + "')'", "'{'", "'}'", "'['", "']'" ]; + static symbolicNames = [ null, "DOT", "T_REGEX_MATCH", "T_REGEX_NON_MATCH", + "T_EQ", "T_NE", "T_LT", "T_GT", "T_LE", "T_GE", + "T_PLUS", "T_MINUS", "T_TIMES", "T_DIV", "T_MOD", + "T_QUESTION", "T_COLON", "T_SCOPE", "T_RANGE", + "T_COMMA", "T_OPEN", "T_CLOSE", "T_OBJECT_OPEN", + "T_OBJECT_CLOSE", "T_ARRAY_OPEN", "T_ARRAY_CLOSE", + "T_AGGREGATE", "T_ALL", "T_AND", "T_ANY", "T_ASC", + "T_COLLECT", "T_DESC", "T_DISTINCT", "T_FALSE", + "T_FILTER", "T_FOR", "T_GRAPH", "T_IN", "T_INBOUND", + "T_INSERT", "T_INTO", "T_K_SHORTEST_PATHS", "T_LET", + "T_LIKE", "T_LIMIT", "T_NONE", "T_NOT", "T_NULL", + "T_OR", "T_OUTBOUND", "T_REMOVE", "T_REPLACE", + "T_RETURN", "T_SHORTEST_PATH", "T_SORT", "T_TRUE", + "T_UPDATE", "T_UPSERT", "T_WITH", "T_KEEP", "T_COUNT", + "T_OPTIONS", "T_PRUNE", "T_SEARCH", "T_TO", "T_CURRENT", + "T_NEW", "T_OLD", "T_STRING", "T_INT", "T_FLOAT", + "T_PARAMETER", "T_QUOTED_STRING", "SINGLE_LINE_COMMENT", + "MULTILINE_COMMENT", "SPACES", "UNEXPECTED_CHAR", + "ERROR_RECONGNIGION" ]; + static ruleNames = [ "DOT", "T_REGEX_MATCH", "T_REGEX_NON_MATCH", "T_EQ", + "T_NE", "T_LT", "T_GT", "T_LE", "T_GE", "T_PLUS", + "T_MINUS", "T_TIMES", "T_DIV", "T_MOD", "T_QUESTION", + "T_COLON", "T_SCOPE", "T_RANGE", "T_COMMA", "T_OPEN", + "T_CLOSE", "T_OBJECT_OPEN", "T_OBJECT_CLOSE", "T_ARRAY_OPEN", + "T_ARRAY_CLOSE", "T_AGGREGATE", "T_ALL", "T_AND", + "T_ANY", "T_ASC", "T_COLLECT", "T_DESC", "T_DISTINCT", + "T_FALSE", "T_FILTER", "T_FOR", "T_GRAPH", "T_IN", + "T_INBOUND", "T_INSERT", "T_INTO", "T_K_SHORTEST_PATHS", + "T_LET", "T_LIKE", "T_LIMIT", "T_NONE", "T_NOT", "T_NULL", + "T_OR", "T_OUTBOUND", "T_REMOVE", "T_REPLACE", "T_RETURN", + "T_SHORTEST_PATH", "T_SORT", "T_TRUE", "T_UPDATE", + "T_UPSERT", "T_WITH", "T_KEEP", "T_COUNT", "T_OPTIONS", + "T_PRUNE", "T_SEARCH", "T_TO", "T_CURRENT", "T_NEW", + "T_OLD", "T_STRING", "T_INT", "T_FLOAT", "T_PARAMETER", + "T_QUOTED_STRING", "SINGLE_LINE_COMMENT", "MULTILINE_COMMENT", + "SPACES", "UNEXPECTED_CHAR", "HEX_DIGIT", "DIGIT", + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", + "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", + "U", "V", "W", "X", "Y", "Z", "ERROR_RECONGNIGION" ]; + + constructor(input) { + super(input) + this._interp = new antlr4.atn.LexerATNSimulator(this, atn, decisionsToDFA, new antlr4.PredictionContextCache()); + } + + get atn() { + return atn; + } +} + +CAQLLexer.EOF = antlr4.Token.EOF; +CAQLLexer.DOT = 1; +CAQLLexer.T_REGEX_MATCH = 2; +CAQLLexer.T_REGEX_NON_MATCH = 3; +CAQLLexer.T_EQ = 4; +CAQLLexer.T_NE = 5; +CAQLLexer.T_LT = 6; +CAQLLexer.T_GT = 7; +CAQLLexer.T_LE = 8; +CAQLLexer.T_GE = 9; +CAQLLexer.T_PLUS = 10; +CAQLLexer.T_MINUS = 11; +CAQLLexer.T_TIMES = 12; +CAQLLexer.T_DIV = 13; +CAQLLexer.T_MOD = 14; +CAQLLexer.T_QUESTION = 15; +CAQLLexer.T_COLON = 16; +CAQLLexer.T_SCOPE = 17; +CAQLLexer.T_RANGE = 18; +CAQLLexer.T_COMMA = 19; +CAQLLexer.T_OPEN = 20; +CAQLLexer.T_CLOSE = 21; +CAQLLexer.T_OBJECT_OPEN = 22; +CAQLLexer.T_OBJECT_CLOSE = 23; +CAQLLexer.T_ARRAY_OPEN = 24; +CAQLLexer.T_ARRAY_CLOSE = 25; +CAQLLexer.T_AGGREGATE = 26; +CAQLLexer.T_ALL = 27; +CAQLLexer.T_AND = 28; +CAQLLexer.T_ANY = 29; +CAQLLexer.T_ASC = 30; +CAQLLexer.T_COLLECT = 31; +CAQLLexer.T_DESC = 32; +CAQLLexer.T_DISTINCT = 33; +CAQLLexer.T_FALSE = 34; +CAQLLexer.T_FILTER = 35; +CAQLLexer.T_FOR = 36; +CAQLLexer.T_GRAPH = 37; +CAQLLexer.T_IN = 38; +CAQLLexer.T_INBOUND = 39; +CAQLLexer.T_INSERT = 40; +CAQLLexer.T_INTO = 41; +CAQLLexer.T_K_SHORTEST_PATHS = 42; +CAQLLexer.T_LET = 43; +CAQLLexer.T_LIKE = 44; +CAQLLexer.T_LIMIT = 45; +CAQLLexer.T_NONE = 46; +CAQLLexer.T_NOT = 47; +CAQLLexer.T_NULL = 48; +CAQLLexer.T_OR = 49; +CAQLLexer.T_OUTBOUND = 50; +CAQLLexer.T_REMOVE = 51; +CAQLLexer.T_REPLACE = 52; +CAQLLexer.T_RETURN = 53; +CAQLLexer.T_SHORTEST_PATH = 54; +CAQLLexer.T_SORT = 55; +CAQLLexer.T_TRUE = 56; +CAQLLexer.T_UPDATE = 57; +CAQLLexer.T_UPSERT = 58; +CAQLLexer.T_WITH = 59; +CAQLLexer.T_KEEP = 60; +CAQLLexer.T_COUNT = 61; +CAQLLexer.T_OPTIONS = 62; +CAQLLexer.T_PRUNE = 63; +CAQLLexer.T_SEARCH = 64; +CAQLLexer.T_TO = 65; +CAQLLexer.T_CURRENT = 66; +CAQLLexer.T_NEW = 67; +CAQLLexer.T_OLD = 68; +CAQLLexer.T_STRING = 69; +CAQLLexer.T_INT = 70; +CAQLLexer.T_FLOAT = 71; +CAQLLexer.T_PARAMETER = 72; +CAQLLexer.T_QUOTED_STRING = 73; +CAQLLexer.SINGLE_LINE_COMMENT = 74; +CAQLLexer.MULTILINE_COMMENT = 75; +CAQLLexer.SPACES = 76; +CAQLLexer.UNEXPECTED_CHAR = 77; +CAQLLexer.ERROR_RECONGNIGION = 78; + +CAQLLexer.ERRORCHANNEL = 2; + + + diff --git a/ui/src/suggestions/grammar/CAQLLexer.tokens b/ui/src/suggestions/grammar/CAQLLexer.tokens new file mode 100644 index 0000000..7bdaf61 --- /dev/null +++ b/ui/src/suggestions/grammar/CAQLLexer.tokens @@ -0,0 +1,103 @@ +DOT=1 +T_REGEX_MATCH=2 +T_REGEX_NON_MATCH=3 +T_EQ=4 +T_NE=5 +T_LT=6 +T_GT=7 +T_LE=8 +T_GE=9 +T_PLUS=10 +T_MINUS=11 +T_TIMES=12 +T_DIV=13 +T_MOD=14 +T_QUESTION=15 +T_COLON=16 +T_SCOPE=17 +T_RANGE=18 +T_COMMA=19 +T_OPEN=20 +T_CLOSE=21 +T_OBJECT_OPEN=22 +T_OBJECT_CLOSE=23 +T_ARRAY_OPEN=24 +T_ARRAY_CLOSE=25 +T_AGGREGATE=26 +T_ALL=27 +T_AND=28 +T_ANY=29 +T_ASC=30 +T_COLLECT=31 +T_DESC=32 +T_DISTINCT=33 +T_FALSE=34 +T_FILTER=35 +T_FOR=36 +T_GRAPH=37 +T_IN=38 +T_INBOUND=39 +T_INSERT=40 +T_INTO=41 +T_K_SHORTEST_PATHS=42 +T_LET=43 +T_LIKE=44 +T_LIMIT=45 +T_NONE=46 +T_NOT=47 +T_NULL=48 +T_OR=49 +T_OUTBOUND=50 +T_REMOVE=51 +T_REPLACE=52 +T_RETURN=53 +T_SHORTEST_PATH=54 +T_SORT=55 +T_TRUE=56 +T_UPDATE=57 +T_UPSERT=58 +T_WITH=59 +T_KEEP=60 +T_COUNT=61 +T_OPTIONS=62 +T_PRUNE=63 +T_SEARCH=64 +T_TO=65 +T_CURRENT=66 +T_NEW=67 +T_OLD=68 +T_STRING=69 +T_INT=70 +T_FLOAT=71 +T_PARAMETER=72 +T_QUOTED_STRING=73 +SINGLE_LINE_COMMENT=74 +MULTILINE_COMMENT=75 +SPACES=76 +UNEXPECTED_CHAR=77 +ERROR_RECONGNIGION=78 +'.'=1 +'=~'=2 +'!~'=3 +'=='=4 +'!='=5 +'<'=6 +'>'=7 +'<='=8 +'>='=9 +'+'=10 +'-'=11 +'*'=12 +'/'=13 +'%'=14 +'?'=15 +':'=16 +'::'=17 +'..'=18 +','=19 +'('=20 +')'=21 +'{'=22 +'}'=23 +'['=24 +']'=25 diff --git a/ui/src/suggestions/grammar/CAQLParser.interp b/ui/src/suggestions/grammar/CAQLParser.interp new file mode 100644 index 0000000..8abde5b --- /dev/null +++ b/ui/src/suggestions/grammar/CAQLParser.interp @@ -0,0 +1,178 @@ +token literal names: +null +'.' +'=~' +'!~' +'==' +'!=' +'<' +'>' +'<=' +'>=' +'+' +'-' +'*' +'/' +'%' +'?' +':' +'::' +'..' +',' +'(' +')' +'{' +'}' +'[' +']' +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null + +token symbolic names: +null +DOT +T_REGEX_MATCH +T_REGEX_NON_MATCH +T_EQ +T_NE +T_LT +T_GT +T_LE +T_GE +T_PLUS +T_MINUS +T_TIMES +T_DIV +T_MOD +T_QUESTION +T_COLON +T_SCOPE +T_RANGE +T_COMMA +T_OPEN +T_CLOSE +T_OBJECT_OPEN +T_OBJECT_CLOSE +T_ARRAY_OPEN +T_ARRAY_CLOSE +T_AGGREGATE +T_ALL +T_AND +T_ANY +T_ASC +T_COLLECT +T_DESC +T_DISTINCT +T_FALSE +T_FILTER +T_FOR +T_GRAPH +T_IN +T_INBOUND +T_INSERT +T_INTO +T_K_SHORTEST_PATHS +T_LET +T_LIKE +T_LIMIT +T_NONE +T_NOT +T_NULL +T_OR +T_OUTBOUND +T_REMOVE +T_REPLACE +T_RETURN +T_SHORTEST_PATH +T_SORT +T_TRUE +T_UPDATE +T_UPSERT +T_WITH +T_KEEP +T_COUNT +T_OPTIONS +T_PRUNE +T_SEARCH +T_TO +T_CURRENT +T_NEW +T_OLD +T_STRING +T_INT +T_FLOAT +T_PARAMETER +T_QUOTED_STRING +SINGLE_LINE_COMMENT +MULTILINE_COMMENT +SPACES +UNEXPECTED_CHAR +ERROR_RECONGNIGION + +rule names: +parse +expression +operator_unary +reference +compound_value +function_call +value_literal +array +object +object_element +object_element_name + + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 80, 192, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 32, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 48, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 66, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 86, 10, 3, 12, 3, 14, 3, 89, 11, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 97, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 107, 10, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 7, 5, 117, 10, 5, 12, 5, 14, 5, 120, 11, 5, 3, 6, 3, 6, 5, 6, 124, 10, 6, 3, 7, 3, 7, 3, 7, 5, 7, 129, 10, 7, 3, 7, 3, 7, 7, 7, 133, 10, 7, 12, 7, 14, 7, 136, 11, 7, 3, 7, 5, 7, 139, 10, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 5, 9, 147, 10, 9, 3, 9, 3, 9, 7, 9, 151, 10, 9, 12, 9, 14, 9, 154, 11, 9, 3, 9, 5, 9, 157, 10, 9, 3, 9, 3, 9, 3, 10, 3, 10, 5, 10, 163, 10, 10, 3, 10, 3, 10, 7, 10, 167, 10, 10, 12, 10, 14, 10, 170, 11, 10, 3, 10, 5, 10, 173, 10, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 188, 10, 11, 3, 12, 3, 12, 3, 12, 4, 134, 152, 4, 4, 8, 13, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 2, 11, 3, 2, 12, 13, 3, 2, 14, 16, 3, 2, 8, 11, 3, 2, 6, 7, 5, 2, 29, 29, 31, 31, 48, 48, 4, 2, 6, 11, 40, 40, 4, 2, 4, 5, 46, 46, 7, 2, 36, 36, 50, 50, 58, 58, 72, 73, 75, 75, 4, 2, 71, 71, 75, 75, 2, 216, 2, 24, 3, 2, 2, 2, 4, 31, 3, 2, 2, 2, 6, 96, 3, 2, 2, 2, 8, 106, 3, 2, 2, 2, 10, 123, 3, 2, 2, 2, 12, 125, 3, 2, 2, 2, 14, 142, 3, 2, 2, 2, 16, 144, 3, 2, 2, 2, 18, 160, 3, 2, 2, 2, 20, 187, 3, 2, 2, 2, 22, 189, 3, 2, 2, 2, 24, 25, 5, 4, 3, 2, 25, 26, 7, 2, 2, 3, 26, 3, 3, 2, 2, 2, 27, 28, 8, 3, 1, 2, 28, 32, 5, 14, 8, 2, 29, 32, 5, 8, 5, 2, 30, 32, 5, 6, 4, 2, 31, 27, 3, 2, 2, 2, 31, 29, 3, 2, 2, 2, 31, 30, 3, 2, 2, 2, 32, 87, 3, 2, 2, 2, 33, 34, 12, 15, 2, 2, 34, 35, 9, 2, 2, 2, 35, 86, 5, 4, 3, 16, 36, 37, 12, 14, 2, 2, 37, 38, 9, 3, 2, 2, 38, 86, 5, 4, 3, 15, 39, 40, 12, 13, 2, 2, 40, 41, 7, 20, 2, 2, 41, 86, 5, 4, 3, 14, 42, 43, 12, 12, 2, 2, 43, 44, 9, 4, 2, 2, 44, 86, 5, 4, 3, 13, 45, 47, 12, 11, 2, 2, 46, 48, 7, 49, 2, 2, 47, 46, 3, 2, 2, 2, 47, 48, 3, 2, 2, 2, 48, 49, 3, 2, 2, 2, 49, 50, 7, 40, 2, 2, 50, 86, 5, 4, 3, 12, 51, 52, 12, 10, 2, 2, 52, 53, 9, 5, 2, 2, 53, 86, 5, 4, 3, 11, 54, 55, 12, 9, 2, 2, 55, 56, 9, 6, 2, 2, 56, 57, 9, 7, 2, 2, 57, 86, 5, 4, 3, 10, 58, 59, 12, 8, 2, 2, 59, 60, 9, 6, 2, 2, 60, 61, 7, 49, 2, 2, 61, 62, 7, 40, 2, 2, 62, 86, 5, 4, 3, 9, 63, 65, 12, 7, 2, 2, 64, 66, 7, 49, 2, 2, 65, 64, 3, 2, 2, 2, 65, 66, 3, 2, 2, 2, 66, 67, 3, 2, 2, 2, 67, 68, 9, 8, 2, 2, 68, 86, 5, 4, 3, 8, 69, 70, 12, 6, 2, 2, 70, 71, 7, 30, 2, 2, 71, 86, 5, 4, 3, 7, 72, 73, 12, 5, 2, 2, 73, 74, 7, 51, 2, 2, 74, 86, 5, 4, 3, 6, 75, 76, 12, 4, 2, 2, 76, 77, 7, 17, 2, 2, 77, 78, 5, 4, 3, 2, 78, 79, 7, 18, 2, 2, 79, 80, 5, 4, 3, 5, 80, 86, 3, 2, 2, 2, 81, 82, 12, 3, 2, 2, 82, 83, 7, 17, 2, 2, 83, 84, 7, 18, 2, 2, 84, 86, 5, 4, 3, 4, 85, 33, 3, 2, 2, 2, 85, 36, 3, 2, 2, 2, 85, 39, 3, 2, 2, 2, 85, 42, 3, 2, 2, 2, 85, 45, 3, 2, 2, 2, 85, 51, 3, 2, 2, 2, 85, 54, 3, 2, 2, 2, 85, 58, 3, 2, 2, 2, 85, 63, 3, 2, 2, 2, 85, 69, 3, 2, 2, 2, 85, 72, 3, 2, 2, 2, 85, 75, 3, 2, 2, 2, 85, 81, 3, 2, 2, 2, 86, 89, 3, 2, 2, 2, 87, 85, 3, 2, 2, 2, 87, 88, 3, 2, 2, 2, 88, 5, 3, 2, 2, 2, 89, 87, 3, 2, 2, 2, 90, 91, 7, 12, 2, 2, 91, 97, 5, 4, 3, 2, 92, 93, 7, 13, 2, 2, 93, 97, 5, 4, 3, 2, 94, 95, 7, 49, 2, 2, 95, 97, 5, 4, 3, 2, 96, 90, 3, 2, 2, 2, 96, 92, 3, 2, 2, 2, 96, 94, 3, 2, 2, 2, 97, 7, 3, 2, 2, 2, 98, 99, 8, 5, 1, 2, 99, 107, 7, 71, 2, 2, 100, 107, 5, 10, 6, 2, 101, 107, 5, 12, 7, 2, 102, 103, 7, 22, 2, 2, 103, 104, 5, 4, 3, 2, 104, 105, 7, 23, 2, 2, 105, 107, 3, 2, 2, 2, 106, 98, 3, 2, 2, 2, 106, 100, 3, 2, 2, 2, 106, 101, 3, 2, 2, 2, 106, 102, 3, 2, 2, 2, 107, 118, 3, 2, 2, 2, 108, 109, 12, 4, 2, 2, 109, 110, 7, 3, 2, 2, 110, 117, 7, 71, 2, 2, 111, 112, 12, 3, 2, 2, 112, 113, 7, 26, 2, 2, 113, 114, 5, 4, 3, 2, 114, 115, 7, 27, 2, 2, 115, 117, 3, 2, 2, 2, 116, 108, 3, 2, 2, 2, 116, 111, 3, 2, 2, 2, 117, 120, 3, 2, 2, 2, 118, 116, 3, 2, 2, 2, 118, 119, 3, 2, 2, 2, 119, 9, 3, 2, 2, 2, 120, 118, 3, 2, 2, 2, 121, 124, 5, 16, 9, 2, 122, 124, 5, 18, 10, 2, 123, 121, 3, 2, 2, 2, 123, 122, 3, 2, 2, 2, 124, 11, 3, 2, 2, 2, 125, 126, 7, 71, 2, 2, 126, 128, 7, 22, 2, 2, 127, 129, 5, 4, 3, 2, 128, 127, 3, 2, 2, 2, 128, 129, 3, 2, 2, 2, 129, 134, 3, 2, 2, 2, 130, 131, 7, 21, 2, 2, 131, 133, 5, 4, 3, 2, 132, 130, 3, 2, 2, 2, 133, 136, 3, 2, 2, 2, 134, 135, 3, 2, 2, 2, 134, 132, 3, 2, 2, 2, 135, 138, 3, 2, 2, 2, 136, 134, 3, 2, 2, 2, 137, 139, 7, 21, 2, 2, 138, 137, 3, 2, 2, 2, 138, 139, 3, 2, 2, 2, 139, 140, 3, 2, 2, 2, 140, 141, 7, 23, 2, 2, 141, 13, 3, 2, 2, 2, 142, 143, 9, 9, 2, 2, 143, 15, 3, 2, 2, 2, 144, 146, 7, 26, 2, 2, 145, 147, 5, 4, 3, 2, 146, 145, 3, 2, 2, 2, 146, 147, 3, 2, 2, 2, 147, 152, 3, 2, 2, 2, 148, 149, 7, 21, 2, 2, 149, 151, 5, 4, 3, 2, 150, 148, 3, 2, 2, 2, 151, 154, 3, 2, 2, 2, 152, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 156, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 155, 157, 7, 21, 2, 2, 156, 155, 3, 2, 2, 2, 156, 157, 3, 2, 2, 2, 157, 158, 3, 2, 2, 2, 158, 159, 7, 27, 2, 2, 159, 17, 3, 2, 2, 2, 160, 162, 7, 24, 2, 2, 161, 163, 5, 20, 11, 2, 162, 161, 3, 2, 2, 2, 162, 163, 3, 2, 2, 2, 163, 168, 3, 2, 2, 2, 164, 165, 7, 21, 2, 2, 165, 167, 5, 20, 11, 2, 166, 164, 3, 2, 2, 2, 167, 170, 3, 2, 2, 2, 168, 166, 3, 2, 2, 2, 168, 169, 3, 2, 2, 2, 169, 172, 3, 2, 2, 2, 170, 168, 3, 2, 2, 2, 171, 173, 7, 21, 2, 2, 172, 171, 3, 2, 2, 2, 172, 173, 3, 2, 2, 2, 173, 174, 3, 2, 2, 2, 174, 175, 7, 25, 2, 2, 175, 19, 3, 2, 2, 2, 176, 188, 7, 71, 2, 2, 177, 178, 5, 22, 12, 2, 178, 179, 7, 18, 2, 2, 179, 180, 5, 4, 3, 2, 180, 188, 3, 2, 2, 2, 181, 182, 7, 26, 2, 2, 182, 183, 5, 4, 3, 2, 183, 184, 7, 27, 2, 2, 184, 185, 7, 18, 2, 2, 185, 186, 5, 4, 3, 2, 186, 188, 3, 2, 2, 2, 187, 176, 3, 2, 2, 2, 187, 177, 3, 2, 2, 2, 187, 181, 3, 2, 2, 2, 188, 21, 3, 2, 2, 2, 189, 190, 9, 10, 2, 2, 190, 23, 3, 2, 2, 2, 22, 31, 47, 65, 85, 87, 96, 106, 116, 118, 123, 128, 134, 138, 146, 152, 156, 162, 168, 172, 187] \ No newline at end of file diff --git a/ui/src/suggestions/grammar/CAQLParser.js b/ui/src/suggestions/grammar/CAQLParser.js new file mode 100644 index 0000000..fc295fe --- /dev/null +++ b/ui/src/suggestions/grammar/CAQLParser.js @@ -0,0 +1,1866 @@ +// Generated from CAQLParser.g4 by ANTLR 4.9.2 +// jshint ignore: start +import antlr4 from 'antlr4'; +import CAQLParserListener from './CAQLParserListener.js'; + +const serializedATN = ["\u0003\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786", + "\u5964\u0003P\u00c0\u0004\u0002\t\u0002\u0004\u0003\t\u0003\u0004\u0004", + "\t\u0004\u0004\u0005\t\u0005\u0004\u0006\t\u0006\u0004\u0007\t\u0007", + "\u0004\b\t\b\u0004\t\t\t\u0004\n\t\n\u0004\u000b\t\u000b\u0004\f\t\f", + "\u0003\u0002\u0003\u0002\u0003\u0002\u0003\u0003\u0003\u0003\u0003\u0003", + "\u0003\u0003\u0005\u0003 \n\u0003\u0003\u0003\u0003\u0003\u0003\u0003", + "\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003", + "\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0005\u0003", + "0\n\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003", + "\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003", + "\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0005\u0003", + "B\n\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003", + "\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003", + "\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003", + "\u0003\u0003\u0007\u0003V\n\u0003\f\u0003\u000e\u0003Y\u000b\u0003\u0003", + "\u0004\u0003\u0004\u0003\u0004\u0003\u0004\u0003\u0004\u0003\u0004\u0005", + "\u0004a\n\u0004\u0003\u0005\u0003\u0005\u0003\u0005\u0003\u0005\u0003", + "\u0005\u0003\u0005\u0003\u0005\u0003\u0005\u0005\u0005k\n\u0005\u0003", + "\u0005\u0003\u0005\u0003\u0005\u0003\u0005\u0003\u0005\u0003\u0005\u0003", + "\u0005\u0003\u0005\u0007\u0005u\n\u0005\f\u0005\u000e\u0005x\u000b\u0005", + "\u0003\u0006\u0003\u0006\u0005\u0006|\n\u0006\u0003\u0007\u0003\u0007", + "\u0003\u0007\u0005\u0007\u0081\n\u0007\u0003\u0007\u0003\u0007\u0007", + "\u0007\u0085\n\u0007\f\u0007\u000e\u0007\u0088\u000b\u0007\u0003\u0007", + "\u0005\u0007\u008b\n\u0007\u0003\u0007\u0003\u0007\u0003\b\u0003\b\u0003", + "\t\u0003\t\u0005\t\u0093\n\t\u0003\t\u0003\t\u0007\t\u0097\n\t\f\t\u000e", + "\t\u009a\u000b\t\u0003\t\u0005\t\u009d\n\t\u0003\t\u0003\t\u0003\n\u0003", + "\n\u0005\n\u00a3\n\n\u0003\n\u0003\n\u0007\n\u00a7\n\n\f\n\u000e\n\u00aa", + "\u000b\n\u0003\n\u0005\n\u00ad\n\n\u0003\n\u0003\n\u0003\u000b\u0003", + "\u000b\u0003\u000b\u0003\u000b\u0003\u000b\u0003\u000b\u0003\u000b\u0003", + "\u000b\u0003\u000b\u0003\u000b\u0003\u000b\u0005\u000b\u00bc\n\u000b", + "\u0003\f\u0003\f\u0003\f\u0004\u0086\u0098\u0004\u0004\b\r\u0002\u0004", + "\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0002\u000b\u0003\u0002\f", + "\r\u0003\u0002\u000e\u0010\u0003\u0002\b\u000b\u0003\u0002\u0006\u0007", + "\u0005\u0002\u001d\u001d\u001f\u001f00\u0004\u0002\u0006\u000b((\u0004", + "\u0002\u0004\u0005..\u0007\u0002$$22::HIKK\u0004\u0002GGKK\u0002\u00d8", + "\u0002\u0018\u0003\u0002\u0002\u0002\u0004\u001f\u0003\u0002\u0002\u0002", + "\u0006`\u0003\u0002\u0002\u0002\bj\u0003\u0002\u0002\u0002\n{\u0003", + "\u0002\u0002\u0002\f}\u0003\u0002\u0002\u0002\u000e\u008e\u0003\u0002", + "\u0002\u0002\u0010\u0090\u0003\u0002\u0002\u0002\u0012\u00a0\u0003\u0002", + "\u0002\u0002\u0014\u00bb\u0003\u0002\u0002\u0002\u0016\u00bd\u0003\u0002", + "\u0002\u0002\u0018\u0019\u0005\u0004\u0003\u0002\u0019\u001a\u0007\u0002", + "\u0002\u0003\u001a\u0003\u0003\u0002\u0002\u0002\u001b\u001c\b\u0003", + "\u0001\u0002\u001c \u0005\u000e\b\u0002\u001d \u0005\b\u0005\u0002\u001e", + " \u0005\u0006\u0004\u0002\u001f\u001b\u0003\u0002\u0002\u0002\u001f", + "\u001d\u0003\u0002\u0002\u0002\u001f\u001e\u0003\u0002\u0002\u0002 ", + "W\u0003\u0002\u0002\u0002!\"\f\u000f\u0002\u0002\"#\t\u0002\u0002\u0002", + "#V\u0005\u0004\u0003\u0010$%\f\u000e\u0002\u0002%&\t\u0003\u0002\u0002", + "&V\u0005\u0004\u0003\u000f\'(\f\r\u0002\u0002()\u0007\u0014\u0002\u0002", + ")V\u0005\u0004\u0003\u000e*+\f\f\u0002\u0002+,\t\u0004\u0002\u0002,", + "V\u0005\u0004\u0003\r-/\f\u000b\u0002\u0002.0\u00071\u0002\u0002/.\u0003", + "\u0002\u0002\u0002/0\u0003\u0002\u0002\u000201\u0003\u0002\u0002\u0002", + "12\u0007(\u0002\u00022V\u0005\u0004\u0003\f34\f\n\u0002\u000245\t\u0005", + "\u0002\u00025V\u0005\u0004\u0003\u000b67\f\t\u0002\u000278\t\u0006\u0002", + "\u000289\t\u0007\u0002\u00029V\u0005\u0004\u0003\n:;\f\b\u0002\u0002", + ";<\t\u0006\u0002\u0002<=\u00071\u0002\u0002=>\u0007(\u0002\u0002>V\u0005", + "\u0004\u0003\t?A\f\u0007\u0002\u0002@B\u00071\u0002\u0002A@\u0003\u0002", + "\u0002\u0002AB\u0003\u0002\u0002\u0002BC\u0003\u0002\u0002\u0002CD\t", + "\b\u0002\u0002DV\u0005\u0004\u0003\bEF\f\u0006\u0002\u0002FG\u0007\u001e", + "\u0002\u0002GV\u0005\u0004\u0003\u0007HI\f\u0005\u0002\u0002IJ\u0007", + "3\u0002\u0002JV\u0005\u0004\u0003\u0006KL\f\u0004\u0002\u0002LM\u0007", + "\u0011\u0002\u0002MN\u0005\u0004\u0003\u0002NO\u0007\u0012\u0002\u0002", + "OP\u0005\u0004\u0003\u0005PV\u0003\u0002\u0002\u0002QR\f\u0003\u0002", + "\u0002RS\u0007\u0011\u0002\u0002ST\u0007\u0012\u0002\u0002TV\u0005\u0004", + "\u0003\u0004U!\u0003\u0002\u0002\u0002U$\u0003\u0002\u0002\u0002U\'", + "\u0003\u0002\u0002\u0002U*\u0003\u0002\u0002\u0002U-\u0003\u0002\u0002", + "\u0002U3\u0003\u0002\u0002\u0002U6\u0003\u0002\u0002\u0002U:\u0003\u0002", + "\u0002\u0002U?\u0003\u0002\u0002\u0002UE\u0003\u0002\u0002\u0002UH\u0003", + "\u0002\u0002\u0002UK\u0003\u0002\u0002\u0002UQ\u0003\u0002\u0002\u0002", + "VY\u0003\u0002\u0002\u0002WU\u0003\u0002\u0002\u0002WX\u0003\u0002\u0002", + "\u0002X\u0005\u0003\u0002\u0002\u0002YW\u0003\u0002\u0002\u0002Z[\u0007", + "\f\u0002\u0002[a\u0005\u0004\u0003\u0002\\]\u0007\r\u0002\u0002]a\u0005", + "\u0004\u0003\u0002^_\u00071\u0002\u0002_a\u0005\u0004\u0003\u0002`Z", + "\u0003\u0002\u0002\u0002`\\\u0003\u0002\u0002\u0002`^\u0003\u0002\u0002", + "\u0002a\u0007\u0003\u0002\u0002\u0002bc\b\u0005\u0001\u0002ck\u0007", + "G\u0002\u0002dk\u0005\n\u0006\u0002ek\u0005\f\u0007\u0002fg\u0007\u0016", + "\u0002\u0002gh\u0005\u0004\u0003\u0002hi\u0007\u0017\u0002\u0002ik\u0003", + "\u0002\u0002\u0002jb\u0003\u0002\u0002\u0002jd\u0003\u0002\u0002\u0002", + "je\u0003\u0002\u0002\u0002jf\u0003\u0002\u0002\u0002kv\u0003\u0002\u0002", + "\u0002lm\f\u0004\u0002\u0002mn\u0007\u0003\u0002\u0002nu\u0007G\u0002", + "\u0002op\f\u0003\u0002\u0002pq\u0007\u001a\u0002\u0002qr\u0005\u0004", + "\u0003\u0002rs\u0007\u001b\u0002\u0002su\u0003\u0002\u0002\u0002tl\u0003", + "\u0002\u0002\u0002to\u0003\u0002\u0002\u0002ux\u0003\u0002\u0002\u0002", + "vt\u0003\u0002\u0002\u0002vw\u0003\u0002\u0002\u0002w\t\u0003\u0002", + "\u0002\u0002xv\u0003\u0002\u0002\u0002y|\u0005\u0010\t\u0002z|\u0005", + "\u0012\n\u0002{y\u0003\u0002\u0002\u0002{z\u0003\u0002\u0002\u0002|", + "\u000b\u0003\u0002\u0002\u0002}~\u0007G\u0002\u0002~\u0080\u0007\u0016", + "\u0002\u0002\u007f\u0081\u0005\u0004\u0003\u0002\u0080\u007f\u0003\u0002", + "\u0002\u0002\u0080\u0081\u0003\u0002\u0002\u0002\u0081\u0086\u0003\u0002", + "\u0002\u0002\u0082\u0083\u0007\u0015\u0002\u0002\u0083\u0085\u0005\u0004", + "\u0003\u0002\u0084\u0082\u0003\u0002\u0002\u0002\u0085\u0088\u0003\u0002", + "\u0002\u0002\u0086\u0087\u0003\u0002\u0002\u0002\u0086\u0084\u0003\u0002", + "\u0002\u0002\u0087\u008a\u0003\u0002\u0002\u0002\u0088\u0086\u0003\u0002", + "\u0002\u0002\u0089\u008b\u0007\u0015\u0002\u0002\u008a\u0089\u0003\u0002", + "\u0002\u0002\u008a\u008b\u0003\u0002\u0002\u0002\u008b\u008c\u0003\u0002", + "\u0002\u0002\u008c\u008d\u0007\u0017\u0002\u0002\u008d\r\u0003\u0002", + "\u0002\u0002\u008e\u008f\t\t\u0002\u0002\u008f\u000f\u0003\u0002\u0002", + "\u0002\u0090\u0092\u0007\u001a\u0002\u0002\u0091\u0093\u0005\u0004\u0003", + "\u0002\u0092\u0091\u0003\u0002\u0002\u0002\u0092\u0093\u0003\u0002\u0002", + "\u0002\u0093\u0098\u0003\u0002\u0002\u0002\u0094\u0095\u0007\u0015\u0002", + "\u0002\u0095\u0097\u0005\u0004\u0003\u0002\u0096\u0094\u0003\u0002\u0002", + "\u0002\u0097\u009a\u0003\u0002\u0002\u0002\u0098\u0099\u0003\u0002\u0002", + "\u0002\u0098\u0096\u0003\u0002\u0002\u0002\u0099\u009c\u0003\u0002\u0002", + "\u0002\u009a\u0098\u0003\u0002\u0002\u0002\u009b\u009d\u0007\u0015\u0002", + "\u0002\u009c\u009b\u0003\u0002\u0002\u0002\u009c\u009d\u0003\u0002\u0002", + "\u0002\u009d\u009e\u0003\u0002\u0002\u0002\u009e\u009f\u0007\u001b\u0002", + "\u0002\u009f\u0011\u0003\u0002\u0002\u0002\u00a0\u00a2\u0007\u0018\u0002", + "\u0002\u00a1\u00a3\u0005\u0014\u000b\u0002\u00a2\u00a1\u0003\u0002\u0002", + "\u0002\u00a2\u00a3\u0003\u0002\u0002\u0002\u00a3\u00a8\u0003\u0002\u0002", + "\u0002\u00a4\u00a5\u0007\u0015\u0002\u0002\u00a5\u00a7\u0005\u0014\u000b", + "\u0002\u00a6\u00a4\u0003\u0002\u0002\u0002\u00a7\u00aa\u0003\u0002\u0002", + "\u0002\u00a8\u00a6\u0003\u0002\u0002\u0002\u00a8\u00a9\u0003\u0002\u0002", + "\u0002\u00a9\u00ac\u0003\u0002\u0002\u0002\u00aa\u00a8\u0003\u0002\u0002", + "\u0002\u00ab\u00ad\u0007\u0015\u0002\u0002\u00ac\u00ab\u0003\u0002\u0002", + "\u0002\u00ac\u00ad\u0003\u0002\u0002\u0002\u00ad\u00ae\u0003\u0002\u0002", + "\u0002\u00ae\u00af\u0007\u0019\u0002\u0002\u00af\u0013\u0003\u0002\u0002", + "\u0002\u00b0\u00bc\u0007G\u0002\u0002\u00b1\u00b2\u0005\u0016\f\u0002", + "\u00b2\u00b3\u0007\u0012\u0002\u0002\u00b3\u00b4\u0005\u0004\u0003\u0002", + "\u00b4\u00bc\u0003\u0002\u0002\u0002\u00b5\u00b6\u0007\u001a\u0002\u0002", + "\u00b6\u00b7\u0005\u0004\u0003\u0002\u00b7\u00b8\u0007\u001b\u0002\u0002", + "\u00b8\u00b9\u0007\u0012\u0002\u0002\u00b9\u00ba\u0005\u0004\u0003\u0002", + "\u00ba\u00bc\u0003\u0002\u0002\u0002\u00bb\u00b0\u0003\u0002\u0002\u0002", + "\u00bb\u00b1\u0003\u0002\u0002\u0002\u00bb\u00b5\u0003\u0002\u0002\u0002", + "\u00bc\u0015\u0003\u0002\u0002\u0002\u00bd\u00be\t\n\u0002\u0002\u00be", + "\u0017\u0003\u0002\u0002\u0002\u0016\u001f/AUW`jtv{\u0080\u0086\u008a", + "\u0092\u0098\u009c\u00a2\u00a8\u00ac\u00bb"].join(""); + + +const atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN); + +const decisionsToDFA = atn.decisionToState.map( (ds, index) => new antlr4.dfa.DFA(ds, index) ); + +const sharedContextCache = new antlr4.PredictionContextCache(); + +export default class CAQLParser extends antlr4.Parser { + + static grammarFileName = "CAQLParser.g4"; + static literalNames = [ null, "'.'", "'=~'", "'!~'", "'=='", "'!='", + "'<'", "'>'", "'<='", "'>='", "'+'", "'-'", + "'*'", "'/'", "'%'", "'?'", "':'", "'::'", "'..'", + "','", "'('", "')'", "'{'", "'}'", "'['", "']'" ]; + static symbolicNames = [ null, "DOT", "T_REGEX_MATCH", "T_REGEX_NON_MATCH", + "T_EQ", "T_NE", "T_LT", "T_GT", "T_LE", "T_GE", + "T_PLUS", "T_MINUS", "T_TIMES", "T_DIV", "T_MOD", + "T_QUESTION", "T_COLON", "T_SCOPE", "T_RANGE", + "T_COMMA", "T_OPEN", "T_CLOSE", "T_OBJECT_OPEN", + "T_OBJECT_CLOSE", "T_ARRAY_OPEN", "T_ARRAY_CLOSE", + "T_AGGREGATE", "T_ALL", "T_AND", "T_ANY", "T_ASC", + "T_COLLECT", "T_DESC", "T_DISTINCT", "T_FALSE", + "T_FILTER", "T_FOR", "T_GRAPH", "T_IN", "T_INBOUND", + "T_INSERT", "T_INTO", "T_K_SHORTEST_PATHS", + "T_LET", "T_LIKE", "T_LIMIT", "T_NONE", "T_NOT", + "T_NULL", "T_OR", "T_OUTBOUND", "T_REMOVE", + "T_REPLACE", "T_RETURN", "T_SHORTEST_PATH", + "T_SORT", "T_TRUE", "T_UPDATE", "T_UPSERT", + "T_WITH", "T_KEEP", "T_COUNT", "T_OPTIONS", + "T_PRUNE", "T_SEARCH", "T_TO", "T_CURRENT", + "T_NEW", "T_OLD", "T_STRING", "T_INT", "T_FLOAT", + "T_PARAMETER", "T_QUOTED_STRING", "SINGLE_LINE_COMMENT", + "MULTILINE_COMMENT", "SPACES", "UNEXPECTED_CHAR", + "ERROR_RECONGNIGION" ]; + static ruleNames = [ "parse", "expression", "operator_unary", "reference", + "compound_value", "function_call", "value_literal", + "array", "object", "object_element", "object_element_name" ]; + + constructor(input) { + super(input); + this._interp = new antlr4.atn.ParserATNSimulator(this, atn, decisionsToDFA, sharedContextCache); + this.ruleNames = CAQLParser.ruleNames; + this.literalNames = CAQLParser.literalNames; + this.symbolicNames = CAQLParser.symbolicNames; + } + + get atn() { + return atn; + } + + sempred(localctx, ruleIndex, predIndex) { + switch(ruleIndex) { + case 1: + return this.expression_sempred(localctx, predIndex); + case 3: + return this.reference_sempred(localctx, predIndex); + default: + throw "No predicate with index:" + ruleIndex; + } + } + + expression_sempred(localctx, predIndex) { + switch(predIndex) { + case 0: + return this.precpred(this._ctx, 13); + case 1: + return this.precpred(this._ctx, 12); + case 2: + return this.precpred(this._ctx, 11); + case 3: + return this.precpred(this._ctx, 10); + case 4: + return this.precpred(this._ctx, 9); + case 5: + return this.precpred(this._ctx, 8); + case 6: + return this.precpred(this._ctx, 7); + case 7: + return this.precpred(this._ctx, 6); + case 8: + return this.precpred(this._ctx, 5); + case 9: + return this.precpred(this._ctx, 4); + case 10: + return this.precpred(this._ctx, 3); + case 11: + return this.precpred(this._ctx, 2); + case 12: + return this.precpred(this._ctx, 1); + default: + throw "No predicate with index:" + predIndex; + } + }; + + reference_sempred(localctx, predIndex) { + switch(predIndex) { + case 13: + return this.precpred(this._ctx, 2); + case 14: + return this.precpred(this._ctx, 1); + default: + throw "No predicate with index:" + predIndex; + } + }; + + + + + parse() { + let localctx = new ParseContext(this, this._ctx, this.state); + this.enterRule(localctx, 0, CAQLParser.RULE_parse); + try { + this.enterOuterAlt(localctx, 1); + this.state = 22; + this.expression(0); + this.state = 23; + this.match(CAQLParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + + expression(_p) { + if(_p===undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new ExpressionContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 2; + this.enterRecursionRule(localctx, 2, CAQLParser.RULE_expression, _p); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 29; + this._errHandler.sync(this); + switch(this._input.LA(1)) { + case CAQLParser.T_FALSE: + case CAQLParser.T_NULL: + case CAQLParser.T_TRUE: + case CAQLParser.T_INT: + case CAQLParser.T_FLOAT: + case CAQLParser.T_QUOTED_STRING: + this.state = 26; + this.value_literal(); + break; + case CAQLParser.T_OPEN: + case CAQLParser.T_OBJECT_OPEN: + case CAQLParser.T_ARRAY_OPEN: + case CAQLParser.T_STRING: + this.state = 27; + this.reference(0); + break; + case CAQLParser.T_PLUS: + case CAQLParser.T_MINUS: + case CAQLParser.T_NOT: + this.state = 28; + this.operator_unary(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + this._ctx.stop = this._input.LT(-1); + this.state = 85; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input,4,this._ctx) + while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if(_alt===1) { + if(this._parseListeners!==null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + this.state = 83; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input,3,this._ctx); + switch(la_) { + case 1: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 31; + if (!( this.precpred(this._ctx, 13))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 13)"); + } + this.state = 32; + _la = this._input.LA(1); + if(!(_la===CAQLParser.T_PLUS || _la===CAQLParser.T_MINUS)) { + this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + this.state = 33; + this.expression(14); + break; + + case 2: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 34; + if (!( this.precpred(this._ctx, 12))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 12)"); + } + this.state = 35; + _la = this._input.LA(1); + if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CAQLParser.T_TIMES) | (1 << CAQLParser.T_DIV) | (1 << CAQLParser.T_MOD))) !== 0))) { + this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + this.state = 36; + this.expression(13); + break; + + case 3: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 37; + if (!( this.precpred(this._ctx, 11))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 11)"); + } + this.state = 38; + this.match(CAQLParser.T_RANGE); + this.state = 39; + this.expression(12); + break; + + case 4: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 40; + if (!( this.precpred(this._ctx, 10))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 10)"); + } + this.state = 41; + _la = this._input.LA(1); + if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CAQLParser.T_LT) | (1 << CAQLParser.T_GT) | (1 << CAQLParser.T_LE) | (1 << CAQLParser.T_GE))) !== 0))) { + this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + this.state = 42; + this.expression(11); + break; + + case 5: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 43; + if (!( this.precpred(this._ctx, 9))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 9)"); + } + this.state = 45; + this._errHandler.sync(this); + _la = this._input.LA(1); + if(_la===CAQLParser.T_NOT) { + this.state = 44; + this.match(CAQLParser.T_NOT); + } + + this.state = 47; + this.match(CAQLParser.T_IN); + this.state = 48; + this.expression(10); + break; + + case 6: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 49; + if (!( this.precpred(this._ctx, 8))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 8)"); + } + this.state = 50; + _la = this._input.LA(1); + if(!(_la===CAQLParser.T_EQ || _la===CAQLParser.T_NE)) { + this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + this.state = 51; + this.expression(9); + break; + + case 7: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 52; + if (!( this.precpred(this._ctx, 7))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 7)"); + } + this.state = 53; + _la = this._input.LA(1); + if(!(((((_la - 27)) & ~0x1f) == 0 && ((1 << (_la - 27)) & ((1 << (CAQLParser.T_ALL - 27)) | (1 << (CAQLParser.T_ANY - 27)) | (1 << (CAQLParser.T_NONE - 27)))) !== 0))) { + this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + this.state = 54; + localctx.eq_op = this._input.LT(1); + _la = this._input.LA(1); + if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CAQLParser.T_EQ) | (1 << CAQLParser.T_NE) | (1 << CAQLParser.T_LT) | (1 << CAQLParser.T_GT) | (1 << CAQLParser.T_LE) | (1 << CAQLParser.T_GE))) !== 0) || _la===CAQLParser.T_IN)) { + localctx.eq_op = this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + this.state = 55; + this.expression(8); + break; + + case 8: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 56; + if (!( this.precpred(this._ctx, 6))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 6)"); + } + this.state = 57; + _la = this._input.LA(1); + if(!(((((_la - 27)) & ~0x1f) == 0 && ((1 << (_la - 27)) & ((1 << (CAQLParser.T_ALL - 27)) | (1 << (CAQLParser.T_ANY - 27)) | (1 << (CAQLParser.T_NONE - 27)))) !== 0))) { + this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + this.state = 58; + this.match(CAQLParser.T_NOT); + this.state = 59; + this.match(CAQLParser.T_IN); + this.state = 60; + this.expression(7); + break; + + case 9: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 61; + if (!( this.precpred(this._ctx, 5))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 5)"); + } + this.state = 63; + this._errHandler.sync(this); + _la = this._input.LA(1); + if(_la===CAQLParser.T_NOT) { + this.state = 62; + this.match(CAQLParser.T_NOT); + } + + this.state = 65; + _la = this._input.LA(1); + if(!(_la===CAQLParser.T_REGEX_MATCH || _la===CAQLParser.T_REGEX_NON_MATCH || _la===CAQLParser.T_LIKE)) { + this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + this.state = 66; + this.expression(6); + break; + + case 10: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 67; + if (!( this.precpred(this._ctx, 4))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 4)"); + } + this.state = 68; + this.match(CAQLParser.T_AND); + this.state = 69; + this.expression(5); + break; + + case 11: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 70; + if (!( this.precpred(this._ctx, 3))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)"); + } + this.state = 71; + this.match(CAQLParser.T_OR); + this.state = 72; + this.expression(4); + break; + + case 12: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 73; + if (!( this.precpred(this._ctx, 2))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); + } + this.state = 74; + this.match(CAQLParser.T_QUESTION); + this.state = 75; + this.expression(0); + this.state = 76; + this.match(CAQLParser.T_COLON); + this.state = 77; + this.expression(3); + break; + + case 13: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 79; + if (!( this.precpred(this._ctx, 1))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); + } + this.state = 80; + this.match(CAQLParser.T_QUESTION); + this.state = 81; + this.match(CAQLParser.T_COLON); + this.state = 82; + this.expression(2); + break; + + } + } + this.state = 87; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input,4,this._ctx); + } + + } catch( error) { + if(error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx) + } + return localctx; + } + + + + operator_unary() { + let localctx = new Operator_unaryContext(this, this._ctx, this.state); + this.enterRule(localctx, 4, CAQLParser.RULE_operator_unary); + try { + this.enterOuterAlt(localctx, 1); + this.state = 94; + this._errHandler.sync(this); + switch(this._input.LA(1)) { + case CAQLParser.T_PLUS: + this.state = 88; + this.match(CAQLParser.T_PLUS); + this.state = 89; + this.expression(0); + break; + case CAQLParser.T_MINUS: + this.state = 90; + this.match(CAQLParser.T_MINUS); + this.state = 91; + this.expression(0); + break; + case CAQLParser.T_NOT: + this.state = 92; + this.match(CAQLParser.T_NOT); + this.state = 93; + this.expression(0); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + + reference(_p) { + if(_p===undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new ReferenceContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 6; + this.enterRecursionRule(localctx, 6, CAQLParser.RULE_reference, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 104; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input,6,this._ctx); + switch(la_) { + case 1: + this.state = 97; + this.match(CAQLParser.T_STRING); + break; + + case 2: + this.state = 98; + this.compound_value(); + break; + + case 3: + this.state = 99; + this.function_call(); + break; + + case 4: + this.state = 100; + this.match(CAQLParser.T_OPEN); + this.state = 101; + this.expression(0); + this.state = 102; + this.match(CAQLParser.T_CLOSE); + break; + + } + this._ctx.stop = this._input.LT(-1); + this.state = 116; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input,8,this._ctx) + while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if(_alt===1) { + if(this._parseListeners!==null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + this.state = 114; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input,7,this._ctx); + switch(la_) { + case 1: + localctx = new ReferenceContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_reference); + this.state = 106; + if (!( this.precpred(this._ctx, 2))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); + } + this.state = 107; + this.match(CAQLParser.DOT); + this.state = 108; + this.match(CAQLParser.T_STRING); + break; + + case 2: + localctx = new ReferenceContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_reference); + this.state = 109; + if (!( this.precpred(this._ctx, 1))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); + } + this.state = 110; + this.match(CAQLParser.T_ARRAY_OPEN); + this.state = 111; + this.expression(0); + this.state = 112; + this.match(CAQLParser.T_ARRAY_CLOSE); + break; + + } + } + this.state = 118; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input,8,this._ctx); + } + + } catch( error) { + if(error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx) + } + return localctx; + } + + + + compound_value() { + let localctx = new Compound_valueContext(this, this._ctx, this.state); + this.enterRule(localctx, 8, CAQLParser.RULE_compound_value); + try { + this.enterOuterAlt(localctx, 1); + this.state = 121; + this._errHandler.sync(this); + switch(this._input.LA(1)) { + case CAQLParser.T_ARRAY_OPEN: + this.state = 119; + this.array(); + break; + case CAQLParser.T_OBJECT_OPEN: + this.state = 120; + this.object(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + + + function_call() { + let localctx = new Function_callContext(this, this._ctx, this.state); + this.enterRule(localctx, 10, CAQLParser.RULE_function_call); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 123; + this.match(CAQLParser.T_STRING); + this.state = 124; + this.match(CAQLParser.T_OPEN); + this.state = 126; + this._errHandler.sync(this); + _la = this._input.LA(1); + if(((((_la - 10)) & ~0x1f) == 0 && ((1 << (_la - 10)) & ((1 << (CAQLParser.T_PLUS - 10)) | (1 << (CAQLParser.T_MINUS - 10)) | (1 << (CAQLParser.T_OPEN - 10)) | (1 << (CAQLParser.T_OBJECT_OPEN - 10)) | (1 << (CAQLParser.T_ARRAY_OPEN - 10)) | (1 << (CAQLParser.T_FALSE - 10)))) !== 0) || ((((_la - 47)) & ~0x1f) == 0 && ((1 << (_la - 47)) & ((1 << (CAQLParser.T_NOT - 47)) | (1 << (CAQLParser.T_NULL - 47)) | (1 << (CAQLParser.T_TRUE - 47)) | (1 << (CAQLParser.T_STRING - 47)) | (1 << (CAQLParser.T_INT - 47)) | (1 << (CAQLParser.T_FLOAT - 47)) | (1 << (CAQLParser.T_QUOTED_STRING - 47)))) !== 0)) { + this.state = 125; + this.expression(0); + } + + this.state = 132; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input,11,this._ctx) + while(_alt!=1 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if(_alt===1+1) { + this.state = 128; + this.match(CAQLParser.T_COMMA); + this.state = 129; + this.expression(0); + } + this.state = 134; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input,11,this._ctx); + } + + this.state = 136; + this._errHandler.sync(this); + _la = this._input.LA(1); + if(_la===CAQLParser.T_COMMA) { + this.state = 135; + this.match(CAQLParser.T_COMMA); + } + + this.state = 138; + this.match(CAQLParser.T_CLOSE); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + + + value_literal() { + let localctx = new Value_literalContext(this, this._ctx, this.state); + this.enterRule(localctx, 12, CAQLParser.RULE_value_literal); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 140; + _la = this._input.LA(1); + if(!(((((_la - 34)) & ~0x1f) == 0 && ((1 << (_la - 34)) & ((1 << (CAQLParser.T_FALSE - 34)) | (1 << (CAQLParser.T_NULL - 34)) | (1 << (CAQLParser.T_TRUE - 34)))) !== 0) || ((((_la - 70)) & ~0x1f) == 0 && ((1 << (_la - 70)) & ((1 << (CAQLParser.T_INT - 70)) | (1 << (CAQLParser.T_FLOAT - 70)) | (1 << (CAQLParser.T_QUOTED_STRING - 70)))) !== 0))) { + this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + + + array() { + let localctx = new ArrayContext(this, this._ctx, this.state); + this.enterRule(localctx, 14, CAQLParser.RULE_array); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 142; + this.match(CAQLParser.T_ARRAY_OPEN); + this.state = 144; + this._errHandler.sync(this); + _la = this._input.LA(1); + if(((((_la - 10)) & ~0x1f) == 0 && ((1 << (_la - 10)) & ((1 << (CAQLParser.T_PLUS - 10)) | (1 << (CAQLParser.T_MINUS - 10)) | (1 << (CAQLParser.T_OPEN - 10)) | (1 << (CAQLParser.T_OBJECT_OPEN - 10)) | (1 << (CAQLParser.T_ARRAY_OPEN - 10)) | (1 << (CAQLParser.T_FALSE - 10)))) !== 0) || ((((_la - 47)) & ~0x1f) == 0 && ((1 << (_la - 47)) & ((1 << (CAQLParser.T_NOT - 47)) | (1 << (CAQLParser.T_NULL - 47)) | (1 << (CAQLParser.T_TRUE - 47)) | (1 << (CAQLParser.T_STRING - 47)) | (1 << (CAQLParser.T_INT - 47)) | (1 << (CAQLParser.T_FLOAT - 47)) | (1 << (CAQLParser.T_QUOTED_STRING - 47)))) !== 0)) { + this.state = 143; + this.expression(0); + } + + this.state = 150; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input,14,this._ctx) + while(_alt!=1 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if(_alt===1+1) { + this.state = 146; + this.match(CAQLParser.T_COMMA); + this.state = 147; + this.expression(0); + } + this.state = 152; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input,14,this._ctx); + } + + this.state = 154; + this._errHandler.sync(this); + _la = this._input.LA(1); + if(_la===CAQLParser.T_COMMA) { + this.state = 153; + this.match(CAQLParser.T_COMMA); + } + + this.state = 156; + this.match(CAQLParser.T_ARRAY_CLOSE); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + + + object() { + let localctx = new ObjectContext(this, this._ctx, this.state); + this.enterRule(localctx, 16, CAQLParser.RULE_object); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 158; + this.match(CAQLParser.T_OBJECT_OPEN); + this.state = 160; + this._errHandler.sync(this); + _la = this._input.LA(1); + if(_la===CAQLParser.T_ARRAY_OPEN || _la===CAQLParser.T_STRING || _la===CAQLParser.T_QUOTED_STRING) { + this.state = 159; + this.object_element(); + } + + this.state = 166; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input,17,this._ctx) + while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if(_alt===1) { + this.state = 162; + this.match(CAQLParser.T_COMMA); + this.state = 163; + this.object_element(); + } + this.state = 168; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input,17,this._ctx); + } + + this.state = 170; + this._errHandler.sync(this); + _la = this._input.LA(1); + if(_la===CAQLParser.T_COMMA) { + this.state = 169; + this.match(CAQLParser.T_COMMA); + } + + this.state = 172; + this.match(CAQLParser.T_OBJECT_CLOSE); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + + + object_element() { + let localctx = new Object_elementContext(this, this._ctx, this.state); + this.enterRule(localctx, 18, CAQLParser.RULE_object_element); + try { + this.enterOuterAlt(localctx, 1); + this.state = 185; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input,19,this._ctx); + switch(la_) { + case 1: + this.state = 174; + this.match(CAQLParser.T_STRING); + break; + + case 2: + this.state = 175; + this.object_element_name(); + this.state = 176; + this.match(CAQLParser.T_COLON); + this.state = 177; + this.expression(0); + break; + + case 3: + this.state = 179; + this.match(CAQLParser.T_ARRAY_OPEN); + this.state = 180; + this.expression(0); + this.state = 181; + this.match(CAQLParser.T_ARRAY_CLOSE); + this.state = 182; + this.match(CAQLParser.T_COLON); + this.state = 183; + this.expression(0); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + + + object_element_name() { + let localctx = new Object_element_nameContext(this, this._ctx, this.state); + this.enterRule(localctx, 20, CAQLParser.RULE_object_element_name); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 187; + _la = this._input.LA(1); + if(!(_la===CAQLParser.T_STRING || _la===CAQLParser.T_QUOTED_STRING)) { + this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + +} + +CAQLParser.EOF = antlr4.Token.EOF; +CAQLParser.DOT = 1; +CAQLParser.T_REGEX_MATCH = 2; +CAQLParser.T_REGEX_NON_MATCH = 3; +CAQLParser.T_EQ = 4; +CAQLParser.T_NE = 5; +CAQLParser.T_LT = 6; +CAQLParser.T_GT = 7; +CAQLParser.T_LE = 8; +CAQLParser.T_GE = 9; +CAQLParser.T_PLUS = 10; +CAQLParser.T_MINUS = 11; +CAQLParser.T_TIMES = 12; +CAQLParser.T_DIV = 13; +CAQLParser.T_MOD = 14; +CAQLParser.T_QUESTION = 15; +CAQLParser.T_COLON = 16; +CAQLParser.T_SCOPE = 17; +CAQLParser.T_RANGE = 18; +CAQLParser.T_COMMA = 19; +CAQLParser.T_OPEN = 20; +CAQLParser.T_CLOSE = 21; +CAQLParser.T_OBJECT_OPEN = 22; +CAQLParser.T_OBJECT_CLOSE = 23; +CAQLParser.T_ARRAY_OPEN = 24; +CAQLParser.T_ARRAY_CLOSE = 25; +CAQLParser.T_AGGREGATE = 26; +CAQLParser.T_ALL = 27; +CAQLParser.T_AND = 28; +CAQLParser.T_ANY = 29; +CAQLParser.T_ASC = 30; +CAQLParser.T_COLLECT = 31; +CAQLParser.T_DESC = 32; +CAQLParser.T_DISTINCT = 33; +CAQLParser.T_FALSE = 34; +CAQLParser.T_FILTER = 35; +CAQLParser.T_FOR = 36; +CAQLParser.T_GRAPH = 37; +CAQLParser.T_IN = 38; +CAQLParser.T_INBOUND = 39; +CAQLParser.T_INSERT = 40; +CAQLParser.T_INTO = 41; +CAQLParser.T_K_SHORTEST_PATHS = 42; +CAQLParser.T_LET = 43; +CAQLParser.T_LIKE = 44; +CAQLParser.T_LIMIT = 45; +CAQLParser.T_NONE = 46; +CAQLParser.T_NOT = 47; +CAQLParser.T_NULL = 48; +CAQLParser.T_OR = 49; +CAQLParser.T_OUTBOUND = 50; +CAQLParser.T_REMOVE = 51; +CAQLParser.T_REPLACE = 52; +CAQLParser.T_RETURN = 53; +CAQLParser.T_SHORTEST_PATH = 54; +CAQLParser.T_SORT = 55; +CAQLParser.T_TRUE = 56; +CAQLParser.T_UPDATE = 57; +CAQLParser.T_UPSERT = 58; +CAQLParser.T_WITH = 59; +CAQLParser.T_KEEP = 60; +CAQLParser.T_COUNT = 61; +CAQLParser.T_OPTIONS = 62; +CAQLParser.T_PRUNE = 63; +CAQLParser.T_SEARCH = 64; +CAQLParser.T_TO = 65; +CAQLParser.T_CURRENT = 66; +CAQLParser.T_NEW = 67; +CAQLParser.T_OLD = 68; +CAQLParser.T_STRING = 69; +CAQLParser.T_INT = 70; +CAQLParser.T_FLOAT = 71; +CAQLParser.T_PARAMETER = 72; +CAQLParser.T_QUOTED_STRING = 73; +CAQLParser.SINGLE_LINE_COMMENT = 74; +CAQLParser.MULTILINE_COMMENT = 75; +CAQLParser.SPACES = 76; +CAQLParser.UNEXPECTED_CHAR = 77; +CAQLParser.ERROR_RECONGNIGION = 78; + +CAQLParser.RULE_parse = 0; +CAQLParser.RULE_expression = 1; +CAQLParser.RULE_operator_unary = 2; +CAQLParser.RULE_reference = 3; +CAQLParser.RULE_compound_value = 4; +CAQLParser.RULE_function_call = 5; +CAQLParser.RULE_value_literal = 6; +CAQLParser.RULE_array = 7; +CAQLParser.RULE_object = 8; +CAQLParser.RULE_object_element = 9; +CAQLParser.RULE_object_element_name = 10; + +class ParseContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_parse; + } + + expression() { + return this.getTypedRuleContext(ExpressionContext,0); + }; + + EOF() { + return this.getToken(CAQLParser.EOF, 0); + }; + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterParse(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitParse(this); + } + } + + +} + + + +class ExpressionContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_expression; + this.eq_op = null; // Token + } + + value_literal() { + return this.getTypedRuleContext(Value_literalContext,0); + }; + + reference() { + return this.getTypedRuleContext(ReferenceContext,0); + }; + + operator_unary() { + return this.getTypedRuleContext(Operator_unaryContext,0); + }; + + expression = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(ExpressionContext); + } else { + return this.getTypedRuleContext(ExpressionContext,i); + } + }; + + T_PLUS() { + return this.getToken(CAQLParser.T_PLUS, 0); + }; + + T_MINUS() { + return this.getToken(CAQLParser.T_MINUS, 0); + }; + + T_TIMES() { + return this.getToken(CAQLParser.T_TIMES, 0); + }; + + T_DIV() { + return this.getToken(CAQLParser.T_DIV, 0); + }; + + T_MOD() { + return this.getToken(CAQLParser.T_MOD, 0); + }; + + T_RANGE() { + return this.getToken(CAQLParser.T_RANGE, 0); + }; + + T_LT() { + return this.getToken(CAQLParser.T_LT, 0); + }; + + T_GT() { + return this.getToken(CAQLParser.T_GT, 0); + }; + + T_LE() { + return this.getToken(CAQLParser.T_LE, 0); + }; + + T_GE() { + return this.getToken(CAQLParser.T_GE, 0); + }; + + T_IN() { + return this.getToken(CAQLParser.T_IN, 0); + }; + + T_NOT() { + return this.getToken(CAQLParser.T_NOT, 0); + }; + + T_EQ() { + return this.getToken(CAQLParser.T_EQ, 0); + }; + + T_NE() { + return this.getToken(CAQLParser.T_NE, 0); + }; + + T_ALL() { + return this.getToken(CAQLParser.T_ALL, 0); + }; + + T_ANY() { + return this.getToken(CAQLParser.T_ANY, 0); + }; + + T_NONE() { + return this.getToken(CAQLParser.T_NONE, 0); + }; + + T_LIKE() { + return this.getToken(CAQLParser.T_LIKE, 0); + }; + + T_REGEX_MATCH() { + return this.getToken(CAQLParser.T_REGEX_MATCH, 0); + }; + + T_REGEX_NON_MATCH() { + return this.getToken(CAQLParser.T_REGEX_NON_MATCH, 0); + }; + + T_AND() { + return this.getToken(CAQLParser.T_AND, 0); + }; + + T_OR() { + return this.getToken(CAQLParser.T_OR, 0); + }; + + T_QUESTION() { + return this.getToken(CAQLParser.T_QUESTION, 0); + }; + + T_COLON() { + return this.getToken(CAQLParser.T_COLON, 0); + }; + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterExpression(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitExpression(this); + } + } + + +} + + + +class Operator_unaryContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_operator_unary; + } + + T_PLUS() { + return this.getToken(CAQLParser.T_PLUS, 0); + }; + + expression() { + return this.getTypedRuleContext(ExpressionContext,0); + }; + + T_MINUS() { + return this.getToken(CAQLParser.T_MINUS, 0); + }; + + T_NOT() { + return this.getToken(CAQLParser.T_NOT, 0); + }; + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterOperator_unary(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitOperator_unary(this); + } + } + + +} + + + +class ReferenceContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_reference; + } + + T_STRING() { + return this.getToken(CAQLParser.T_STRING, 0); + }; + + compound_value() { + return this.getTypedRuleContext(Compound_valueContext,0); + }; + + function_call() { + return this.getTypedRuleContext(Function_callContext,0); + }; + + T_OPEN() { + return this.getToken(CAQLParser.T_OPEN, 0); + }; + + expression() { + return this.getTypedRuleContext(ExpressionContext,0); + }; + + T_CLOSE() { + return this.getToken(CAQLParser.T_CLOSE, 0); + }; + + reference() { + return this.getTypedRuleContext(ReferenceContext,0); + }; + + DOT() { + return this.getToken(CAQLParser.DOT, 0); + }; + + T_ARRAY_OPEN() { + return this.getToken(CAQLParser.T_ARRAY_OPEN, 0); + }; + + T_ARRAY_CLOSE() { + return this.getToken(CAQLParser.T_ARRAY_CLOSE, 0); + }; + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterReference(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitReference(this); + } + } + + +} + + + +class Compound_valueContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_compound_value; + } + + array() { + return this.getTypedRuleContext(ArrayContext,0); + }; + + object() { + return this.getTypedRuleContext(ObjectContext,0); + }; + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterCompound_value(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitCompound_value(this); + } + } + + +} + + + +class Function_callContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_function_call; + } + + T_STRING() { + return this.getToken(CAQLParser.T_STRING, 0); + }; + + T_OPEN() { + return this.getToken(CAQLParser.T_OPEN, 0); + }; + + T_CLOSE() { + return this.getToken(CAQLParser.T_CLOSE, 0); + }; + + expression = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(ExpressionContext); + } else { + return this.getTypedRuleContext(ExpressionContext,i); + } + }; + + T_COMMA = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTokens(CAQLParser.T_COMMA); + } else { + return this.getToken(CAQLParser.T_COMMA, i); + } + }; + + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterFunction_call(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitFunction_call(this); + } + } + + +} + + + +class Value_literalContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_value_literal; + } + + T_QUOTED_STRING() { + return this.getToken(CAQLParser.T_QUOTED_STRING, 0); + }; + + T_INT() { + return this.getToken(CAQLParser.T_INT, 0); + }; + + T_FLOAT() { + return this.getToken(CAQLParser.T_FLOAT, 0); + }; + + T_NULL() { + return this.getToken(CAQLParser.T_NULL, 0); + }; + + T_TRUE() { + return this.getToken(CAQLParser.T_TRUE, 0); + }; + + T_FALSE() { + return this.getToken(CAQLParser.T_FALSE, 0); + }; + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterValue_literal(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitValue_literal(this); + } + } + + +} + + + +class ArrayContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_array; + } + + T_ARRAY_OPEN() { + return this.getToken(CAQLParser.T_ARRAY_OPEN, 0); + }; + + T_ARRAY_CLOSE() { + return this.getToken(CAQLParser.T_ARRAY_CLOSE, 0); + }; + + expression = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(ExpressionContext); + } else { + return this.getTypedRuleContext(ExpressionContext,i); + } + }; + + T_COMMA = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTokens(CAQLParser.T_COMMA); + } else { + return this.getToken(CAQLParser.T_COMMA, i); + } + }; + + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterArray(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitArray(this); + } + } + + +} + + + +class ObjectContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_object; + } + + T_OBJECT_OPEN() { + return this.getToken(CAQLParser.T_OBJECT_OPEN, 0); + }; + + T_OBJECT_CLOSE() { + return this.getToken(CAQLParser.T_OBJECT_CLOSE, 0); + }; + + object_element = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(Object_elementContext); + } else { + return this.getTypedRuleContext(Object_elementContext,i); + } + }; + + T_COMMA = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTokens(CAQLParser.T_COMMA); + } else { + return this.getToken(CAQLParser.T_COMMA, i); + } + }; + + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterObject(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitObject(this); + } + } + + +} + + + +class Object_elementContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_object_element; + } + + T_STRING() { + return this.getToken(CAQLParser.T_STRING, 0); + }; + + object_element_name() { + return this.getTypedRuleContext(Object_element_nameContext,0); + }; + + T_COLON() { + return this.getToken(CAQLParser.T_COLON, 0); + }; + + expression = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(ExpressionContext); + } else { + return this.getTypedRuleContext(ExpressionContext,i); + } + }; + + T_ARRAY_OPEN() { + return this.getToken(CAQLParser.T_ARRAY_OPEN, 0); + }; + + T_ARRAY_CLOSE() { + return this.getToken(CAQLParser.T_ARRAY_CLOSE, 0); + }; + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterObject_element(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitObject_element(this); + } + } + + +} + + + +class Object_element_nameContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_object_element_name; + } + + T_STRING() { + return this.getToken(CAQLParser.T_STRING, 0); + }; + + T_QUOTED_STRING() { + return this.getToken(CAQLParser.T_QUOTED_STRING, 0); + }; + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterObject_element_name(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitObject_element_name(this); + } + } + + +} + + + + +CAQLParser.ParseContext = ParseContext; +CAQLParser.ExpressionContext = ExpressionContext; +CAQLParser.Operator_unaryContext = Operator_unaryContext; +CAQLParser.ReferenceContext = ReferenceContext; +CAQLParser.Compound_valueContext = Compound_valueContext; +CAQLParser.Function_callContext = Function_callContext; +CAQLParser.Value_literalContext = Value_literalContext; +CAQLParser.ArrayContext = ArrayContext; +CAQLParser.ObjectContext = ObjectContext; +CAQLParser.Object_elementContext = Object_elementContext; +CAQLParser.Object_element_nameContext = Object_element_nameContext; diff --git a/ui/src/suggestions/grammar/CAQLParser.tokens b/ui/src/suggestions/grammar/CAQLParser.tokens new file mode 100644 index 0000000..7bdaf61 --- /dev/null +++ b/ui/src/suggestions/grammar/CAQLParser.tokens @@ -0,0 +1,103 @@ +DOT=1 +T_REGEX_MATCH=2 +T_REGEX_NON_MATCH=3 +T_EQ=4 +T_NE=5 +T_LT=6 +T_GT=7 +T_LE=8 +T_GE=9 +T_PLUS=10 +T_MINUS=11 +T_TIMES=12 +T_DIV=13 +T_MOD=14 +T_QUESTION=15 +T_COLON=16 +T_SCOPE=17 +T_RANGE=18 +T_COMMA=19 +T_OPEN=20 +T_CLOSE=21 +T_OBJECT_OPEN=22 +T_OBJECT_CLOSE=23 +T_ARRAY_OPEN=24 +T_ARRAY_CLOSE=25 +T_AGGREGATE=26 +T_ALL=27 +T_AND=28 +T_ANY=29 +T_ASC=30 +T_COLLECT=31 +T_DESC=32 +T_DISTINCT=33 +T_FALSE=34 +T_FILTER=35 +T_FOR=36 +T_GRAPH=37 +T_IN=38 +T_INBOUND=39 +T_INSERT=40 +T_INTO=41 +T_K_SHORTEST_PATHS=42 +T_LET=43 +T_LIKE=44 +T_LIMIT=45 +T_NONE=46 +T_NOT=47 +T_NULL=48 +T_OR=49 +T_OUTBOUND=50 +T_REMOVE=51 +T_REPLACE=52 +T_RETURN=53 +T_SHORTEST_PATH=54 +T_SORT=55 +T_TRUE=56 +T_UPDATE=57 +T_UPSERT=58 +T_WITH=59 +T_KEEP=60 +T_COUNT=61 +T_OPTIONS=62 +T_PRUNE=63 +T_SEARCH=64 +T_TO=65 +T_CURRENT=66 +T_NEW=67 +T_OLD=68 +T_STRING=69 +T_INT=70 +T_FLOAT=71 +T_PARAMETER=72 +T_QUOTED_STRING=73 +SINGLE_LINE_COMMENT=74 +MULTILINE_COMMENT=75 +SPACES=76 +UNEXPECTED_CHAR=77 +ERROR_RECONGNIGION=78 +'.'=1 +'=~'=2 +'!~'=3 +'=='=4 +'!='=5 +'<'=6 +'>'=7 +'<='=8 +'>='=9 +'+'=10 +'-'=11 +'*'=12 +'/'=13 +'%'=14 +'?'=15 +':'=16 +'::'=17 +'..'=18 +','=19 +'('=20 +')'=21 +'{'=22 +'}'=23 +'['=24 +']'=25 diff --git a/ui/src/suggestions/grammar/CAQLParserListener.js b/ui/src/suggestions/grammar/CAQLParserListener.js new file mode 100644 index 0000000..36af753 --- /dev/null +++ b/ui/src/suggestions/grammar/CAQLParserListener.js @@ -0,0 +1,108 @@ +// Generated from CAQLParser.g4 by ANTLR 4.9.2 +// jshint ignore: start +import antlr4 from 'antlr4'; + +// This class defines a complete listener for a parse tree produced by CAQLParser. +export default class CAQLParserListener extends antlr4.tree.ParseTreeListener { + + // Enter a parse tree produced by CAQLParser#parse. + enterParse(ctx) { + } + + // Exit a parse tree produced by CAQLParser#parse. + exitParse(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#expression. + enterExpression(ctx) { + } + + // Exit a parse tree produced by CAQLParser#expression. + exitExpression(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#operator_unary. + enterOperator_unary(ctx) { + } + + // Exit a parse tree produced by CAQLParser#operator_unary. + exitOperator_unary(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#reference. + enterReference(ctx) { + } + + // Exit a parse tree produced by CAQLParser#reference. + exitReference(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#compound_value. + enterCompound_value(ctx) { + } + + // Exit a parse tree produced by CAQLParser#compound_value. + exitCompound_value(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#function_call. + enterFunction_call(ctx) { + } + + // Exit a parse tree produced by CAQLParser#function_call. + exitFunction_call(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#value_literal. + enterValue_literal(ctx) { + } + + // Exit a parse tree produced by CAQLParser#value_literal. + exitValue_literal(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#array. + enterArray(ctx) { + } + + // Exit a parse tree produced by CAQLParser#array. + exitArray(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#object. + enterObject(ctx) { + } + + // Exit a parse tree produced by CAQLParser#object. + exitObject(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#object_element. + enterObject_element(ctx) { + } + + // Exit a parse tree produced by CAQLParser#object_element. + exitObject_element(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#object_element_name. + enterObject_element_name(ctx) { + } + + // Exit a parse tree produced by CAQLParser#object_element_name. + exitObject_element_name(ctx) { + } + + + +} \ No newline at end of file diff --git a/ui/src/suggestions/grammar/RQLLexer.interp b/ui/src/suggestions/grammar/RQLLexer.interp new file mode 100644 index 0000000..7633444 --- /dev/null +++ b/ui/src/suggestions/grammar/RQLLexer.interp @@ -0,0 +1,282 @@ +token literal names: +null +'.' +'=~' +'!~' +'==' +'!=' +'<' +'>' +'<=' +'>=' +'+' +'-' +'*' +'/' +'%' +'?' +':' +'::' +'..' +',' +'(' +')' +'{' +'}' +'[' +']' +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null + +token symbolic names: +null +DOT +T_REGEX_MATCH +T_REGEX_NON_MATCH +T_EQ +T_NE +T_LT +T_GT +T_LE +T_GE +T_PLUS +T_MINUS +T_TIMES +T_DIV +T_MOD +T_QUESTION +T_COLON +T_SCOPE +T_RANGE +T_COMMA +T_OPEN +T_CLOSE +T_OBJECT_OPEN +T_OBJECT_CLOSE +T_ARRAY_OPEN +T_ARRAY_CLOSE +T_AGGREGATE +T_ALL +T_AND +T_ANY +T_ASC +T_COLLECT +T_DESC +T_DISTINCT +T_FALSE +T_FILTER +T_FOR +T_GRAPH +T_IN +T_INBOUND +T_INSERT +T_INTO +T_K_SHORTEST_PATHS +T_LET +T_LIKE +T_LIMIT +T_NONE +T_NOT +T_NULL +T_OR +T_OUTBOUND +T_REMOVE +T_REPLACE +T_RETURN +T_SHORTEST_PATH +T_SORT +T_TRUE +T_UPDATE +T_UPSERT +T_WITH +T_KEEP +T_COUNT +T_OPTIONS +T_PRUNE +T_SEARCH +T_TO +T_CURRENT +T_NEW +T_OLD +T_STRING +T_INT +T_FLOAT +T_PARAMETER +T_QUOTED_STRING +SINGLE_LINE_COMMENT +MULTILINE_COMMENT +SPACES +UNEXPECTED_CHAR +ERROR_RECONGNIGION + +rule names: +DOT +T_REGEX_MATCH +T_REGEX_NON_MATCH +T_EQ +T_NE +T_LT +T_GT +T_LE +T_GE +T_PLUS +T_MINUS +T_TIMES +T_DIV +T_MOD +T_QUESTION +T_COLON +T_SCOPE +T_RANGE +T_COMMA +T_OPEN +T_CLOSE +T_OBJECT_OPEN +T_OBJECT_CLOSE +T_ARRAY_OPEN +T_ARRAY_CLOSE +T_AGGREGATE +T_ALL +T_AND +T_ANY +T_ASC +T_COLLECT +T_DESC +T_DISTINCT +T_FALSE +T_FILTER +T_FOR +T_GRAPH +T_IN +T_INBOUND +T_INSERT +T_INTO +T_K_SHORTEST_PATHS +T_LET +T_LIKE +T_LIMIT +T_NONE +T_NOT +T_NULL +T_OR +T_OUTBOUND +T_REMOVE +T_REPLACE +T_RETURN +T_SHORTEST_PATH +T_SORT +T_TRUE +T_UPDATE +T_UPSERT +T_WITH +T_KEEP +T_COUNT +T_OPTIONS +T_PRUNE +T_SEARCH +T_TO +T_CURRENT +T_NEW +T_OLD +T_STRING +T_INT +T_FLOAT +T_PARAMETER +T_QUOTED_STRING +SINGLE_LINE_COMMENT +MULTILINE_COMMENT +SPACES +UNEXPECTED_CHAR +HEX_DIGIT +DIGIT +A +B +C +D +E +F +G +H +I +J +K +L +M +N +O +P +Q +R +S +T +U +V +W +X +Y +Z +ERROR_RECONGNIGION + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN +null +null +ERRORCHANNEL + +mode names: +DEFAULT_MODE + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 80, 739, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 294, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 414, 10, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 426, 10, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 7, 70, 555, 10, 70, 12, 70, 14, 70, 558, 11, 70, 3, 71, 3, 71, 7, 71, 562, 10, 71, 12, 71, 14, 71, 565, 11, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 6, 71, 572, 10, 71, 13, 71, 14, 71, 573, 3, 71, 3, 71, 3, 71, 3, 71, 6, 71, 580, 10, 71, 13, 71, 14, 71, 581, 5, 71, 584, 10, 71, 3, 72, 3, 72, 7, 72, 588, 10, 72, 12, 72, 14, 72, 591, 11, 72, 3, 72, 5, 72, 594, 10, 72, 3, 72, 3, 72, 6, 72, 598, 10, 72, 13, 72, 14, 72, 599, 3, 72, 3, 72, 5, 72, 604, 10, 72, 3, 72, 6, 72, 607, 10, 72, 13, 72, 14, 72, 608, 5, 72, 611, 10, 72, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 7, 74, 622, 10, 74, 12, 74, 14, 74, 625, 11, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 7, 74, 634, 10, 74, 12, 74, 14, 74, 637, 11, 74, 3, 74, 5, 74, 640, 10, 74, 3, 75, 3, 75, 3, 75, 3, 75, 7, 75, 646, 10, 75, 12, 75, 14, 75, 649, 11, 75, 3, 75, 5, 75, 652, 10, 75, 3, 75, 3, 75, 5, 75, 656, 10, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 7, 76, 664, 10, 76, 12, 76, 14, 76, 667, 11, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 79, 3, 79, 3, 80, 3, 80, 3, 81, 3, 81, 3, 82, 3, 82, 3, 83, 3, 83, 3, 84, 3, 84, 3, 85, 3, 85, 3, 86, 3, 86, 3, 87, 3, 87, 3, 88, 3, 88, 3, 89, 3, 89, 3, 90, 3, 90, 3, 91, 3, 91, 3, 92, 3, 92, 3, 93, 3, 93, 3, 94, 3, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 3, 98, 3, 98, 3, 99, 3, 99, 3, 100, 3, 100, 3, 101, 3, 101, 3, 102, 3, 102, 3, 103, 3, 103, 3, 104, 3, 104, 3, 105, 3, 105, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 665, 2, 108, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 2, 159, 2, 161, 2, 163, 2, 165, 2, 167, 2, 169, 2, 171, 2, 173, 2, 175, 2, 177, 2, 179, 2, 181, 2, 183, 2, 185, 2, 187, 2, 189, 2, 191, 2, 193, 2, 195, 2, 197, 2, 199, 2, 201, 2, 203, 2, 205, 2, 207, 2, 209, 2, 211, 2, 213, 80, 3, 2, 39, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 51, 59, 3, 2, 50, 51, 4, 2, 45, 45, 47, 47, 4, 2, 41, 41, 94, 94, 4, 2, 36, 36, 94, 94, 4, 2, 12, 12, 15, 15, 5, 2, 11, 13, 15, 15, 34, 34, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 50, 59, 4, 2, 67, 67, 99, 99, 4, 2, 68, 68, 100, 100, 4, 2, 69, 69, 101, 101, 4, 2, 70, 70, 102, 102, 4, 2, 71, 71, 103, 103, 4, 2, 72, 72, 104, 104, 4, 2, 73, 73, 105, 105, 4, 2, 74, 74, 106, 106, 4, 2, 75, 75, 107, 107, 4, 2, 76, 76, 108, 108, 4, 2, 77, 77, 109, 109, 4, 2, 78, 78, 110, 110, 4, 2, 79, 79, 111, 111, 4, 2, 80, 80, 112, 112, 4, 2, 81, 81, 113, 113, 4, 2, 82, 82, 114, 114, 4, 2, 83, 83, 115, 115, 4, 2, 84, 84, 116, 116, 4, 2, 85, 85, 117, 117, 4, 2, 86, 86, 118, 118, 4, 2, 87, 87, 119, 119, 4, 2, 88, 88, 120, 120, 4, 2, 89, 89, 121, 121, 4, 2, 90, 90, 122, 122, 4, 2, 91, 91, 123, 123, 4, 2, 92, 92, 124, 124, 2, 738, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 3, 215, 3, 2, 2, 2, 5, 217, 3, 2, 2, 2, 7, 220, 3, 2, 2, 2, 9, 223, 3, 2, 2, 2, 11, 226, 3, 2, 2, 2, 13, 229, 3, 2, 2, 2, 15, 231, 3, 2, 2, 2, 17, 233, 3, 2, 2, 2, 19, 236, 3, 2, 2, 2, 21, 239, 3, 2, 2, 2, 23, 241, 3, 2, 2, 2, 25, 243, 3, 2, 2, 2, 27, 245, 3, 2, 2, 2, 29, 247, 3, 2, 2, 2, 31, 249, 3, 2, 2, 2, 33, 251, 3, 2, 2, 2, 35, 253, 3, 2, 2, 2, 37, 256, 3, 2, 2, 2, 39, 259, 3, 2, 2, 2, 41, 261, 3, 2, 2, 2, 43, 263, 3, 2, 2, 2, 45, 265, 3, 2, 2, 2, 47, 267, 3, 2, 2, 2, 49, 269, 3, 2, 2, 2, 51, 271, 3, 2, 2, 2, 53, 273, 3, 2, 2, 2, 55, 283, 3, 2, 2, 2, 57, 293, 3, 2, 2, 2, 59, 295, 3, 2, 2, 2, 61, 299, 3, 2, 2, 2, 63, 303, 3, 2, 2, 2, 65, 311, 3, 2, 2, 2, 67, 316, 3, 2, 2, 2, 69, 325, 3, 2, 2, 2, 71, 331, 3, 2, 2, 2, 73, 338, 3, 2, 2, 2, 75, 342, 3, 2, 2, 2, 77, 348, 3, 2, 2, 2, 79, 351, 3, 2, 2, 2, 81, 359, 3, 2, 2, 2, 83, 366, 3, 2, 2, 2, 85, 371, 3, 2, 2, 2, 87, 388, 3, 2, 2, 2, 89, 392, 3, 2, 2, 2, 91, 397, 3, 2, 2, 2, 93, 403, 3, 2, 2, 2, 95, 413, 3, 2, 2, 2, 97, 415, 3, 2, 2, 2, 99, 425, 3, 2, 2, 2, 101, 427, 3, 2, 2, 2, 103, 436, 3, 2, 2, 2, 105, 443, 3, 2, 2, 2, 107, 451, 3, 2, 2, 2, 109, 458, 3, 2, 2, 2, 111, 472, 3, 2, 2, 2, 113, 477, 3, 2, 2, 2, 115, 482, 3, 2, 2, 2, 117, 489, 3, 2, 2, 2, 119, 496, 3, 2, 2, 2, 121, 501, 3, 2, 2, 2, 123, 506, 3, 2, 2, 2, 125, 512, 3, 2, 2, 2, 127, 520, 3, 2, 2, 2, 129, 526, 3, 2, 2, 2, 131, 533, 3, 2, 2, 2, 133, 536, 3, 2, 2, 2, 135, 544, 3, 2, 2, 2, 137, 548, 3, 2, 2, 2, 139, 552, 3, 2, 2, 2, 141, 583, 3, 2, 2, 2, 143, 593, 3, 2, 2, 2, 145, 612, 3, 2, 2, 2, 147, 639, 3, 2, 2, 2, 149, 641, 3, 2, 2, 2, 151, 659, 3, 2, 2, 2, 153, 673, 3, 2, 2, 2, 155, 677, 3, 2, 2, 2, 157, 679, 3, 2, 2, 2, 159, 681, 3, 2, 2, 2, 161, 683, 3, 2, 2, 2, 163, 685, 3, 2, 2, 2, 165, 687, 3, 2, 2, 2, 167, 689, 3, 2, 2, 2, 169, 691, 3, 2, 2, 2, 171, 693, 3, 2, 2, 2, 173, 695, 3, 2, 2, 2, 175, 697, 3, 2, 2, 2, 177, 699, 3, 2, 2, 2, 179, 701, 3, 2, 2, 2, 181, 703, 3, 2, 2, 2, 183, 705, 3, 2, 2, 2, 185, 707, 3, 2, 2, 2, 187, 709, 3, 2, 2, 2, 189, 711, 3, 2, 2, 2, 191, 713, 3, 2, 2, 2, 193, 715, 3, 2, 2, 2, 195, 717, 3, 2, 2, 2, 197, 719, 3, 2, 2, 2, 199, 721, 3, 2, 2, 2, 201, 723, 3, 2, 2, 2, 203, 725, 3, 2, 2, 2, 205, 727, 3, 2, 2, 2, 207, 729, 3, 2, 2, 2, 209, 731, 3, 2, 2, 2, 211, 733, 3, 2, 2, 2, 213, 735, 3, 2, 2, 2, 215, 216, 7, 48, 2, 2, 216, 4, 3, 2, 2, 2, 217, 218, 7, 63, 2, 2, 218, 219, 7, 128, 2, 2, 219, 6, 3, 2, 2, 2, 220, 221, 7, 35, 2, 2, 221, 222, 7, 128, 2, 2, 222, 8, 3, 2, 2, 2, 223, 224, 7, 63, 2, 2, 224, 225, 7, 63, 2, 2, 225, 10, 3, 2, 2, 2, 226, 227, 7, 35, 2, 2, 227, 228, 7, 63, 2, 2, 228, 12, 3, 2, 2, 2, 229, 230, 7, 62, 2, 2, 230, 14, 3, 2, 2, 2, 231, 232, 7, 64, 2, 2, 232, 16, 3, 2, 2, 2, 233, 234, 7, 62, 2, 2, 234, 235, 7, 63, 2, 2, 235, 18, 3, 2, 2, 2, 236, 237, 7, 64, 2, 2, 237, 238, 7, 63, 2, 2, 238, 20, 3, 2, 2, 2, 239, 240, 7, 45, 2, 2, 240, 22, 3, 2, 2, 2, 241, 242, 7, 47, 2, 2, 242, 24, 3, 2, 2, 2, 243, 244, 7, 44, 2, 2, 244, 26, 3, 2, 2, 2, 245, 246, 7, 49, 2, 2, 246, 28, 3, 2, 2, 2, 247, 248, 7, 39, 2, 2, 248, 30, 3, 2, 2, 2, 249, 250, 7, 65, 2, 2, 250, 32, 3, 2, 2, 2, 251, 252, 7, 60, 2, 2, 252, 34, 3, 2, 2, 2, 253, 254, 7, 60, 2, 2, 254, 255, 7, 60, 2, 2, 255, 36, 3, 2, 2, 2, 256, 257, 7, 48, 2, 2, 257, 258, 7, 48, 2, 2, 258, 38, 3, 2, 2, 2, 259, 260, 7, 46, 2, 2, 260, 40, 3, 2, 2, 2, 261, 262, 7, 42, 2, 2, 262, 42, 3, 2, 2, 2, 263, 264, 7, 43, 2, 2, 264, 44, 3, 2, 2, 2, 265, 266, 7, 125, 2, 2, 266, 46, 3, 2, 2, 2, 267, 268, 7, 127, 2, 2, 268, 48, 3, 2, 2, 2, 269, 270, 7, 93, 2, 2, 270, 50, 3, 2, 2, 2, 271, 272, 7, 95, 2, 2, 272, 52, 3, 2, 2, 2, 273, 274, 5, 161, 81, 2, 274, 275, 5, 173, 87, 2, 275, 276, 5, 173, 87, 2, 276, 277, 5, 195, 98, 2, 277, 278, 5, 169, 85, 2, 278, 279, 5, 173, 87, 2, 279, 280, 5, 161, 81, 2, 280, 281, 5, 199, 100, 2, 281, 282, 5, 169, 85, 2, 282, 54, 3, 2, 2, 2, 283, 284, 5, 161, 81, 2, 284, 285, 5, 183, 92, 2, 285, 286, 5, 183, 92, 2, 286, 56, 3, 2, 2, 2, 287, 288, 5, 161, 81, 2, 288, 289, 5, 187, 94, 2, 289, 290, 5, 167, 84, 2, 290, 294, 3, 2, 2, 2, 291, 292, 7, 40, 2, 2, 292, 294, 7, 40, 2, 2, 293, 287, 3, 2, 2, 2, 293, 291, 3, 2, 2, 2, 294, 58, 3, 2, 2, 2, 295, 296, 5, 161, 81, 2, 296, 297, 5, 187, 94, 2, 297, 298, 5, 209, 105, 2, 298, 60, 3, 2, 2, 2, 299, 300, 5, 161, 81, 2, 300, 301, 5, 197, 99, 2, 301, 302, 5, 165, 83, 2, 302, 62, 3, 2, 2, 2, 303, 304, 5, 165, 83, 2, 304, 305, 5, 189, 95, 2, 305, 306, 5, 183, 92, 2, 306, 307, 5, 183, 92, 2, 307, 308, 5, 169, 85, 2, 308, 309, 5, 165, 83, 2, 309, 310, 5, 199, 100, 2, 310, 64, 3, 2, 2, 2, 311, 312, 5, 167, 84, 2, 312, 313, 5, 169, 85, 2, 313, 314, 5, 197, 99, 2, 314, 315, 5, 165, 83, 2, 315, 66, 3, 2, 2, 2, 316, 317, 5, 167, 84, 2, 317, 318, 5, 177, 89, 2, 318, 319, 5, 197, 99, 2, 319, 320, 5, 199, 100, 2, 320, 321, 5, 177, 89, 2, 321, 322, 5, 187, 94, 2, 322, 323, 5, 165, 83, 2, 323, 324, 5, 199, 100, 2, 324, 68, 3, 2, 2, 2, 325, 326, 5, 171, 86, 2, 326, 327, 5, 161, 81, 2, 327, 328, 5, 183, 92, 2, 328, 329, 5, 197, 99, 2, 329, 330, 5, 169, 85, 2, 330, 70, 3, 2, 2, 2, 331, 332, 5, 171, 86, 2, 332, 333, 5, 177, 89, 2, 333, 334, 5, 183, 92, 2, 334, 335, 5, 199, 100, 2, 335, 336, 5, 169, 85, 2, 336, 337, 5, 195, 98, 2, 337, 72, 3, 2, 2, 2, 338, 339, 5, 171, 86, 2, 339, 340, 5, 189, 95, 2, 340, 341, 5, 195, 98, 2, 341, 74, 3, 2, 2, 2, 342, 343, 5, 173, 87, 2, 343, 344, 5, 195, 98, 2, 344, 345, 5, 161, 81, 2, 345, 346, 5, 191, 96, 2, 346, 347, 5, 175, 88, 2, 347, 76, 3, 2, 2, 2, 348, 349, 5, 177, 89, 2, 349, 350, 5, 187, 94, 2, 350, 78, 3, 2, 2, 2, 351, 352, 5, 177, 89, 2, 352, 353, 5, 187, 94, 2, 353, 354, 5, 163, 82, 2, 354, 355, 5, 189, 95, 2, 355, 356, 5, 201, 101, 2, 356, 357, 5, 187, 94, 2, 357, 358, 5, 167, 84, 2, 358, 80, 3, 2, 2, 2, 359, 360, 5, 177, 89, 2, 360, 361, 5, 187, 94, 2, 361, 362, 5, 197, 99, 2, 362, 363, 5, 169, 85, 2, 363, 364, 5, 195, 98, 2, 364, 365, 5, 199, 100, 2, 365, 82, 3, 2, 2, 2, 366, 367, 5, 177, 89, 2, 367, 368, 5, 187, 94, 2, 368, 369, 5, 199, 100, 2, 369, 370, 5, 189, 95, 2, 370, 84, 3, 2, 2, 2, 371, 372, 5, 181, 91, 2, 372, 373, 7, 97, 2, 2, 373, 374, 5, 197, 99, 2, 374, 375, 5, 175, 88, 2, 375, 376, 5, 189, 95, 2, 376, 377, 5, 195, 98, 2, 377, 378, 5, 199, 100, 2, 378, 379, 5, 169, 85, 2, 379, 380, 5, 197, 99, 2, 380, 381, 5, 199, 100, 2, 381, 382, 7, 97, 2, 2, 382, 383, 5, 191, 96, 2, 383, 384, 5, 161, 81, 2, 384, 385, 5, 199, 100, 2, 385, 386, 5, 175, 88, 2, 386, 387, 5, 197, 99, 2, 387, 86, 3, 2, 2, 2, 388, 389, 5, 183, 92, 2, 389, 390, 5, 169, 85, 2, 390, 391, 5, 199, 100, 2, 391, 88, 3, 2, 2, 2, 392, 393, 5, 183, 92, 2, 393, 394, 5, 177, 89, 2, 394, 395, 5, 181, 91, 2, 395, 396, 5, 169, 85, 2, 396, 90, 3, 2, 2, 2, 397, 398, 5, 183, 92, 2, 398, 399, 5, 177, 89, 2, 399, 400, 5, 185, 93, 2, 400, 401, 5, 177, 89, 2, 401, 402, 5, 199, 100, 2, 402, 92, 3, 2, 2, 2, 403, 404, 5, 187, 94, 2, 404, 405, 5, 189, 95, 2, 405, 406, 5, 187, 94, 2, 406, 407, 5, 169, 85, 2, 407, 94, 3, 2, 2, 2, 408, 409, 5, 187, 94, 2, 409, 410, 5, 189, 95, 2, 410, 411, 5, 199, 100, 2, 411, 414, 3, 2, 2, 2, 412, 414, 7, 35, 2, 2, 413, 408, 3, 2, 2, 2, 413, 412, 3, 2, 2, 2, 414, 96, 3, 2, 2, 2, 415, 416, 5, 187, 94, 2, 416, 417, 5, 201, 101, 2, 417, 418, 5, 183, 92, 2, 418, 419, 5, 183, 92, 2, 419, 98, 3, 2, 2, 2, 420, 421, 5, 189, 95, 2, 421, 422, 5, 195, 98, 2, 422, 426, 3, 2, 2, 2, 423, 424, 7, 126, 2, 2, 424, 426, 7, 126, 2, 2, 425, 420, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 426, 100, 3, 2, 2, 2, 427, 428, 5, 189, 95, 2, 428, 429, 5, 201, 101, 2, 429, 430, 5, 199, 100, 2, 430, 431, 5, 163, 82, 2, 431, 432, 5, 189, 95, 2, 432, 433, 5, 201, 101, 2, 433, 434, 5, 187, 94, 2, 434, 435, 5, 167, 84, 2, 435, 102, 3, 2, 2, 2, 436, 437, 5, 195, 98, 2, 437, 438, 5, 169, 85, 2, 438, 439, 5, 185, 93, 2, 439, 440, 5, 189, 95, 2, 440, 441, 5, 203, 102, 2, 441, 442, 5, 169, 85, 2, 442, 104, 3, 2, 2, 2, 443, 444, 5, 195, 98, 2, 444, 445, 5, 169, 85, 2, 445, 446, 5, 191, 96, 2, 446, 447, 5, 183, 92, 2, 447, 448, 5, 161, 81, 2, 448, 449, 5, 165, 83, 2, 449, 450, 5, 169, 85, 2, 450, 106, 3, 2, 2, 2, 451, 452, 5, 195, 98, 2, 452, 453, 5, 169, 85, 2, 453, 454, 5, 199, 100, 2, 454, 455, 5, 201, 101, 2, 455, 456, 5, 195, 98, 2, 456, 457, 5, 187, 94, 2, 457, 108, 3, 2, 2, 2, 458, 459, 5, 197, 99, 2, 459, 460, 5, 175, 88, 2, 460, 461, 5, 189, 95, 2, 461, 462, 5, 195, 98, 2, 462, 463, 5, 199, 100, 2, 463, 464, 5, 169, 85, 2, 464, 465, 5, 197, 99, 2, 465, 466, 5, 199, 100, 2, 466, 467, 7, 97, 2, 2, 467, 468, 5, 191, 96, 2, 468, 469, 5, 161, 81, 2, 469, 470, 5, 199, 100, 2, 470, 471, 5, 175, 88, 2, 471, 110, 3, 2, 2, 2, 472, 473, 5, 197, 99, 2, 473, 474, 5, 189, 95, 2, 474, 475, 5, 195, 98, 2, 475, 476, 5, 199, 100, 2, 476, 112, 3, 2, 2, 2, 477, 478, 5, 199, 100, 2, 478, 479, 5, 195, 98, 2, 479, 480, 5, 201, 101, 2, 480, 481, 5, 169, 85, 2, 481, 114, 3, 2, 2, 2, 482, 483, 5, 201, 101, 2, 483, 484, 5, 191, 96, 2, 484, 485, 5, 167, 84, 2, 485, 486, 5, 161, 81, 2, 486, 487, 5, 199, 100, 2, 487, 488, 5, 169, 85, 2, 488, 116, 3, 2, 2, 2, 489, 490, 5, 201, 101, 2, 490, 491, 5, 191, 96, 2, 491, 492, 5, 197, 99, 2, 492, 493, 5, 169, 85, 2, 493, 494, 5, 195, 98, 2, 494, 495, 5, 199, 100, 2, 495, 118, 3, 2, 2, 2, 496, 497, 5, 205, 103, 2, 497, 498, 5, 177, 89, 2, 498, 499, 5, 199, 100, 2, 499, 500, 5, 175, 88, 2, 500, 120, 3, 2, 2, 2, 501, 502, 5, 181, 91, 2, 502, 503, 5, 169, 85, 2, 503, 504, 5, 169, 85, 2, 504, 505, 5, 191, 96, 2, 505, 122, 3, 2, 2, 2, 506, 507, 5, 165, 83, 2, 507, 508, 5, 189, 95, 2, 508, 509, 5, 201, 101, 2, 509, 510, 5, 187, 94, 2, 510, 511, 5, 199, 100, 2, 511, 124, 3, 2, 2, 2, 512, 513, 5, 189, 95, 2, 513, 514, 5, 191, 96, 2, 514, 515, 5, 199, 100, 2, 515, 516, 5, 177, 89, 2, 516, 517, 5, 189, 95, 2, 517, 518, 5, 187, 94, 2, 518, 519, 5, 197, 99, 2, 519, 126, 3, 2, 2, 2, 520, 521, 5, 191, 96, 2, 521, 522, 5, 195, 98, 2, 522, 523, 5, 201, 101, 2, 523, 524, 5, 187, 94, 2, 524, 525, 5, 169, 85, 2, 525, 128, 3, 2, 2, 2, 526, 527, 5, 197, 99, 2, 527, 528, 5, 169, 85, 2, 528, 529, 5, 161, 81, 2, 529, 530, 5, 195, 98, 2, 530, 531, 5, 165, 83, 2, 531, 532, 5, 175, 88, 2, 532, 130, 3, 2, 2, 2, 533, 534, 5, 199, 100, 2, 534, 535, 5, 189, 95, 2, 535, 132, 3, 2, 2, 2, 536, 537, 5, 165, 83, 2, 537, 538, 5, 201, 101, 2, 538, 539, 5, 195, 98, 2, 539, 540, 5, 195, 98, 2, 540, 541, 5, 169, 85, 2, 541, 542, 5, 187, 94, 2, 542, 543, 5, 199, 100, 2, 543, 134, 3, 2, 2, 2, 544, 545, 5, 187, 94, 2, 545, 546, 5, 169, 85, 2, 546, 547, 5, 205, 103, 2, 547, 136, 3, 2, 2, 2, 548, 549, 5, 189, 95, 2, 549, 550, 5, 183, 92, 2, 550, 551, 5, 167, 84, 2, 551, 138, 3, 2, 2, 2, 552, 556, 9, 2, 2, 2, 553, 555, 9, 3, 2, 2, 554, 553, 3, 2, 2, 2, 555, 558, 3, 2, 2, 2, 556, 554, 3, 2, 2, 2, 556, 557, 3, 2, 2, 2, 557, 140, 3, 2, 2, 2, 558, 556, 3, 2, 2, 2, 559, 563, 9, 4, 2, 2, 560, 562, 5, 159, 80, 2, 561, 560, 3, 2, 2, 2, 562, 565, 3, 2, 2, 2, 563, 561, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, 584, 3, 2, 2, 2, 565, 563, 3, 2, 2, 2, 566, 584, 7, 50, 2, 2, 567, 568, 7, 50, 2, 2, 568, 569, 7, 122, 2, 2, 569, 571, 3, 2, 2, 2, 570, 572, 5, 157, 79, 2, 571, 570, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 571, 3, 2, 2, 2, 573, 574, 3, 2, 2, 2, 574, 584, 3, 2, 2, 2, 575, 576, 7, 50, 2, 2, 576, 577, 7, 100, 2, 2, 577, 579, 3, 2, 2, 2, 578, 580, 9, 5, 2, 2, 579, 578, 3, 2, 2, 2, 580, 581, 3, 2, 2, 2, 581, 579, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 584, 3, 2, 2, 2, 583, 559, 3, 2, 2, 2, 583, 566, 3, 2, 2, 2, 583, 567, 3, 2, 2, 2, 583, 575, 3, 2, 2, 2, 584, 142, 3, 2, 2, 2, 585, 589, 9, 4, 2, 2, 586, 588, 5, 159, 80, 2, 587, 586, 3, 2, 2, 2, 588, 591, 3, 2, 2, 2, 589, 587, 3, 2, 2, 2, 589, 590, 3, 2, 2, 2, 590, 594, 3, 2, 2, 2, 591, 589, 3, 2, 2, 2, 592, 594, 7, 50, 2, 2, 593, 585, 3, 2, 2, 2, 593, 592, 3, 2, 2, 2, 593, 594, 3, 2, 2, 2, 594, 595, 3, 2, 2, 2, 595, 597, 7, 48, 2, 2, 596, 598, 5, 159, 80, 2, 597, 596, 3, 2, 2, 2, 598, 599, 3, 2, 2, 2, 599, 597, 3, 2, 2, 2, 599, 600, 3, 2, 2, 2, 600, 610, 3, 2, 2, 2, 601, 603, 5, 169, 85, 2, 602, 604, 9, 6, 2, 2, 603, 602, 3, 2, 2, 2, 603, 604, 3, 2, 2, 2, 604, 606, 3, 2, 2, 2, 605, 607, 5, 159, 80, 2, 606, 605, 3, 2, 2, 2, 607, 608, 3, 2, 2, 2, 608, 606, 3, 2, 2, 2, 608, 609, 3, 2, 2, 2, 609, 611, 3, 2, 2, 2, 610, 601, 3, 2, 2, 2, 610, 611, 3, 2, 2, 2, 611, 144, 3, 2, 2, 2, 612, 613, 7, 66, 2, 2, 613, 614, 5, 139, 70, 2, 614, 146, 3, 2, 2, 2, 615, 623, 7, 41, 2, 2, 616, 617, 7, 94, 2, 2, 617, 622, 11, 2, 2, 2, 618, 619, 7, 41, 2, 2, 619, 622, 7, 41, 2, 2, 620, 622, 10, 7, 2, 2, 621, 616, 3, 2, 2, 2, 621, 618, 3, 2, 2, 2, 621, 620, 3, 2, 2, 2, 622, 625, 3, 2, 2, 2, 623, 621, 3, 2, 2, 2, 623, 624, 3, 2, 2, 2, 624, 626, 3, 2, 2, 2, 625, 623, 3, 2, 2, 2, 626, 640, 7, 41, 2, 2, 627, 635, 7, 36, 2, 2, 628, 629, 7, 94, 2, 2, 629, 634, 11, 2, 2, 2, 630, 631, 7, 36, 2, 2, 631, 634, 7, 36, 2, 2, 632, 634, 10, 8, 2, 2, 633, 628, 3, 2, 2, 2, 633, 630, 3, 2, 2, 2, 633, 632, 3, 2, 2, 2, 634, 637, 3, 2, 2, 2, 635, 633, 3, 2, 2, 2, 635, 636, 3, 2, 2, 2, 636, 638, 3, 2, 2, 2, 637, 635, 3, 2, 2, 2, 638, 640, 7, 36, 2, 2, 639, 615, 3, 2, 2, 2, 639, 627, 3, 2, 2, 2, 640, 148, 3, 2, 2, 2, 641, 642, 7, 49, 2, 2, 642, 643, 7, 49, 2, 2, 643, 647, 3, 2, 2, 2, 644, 646, 10, 9, 2, 2, 645, 644, 3, 2, 2, 2, 646, 649, 3, 2, 2, 2, 647, 645, 3, 2, 2, 2, 647, 648, 3, 2, 2, 2, 648, 655, 3, 2, 2, 2, 649, 647, 3, 2, 2, 2, 650, 652, 7, 15, 2, 2, 651, 650, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 656, 7, 12, 2, 2, 654, 656, 7, 2, 2, 3, 655, 651, 3, 2, 2, 2, 655, 654, 3, 2, 2, 2, 656, 657, 3, 2, 2, 2, 657, 658, 8, 75, 2, 2, 658, 150, 3, 2, 2, 2, 659, 660, 7, 49, 2, 2, 660, 661, 7, 44, 2, 2, 661, 665, 3, 2, 2, 2, 662, 664, 11, 2, 2, 2, 663, 662, 3, 2, 2, 2, 664, 667, 3, 2, 2, 2, 665, 666, 3, 2, 2, 2, 665, 663, 3, 2, 2, 2, 666, 668, 3, 2, 2, 2, 667, 665, 3, 2, 2, 2, 668, 669, 7, 44, 2, 2, 669, 670, 7, 49, 2, 2, 670, 671, 3, 2, 2, 2, 671, 672, 8, 76, 2, 2, 672, 152, 3, 2, 2, 2, 673, 674, 9, 10, 2, 2, 674, 675, 3, 2, 2, 2, 675, 676, 8, 77, 2, 2, 676, 154, 3, 2, 2, 2, 677, 678, 11, 2, 2, 2, 678, 156, 3, 2, 2, 2, 679, 680, 9, 11, 2, 2, 680, 158, 3, 2, 2, 2, 681, 682, 9, 12, 2, 2, 682, 160, 3, 2, 2, 2, 683, 684, 9, 13, 2, 2, 684, 162, 3, 2, 2, 2, 685, 686, 9, 14, 2, 2, 686, 164, 3, 2, 2, 2, 687, 688, 9, 15, 2, 2, 688, 166, 3, 2, 2, 2, 689, 690, 9, 16, 2, 2, 690, 168, 3, 2, 2, 2, 691, 692, 9, 17, 2, 2, 692, 170, 3, 2, 2, 2, 693, 694, 9, 18, 2, 2, 694, 172, 3, 2, 2, 2, 695, 696, 9, 19, 2, 2, 696, 174, 3, 2, 2, 2, 697, 698, 9, 20, 2, 2, 698, 176, 3, 2, 2, 2, 699, 700, 9, 21, 2, 2, 700, 178, 3, 2, 2, 2, 701, 702, 9, 22, 2, 2, 702, 180, 3, 2, 2, 2, 703, 704, 9, 23, 2, 2, 704, 182, 3, 2, 2, 2, 705, 706, 9, 24, 2, 2, 706, 184, 3, 2, 2, 2, 707, 708, 9, 25, 2, 2, 708, 186, 3, 2, 2, 2, 709, 710, 9, 26, 2, 2, 710, 188, 3, 2, 2, 2, 711, 712, 9, 27, 2, 2, 712, 190, 3, 2, 2, 2, 713, 714, 9, 28, 2, 2, 714, 192, 3, 2, 2, 2, 715, 716, 9, 29, 2, 2, 716, 194, 3, 2, 2, 2, 717, 718, 9, 30, 2, 2, 718, 196, 3, 2, 2, 2, 719, 720, 9, 31, 2, 2, 720, 198, 3, 2, 2, 2, 721, 722, 9, 32, 2, 2, 722, 200, 3, 2, 2, 2, 723, 724, 9, 33, 2, 2, 724, 202, 3, 2, 2, 2, 725, 726, 9, 34, 2, 2, 726, 204, 3, 2, 2, 2, 727, 728, 9, 35, 2, 2, 728, 206, 3, 2, 2, 2, 729, 730, 9, 36, 2, 2, 730, 208, 3, 2, 2, 2, 731, 732, 9, 37, 2, 2, 732, 210, 3, 2, 2, 2, 733, 734, 9, 38, 2, 2, 734, 212, 3, 2, 2, 2, 735, 736, 11, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 738, 8, 107, 3, 2, 738, 214, 3, 2, 2, 2, 26, 2, 293, 413, 425, 556, 563, 573, 581, 583, 589, 593, 599, 603, 608, 610, 621, 623, 633, 635, 639, 647, 651, 655, 665, 4, 2, 3, 2, 2, 4, 2] \ No newline at end of file diff --git a/ui/src/suggestions/grammar/RQLLexer.js b/ui/src/suggestions/grammar/RQLLexer.js new file mode 100644 index 0000000..3a65707 --- /dev/null +++ b/ui/src/suggestions/grammar/RQLLexer.js @@ -0,0 +1,607 @@ +// Generated from CAQLLexer.g4 by ANTLR 4.9.2 +// jshint ignore: start +import antlr4 from 'antlr4'; + + + +const serializedATN = ["\u0003\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786", + "\u5964\u0002P\u02e3\b\u0001\u0004\u0002\t\u0002\u0004\u0003\t\u0003", + "\u0004\u0004\t\u0004\u0004\u0005\t\u0005\u0004\u0006\t\u0006\u0004\u0007", + "\t\u0007\u0004\b\t\b\u0004\t\t\t\u0004\n\t\n\u0004\u000b\t\u000b\u0004", + "\f\t\f\u0004\r\t\r\u0004\u000e\t\u000e\u0004\u000f\t\u000f\u0004\u0010", + "\t\u0010\u0004\u0011\t\u0011\u0004\u0012\t\u0012\u0004\u0013\t\u0013", + "\u0004\u0014\t\u0014\u0004\u0015\t\u0015\u0004\u0016\t\u0016\u0004\u0017", + "\t\u0017\u0004\u0018\t\u0018\u0004\u0019\t\u0019\u0004\u001a\t\u001a", + "\u0004\u001b\t\u001b\u0004\u001c\t\u001c\u0004\u001d\t\u001d\u0004\u001e", + "\t\u001e\u0004\u001f\t\u001f\u0004 \t \u0004!\t!\u0004\"\t\"\u0004#", + "\t#\u0004$\t$\u0004%\t%\u0004&\t&\u0004\'\t\'\u0004(\t(\u0004)\t)\u0004", + "*\t*\u0004+\t+\u0004,\t,\u0004-\t-\u0004.\t.\u0004/\t/\u00040\t0\u0004", + "1\t1\u00042\t2\u00043\t3\u00044\t4\u00045\t5\u00046\t6\u00047\t7\u0004", + "8\t8\u00049\t9\u0004:\t:\u0004;\t;\u0004<\t<\u0004=\t=\u0004>\t>\u0004", + "?\t?\u0004@\t@\u0004A\tA\u0004B\tB\u0004C\tC\u0004D\tD\u0004E\tE\u0004", + "F\tF\u0004G\tG\u0004H\tH\u0004I\tI\u0004J\tJ\u0004K\tK\u0004L\tL\u0004", + "M\tM\u0004N\tN\u0004O\tO\u0004P\tP\u0004Q\tQ\u0004R\tR\u0004S\tS\u0004", + "T\tT\u0004U\tU\u0004V\tV\u0004W\tW\u0004X\tX\u0004Y\tY\u0004Z\tZ\u0004", + "[\t[\u0004\\\t\\\u0004]\t]\u0004^\t^\u0004_\t_\u0004`\t`\u0004a\ta\u0004", + "b\tb\u0004c\tc\u0004d\td\u0004e\te\u0004f\tf\u0004g\tg\u0004h\th\u0004", + "i\ti\u0004j\tj\u0004k\tk\u0003\u0002\u0003\u0002\u0003\u0003\u0003\u0003", + "\u0003\u0003\u0003\u0004\u0003\u0004\u0003\u0004\u0003\u0005\u0003\u0005", + "\u0003\u0005\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0007\u0003\u0007", + "\u0003\b\u0003\b\u0003\t\u0003\t\u0003\t\u0003\n\u0003\n\u0003\n\u0003", + "\u000b\u0003\u000b\u0003\f\u0003\f\u0003\r\u0003\r\u0003\u000e\u0003", + "\u000e\u0003\u000f\u0003\u000f\u0003\u0010\u0003\u0010\u0003\u0011\u0003", + "\u0011\u0003\u0012\u0003\u0012\u0003\u0012\u0003\u0013\u0003\u0013\u0003", + "\u0013\u0003\u0014\u0003\u0014\u0003\u0015\u0003\u0015\u0003\u0016\u0003", + "\u0016\u0003\u0017\u0003\u0017\u0003\u0018\u0003\u0018\u0003\u0019\u0003", + "\u0019\u0003\u001a\u0003\u001a\u0003\u001b\u0003\u001b\u0003\u001b\u0003", + "\u001b\u0003\u001b\u0003\u001b\u0003\u001b\u0003\u001b\u0003\u001b\u0003", + "\u001b\u0003\u001c\u0003\u001c\u0003\u001c\u0003\u001c\u0003\u001d\u0003", + "\u001d\u0003\u001d\u0003\u001d\u0003\u001d\u0003\u001d\u0005\u001d\u0126", + "\n\u001d\u0003\u001e\u0003\u001e\u0003\u001e\u0003\u001e\u0003\u001f", + "\u0003\u001f\u0003\u001f\u0003\u001f\u0003 \u0003 \u0003 \u0003 \u0003", + " \u0003 \u0003 \u0003 \u0003!\u0003!\u0003!\u0003!\u0003!\u0003\"\u0003", + "\"\u0003\"\u0003\"\u0003\"\u0003\"\u0003\"\u0003\"\u0003\"\u0003#\u0003", + "#\u0003#\u0003#\u0003#\u0003#\u0003$\u0003$\u0003$\u0003$\u0003$\u0003", + "$\u0003$\u0003%\u0003%\u0003%\u0003%\u0003&\u0003&\u0003&\u0003&\u0003", + "&\u0003&\u0003\'\u0003\'\u0003\'\u0003(\u0003(\u0003(\u0003(\u0003(", + "\u0003(\u0003(\u0003(\u0003)\u0003)\u0003)\u0003)\u0003)\u0003)\u0003", + ")\u0003*\u0003*\u0003*\u0003*\u0003*\u0003+\u0003+\u0003+\u0003+\u0003", + "+\u0003+\u0003+\u0003+\u0003+\u0003+\u0003+\u0003+\u0003+\u0003+\u0003", + "+\u0003+\u0003+\u0003,\u0003,\u0003,\u0003,\u0003-\u0003-\u0003-\u0003", + "-\u0003-\u0003.\u0003.\u0003.\u0003.\u0003.\u0003.\u0003/\u0003/\u0003", + "/\u0003/\u0003/\u00030\u00030\u00030\u00030\u00030\u00050\u019e\n0\u0003", + "1\u00031\u00031\u00031\u00031\u00032\u00032\u00032\u00032\u00032\u0005", + "2\u01aa\n2\u00033\u00033\u00033\u00033\u00033\u00033\u00033\u00033\u0003", + "3\u00034\u00034\u00034\u00034\u00034\u00034\u00034\u00035\u00035\u0003", + "5\u00035\u00035\u00035\u00035\u00035\u00036\u00036\u00036\u00036\u0003", + "6\u00036\u00036\u00037\u00037\u00037\u00037\u00037\u00037\u00037\u0003", + "7\u00037\u00037\u00037\u00037\u00037\u00037\u00038\u00038\u00038\u0003", + "8\u00038\u00039\u00039\u00039\u00039\u00039\u0003:\u0003:\u0003:\u0003", + ":\u0003:\u0003:\u0003:\u0003;\u0003;\u0003;\u0003;\u0003;\u0003;\u0003", + ";\u0003<\u0003<\u0003<\u0003<\u0003<\u0003=\u0003=\u0003=\u0003=\u0003", + "=\u0003>\u0003>\u0003>\u0003>\u0003>\u0003>\u0003?\u0003?\u0003?\u0003", + "?\u0003?\u0003?\u0003?\u0003?\u0003@\u0003@\u0003@\u0003@\u0003@\u0003", + "@\u0003A\u0003A\u0003A\u0003A\u0003A\u0003A\u0003A\u0003B\u0003B\u0003", + "B\u0003C\u0003C\u0003C\u0003C\u0003C\u0003C\u0003C\u0003C\u0003D\u0003", + "D\u0003D\u0003D\u0003E\u0003E\u0003E\u0003E\u0003F\u0003F\u0007F\u022b", + "\nF\fF\u000eF\u022e\u000bF\u0003G\u0003G\u0007G\u0232\nG\fG\u000eG\u0235", + "\u000bG\u0003G\u0003G\u0003G\u0003G\u0003G\u0006G\u023c\nG\rG\u000e", + "G\u023d\u0003G\u0003G\u0003G\u0003G\u0006G\u0244\nG\rG\u000eG\u0245", + "\u0005G\u0248\nG\u0003H\u0003H\u0007H\u024c\nH\fH\u000eH\u024f\u000b", + "H\u0003H\u0005H\u0252\nH\u0003H\u0003H\u0006H\u0256\nH\rH\u000eH\u0257", + "\u0003H\u0003H\u0005H\u025c\nH\u0003H\u0006H\u025f\nH\rH\u000eH\u0260", + "\u0005H\u0263\nH\u0003I\u0003I\u0003I\u0003J\u0003J\u0003J\u0003J\u0003", + "J\u0003J\u0007J\u026e\nJ\fJ\u000eJ\u0271\u000bJ\u0003J\u0003J\u0003", + "J\u0003J\u0003J\u0003J\u0003J\u0007J\u027a\nJ\fJ\u000eJ\u027d\u000b", + "J\u0003J\u0005J\u0280\nJ\u0003K\u0003K\u0003K\u0003K\u0007K\u0286\n", + "K\fK\u000eK\u0289\u000bK\u0003K\u0005K\u028c\nK\u0003K\u0003K\u0005", + "K\u0290\nK\u0003K\u0003K\u0003L\u0003L\u0003L\u0003L\u0007L\u0298\n", + "L\fL\u000eL\u029b\u000bL\u0003L\u0003L\u0003L\u0003L\u0003L\u0003M\u0003", + "M\u0003M\u0003M\u0003N\u0003N\u0003O\u0003O\u0003P\u0003P\u0003Q\u0003", + "Q\u0003R\u0003R\u0003S\u0003S\u0003T\u0003T\u0003U\u0003U\u0003V\u0003", + "V\u0003W\u0003W\u0003X\u0003X\u0003Y\u0003Y\u0003Z\u0003Z\u0003[\u0003", + "[\u0003\\\u0003\\\u0003]\u0003]\u0003^\u0003^\u0003_\u0003_\u0003`\u0003", + "`\u0003a\u0003a\u0003b\u0003b\u0003c\u0003c\u0003d\u0003d\u0003e\u0003", + "e\u0003f\u0003f\u0003g\u0003g\u0003h\u0003h\u0003i\u0003i\u0003j\u0003", + "j\u0003k\u0003k\u0003k\u0003k\u0003\u0299\u0002l\u0003\u0003\u0005\u0004", + "\u0007\u0005\t\u0006\u000b\u0007\r\b\u000f\t\u0011\n\u0013\u000b\u0015", + "\f\u0017\r\u0019\u000e\u001b\u000f\u001d\u0010\u001f\u0011!\u0012#\u0013", + "%\u0014\'\u0015)\u0016+\u0017-\u0018/\u00191\u001a3\u001b5\u001c7\u001d", + "9\u001e;\u001f= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]0_1a2c3e4g5i6k7m8o", + "9q:s;u{?}@\u007fA\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008d", + "H\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009d\u0002\u009f", + "\u0002\u00a1\u0002\u00a3\u0002\u00a5\u0002\u00a7\u0002\u00a9\u0002\u00ab", + "\u0002\u00ad\u0002\u00af\u0002\u00b1\u0002\u00b3\u0002\u00b5\u0002\u00b7", + "\u0002\u00b9\u0002\u00bb\u0002\u00bd\u0002\u00bf\u0002\u00c1\u0002\u00c3", + "\u0002\u00c5\u0002\u00c7\u0002\u00c9\u0002\u00cb\u0002\u00cd\u0002\u00cf", + "\u0002\u00d1\u0002\u00d3\u0002\u00d5P\u0003\u0002\'\u0005\u0002C\\a", + "ac|\u0006\u00022;C\\aac|\u0003\u00023;\u0003\u000223\u0004\u0002--/", + "/\u0004\u0002))^^\u0004\u0002$$^^\u0004\u0002\f\f\u000f\u000f\u0005", + "\u0002\u000b\r\u000f\u000f\"\"\u0005\u00022;CHch\u0003\u00022;\u0004", + "\u0002CCcc\u0004\u0002DDdd\u0004\u0002EEee\u0004\u0002FFff\u0004\u0002", + "GGgg\u0004\u0002HHhh\u0004\u0002IIii\u0004\u0002JJjj\u0004\u0002KKk", + "k\u0004\u0002LLll\u0004\u0002MMmm\u0004\u0002NNnn\u0004\u0002OOoo\u0004", + "\u0002PPpp\u0004\u0002QQqq\u0004\u0002RRrr\u0004\u0002SSss\u0004\u0002", + "TTtt\u0004\u0002UUuu\u0004\u0002VVvv\u0004\u0002WWww\u0004\u0002XXx", + "x\u0004\u0002YYyy\u0004\u0002ZZzz\u0004\u0002[[{{\u0004\u0002\\\\||", + "\u0002\u02e2\u0002\u0003\u0003\u0002\u0002\u0002\u0002\u0005\u0003\u0002", + "\u0002\u0002\u0002\u0007\u0003\u0002\u0002\u0002\u0002\t\u0003\u0002", + "\u0002\u0002\u0002\u000b\u0003\u0002\u0002\u0002\u0002\r\u0003\u0002", + "\u0002\u0002\u0002\u000f\u0003\u0002\u0002\u0002\u0002\u0011\u0003\u0002", + "\u0002\u0002\u0002\u0013\u0003\u0002\u0002\u0002\u0002\u0015\u0003\u0002", + "\u0002\u0002\u0002\u0017\u0003\u0002\u0002\u0002\u0002\u0019\u0003\u0002", + "\u0002\u0002\u0002\u001b\u0003\u0002\u0002\u0002\u0002\u001d\u0003\u0002", + "\u0002\u0002\u0002\u001f\u0003\u0002\u0002\u0002\u0002!\u0003\u0002", + "\u0002\u0002\u0002#\u0003\u0002\u0002\u0002\u0002%\u0003\u0002\u0002", + "\u0002\u0002\'\u0003\u0002\u0002\u0002\u0002)\u0003\u0002\u0002\u0002", + "\u0002+\u0003\u0002\u0002\u0002\u0002-\u0003\u0002\u0002\u0002\u0002", + "/\u0003\u0002\u0002\u0002\u00021\u0003\u0002\u0002\u0002\u00023\u0003", + "\u0002\u0002\u0002\u00025\u0003\u0002\u0002\u0002\u00027\u0003\u0002", + "\u0002\u0002\u00029\u0003\u0002\u0002\u0002\u0002;\u0003\u0002\u0002", + "\u0002\u0002=\u0003\u0002\u0002\u0002\u0002?\u0003\u0002\u0002\u0002", + "\u0002A\u0003\u0002\u0002\u0002\u0002C\u0003\u0002\u0002\u0002\u0002", + "E\u0003\u0002\u0002\u0002\u0002G\u0003\u0002\u0002\u0002\u0002I\u0003", + "\u0002\u0002\u0002\u0002K\u0003\u0002\u0002\u0002\u0002M\u0003\u0002", + "\u0002\u0002\u0002O\u0003\u0002\u0002\u0002\u0002Q\u0003\u0002\u0002", + "\u0002\u0002S\u0003\u0002\u0002\u0002\u0002U\u0003\u0002\u0002\u0002", + "\u0002W\u0003\u0002\u0002\u0002\u0002Y\u0003\u0002\u0002\u0002\u0002", + "[\u0003\u0002\u0002\u0002\u0002]\u0003\u0002\u0002\u0002\u0002_\u0003", + "\u0002\u0002\u0002\u0002a\u0003\u0002\u0002\u0002\u0002c\u0003\u0002", + "\u0002\u0002\u0002e\u0003\u0002\u0002\u0002\u0002g\u0003\u0002\u0002", + "\u0002\u0002i\u0003\u0002\u0002\u0002\u0002k\u0003\u0002\u0002\u0002", + "\u0002m\u0003\u0002\u0002\u0002\u0002o\u0003\u0002\u0002\u0002\u0002", + "q\u0003\u0002\u0002\u0002\u0002s\u0003\u0002\u0002\u0002\u0002u\u0003", + "\u0002\u0002\u0002\u0002w\u0003\u0002\u0002\u0002\u0002y\u0003\u0002", + "\u0002\u0002\u0002{\u0003\u0002\u0002\u0002\u0002}\u0003\u0002\u0002", + "\u0002\u0002\u007f\u0003\u0002\u0002\u0002\u0002\u0081\u0003\u0002\u0002", + "\u0002\u0002\u0083\u0003\u0002\u0002\u0002\u0002\u0085\u0003\u0002\u0002", + "\u0002\u0002\u0087\u0003\u0002\u0002\u0002\u0002\u0089\u0003\u0002\u0002", + "\u0002\u0002\u008b\u0003\u0002\u0002\u0002\u0002\u008d\u0003\u0002\u0002", + "\u0002\u0002\u008f\u0003\u0002\u0002\u0002\u0002\u0091\u0003\u0002\u0002", + "\u0002\u0002\u0093\u0003\u0002\u0002\u0002\u0002\u0095\u0003\u0002\u0002", + "\u0002\u0002\u0097\u0003\u0002\u0002\u0002\u0002\u0099\u0003\u0002\u0002", + "\u0002\u0002\u009b\u0003\u0002\u0002\u0002\u0002\u00d5\u0003\u0002\u0002", + "\u0002\u0003\u00d7\u0003\u0002\u0002\u0002\u0005\u00d9\u0003\u0002\u0002", + "\u0002\u0007\u00dc\u0003\u0002\u0002\u0002\t\u00df\u0003\u0002\u0002", + "\u0002\u000b\u00e2\u0003\u0002\u0002\u0002\r\u00e5\u0003\u0002\u0002", + "\u0002\u000f\u00e7\u0003\u0002\u0002\u0002\u0011\u00e9\u0003\u0002\u0002", + "\u0002\u0013\u00ec\u0003\u0002\u0002\u0002\u0015\u00ef\u0003\u0002\u0002", + "\u0002\u0017\u00f1\u0003\u0002\u0002\u0002\u0019\u00f3\u0003\u0002\u0002", + "\u0002\u001b\u00f5\u0003\u0002\u0002\u0002\u001d\u00f7\u0003\u0002\u0002", + "\u0002\u001f\u00f9\u0003\u0002\u0002\u0002!\u00fb\u0003\u0002\u0002", + "\u0002#\u00fd\u0003\u0002\u0002\u0002%\u0100\u0003\u0002\u0002\u0002", + "\'\u0103\u0003\u0002\u0002\u0002)\u0105\u0003\u0002\u0002\u0002+\u0107", + "\u0003\u0002\u0002\u0002-\u0109\u0003\u0002\u0002\u0002/\u010b\u0003", + "\u0002\u0002\u00021\u010d\u0003\u0002\u0002\u00023\u010f\u0003\u0002", + "\u0002\u00025\u0111\u0003\u0002\u0002\u00027\u011b\u0003\u0002\u0002", + "\u00029\u0125\u0003\u0002\u0002\u0002;\u0127\u0003\u0002\u0002\u0002", + "=\u012b\u0003\u0002\u0002\u0002?\u012f\u0003\u0002\u0002\u0002A\u0137", + "\u0003\u0002\u0002\u0002C\u013c\u0003\u0002\u0002\u0002E\u0145\u0003", + "\u0002\u0002\u0002G\u014b\u0003\u0002\u0002\u0002I\u0152\u0003\u0002", + "\u0002\u0002K\u0156\u0003\u0002\u0002\u0002M\u015c\u0003\u0002\u0002", + "\u0002O\u015f\u0003\u0002\u0002\u0002Q\u0167\u0003\u0002\u0002\u0002", + "S\u016e\u0003\u0002\u0002\u0002U\u0173\u0003\u0002\u0002\u0002W\u0184", + "\u0003\u0002\u0002\u0002Y\u0188\u0003\u0002\u0002\u0002[\u018d\u0003", + "\u0002\u0002\u0002]\u0193\u0003\u0002\u0002\u0002_\u019d\u0003\u0002", + "\u0002\u0002a\u019f\u0003\u0002\u0002\u0002c\u01a9\u0003\u0002\u0002", + "\u0002e\u01ab\u0003\u0002\u0002\u0002g\u01b4\u0003\u0002\u0002\u0002", + "i\u01bb\u0003\u0002\u0002\u0002k\u01c3\u0003\u0002\u0002\u0002m\u01ca", + "\u0003\u0002\u0002\u0002o\u01d8\u0003\u0002\u0002\u0002q\u01dd\u0003", + "\u0002\u0002\u0002s\u01e2\u0003\u0002\u0002\u0002u\u01e9\u0003\u0002", + "\u0002\u0002w\u01f0\u0003\u0002\u0002\u0002y\u01f5\u0003\u0002\u0002", + "\u0002{\u01fa\u0003\u0002\u0002\u0002}\u0200\u0003\u0002\u0002\u0002", + "\u007f\u0208\u0003\u0002\u0002\u0002\u0081\u020e\u0003\u0002\u0002\u0002", + "\u0083\u0215\u0003\u0002\u0002\u0002\u0085\u0218\u0003\u0002\u0002\u0002", + "\u0087\u0220\u0003\u0002\u0002\u0002\u0089\u0224\u0003\u0002\u0002\u0002", + "\u008b\u0228\u0003\u0002\u0002\u0002\u008d\u0247\u0003\u0002\u0002\u0002", + "\u008f\u0251\u0003\u0002\u0002\u0002\u0091\u0264\u0003\u0002\u0002\u0002", + "\u0093\u027f\u0003\u0002\u0002\u0002\u0095\u0281\u0003\u0002\u0002\u0002", + "\u0097\u0293\u0003\u0002\u0002\u0002\u0099\u02a1\u0003\u0002\u0002\u0002", + "\u009b\u02a5\u0003\u0002\u0002\u0002\u009d\u02a7\u0003\u0002\u0002\u0002", + "\u009f\u02a9\u0003\u0002\u0002\u0002\u00a1\u02ab\u0003\u0002\u0002\u0002", + "\u00a3\u02ad\u0003\u0002\u0002\u0002\u00a5\u02af\u0003\u0002\u0002\u0002", + "\u00a7\u02b1\u0003\u0002\u0002\u0002\u00a9\u02b3\u0003\u0002\u0002\u0002", + "\u00ab\u02b5\u0003\u0002\u0002\u0002\u00ad\u02b7\u0003\u0002\u0002\u0002", + "\u00af\u02b9\u0003\u0002\u0002\u0002\u00b1\u02bb\u0003\u0002\u0002\u0002", + "\u00b3\u02bd\u0003\u0002\u0002\u0002\u00b5\u02bf\u0003\u0002\u0002\u0002", + "\u00b7\u02c1\u0003\u0002\u0002\u0002\u00b9\u02c3\u0003\u0002\u0002\u0002", + "\u00bb\u02c5\u0003\u0002\u0002\u0002\u00bd\u02c7\u0003\u0002\u0002\u0002", + "\u00bf\u02c9\u0003\u0002\u0002\u0002\u00c1\u02cb\u0003\u0002\u0002\u0002", + "\u00c3\u02cd\u0003\u0002\u0002\u0002\u00c5\u02cf\u0003\u0002\u0002\u0002", + "\u00c7\u02d1\u0003\u0002\u0002\u0002\u00c9\u02d3\u0003\u0002\u0002\u0002", + "\u00cb\u02d5\u0003\u0002\u0002\u0002\u00cd\u02d7\u0003\u0002\u0002\u0002", + "\u00cf\u02d9\u0003\u0002\u0002\u0002\u00d1\u02db\u0003\u0002\u0002\u0002", + "\u00d3\u02dd\u0003\u0002\u0002\u0002\u00d5\u02df\u0003\u0002\u0002\u0002", + "\u00d7\u00d8\u00070\u0002\u0002\u00d8\u0004\u0003\u0002\u0002\u0002", + "\u00d9\u00da\u0007?\u0002\u0002\u00da\u00db\u0007\u0080\u0002\u0002", + "\u00db\u0006\u0003\u0002\u0002\u0002\u00dc\u00dd\u0007#\u0002\u0002", + "\u00dd\u00de\u0007\u0080\u0002\u0002\u00de\b\u0003\u0002\u0002\u0002", + "\u00df\u00e0\u0007?\u0002\u0002\u00e0\u00e1\u0007?\u0002\u0002\u00e1", + "\n\u0003\u0002\u0002\u0002\u00e2\u00e3\u0007#\u0002\u0002\u00e3\u00e4", + "\u0007?\u0002\u0002\u00e4\f\u0003\u0002\u0002\u0002\u00e5\u00e6\u0007", + ">\u0002\u0002\u00e6\u000e\u0003\u0002\u0002\u0002\u00e7\u00e8\u0007", + "@\u0002\u0002\u00e8\u0010\u0003\u0002\u0002\u0002\u00e9\u00ea\u0007", + ">\u0002\u0002\u00ea\u00eb\u0007?\u0002\u0002\u00eb\u0012\u0003\u0002", + "\u0002\u0002\u00ec\u00ed\u0007@\u0002\u0002\u00ed\u00ee\u0007?\u0002", + "\u0002\u00ee\u0014\u0003\u0002\u0002\u0002\u00ef\u00f0\u0007-\u0002", + "\u0002\u00f0\u0016\u0003\u0002\u0002\u0002\u00f1\u00f2\u0007/\u0002", + "\u0002\u00f2\u0018\u0003\u0002\u0002\u0002\u00f3\u00f4\u0007,\u0002", + "\u0002\u00f4\u001a\u0003\u0002\u0002\u0002\u00f5\u00f6\u00071\u0002", + "\u0002\u00f6\u001c\u0003\u0002\u0002\u0002\u00f7\u00f8\u0007\'\u0002", + "\u0002\u00f8\u001e\u0003\u0002\u0002\u0002\u00f9\u00fa\u0007A\u0002", + "\u0002\u00fa \u0003\u0002\u0002\u0002\u00fb\u00fc\u0007<\u0002\u0002", + "\u00fc\"\u0003\u0002\u0002\u0002\u00fd\u00fe\u0007<\u0002\u0002\u00fe", + "\u00ff\u0007<\u0002\u0002\u00ff$\u0003\u0002\u0002\u0002\u0100\u0101", + "\u00070\u0002\u0002\u0101\u0102\u00070\u0002\u0002\u0102&\u0003\u0002", + "\u0002\u0002\u0103\u0104\u0007.\u0002\u0002\u0104(\u0003\u0002\u0002", + "\u0002\u0105\u0106\u0007*\u0002\u0002\u0106*\u0003\u0002\u0002\u0002", + "\u0107\u0108\u0007+\u0002\u0002\u0108,\u0003\u0002\u0002\u0002\u0109", + "\u010a\u0007}\u0002\u0002\u010a.\u0003\u0002\u0002\u0002\u010b\u010c", + "\u0007\u007f\u0002\u0002\u010c0\u0003\u0002\u0002\u0002\u010d\u010e", + "\u0007]\u0002\u0002\u010e2\u0003\u0002\u0002\u0002\u010f\u0110\u0007", + "_\u0002\u0002\u01104\u0003\u0002\u0002\u0002\u0111\u0112\u0005\u00a1", + "Q\u0002\u0112\u0113\u0005\u00adW\u0002\u0113\u0114\u0005\u00adW\u0002", + "\u0114\u0115\u0005\u00c3b\u0002\u0115\u0116\u0005\u00a9U\u0002\u0116", + "\u0117\u0005\u00adW\u0002\u0117\u0118\u0005\u00a1Q\u0002\u0118\u0119", + "\u0005\u00c7d\u0002\u0119\u011a\u0005\u00a9U\u0002\u011a6\u0003\u0002", + "\u0002\u0002\u011b\u011c\u0005\u00a1Q\u0002\u011c\u011d\u0005\u00b7", + "\\\u0002\u011d\u011e\u0005\u00b7\\\u0002\u011e8\u0003\u0002\u0002\u0002", + "\u011f\u0120\u0005\u00a1Q\u0002\u0120\u0121\u0005\u00bb^\u0002\u0121", + "\u0122\u0005\u00a7T\u0002\u0122\u0126\u0003\u0002\u0002\u0002\u0123", + "\u0124\u0007(\u0002\u0002\u0124\u0126\u0007(\u0002\u0002\u0125\u011f", + "\u0003\u0002\u0002\u0002\u0125\u0123\u0003\u0002\u0002\u0002\u0126:", + "\u0003\u0002\u0002\u0002\u0127\u0128\u0005\u00a1Q\u0002\u0128\u0129", + "\u0005\u00bb^\u0002\u0129\u012a\u0005\u00d1i\u0002\u012a<\u0003\u0002", + "\u0002\u0002\u012b\u012c\u0005\u00a1Q\u0002\u012c\u012d\u0005\u00c5", + "c\u0002\u012d\u012e\u0005\u00a5S\u0002\u012e>\u0003\u0002\u0002\u0002", + "\u012f\u0130\u0005\u00a5S\u0002\u0130\u0131\u0005\u00bd_\u0002\u0131", + "\u0132\u0005\u00b7\\\u0002\u0132\u0133\u0005\u00b7\\\u0002\u0133\u0134", + "\u0005\u00a9U\u0002\u0134\u0135\u0005\u00a5S\u0002\u0135\u0136\u0005", + "\u00c7d\u0002\u0136@\u0003\u0002\u0002\u0002\u0137\u0138\u0005\u00a7", + "T\u0002\u0138\u0139\u0005\u00a9U\u0002\u0139\u013a\u0005\u00c5c\u0002", + "\u013a\u013b\u0005\u00a5S\u0002\u013bB\u0003\u0002\u0002\u0002\u013c", + "\u013d\u0005\u00a7T\u0002\u013d\u013e\u0005\u00b1Y\u0002\u013e\u013f", + "\u0005\u00c5c\u0002\u013f\u0140\u0005\u00c7d\u0002\u0140\u0141\u0005", + "\u00b1Y\u0002\u0141\u0142\u0005\u00bb^\u0002\u0142\u0143\u0005\u00a5", + "S\u0002\u0143\u0144\u0005\u00c7d\u0002\u0144D\u0003\u0002\u0002\u0002", + "\u0145\u0146\u0005\u00abV\u0002\u0146\u0147\u0005\u00a1Q\u0002\u0147", + "\u0148\u0005\u00b7\\\u0002\u0148\u0149\u0005\u00c5c\u0002\u0149\u014a", + "\u0005\u00a9U\u0002\u014aF\u0003\u0002\u0002\u0002\u014b\u014c\u0005", + "\u00abV\u0002\u014c\u014d\u0005\u00b1Y\u0002\u014d\u014e\u0005\u00b7", + "\\\u0002\u014e\u014f\u0005\u00c7d\u0002\u014f\u0150\u0005\u00a9U\u0002", + "\u0150\u0151\u0005\u00c3b\u0002\u0151H\u0003\u0002\u0002\u0002\u0152", + "\u0153\u0005\u00abV\u0002\u0153\u0154\u0005\u00bd_\u0002\u0154\u0155", + "\u0005\u00c3b\u0002\u0155J\u0003\u0002\u0002\u0002\u0156\u0157\u0005", + "\u00adW\u0002\u0157\u0158\u0005\u00c3b\u0002\u0158\u0159\u0005\u00a1", + "Q\u0002\u0159\u015a\u0005\u00bf`\u0002\u015a\u015b\u0005\u00afX\u0002", + "\u015bL\u0003\u0002\u0002\u0002\u015c\u015d\u0005\u00b1Y\u0002\u015d", + "\u015e\u0005\u00bb^\u0002\u015eN\u0003\u0002\u0002\u0002\u015f\u0160", + "\u0005\u00b1Y\u0002\u0160\u0161\u0005\u00bb^\u0002\u0161\u0162\u0005", + "\u00a3R\u0002\u0162\u0163\u0005\u00bd_\u0002\u0163\u0164\u0005\u00c9", + "e\u0002\u0164\u0165\u0005\u00bb^\u0002\u0165\u0166\u0005\u00a7T\u0002", + "\u0166P\u0003\u0002\u0002\u0002\u0167\u0168\u0005\u00b1Y\u0002\u0168", + "\u0169\u0005\u00bb^\u0002\u0169\u016a\u0005\u00c5c\u0002\u016a\u016b", + "\u0005\u00a9U\u0002\u016b\u016c\u0005\u00c3b\u0002\u016c\u016d\u0005", + "\u00c7d\u0002\u016dR\u0003\u0002\u0002\u0002\u016e\u016f\u0005\u00b1", + "Y\u0002\u016f\u0170\u0005\u00bb^\u0002\u0170\u0171\u0005\u00c7d\u0002", + "\u0171\u0172\u0005\u00bd_\u0002\u0172T\u0003\u0002\u0002\u0002\u0173", + "\u0174\u0005\u00b5[\u0002\u0174\u0175\u0007a\u0002\u0002\u0175\u0176", + "\u0005\u00c5c\u0002\u0176\u0177\u0005\u00afX\u0002\u0177\u0178\u0005", + "\u00bd_\u0002\u0178\u0179\u0005\u00c3b\u0002\u0179\u017a\u0005\u00c7", + "d\u0002\u017a\u017b\u0005\u00a9U\u0002\u017b\u017c\u0005\u00c5c\u0002", + "\u017c\u017d\u0005\u00c7d\u0002\u017d\u017e\u0007a\u0002\u0002\u017e", + "\u017f\u0005\u00bf`\u0002\u017f\u0180\u0005\u00a1Q\u0002\u0180\u0181", + "\u0005\u00c7d\u0002\u0181\u0182\u0005\u00afX\u0002\u0182\u0183\u0005", + "\u00c5c\u0002\u0183V\u0003\u0002\u0002\u0002\u0184\u0185\u0005\u00b7", + "\\\u0002\u0185\u0186\u0005\u00a9U\u0002\u0186\u0187\u0005\u00c7d\u0002", + "\u0187X\u0003\u0002\u0002\u0002\u0188\u0189\u0005\u00b7\\\u0002\u0189", + "\u018a\u0005\u00b1Y\u0002\u018a\u018b\u0005\u00b5[\u0002\u018b\u018c", + "\u0005\u00a9U\u0002\u018cZ\u0003\u0002\u0002\u0002\u018d\u018e\u0005", + "\u00b7\\\u0002\u018e\u018f\u0005\u00b1Y\u0002\u018f\u0190\u0005\u00b9", + "]\u0002\u0190\u0191\u0005\u00b1Y\u0002\u0191\u0192\u0005\u00c7d\u0002", + "\u0192\\\u0003\u0002\u0002\u0002\u0193\u0194\u0005\u00bb^\u0002\u0194", + "\u0195\u0005\u00bd_\u0002\u0195\u0196\u0005\u00bb^\u0002\u0196\u0197", + "\u0005\u00a9U\u0002\u0197^\u0003\u0002\u0002\u0002\u0198\u0199\u0005", + "\u00bb^\u0002\u0199\u019a\u0005\u00bd_\u0002\u019a\u019b\u0005\u00c7", + "d\u0002\u019b\u019e\u0003\u0002\u0002\u0002\u019c\u019e\u0007#\u0002", + "\u0002\u019d\u0198\u0003\u0002\u0002\u0002\u019d\u019c\u0003\u0002\u0002", + "\u0002\u019e`\u0003\u0002\u0002\u0002\u019f\u01a0\u0005\u00bb^\u0002", + "\u01a0\u01a1\u0005\u00c9e\u0002\u01a1\u01a2\u0005\u00b7\\\u0002\u01a2", + "\u01a3\u0005\u00b7\\\u0002\u01a3b\u0003\u0002\u0002\u0002\u01a4\u01a5", + "\u0005\u00bd_\u0002\u01a5\u01a6\u0005\u00c3b\u0002\u01a6\u01aa\u0003", + "\u0002\u0002\u0002\u01a7\u01a8\u0007~\u0002\u0002\u01a8\u01aa\u0007", + "~\u0002\u0002\u01a9\u01a4\u0003\u0002\u0002\u0002\u01a9\u01a7\u0003", + "\u0002\u0002\u0002\u01aad\u0003\u0002\u0002\u0002\u01ab\u01ac\u0005", + "\u00bd_\u0002\u01ac\u01ad\u0005\u00c9e\u0002\u01ad\u01ae\u0005\u00c7", + "d\u0002\u01ae\u01af\u0005\u00a3R\u0002\u01af\u01b0\u0005\u00bd_\u0002", + "\u01b0\u01b1\u0005\u00c9e\u0002\u01b1\u01b2\u0005\u00bb^\u0002\u01b2", + "\u01b3\u0005\u00a7T\u0002\u01b3f\u0003\u0002\u0002\u0002\u01b4\u01b5", + "\u0005\u00c3b\u0002\u01b5\u01b6\u0005\u00a9U\u0002\u01b6\u01b7\u0005", + "\u00b9]\u0002\u01b7\u01b8\u0005\u00bd_\u0002\u01b8\u01b9\u0005\u00cb", + "f\u0002\u01b9\u01ba\u0005\u00a9U\u0002\u01bah\u0003\u0002\u0002\u0002", + "\u01bb\u01bc\u0005\u00c3b\u0002\u01bc\u01bd\u0005\u00a9U\u0002\u01bd", + "\u01be\u0005\u00bf`\u0002\u01be\u01bf\u0005\u00b7\\\u0002\u01bf\u01c0", + "\u0005\u00a1Q\u0002\u01c0\u01c1\u0005\u00a5S\u0002\u01c1\u01c2\u0005", + "\u00a9U\u0002\u01c2j\u0003\u0002\u0002\u0002\u01c3\u01c4\u0005\u00c3", + "b\u0002\u01c4\u01c5\u0005\u00a9U\u0002\u01c5\u01c6\u0005\u00c7d\u0002", + "\u01c6\u01c7\u0005\u00c9e\u0002\u01c7\u01c8\u0005\u00c3b\u0002\u01c8", + "\u01c9\u0005\u00bb^\u0002\u01c9l\u0003\u0002\u0002\u0002\u01ca\u01cb", + "\u0005\u00c5c\u0002\u01cb\u01cc\u0005\u00afX\u0002\u01cc\u01cd\u0005", + "\u00bd_\u0002\u01cd\u01ce\u0005\u00c3b\u0002\u01ce\u01cf\u0005\u00c7", + "d\u0002\u01cf\u01d0\u0005\u00a9U\u0002\u01d0\u01d1\u0005\u00c5c\u0002", + "\u01d1\u01d2\u0005\u00c7d\u0002\u01d2\u01d3\u0007a\u0002\u0002\u01d3", + "\u01d4\u0005\u00bf`\u0002\u01d4\u01d5\u0005\u00a1Q\u0002\u01d5\u01d6", + "\u0005\u00c7d\u0002\u01d6\u01d7\u0005\u00afX\u0002\u01d7n\u0003\u0002", + "\u0002\u0002\u01d8\u01d9\u0005\u00c5c\u0002\u01d9\u01da\u0005\u00bd", + "_\u0002\u01da\u01db\u0005\u00c3b\u0002\u01db\u01dc\u0005\u00c7d\u0002", + "\u01dcp\u0003\u0002\u0002\u0002\u01dd\u01de\u0005\u00c7d\u0002\u01de", + "\u01df\u0005\u00c3b\u0002\u01df\u01e0\u0005\u00c9e\u0002\u01e0\u01e1", + "\u0005\u00a9U\u0002\u01e1r\u0003\u0002\u0002\u0002\u01e2\u01e3\u0005", + "\u00c9e\u0002\u01e3\u01e4\u0005\u00bf`\u0002\u01e4\u01e5\u0005\u00a7", + "T\u0002\u01e5\u01e6\u0005\u00a1Q\u0002\u01e6\u01e7\u0005\u00c7d\u0002", + "\u01e7\u01e8\u0005\u00a9U\u0002\u01e8t\u0003\u0002\u0002\u0002\u01e9", + "\u01ea\u0005\u00c9e\u0002\u01ea\u01eb\u0005\u00bf`\u0002\u01eb\u01ec", + "\u0005\u00c5c\u0002\u01ec\u01ed\u0005\u00a9U\u0002\u01ed\u01ee\u0005", + "\u00c3b\u0002\u01ee\u01ef\u0005\u00c7d\u0002\u01efv\u0003\u0002\u0002", + "\u0002\u01f0\u01f1\u0005\u00cdg\u0002\u01f1\u01f2\u0005\u00b1Y\u0002", + "\u01f2\u01f3\u0005\u00c7d\u0002\u01f3\u01f4\u0005\u00afX\u0002\u01f4", + "x\u0003\u0002\u0002\u0002\u01f5\u01f6\u0005\u00b5[\u0002\u01f6\u01f7", + "\u0005\u00a9U\u0002\u01f7\u01f8\u0005\u00a9U\u0002\u01f8\u01f9\u0005", + "\u00bf`\u0002\u01f9z\u0003\u0002\u0002\u0002\u01fa\u01fb\u0005\u00a5", + "S\u0002\u01fb\u01fc\u0005\u00bd_\u0002\u01fc\u01fd\u0005\u00c9e\u0002", + "\u01fd\u01fe\u0005\u00bb^\u0002\u01fe\u01ff\u0005\u00c7d\u0002\u01ff", + "|\u0003\u0002\u0002\u0002\u0200\u0201\u0005\u00bd_\u0002\u0201\u0202", + "\u0005\u00bf`\u0002\u0202\u0203\u0005\u00c7d\u0002\u0203\u0204\u0005", + "\u00b1Y\u0002\u0204\u0205\u0005\u00bd_\u0002\u0205\u0206\u0005\u00bb", + "^\u0002\u0206\u0207\u0005\u00c5c\u0002\u0207~\u0003\u0002\u0002\u0002", + "\u0208\u0209\u0005\u00bf`\u0002\u0209\u020a\u0005\u00c3b\u0002\u020a", + "\u020b\u0005\u00c9e\u0002\u020b\u020c\u0005\u00bb^\u0002\u020c\u020d", + "\u0005\u00a9U\u0002\u020d\u0080\u0003\u0002\u0002\u0002\u020e\u020f", + "\u0005\u00c5c\u0002\u020f\u0210\u0005\u00a9U\u0002\u0210\u0211\u0005", + "\u00a1Q\u0002\u0211\u0212\u0005\u00c3b\u0002\u0212\u0213\u0005\u00a5", + "S\u0002\u0213\u0214\u0005\u00afX\u0002\u0214\u0082\u0003\u0002\u0002", + "\u0002\u0215\u0216\u0005\u00c7d\u0002\u0216\u0217\u0005\u00bd_\u0002", + "\u0217\u0084\u0003\u0002\u0002\u0002\u0218\u0219\u0005\u00a5S\u0002", + "\u0219\u021a\u0005\u00c9e\u0002\u021a\u021b\u0005\u00c3b\u0002\u021b", + "\u021c\u0005\u00c3b\u0002\u021c\u021d\u0005\u00a9U\u0002\u021d\u021e", + "\u0005\u00bb^\u0002\u021e\u021f\u0005\u00c7d\u0002\u021f\u0086\u0003", + "\u0002\u0002\u0002\u0220\u0221\u0005\u00bb^\u0002\u0221\u0222\u0005", + "\u00a9U\u0002\u0222\u0223\u0005\u00cdg\u0002\u0223\u0088\u0003\u0002", + "\u0002\u0002\u0224\u0225\u0005\u00bd_\u0002\u0225\u0226\u0005\u00b7", + "\\\u0002\u0226\u0227\u0005\u00a7T\u0002\u0227\u008a\u0003\u0002\u0002", + "\u0002\u0228\u022c\t\u0002\u0002\u0002\u0229\u022b\t\u0003\u0002\u0002", + "\u022a\u0229\u0003\u0002\u0002\u0002\u022b\u022e\u0003\u0002\u0002\u0002", + "\u022c\u022a\u0003\u0002\u0002\u0002\u022c\u022d\u0003\u0002\u0002\u0002", + "\u022d\u008c\u0003\u0002\u0002\u0002\u022e\u022c\u0003\u0002\u0002\u0002", + "\u022f\u0233\t\u0004\u0002\u0002\u0230\u0232\u0005\u009fP\u0002\u0231", + "\u0230\u0003\u0002\u0002\u0002\u0232\u0235\u0003\u0002\u0002\u0002\u0233", + "\u0231\u0003\u0002\u0002\u0002\u0233\u0234\u0003\u0002\u0002\u0002\u0234", + "\u0248\u0003\u0002\u0002\u0002\u0235\u0233\u0003\u0002\u0002\u0002\u0236", + "\u0248\u00072\u0002\u0002\u0237\u0238\u00072\u0002\u0002\u0238\u0239", + "\u0007z\u0002\u0002\u0239\u023b\u0003\u0002\u0002\u0002\u023a\u023c", + "\u0005\u009dO\u0002\u023b\u023a\u0003\u0002\u0002\u0002\u023c\u023d", + "\u0003\u0002\u0002\u0002\u023d\u023b\u0003\u0002\u0002\u0002\u023d\u023e", + "\u0003\u0002\u0002\u0002\u023e\u0248\u0003\u0002\u0002\u0002\u023f\u0240", + "\u00072\u0002\u0002\u0240\u0241\u0007d\u0002\u0002\u0241\u0243\u0003", + "\u0002\u0002\u0002\u0242\u0244\t\u0005\u0002\u0002\u0243\u0242\u0003", + "\u0002\u0002\u0002\u0244\u0245\u0003\u0002\u0002\u0002\u0245\u0243\u0003", + "\u0002\u0002\u0002\u0245\u0246\u0003\u0002\u0002\u0002\u0246\u0248\u0003", + "\u0002\u0002\u0002\u0247\u022f\u0003\u0002\u0002\u0002\u0247\u0236\u0003", + "\u0002\u0002\u0002\u0247\u0237\u0003\u0002\u0002\u0002\u0247\u023f\u0003", + "\u0002\u0002\u0002\u0248\u008e\u0003\u0002\u0002\u0002\u0249\u024d\t", + "\u0004\u0002\u0002\u024a\u024c\u0005\u009fP\u0002\u024b\u024a\u0003", + "\u0002\u0002\u0002\u024c\u024f\u0003\u0002\u0002\u0002\u024d\u024b\u0003", + "\u0002\u0002\u0002\u024d\u024e\u0003\u0002\u0002\u0002\u024e\u0252\u0003", + "\u0002\u0002\u0002\u024f\u024d\u0003\u0002\u0002\u0002\u0250\u0252\u0007", + "2\u0002\u0002\u0251\u0249\u0003\u0002\u0002\u0002\u0251\u0250\u0003", + "\u0002\u0002\u0002\u0251\u0252\u0003\u0002\u0002\u0002\u0252\u0253\u0003", + "\u0002\u0002\u0002\u0253\u0255\u00070\u0002\u0002\u0254\u0256\u0005", + "\u009fP\u0002\u0255\u0254\u0003\u0002\u0002\u0002\u0256\u0257\u0003", + "\u0002\u0002\u0002\u0257\u0255\u0003\u0002\u0002\u0002\u0257\u0258\u0003", + "\u0002\u0002\u0002\u0258\u0262\u0003\u0002\u0002\u0002\u0259\u025b\u0005", + "\u00a9U\u0002\u025a\u025c\t\u0006\u0002\u0002\u025b\u025a\u0003\u0002", + "\u0002\u0002\u025b\u025c\u0003\u0002\u0002\u0002\u025c\u025e\u0003\u0002", + "\u0002\u0002\u025d\u025f\u0005\u009fP\u0002\u025e\u025d\u0003\u0002", + "\u0002\u0002\u025f\u0260\u0003\u0002\u0002\u0002\u0260\u025e\u0003\u0002", + "\u0002\u0002\u0260\u0261\u0003\u0002\u0002\u0002\u0261\u0263\u0003\u0002", + "\u0002\u0002\u0262\u0259\u0003\u0002\u0002\u0002\u0262\u0263\u0003\u0002", + "\u0002\u0002\u0263\u0090\u0003\u0002\u0002\u0002\u0264\u0265\u0007B", + "\u0002\u0002\u0265\u0266\u0005\u008bF\u0002\u0266\u0092\u0003\u0002", + "\u0002\u0002\u0267\u026f\u0007)\u0002\u0002\u0268\u0269\u0007^\u0002", + "\u0002\u0269\u026e\u000b\u0002\u0002\u0002\u026a\u026b\u0007)\u0002", + "\u0002\u026b\u026e\u0007)\u0002\u0002\u026c\u026e\n\u0007\u0002\u0002", + "\u026d\u0268\u0003\u0002\u0002\u0002\u026d\u026a\u0003\u0002\u0002\u0002", + "\u026d\u026c\u0003\u0002\u0002\u0002\u026e\u0271\u0003\u0002\u0002\u0002", + "\u026f\u026d\u0003\u0002\u0002\u0002\u026f\u0270\u0003\u0002\u0002\u0002", + "\u0270\u0272\u0003\u0002\u0002\u0002\u0271\u026f\u0003\u0002\u0002\u0002", + "\u0272\u0280\u0007)\u0002\u0002\u0273\u027b\u0007$\u0002\u0002\u0274", + "\u0275\u0007^\u0002\u0002\u0275\u027a\u000b\u0002\u0002\u0002\u0276", + "\u0277\u0007$\u0002\u0002\u0277\u027a\u0007$\u0002\u0002\u0278\u027a", + "\n\b\u0002\u0002\u0279\u0274\u0003\u0002\u0002\u0002\u0279\u0276\u0003", + "\u0002\u0002\u0002\u0279\u0278\u0003\u0002\u0002\u0002\u027a\u027d\u0003", + "\u0002\u0002\u0002\u027b\u0279\u0003\u0002\u0002\u0002\u027b\u027c\u0003", + "\u0002\u0002\u0002\u027c\u027e\u0003\u0002\u0002\u0002\u027d\u027b\u0003", + "\u0002\u0002\u0002\u027e\u0280\u0007$\u0002\u0002\u027f\u0267\u0003", + "\u0002\u0002\u0002\u027f\u0273\u0003\u0002\u0002\u0002\u0280\u0094\u0003", + "\u0002\u0002\u0002\u0281\u0282\u00071\u0002\u0002\u0282\u0283\u0007", + "1\u0002\u0002\u0283\u0287\u0003\u0002\u0002\u0002\u0284\u0286\n\t\u0002", + "\u0002\u0285\u0284\u0003\u0002\u0002\u0002\u0286\u0289\u0003\u0002\u0002", + "\u0002\u0287\u0285\u0003\u0002\u0002\u0002\u0287\u0288\u0003\u0002\u0002", + "\u0002\u0288\u028f\u0003\u0002\u0002\u0002\u0289\u0287\u0003\u0002\u0002", + "\u0002\u028a\u028c\u0007\u000f\u0002\u0002\u028b\u028a\u0003\u0002\u0002", + "\u0002\u028b\u028c\u0003\u0002\u0002\u0002\u028c\u028d\u0003\u0002\u0002", + "\u0002\u028d\u0290\u0007\f\u0002\u0002\u028e\u0290\u0007\u0002\u0002", + "\u0003\u028f\u028b\u0003\u0002\u0002\u0002\u028f\u028e\u0003\u0002\u0002", + "\u0002\u0290\u0291\u0003\u0002\u0002\u0002\u0291\u0292\bK\u0002\u0002", + "\u0292\u0096\u0003\u0002\u0002\u0002\u0293\u0294\u00071\u0002\u0002", + "\u0294\u0295\u0007,\u0002\u0002\u0295\u0299\u0003\u0002\u0002\u0002", + "\u0296\u0298\u000b\u0002\u0002\u0002\u0297\u0296\u0003\u0002\u0002\u0002", + "\u0298\u029b\u0003\u0002\u0002\u0002\u0299\u029a\u0003\u0002\u0002\u0002", + "\u0299\u0297\u0003\u0002\u0002\u0002\u029a\u029c\u0003\u0002\u0002\u0002", + "\u029b\u0299\u0003\u0002\u0002\u0002\u029c\u029d\u0007,\u0002\u0002", + "\u029d\u029e\u00071\u0002\u0002\u029e\u029f\u0003\u0002\u0002\u0002", + "\u029f\u02a0\bL\u0002\u0002\u02a0\u0098\u0003\u0002\u0002\u0002\u02a1", + "\u02a2\t\n\u0002\u0002\u02a2\u02a3\u0003\u0002\u0002\u0002\u02a3\u02a4", + "\bM\u0002\u0002\u02a4\u009a\u0003\u0002\u0002\u0002\u02a5\u02a6\u000b", + "\u0002\u0002\u0002\u02a6\u009c\u0003\u0002\u0002\u0002\u02a7\u02a8\t", + "\u000b\u0002\u0002\u02a8\u009e\u0003\u0002\u0002\u0002\u02a9\u02aa\t", + "\f\u0002\u0002\u02aa\u00a0\u0003\u0002\u0002\u0002\u02ab\u02ac\t\r\u0002", + "\u0002\u02ac\u00a2\u0003\u0002\u0002\u0002\u02ad\u02ae\t\u000e\u0002", + "\u0002\u02ae\u00a4\u0003\u0002\u0002\u0002\u02af\u02b0\t\u000f\u0002", + "\u0002\u02b0\u00a6\u0003\u0002\u0002\u0002\u02b1\u02b2\t\u0010\u0002", + "\u0002\u02b2\u00a8\u0003\u0002\u0002\u0002\u02b3\u02b4\t\u0011\u0002", + "\u0002\u02b4\u00aa\u0003\u0002\u0002\u0002\u02b5\u02b6\t\u0012\u0002", + "\u0002\u02b6\u00ac\u0003\u0002\u0002\u0002\u02b7\u02b8\t\u0013\u0002", + "\u0002\u02b8\u00ae\u0003\u0002\u0002\u0002\u02b9\u02ba\t\u0014\u0002", + "\u0002\u02ba\u00b0\u0003\u0002\u0002\u0002\u02bb\u02bc\t\u0015\u0002", + "\u0002\u02bc\u00b2\u0003\u0002\u0002\u0002\u02bd\u02be\t\u0016\u0002", + "\u0002\u02be\u00b4\u0003\u0002\u0002\u0002\u02bf\u02c0\t\u0017\u0002", + "\u0002\u02c0\u00b6\u0003\u0002\u0002\u0002\u02c1\u02c2\t\u0018\u0002", + "\u0002\u02c2\u00b8\u0003\u0002\u0002\u0002\u02c3\u02c4\t\u0019\u0002", + "\u0002\u02c4\u00ba\u0003\u0002\u0002\u0002\u02c5\u02c6\t\u001a\u0002", + "\u0002\u02c6\u00bc\u0003\u0002\u0002\u0002\u02c7\u02c8\t\u001b\u0002", + "\u0002\u02c8\u00be\u0003\u0002\u0002\u0002\u02c9\u02ca\t\u001c\u0002", + "\u0002\u02ca\u00c0\u0003\u0002\u0002\u0002\u02cb\u02cc\t\u001d\u0002", + "\u0002\u02cc\u00c2\u0003\u0002\u0002\u0002\u02cd\u02ce\t\u001e\u0002", + "\u0002\u02ce\u00c4\u0003\u0002\u0002\u0002\u02cf\u02d0\t\u001f\u0002", + "\u0002\u02d0\u00c6\u0003\u0002\u0002\u0002\u02d1\u02d2\t \u0002\u0002", + "\u02d2\u00c8\u0003\u0002\u0002\u0002\u02d3\u02d4\t!\u0002\u0002\u02d4", + "\u00ca\u0003\u0002\u0002\u0002\u02d5\u02d6\t\"\u0002\u0002\u02d6\u00cc", + "\u0003\u0002\u0002\u0002\u02d7\u02d8\t#\u0002\u0002\u02d8\u00ce\u0003", + "\u0002\u0002\u0002\u02d9\u02da\t$\u0002\u0002\u02da\u00d0\u0003\u0002", + "\u0002\u0002\u02db\u02dc\t%\u0002\u0002\u02dc\u00d2\u0003\u0002\u0002", + "\u0002\u02dd\u02de\t&\u0002\u0002\u02de\u00d4\u0003\u0002\u0002\u0002", + "\u02df\u02e0\u000b\u0002\u0002\u0002\u02e0\u02e1\u0003\u0002\u0002\u0002", + "\u02e1\u02e2\bk\u0003\u0002\u02e2\u00d6\u0003\u0002\u0002\u0002\u001a", + "\u0002\u0125\u019d\u01a9\u022c\u0233\u023d\u0245\u0247\u024d\u0251\u0257", + "\u025b\u0260\u0262\u026d\u026f\u0279\u027b\u027f\u0287\u028b\u028f\u0299", + "\u0004\u0002\u0003\u0002\u0002\u0004\u0002"].join(""); + + +const atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN); + +const decisionsToDFA = atn.decisionToState.map( (ds, index) => new antlr4.dfa.DFA(ds, index) ); + +export default class CAQLLexer extends antlr4.Lexer { + + static grammarFileName = "CAQLLexer.g4"; + static channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN", "ERRORCHANNEL" ]; + static modeNames = [ "DEFAULT_MODE" ]; + static literalNames = [ null, "'.'", "'=~'", "'!~'", "'=='", "'!='", "'<'", + "'>'", "'<='", "'>='", "'+'", "'-'", "'*'", "'/'", + "'%'", "'?'", "':'", "'::'", "'..'", "','", "'('", + "')'", "'{'", "'}'", "'['", "']'" ]; + static symbolicNames = [ null, "DOT", "T_REGEX_MATCH", "T_REGEX_NON_MATCH", + "T_EQ", "T_NE", "T_LT", "T_GT", "T_LE", "T_GE", + "T_PLUS", "T_MINUS", "T_TIMES", "T_DIV", "T_MOD", + "T_QUESTION", "T_COLON", "T_SCOPE", "T_RANGE", + "T_COMMA", "T_OPEN", "T_CLOSE", "T_OBJECT_OPEN", + "T_OBJECT_CLOSE", "T_ARRAY_OPEN", "T_ARRAY_CLOSE", + "T_AGGREGATE", "T_ALL", "T_AND", "T_ANY", "T_ASC", + "T_COLLECT", "T_DESC", "T_DISTINCT", "T_FALSE", + "T_FILTER", "T_FOR", "T_GRAPH", "T_IN", "T_INBOUND", + "T_INSERT", "T_INTO", "T_K_SHORTEST_PATHS", "T_LET", + "T_LIKE", "T_LIMIT", "T_NONE", "T_NOT", "T_NULL", + "T_OR", "T_OUTBOUND", "T_REMOVE", "T_REPLACE", + "T_RETURN", "T_SHORTEST_PATH", "T_SORT", "T_TRUE", + "T_UPDATE", "T_UPSERT", "T_WITH", "T_KEEP", "T_COUNT", + "T_OPTIONS", "T_PRUNE", "T_SEARCH", "T_TO", "T_CURRENT", + "T_NEW", "T_OLD", "T_STRING", "T_INT", "T_FLOAT", + "T_PARAMETER", "T_QUOTED_STRING", "SINGLE_LINE_COMMENT", + "MULTILINE_COMMENT", "SPACES", "UNEXPECTED_CHAR", + "ERROR_RECONGNIGION" ]; + static ruleNames = [ "DOT", "T_REGEX_MATCH", "T_REGEX_NON_MATCH", "T_EQ", + "T_NE", "T_LT", "T_GT", "T_LE", "T_GE", "T_PLUS", + "T_MINUS", "T_TIMES", "T_DIV", "T_MOD", "T_QUESTION", + "T_COLON", "T_SCOPE", "T_RANGE", "T_COMMA", "T_OPEN", + "T_CLOSE", "T_OBJECT_OPEN", "T_OBJECT_CLOSE", "T_ARRAY_OPEN", + "T_ARRAY_CLOSE", "T_AGGREGATE", "T_ALL", "T_AND", + "T_ANY", "T_ASC", "T_COLLECT", "T_DESC", "T_DISTINCT", + "T_FALSE", "T_FILTER", "T_FOR", "T_GRAPH", "T_IN", + "T_INBOUND", "T_INSERT", "T_INTO", "T_K_SHORTEST_PATHS", + "T_LET", "T_LIKE", "T_LIMIT", "T_NONE", "T_NOT", "T_NULL", + "T_OR", "T_OUTBOUND", "T_REMOVE", "T_REPLACE", "T_RETURN", + "T_SHORTEST_PATH", "T_SORT", "T_TRUE", "T_UPDATE", + "T_UPSERT", "T_WITH", "T_KEEP", "T_COUNT", "T_OPTIONS", + "T_PRUNE", "T_SEARCH", "T_TO", "T_CURRENT", "T_NEW", + "T_OLD", "T_STRING", "T_INT", "T_FLOAT", "T_PARAMETER", + "T_QUOTED_STRING", "SINGLE_LINE_COMMENT", "MULTILINE_COMMENT", + "SPACES", "UNEXPECTED_CHAR", "HEX_DIGIT", "DIGIT", + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", + "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", + "U", "V", "W", "X", "Y", "Z", "ERROR_RECONGNIGION" ]; + + constructor(input) { + super(input) + this._interp = new antlr4.atn.LexerATNSimulator(this, atn, decisionsToDFA, new antlr4.PredictionContextCache()); + } + + get atn() { + return atn; + } +} + +CAQLLexer.EOF = antlr4.Token.EOF; +CAQLLexer.DOT = 1; +CAQLLexer.T_REGEX_MATCH = 2; +CAQLLexer.T_REGEX_NON_MATCH = 3; +CAQLLexer.T_EQ = 4; +CAQLLexer.T_NE = 5; +CAQLLexer.T_LT = 6; +CAQLLexer.T_GT = 7; +CAQLLexer.T_LE = 8; +CAQLLexer.T_GE = 9; +CAQLLexer.T_PLUS = 10; +CAQLLexer.T_MINUS = 11; +CAQLLexer.T_TIMES = 12; +CAQLLexer.T_DIV = 13; +CAQLLexer.T_MOD = 14; +CAQLLexer.T_QUESTION = 15; +CAQLLexer.T_COLON = 16; +CAQLLexer.T_SCOPE = 17; +CAQLLexer.T_RANGE = 18; +CAQLLexer.T_COMMA = 19; +CAQLLexer.T_OPEN = 20; +CAQLLexer.T_CLOSE = 21; +CAQLLexer.T_OBJECT_OPEN = 22; +CAQLLexer.T_OBJECT_CLOSE = 23; +CAQLLexer.T_ARRAY_OPEN = 24; +CAQLLexer.T_ARRAY_CLOSE = 25; +CAQLLexer.T_AGGREGATE = 26; +CAQLLexer.T_ALL = 27; +CAQLLexer.T_AND = 28; +CAQLLexer.T_ANY = 29; +CAQLLexer.T_ASC = 30; +CAQLLexer.T_COLLECT = 31; +CAQLLexer.T_DESC = 32; +CAQLLexer.T_DISTINCT = 33; +CAQLLexer.T_FALSE = 34; +CAQLLexer.T_FILTER = 35; +CAQLLexer.T_FOR = 36; +CAQLLexer.T_GRAPH = 37; +CAQLLexer.T_IN = 38; +CAQLLexer.T_INBOUND = 39; +CAQLLexer.T_INSERT = 40; +CAQLLexer.T_INTO = 41; +CAQLLexer.T_K_SHORTEST_PATHS = 42; +CAQLLexer.T_LET = 43; +CAQLLexer.T_LIKE = 44; +CAQLLexer.T_LIMIT = 45; +CAQLLexer.T_NONE = 46; +CAQLLexer.T_NOT = 47; +CAQLLexer.T_NULL = 48; +CAQLLexer.T_OR = 49; +CAQLLexer.T_OUTBOUND = 50; +CAQLLexer.T_REMOVE = 51; +CAQLLexer.T_REPLACE = 52; +CAQLLexer.T_RETURN = 53; +CAQLLexer.T_SHORTEST_PATH = 54; +CAQLLexer.T_SORT = 55; +CAQLLexer.T_TRUE = 56; +CAQLLexer.T_UPDATE = 57; +CAQLLexer.T_UPSERT = 58; +CAQLLexer.T_WITH = 59; +CAQLLexer.T_KEEP = 60; +CAQLLexer.T_COUNT = 61; +CAQLLexer.T_OPTIONS = 62; +CAQLLexer.T_PRUNE = 63; +CAQLLexer.T_SEARCH = 64; +CAQLLexer.T_TO = 65; +CAQLLexer.T_CURRENT = 66; +CAQLLexer.T_NEW = 67; +CAQLLexer.T_OLD = 68; +CAQLLexer.T_STRING = 69; +CAQLLexer.T_INT = 70; +CAQLLexer.T_FLOAT = 71; +CAQLLexer.T_PARAMETER = 72; +CAQLLexer.T_QUOTED_STRING = 73; +CAQLLexer.SINGLE_LINE_COMMENT = 74; +CAQLLexer.MULTILINE_COMMENT = 75; +CAQLLexer.SPACES = 76; +CAQLLexer.UNEXPECTED_CHAR = 77; +CAQLLexer.ERROR_RECONGNIGION = 78; + +CAQLLexer.ERRORCHANNEL = 2; + + + diff --git a/ui/src/suggestions/grammar/RQLLexer.tokens b/ui/src/suggestions/grammar/RQLLexer.tokens new file mode 100644 index 0000000..7bdaf61 --- /dev/null +++ b/ui/src/suggestions/grammar/RQLLexer.tokens @@ -0,0 +1,103 @@ +DOT=1 +T_REGEX_MATCH=2 +T_REGEX_NON_MATCH=3 +T_EQ=4 +T_NE=5 +T_LT=6 +T_GT=7 +T_LE=8 +T_GE=9 +T_PLUS=10 +T_MINUS=11 +T_TIMES=12 +T_DIV=13 +T_MOD=14 +T_QUESTION=15 +T_COLON=16 +T_SCOPE=17 +T_RANGE=18 +T_COMMA=19 +T_OPEN=20 +T_CLOSE=21 +T_OBJECT_OPEN=22 +T_OBJECT_CLOSE=23 +T_ARRAY_OPEN=24 +T_ARRAY_CLOSE=25 +T_AGGREGATE=26 +T_ALL=27 +T_AND=28 +T_ANY=29 +T_ASC=30 +T_COLLECT=31 +T_DESC=32 +T_DISTINCT=33 +T_FALSE=34 +T_FILTER=35 +T_FOR=36 +T_GRAPH=37 +T_IN=38 +T_INBOUND=39 +T_INSERT=40 +T_INTO=41 +T_K_SHORTEST_PATHS=42 +T_LET=43 +T_LIKE=44 +T_LIMIT=45 +T_NONE=46 +T_NOT=47 +T_NULL=48 +T_OR=49 +T_OUTBOUND=50 +T_REMOVE=51 +T_REPLACE=52 +T_RETURN=53 +T_SHORTEST_PATH=54 +T_SORT=55 +T_TRUE=56 +T_UPDATE=57 +T_UPSERT=58 +T_WITH=59 +T_KEEP=60 +T_COUNT=61 +T_OPTIONS=62 +T_PRUNE=63 +T_SEARCH=64 +T_TO=65 +T_CURRENT=66 +T_NEW=67 +T_OLD=68 +T_STRING=69 +T_INT=70 +T_FLOAT=71 +T_PARAMETER=72 +T_QUOTED_STRING=73 +SINGLE_LINE_COMMENT=74 +MULTILINE_COMMENT=75 +SPACES=76 +UNEXPECTED_CHAR=77 +ERROR_RECONGNIGION=78 +'.'=1 +'=~'=2 +'!~'=3 +'=='=4 +'!='=5 +'<'=6 +'>'=7 +'<='=8 +'>='=9 +'+'=10 +'-'=11 +'*'=12 +'/'=13 +'%'=14 +'?'=15 +':'=16 +'::'=17 +'..'=18 +','=19 +'('=20 +')'=21 +'{'=22 +'}'=23 +'['=24 +']'=25 diff --git a/ui/src/suggestions/grammar/RQLParser.interp b/ui/src/suggestions/grammar/RQLParser.interp new file mode 100644 index 0000000..8abde5b --- /dev/null +++ b/ui/src/suggestions/grammar/RQLParser.interp @@ -0,0 +1,178 @@ +token literal names: +null +'.' +'=~' +'!~' +'==' +'!=' +'<' +'>' +'<=' +'>=' +'+' +'-' +'*' +'/' +'%' +'?' +':' +'::' +'..' +',' +'(' +')' +'{' +'}' +'[' +']' +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null + +token symbolic names: +null +DOT +T_REGEX_MATCH +T_REGEX_NON_MATCH +T_EQ +T_NE +T_LT +T_GT +T_LE +T_GE +T_PLUS +T_MINUS +T_TIMES +T_DIV +T_MOD +T_QUESTION +T_COLON +T_SCOPE +T_RANGE +T_COMMA +T_OPEN +T_CLOSE +T_OBJECT_OPEN +T_OBJECT_CLOSE +T_ARRAY_OPEN +T_ARRAY_CLOSE +T_AGGREGATE +T_ALL +T_AND +T_ANY +T_ASC +T_COLLECT +T_DESC +T_DISTINCT +T_FALSE +T_FILTER +T_FOR +T_GRAPH +T_IN +T_INBOUND +T_INSERT +T_INTO +T_K_SHORTEST_PATHS +T_LET +T_LIKE +T_LIMIT +T_NONE +T_NOT +T_NULL +T_OR +T_OUTBOUND +T_REMOVE +T_REPLACE +T_RETURN +T_SHORTEST_PATH +T_SORT +T_TRUE +T_UPDATE +T_UPSERT +T_WITH +T_KEEP +T_COUNT +T_OPTIONS +T_PRUNE +T_SEARCH +T_TO +T_CURRENT +T_NEW +T_OLD +T_STRING +T_INT +T_FLOAT +T_PARAMETER +T_QUOTED_STRING +SINGLE_LINE_COMMENT +MULTILINE_COMMENT +SPACES +UNEXPECTED_CHAR +ERROR_RECONGNIGION + +rule names: +parse +expression +operator_unary +reference +compound_value +function_call +value_literal +array +object +object_element +object_element_name + + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 80, 192, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 32, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 48, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 66, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 86, 10, 3, 12, 3, 14, 3, 89, 11, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 97, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 107, 10, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 7, 5, 117, 10, 5, 12, 5, 14, 5, 120, 11, 5, 3, 6, 3, 6, 5, 6, 124, 10, 6, 3, 7, 3, 7, 3, 7, 5, 7, 129, 10, 7, 3, 7, 3, 7, 7, 7, 133, 10, 7, 12, 7, 14, 7, 136, 11, 7, 3, 7, 5, 7, 139, 10, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 5, 9, 147, 10, 9, 3, 9, 3, 9, 7, 9, 151, 10, 9, 12, 9, 14, 9, 154, 11, 9, 3, 9, 5, 9, 157, 10, 9, 3, 9, 3, 9, 3, 10, 3, 10, 5, 10, 163, 10, 10, 3, 10, 3, 10, 7, 10, 167, 10, 10, 12, 10, 14, 10, 170, 11, 10, 3, 10, 5, 10, 173, 10, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 188, 10, 11, 3, 12, 3, 12, 3, 12, 4, 134, 152, 4, 4, 8, 13, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 2, 11, 3, 2, 12, 13, 3, 2, 14, 16, 3, 2, 8, 11, 3, 2, 6, 7, 5, 2, 29, 29, 31, 31, 48, 48, 4, 2, 6, 11, 40, 40, 4, 2, 4, 5, 46, 46, 7, 2, 36, 36, 50, 50, 58, 58, 72, 73, 75, 75, 4, 2, 71, 71, 75, 75, 2, 216, 2, 24, 3, 2, 2, 2, 4, 31, 3, 2, 2, 2, 6, 96, 3, 2, 2, 2, 8, 106, 3, 2, 2, 2, 10, 123, 3, 2, 2, 2, 12, 125, 3, 2, 2, 2, 14, 142, 3, 2, 2, 2, 16, 144, 3, 2, 2, 2, 18, 160, 3, 2, 2, 2, 20, 187, 3, 2, 2, 2, 22, 189, 3, 2, 2, 2, 24, 25, 5, 4, 3, 2, 25, 26, 7, 2, 2, 3, 26, 3, 3, 2, 2, 2, 27, 28, 8, 3, 1, 2, 28, 32, 5, 14, 8, 2, 29, 32, 5, 8, 5, 2, 30, 32, 5, 6, 4, 2, 31, 27, 3, 2, 2, 2, 31, 29, 3, 2, 2, 2, 31, 30, 3, 2, 2, 2, 32, 87, 3, 2, 2, 2, 33, 34, 12, 15, 2, 2, 34, 35, 9, 2, 2, 2, 35, 86, 5, 4, 3, 16, 36, 37, 12, 14, 2, 2, 37, 38, 9, 3, 2, 2, 38, 86, 5, 4, 3, 15, 39, 40, 12, 13, 2, 2, 40, 41, 7, 20, 2, 2, 41, 86, 5, 4, 3, 14, 42, 43, 12, 12, 2, 2, 43, 44, 9, 4, 2, 2, 44, 86, 5, 4, 3, 13, 45, 47, 12, 11, 2, 2, 46, 48, 7, 49, 2, 2, 47, 46, 3, 2, 2, 2, 47, 48, 3, 2, 2, 2, 48, 49, 3, 2, 2, 2, 49, 50, 7, 40, 2, 2, 50, 86, 5, 4, 3, 12, 51, 52, 12, 10, 2, 2, 52, 53, 9, 5, 2, 2, 53, 86, 5, 4, 3, 11, 54, 55, 12, 9, 2, 2, 55, 56, 9, 6, 2, 2, 56, 57, 9, 7, 2, 2, 57, 86, 5, 4, 3, 10, 58, 59, 12, 8, 2, 2, 59, 60, 9, 6, 2, 2, 60, 61, 7, 49, 2, 2, 61, 62, 7, 40, 2, 2, 62, 86, 5, 4, 3, 9, 63, 65, 12, 7, 2, 2, 64, 66, 7, 49, 2, 2, 65, 64, 3, 2, 2, 2, 65, 66, 3, 2, 2, 2, 66, 67, 3, 2, 2, 2, 67, 68, 9, 8, 2, 2, 68, 86, 5, 4, 3, 8, 69, 70, 12, 6, 2, 2, 70, 71, 7, 30, 2, 2, 71, 86, 5, 4, 3, 7, 72, 73, 12, 5, 2, 2, 73, 74, 7, 51, 2, 2, 74, 86, 5, 4, 3, 6, 75, 76, 12, 4, 2, 2, 76, 77, 7, 17, 2, 2, 77, 78, 5, 4, 3, 2, 78, 79, 7, 18, 2, 2, 79, 80, 5, 4, 3, 5, 80, 86, 3, 2, 2, 2, 81, 82, 12, 3, 2, 2, 82, 83, 7, 17, 2, 2, 83, 84, 7, 18, 2, 2, 84, 86, 5, 4, 3, 4, 85, 33, 3, 2, 2, 2, 85, 36, 3, 2, 2, 2, 85, 39, 3, 2, 2, 2, 85, 42, 3, 2, 2, 2, 85, 45, 3, 2, 2, 2, 85, 51, 3, 2, 2, 2, 85, 54, 3, 2, 2, 2, 85, 58, 3, 2, 2, 2, 85, 63, 3, 2, 2, 2, 85, 69, 3, 2, 2, 2, 85, 72, 3, 2, 2, 2, 85, 75, 3, 2, 2, 2, 85, 81, 3, 2, 2, 2, 86, 89, 3, 2, 2, 2, 87, 85, 3, 2, 2, 2, 87, 88, 3, 2, 2, 2, 88, 5, 3, 2, 2, 2, 89, 87, 3, 2, 2, 2, 90, 91, 7, 12, 2, 2, 91, 97, 5, 4, 3, 2, 92, 93, 7, 13, 2, 2, 93, 97, 5, 4, 3, 2, 94, 95, 7, 49, 2, 2, 95, 97, 5, 4, 3, 2, 96, 90, 3, 2, 2, 2, 96, 92, 3, 2, 2, 2, 96, 94, 3, 2, 2, 2, 97, 7, 3, 2, 2, 2, 98, 99, 8, 5, 1, 2, 99, 107, 7, 71, 2, 2, 100, 107, 5, 10, 6, 2, 101, 107, 5, 12, 7, 2, 102, 103, 7, 22, 2, 2, 103, 104, 5, 4, 3, 2, 104, 105, 7, 23, 2, 2, 105, 107, 3, 2, 2, 2, 106, 98, 3, 2, 2, 2, 106, 100, 3, 2, 2, 2, 106, 101, 3, 2, 2, 2, 106, 102, 3, 2, 2, 2, 107, 118, 3, 2, 2, 2, 108, 109, 12, 4, 2, 2, 109, 110, 7, 3, 2, 2, 110, 117, 7, 71, 2, 2, 111, 112, 12, 3, 2, 2, 112, 113, 7, 26, 2, 2, 113, 114, 5, 4, 3, 2, 114, 115, 7, 27, 2, 2, 115, 117, 3, 2, 2, 2, 116, 108, 3, 2, 2, 2, 116, 111, 3, 2, 2, 2, 117, 120, 3, 2, 2, 2, 118, 116, 3, 2, 2, 2, 118, 119, 3, 2, 2, 2, 119, 9, 3, 2, 2, 2, 120, 118, 3, 2, 2, 2, 121, 124, 5, 16, 9, 2, 122, 124, 5, 18, 10, 2, 123, 121, 3, 2, 2, 2, 123, 122, 3, 2, 2, 2, 124, 11, 3, 2, 2, 2, 125, 126, 7, 71, 2, 2, 126, 128, 7, 22, 2, 2, 127, 129, 5, 4, 3, 2, 128, 127, 3, 2, 2, 2, 128, 129, 3, 2, 2, 2, 129, 134, 3, 2, 2, 2, 130, 131, 7, 21, 2, 2, 131, 133, 5, 4, 3, 2, 132, 130, 3, 2, 2, 2, 133, 136, 3, 2, 2, 2, 134, 135, 3, 2, 2, 2, 134, 132, 3, 2, 2, 2, 135, 138, 3, 2, 2, 2, 136, 134, 3, 2, 2, 2, 137, 139, 7, 21, 2, 2, 138, 137, 3, 2, 2, 2, 138, 139, 3, 2, 2, 2, 139, 140, 3, 2, 2, 2, 140, 141, 7, 23, 2, 2, 141, 13, 3, 2, 2, 2, 142, 143, 9, 9, 2, 2, 143, 15, 3, 2, 2, 2, 144, 146, 7, 26, 2, 2, 145, 147, 5, 4, 3, 2, 146, 145, 3, 2, 2, 2, 146, 147, 3, 2, 2, 2, 147, 152, 3, 2, 2, 2, 148, 149, 7, 21, 2, 2, 149, 151, 5, 4, 3, 2, 150, 148, 3, 2, 2, 2, 151, 154, 3, 2, 2, 2, 152, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 156, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 155, 157, 7, 21, 2, 2, 156, 155, 3, 2, 2, 2, 156, 157, 3, 2, 2, 2, 157, 158, 3, 2, 2, 2, 158, 159, 7, 27, 2, 2, 159, 17, 3, 2, 2, 2, 160, 162, 7, 24, 2, 2, 161, 163, 5, 20, 11, 2, 162, 161, 3, 2, 2, 2, 162, 163, 3, 2, 2, 2, 163, 168, 3, 2, 2, 2, 164, 165, 7, 21, 2, 2, 165, 167, 5, 20, 11, 2, 166, 164, 3, 2, 2, 2, 167, 170, 3, 2, 2, 2, 168, 166, 3, 2, 2, 2, 168, 169, 3, 2, 2, 2, 169, 172, 3, 2, 2, 2, 170, 168, 3, 2, 2, 2, 171, 173, 7, 21, 2, 2, 172, 171, 3, 2, 2, 2, 172, 173, 3, 2, 2, 2, 173, 174, 3, 2, 2, 2, 174, 175, 7, 25, 2, 2, 175, 19, 3, 2, 2, 2, 176, 188, 7, 71, 2, 2, 177, 178, 5, 22, 12, 2, 178, 179, 7, 18, 2, 2, 179, 180, 5, 4, 3, 2, 180, 188, 3, 2, 2, 2, 181, 182, 7, 26, 2, 2, 182, 183, 5, 4, 3, 2, 183, 184, 7, 27, 2, 2, 184, 185, 7, 18, 2, 2, 185, 186, 5, 4, 3, 2, 186, 188, 3, 2, 2, 2, 187, 176, 3, 2, 2, 2, 187, 177, 3, 2, 2, 2, 187, 181, 3, 2, 2, 2, 188, 21, 3, 2, 2, 2, 189, 190, 9, 10, 2, 2, 190, 23, 3, 2, 2, 2, 22, 31, 47, 65, 85, 87, 96, 106, 116, 118, 123, 128, 134, 138, 146, 152, 156, 162, 168, 172, 187] \ No newline at end of file diff --git a/ui/src/suggestions/grammar/RQLParser.js b/ui/src/suggestions/grammar/RQLParser.js new file mode 100644 index 0000000..fc295fe --- /dev/null +++ b/ui/src/suggestions/grammar/RQLParser.js @@ -0,0 +1,1866 @@ +// Generated from CAQLParser.g4 by ANTLR 4.9.2 +// jshint ignore: start +import antlr4 from 'antlr4'; +import CAQLParserListener from './CAQLParserListener.js'; + +const serializedATN = ["\u0003\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786", + "\u5964\u0003P\u00c0\u0004\u0002\t\u0002\u0004\u0003\t\u0003\u0004\u0004", + "\t\u0004\u0004\u0005\t\u0005\u0004\u0006\t\u0006\u0004\u0007\t\u0007", + "\u0004\b\t\b\u0004\t\t\t\u0004\n\t\n\u0004\u000b\t\u000b\u0004\f\t\f", + "\u0003\u0002\u0003\u0002\u0003\u0002\u0003\u0003\u0003\u0003\u0003\u0003", + "\u0003\u0003\u0005\u0003 \n\u0003\u0003\u0003\u0003\u0003\u0003\u0003", + "\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003", + "\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0005\u0003", + "0\n\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003", + "\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003", + "\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0005\u0003", + "B\n\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003", + "\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003", + "\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003", + "\u0003\u0003\u0007\u0003V\n\u0003\f\u0003\u000e\u0003Y\u000b\u0003\u0003", + "\u0004\u0003\u0004\u0003\u0004\u0003\u0004\u0003\u0004\u0003\u0004\u0005", + "\u0004a\n\u0004\u0003\u0005\u0003\u0005\u0003\u0005\u0003\u0005\u0003", + "\u0005\u0003\u0005\u0003\u0005\u0003\u0005\u0005\u0005k\n\u0005\u0003", + "\u0005\u0003\u0005\u0003\u0005\u0003\u0005\u0003\u0005\u0003\u0005\u0003", + "\u0005\u0003\u0005\u0007\u0005u\n\u0005\f\u0005\u000e\u0005x\u000b\u0005", + "\u0003\u0006\u0003\u0006\u0005\u0006|\n\u0006\u0003\u0007\u0003\u0007", + "\u0003\u0007\u0005\u0007\u0081\n\u0007\u0003\u0007\u0003\u0007\u0007", + "\u0007\u0085\n\u0007\f\u0007\u000e\u0007\u0088\u000b\u0007\u0003\u0007", + "\u0005\u0007\u008b\n\u0007\u0003\u0007\u0003\u0007\u0003\b\u0003\b\u0003", + "\t\u0003\t\u0005\t\u0093\n\t\u0003\t\u0003\t\u0007\t\u0097\n\t\f\t\u000e", + "\t\u009a\u000b\t\u0003\t\u0005\t\u009d\n\t\u0003\t\u0003\t\u0003\n\u0003", + "\n\u0005\n\u00a3\n\n\u0003\n\u0003\n\u0007\n\u00a7\n\n\f\n\u000e\n\u00aa", + "\u000b\n\u0003\n\u0005\n\u00ad\n\n\u0003\n\u0003\n\u0003\u000b\u0003", + "\u000b\u0003\u000b\u0003\u000b\u0003\u000b\u0003\u000b\u0003\u000b\u0003", + "\u000b\u0003\u000b\u0003\u000b\u0003\u000b\u0005\u000b\u00bc\n\u000b", + "\u0003\f\u0003\f\u0003\f\u0004\u0086\u0098\u0004\u0004\b\r\u0002\u0004", + "\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0002\u000b\u0003\u0002\f", + "\r\u0003\u0002\u000e\u0010\u0003\u0002\b\u000b\u0003\u0002\u0006\u0007", + "\u0005\u0002\u001d\u001d\u001f\u001f00\u0004\u0002\u0006\u000b((\u0004", + "\u0002\u0004\u0005..\u0007\u0002$$22::HIKK\u0004\u0002GGKK\u0002\u00d8", + "\u0002\u0018\u0003\u0002\u0002\u0002\u0004\u001f\u0003\u0002\u0002\u0002", + "\u0006`\u0003\u0002\u0002\u0002\bj\u0003\u0002\u0002\u0002\n{\u0003", + "\u0002\u0002\u0002\f}\u0003\u0002\u0002\u0002\u000e\u008e\u0003\u0002", + "\u0002\u0002\u0010\u0090\u0003\u0002\u0002\u0002\u0012\u00a0\u0003\u0002", + "\u0002\u0002\u0014\u00bb\u0003\u0002\u0002\u0002\u0016\u00bd\u0003\u0002", + "\u0002\u0002\u0018\u0019\u0005\u0004\u0003\u0002\u0019\u001a\u0007\u0002", + "\u0002\u0003\u001a\u0003\u0003\u0002\u0002\u0002\u001b\u001c\b\u0003", + "\u0001\u0002\u001c \u0005\u000e\b\u0002\u001d \u0005\b\u0005\u0002\u001e", + " \u0005\u0006\u0004\u0002\u001f\u001b\u0003\u0002\u0002\u0002\u001f", + "\u001d\u0003\u0002\u0002\u0002\u001f\u001e\u0003\u0002\u0002\u0002 ", + "W\u0003\u0002\u0002\u0002!\"\f\u000f\u0002\u0002\"#\t\u0002\u0002\u0002", + "#V\u0005\u0004\u0003\u0010$%\f\u000e\u0002\u0002%&\t\u0003\u0002\u0002", + "&V\u0005\u0004\u0003\u000f\'(\f\r\u0002\u0002()\u0007\u0014\u0002\u0002", + ")V\u0005\u0004\u0003\u000e*+\f\f\u0002\u0002+,\t\u0004\u0002\u0002,", + "V\u0005\u0004\u0003\r-/\f\u000b\u0002\u0002.0\u00071\u0002\u0002/.\u0003", + "\u0002\u0002\u0002/0\u0003\u0002\u0002\u000201\u0003\u0002\u0002\u0002", + "12\u0007(\u0002\u00022V\u0005\u0004\u0003\f34\f\n\u0002\u000245\t\u0005", + "\u0002\u00025V\u0005\u0004\u0003\u000b67\f\t\u0002\u000278\t\u0006\u0002", + "\u000289\t\u0007\u0002\u00029V\u0005\u0004\u0003\n:;\f\b\u0002\u0002", + ";<\t\u0006\u0002\u0002<=\u00071\u0002\u0002=>\u0007(\u0002\u0002>V\u0005", + "\u0004\u0003\t?A\f\u0007\u0002\u0002@B\u00071\u0002\u0002A@\u0003\u0002", + "\u0002\u0002AB\u0003\u0002\u0002\u0002BC\u0003\u0002\u0002\u0002CD\t", + "\b\u0002\u0002DV\u0005\u0004\u0003\bEF\f\u0006\u0002\u0002FG\u0007\u001e", + "\u0002\u0002GV\u0005\u0004\u0003\u0007HI\f\u0005\u0002\u0002IJ\u0007", + "3\u0002\u0002JV\u0005\u0004\u0003\u0006KL\f\u0004\u0002\u0002LM\u0007", + "\u0011\u0002\u0002MN\u0005\u0004\u0003\u0002NO\u0007\u0012\u0002\u0002", + "OP\u0005\u0004\u0003\u0005PV\u0003\u0002\u0002\u0002QR\f\u0003\u0002", + "\u0002RS\u0007\u0011\u0002\u0002ST\u0007\u0012\u0002\u0002TV\u0005\u0004", + "\u0003\u0004U!\u0003\u0002\u0002\u0002U$\u0003\u0002\u0002\u0002U\'", + "\u0003\u0002\u0002\u0002U*\u0003\u0002\u0002\u0002U-\u0003\u0002\u0002", + "\u0002U3\u0003\u0002\u0002\u0002U6\u0003\u0002\u0002\u0002U:\u0003\u0002", + "\u0002\u0002U?\u0003\u0002\u0002\u0002UE\u0003\u0002\u0002\u0002UH\u0003", + "\u0002\u0002\u0002UK\u0003\u0002\u0002\u0002UQ\u0003\u0002\u0002\u0002", + "VY\u0003\u0002\u0002\u0002WU\u0003\u0002\u0002\u0002WX\u0003\u0002\u0002", + "\u0002X\u0005\u0003\u0002\u0002\u0002YW\u0003\u0002\u0002\u0002Z[\u0007", + "\f\u0002\u0002[a\u0005\u0004\u0003\u0002\\]\u0007\r\u0002\u0002]a\u0005", + "\u0004\u0003\u0002^_\u00071\u0002\u0002_a\u0005\u0004\u0003\u0002`Z", + "\u0003\u0002\u0002\u0002`\\\u0003\u0002\u0002\u0002`^\u0003\u0002\u0002", + "\u0002a\u0007\u0003\u0002\u0002\u0002bc\b\u0005\u0001\u0002ck\u0007", + "G\u0002\u0002dk\u0005\n\u0006\u0002ek\u0005\f\u0007\u0002fg\u0007\u0016", + "\u0002\u0002gh\u0005\u0004\u0003\u0002hi\u0007\u0017\u0002\u0002ik\u0003", + "\u0002\u0002\u0002jb\u0003\u0002\u0002\u0002jd\u0003\u0002\u0002\u0002", + "je\u0003\u0002\u0002\u0002jf\u0003\u0002\u0002\u0002kv\u0003\u0002\u0002", + "\u0002lm\f\u0004\u0002\u0002mn\u0007\u0003\u0002\u0002nu\u0007G\u0002", + "\u0002op\f\u0003\u0002\u0002pq\u0007\u001a\u0002\u0002qr\u0005\u0004", + "\u0003\u0002rs\u0007\u001b\u0002\u0002su\u0003\u0002\u0002\u0002tl\u0003", + "\u0002\u0002\u0002to\u0003\u0002\u0002\u0002ux\u0003\u0002\u0002\u0002", + "vt\u0003\u0002\u0002\u0002vw\u0003\u0002\u0002\u0002w\t\u0003\u0002", + "\u0002\u0002xv\u0003\u0002\u0002\u0002y|\u0005\u0010\t\u0002z|\u0005", + "\u0012\n\u0002{y\u0003\u0002\u0002\u0002{z\u0003\u0002\u0002\u0002|", + "\u000b\u0003\u0002\u0002\u0002}~\u0007G\u0002\u0002~\u0080\u0007\u0016", + "\u0002\u0002\u007f\u0081\u0005\u0004\u0003\u0002\u0080\u007f\u0003\u0002", + "\u0002\u0002\u0080\u0081\u0003\u0002\u0002\u0002\u0081\u0086\u0003\u0002", + "\u0002\u0002\u0082\u0083\u0007\u0015\u0002\u0002\u0083\u0085\u0005\u0004", + "\u0003\u0002\u0084\u0082\u0003\u0002\u0002\u0002\u0085\u0088\u0003\u0002", + "\u0002\u0002\u0086\u0087\u0003\u0002\u0002\u0002\u0086\u0084\u0003\u0002", + "\u0002\u0002\u0087\u008a\u0003\u0002\u0002\u0002\u0088\u0086\u0003\u0002", + "\u0002\u0002\u0089\u008b\u0007\u0015\u0002\u0002\u008a\u0089\u0003\u0002", + "\u0002\u0002\u008a\u008b\u0003\u0002\u0002\u0002\u008b\u008c\u0003\u0002", + "\u0002\u0002\u008c\u008d\u0007\u0017\u0002\u0002\u008d\r\u0003\u0002", + "\u0002\u0002\u008e\u008f\t\t\u0002\u0002\u008f\u000f\u0003\u0002\u0002", + "\u0002\u0090\u0092\u0007\u001a\u0002\u0002\u0091\u0093\u0005\u0004\u0003", + "\u0002\u0092\u0091\u0003\u0002\u0002\u0002\u0092\u0093\u0003\u0002\u0002", + "\u0002\u0093\u0098\u0003\u0002\u0002\u0002\u0094\u0095\u0007\u0015\u0002", + "\u0002\u0095\u0097\u0005\u0004\u0003\u0002\u0096\u0094\u0003\u0002\u0002", + "\u0002\u0097\u009a\u0003\u0002\u0002\u0002\u0098\u0099\u0003\u0002\u0002", + "\u0002\u0098\u0096\u0003\u0002\u0002\u0002\u0099\u009c\u0003\u0002\u0002", + "\u0002\u009a\u0098\u0003\u0002\u0002\u0002\u009b\u009d\u0007\u0015\u0002", + "\u0002\u009c\u009b\u0003\u0002\u0002\u0002\u009c\u009d\u0003\u0002\u0002", + "\u0002\u009d\u009e\u0003\u0002\u0002\u0002\u009e\u009f\u0007\u001b\u0002", + "\u0002\u009f\u0011\u0003\u0002\u0002\u0002\u00a0\u00a2\u0007\u0018\u0002", + "\u0002\u00a1\u00a3\u0005\u0014\u000b\u0002\u00a2\u00a1\u0003\u0002\u0002", + "\u0002\u00a2\u00a3\u0003\u0002\u0002\u0002\u00a3\u00a8\u0003\u0002\u0002", + "\u0002\u00a4\u00a5\u0007\u0015\u0002\u0002\u00a5\u00a7\u0005\u0014\u000b", + "\u0002\u00a6\u00a4\u0003\u0002\u0002\u0002\u00a7\u00aa\u0003\u0002\u0002", + "\u0002\u00a8\u00a6\u0003\u0002\u0002\u0002\u00a8\u00a9\u0003\u0002\u0002", + "\u0002\u00a9\u00ac\u0003\u0002\u0002\u0002\u00aa\u00a8\u0003\u0002\u0002", + "\u0002\u00ab\u00ad\u0007\u0015\u0002\u0002\u00ac\u00ab\u0003\u0002\u0002", + "\u0002\u00ac\u00ad\u0003\u0002\u0002\u0002\u00ad\u00ae\u0003\u0002\u0002", + "\u0002\u00ae\u00af\u0007\u0019\u0002\u0002\u00af\u0013\u0003\u0002\u0002", + "\u0002\u00b0\u00bc\u0007G\u0002\u0002\u00b1\u00b2\u0005\u0016\f\u0002", + "\u00b2\u00b3\u0007\u0012\u0002\u0002\u00b3\u00b4\u0005\u0004\u0003\u0002", + "\u00b4\u00bc\u0003\u0002\u0002\u0002\u00b5\u00b6\u0007\u001a\u0002\u0002", + "\u00b6\u00b7\u0005\u0004\u0003\u0002\u00b7\u00b8\u0007\u001b\u0002\u0002", + "\u00b8\u00b9\u0007\u0012\u0002\u0002\u00b9\u00ba\u0005\u0004\u0003\u0002", + "\u00ba\u00bc\u0003\u0002\u0002\u0002\u00bb\u00b0\u0003\u0002\u0002\u0002", + "\u00bb\u00b1\u0003\u0002\u0002\u0002\u00bb\u00b5\u0003\u0002\u0002\u0002", + "\u00bc\u0015\u0003\u0002\u0002\u0002\u00bd\u00be\t\n\u0002\u0002\u00be", + "\u0017\u0003\u0002\u0002\u0002\u0016\u001f/AUW`jtv{\u0080\u0086\u008a", + "\u0092\u0098\u009c\u00a2\u00a8\u00ac\u00bb"].join(""); + + +const atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN); + +const decisionsToDFA = atn.decisionToState.map( (ds, index) => new antlr4.dfa.DFA(ds, index) ); + +const sharedContextCache = new antlr4.PredictionContextCache(); + +export default class CAQLParser extends antlr4.Parser { + + static grammarFileName = "CAQLParser.g4"; + static literalNames = [ null, "'.'", "'=~'", "'!~'", "'=='", "'!='", + "'<'", "'>'", "'<='", "'>='", "'+'", "'-'", + "'*'", "'/'", "'%'", "'?'", "':'", "'::'", "'..'", + "','", "'('", "')'", "'{'", "'}'", "'['", "']'" ]; + static symbolicNames = [ null, "DOT", "T_REGEX_MATCH", "T_REGEX_NON_MATCH", + "T_EQ", "T_NE", "T_LT", "T_GT", "T_LE", "T_GE", + "T_PLUS", "T_MINUS", "T_TIMES", "T_DIV", "T_MOD", + "T_QUESTION", "T_COLON", "T_SCOPE", "T_RANGE", + "T_COMMA", "T_OPEN", "T_CLOSE", "T_OBJECT_OPEN", + "T_OBJECT_CLOSE", "T_ARRAY_OPEN", "T_ARRAY_CLOSE", + "T_AGGREGATE", "T_ALL", "T_AND", "T_ANY", "T_ASC", + "T_COLLECT", "T_DESC", "T_DISTINCT", "T_FALSE", + "T_FILTER", "T_FOR", "T_GRAPH", "T_IN", "T_INBOUND", + "T_INSERT", "T_INTO", "T_K_SHORTEST_PATHS", + "T_LET", "T_LIKE", "T_LIMIT", "T_NONE", "T_NOT", + "T_NULL", "T_OR", "T_OUTBOUND", "T_REMOVE", + "T_REPLACE", "T_RETURN", "T_SHORTEST_PATH", + "T_SORT", "T_TRUE", "T_UPDATE", "T_UPSERT", + "T_WITH", "T_KEEP", "T_COUNT", "T_OPTIONS", + "T_PRUNE", "T_SEARCH", "T_TO", "T_CURRENT", + "T_NEW", "T_OLD", "T_STRING", "T_INT", "T_FLOAT", + "T_PARAMETER", "T_QUOTED_STRING", "SINGLE_LINE_COMMENT", + "MULTILINE_COMMENT", "SPACES", "UNEXPECTED_CHAR", + "ERROR_RECONGNIGION" ]; + static ruleNames = [ "parse", "expression", "operator_unary", "reference", + "compound_value", "function_call", "value_literal", + "array", "object", "object_element", "object_element_name" ]; + + constructor(input) { + super(input); + this._interp = new antlr4.atn.ParserATNSimulator(this, atn, decisionsToDFA, sharedContextCache); + this.ruleNames = CAQLParser.ruleNames; + this.literalNames = CAQLParser.literalNames; + this.symbolicNames = CAQLParser.symbolicNames; + } + + get atn() { + return atn; + } + + sempred(localctx, ruleIndex, predIndex) { + switch(ruleIndex) { + case 1: + return this.expression_sempred(localctx, predIndex); + case 3: + return this.reference_sempred(localctx, predIndex); + default: + throw "No predicate with index:" + ruleIndex; + } + } + + expression_sempred(localctx, predIndex) { + switch(predIndex) { + case 0: + return this.precpred(this._ctx, 13); + case 1: + return this.precpred(this._ctx, 12); + case 2: + return this.precpred(this._ctx, 11); + case 3: + return this.precpred(this._ctx, 10); + case 4: + return this.precpred(this._ctx, 9); + case 5: + return this.precpred(this._ctx, 8); + case 6: + return this.precpred(this._ctx, 7); + case 7: + return this.precpred(this._ctx, 6); + case 8: + return this.precpred(this._ctx, 5); + case 9: + return this.precpred(this._ctx, 4); + case 10: + return this.precpred(this._ctx, 3); + case 11: + return this.precpred(this._ctx, 2); + case 12: + return this.precpred(this._ctx, 1); + default: + throw "No predicate with index:" + predIndex; + } + }; + + reference_sempred(localctx, predIndex) { + switch(predIndex) { + case 13: + return this.precpred(this._ctx, 2); + case 14: + return this.precpred(this._ctx, 1); + default: + throw "No predicate with index:" + predIndex; + } + }; + + + + + parse() { + let localctx = new ParseContext(this, this._ctx, this.state); + this.enterRule(localctx, 0, CAQLParser.RULE_parse); + try { + this.enterOuterAlt(localctx, 1); + this.state = 22; + this.expression(0); + this.state = 23; + this.match(CAQLParser.EOF); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + + expression(_p) { + if(_p===undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new ExpressionContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 2; + this.enterRecursionRule(localctx, 2, CAQLParser.RULE_expression, _p); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 29; + this._errHandler.sync(this); + switch(this._input.LA(1)) { + case CAQLParser.T_FALSE: + case CAQLParser.T_NULL: + case CAQLParser.T_TRUE: + case CAQLParser.T_INT: + case CAQLParser.T_FLOAT: + case CAQLParser.T_QUOTED_STRING: + this.state = 26; + this.value_literal(); + break; + case CAQLParser.T_OPEN: + case CAQLParser.T_OBJECT_OPEN: + case CAQLParser.T_ARRAY_OPEN: + case CAQLParser.T_STRING: + this.state = 27; + this.reference(0); + break; + case CAQLParser.T_PLUS: + case CAQLParser.T_MINUS: + case CAQLParser.T_NOT: + this.state = 28; + this.operator_unary(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + this._ctx.stop = this._input.LT(-1); + this.state = 85; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input,4,this._ctx) + while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if(_alt===1) { + if(this._parseListeners!==null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + this.state = 83; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input,3,this._ctx); + switch(la_) { + case 1: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 31; + if (!( this.precpred(this._ctx, 13))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 13)"); + } + this.state = 32; + _la = this._input.LA(1); + if(!(_la===CAQLParser.T_PLUS || _la===CAQLParser.T_MINUS)) { + this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + this.state = 33; + this.expression(14); + break; + + case 2: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 34; + if (!( this.precpred(this._ctx, 12))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 12)"); + } + this.state = 35; + _la = this._input.LA(1); + if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CAQLParser.T_TIMES) | (1 << CAQLParser.T_DIV) | (1 << CAQLParser.T_MOD))) !== 0))) { + this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + this.state = 36; + this.expression(13); + break; + + case 3: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 37; + if (!( this.precpred(this._ctx, 11))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 11)"); + } + this.state = 38; + this.match(CAQLParser.T_RANGE); + this.state = 39; + this.expression(12); + break; + + case 4: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 40; + if (!( this.precpred(this._ctx, 10))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 10)"); + } + this.state = 41; + _la = this._input.LA(1); + if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CAQLParser.T_LT) | (1 << CAQLParser.T_GT) | (1 << CAQLParser.T_LE) | (1 << CAQLParser.T_GE))) !== 0))) { + this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + this.state = 42; + this.expression(11); + break; + + case 5: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 43; + if (!( this.precpred(this._ctx, 9))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 9)"); + } + this.state = 45; + this._errHandler.sync(this); + _la = this._input.LA(1); + if(_la===CAQLParser.T_NOT) { + this.state = 44; + this.match(CAQLParser.T_NOT); + } + + this.state = 47; + this.match(CAQLParser.T_IN); + this.state = 48; + this.expression(10); + break; + + case 6: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 49; + if (!( this.precpred(this._ctx, 8))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 8)"); + } + this.state = 50; + _la = this._input.LA(1); + if(!(_la===CAQLParser.T_EQ || _la===CAQLParser.T_NE)) { + this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + this.state = 51; + this.expression(9); + break; + + case 7: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 52; + if (!( this.precpred(this._ctx, 7))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 7)"); + } + this.state = 53; + _la = this._input.LA(1); + if(!(((((_la - 27)) & ~0x1f) == 0 && ((1 << (_la - 27)) & ((1 << (CAQLParser.T_ALL - 27)) | (1 << (CAQLParser.T_ANY - 27)) | (1 << (CAQLParser.T_NONE - 27)))) !== 0))) { + this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + this.state = 54; + localctx.eq_op = this._input.LT(1); + _la = this._input.LA(1); + if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CAQLParser.T_EQ) | (1 << CAQLParser.T_NE) | (1 << CAQLParser.T_LT) | (1 << CAQLParser.T_GT) | (1 << CAQLParser.T_LE) | (1 << CAQLParser.T_GE))) !== 0) || _la===CAQLParser.T_IN)) { + localctx.eq_op = this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + this.state = 55; + this.expression(8); + break; + + case 8: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 56; + if (!( this.precpred(this._ctx, 6))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 6)"); + } + this.state = 57; + _la = this._input.LA(1); + if(!(((((_la - 27)) & ~0x1f) == 0 && ((1 << (_la - 27)) & ((1 << (CAQLParser.T_ALL - 27)) | (1 << (CAQLParser.T_ANY - 27)) | (1 << (CAQLParser.T_NONE - 27)))) !== 0))) { + this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + this.state = 58; + this.match(CAQLParser.T_NOT); + this.state = 59; + this.match(CAQLParser.T_IN); + this.state = 60; + this.expression(7); + break; + + case 9: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 61; + if (!( this.precpred(this._ctx, 5))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 5)"); + } + this.state = 63; + this._errHandler.sync(this); + _la = this._input.LA(1); + if(_la===CAQLParser.T_NOT) { + this.state = 62; + this.match(CAQLParser.T_NOT); + } + + this.state = 65; + _la = this._input.LA(1); + if(!(_la===CAQLParser.T_REGEX_MATCH || _la===CAQLParser.T_REGEX_NON_MATCH || _la===CAQLParser.T_LIKE)) { + this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + this.state = 66; + this.expression(6); + break; + + case 10: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 67; + if (!( this.precpred(this._ctx, 4))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 4)"); + } + this.state = 68; + this.match(CAQLParser.T_AND); + this.state = 69; + this.expression(5); + break; + + case 11: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 70; + if (!( this.precpred(this._ctx, 3))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)"); + } + this.state = 71; + this.match(CAQLParser.T_OR); + this.state = 72; + this.expression(4); + break; + + case 12: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 73; + if (!( this.precpred(this._ctx, 2))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); + } + this.state = 74; + this.match(CAQLParser.T_QUESTION); + this.state = 75; + this.expression(0); + this.state = 76; + this.match(CAQLParser.T_COLON); + this.state = 77; + this.expression(3); + break; + + case 13: + localctx = new ExpressionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_expression); + this.state = 79; + if (!( this.precpred(this._ctx, 1))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); + } + this.state = 80; + this.match(CAQLParser.T_QUESTION); + this.state = 81; + this.match(CAQLParser.T_COLON); + this.state = 82; + this.expression(2); + break; + + } + } + this.state = 87; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input,4,this._ctx); + } + + } catch( error) { + if(error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx) + } + return localctx; + } + + + + operator_unary() { + let localctx = new Operator_unaryContext(this, this._ctx, this.state); + this.enterRule(localctx, 4, CAQLParser.RULE_operator_unary); + try { + this.enterOuterAlt(localctx, 1); + this.state = 94; + this._errHandler.sync(this); + switch(this._input.LA(1)) { + case CAQLParser.T_PLUS: + this.state = 88; + this.match(CAQLParser.T_PLUS); + this.state = 89; + this.expression(0); + break; + case CAQLParser.T_MINUS: + this.state = 90; + this.match(CAQLParser.T_MINUS); + this.state = 91; + this.expression(0); + break; + case CAQLParser.T_NOT: + this.state = 92; + this.match(CAQLParser.T_NOT); + this.state = 93; + this.expression(0); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + + reference(_p) { + if(_p===undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new ReferenceContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 6; + this.enterRecursionRule(localctx, 6, CAQLParser.RULE_reference, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 104; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input,6,this._ctx); + switch(la_) { + case 1: + this.state = 97; + this.match(CAQLParser.T_STRING); + break; + + case 2: + this.state = 98; + this.compound_value(); + break; + + case 3: + this.state = 99; + this.function_call(); + break; + + case 4: + this.state = 100; + this.match(CAQLParser.T_OPEN); + this.state = 101; + this.expression(0); + this.state = 102; + this.match(CAQLParser.T_CLOSE); + break; + + } + this._ctx.stop = this._input.LT(-1); + this.state = 116; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input,8,this._ctx) + while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if(_alt===1) { + if(this._parseListeners!==null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + this.state = 114; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input,7,this._ctx); + switch(la_) { + case 1: + localctx = new ReferenceContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_reference); + this.state = 106; + if (!( this.precpred(this._ctx, 2))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)"); + } + this.state = 107; + this.match(CAQLParser.DOT); + this.state = 108; + this.match(CAQLParser.T_STRING); + break; + + case 2: + localctx = new ReferenceContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, CAQLParser.RULE_reference); + this.state = 109; + if (!( this.precpred(this._ctx, 1))) { + throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)"); + } + this.state = 110; + this.match(CAQLParser.T_ARRAY_OPEN); + this.state = 111; + this.expression(0); + this.state = 112; + this.match(CAQLParser.T_ARRAY_CLOSE); + break; + + } + } + this.state = 118; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input,8,this._ctx); + } + + } catch( error) { + if(error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx) + } + return localctx; + } + + + + compound_value() { + let localctx = new Compound_valueContext(this, this._ctx, this.state); + this.enterRule(localctx, 8, CAQLParser.RULE_compound_value); + try { + this.enterOuterAlt(localctx, 1); + this.state = 121; + this._errHandler.sync(this); + switch(this._input.LA(1)) { + case CAQLParser.T_ARRAY_OPEN: + this.state = 119; + this.array(); + break; + case CAQLParser.T_OBJECT_OPEN: + this.state = 120; + this.object(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + + + function_call() { + let localctx = new Function_callContext(this, this._ctx, this.state); + this.enterRule(localctx, 10, CAQLParser.RULE_function_call); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 123; + this.match(CAQLParser.T_STRING); + this.state = 124; + this.match(CAQLParser.T_OPEN); + this.state = 126; + this._errHandler.sync(this); + _la = this._input.LA(1); + if(((((_la - 10)) & ~0x1f) == 0 && ((1 << (_la - 10)) & ((1 << (CAQLParser.T_PLUS - 10)) | (1 << (CAQLParser.T_MINUS - 10)) | (1 << (CAQLParser.T_OPEN - 10)) | (1 << (CAQLParser.T_OBJECT_OPEN - 10)) | (1 << (CAQLParser.T_ARRAY_OPEN - 10)) | (1 << (CAQLParser.T_FALSE - 10)))) !== 0) || ((((_la - 47)) & ~0x1f) == 0 && ((1 << (_la - 47)) & ((1 << (CAQLParser.T_NOT - 47)) | (1 << (CAQLParser.T_NULL - 47)) | (1 << (CAQLParser.T_TRUE - 47)) | (1 << (CAQLParser.T_STRING - 47)) | (1 << (CAQLParser.T_INT - 47)) | (1 << (CAQLParser.T_FLOAT - 47)) | (1 << (CAQLParser.T_QUOTED_STRING - 47)))) !== 0)) { + this.state = 125; + this.expression(0); + } + + this.state = 132; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input,11,this._ctx) + while(_alt!=1 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if(_alt===1+1) { + this.state = 128; + this.match(CAQLParser.T_COMMA); + this.state = 129; + this.expression(0); + } + this.state = 134; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input,11,this._ctx); + } + + this.state = 136; + this._errHandler.sync(this); + _la = this._input.LA(1); + if(_la===CAQLParser.T_COMMA) { + this.state = 135; + this.match(CAQLParser.T_COMMA); + } + + this.state = 138; + this.match(CAQLParser.T_CLOSE); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + + + value_literal() { + let localctx = new Value_literalContext(this, this._ctx, this.state); + this.enterRule(localctx, 12, CAQLParser.RULE_value_literal); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 140; + _la = this._input.LA(1); + if(!(((((_la - 34)) & ~0x1f) == 0 && ((1 << (_la - 34)) & ((1 << (CAQLParser.T_FALSE - 34)) | (1 << (CAQLParser.T_NULL - 34)) | (1 << (CAQLParser.T_TRUE - 34)))) !== 0) || ((((_la - 70)) & ~0x1f) == 0 && ((1 << (_la - 70)) & ((1 << (CAQLParser.T_INT - 70)) | (1 << (CAQLParser.T_FLOAT - 70)) | (1 << (CAQLParser.T_QUOTED_STRING - 70)))) !== 0))) { + this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + + + array() { + let localctx = new ArrayContext(this, this._ctx, this.state); + this.enterRule(localctx, 14, CAQLParser.RULE_array); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 142; + this.match(CAQLParser.T_ARRAY_OPEN); + this.state = 144; + this._errHandler.sync(this); + _la = this._input.LA(1); + if(((((_la - 10)) & ~0x1f) == 0 && ((1 << (_la - 10)) & ((1 << (CAQLParser.T_PLUS - 10)) | (1 << (CAQLParser.T_MINUS - 10)) | (1 << (CAQLParser.T_OPEN - 10)) | (1 << (CAQLParser.T_OBJECT_OPEN - 10)) | (1 << (CAQLParser.T_ARRAY_OPEN - 10)) | (1 << (CAQLParser.T_FALSE - 10)))) !== 0) || ((((_la - 47)) & ~0x1f) == 0 && ((1 << (_la - 47)) & ((1 << (CAQLParser.T_NOT - 47)) | (1 << (CAQLParser.T_NULL - 47)) | (1 << (CAQLParser.T_TRUE - 47)) | (1 << (CAQLParser.T_STRING - 47)) | (1 << (CAQLParser.T_INT - 47)) | (1 << (CAQLParser.T_FLOAT - 47)) | (1 << (CAQLParser.T_QUOTED_STRING - 47)))) !== 0)) { + this.state = 143; + this.expression(0); + } + + this.state = 150; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input,14,this._ctx) + while(_alt!=1 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if(_alt===1+1) { + this.state = 146; + this.match(CAQLParser.T_COMMA); + this.state = 147; + this.expression(0); + } + this.state = 152; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input,14,this._ctx); + } + + this.state = 154; + this._errHandler.sync(this); + _la = this._input.LA(1); + if(_la===CAQLParser.T_COMMA) { + this.state = 153; + this.match(CAQLParser.T_COMMA); + } + + this.state = 156; + this.match(CAQLParser.T_ARRAY_CLOSE); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + + + object() { + let localctx = new ObjectContext(this, this._ctx, this.state); + this.enterRule(localctx, 16, CAQLParser.RULE_object); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 158; + this.match(CAQLParser.T_OBJECT_OPEN); + this.state = 160; + this._errHandler.sync(this); + _la = this._input.LA(1); + if(_la===CAQLParser.T_ARRAY_OPEN || _la===CAQLParser.T_STRING || _la===CAQLParser.T_QUOTED_STRING) { + this.state = 159; + this.object_element(); + } + + this.state = 166; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input,17,this._ctx) + while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if(_alt===1) { + this.state = 162; + this.match(CAQLParser.T_COMMA); + this.state = 163; + this.object_element(); + } + this.state = 168; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input,17,this._ctx); + } + + this.state = 170; + this._errHandler.sync(this); + _la = this._input.LA(1); + if(_la===CAQLParser.T_COMMA) { + this.state = 169; + this.match(CAQLParser.T_COMMA); + } + + this.state = 172; + this.match(CAQLParser.T_OBJECT_CLOSE); + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + + + object_element() { + let localctx = new Object_elementContext(this, this._ctx, this.state); + this.enterRule(localctx, 18, CAQLParser.RULE_object_element); + try { + this.enterOuterAlt(localctx, 1); + this.state = 185; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input,19,this._ctx); + switch(la_) { + case 1: + this.state = 174; + this.match(CAQLParser.T_STRING); + break; + + case 2: + this.state = 175; + this.object_element_name(); + this.state = 176; + this.match(CAQLParser.T_COLON); + this.state = 177; + this.expression(0); + break; + + case 3: + this.state = 179; + this.match(CAQLParser.T_ARRAY_OPEN); + this.state = 180; + this.expression(0); + this.state = 181; + this.match(CAQLParser.T_ARRAY_CLOSE); + this.state = 182; + this.match(CAQLParser.T_COLON); + this.state = 183; + this.expression(0); + break; + + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + + + object_element_name() { + let localctx = new Object_element_nameContext(this, this._ctx, this.state); + this.enterRule(localctx, 20, CAQLParser.RULE_object_element_name); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 187; + _la = this._input.LA(1); + if(!(_la===CAQLParser.T_STRING || _la===CAQLParser.T_QUOTED_STRING)) { + this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if(re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + +} + +CAQLParser.EOF = antlr4.Token.EOF; +CAQLParser.DOT = 1; +CAQLParser.T_REGEX_MATCH = 2; +CAQLParser.T_REGEX_NON_MATCH = 3; +CAQLParser.T_EQ = 4; +CAQLParser.T_NE = 5; +CAQLParser.T_LT = 6; +CAQLParser.T_GT = 7; +CAQLParser.T_LE = 8; +CAQLParser.T_GE = 9; +CAQLParser.T_PLUS = 10; +CAQLParser.T_MINUS = 11; +CAQLParser.T_TIMES = 12; +CAQLParser.T_DIV = 13; +CAQLParser.T_MOD = 14; +CAQLParser.T_QUESTION = 15; +CAQLParser.T_COLON = 16; +CAQLParser.T_SCOPE = 17; +CAQLParser.T_RANGE = 18; +CAQLParser.T_COMMA = 19; +CAQLParser.T_OPEN = 20; +CAQLParser.T_CLOSE = 21; +CAQLParser.T_OBJECT_OPEN = 22; +CAQLParser.T_OBJECT_CLOSE = 23; +CAQLParser.T_ARRAY_OPEN = 24; +CAQLParser.T_ARRAY_CLOSE = 25; +CAQLParser.T_AGGREGATE = 26; +CAQLParser.T_ALL = 27; +CAQLParser.T_AND = 28; +CAQLParser.T_ANY = 29; +CAQLParser.T_ASC = 30; +CAQLParser.T_COLLECT = 31; +CAQLParser.T_DESC = 32; +CAQLParser.T_DISTINCT = 33; +CAQLParser.T_FALSE = 34; +CAQLParser.T_FILTER = 35; +CAQLParser.T_FOR = 36; +CAQLParser.T_GRAPH = 37; +CAQLParser.T_IN = 38; +CAQLParser.T_INBOUND = 39; +CAQLParser.T_INSERT = 40; +CAQLParser.T_INTO = 41; +CAQLParser.T_K_SHORTEST_PATHS = 42; +CAQLParser.T_LET = 43; +CAQLParser.T_LIKE = 44; +CAQLParser.T_LIMIT = 45; +CAQLParser.T_NONE = 46; +CAQLParser.T_NOT = 47; +CAQLParser.T_NULL = 48; +CAQLParser.T_OR = 49; +CAQLParser.T_OUTBOUND = 50; +CAQLParser.T_REMOVE = 51; +CAQLParser.T_REPLACE = 52; +CAQLParser.T_RETURN = 53; +CAQLParser.T_SHORTEST_PATH = 54; +CAQLParser.T_SORT = 55; +CAQLParser.T_TRUE = 56; +CAQLParser.T_UPDATE = 57; +CAQLParser.T_UPSERT = 58; +CAQLParser.T_WITH = 59; +CAQLParser.T_KEEP = 60; +CAQLParser.T_COUNT = 61; +CAQLParser.T_OPTIONS = 62; +CAQLParser.T_PRUNE = 63; +CAQLParser.T_SEARCH = 64; +CAQLParser.T_TO = 65; +CAQLParser.T_CURRENT = 66; +CAQLParser.T_NEW = 67; +CAQLParser.T_OLD = 68; +CAQLParser.T_STRING = 69; +CAQLParser.T_INT = 70; +CAQLParser.T_FLOAT = 71; +CAQLParser.T_PARAMETER = 72; +CAQLParser.T_QUOTED_STRING = 73; +CAQLParser.SINGLE_LINE_COMMENT = 74; +CAQLParser.MULTILINE_COMMENT = 75; +CAQLParser.SPACES = 76; +CAQLParser.UNEXPECTED_CHAR = 77; +CAQLParser.ERROR_RECONGNIGION = 78; + +CAQLParser.RULE_parse = 0; +CAQLParser.RULE_expression = 1; +CAQLParser.RULE_operator_unary = 2; +CAQLParser.RULE_reference = 3; +CAQLParser.RULE_compound_value = 4; +CAQLParser.RULE_function_call = 5; +CAQLParser.RULE_value_literal = 6; +CAQLParser.RULE_array = 7; +CAQLParser.RULE_object = 8; +CAQLParser.RULE_object_element = 9; +CAQLParser.RULE_object_element_name = 10; + +class ParseContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_parse; + } + + expression() { + return this.getTypedRuleContext(ExpressionContext,0); + }; + + EOF() { + return this.getToken(CAQLParser.EOF, 0); + }; + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterParse(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitParse(this); + } + } + + +} + + + +class ExpressionContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_expression; + this.eq_op = null; // Token + } + + value_literal() { + return this.getTypedRuleContext(Value_literalContext,0); + }; + + reference() { + return this.getTypedRuleContext(ReferenceContext,0); + }; + + operator_unary() { + return this.getTypedRuleContext(Operator_unaryContext,0); + }; + + expression = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(ExpressionContext); + } else { + return this.getTypedRuleContext(ExpressionContext,i); + } + }; + + T_PLUS() { + return this.getToken(CAQLParser.T_PLUS, 0); + }; + + T_MINUS() { + return this.getToken(CAQLParser.T_MINUS, 0); + }; + + T_TIMES() { + return this.getToken(CAQLParser.T_TIMES, 0); + }; + + T_DIV() { + return this.getToken(CAQLParser.T_DIV, 0); + }; + + T_MOD() { + return this.getToken(CAQLParser.T_MOD, 0); + }; + + T_RANGE() { + return this.getToken(CAQLParser.T_RANGE, 0); + }; + + T_LT() { + return this.getToken(CAQLParser.T_LT, 0); + }; + + T_GT() { + return this.getToken(CAQLParser.T_GT, 0); + }; + + T_LE() { + return this.getToken(CAQLParser.T_LE, 0); + }; + + T_GE() { + return this.getToken(CAQLParser.T_GE, 0); + }; + + T_IN() { + return this.getToken(CAQLParser.T_IN, 0); + }; + + T_NOT() { + return this.getToken(CAQLParser.T_NOT, 0); + }; + + T_EQ() { + return this.getToken(CAQLParser.T_EQ, 0); + }; + + T_NE() { + return this.getToken(CAQLParser.T_NE, 0); + }; + + T_ALL() { + return this.getToken(CAQLParser.T_ALL, 0); + }; + + T_ANY() { + return this.getToken(CAQLParser.T_ANY, 0); + }; + + T_NONE() { + return this.getToken(CAQLParser.T_NONE, 0); + }; + + T_LIKE() { + return this.getToken(CAQLParser.T_LIKE, 0); + }; + + T_REGEX_MATCH() { + return this.getToken(CAQLParser.T_REGEX_MATCH, 0); + }; + + T_REGEX_NON_MATCH() { + return this.getToken(CAQLParser.T_REGEX_NON_MATCH, 0); + }; + + T_AND() { + return this.getToken(CAQLParser.T_AND, 0); + }; + + T_OR() { + return this.getToken(CAQLParser.T_OR, 0); + }; + + T_QUESTION() { + return this.getToken(CAQLParser.T_QUESTION, 0); + }; + + T_COLON() { + return this.getToken(CAQLParser.T_COLON, 0); + }; + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterExpression(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitExpression(this); + } + } + + +} + + + +class Operator_unaryContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_operator_unary; + } + + T_PLUS() { + return this.getToken(CAQLParser.T_PLUS, 0); + }; + + expression() { + return this.getTypedRuleContext(ExpressionContext,0); + }; + + T_MINUS() { + return this.getToken(CAQLParser.T_MINUS, 0); + }; + + T_NOT() { + return this.getToken(CAQLParser.T_NOT, 0); + }; + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterOperator_unary(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitOperator_unary(this); + } + } + + +} + + + +class ReferenceContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_reference; + } + + T_STRING() { + return this.getToken(CAQLParser.T_STRING, 0); + }; + + compound_value() { + return this.getTypedRuleContext(Compound_valueContext,0); + }; + + function_call() { + return this.getTypedRuleContext(Function_callContext,0); + }; + + T_OPEN() { + return this.getToken(CAQLParser.T_OPEN, 0); + }; + + expression() { + return this.getTypedRuleContext(ExpressionContext,0); + }; + + T_CLOSE() { + return this.getToken(CAQLParser.T_CLOSE, 0); + }; + + reference() { + return this.getTypedRuleContext(ReferenceContext,0); + }; + + DOT() { + return this.getToken(CAQLParser.DOT, 0); + }; + + T_ARRAY_OPEN() { + return this.getToken(CAQLParser.T_ARRAY_OPEN, 0); + }; + + T_ARRAY_CLOSE() { + return this.getToken(CAQLParser.T_ARRAY_CLOSE, 0); + }; + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterReference(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitReference(this); + } + } + + +} + + + +class Compound_valueContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_compound_value; + } + + array() { + return this.getTypedRuleContext(ArrayContext,0); + }; + + object() { + return this.getTypedRuleContext(ObjectContext,0); + }; + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterCompound_value(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitCompound_value(this); + } + } + + +} + + + +class Function_callContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_function_call; + } + + T_STRING() { + return this.getToken(CAQLParser.T_STRING, 0); + }; + + T_OPEN() { + return this.getToken(CAQLParser.T_OPEN, 0); + }; + + T_CLOSE() { + return this.getToken(CAQLParser.T_CLOSE, 0); + }; + + expression = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(ExpressionContext); + } else { + return this.getTypedRuleContext(ExpressionContext,i); + } + }; + + T_COMMA = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTokens(CAQLParser.T_COMMA); + } else { + return this.getToken(CAQLParser.T_COMMA, i); + } + }; + + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterFunction_call(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitFunction_call(this); + } + } + + +} + + + +class Value_literalContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_value_literal; + } + + T_QUOTED_STRING() { + return this.getToken(CAQLParser.T_QUOTED_STRING, 0); + }; + + T_INT() { + return this.getToken(CAQLParser.T_INT, 0); + }; + + T_FLOAT() { + return this.getToken(CAQLParser.T_FLOAT, 0); + }; + + T_NULL() { + return this.getToken(CAQLParser.T_NULL, 0); + }; + + T_TRUE() { + return this.getToken(CAQLParser.T_TRUE, 0); + }; + + T_FALSE() { + return this.getToken(CAQLParser.T_FALSE, 0); + }; + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterValue_literal(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitValue_literal(this); + } + } + + +} + + + +class ArrayContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_array; + } + + T_ARRAY_OPEN() { + return this.getToken(CAQLParser.T_ARRAY_OPEN, 0); + }; + + T_ARRAY_CLOSE() { + return this.getToken(CAQLParser.T_ARRAY_CLOSE, 0); + }; + + expression = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(ExpressionContext); + } else { + return this.getTypedRuleContext(ExpressionContext,i); + } + }; + + T_COMMA = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTokens(CAQLParser.T_COMMA); + } else { + return this.getToken(CAQLParser.T_COMMA, i); + } + }; + + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterArray(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitArray(this); + } + } + + +} + + + +class ObjectContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_object; + } + + T_OBJECT_OPEN() { + return this.getToken(CAQLParser.T_OBJECT_OPEN, 0); + }; + + T_OBJECT_CLOSE() { + return this.getToken(CAQLParser.T_OBJECT_CLOSE, 0); + }; + + object_element = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(Object_elementContext); + } else { + return this.getTypedRuleContext(Object_elementContext,i); + } + }; + + T_COMMA = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTokens(CAQLParser.T_COMMA); + } else { + return this.getToken(CAQLParser.T_COMMA, i); + } + }; + + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterObject(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitObject(this); + } + } + + +} + + + +class Object_elementContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_object_element; + } + + T_STRING() { + return this.getToken(CAQLParser.T_STRING, 0); + }; + + object_element_name() { + return this.getTypedRuleContext(Object_element_nameContext,0); + }; + + T_COLON() { + return this.getToken(CAQLParser.T_COLON, 0); + }; + + expression = function(i) { + if(i===undefined) { + i = null; + } + if(i===null) { + return this.getTypedRuleContexts(ExpressionContext); + } else { + return this.getTypedRuleContext(ExpressionContext,i); + } + }; + + T_ARRAY_OPEN() { + return this.getToken(CAQLParser.T_ARRAY_OPEN, 0); + }; + + T_ARRAY_CLOSE() { + return this.getToken(CAQLParser.T_ARRAY_CLOSE, 0); + }; + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterObject_element(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitObject_element(this); + } + } + + +} + + + +class Object_element_nameContext extends antlr4.ParserRuleContext { + + constructor(parser, parent, invokingState) { + if(parent===undefined) { + parent = null; + } + if(invokingState===undefined || invokingState===null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = CAQLParser.RULE_object_element_name; + } + + T_STRING() { + return this.getToken(CAQLParser.T_STRING, 0); + }; + + T_QUOTED_STRING() { + return this.getToken(CAQLParser.T_QUOTED_STRING, 0); + }; + + enterRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.enterObject_element_name(this); + } + } + + exitRule(listener) { + if(listener instanceof CAQLParserListener ) { + listener.exitObject_element_name(this); + } + } + + +} + + + + +CAQLParser.ParseContext = ParseContext; +CAQLParser.ExpressionContext = ExpressionContext; +CAQLParser.Operator_unaryContext = Operator_unaryContext; +CAQLParser.ReferenceContext = ReferenceContext; +CAQLParser.Compound_valueContext = Compound_valueContext; +CAQLParser.Function_callContext = Function_callContext; +CAQLParser.Value_literalContext = Value_literalContext; +CAQLParser.ArrayContext = ArrayContext; +CAQLParser.ObjectContext = ObjectContext; +CAQLParser.Object_elementContext = Object_elementContext; +CAQLParser.Object_element_nameContext = Object_element_nameContext; diff --git a/ui/src/suggestions/grammar/RQLParser.tokens b/ui/src/suggestions/grammar/RQLParser.tokens new file mode 100644 index 0000000..7bdaf61 --- /dev/null +++ b/ui/src/suggestions/grammar/RQLParser.tokens @@ -0,0 +1,103 @@ +DOT=1 +T_REGEX_MATCH=2 +T_REGEX_NON_MATCH=3 +T_EQ=4 +T_NE=5 +T_LT=6 +T_GT=7 +T_LE=8 +T_GE=9 +T_PLUS=10 +T_MINUS=11 +T_TIMES=12 +T_DIV=13 +T_MOD=14 +T_QUESTION=15 +T_COLON=16 +T_SCOPE=17 +T_RANGE=18 +T_COMMA=19 +T_OPEN=20 +T_CLOSE=21 +T_OBJECT_OPEN=22 +T_OBJECT_CLOSE=23 +T_ARRAY_OPEN=24 +T_ARRAY_CLOSE=25 +T_AGGREGATE=26 +T_ALL=27 +T_AND=28 +T_ANY=29 +T_ASC=30 +T_COLLECT=31 +T_DESC=32 +T_DISTINCT=33 +T_FALSE=34 +T_FILTER=35 +T_FOR=36 +T_GRAPH=37 +T_IN=38 +T_INBOUND=39 +T_INSERT=40 +T_INTO=41 +T_K_SHORTEST_PATHS=42 +T_LET=43 +T_LIKE=44 +T_LIMIT=45 +T_NONE=46 +T_NOT=47 +T_NULL=48 +T_OR=49 +T_OUTBOUND=50 +T_REMOVE=51 +T_REPLACE=52 +T_RETURN=53 +T_SHORTEST_PATH=54 +T_SORT=55 +T_TRUE=56 +T_UPDATE=57 +T_UPSERT=58 +T_WITH=59 +T_KEEP=60 +T_COUNT=61 +T_OPTIONS=62 +T_PRUNE=63 +T_SEARCH=64 +T_TO=65 +T_CURRENT=66 +T_NEW=67 +T_OLD=68 +T_STRING=69 +T_INT=70 +T_FLOAT=71 +T_PARAMETER=72 +T_QUOTED_STRING=73 +SINGLE_LINE_COMMENT=74 +MULTILINE_COMMENT=75 +SPACES=76 +UNEXPECTED_CHAR=77 +ERROR_RECONGNIGION=78 +'.'=1 +'=~'=2 +'!~'=3 +'=='=4 +'!='=5 +'<'=6 +'>'=7 +'<='=8 +'>='=9 +'+'=10 +'-'=11 +'*'=12 +'/'=13 +'%'=14 +'?'=15 +':'=16 +'::'=17 +'..'=18 +','=19 +'('=20 +')'=21 +'{'=22 +'}'=23 +'['=24 +']'=25 diff --git a/ui/src/suggestions/grammar/RQLParserListener.js b/ui/src/suggestions/grammar/RQLParserListener.js new file mode 100644 index 0000000..869d319 --- /dev/null +++ b/ui/src/suggestions/grammar/RQLParserListener.js @@ -0,0 +1,108 @@ +// Generated from CAQLParser.g4 by ANTLR 4.9.2 +// jshint ignore: start +import antlr4 from 'antlr4'; + +// This class defines a complete listener for a parse tree produced by CAQLParser. +export default class CAQLParserListener extends antlr4.tree.ParseTreeListener { + + // Enter a parse tree produced by CAQLParser#parse. + enterParse(ctx) { + } + + // Exit a parse tree produced by CAQLParser#parse. + exitParse(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#expression. + enterExpression(ctx) { + } + + // Exit a parse tree produced by CAQLParser#expression. + exitExpression(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#operator_unary. + enterOperator_unary(ctx) { + } + + // Exit a parse tree produced by CAQLParser#operator_unary. + exitOperator_unary(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#reference. + enterReference(ctx) { + } + + // Exit a parse tree produced by CAQLParser#reference. + exitReference(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#compound_value. + enterCompound_value(ctx) { + } + + // Exit a parse tree produced by CAQLParser#compound_value. + exitCompound_value(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#function_call. + enterFunction_call(ctx) { + } + + // Exit a parse tree produced by CAQLParser#function_call. + exitFunction_call(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#value_literal. + enterValue_literal(ctx) { + } + + // Exit a parse tree produced by CAQLParser#value_literal. + exitValue_literal(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#array. + enterArray(ctx) { + } + + // Exit a parse tree produced by CAQLParser#array. + exitArray(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#object. + enterObject(ctx) { + } + + // Exit a parse tree produced by CAQLParser#object. + exitObject(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#object_element. + enterObject_element(ctx) { + } + + // Exit a parse tree produced by CAQLParser#object_element. + exitObject_element(ctx) { + } + + + // Enter a parse tree produced by CAQLParser#object_element_name. + enterObject_element_name(ctx) { + } + + // Exit a parse tree produced by CAQLParser#object_element_name. + exitObject_element_name(ctx) { + } + + + +} diff --git a/ui/src/suggestions/suggestions.ts b/ui/src/suggestions/suggestions.ts new file mode 100644 index 0000000..41dce63 --- /dev/null +++ b/ui/src/suggestions/suggestions.ts @@ -0,0 +1,46 @@ +import lexerModule from "./grammar/CAQLLexer.js"; +import parserModule from "./grammar/CAQLParser.js"; + +import antlr4 from "antlr4"; + +class ErrorListener extends antlr4.error.ErrorListener { + /** + * Checks syntax error + * + * @param {object} recognizer The parsing support code essentially. Most of it is error recovery stuff + * @param {object} symbol Offending symbol + * @param {int} line Line of offending symbol + * @param {int} column Position in line of offending symbol + * @param {string} message Error message + * @param {string} payload Stack trace + */ + syntaxError( + recognizer: any, + symbol: any, + line: number, + column: number, + message: string, + payload: string + ) { + throw {symbol, line, column, message, payload}; + } +} + +export function validateCAQL(term: string): any { + const chars = new antlr4.InputStream(term); + const lexer = new lexerModule(chars); + + const tokens = new antlr4.CommonTokenStream(lexer); + const parser = new parserModule(tokens); + + const listener = new ErrorListener(); + + parser.removeErrorListeners(); + parser.addErrorListener(listener); + try { + parser.parse() + return null; + } catch (error) { + return error; + } +} diff --git a/ui/src/types/types.ts b/ui/src/types/types.ts new file mode 100644 index 0000000..00936b8 --- /dev/null +++ b/ui/src/types/types.ts @@ -0,0 +1,17 @@ +export interface Problem { + title: string; + detail: string; +} + +enum AlertType { + success = "success", + info = "info", + warning = "warning", + error = "error", +} + +export interface Alert { + name: string; + detail: string; + type: AlertType; +} diff --git a/ui/src/views/API.vue b/ui/src/views/API.vue new file mode 100644 index 0000000..57e5667 --- /dev/null +++ b/ui/src/views/API.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/ui/src/views/ArtifactPopup.vue b/ui/src/views/ArtifactPopup.vue new file mode 100644 index 0000000..89d924e --- /dev/null +++ b/ui/src/views/ArtifactPopup.vue @@ -0,0 +1,264 @@ + + + + + diff --git a/ui/src/views/Automation.vue b/ui/src/views/Automation.vue new file mode 100644 index 0000000..a15e277 --- /dev/null +++ b/ui/src/views/Automation.vue @@ -0,0 +1,131 @@ + + + diff --git a/ui/src/views/AutomationList.vue b/ui/src/views/AutomationList.vue new file mode 100644 index 0000000..ad81ca4 --- /dev/null +++ b/ui/src/views/AutomationList.vue @@ -0,0 +1,64 @@ + + + diff --git a/ui/src/views/Dashboard.vue b/ui/src/views/Dashboard.vue new file mode 100644 index 0000000..8088637 --- /dev/null +++ b/ui/src/views/Dashboard.vue @@ -0,0 +1,219 @@ + + + + + diff --git a/ui/src/views/Graph.vue b/ui/src/views/Graph.vue new file mode 100644 index 0000000..8383dfa --- /dev/null +++ b/ui/src/views/Graph.vue @@ -0,0 +1,217 @@ + + + + + + diff --git a/ui/src/views/Group.vue b/ui/src/views/Group.vue new file mode 100644 index 0000000..013c909 --- /dev/null +++ b/ui/src/views/Group.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/ui/src/views/GroupList.vue b/ui/src/views/GroupList.vue new file mode 100644 index 0000000..72ef79d --- /dev/null +++ b/ui/src/views/GroupList.vue @@ -0,0 +1,62 @@ + + + diff --git a/ui/src/views/Job.vue b/ui/src/views/Job.vue new file mode 100644 index 0000000..1cdeb64 --- /dev/null +++ b/ui/src/views/Job.vue @@ -0,0 +1,186 @@ + + + diff --git a/ui/src/views/JobList.vue b/ui/src/views/JobList.vue new file mode 100644 index 0000000..dd9d8c4 --- /dev/null +++ b/ui/src/views/JobList.vue @@ -0,0 +1,61 @@ + + + diff --git a/ui/src/views/Playbook.vue b/ui/src/views/Playbook.vue new file mode 100644 index 0000000..053a0bb --- /dev/null +++ b/ui/src/views/Playbook.vue @@ -0,0 +1,311 @@ + + + + + diff --git a/ui/src/views/PlaybookList.vue b/ui/src/views/PlaybookList.vue new file mode 100644 index 0000000..d6e394a --- /dev/null +++ b/ui/src/views/PlaybookList.vue @@ -0,0 +1,66 @@ + + + diff --git a/ui/src/views/Profile.vue b/ui/src/views/Profile.vue new file mode 100644 index 0000000..16aacec --- /dev/null +++ b/ui/src/views/Profile.vue @@ -0,0 +1,47 @@ + + + + diff --git a/ui/src/views/Rule.vue b/ui/src/views/Rule.vue new file mode 100644 index 0000000..574d656 --- /dev/null +++ b/ui/src/views/Rule.vue @@ -0,0 +1,89 @@ + + + diff --git a/ui/src/views/RuleList.vue b/ui/src/views/RuleList.vue new file mode 100644 index 0000000..347d4a4 --- /dev/null +++ b/ui/src/views/RuleList.vue @@ -0,0 +1,63 @@ + + + diff --git a/ui/src/views/TaskList.vue b/ui/src/views/TaskList.vue new file mode 100644 index 0000000..75dacc0 --- /dev/null +++ b/ui/src/views/TaskList.vue @@ -0,0 +1,85 @@ + + + diff --git a/ui/src/views/Template.vue b/ui/src/views/Template.vue new file mode 100644 index 0000000..9f076d4 --- /dev/null +++ b/ui/src/views/Template.vue @@ -0,0 +1,87 @@ + + + diff --git a/ui/src/views/TemplateList.vue b/ui/src/views/TemplateList.vue new file mode 100644 index 0000000..fe46cd6 --- /dev/null +++ b/ui/src/views/TemplateList.vue @@ -0,0 +1,50 @@ + + + diff --git a/ui/src/views/Ticket.vue b/ui/src/views/Ticket.vue new file mode 100644 index 0000000..7e37471 --- /dev/null +++ b/ui/src/views/Ticket.vue @@ -0,0 +1,1626 @@ + + + + + diff --git a/ui/src/views/TicketList.vue b/ui/src/views/TicketList.vue new file mode 100644 index 0000000..b924bb9 --- /dev/null +++ b/ui/src/views/TicketList.vue @@ -0,0 +1,30 @@ + + + diff --git a/ui/src/views/TicketNew.vue b/ui/src/views/TicketNew.vue new file mode 100644 index 0000000..550f878 --- /dev/null +++ b/ui/src/views/TicketNew.vue @@ -0,0 +1,170 @@ + + + + + diff --git a/ui/src/views/TicketType.vue b/ui/src/views/TicketType.vue new file mode 100644 index 0000000..d861a80 --- /dev/null +++ b/ui/src/views/TicketType.vue @@ -0,0 +1,126 @@ + + + diff --git a/ui/src/views/TicketTypeList.vue b/ui/src/views/TicketTypeList.vue new file mode 100644 index 0000000..d01f23a --- /dev/null +++ b/ui/src/views/TicketTypeList.vue @@ -0,0 +1,64 @@ + + + diff --git a/ui/src/views/User.vue b/ui/src/views/User.vue new file mode 100644 index 0000000..a533045 --- /dev/null +++ b/ui/src/views/User.vue @@ -0,0 +1,105 @@ + + + diff --git a/ui/src/views/UserData.vue b/ui/src/views/UserData.vue new file mode 100644 index 0000000..5375d4d --- /dev/null +++ b/ui/src/views/UserData.vue @@ -0,0 +1,44 @@ + + + diff --git a/ui/src/views/UserDataList.vue b/ui/src/views/UserDataList.vue new file mode 100644 index 0000000..c04d4aa --- /dev/null +++ b/ui/src/views/UserDataList.vue @@ -0,0 +1,60 @@ + + + diff --git a/ui/src/views/UserList.vue b/ui/src/views/UserList.vue new file mode 100644 index 0000000..72a30df --- /dev/null +++ b/ui/src/views/UserList.vue @@ -0,0 +1,66 @@ + + + diff --git a/ui/src/views/embed/Arango.vue b/ui/src/views/embed/Arango.vue new file mode 100644 index 0000000..391515a --- /dev/null +++ b/ui/src/views/embed/Arango.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/ui/src/views/embed/Emitter.vue b/ui/src/views/embed/Emitter.vue new file mode 100644 index 0000000..8414679 --- /dev/null +++ b/ui/src/views/embed/Emitter.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/ui/src/views/embed/Minio.vue b/ui/src/views/embed/Minio.vue new file mode 100644 index 0000000..80fb53d --- /dev/null +++ b/ui/src/views/embed/Minio.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/ui/src/views/embed/Nodered.vue b/ui/src/views/embed/Nodered.vue new file mode 100644 index 0000000..633b764 --- /dev/null +++ b/ui/src/views/embed/Nodered.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/ui/tsconfig.json b/ui/tsconfig.json new file mode 100644 index 0000000..a00b252 --- /dev/null +++ b/ui/tsconfig.json @@ -0,0 +1,49 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "strict": true, + "jsx": "preserve", + "importHelpers": true, + "moduleResolution": "node", + "experimentalDecorators": true, + "skipLibCheck": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "sourceMap": true, + "noImplicitAny": false, + "baseUrl": ".", + "types": [ + "webpack-env", + "jest", + "vuetify" + ], + "paths": { + "@/*": [ + "src/*" + ] + }, + "lib": [ + "esnext", + "dom", + "dom.iterable", + "scripthost" + ], + "typeRoots": [ + "./node_modules/@types", + "./node_modules/vuetify/types" + ] + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "src/**/*.vue", + "tests/**/*.ts", + "tests/**/*.tsx" + ], + "exclude": [ + "node_modules", + "src/suggestions/suggestions.ts" + ] +} diff --git a/ui/ui.go b/ui/ui.go new file mode 100644 index 0000000..07c646b --- /dev/null +++ b/ui/ui.go @@ -0,0 +1,6 @@ +package ui + +import "embed" + +//go:embed dist/* +var UI embed.FS diff --git a/ui/ui_test.go b/ui/ui_test.go new file mode 100644 index 0000000..fd21fbc --- /dev/null +++ b/ui/ui_test.go @@ -0,0 +1,21 @@ +package ui + +import "testing" + +func TestUI(t *testing.T) { + requiredFiles := []string{ + "dist/index.html", + "dist/favicon.ico", + "dist/manifest.json", + "dist/img", + } + for _, requiredFile := range requiredFiles { + t.Run("Require "+requiredFile, func(t *testing.T) { + f, err := UI.Open(requiredFile) + if err != nil { + t.Fatal(err) + } + defer f.Close() + }) + } +} diff --git a/ui/vue.config.js b/ui/vue.config.js new file mode 100644 index 0000000..8312135 --- /dev/null +++ b/ui/vue.config.js @@ -0,0 +1,29 @@ +module.exports = { + transpileDependencies: ["vuetify", "@koumoul/vjsf"], + pwa: { + name: "Catalyst", + themeColor: "#FFC107", + msTileColor: "#000000", + appleMobileWebAppCapable: "yes", + appleMobileWebAppStatusBarStyle: "black", + + // configure the workbox plugin + // workboxPluginMode: "InjectManifest", + // workboxOptions: { + // // swSrc is required in InjectManifest mode. + // swSrc: "dev/sw.js", + // // ...other Workbox options... + // }, + iconPaths: { + favicon32: "img/icons/favicon-32x32.png", + favicon16: "img/icons/favicon-16x16.png", + appleTouchIcon: "img/icons/apple-touch-icon-152x152.png", + maskIcon: "img/icons/safari-pinned-tab.svg", + msTileImage: "img/icons/msapplication-icon-144x144.png", + }, + manifestCrossorigin: 'use-credentials' + }, + devServer: { + disableHostCheck: true + } +}; diff --git a/ui/yarn.lock b/ui/yarn.lock new file mode 100644 index 0000000..5659160 --- /dev/null +++ b/ui/yarn.lock @@ -0,0 +1,13107 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ant-design/colors@^3.1.0": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-3.2.2.tgz#5ad43d619e911f3488ebac303d606e66a8423903" + integrity "sha1-WtQ9YZ6RHzSI66wwPWBuZqhCOQM= sha512-YKgNbG2dlzqMhA9NtI3/pbY16m3Yl/EeWBRa+lB1X1YaYxHrxNexiQYCLTWO/uDvAjLFMEDU+zR901waBtMtjQ==" + dependencies: + tinycolor2 "^1.4.1" + +"@ant-design/icons-vue@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@ant-design/icons-vue/-/icons-vue-2.0.0.tgz#0357f5010a404e9f34a87a4b41b2a08df691dbce" + integrity "sha1-A1f1AQpATp80qHpLQbKgjfaR284= sha512-2c0QQE5hL4N48k5NkPG5sdpMl9YnvyNhf0U7YkdZYDlLnspoRU7vIA0UK9eHBs6OpFLcJB6o8eJrIl2ajBskPg==" + dependencies: + "@ant-design/colors" "^3.1.0" + babel-runtime "^6.26.0" + +"@ant-design/icons@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-2.1.1.tgz#7b9c08dffd4f5d41db667d9dbe5e0107d0bd9a4a" + integrity "sha1-e5wI3/1PXUHbZn2dvl4BB9C9mko= sha512-jCH+k2Vjlno4YWl6g535nHR09PwCEmTBKAG6VqF+rhkrSPRLfgpU2maagwbZPLjaHuU5Jd1DFQ2KJpQuI6uG8w==" + +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity "sha1-9K1DWqJj25NbjxDyxVLSP7cWpj8= sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==" + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.8.3": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" + integrity "sha1-DfyAMJvuyEEeZecGRhxAiwu5tDE= sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==" + dependencies: + "@babel/highlight" "^7.16.0" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.0.tgz#ea269d7f78deb3a7826c39a4048eecda541ebdaa" + integrity "sha1-6iadf3jes6eCbDmkBI7s2lQevao= sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==" + +"@babel/core@^7.1.0", "@babel/core@^7.11.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" + integrity "sha1-xP9EBG9f4xBSXMnrTvUUfwxTdNQ= sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==" + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helpers" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@^7.16.0", "@babel/generator@^7.4.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2" + integrity "sha1-1A89HVB15i01ALzLZ/PaqKlSZbI= sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==" + dependencies: + "@babel/types" "^7.16.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d" + integrity "sha1-mh8OvNpT2aLQAQjEzqzmpdXx8I0= sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==" + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz#f1a686b92da794020c26582eb852e9accd0d7882" + integrity "sha1-8aaGuS2nlAIMJlguuFLprM0NeII= sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==" + dependencies: + "@babel/helper-explode-assignable-expression" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.0", "@babel/helper-compilation-targets@^7.9.6": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.0.tgz#01d615762e796c17952c29e3ede9d6de07d235a8" + integrity "sha1-AdYVdi55bBeVLCnj7enW3gfSNag= sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg==" + dependencies: + "@babel/compat-data" "^7.16.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz#090d4d166b342a03a9fec37ef4fd5aeb9c7c6a4b" + integrity "sha1-CQ1NFms0KgOp/sN+9P1a65x8aks= sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==" + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + +"@babel/helper-create-regexp-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz#06b2348ce37fccc4f5e18dcd8d75053f2a7c44ff" + integrity "sha1-BrI0jON/zMT14Y3NjXUFPyp8RP8= sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==" + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + regexpu-core "^4.7.1" + +"@babel/helper-define-polyfill-provider@^0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz#8867aed79d3ea6cade40f801efb7ac5c66916b10" + integrity "sha1-iGeu150+psreQPgB77esXGaRaxA= sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==" + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-explode-assignable-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz#753017337a15f46f9c09f674cff10cee9b9d7778" + integrity "sha1-dTAXM3oV9G+cCfZ0z/EM7pudd3g= sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==" + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-function-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" + integrity "sha1-t90Hl9ALv+5PB+nE6lsOMMi7FIE= sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==" + dependencies: + "@babel/helper-get-function-arity" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-get-function-arity@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" + integrity "sha1-AIjHSGspqctdlIsaHeRttm4InPo= sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==" + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-hoist-variables@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" + integrity "sha1-TJAjwvHe9+KP9G/B2802o5vqqBo= sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==" + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-member-expression-to-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" + integrity "sha1-KShwQO/Rl8d2Nu91GI6B2ovM1aQ= sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==" + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.8.3": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" + integrity "sha1-kFOOYLZy7PG0SPX09UM9N+eaPsM= sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==" + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-module-transforms@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5" + integrity "sha1-HIKo3UyzRXdQLr0pCWmbGUw+m7U= sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==" + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-simple-access" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/helper-validator-identifier" "^7.15.7" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-optimise-call-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" + integrity "sha1-zs2xRdcMVAlrFWT46fEM19GTszg= sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==" + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity "sha1-WsgizpfuxGdBq3ClF5ceRDpwxak= sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + +"@babel/helper-remap-async-to-generator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.0.tgz#d5aa3b086e13a5fe05238ff40c3a5a0c2dab3ead" + integrity "sha1-1ao7CG4Tpf4FI4/0DDpaDC2rPq0= sha512-MLM1IOMe9aQBqMWxcRw8dcb9jlM86NIw7KA0Wri91Xkfied+dE0QuBFSBjMNvqzmS0OSIDsMNC24dBEkPUi7ew==" + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-wrap-function" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-replace-supers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17" + integrity "sha1-cwVejTz5vLqN21XK2T/tyGD2jxc= sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==" + dependencies: + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-simple-access@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" + integrity "sha1-IdaidiDjg+N1NM9sELugGab5BRc= sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==" + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity "sha1-DuM4gHAUfDrgUeSH7KPrsOLouwk= sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==" + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" + integrity "sha1-KWcvQ2Y+k23zcKrrIr7ds7rsdDg= sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==" + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity "sha1-Ig35k7/pBKSmsCq08zhaXr9uI4k= sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" + +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity "sha1-bnKh//GNXfy4eOHmLxoCHEty1aM= sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" + +"@babel/helper-wrap-function@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz#b3cf318afce774dfe75b86767cd6d68f3482e57c" + integrity "sha1-s88xivzndN/nW4Z2fNbWjzSC5Xw= sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==" + dependencies: + "@babel/helper-function-name" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helpers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.0.tgz#875519c979c232f41adfbd43a3b0398c2e388183" + integrity "sha1-h1UZyXnCMvQa371Do7A5jC44gYM= sha512-dVRM0StFMdKlkt7cVcGgwD8UMaBfWJHl3A83Yfs8GQ3MO0LHIIIMvK7Fa0RGOGUQ10qikLaX6D7o5htcQWgTMQ==" + dependencies: + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" + integrity "sha1-bOsysspLj182H7f9gh4/3fShclo= sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==" + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.15.0", "@babel/parser@^7.16.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0": + version "7.16.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.2.tgz#3723cd5c8d8773eef96ce57ea1d9b7faaccd12ac" + integrity "sha1-NyPNXI2Hc+75bOV+odm3+qzNEqw= sha512-RUVpT0G2h6rOZwqLDTrKk7ksNv7YpAilTnYe1/Q+eDjxEceRMKVWbCsX7t8h6C1qCFi/1Y8WZjcEPBAFG27GPw==" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.0": + version "7.16.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz#2977fca9b212db153c195674e57cfab807733183" + integrity "sha1-KXf8qbIS2xU8GVZ05Xz6uAdzMYM= sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz#358972eaab006f5eb0826183b0c93cbcaf13e1e2" + integrity "sha1-NYly6qsAb16wgmGDsMk8vK8T4eI= sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + +"@babel/plugin-proposal-async-generator-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.0.tgz#11425d47a60364352f668ad5fbc1d6596b2c5caf" + integrity "sha1-EUJdR6YDZDUvZorV+8HWWWssXK8= sha512-nyYmIo7ZqKsY6P4lnVmBlxp9B3a96CscbLotlsNuktMHahkDwoPYEjXrZHU0Tj844Z9f1IthVxQln57mhkcExw==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.16.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.8.3": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz#c029618267ddebc7280fa286e0f8ca2a278a2d1a" + integrity "sha1-wClhgmfd68coD6KG4PjKKieKLRo= sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==" + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-class-static-block@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz#5296942c564d8144c83eea347d0aa8a0b89170e7" + integrity "sha1-UpaULFZNgUTIPuo0fQqooLiRcOc= sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==" + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-decorators@^7.8.3": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.0.tgz#515db5f6891611c0d176b63ede0844fbd9be797b" + integrity "sha1-UV219okWEcDRdrY+3ghE+9m+eXs= sha512-ttvhKuVnQwoNQrcTd1oe6o49ahaZ1kns1fsJKzTVOaS/FJDJoK4qzgVS68xzJhYUMgTnbXW6z/T6rlP3lL7tJw==" + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-decorators" "^7.16.0" + +"@babel/plugin-proposal-dynamic-import@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz#783eca61d50526202f9b296095453977e88659f1" + integrity "sha1-eD7KYdUFJiAvmylglUU5d+iGWfE= sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz#9c01dee40b9d6b847b656aaf4a3976a71740f222" + integrity "sha1-nAHe5Auda4R7ZWqvSjl2pxdA8iI= sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz#cae35a95ed1d2a7fa29c4dc41540b84a72e9ab25" + integrity "sha1-yuNale0dKn+inE3EFUC4SnLpqyU= sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz#a711b8ceb3ffddd3ef88d3a49e86dbd3cc7db3fd" + integrity "sha1-pxG4zrP/3dPviNOknobb08x9s/0= sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz#44e1cce08fe2427482cf446a91bb451528ed0596" + integrity "sha1-ROHM4I/iQnSCz0RqkbtFFSjtBZY= sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz#5d418e4fbbf8b9b7d03125d3a52730433a373734" + integrity "sha1-XUGOT7v4ubfQMSXTpScwQzo3NzQ= sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz#5fb32f6d924d6e6712810362a60e12a2609872e6" + integrity "sha1-X7MvbZJNbmcSgQNipg4SomCYcuY= sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==" + dependencies: + "@babel/compat-data" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.16.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz#5910085811ab4c28b00d6ebffa4ab0274d1e5f16" + integrity "sha1-WRAIWBGrTCiwDW6/+kqwJ00eXxY= sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz#56dbc3970825683608e9efb55ea82c2a2d6c8dc0" + integrity "sha1-VtvDlwglaDYI6e+1XqgsKi1sjcA= sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz#b4dafb9c717e4301c5776b30d080d6383c89aff6" + integrity "sha1-tNr7nHF+QwHFd2sw0IDWODyJr/Y= sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==" + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-private-property-in-object@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz#69e935b2c5c79d2488112d886f0c4e2790fee76f" + integrity "sha1-aek1ssXHnSSIES2IbwxOJ5D+528= sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==" + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.16.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz#890482dfc5ea378e42e19a71e709728cabf18612" + integrity "sha1-iQSC38XqN45C4Zpx5wlyjKvxhhI= sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==" + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity "sha1-qYP7Gusuw/btBCohD2QOkOeG/g0= sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity "sha1-tcmHJ0xKOoK4lxR5aTGmtTVErhA= sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==" + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity "sha1-GV34mxRrS3izv4l/16JXyEZZ1AY= sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.0.tgz#eb8d811cdd1060f6ac3c00956bf3f6335505a32f" + integrity "sha1-642BHN0QYPasPACVa/P2M1UFoy8= sha512-nxnnngZClvlY13nHJAIDow0S7Qzhq64fQ/NlqS+VER3kjW/4F0jLhXjeL8jcwSwz6Ca3rotT5NJD2T9I7lcv7g==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity "sha1-Yr+Ysto80h1iYVT8lu5bPLaOrLM= sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity "sha1-AolkqbqA28CUyRXEh618TnpmRlo= sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==" + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity "sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo= sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.2.0", "@babel/plugin-syntax-jsx@^7.8.3": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz#f9624394317365a9a88c82358d3f8471154698f1" + integrity "sha1-+WJDlDFzZamojII1jT+EcRVGmPE= sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity "sha1-ypHvRjA1MESLkGZSusLp/plB9pk= sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==" + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity "sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak= sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity "sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c= sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==" + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity "sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE= sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity "sha1-YRGiZbz7Ag6579D9/X0mQCue1sE= sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity "sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io= sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity "sha1-DcZnHsDqIrbpShEU+FeXDNOd4a0= sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity "sha1-wc/a3DWmRiQAAfBhOCR7dBw02Uw= sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-arrow-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz#951706f8b449c834ed07bd474c0924c944b95a8e" + integrity "sha1-lRcG+LRJyDTtB71HTAkkyUS5Wo4= sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-async-to-generator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz#df12637f9630ddfa0ef9d7a11bc414d629d38604" + integrity "sha1-3xJjf5Yw3foO+dehG8QU1inThgQ= sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==" + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.16.0" + +"@babel/plugin-transform-block-scoped-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz#c618763233ad02847805abcac4c345ce9de7145d" + integrity "sha1-xhh2MjOtAoR4BavKxMNFzp3nFF0= sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-block-scoping@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz#bcf433fb482fe8c3d3b4e8a66b1c4a8e77d37c16" + integrity "sha1-vPQz+0gv6MPTtOimaxxKjnfTfBY= sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-classes@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz#54cf5ff0b2242c6573d753cd4bfc7077a8b282f5" + integrity "sha1-VM9f8LIkLGVz11PNS/xwd6iygvU= sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==" + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz#e0c385507d21e1b0b076d66bed6d5231b85110b7" + integrity "sha1-4MOFUH0h4bCwdtZr7W1SMbhRELc= sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-destructuring@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz#ad3d7e74584ad5ea4eadb1e6642146c590dee33c" + integrity "sha1-rT1+dFhK1epOrbHmZCFGxZDe4zw= sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-dotall-regex@^7.16.0", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz#50bab00c1084b6162d0a58a818031cf57798e06f" + integrity "sha1-ULqwDBCEthYtClioGAMc9XeY4G8= sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==" + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-duplicate-keys@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz#8bc2e21813e3e89e5e5bf3b60aa5fc458575a176" + integrity "sha1-i8LiGBPj6J5eW/O2CqX8RYV1oXY= sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-exponentiation-operator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz#a180cd2881e3533cef9d3901e48dad0fbeff4be4" + integrity "sha1-oYDNKIHjUzzvnTkB5I2tD77/S+Q= sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==" + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-for-of@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz#f7abaced155260e2461359bbc7c7248aca5e6bd2" + integrity "sha1-96us7RVSYOJGE1m7x8ckispea9I= sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-function-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz#02e3699c284c6262236599f751065c5d5f1f400e" + integrity "sha1-AuNpnChMYmIjZZn3UQZcXV8fQA4= sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==" + dependencies: + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz#79711e670ffceb31bd298229d50f3621f7980cac" + integrity "sha1-eXEeZw/86zG9KYIp1Q82IfeYDKw= sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-member-expression-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz#5251b4cce01eaf8314403d21aedb269d79f5e64b" + integrity "sha1-UlG0zOAer4MUQD0hrtsmnXn15ks= sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-modules-amd@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz#09abd41e18dcf4fd479c598c1cef7bd39eb1337e" + integrity "sha1-CavUHhjc9P1HnFmMHO97056xM34= sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==" + dependencies: + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.16.0", "@babel/plugin-transform-modules-commonjs@^7.9.6": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz#add58e638c8ddc4875bd9a9ecb5c594613f6c922" + integrity "sha1-rdWOY4yN3Eh1vZqey1xZRhP2ySI= sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==" + dependencies: + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.16.0" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz#a92cf240afeb605f4ca16670453024425e421ea4" + integrity "sha1-qSzyQK/rYF9MoWZwRTAkQl5CHqQ= sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==" + dependencies: + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-identifier" "^7.15.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz#195f26c2ad6d6a391b70880effce18ce625e06a7" + integrity "sha1-GV8mwq1tajkbcIgO/84YzmJeBqc= sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==" + dependencies: + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz#d3db61cc5d5b97986559967cd5ea83e5c32096ca" + integrity "sha1-09thzF1bl5hlWZZ81eqD5cMglso= sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==" + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + +"@babel/plugin-transform-new-target@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz#af823ab576f752215a49937779a41ca65825ab35" + integrity "sha1-r4I6tXb3UiFaSZN3eaQcplglqzU= sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-object-super@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz#fb20d5806dc6491a06296ac14ea8e8d6fedda72b" + integrity "sha1-+yDVgG3GSRoGKWrBTqjo1v7dpys= sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.16.0" + +"@babel/plugin-transform-parameters@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.0.tgz#1b50765fc421c229819dc4c7cdb8911660b3c2d7" + integrity "sha1-G1B2X8QhwimBncTHzbiRFmCzwtc= sha512-XgnQEm1CevKROPx+udOi/8f8TiGhrUWiHiaUCIp47tE0tpFDjzXNTZc9E5CmCwxNjXTWEVqvRfWZYOTFvMa/ZQ==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz#a95c552189a96a00059f6776dc4e00e3690c78d1" + integrity "sha1-qVxVIYmpagAFn2d23E4A42kMeNE= sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-regenerator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz#eaee422c84b0232d03aea7db99c97deeaf6125a4" + integrity "sha1-6u5CLISwIy0Drqfbmcl97q9hJaQ= sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==" + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz#fff4b9dcb19e12619394bda172d14f2d04c0379c" + integrity "sha1-//S53LGeEmGTlL2hctFPLQTAN5w= sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-runtime@^7.11.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.0.tgz#3fe0da36c2f0834bef7c4d3e7f2b2db0ee0c8909" + integrity "sha1-P+DaNsLwg0vvfE0+fystsO4MiQk= sha512-zlPf1/XFn5+vWdve3AAhf+Sxl+MVa5VlwTwWgnLx23u4GlatSRQJ3Eoo9vllf0a9il3woQsT4SK+5Z7c06h8ag==" + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-polyfill-corejs2 "^0.2.3" + babel-plugin-polyfill-corejs3 "^0.3.0" + babel-plugin-polyfill-regenerator "^0.2.3" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz#090372e3141f7cc324ed70b3daf5379df2fa384d" + integrity "sha1-CQNy4xQffMMk7XCz2vU3nfL6OE0= sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-spread@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz#d21ca099bbd53ab307a8621e019a7bd0f40cdcfb" + integrity "sha1-0hygmbvVOrMHqGIeAZp70PQM3Ps= sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz#c35ea31a02d86be485f6aa510184b677a91738fd" + integrity "sha1-w16jGgLYa+SF9qpRAYS2d6kXOP0= sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-template-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz#a8eced3a8e7b8e2d40ec4ec4548a45912630d302" + integrity "sha1-qOztOo57ji1A7E7EVIpFkSYw0wI= sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typeof-symbol@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz#8b19a244c6f8c9d668dca6a6f754ad6ead1128f2" + integrity "sha1-ixmiRMb4ydZo3Kam91Stbq0RKPI= sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-escapes@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz#1a354064b4c45663a32334f46fa0cf6100b5b1f3" + integrity "sha1-GjVAZLTEVmOjIzT0b6DPYQC1sfM= sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==" + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz#293b80950177c8c85aede87cef280259fb995402" + integrity "sha1-KTuAlQF3yMha7eh87ygCWfuZVAI= sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==" + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/preset-env@^7.11.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.0.tgz#97228393d217560d6a1c6c56f0adb9d12bca67f5" + integrity "sha1-lyKDk9IXVg1qHGxW8K250SvKZ/U= sha512-cdTu/W0IrviamtnZiTfixPfIncr2M1VqRrkjzZWlr1B4TVYimCFK5jkyOdP4qw2MrlKHi+b3ORj6x8GoCew8Dg==" + dependencies: + "@babel/compat-data" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.0" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-async-generator-functions" "^7.16.0" + "@babel/plugin-proposal-class-properties" "^7.16.0" + "@babel/plugin-proposal-class-static-block" "^7.16.0" + "@babel/plugin-proposal-dynamic-import" "^7.16.0" + "@babel/plugin-proposal-export-namespace-from" "^7.16.0" + "@babel/plugin-proposal-json-strings" "^7.16.0" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" + "@babel/plugin-proposal-numeric-separator" "^7.16.0" + "@babel/plugin-proposal-object-rest-spread" "^7.16.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-private-methods" "^7.16.0" + "@babel/plugin-proposal-private-property-in-object" "^7.16.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.16.0" + "@babel/plugin-transform-async-to-generator" "^7.16.0" + "@babel/plugin-transform-block-scoped-functions" "^7.16.0" + "@babel/plugin-transform-block-scoping" "^7.16.0" + "@babel/plugin-transform-classes" "^7.16.0" + "@babel/plugin-transform-computed-properties" "^7.16.0" + "@babel/plugin-transform-destructuring" "^7.16.0" + "@babel/plugin-transform-dotall-regex" "^7.16.0" + "@babel/plugin-transform-duplicate-keys" "^7.16.0" + "@babel/plugin-transform-exponentiation-operator" "^7.16.0" + "@babel/plugin-transform-for-of" "^7.16.0" + "@babel/plugin-transform-function-name" "^7.16.0" + "@babel/plugin-transform-literals" "^7.16.0" + "@babel/plugin-transform-member-expression-literals" "^7.16.0" + "@babel/plugin-transform-modules-amd" "^7.16.0" + "@babel/plugin-transform-modules-commonjs" "^7.16.0" + "@babel/plugin-transform-modules-systemjs" "^7.16.0" + "@babel/plugin-transform-modules-umd" "^7.16.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.0" + "@babel/plugin-transform-new-target" "^7.16.0" + "@babel/plugin-transform-object-super" "^7.16.0" + "@babel/plugin-transform-parameters" "^7.16.0" + "@babel/plugin-transform-property-literals" "^7.16.0" + "@babel/plugin-transform-regenerator" "^7.16.0" + "@babel/plugin-transform-reserved-words" "^7.16.0" + "@babel/plugin-transform-shorthand-properties" "^7.16.0" + "@babel/plugin-transform-spread" "^7.16.0" + "@babel/plugin-transform-sticky-regex" "^7.16.0" + "@babel/plugin-transform-template-literals" "^7.16.0" + "@babel/plugin-transform-typeof-symbol" "^7.16.0" + "@babel/plugin-transform-unicode-escapes" "^7.16.0" + "@babel/plugin-transform-unicode-regex" "^7.16.0" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.16.0" + babel-plugin-polyfill-corejs2 "^0.2.3" + babel-plugin-polyfill-corejs3 "^0.3.0" + babel-plugin-polyfill-regenerator "^0.2.3" + core-js-compat "^3.19.0" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity "sha1-75Odbn8miCfhhBY43G/5VRXhFdk= sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/runtime-corejs3@^7.10.2", "@babel/runtime-corejs3@^7.11.2", "@babel/runtime-corejs3@^7.14.7": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.16.0.tgz#58a7fb00e6948508f12f53a303993e8b6e2f6c70" + integrity "sha1-WKf7AOaUhQjxL1OjA5k+i24vbHA= sha512-Oi2qwQ21X7/d9gn3WiwkDTJmq3TQtYNz89lRnoFy8VeZpWlsyXvzSwiRrRZ8cXluvSwqKxqHJ6dBd9Rv+p0ZGQ==" + dependencies: + core-js-pure "^3.19.0" + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.8.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.0.tgz#e27b977f2e2088ba24748bf99b5e1dece64e4f0b" + integrity "sha1-4nuXfy4giLokdIv5m14d7OZOTws= sha512-Nht8L0O8YCktmsDV6FqFue7vQLRx3Hb0B37lS5y0jDRqRxlBG4wIJHnf9/bgSE2UyipKFA01YtS+npRdTWBUyw==" + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.0.0", "@babel/template@^7.16.0", "@babel/template@^7.4.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" + integrity "sha1-0Wo16/TNdOICCDNW+rId2JNj3dY= sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==" + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.0.tgz#965df6c6bfc0a958c1e739284d3c9fa4a6e3c45b" + integrity "sha1-ll32xr/AqVjB5zkoTTyfpKbjxFs= sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ==" + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/types" "^7.16.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" + integrity "sha1-2zsxOAT5aq3Qt3bEgj4SetZyibo= sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==" + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + to-fast-properties "^2.0.0" + +"@braintree/sanitize-url@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-5.0.2.tgz#b23080fa35520e993a8a37a0f5bca26aa4650a48" + integrity "sha1-sjCA+jVSDpk6ijeg9byiaqRlCkg= sha512-NBEJlHWrhQucLhZGHtSxM2loSaNUMajC7KOYJLyfcdW/6goVoff2HoYI3bz8YCDN0wKGbxtUL0gx2dvHpvnWlw==" + +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity "sha1-+GSuhQBND8q29QvpFBxNo2jRZWo= sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==" + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity "sha1-nkKYHvA1vrPdSa3ResuW6P9vOUw= sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==" + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@hapi/address@2.x.x": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" + integrity "sha1-XWftQ/P9QaadS5/3tW58DR0KgeU= sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" + +"@hapi/bourne@1.x.x": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" + integrity "sha1-CnCVreoGckPOMoPhtWuKj0U7JCo= sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" + +"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" + integrity "sha1-/elgZMpEbeyMVajC8TCVewcMbgY= sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" + +"@hapi/joi@^15.0.0", "@hapi/joi@^15.0.1": + version "15.1.1" + resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" + integrity "sha1-xnW4pxKW8Cgz+NbSQ7NMV7jOGdc= sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==" + dependencies: + "@hapi/address" "2.x.x" + "@hapi/bourne" "1.x.x" + "@hapi/hoek" "8.x.x" + "@hapi/topo" "3.x.x" + +"@hapi/topo@3.x.x": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + integrity "sha1-aNk1+j6uf91asNf5U/MgXYsr/Ck= sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==" + dependencies: + "@hapi/hoek" "^8.3.0" + +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity "sha1-FAeWfUxu7Nc4j4Os8er00Mbljvk= sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==" + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity "sha1-tSBSnsIdjllFoYUd/Rwy6U45/0U= sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + +"@intervolga/optimize-cssnano-plugin@^1.0.5": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz#be7c7846128b88f6a9b1d1261a0ad06eb5c0fdf8" + integrity "sha1-vnx4RhKLiPapsdEmGgrQbrXA/fg= sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==" + dependencies: + cssnano "^4.0.0" + cssnano-preset-default "^4.0.0" + postcss "^7.0.0" + +"@jest/console@^24.7.1", "@jest/console@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity "sha1-ebG8Bvt0qM+wHL3t+UVYSxuXB/A= sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==" + dependencies: + "@jest/source-map" "^24.9.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" + integrity "sha1-LOzNC5MYH5xIUOdPKprUPTUTacQ= sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==" + dependencies: + "@jest/console" "^24.7.1" + "@jest/reporters" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.9.0" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-resolve-dependencies "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + jest-watcher "^24.9.0" + micromatch "^3.1.10" + p-each-series "^1.0.0" + realpath-native "^1.1.0" + rimraf "^2.5.4" + slash "^2.0.0" + strip-ansi "^5.0.0" + +"@jest/environment@^24.3.0", "@jest/environment@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" + integrity "sha1-IeOvotZcBYbL1svv4gi6+t5Eqxg= sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==" + dependencies: + "@jest/fake-timers" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + +"@jest/fake-timers@^24.3.0", "@jest/fake-timers@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + integrity "sha1-uj5r8O7NCaY2BJiWQ00wZjZUDJM= sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==" + dependencies: + "@jest/types" "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + +"@jest/reporters@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" + integrity "sha1-hmYO/44rlmHQQqjpigKLjWMaW0M= sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==" + dependencies: + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.1" + istanbul-reports "^2.2.6" + jest-haste-map "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + node-notifier "^5.4.2" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity "sha1-DiY6lEML5LQdpoPMwea//ioZFxQ= sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==" + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity "sha1-EXluiqnb+I6gJXV7MVJZWtBroMo= sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==" + dependencies: + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-sequencer@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" + integrity "sha1-+PM081tiWk8vNV8v5+YDba0uazE= sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==" + dependencies: + "@jest/test-result" "^24.9.0" + jest-haste-map "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + +"@jest/transform@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" + integrity "sha1-SuJ2iyllU/rasJ6ewRlUPJCxbFY= sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==" + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.9.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.9.0" + jest-regex-util "^24.9.0" + jest-util "^24.9.0" + micromatch "^3.1.10" + pirates "^4.0.1" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.3.0", "@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity "sha1-Y8smy3UA0Gnlo4lEGnxqtekJ/Fk= sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==" + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity "sha1-vvWlMgMOHYii9abZM/hOlyJu1I4= sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==" + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@koumoul/vjsf@2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@koumoul/vjsf/-/vjsf-2.0.3.tgz#499c1e80513269b32bbf5836ebf393126242897e" + integrity "sha1-SZwegFEyabMrv1g26/OTEmJCiX4= sha512-JuQ+WBDDUuTudk2vqtsCt7CBRGVgd6wg+TvTjozo4E9irvKSK+HquAYqUTvYVJN+yJ4K2DaC/x8fagTOgR2EYQ==" + dependencies: + "@mdi/js" "^5.5.55" + ajv "^6.12.0" + debounce "^1.2.0" + fast-copy "^2.1.1" + fast-equals "^2.0.0" + markdown-it "^8.4.2" + match-all "^1.2.5" + object-hash "^2.1.1" + property-expr "^1.5.1" + vuedraggable "^2.24.3" + +"@kyleshockey/object-assign-deep@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@kyleshockey/object-assign-deep/-/object-assign-deep-0.4.2.tgz#84900f0eefc372798f4751b5262830b8208922ec" + integrity "sha1-hJAPDu/DcnmPR1G1JigwuCCJIuw= sha512-GWZ8omROOrXe4/T4wsKfq86E0efACDG+mghGoz0nWY/THVmt8O/vSpc1YqRBlvBnprhMcL4OrRjM7R/FyKcMJw==" + +"@kyleshockey/xml@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@kyleshockey/xml/-/xml-1.0.2.tgz#81fad3d7c33da2ba2639db095db3db24c2921f70" + integrity "sha1-gfrT18M9oromOdsJXbPbJMKSH3A= sha512-iMo32MPLcI9cPxs3YL5kmKxKgDmkSZDCFEqIT5eRk7d/Ll8r4X3SwGYSigzALd6+RHWlFEmjL1QyaQ15xDZFlw==" + dependencies: + stream "^0.0.2" + +"@mdi/font@5.9.55": + version "5.9.55" + resolved "https://registry.yarnpkg.com/@mdi/font/-/font-5.9.55.tgz#41acd50b88073ded7095fc3029d8712b6e12f38e" + integrity "sha1-QazVC4gHPe1wlfwwKdhxK24S844= sha512-jswRF6q3eq8NWpWiqct6q+6Fg/I7nUhrxYJfiEM8JJpap0wVJLQdbKtyS65GdlK7S7Ytnx3TTi/bmw+tBhkGmg==" + +"@mdi/js@^5.5.55": + version "5.9.55" + resolved "https://registry.yarnpkg.com/@mdi/js/-/js-5.9.55.tgz#8f5bc4d924c23f30dab20545ddc768e778bbc882" + integrity "sha1-j1vE2STCPzDasgVF3cdo53i7yII= sha512-BbeHMgeK2/vjdJIRnx12wvQ6s8xAYfvMmEAVsUx9b+7GiQGQ9Za8jpwp17dMKr9CgKRvemlAM4S7S3QOtEbp4A==" + +"@mdi/util@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@mdi/util/-/util-0.3.2.tgz#8964f14ad86f9a355042824553958cc01a94886f" + integrity "sha1-iWTxSthvmjVQQoJFU5WMwBqUiG8= sha512-0ICbKIcsI+OYSqz6SWsYVJA6+kM+irQQiwYGBtJlq0a0sI0JrB2bCrc4S/xVfexqwa1EG8dlSY/ohsQllEXnyQ==" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity "sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4= sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==" + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity "sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U= sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity "sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos= sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity "sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs= sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity "sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po= sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@simonwep/pickr@~1.7.0": + version "1.7.4" + resolved "https://registry.yarnpkg.com/@simonwep/pickr/-/pickr-1.7.4.tgz#b14fcd945890388b870cd6db4d6c78d531f25141" + integrity "sha1-sU/NlFiQOIuHDNbbTWx41THyUUE= sha512-fq7jgKJT21uWGC1mARBHvvd1JYlEf93o7SuVOB4Lr0x/2UPuNC9Oe9n/GzVeg4oVtqMDfh1wIEJpsdOJEZb+3g==" + dependencies: + core-js "^3.6.5" + nanopop "^2.1.0" + +"@soda/friendly-errors-webpack-plugin@^1.7.1": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.0.tgz#84751d82a93019d5c92c0cf0e45ac59087cd2240" + integrity "sha1-hHUdgqkwGdXJLAzw5FrFkIfNIkA= sha512-RLotfx6k1+nfLacwNCenj7VnTMPxVwYKoGOcffMFoJDKM8tXzBiCN0hMHFJNnoAojduYAsxuiMm0EOMixgiRow==" + dependencies: + chalk "^2.4.2" + error-stack-parser "^2.0.2" + string-width "^2.0.0" + strip-ansi "^5" + +"@soda/get-current-script@^1.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@soda/get-current-script/-/get-current-script-1.0.2.tgz#a53515db25d8038374381b73af20bb4f2e508d87" + integrity "sha1-pTUV2yXYA4N0OBtzryC7Ty5QjYc= sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==" + +"@testing-library/dom@^7.26.6": + version "7.31.2" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.31.2.tgz#df361db38f5212b88555068ab8119f5d841a8c4a" + integrity "sha1-3zYds49SEriFVQaKuBGfXYQajEo= sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==" + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^4.2.0" + aria-query "^4.2.2" + chalk "^4.1.0" + dom-accessibility-api "^0.5.6" + lz-string "^1.4.4" + pretty-format "^26.6.2" + +"@testing-library/vue@^5.6.2": + version "5.8.2" + resolved "https://registry.yarnpkg.com/@testing-library/vue/-/vue-5.8.2.tgz#976b2179dc28ceba8dd63b5437edc2749f860252" + integrity "sha1-l2shedwozrqN1jtUN+3CdJ+GAlI= sha512-evsQjLw3T/c92ZsXflZMzSN72P06VlgUZMIcrRKn5n9ZX7QgQyebB3DgdmPACf6JgNfP8Y3Lm2212FmeMnWlZw==" + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^7.26.6" + "@vue/test-utils" "^1.1.0" + +"@transloadit/prettier-bytes@0.0.7": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz#cdb5399f445fdd606ed833872fa0cabdbc51686b" + integrity "sha1-zbU5n0Rf3WBu2DOHL6DKvbxRaGs= sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==" + +"@types/aria-query@^4.2.0": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" + integrity "sha1-7U4K2SMGpwT5+xMqDPz3dIbb4rw= sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==" + +"@types/babel__core@^7.1.0": + version "7.1.16" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702" + integrity "sha1-vBLHS31l6C0ph2tdC69cYlrFhwI= sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==" + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" + integrity "sha1-9Fa0ss55E392iqEw0kI9LwzPq6U= sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==" + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity "sha1-PRpI/Z1sDt/Vby/1eNrtSPNsiWk= sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==" + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" + integrity "sha1-/81HC7s/i/MEgWePtVAieMqDOkM= sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==" + dependencies: + "@babel/types" "^7.3.0" + +"@types/body-parser@*": + version "1.19.1" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.1.tgz#0c0174c42a7d017b818303d4b5d969cb0b75929c" + integrity "sha1-DAF0xCp9AXuBgwPUtdlpywt1kpw= sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==" + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/chart.js@^2.7.55": + version "2.9.34" + resolved "https://registry.yarnpkg.com/@types/chart.js/-/chart.js-2.9.34.tgz#d41fb6b74b72a56bac70255bb4ed087386b66ed6" + integrity "sha1-1B+2t0typWuscCVbtO0Ic4a2btY= sha512-CtZVk+kh1IN67dv+fB0CWmCLCRrDJgqOj15qPic2B1VCMovNO6B7Vhf/TgPpNscjhAL1j+qUntDMWb9A4ZmPTg==" + dependencies: + moment "^2.10.2" + +"@types/connect-history-api-fallback@*": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + integrity "sha1-0feooJ0O1aV67lrpwYq5uAMgXa4= sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==" + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity "sha1-X89q5EXkAh0fwiGaSHPMc6O7KtE= sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==" + dependencies: + "@types/node" "*" + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": + version "4.17.24" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz#ea41f93bf7e0d59cd5a76665068ed6aab6815c07" + integrity "sha1-6kH5O/fg1ZzVp2ZlBo7WqraBXAc= sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==" + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity "sha1-p24plXKJmbq1GjP6vOHXBaNwkDQ= sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==" + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity "sha1-vBtb86qS8lvV3TnzXFc2G9zlsus= sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==" + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/hast@^2.0.0": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" + integrity "sha1-iqXvksEX0g2XSoK9+2pkiwjAuvw= sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==" + dependencies: + "@types/unist" "*" + +"@types/http-proxy@^1.17.5": + version "1.17.7" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.7.tgz#30ea85cc2c868368352a37f0d0d3581e24834c6f" + integrity "sha1-MOqFzCyGg2g1Kjfw0NNYHiSDTG8= sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==" + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity "sha1-S6jdtyAiH0MuRDvV+RF/0iz9R2I= sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity "sha1-wUwk8Y6oGQwRjudWK3/5mjZVJoY= sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==" + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity "sha1-6HXMaJ5HvOVJ7IHz315vbxHPrrI= sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==" + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity "sha1-kVP+mLuivVZaY63ZQ21vDX+EaP8= sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==" + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^24.0.19": + version "24.9.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.9.1.tgz#02baf9573c78f1b9974a5f36778b366aa77bd534" + integrity "sha1-Arr5Vzx48bmXSl82d4s2aqd71TQ= sha512-Fb38HkXSVA4L8fGKEZ6le5bB8r6MRWlOCZbVuWZcmOMSCd2wCYOwN1ibj8daIoV9naq7aaOZjrLCoCMptKU/4Q==" + dependencies: + jest-diff "^24.3.0" + +"@types/jest@^26.0.23": + version "26.0.24" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.24.tgz#943d11976b16739185913a1936e0de0c4a7d595a" + integrity "sha1-lD0Rl2sWc5GFkToZNuDeDEp9WVo= sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==" + dependencies: + jest-diff "^26.0.0" + pretty-format "^26.0.0" + +"@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity "sha1-l+3JA36gw4WFMgsolk3eOznkZg0= sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" + +"@types/lodash@^4.14.168": + version "4.14.176" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.176.tgz#641150fc1cda36fbfa329de603bbb175d7ee20c0" + integrity "sha1-ZBFQ/BzaNvv6Mp3mA7uxddfuIMA= sha512-xZmuPTa3rlZoIbtDUyJKZQimJV3bxCmzMIO2c9Pz9afyDro6kr7R79GwcB6mRhuoPmV2p1Vb66WOJH7F886WKQ==" + +"@types/luxon@^1.27.0": + version "1.27.1" + resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-1.27.1.tgz#aceeb2d5be8fccf541237e184e37ecff5faa9096" + integrity "sha1-rO6y1b6PzPVBI34YTjfs/1+qkJY= sha512-cPiXpOvPFDr2edMnOXlz3UBDApwUfR+cpizvxCy0n3vp9bz/qe8BWzHPIEFcy+ogUOyjKuCISgyq77ELZPmkkg==" + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity "sha1-k+Jb+e51/g/YC1lLxP6w6GIRG1o= sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + +"@types/minimatch@*": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity "sha1-EAHMXmo3BLg8I2An538vWOoBD0A= sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + +"@types/minimist@^1.2.0": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + integrity "sha1-7nceK6Sz3Fs3KTXVSf2WF780W4w= sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==" + +"@types/node@*": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity "sha1-a+96KgrWhM9ukPz+Mc7KvZzgo64= sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==" + +"@types/normalize-package-data@^2.4.0": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity "sha1-0zV0eaD9/dWQf+Z+F+CoXJBuEwE= sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity "sha1-L4u0QUNNFjs1+4/9zNcTiSf/uMA= sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + +"@types/prismjs@^1.16.5": + version "1.16.6" + resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.16.6.tgz#377054f72f671b36dbe78c517ce2b279d83ecc40" + integrity "sha1-N3BU9y9nGzbb54xRfOKyedg+zEA= sha512-dTvnamRITNqNkqhlBd235kZl3KfVJQQoT5jkXeiWSBK7i4/TLKBNLV0S1wOt8gy4E2TY722KLtdmv2xc6+Wevg==" + +"@types/q@^1.5.1": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" + integrity "sha1-daKo59irSyMEFFBdkjNdHctTpt8= sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity "sha1-Y7t9Bn2xB8weRXwwO8JdUR/r9ss= sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity "sha1-zWZ7z90CUhOq+3ylkVqTJZCs3Nw= sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + +"@types/serve-static@*": + version "1.13.10" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity "sha1-9eDOh5fS18xevtpIpSyWxPpHqNk= sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==" + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/source-list-map@*": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + integrity "sha1-AHiDYGP/rxdBI0m7o2QIfgrALsk= sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity "sha1-CoUdO9lkmPolwzq3J47TvWXwbD4= sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" + +"@types/strip-bom@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" + integrity "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==" + +"@types/strip-json-comments@0.0.30": + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" + integrity "sha1-mqMMBNshKpoGSdaub9UKzMQHSKE= sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==" + +"@types/tapable@^1": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" + integrity "sha1-uUpDkchWZse3Mpn9OtedT6pDUxA= sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==" + +"@types/uglify-js@*": + version "3.13.1" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" + integrity "sha1-XoienoHpQkXHW2RQYA4cXqKHiuo= sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==" + dependencies: + source-map "^0.6.1" + +"@types/unist@*": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + integrity "sha1-JQp7FsO5H2cqJFUuxkZ47rHToI0= sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + +"@types/vue-markdown@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@types/vue-markdown/-/vue-markdown-2.2.1.tgz#dd302c67349e0e591d3fcb84e924eb8bf9314fea" + integrity "sha1-3TAsZzSeDlkdP8uE6STri/kxT+o= sha512-pqa1RU0GZybdtqqadOWT8rTwMSchH1PR+oYeenscTT8Nrq/gniL7hpibhH40+aZBjx3Ps0syaTSiSae4Inw7GQ==" + dependencies: + vue "^2.5.16" + +"@types/webpack-dev-server@^3.11.0": + version "3.11.6" + resolved "https://registry.yarnpkg.com/@types/webpack-dev-server/-/webpack-dev-server-3.11.6.tgz#d8888cfd2f0630203e13d3ed7833a4d11b8a34dc" + integrity "sha1-2IiM/S8GMCA+E9PteDOk0RuKNNw= sha512-XCph0RiiqFGetukCTC3KVnY1jwLcZ84illFRMbyFzCcWl90B/76ew0tSqF46oBhnLC4obNDG7dMO0JfTN0MgMQ==" + dependencies: + "@types/connect-history-api-fallback" "*" + "@types/express" "*" + "@types/serve-static" "*" + "@types/webpack" "^4" + http-proxy-middleware "^1.0.0" + +"@types/webpack-env@^1.15.2": + version "1.16.3" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.16.3.tgz#b776327a73e561b71e7881d0cd6d34a1424db86a" + integrity "sha1-t3YyenPlYbceeIHQzW00oUJNuGo= sha512-9gtOPPkfyNoEqCQgx4qJKkuNm/x0R2hKR7fdl7zvTJyHnIisuE/LfvXOsYWL0o3qq6uiBnKZNNNzi3l0y/X+xw==" + +"@types/webpack-sources@*": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b" + integrity "sha1-FtdZuglsKJA0smVT0t8b9FJI04s= sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==" + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.7.3" + +"@types/webpack@^4", "@types/webpack@^4.0.0": + version "4.41.31" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.31.tgz#c35f252a3559ddf9c85c0d8b0b42019025e581aa" + integrity "sha1-w18lKjVZ3fnIXA2LC0IBkCXlgao= sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==" + dependencies: + "@types/node" "*" + "@types/tapable" "^1" + "@types/uglify-js" "*" + "@types/webpack-sources" "*" + anymatch "^3.0.0" + source-map "^0.6.0" + +"@types/yargs-parser@*": + version "20.2.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" + integrity "sha1-O5ziSJkZ2eT+pDm3aRarw0st8Sk= sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" + +"@types/yargs@^13.0.0": + version "13.0.12" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092" + integrity "sha1-2JWojHA7eK8EZaneiKqSxhQwsJI= sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==" + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^15.0.0": + version "15.0.14" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" + integrity "sha1-Jtgh3biecEkhYLZtEKDrbfj2+wY= sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==" + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^4.22.1": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" + integrity "sha1-wk3HyAacdwa8QNmfb6h+3LIAUnY= sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==" + dependencies: + "@typescript-eslint/experimental-utils" "4.33.0" + "@typescript-eslint/scope-manager" "4.33.0" + debug "^4.3.1" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.1.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@4.33.0", "@typescript-eslint/experimental-utils@^4.0.1": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" + integrity "sha1-byp4akIJ+iIimJ6TgLUzGygQ9/0= sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==" + dependencies: + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.33.0" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/typescript-estree" "4.33.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/parser@^4.22.1": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" + integrity "sha1-3+eXVw2WlOVgUo0Y7srYbIx0SJk= sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==" + dependencies: + "@typescript-eslint/scope-manager" "4.33.0" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/typescript-estree" "4.33.0" + debug "^4.3.1" + +"@typescript-eslint/scope-manager@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" + integrity "sha1-045JKA2YPody4pEhz4xukiHygKM= sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==" + dependencies: + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + +"@typescript-eslint/types@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" + integrity "sha1-oeWQNqO1OuhDDO6/KpGdx/mvbXI= sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==" + +"@typescript-eslint/typescript-estree@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" + integrity "sha1-DftRwpCPaMXAjYKu/q8WahfCRgk= sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==" + dependencies: + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + debug "^4.3.1" + globby "^11.0.3" + is-glob "^4.0.1" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" + integrity "sha1-KiL3ekFgQom3oYZYbp7EjKku8d0= sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==" + dependencies: + "@typescript-eslint/types" "4.33.0" + eslint-visitor-keys "^2.0.0" + +"@uppy/companion-client@^1.10.2": + version "1.10.2" + resolved "https://registry.yarnpkg.com/@uppy/companion-client/-/companion-client-1.10.2.tgz#a640b3ef90b91751c49bf4b6a7a63c2ebac294f6" + integrity "sha1-pkCz75C5F1HEm/S2p6Y8LrrClPY= sha512-5RmsNF9UBvUqmqQz48SoiLvkpGmvQTgwNM4bJX8xwVozv/6goRpFrsMJGLwqFcHS/9xj6STKOqrM582g8exVwQ==" + dependencies: + "@uppy/utils" "^3.6.2" + namespace-emitter "^2.0.1" + qs-stringify "^1.1.0" + url-parse "^1.4.7" + +"@uppy/core@^1.18.0": + version "1.20.1" + resolved "https://registry.yarnpkg.com/@uppy/core/-/core-1.20.1.tgz#23ca28d4388c29987fdc4e65a968474dcdc303c6" + integrity "sha1-I8oo1DiMKZh/3E5lqWhHTc3DA8Y= sha512-Z0yGixSNOSMgT/2aLylXQaEBB6X32RqGLQUgDJDK08jI0ZcMha5glNhD2RU1Gs9noQOAR/f7QwBssSnYJUNRfg==" + dependencies: + "@transloadit/prettier-bytes" "0.0.7" + "@uppy/store-default" "^1.2.7" + "@uppy/utils" "^3.6.2" + cuid "^2.1.1" + lodash.throttle "^4.1.1" + mime-match "^1.0.2" + namespace-emitter "^2.0.1" + preact "8.2.9" + +"@uppy/dashboard@^1.21.1": + version "1.21.1" + resolved "https://registry.yarnpkg.com/@uppy/dashboard/-/dashboard-1.21.1.tgz#c920d3af69b61413ef109608dde9b12d3c8a434b" + integrity "sha1-ySDTr2m2FBPvEJYI3emxLTyKQ0s= sha512-psMwBVxxhAZxYkRds4e//+Sx3zkFYRnYpt4jaF4hmwpL9SehlyhQKwaB/scZz/O4yshmgTN8Sri0mYK5FSh5SQ==" + dependencies: + "@transloadit/prettier-bytes" "0.0.7" + "@uppy/informer" "^1.6.6" + "@uppy/provider-views" "^1.12.3" + "@uppy/status-bar" "^1.9.6" + "@uppy/thumbnail-generator" "^1.7.11" + "@uppy/utils" "^3.6.2" + classnames "^2.2.6" + cuid "^2.1.1" + is-shallow-equal "^1.0.1" + lodash.debounce "^4.0.8" + lodash.throttle "^4.1.1" + memoize-one "^5.0.4" + preact "8.2.9" + resize-observer-polyfill "^1.5.0" + +"@uppy/drag-drop@^1.4.31": + version "1.4.31" + resolved "https://registry.yarnpkg.com/@uppy/drag-drop/-/drag-drop-1.4.31.tgz#fe342e2d653c8454c8dd9be1e95dbed5726772a6" + integrity "sha1-/jQuLWU8hFTI3Zvh6V2+1XJncqY= sha512-a9/WKOdAhz9mfFYI9JJNEGLP3TI8RQChndpFkjlxbsD82x2WHSB1TyWTslMdSCK6Ed3pV5IYyBVqDGsTqgveYg==" + dependencies: + "@uppy/utils" "^3.6.2" + preact "8.2.9" + +"@uppy/informer@^1.6.6": + version "1.6.6" + resolved "https://registry.yarnpkg.com/@uppy/informer/-/informer-1.6.6.tgz#94090ab74997f10c2a2151c04b1c75484bdfe7eb" + integrity "sha1-lAkKt0mX8QwqIVHASxx1SEvf5+s= sha512-9rZoAqNrKQN/HINnGg8rGnKEliLgc+9/tQQ0f9QcBgRIu/rnbBCTwS+qnGGdjYBdEJTSbHx+U7X9ufjrrjB+CA==" + dependencies: + "@uppy/utils" "^3.6.2" + preact "8.2.9" + +"@uppy/progress-bar@^1.3.30": + version "1.3.30" + resolved "https://registry.yarnpkg.com/@uppy/progress-bar/-/progress-bar-1.3.30.tgz#5bdbc8aab782df15def535c6be47d45ca07964da" + integrity "sha1-W9vIqreC3xXe9TXGvkfUXKB5ZNo= sha512-MAn20wBMzKc1p9M/Mot4+bV/707EO/DVgoFcvoP8rmA5oZOGMINpvFGR+rUtWQoBFMvKtvs/Wkp8mcR22rCMrw==" + dependencies: + "@uppy/utils" "^3.6.2" + preact "8.2.9" + +"@uppy/provider-views@^1.12.3": + version "1.12.3" + resolved "https://registry.yarnpkg.com/@uppy/provider-views/-/provider-views-1.12.3.tgz#aecfed615bc174abc548539a3c17b39e455aed0e" + integrity "sha1-rs/tYVvBdKvFSFOaPBeznkVa7Q4= sha512-r2kra3IftmGLeKMEgZbmQM1qXixulWUUzydgpHcZqJOpeNIjJcpspJruYRctrVqaLz/8asw87V4KxDk0U4xGzw==" + dependencies: + "@uppy/utils" "^3.6.2" + classnames "^2.2.6" + preact "8.2.9" + +"@uppy/status-bar@^1.9.6": + version "1.9.6" + resolved "https://registry.yarnpkg.com/@uppy/status-bar/-/status-bar-1.9.6.tgz#a04f699444fc7f156c260e5b7c001125e5190a5f" + integrity "sha1-oE9plET8fxVsJg5bfAARJeUZCl8= sha512-U/KPs5SwZ5d4hJFiCNAdriGHSk1Uhrl+iQmpJS8hoM+8r8rPfwScdua2/ehLuH69Ymwp6k7DpK2DU7UG2XZ+ag==" + dependencies: + "@transloadit/prettier-bytes" "0.0.7" + "@uppy/utils" "^3.6.2" + classnames "^2.2.6" + lodash.throttle "^4.1.1" + preact "8.2.9" + +"@uppy/store-default@^1.2.7": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@uppy/store-default/-/store-default-1.2.7.tgz#41a0b1579f4d5b86c236e7f5e52fdc01960bb011" + integrity "sha1-QaCxV59NW4bCNuf15S/cAZYLsBE= sha512-58IG9yk/i/kYQ9uEwAwMFl1H2V3syOoODrYoFfVHlxaqv+9MkXBg2tHE2gk40iaAIxcCErcPxZkBOvkqzO1SQA==" + +"@uppy/thumbnail-generator@^1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@uppy/thumbnail-generator/-/thumbnail-generator-1.7.11.tgz#c6f49be90469f220a419ac43c129bf835cc11c41" + integrity "sha1-xvSb6QRp8iCkGaxDwSm/g1zBHEE= sha512-qo9ZD8ByDMM6gIJ4JPN0V/dWlruYMhmYifhUvDUu0qhPAOTJAqh2hLQ+dlmUXTns8RnDorCXScreICSQ09FuLQ==" + dependencies: + "@uppy/utils" "^3.6.2" + exifr "^6.0.0" + math-log2 "^1.0.1" + +"@uppy/tus@^1.8.7": + version "1.9.2" + resolved "https://registry.yarnpkg.com/@uppy/tus/-/tus-1.9.2.tgz#d6e4fa715bc386daa8e7be6e80eb93e4f2abb46e" + integrity "sha1-1uT6cVvDhtqo575ugOuT5PKrtG4= sha512-ejaczrrh6w514XGd3kiDD1PJ8tIgmnV50fuyRwsybDj8HQheKAEu6GsJjxcnctP8NcSx4HNDhazVLPj6+A4p9Q==" + dependencies: + "@uppy/companion-client" "^1.10.2" + "@uppy/utils" "^3.6.2" + tus-js-client "^2.1.1" + +"@uppy/utils@^3.6.2": + version "3.6.2" + resolved "https://registry.yarnpkg.com/@uppy/utils/-/utils-3.6.2.tgz#78b02455b9c469d927d22736be5b68cda2600826" + integrity "sha1-eLAkVbnEadkn0ic2vltozaJgCCY= sha512-wGTZma7eywIojfuE1vXlT0fxPSpmCRMkfgFWYc+6TL2FfGqWInmePoB+yal6/M2AnjeKHz6XYMhIpZkjOxFvcw==" + dependencies: + abortcontroller-polyfill "^1.4.0" + lodash.throttle "^4.1.1" + +"@uppy/vue@^0.2.1": + version "0.2.7" + resolved "https://registry.yarnpkg.com/@uppy/vue/-/vue-0.2.7.tgz#9bb1f589d9ff79994f9bc7b5a99b6a9be929736a" + integrity "sha1-m7H1idn/eZlPm8e1qZtqm+kpc2o= sha512-5sqRD7XOkq+dZUUHN6dA61swFlIMJfk4L8IaWV9CB+e3Jmaujzw0yIlNqhjra2hzzRt2AZmf0yKgHf3NeCd1UQ==" + dependencies: + "@uppy/dashboard" "^1.21.1" + "@uppy/drag-drop" "^1.4.31" + "@uppy/progress-bar" "^1.3.30" + "@uppy/status-bar" "^1.9.6" + shallow-equal "^1.2.1" + +"@vue/babel-helper-vue-jsx-merge-props@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz#31624a7a505fb14da1d58023725a4c5f270e6a81" + integrity "sha1-MWJKelBfsU2h1YAjclpMXycOaoE= sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA==" + +"@vue/babel-helper-vue-transform-on@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz#9b9c691cd06fc855221a2475c3cc831d774bc7dc" + integrity "sha1-m5xpHNBvyFUiGiR1w8yDHXdLx9w= sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==" + +"@vue/babel-plugin-jsx@^1.0.3": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz#0c5bac27880d23f89894cd036a37b55ef61ddfc1" + integrity "sha1-DFusJ4gNI/iYlM0Daje1XvYd38E= sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + "@vue/babel-helper-vue-transform-on" "^1.0.2" + camelcase "^6.0.0" + html-tags "^3.1.0" + svg-tags "^1.0.0" + +"@vue/babel-plugin-transform-vue-jsx@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz#646046c652c2f0242727f34519d917b064041ed7" + integrity "sha1-ZGBGxlLC8CQnJ/NFGdkXsGQEHtc= sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + "@vue/babel-helper-vue-jsx-merge-props" "^1.2.1" + html-tags "^2.0.0" + lodash.kebabcase "^4.1.1" + svg-tags "^1.0.0" + +"@vue/babel-preset-app@^4.5.15": + version "4.5.15" + resolved "https://registry.yarnpkg.com/@vue/babel-preset-app/-/babel-preset-app-4.5.15.tgz#f6bc08f8f674e98a260004234cde18b966d72eb0" + integrity "sha1-9rwI+PZ06YomAAQjTN4YuWbXLrA= sha512-J+YttzvwRfV1BPczf8r3qCevznYk+jh531agVF+5EYlHF4Sgh/cGXTz9qkkiux3LQgvhEGXgmCteg1n38WuuKg==" + dependencies: + "@babel/core" "^7.11.0" + "@babel/helper-compilation-targets" "^7.9.6" + "@babel/helper-module-imports" "^7.8.3" + "@babel/plugin-proposal-class-properties" "^7.8.3" + "@babel/plugin-proposal-decorators" "^7.8.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.11.0" + "@babel/preset-env" "^7.11.0" + "@babel/runtime" "^7.11.0" + "@vue/babel-plugin-jsx" "^1.0.3" + "@vue/babel-preset-jsx" "^1.2.4" + babel-plugin-dynamic-import-node "^2.3.3" + core-js "^3.6.5" + core-js-compat "^3.6.5" + semver "^6.1.0" + +"@vue/babel-preset-jsx@^1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz#92fea79db6f13b01e80d3a0099e2924bdcbe4e87" + integrity "sha1-kv6nnbbxOwHoDToAmeKSS9y+Toc= sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w==" + dependencies: + "@vue/babel-helper-vue-jsx-merge-props" "^1.2.1" + "@vue/babel-plugin-transform-vue-jsx" "^1.2.1" + "@vue/babel-sugar-composition-api-inject-h" "^1.2.1" + "@vue/babel-sugar-composition-api-render-instance" "^1.2.4" + "@vue/babel-sugar-functional-vue" "^1.2.2" + "@vue/babel-sugar-inject-h" "^1.2.2" + "@vue/babel-sugar-v-model" "^1.2.3" + "@vue/babel-sugar-v-on" "^1.2.3" + +"@vue/babel-sugar-composition-api-inject-h@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz#05d6e0c432710e37582b2be9a6049b689b6f03eb" + integrity "sha1-BdbgxDJxDjdYKyvppgSbaJtvA+s= sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ==" + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-composition-api-render-instance@^1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.4.tgz#e4cbc6997c344fac271785ad7a29325c51d68d19" + integrity "sha1-5MvGmXw0T6wnF4WteikyXFHWjRk= sha512-joha4PZznQMsxQYXtR3MnTgCASC9u3zt9KfBxIeuI5g2gscpTsSKRDzWQt4aqNIpx6cv8On7/m6zmmovlNsG7Q==" + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-functional-vue@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.2.tgz#267a9ac8d787c96edbf03ce3f392c49da9bd2658" + integrity "sha1-JnqayNeHyW7b8Dzj85LEnam9Jlg= sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w==" + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-inject-h@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.2.tgz#d738d3c893367ec8491dcbb669b000919293e3aa" + integrity "sha1-1zjTyJM2fshJHcu2abAAkZKT46o= sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw==" + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@vue/babel-sugar-v-model@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.3.tgz#fa1f29ba51ebf0aa1a6c35fa66d539bc459a18f2" + integrity "sha1-+h8pulHr8KoabDX6ZtU5vEWaGPI= sha512-A2jxx87mySr/ulAsSSyYE8un6SIH0NWHiLaCWpodPCVOlQVODCaSpiR4+IMsmBr73haG+oeCuSvMOM+ttWUqRQ==" + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + "@vue/babel-helper-vue-jsx-merge-props" "^1.2.1" + "@vue/babel-plugin-transform-vue-jsx" "^1.2.1" + camelcase "^5.0.0" + html-tags "^2.0.0" + svg-tags "^1.0.0" + +"@vue/babel-sugar-v-on@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.3.tgz#342367178586a69f392f04bfba32021d02913ada" + integrity "sha1-NCNnF4WGpp85LwS/ujICHQKROto= sha512-kt12VJdz/37D3N3eglBywV8GStKNUhNrsxChXIV+o0MwVXORYuhDTHJRKPgLJRb/EY3vM2aRFQdxJBp9CLikjw==" + dependencies: + "@babel/plugin-syntax-jsx" "^7.2.0" + "@vue/babel-plugin-transform-vue-jsx" "^1.2.1" + camelcase "^5.0.0" + +"@vue/cli-overlay@^4.5.15": + version "4.5.15" + resolved "https://registry.yarnpkg.com/@vue/cli-overlay/-/cli-overlay-4.5.15.tgz#0700fd6bad39336d4189ba3ff7d25e638e818c9c" + integrity "sha1-BwD9a605M21Bibo/99JeY46BjJw= sha512-0zI0kANAVmjFO2LWGUIzdGPMeE3+9k+KeRDXsUqB30YfRF7abjfiiRPq5BU9pOzlJbVdpRkisschBrvdJqDuDg==" + +"@vue/cli-plugin-babel@^4.5.12": + version "4.5.15" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-babel/-/cli-plugin-babel-4.5.15.tgz#ae4fb2ed54255fe3d84df381dab68509641179ed" + integrity "sha1-rk+y7VQlX+PYTfOB2raFCWQRee0= sha512-hBLrwYfFkHldEe34op/YNgPhpOWI5n5DB2Qt9I/1Epeif4M4iFaayrgjvOR9AVM6WbD3Yx7WCFszYpWrQZpBzQ==" + dependencies: + "@babel/core" "^7.11.0" + "@vue/babel-preset-app" "^4.5.15" + "@vue/cli-shared-utils" "^4.5.15" + babel-loader "^8.1.0" + cache-loader "^4.1.0" + thread-loader "^2.1.3" + webpack "^4.0.0" + +"@vue/cli-plugin-eslint@^4.5.12": + version "4.5.15" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.5.15.tgz#5781824a941f34c26336a67b1f6584a06c6a24ff" + integrity "sha1-V4GCSpQfNMJjNqZ7H2WEoGxqJP8= sha512-/2Fl6wY/5bz3HD035oSnFRMsKNxDxU396KqBdpCQdwdvqk4mm6JAbXqihpcBRTNPeTO6w+LwGe6FE56PVbJdbg==" + dependencies: + "@vue/cli-shared-utils" "^4.5.15" + eslint-loader "^2.2.1" + globby "^9.2.0" + inquirer "^7.1.0" + webpack "^4.0.0" + yorkie "^2.0.0" + +"@vue/cli-plugin-pwa@^4.5.12": + version "4.5.15" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-pwa/-/cli-plugin-pwa-4.5.15.tgz#eb800c418d96b496deec9d063a1798fe6e9c2db8" + integrity "sha1-64AMQY2WtJbe7J0GOheY/m6cLbg= sha512-yQzsspaIkjeQyN6btF8ATgbJFU023q1HC8uUpmiBa4QE9EyBlR8fSrKFhcJ0EmT6KnU7PMwlnOJ/OqjguFnufA==" + dependencies: + "@vue/cli-shared-utils" "^4.5.15" + webpack "^4.0.0" + workbox-webpack-plugin "^4.3.1" + +"@vue/cli-plugin-router@^4.5.12", "@vue/cli-plugin-router@^4.5.15": + version "4.5.15" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-router/-/cli-plugin-router-4.5.15.tgz#1e75c8c89df42c694f143b9f1028de3cf5d61e1e" + integrity "sha1-HnXIyJ30LGlPFDufECjePPXWHh4= sha512-q7Y6kP9b3k55Ca2j59xJ7XPA6x+iSRB+N4ac0ZbcL1TbInVQ4j5wCzyE+uqid40hLy4fUdlpl4X9fHJEwuVxPA==" + dependencies: + "@vue/cli-shared-utils" "^4.5.15" + +"@vue/cli-plugin-typescript@^4.5.12": + version "4.5.15" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-typescript/-/cli-plugin-typescript-4.5.15.tgz#14ba0ddcf3b94e73148ff84ac904fbc5346c14d1" + integrity "sha1-FLoN3PO5TnMUj/hKyQT7xTRsFNE= sha512-g2HDBwWBboTzNvVrS+w4Ctl7CCErboTlx7PyQrXgY+7uGdPVUT9PWuv4DjaZhosSk7WI3qSIpruCBIkdHX5bwQ==" + dependencies: + "@types/webpack-env" "^1.15.2" + "@vue/cli-shared-utils" "^4.5.15" + cache-loader "^4.1.0" + fork-ts-checker-webpack-plugin "^3.1.1" + globby "^9.2.0" + thread-loader "^2.1.3" + ts-loader "^6.2.2" + tslint "^5.20.1" + webpack "^4.0.0" + yorkie "^2.0.0" + optionalDependencies: + fork-ts-checker-webpack-plugin-v5 "npm:fork-ts-checker-webpack-plugin@^5.0.11" + +"@vue/cli-plugin-unit-jest@^4.5.12": + version "4.5.15" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-4.5.15.tgz#7be914ca1507ca344487eb377ed925c9db0b772a" + integrity "sha1-e+kUyhUHyjREh+s3ftklydsLdyo= sha512-oE3RDMerb21P6ALg70Zh2zU+RYYjoe09/7ZXYUj03uTb2obqUbcINpFfeVwM0B/J6H1YmqWJpnNBxWURhrqQHg==" + dependencies: + "@babel/core" "^7.11.0" + "@babel/plugin-transform-modules-commonjs" "^7.9.6" + "@types/jest" "^24.0.19" + "@vue/cli-shared-utils" "^4.5.15" + babel-core "^7.0.0-bridge.0" + babel-jest "^24.9.0" + babel-plugin-transform-es2015-modules-commonjs "^6.26.2" + deepmerge "^4.2.2" + jest "^24.9.0" + jest-environment-jsdom-fifteen "^1.0.2" + jest-serializer-vue "^2.0.2" + jest-transform-stub "^2.0.0" + jest-watch-typeahead "^0.4.2" + ts-jest "^24.2.0" + vue-jest "^3.0.5" + +"@vue/cli-plugin-vuex@^4.5.12", "@vue/cli-plugin-vuex@^4.5.15": + version "4.5.15" + resolved "https://registry.yarnpkg.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.15.tgz#466c1f02777d02fef53a9bb49a36cc3a3bcfec4e" + integrity "sha1-RmwfAnd9Av71Opu0mjbMOjvP7E4= sha512-fqap+4HN+w+InDxlA3hZTOGE0tzBTgXhKLoDydhywqgmhQ1D9JA6Feh94ze6tG8DsWX58/ujYUqA8jAz17FJtg==" + +"@vue/cli-service@^4.5.12": + version "4.5.15" + resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-4.5.15.tgz#0e9a186d51550027d0e68e95042077eb4d115b45" + integrity "sha1-DpoYbVFVACfQ5o6VBCB3600RW0U= sha512-sFWnLYVCn4zRfu45IcsIE9eXM0YpDV3S11vlM2/DVbIPAGoYo5ySpSof6aHcIvkeGsIsrHFpPHzNvDZ/efs7jA==" + dependencies: + "@intervolga/optimize-cssnano-plugin" "^1.0.5" + "@soda/friendly-errors-webpack-plugin" "^1.7.1" + "@soda/get-current-script" "^1.0.0" + "@types/minimist" "^1.2.0" + "@types/webpack" "^4.0.0" + "@types/webpack-dev-server" "^3.11.0" + "@vue/cli-overlay" "^4.5.15" + "@vue/cli-plugin-router" "^4.5.15" + "@vue/cli-plugin-vuex" "^4.5.15" + "@vue/cli-shared-utils" "^4.5.15" + "@vue/component-compiler-utils" "^3.1.2" + "@vue/preload-webpack-plugin" "^1.1.0" + "@vue/web-component-wrapper" "^1.2.0" + acorn "^7.4.0" + acorn-walk "^7.1.1" + address "^1.1.2" + autoprefixer "^9.8.6" + browserslist "^4.12.0" + cache-loader "^4.1.0" + case-sensitive-paths-webpack-plugin "^2.3.0" + cli-highlight "^2.1.4" + clipboardy "^2.3.0" + cliui "^6.0.0" + copy-webpack-plugin "^5.1.1" + css-loader "^3.5.3" + cssnano "^4.1.10" + debug "^4.1.1" + default-gateway "^5.0.5" + dotenv "^8.2.0" + dotenv-expand "^5.1.0" + file-loader "^4.2.0" + fs-extra "^7.0.1" + globby "^9.2.0" + hash-sum "^2.0.0" + html-webpack-plugin "^3.2.0" + launch-editor-middleware "^2.2.1" + lodash.defaultsdeep "^4.6.1" + lodash.mapvalues "^4.6.0" + lodash.transform "^4.6.0" + mini-css-extract-plugin "^0.9.0" + minimist "^1.2.5" + pnp-webpack-plugin "^1.6.4" + portfinder "^1.0.26" + postcss-loader "^3.0.0" + ssri "^8.0.1" + terser-webpack-plugin "^1.4.4" + thread-loader "^2.1.3" + url-loader "^2.2.0" + vue-loader "^15.9.2" + vue-style-loader "^4.1.2" + webpack "^4.0.0" + webpack-bundle-analyzer "^3.8.0" + webpack-chain "^6.4.0" + webpack-dev-server "^3.11.0" + webpack-merge "^4.2.2" + optionalDependencies: + vue-loader-v16 "npm:vue-loader@^16.1.0" + +"@vue/cli-shared-utils@^4.5.15": + version "4.5.15" + resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-4.5.15.tgz#dba3858165dbe3465755f256a4890e69084532d6" + integrity "sha1-26OFgWXb40ZXVfJWpIkOaQhFMtY= sha512-SKaej9hHzzjKSOw1NlFmc6BSE0vcqUQMQiv1cxQ2DhVyy4QxZXBmzmiLBUBe+hYZZs1neXW7n//udeN9bCAY+Q==" + dependencies: + "@hapi/joi" "^15.0.1" + chalk "^2.4.2" + execa "^1.0.0" + launch-editor "^2.2.1" + lru-cache "^5.1.1" + node-ipc "^9.1.1" + open "^6.3.0" + ora "^3.4.0" + read-pkg "^5.1.1" + request "^2.88.2" + semver "^6.1.0" + strip-ansi "^6.0.0" + +"@vue/compiler-core@3.2.21": + version "3.2.21" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.21.tgz#26566c32b2ad838199d471ef5df620a83846f24e" + integrity "sha1-JlZsMrKtg4GZ1HHvXfYgqDhG8k4= sha512-NhhiQZNG71KNq1h5pMW/fAXdTF7lJRaSI7LDm2edhHXVz1ROMICo8SreUmQnSf4Fet0UPBVqJ988eF4+936iDQ==" + dependencies: + "@babel/parser" "^7.15.0" + "@vue/shared" "3.2.21" + estree-walker "^2.0.2" + source-map "^0.6.1" + +"@vue/compiler-dom@3.2.21": + version "3.2.21" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.21.tgz#d6f6c85364ef8888f9c4e9122bfba11e78fb398c" + integrity "sha1-1vbIU2TviIj5xOkSK/uhHnj7OYw= sha512-gsJD3DpYZSYquiA7UIPsMDSlAooYWDvHPq9VRsqzJEk2PZtFvLvHPb4aaMD8Ufd62xzYn32cnnkzsEOJhyGilA==" + dependencies: + "@vue/compiler-core" "3.2.21" + "@vue/shared" "3.2.21" + +"@vue/compiler-sfc@^3.1.2": + version "3.2.21" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.21.tgz#42639ee49e725afb7d8f1d1940e75dc17a56002c" + integrity "sha1-QmOe5J5yWvt9jx0ZQOddwXpWACw= sha512-+yDlUSebKpz/ovxM2vLRRx7w/gVfY767pOfYTgbIhAs+ogvIV2BsIt4fpxlThnlCNChJ+yE0ERUNoROv2kEGEQ==" + dependencies: + "@babel/parser" "^7.15.0" + "@vue/compiler-core" "3.2.21" + "@vue/compiler-dom" "3.2.21" + "@vue/compiler-ssr" "3.2.21" + "@vue/ref-transform" "3.2.21" + "@vue/shared" "3.2.21" + estree-walker "^2.0.2" + magic-string "^0.25.7" + postcss "^8.1.10" + source-map "^0.6.1" + +"@vue/compiler-ssr@3.2.21": + version "3.2.21" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.21.tgz#37d124f89e8adef9fd56b85775de4b5310a0436e" + integrity "sha1-N9Ek+J6K3vn9VrhXdd5LUxCgQ24= sha512-eU+A0iWYy+1zAo2CRIJ0zSVlv1iuGAIbNRCnllSJ31pV1lX3jypJYzGbJlSRAbB7VP6E+tYveVT1Oq8JKewa3g==" + dependencies: + "@vue/compiler-dom" "3.2.21" + "@vue/shared" "3.2.21" + +"@vue/component-compiler-utils@^3.1.0", "@vue/component-compiler-utils@^3.1.2": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz#f9f5fb53464b0c37b2c8d2f3fbfe44df60f61dc9" + integrity "sha1-+fX7U0ZLDDeyyNLz+/5E32D2Hck= sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==" + dependencies: + consolidate "^0.15.1" + hash-sum "^1.0.2" + lru-cache "^4.1.2" + merge-source-map "^1.1.0" + postcss "^7.0.36" + postcss-selector-parser "^6.0.2" + source-map "~0.6.1" + vue-template-es2015-compiler "^1.9.0" + optionalDependencies: + prettier "^1.18.2 || ^2.0.0" + +"@vue/eslint-config-typescript@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@vue/eslint-config-typescript/-/eslint-config-typescript-7.0.0.tgz#220c70c2edf7a253e739298525f4d401b8ef0038" + integrity "sha1-Igxwwu33olPnOSmFJfTUAbjvADg= sha512-UxUlvpSrFOoF8aQ+zX1leYiEBEm7CZmXYn/ZEM1zwSadUzpamx56RB4+Htdjisv1mX2tOjBegNUqH3kz2OL+Aw==" + dependencies: + vue-eslint-parser "^7.0.0" + +"@vue/preload-webpack-plugin@^1.1.0": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz#ceb924b4ecb3b9c43871c7a429a02f8423e621ab" + integrity "sha1-zrkktOyzucQ4ccekKaAvhCPmIas= sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==" + +"@vue/ref-transform@3.2.21": + version "3.2.21" + resolved "https://registry.yarnpkg.com/@vue/ref-transform/-/ref-transform-3.2.21.tgz#b0c554c9f640c3f005f77e676066aa0faba90984" + integrity "sha1-sMVUyfZAw/AF935nYGaqD6upCYQ= sha512-uiEWWBsrGeun9O7dQExYWzXO3rHm/YdtFNXDVqCSoPypzOVxWxdiL+8hHeWzxMB58fVuV2sT80aUtIVyaBVZgQ==" + dependencies: + "@babel/parser" "^7.15.0" + "@vue/compiler-core" "3.2.21" + "@vue/shared" "3.2.21" + estree-walker "^2.0.2" + magic-string "^0.25.7" + +"@vue/shared@3.2.21": + version "3.2.21" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.21.tgz#4cd80c0e62cf65a7adab2449e86b6f0cb33a130b" + integrity "sha1-TNgMDmLPZaetqyRJ6GtvDLM6Ews= sha512-5EQmIPK6gw4UVYUbM959B0uPsJ58+xoMESCZs3N89XyvJ9e+fX4pqEPrOGV8OroIk3SbEvJcC+eYc8BH9JQrHA==" + +"@vue/test-utils@^1.1.0", "@vue/test-utils@^1.2.0": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-1.2.2.tgz#0242ea4e202d4853541bb167fead3f2249140ab7" + integrity "sha1-AkLqTiAtSFNUG7Fn/q0/IkkUCrc= sha512-P+yiAsszoy8z1TqXiVUnAZaJj0WGGz5fCxm4bOSI6Cpwy1+PNYwYxDv0ROAA/SUtOPppV+aD8tp/QWwxf8ROJw==" + dependencies: + dom-event-types "^1.0.0" + lodash "^4.17.15" + pretty "^2.0.0" + +"@vue/web-component-wrapper@^1.2.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz#b6b40a7625429d2bd7c2281ddba601ed05dc7f1a" + integrity "sha1-trQKdiVCnSvXwigd26YB7QXcfxo= sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==" + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity "sha1-vYUGBLQEJFmlpBzX0zjL7Wle2WQ= sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==" + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity "sha1-PD07Jxvd/ITesA9xNEQ4MR1S/7Q= sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity "sha1-ID9nbjM7lsnaLuqzzO8zxFkotqI= sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity "sha1-oUQtJpxf6yP8vJ73WdrDVH8p3gA= sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity "sha1-ZH+Iks0gQ6gqwMjF51w28dkVnyc= sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==" + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity "sha1-wFJWtxJEIUZx9LCOwQitY7cO3bg= sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity "sha1-JdiIS3aDmHGgimxvgGw5ee9xLwc= sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==" + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity "sha1-T+2L6sm4wU+MWLcNEk1UndH+V5A= sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity "sha1-WkE41aYpK6GLBMWuSXF+QWeWU0Y= sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==" + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity "sha1-Fceg+6roP7JhQ7us9tbfFwKtOeQ= sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==" + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity "sha1-8Zygt2ptxVYjoJz/p2noOPoeHJU= sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==" + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity "sha1-BNM7Y2945qaBMifoJAL3Y3tiKas= sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity "sha1-P+bXnT8PkiGDqoYALELdJWz+6c8= sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==" + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity "sha1-ULxw7Gje2OJ2OwGhQYv0NJGnpJw= sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==" + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity "sha1-IhEYHlsxMmRDzIES658LkChyGmE= sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==" + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity "sha1-nUjkSCbfSmWYKUqmyHRp1kL/9l4= sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==" + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity "sha1-MDERXXmsW9JhVWzsw/qQo+9FGRQ= sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==" + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity "sha1-STXVTIX+9jewDOn1I3dFHQDUeJk= sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==" + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A= sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity "sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0= sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + +abab@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity "sha1-wLZ4+zLWD8EhnHhNaoJv44Wut5o= sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg= sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + +abortcontroller-polyfill@^1.4.0: + version "1.7.3" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz#1b5b487bd6436b5b764fd52a612509702c3144b5" + integrity "sha1-G1tIe9ZDa1t2T9UqYSUJcCwxRLU= sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==" + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity "sha1-UxvHJlF6OytB+FACHGzBXqq1B80= sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==" + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-globals@^4.1.0, acorn-globals@^4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity "sha1-n6GSat3BHJcwjE5m163Q1Awycuc= sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==" + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-jsx@^5.2.0, acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity "sha1-ftW7VZCLOy8bxVxq8WU7rafweTc= sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity "sha1-Ejy487hMIXHx9/slJhWxx4prGow= sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity "sha1-DeiJpgEgOQmw++B7iTjcIdLpZ7w= sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + +acorn@^5.5.3: + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity "sha1-Po2KmUfQWZoXltECJddDL0pKz14= sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" + +acorn@^6.0.1, acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity "sha1-NYZv1xBSjpLeEM8GAWSY5H454eY= sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" + +acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo= sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + +add-dom-event-listener@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz#6a92db3a0dd0abc254e095c0f1dc14acbbaae310" + integrity "sha1-apLbOg3Qq8JU4JXA8dwUrLuq4xA= sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==" + dependencies: + object-assign "4.x" + +address@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + integrity "sha1-vxEWycdYxRt6kz0pa3LCIe2UKLY= sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity "sha1-81mGrOuRr63sQQL72FAUlQzvpk0= sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity "sha1-MfKdpatuANHC0yms97WSlhTVAU0= sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ= sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1, ajv@^8.6.3: + version "8.6.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.3.tgz#11a66527761dc3e9a3845ea775d2d3c0414e8764" + integrity "sha1-EaZlJ3Ydw+mjhF6nddLTwEFOh2Q= sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==" + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==" + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity "sha1-46PaS/uubIapwoViXeEkojQCb78= sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + +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-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity "sha1-h4C5j/nb9WOBUtHx/lwde0RCl2s= sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity "sha1-ayKR0dt9mLZSHV8e+kLQ86n+tl4= sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==" + dependencies: + type-fest "^0.21.3" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity "sha1-gTWEAhliqenm/QOflA0S9WynhZ4= sha512-JoAxEa1DfP9m2xfB/y2r/aKcwXNlltr4+0QSBC4TrLfcxyvepX2Pv0t/xpgGV5bGsDzCYV8SzjWgyCW0T9yYbA==" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity "sha1-w7M6te42DYbg5ijwRorn7yfWVN8= sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" + +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@^4.0.0, ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc= sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + +ansi-regex@^5.0.0, ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ= sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==" + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" + dependencies: + color-convert "^1.9.0" + +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" + +ant-design-vue@^1.7.2, ant-design-vue@^1.7.8: + version "1.7.8" + resolved "https://registry.yarnpkg.com/ant-design-vue/-/ant-design-vue-1.7.8.tgz#1abbf86b68a4f5b1000bea0487b8031dc0001661" + integrity "sha1-Grv4a2ik9bEAC+oEh7gDHcAAFmE= sha512-F1hmiS9vwbyfuFvlamdW5l9bHKqRlj9wHaGDIE41NZMWXyWy8qL0UFa/+I0Wl8gQWZCqODW5pN6Yfoyn85At3A==" + dependencies: + "@ant-design/icons" "^2.1.1" + "@ant-design/icons-vue" "^2.0.0" + "@simonwep/pickr" "~1.7.0" + add-dom-event-listener "^1.0.2" + array-tree-filter "^2.1.0" + async-validator "^3.0.3" + babel-helper-vue-jsx-merge-props "^2.0.3" + babel-runtime "6.x" + classnames "^2.2.5" + component-classes "^1.2.6" + dom-align "^1.10.4" + dom-closest "^0.2.0" + dom-scroll-into-view "^2.0.0" + enquire.js "^2.1.6" + intersperse "^1.0.0" + is-mobile "^2.2.1" + is-negative-zero "^2.0.0" + ismobilejs "^1.0.0" + json2mq "^0.2.0" + lodash "^4.17.5" + moment "^2.21.0" + mutationobserver-shim "^0.3.2" + node-emoji "^1.10.0" + omit.js "^1.0.0" + raf "^3.4.0" + resize-observer-polyfill "^1.5.1" + shallow-equal "^1.0.0" + shallowequal "^1.0.2" + vue-ref "^2.0.0" + warning "^4.0.0" + +antlr4@^4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.9.2.tgz#abbc53d275954b1b6f4d8b3468b4a2cb258121fc" + integrity "sha1-q7xT0nWVSxtvTYs0aLSiyyWBIfw= sha512-UjMSlenUORL+a+6g4RNZxRh5LcFWybRi2g0ASDBpgXBY6nlavg0BRVAVEQF0dz8jH6SyX3lV7uP5y/krJzc+Hw==" + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity "sha1-q8av7tzqUugJzcA3au0845Y10X8= sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity "sha1-vLJLTzeTTZqnrBe0ra+J58du8us= sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==" + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@^3.0.0, 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" + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity "sha1-aALmJk79GMeQobDVF/DyYnvyyUo= sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + +arch@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity "sha1-G8R4GPMFdk8jqzMGsL/AhsWinRE= sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==" + +argparse@^1.0.10, argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE= sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" + dependencies: + sprintf-js "~1.0.2" + +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==" + +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity "sha1-DSymyazrVriXfp/tau1+FbvS+Ds= sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==" + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==" + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE= sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity "sha1-JO+AoowaiTYX4hSbDG0NeIKTsJk= sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + +array-tree-filter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190" + integrity "sha1-hzrAD+yDdJ8lWsjdCDgUtPYykZA= sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + +array-union@^1.0.1, array-union@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==" + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity "sha1-t5hCCtvrHego2ErNii4j0+/oXo0= sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==" + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==" + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity "sha1-EamAuE67kXgc41sP3C7ilON4Pwc= sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity "sha1-DTp7tuZOAqkMAwOzHykoaOoJoI0= sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==" + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity "sha1-VcEJqvbgrv2z3EtxJAxwv1dLGOs= sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==" + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==" + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity "sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k= sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity "sha1-SDFDxWeu7UeFdZwIZXhtx319LjE= sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8= sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0= sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + +async-validator@^3.0.3: + version "3.5.2" + resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-3.5.2.tgz#68e866a96824e8b2694ff7a831c1a25c44d5e500" + integrity "sha1-aOhmqWgk6LJpT/eoMcGiXETV5QA= sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ==" + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity "sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8= sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==" + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity "sha1-x57Zf380y48robyXkLzDZkdLS3k= sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity "sha1-YCzUtG6EStTv/JKoARo8RuAjjcI= sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k= sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + +autolinker@^3.11.0: + version "3.14.3" + resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-3.14.3.tgz#c61c424bc6077bcf2fc62803803ec2f58e15a7ec" + integrity "sha1-xhxCS8YHe88vxigDgD7C9Y4Vp+w= sha512-t81i2bCpS+s+5FIhatoww9DmpjhbdiimuU9ATEuLxtZMQ7jLv9fyFn7SWNG8IkEfD4AmYyirL1ss9k1aqVWRvg==" + dependencies: + tslib "^1.9.3" + +autoprefixer@^9.8.6: + version "9.8.8" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" + integrity "sha1-/UvUWVOF+m8GWZ3nSaTV96R0lXo= sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==" + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + picocolors "^0.2.1" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity "sha1-1h9G2DslGSUOJ4Ta9bCUeai0HFk= sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + +axios@^0.21.1: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity "sha1-xnuQ3AVo5cHPKwuFjEO6KOLtpXU= sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==" + dependencies: + follow-redirects "^1.14.0" + +babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity "sha1-laSS3dkPm06aSh2hTrM1uHtjTs4= sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==" + +babel-eslint@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity "sha1-aWjlaKkQt4+zd5zdi2rC9HmUMjI= sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-extract-comments@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" + integrity "sha1-Cirt+BQX7TkbheGLRhTmk6A1GiE= sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==" + dependencies: + babylon "^6.18.0" + +babel-helper-vue-jsx-merge-props@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6" + integrity "sha1-Iq69OzOQIyjlEyk6jkmSs4T58bY= sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==" + +babel-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" + integrity "sha1-P8Mny4RnuJ0U17xw4xUQSng8zVQ= sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==" + dependencies: + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.9.0" + chalk "^2.4.2" + slash "^2.0.0" + +babel-loader@^8.1.0: + version "8.2.3" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d" + integrity "sha1-iYa0Dxpkys/LS4QpMgCF72ixNC0= sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==" + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^1.4.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity "sha1-hP2hnJduxcbe/vV/lCez3vZuF6M= sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==" + dependencies: + object.assign "^4.1.0" + +babel-plugin-istanbul@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" + integrity "sha1-30reg9iXqS3wacTZolzyZxKTyFQ= sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + find-up "^3.0.0" + istanbul-lib-instrument "^3.3.0" + test-exclude "^5.2.3" + +babel-plugin-jest-hoist@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" + integrity "sha1-T4NwketAfgFEfIhDy+xUbQAC11Y= sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==" + dependencies: + "@types/babel__traverse" "^7.0.6" + +babel-plugin-polyfill-corejs2@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz#6ed8e30981b062f8fe6aca8873a37ebcc8cc1c0f" + integrity "sha1-btjjCYGwYvj+asqIc6N+vMjMHA8= sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==" + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.2.4" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.3.0.tgz#fa7ca3d1ee9ddc6193600ffb632c9785d54918af" + integrity "sha1-+nyj0e6d3GGTYA/7YyyXhdVJGK8= sha512-JLwi9vloVdXLjzACL80j24bG6/T1gYxwowG44dg6HN/7aTPdyPbJJidf6ajoA3RPHHtW0j9KMrSOLpIZpAnPpg==" + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.4" + core-js-compat "^3.18.0" + +babel-plugin-polyfill-regenerator@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz#2e9808f5027c4336c994992b48a4262580cb8d6d" + integrity "sha1-LpgI9QJ8QzbJlJkrSKQmJYDLjW0= sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==" + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.4" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + integrity "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==" + +babel-plugin-transform-es2015-modules-commonjs@^6.26.0, babel-plugin-transform-es2015-modules-commonjs@^6.26.2: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + integrity "sha1-WKeThjqefKhwvcWogRF/+sJ9tvM= sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-object-rest-spread@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + integrity "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= sha512-ocgA9VJvyxwt+qJB0ncxV8kb/CjfTcECUY4tQ5VT7nP6Aohzobm8CDFaQ5FHdvZQzLmf0sgDxB8iRXZXxwZcyA==" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + integrity "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw==" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-preset-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" + integrity "sha1-GStSHiIX+x0fZ89z9wwzZlCtPNw= sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==" + dependencies: + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.9.0" + +babel-runtime@6.x, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity "sha1-llxwWGaOgrVde/4E/yM3vItWR/4= sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity "sha1-ry87iPpvXB5MY00aD46sT1WzleM= sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + +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==" + +base64-js@^1.0.2, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity "sha1-GxtEAWClv3rUC2UPCVljSBkDkwo= sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity "sha1-e95c7RRbbVUakNuH+DxVi060io8= sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==" + dependencies: + tweetnacl "^0.14.3" + +bfj@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f" + integrity "sha1-MlyGGoIryzWKQceKM7jm4ght3n8= sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==" + dependencies: + bluebird "^3.5.5" + check-types "^8.0.3" + hoopy "^0.1.4" + tryer "^1.0.1" + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + integrity "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4= sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg= sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U= sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + +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==" + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity "sha1-EDU8npRTNLwFEabZCzj7x8nFBN8= sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==" + dependencies: + file-uri-to-path "1.0.0" + +bluebird@^3.1.1, bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity "sha1-nyKcFb4nJFT/qXOs4NvueaGww28= sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity "sha1-d1s/J477uXGO7HNh9IP7Nvu/6og= sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity "sha1-NYhgZ0OWxpl3canQUfzBtX1K4AI= sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io= sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==" + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity "sha1-jokKGD2O6aI5OzhExpGkK897yfU= sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==" + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity "sha1-aN/1++YMUes3cl6p4+0xDcwed24= sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + +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@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk= sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.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" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity "sha1-PJtLfXgsgSHlbxAQbYTA0P/JRiY= sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity "sha1-m3y7PQ9RDky4a9vXlhJNKLWJCvY= sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==" + dependencies: + resolve "1.1.7" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g= sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==" + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA= sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==" + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw= sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==" + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity "sha1-sv0Gtbda4pf3zi3GUfkY9b4VjI0= sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==" + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity "sha1-6vSt1G3VS+O7OzbAzxWrvrp5VsM= sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==" + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8= sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==" + dependencies: + pako "~1.0.5" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.17.6: + version "4.17.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.6.tgz#c76be33e7786b497f66cad25a73756c8b938985d" + integrity "sha1-x2vjPneGtJf2bK0lpzdWyLk4mF0= sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==" + dependencies: + caniuse-lite "^1.0.30001274" + electron-to-chromium "^1.3.886" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity "sha1-6302UwenLPl0zGzadraDVK0za9g= sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==" + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity "sha1-5nh9og7OnQeZhTPP2d5vXDj0vAU= sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==" + dependencies: + node-int64 "^0.4.0" + +btoa@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + integrity "sha1-AamQn4ssk/a/aAuiYTHrMPf6PXM= sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==" + +buffer-from@1.x, buffer-from@^1.0.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==" + +buffer-from@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-0.1.2.tgz#15f4b9bcef012044df31142c14333caf6e0260d0" + integrity "sha1-FfS5vO8BIETfMRQsFDM8r24CYNA= sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==" + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow= sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + +buffer-json@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/buffer-json/-/buffer-json-2.0.0.tgz#f73e13b1e42f196fe2fd67d001c7d7107edd7c23" + integrity "sha1-9z4TseQvGW/i/WfQAcfXEH7dfCM= sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity "sha1-Iw6tNEACmIZEhBqwJEr4xEu+Pvg= sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY= sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + +cacache@^12.0.2, cacache@^12.0.3: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity "sha1-ZovL0QWutfHZL+JVcOyVJcj6pAw= sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==" + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI= sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cache-loader@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cache-loader/-/cache-loader-4.1.0.tgz#9948cae353aec0a1fcb1eafda2300816ec85387e" + integrity "sha1-mUjK41OuwKH8ser9ojAIFuyFOH4= sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==" + dependencies: + buffer-json "^2.0.0" + find-cache-dir "^3.0.0" + loader-utils "^1.2.3" + mkdirp "^0.5.1" + neo-async "^2.6.1" + schema-utils "^2.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity "sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw= sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==" + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity "sha1-JtII6onje1y95gJQoV8DHBak1ms= sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==" + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==" + dependencies: + caller-callsite "^2.0.0" + +callsite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + integrity "sha1-KAOY5dZkvXQDi28JBRU+borxvCA= sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M= sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==" + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==" + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA= sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + +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==" + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity "sha1-Xk2Q4idJYdRikZl99Znj7QCO5MA= sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==" + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001274: + version "1.0.30001278" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001278.tgz#51cafc858df77d966b17f59b5839250b24417fff" + integrity "sha1-Ucr8hY33fZZrF/WbWDklCyRBf/8= sha512-mpF9KeH8u5cMoEmIic/cr7PNS+F5LWBk0t2ekGT60lFf0Wq+n9LspAj0g3P+o7DQhD3sUdlMln4YFAWhFYn9jg==" + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity "sha1-+5U7+uvreB9iiYI52rtCbQilCaQ= sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==" + dependencies: + rsvp "^4.8.4" + +case-sensitive-paths-webpack-plugin@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" + integrity "sha1-22QGbGQi7tLgjMFLmGykN5bbxtQ= sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ= sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, 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" + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity "sha1-lLwYRdznClu50uzHSHJWYSk9j8E= sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity "sha1-4Sw5Obfq9OWxXnrUxeKOHUjFsWs= sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity "sha1-CDMpzaDq4nKrPbvzfpo4LBOvFWA= sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4= sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + +chart.js@2: + version "2.9.4" + resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-2.9.4.tgz#0827f9563faffb2dc5c06562f8eb10337d5b9684" + integrity "sha1-CCf5Vj+v+y3FwGVi+OsQM31bloQ= sha512-B07aAzxcrikjAPyV+01j7BmOpxtQETxTSlQ26BEYJ+3iUkbNKaOJ/nDbT6JjyqYxseM0ON12COHYdU2cTIjC7A==" + dependencies: + chartjs-color "^2.1.0" + moment "^2.10.2" + +chartjs-color-string@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz#1df096621c0e70720a64f4135ea171d051402f71" + integrity "sha1-HfCWYhwOcHIKZPQTXqFx0FFAL3E= sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==" + dependencies: + color-name "^1.0.0" + +chartjs-color@^2.1.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chartjs-color/-/chartjs-color-2.4.1.tgz#6118bba202fe1ea79dd7f7c0f9da93467296c3b0" + integrity "sha1-YRi7ogL+Hqed1/fA+dqTRnKWw7A= sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==" + dependencies: + chartjs-color-string "^0.6.0" + color-convert "^1.9.3" + +check-types@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" + integrity "sha1-M1bMoZyIlUTy16le1JzlCKDs9VI= sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==" + +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.3.0, chokidar@^3.4.1: + 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" + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc= sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==" + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity "sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs= sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity "sha1-EBXs7UdB4V0GZkqVfbv1DQQeJqw= sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity "sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc= sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity "sha1-Z6npZL4xpR4V5QENWObxKDQAL0Y= sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94= sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity "sha1-+TNprouafOAv1B+q0MqDAzGQxGM= sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + integrity "sha1-38+jiR4wbsHa0QXQ6I9EF7hTXo4= sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + +clean-css@4.2.x: + version "4.2.4" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178" + integrity "sha1-czv0brpOYHxokepXwkqYk1aDEXg= sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==" + dependencies: + source-map "~0.6.0" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==" + dependencies: + restore-cursor "^2.0.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity "sha1-JkMFp65JDR0Dvwybp8kl0XU68wc= sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==" + dependencies: + restore-cursor "^3.1.0" + +cli-highlight@^2.1.4: + version "2.1.11" + resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" + integrity "sha1-SXNvpFLwqvT65YDjCssmgo0twb8= sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==" + dependencies: + chalk "^4.0.0" + highlight.js "^10.7.1" + mz "^2.4.0" + parse5 "^5.1.1" + parse5-htmlparser2-tree-adapter "^6.0.0" + yargs "^16.0.0" + +cli-spinners@^2.0.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity "sha1-rclU6+KBw3pjGb+kAebdJIj/tw0= sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==" + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity "sha1-ovSEN6LKqaIkNueUvwceyeYc7fY= sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" + +clipboardy@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-2.3.0.tgz#3c2903650c68e46a91b388985bc2774287dba290" + integrity "sha1-PCkDZQxo5GqRs4iYW8J3QofbopA= sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==" + dependencies: + arch "^2.1.1" + execa "^1.0.0" + is-wsl "^2.1.1" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U= sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==" + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity "sha1-UR1wLAxOQcoVbX0OlgIfI+EyJbE= sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==" + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +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" + +clone@2.x, clone@^2.1.0, clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity "sha1-2jCcwmPfFZlMaIypAheco8fNfH4= sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==" + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity "sha1-Q/bCEVG07yv1cYfbDXPeIp4+fsM= sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==" + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" + dependencies: + color-name "1.1.3" + +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.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + +color-name@^1.0.0, 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==" + +color-string@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" + integrity "sha1-w5FfYf4mdnLLfh4GTJ1pIhn2wxI= sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==" + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity "sha1-NUTcGYyvRJDD7MmnkLVP6f9F4WQ= sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==" + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +combine-errors@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/combine-errors/-/combine-errors-3.0.3.tgz#f4df6740083e5703a3181110c2b10551f003da86" + integrity "sha1-9N9nQAg+VwOjGBEQwrEFUfAD2oY= sha512-C8ikRNRMygCwaTx+Ek3Yr+OuZzgZjduCOfSQBjbM8V3MfgcjSTeto/GXP6PAwKvJz/v15b7GHZvx5rOlczFw/Q==" + dependencies: + custom-error-instance "2.1.1" + lodash.uniqby "4.5.0" + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8= sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" + dependencies: + delayed-stream "~1.0.0" + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity "sha1-YyuAthF4Z6FY8QgK1Jiy++fj9eo= sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + +commander@2.17.x: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity "sha1-vXerfebelCBc6sxy8XFtKfIKd78= sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + +commander@^2.12.1, commander@^2.18.0, commander@^2.19.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM= sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + +commander@~2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So= sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + +common-tags@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity "sha1-jjFT5ULUo56bEFVENK+q+YlWqTc= sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + +component-classes@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/component-classes/-/component-classes-1.2.6.tgz#c642394c3618a4d8b0b8919efccbbd930e5cd691" + integrity "sha1-xkI5TDYYpNiwuJGe/Mu9kw5c1pE= sha512-hPFGULxdwugu1QWW3SvVOCUHLzO34+a2J6Wqy0c5ASQkfi9/8nZcBB0ZohaEbXOQlCflMAEMmEWk7u7BVs4koA==" + dependencies: + component-indexof "0.0.3" + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A= sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + +component-indexof@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-indexof/-/component-indexof-0.0.3.tgz#11d091312239eb8f32c8f25ae9cb002ffe8d3c24" + integrity "sha1-EdCRMSI5648yyPJa6csAL/6NPCQ= sha512-puDQKvx/64HZXb4hBwIcvQLaLgux8o1CbWl39s41hrIIZDl1lJiD5jc22gj3RBeGK0ovxALDYpIbyjqDUUl0rw==" + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity "sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o= sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==" + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity "sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48= sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==" + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +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==" + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ= sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==" + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +condense-newlines@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/condense-newlines/-/condense-newlines-0.2.1.tgz#3de985553139475d32502c83b02f60684d24c55f" + integrity "sha1-PemFVTE5R10yUCyDsC9gaE0kxV8= sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==" + dependencies: + extend-shallow "^2.0.1" + is-whitespace "^0.3.0" + kind-of "^3.0.2" + +config-chain@^1.1.12: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity "sha1-+tB5Wqamza/57Rto6d/5Q3LCMvQ= sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==" + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity "sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w= sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity "sha1-ZwY871fOts9Jk6KrOlWECujEkzY= sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + +consolidate@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" + integrity "sha1-IasEMjXHGgfUXZqtmFk7DbpWurc= sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==" + dependencies: + bluebird "^3.1.1" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70= sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==" + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity "sha1-4TjMdeBAxyexlm/l5fjJruJW/js= sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + +convert-source-map@^1.4.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity "sha1-8zc8MtIbTXgN2ABFFGhPt5HKQ2k= sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==" + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity "sha1-4wOogrNCzD7oylE6eZmXNNqzriw= sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo= sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + +cookie@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity "sha1-r9cT/ibr0hupXOth+agRblClN9E= sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA= sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==" + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==" + +copy-to-clipboard@^3: + version "3.3.1" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" + integrity "sha1-EVqhqZmP+rYZb5MHatbaO5E2Yq4= sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==" + dependencies: + toggle-selection "^1.0.6" + +copy-webpack-plugin@^5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz#8a889e1dcafa6c91c6cd4be1ad158f1d3823bae2" + integrity "sha1-ioieHcr6bJHGzUvhrRWPHTgjuuI= sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==" + dependencies: + cacache "^12.0.3" + find-cache-dir "^2.1.0" + glob-parent "^3.1.0" + globby "^7.1.1" + is-glob "^4.0.1" + loader-utils "^1.2.3" + minimatch "^3.0.4" + normalize-path "^3.0.0" + p-limit "^2.2.1" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + webpack-log "^2.0.0" + +core-js-compat@^3.18.0, core-js-compat@^3.19.0, core-js-compat@^3.6.5: + version "3.19.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.1.tgz#fe598f1a9bf37310d77c3813968e9f7c7bb99476" + integrity "sha1-/lmPGpvzcxDXfDgTlo6ffHu5lHY= sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==" + dependencies: + browserslist "^4.17.6" + semver "7.0.0" + +core-js-pure@^3.19.0: + version "3.19.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.19.1.tgz#edffc1fc7634000a55ba05e95b3f0fe9587a5aa4" + integrity "sha1-7f/B/HY0AApVugXpWz8P6Vh6WqQ= sha512-Q0Knr8Es84vtv62ei6/6jXH/7izKmOrtrxH9WJTHLCMAVeU+8TF8z8Nr08CsH4Ot0oJKzBzJJL9SJBYIv7WlfQ==" + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==" + +core-js@^2.4.0: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity "sha1-2TM9+nsGXjR8xWgiGdb2kIWcwuw= sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + +core-js@^3.15.2, core-js@^3.6.5: + version "3.19.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.19.1.tgz#f6f173cae23e73a7d88fa23b6e9da329276c6641" + integrity "sha1-9vFzyuI+c6fYj6I7bp2jKSdsZkE= sha512-Tnc7E9iKd/b/ff7GFbhwPVzJzPztGrChB8X8GLqoYGdEOG8IpLnK1xPyo3ZoO3HsK6TodJS58VGPOxA+hLHQMg==" + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity "sha1-pgQtNjTCsn6TKPg3uWX6yDgI24U= sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity "sha1-BA9yaAnFked6F8CjYmykW08Wixo= sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==" + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity "sha1-2k/uhTxS9rHmk19BwaL8UL1KmYI= sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==" + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity "sha1-1uf0v/pmc2CFoHYv06YyaE2rzE4= sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==" + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY= sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==" + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8= sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==" + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +create-react-class@^15.5.1, create-react-class@^15.6.0: + version "15.7.0" + resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.7.0.tgz#7499d7ca2e69bb51d13faf59bd04f0c65a1d6c1e" + integrity "sha1-dJnXyi5pu1HRP69ZvQTwxlodbB4= sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==" + dependencies: + loose-envify "^1.3.1" + object-assign "^4.1.1" + +cropperjs@^1.5.6: + version "1.5.12" + resolved "https://registry.yarnpkg.com/cropperjs/-/cropperjs-1.5.12.tgz#d9c0db2bfb8c0d769d51739e8f916bbc44e10f50" + integrity "sha1-2cDbK/uMDXadUXOej5FrvEThD1A= sha512-re7UdjE5UnwdrovyhNzZ6gathI4Rs3KGCBSc8HCIjUo5hO42CtzyblmWLj6QWVw7huHyDMfpKxhiO2II77nhDw==" + +cross-fetch@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" + integrity "sha1-lyPzo6JHv4uJA586OAqSROj6Lzk= sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==" + dependencies: + node-fetch "2.6.1" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q= sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==" + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity "sha1-9zqFudXUHQRVUcF34ogtSshXKKY= sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw= sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==" + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==" + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity "sha1-wZiUD2OnbX42wecQGLABchBUyyI= sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==" + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-loader@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" + integrity "sha1-Lkssfm4tJ/jI8o9hv/zS5ske9kU= sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==" + dependencies: + camelcase "^5.3.1" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.32" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.2.0" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^2.7.0" + semver "^6.3.0" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity "sha1-Oy/0lyzDYquIVhUHqVQIoUMhNdc= sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity "sha1-ajRlM1ZjWTSoG6ymjQJVQyEF2+8= sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==" + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-select@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" + integrity "sha1-pwRA9wMX8maRGK10/xBeZYSccGc= sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==" + dependencies: + boolbase "^1.0.0" + css-what "^5.0.0" + domhandler "^4.2.0" + domutils "^2.6.0" + nth-check "^2.0.0" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity "sha1-mL69YsTB2flg7DQM+fdSLjBwmiI= sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==" + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity "sha1-60hw+2/XcHMn7JXC/yqwm16NuR0= sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==" + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity "sha1-6nAm/LAXd+295SEk4h8yfnrpUOQ= sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" + +css-what@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" + integrity "sha1-P3tweq32M7r2LCzrhXm1RbtA9/4= sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==" + +css.escape@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" + +css@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity "sha1-xkZ1XHOXHyu6amAeLPL9cbEpiSk= sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==" + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4= sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + +cssnano-preset-default@^4.0.0, cssnano-preset-default@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" + integrity "sha1-kgYisfwelaNOiDggPxOXpQTy0/8= sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==" + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.3" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==" + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==" + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity "sha1-sm1f1fcqEd/np4RvtMZyYPlr8oI= sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==" + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity "sha1-V0CC+yhZ0ttDOFWDXZqEVuoYu/M= sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" + +cssnano@^4.0.0, cssnano@^4.1.10: + version "4.1.11" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" + integrity "sha1-x7X1uB2iacsf2YLLlgwSAJEMmpk= sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==" + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.8" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity "sha1-6jpWE0bo3J9UbW/r7dUBh884lSk= sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==" + dependencies: + css-tree "^1.1.2" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity "sha1-nxJ29bK0Y/IRTT8sdSUK+MGjb0o= sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + +cssom@^0.4.1: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity "sha1-WmbPk9LQtmHYC/akT7ZfXC5OChA= sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + +cssstyle@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity "sha1-nTEyginTxWXGHlhrAgQaKPzNzPE= sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==" + dependencies: + cssom "0.3.x" + +cssstyle@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity "sha1-/2ZaDdvcMYZLCWR/NBY0Q9kLCFI= sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==" + dependencies: + cssom "~0.3.6" + +cuid@^2.1.1: + version "2.1.8" + resolved "https://registry.yarnpkg.com/cuid/-/cuid-2.1.8.tgz#cbb88f954171e0d5747606c0139fb65c5101eac0" + integrity "sha1-y7iPlUFx4NV0dgbAE5+2XFEB6sA= sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==" + +custom-error-instance@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/custom-error-instance/-/custom-error-instance-2.1.1.tgz#3cf6391487a6629a6247eb0ca0ce00081b7e361a" + integrity "sha1-PPY5FIemYppiR+sMoM4ACBt+Nho= sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg==" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==" + +d3-collection@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" + integrity "sha1-NJvSqpl32wcQkcExRNXk8WtbMQ4= sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + +d3-dispatch@1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" + integrity "sha1-ANN7zuTdjNl3Kd2JOgrCnKq6XVg= sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + +d3-force@^1.0.6: + version "1.2.1" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b" + integrity "sha1-/Sml0f8YHJ5/BmnkvXK9sOkU7As= sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==" + dependencies: + d3-collection "1" + d3-dispatch "1" + d3-quadtree "1" + d3-timer "1" + +d3-quadtree@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135" + integrity "sha1-youE33u1N2P+PC8kvUNRN/TlMTU= sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + +d3-timer@1: + version "1.0.10" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" + integrity "sha1-3+dripF0iDGxO22ceT/71QjdneU= sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity "sha1-hpgJU3LVjb7jRv/Qxwk/mfj561o= sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==" + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==" + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.0, data-urls@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity "sha1-Fe4Fgrql4iu1nHcUDaj5x2lju/4= sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==" + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + integrity "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==" + +deasync@^0.1.15: + version "0.1.23" + resolved "https://registry.yarnpkg.com/deasync/-/deasync-0.1.23.tgz#d52bb1f9cebb511933bb977f2820af1af5d1ec08" + integrity "sha1-1Sux+c67URkzu5d/KCCvGvXR7Ag= sha512-CGZSokFwidI50GOAmkz/7z3QdMzTQqAiUOzt95PuhKgi6VVztn9D03ZCzzi93uUWlp/v6A9osvNWpIvqHvKjTA==" + dependencies: + bindings "^1.5.0" + node-addon-api "^1.7.1" + +debounce@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity "sha1-OIgdj0FmpcWEgCDBGCe4NLyz4KU= sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8= sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" + dependencies: + ms "2.0.0" + +debug@^3.1.1, debug@^3.2.6: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o= sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==" + dependencies: + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity "sha1-8KScGKyHeeMdSgxgKd+3aHPHQos= sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==" + dependencies: + ms "2.1.2" + +decache@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/decache/-/decache-4.6.0.tgz#87026bc6e696759e82d57a3841c4e251a30356e8" + integrity "sha1-hwJrxuaWdZ6C1Xo4QcTiUaMDVug= sha512-PppOuLiz+DFeaUvFXEYZjLxAkKiMYH/do/b/MxpDe/8AgKBi5GhZxridoVIbBq72GDbL36e4p0Ce2jTGUwwU+w==" + dependencies: + callsite "^1.0.0" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==" + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity "sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o= sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==" + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-extend@0.6.0, deep-extend@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw= sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity "sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE= sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + +deepmerge@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753" + integrity "sha1-EEmdhohEza1P7ghC34x/bwyVp1M= sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==" + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity "sha1-RNLqNnm49NT/ujPwPYZfwee/SVU= sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity "sha1-FnEEx1AMIRX23WmwpTa7jtcgVSs= sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==" + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +default-gateway@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-5.0.5.tgz#4fd6bd5d2855d39b34cc5a59505486e9aafc9b10" + integrity "sha1-T9a9XShV05s0zFpZUFSG6ar8mxA= sha512-z2RnruVmj8hVMmAnEJMTIJNijhKCDiGjbLP+BHJFOT7ld3Bo5qcIBpVYDniqhbMIIf+jZDlkP2MkPXiQy/DBLA==" + dependencies: + execa "^3.3.0" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==" + dependencies: + clone "^1.0.2" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE= sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==" + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity "sha1-dp66rz9KY6rTr56NMEybvnm/sOY= sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==" + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity "sha1-1Flono1lS6d+AqgX+HENcCyxbp0= sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==" + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity "sha1-no8RciLqRKMf86FWwEm5kFKp8LQ= sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==" + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity "sha1-3zrhmayt+31ECqrgsp4icrJOxhk= sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity "sha1-U4IULhvcU/hdhtU+X0qn3rkeCEM= sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==" + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==" + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity "sha1-yccHdaScPQO8LAbZpzvlUPl4+LE= sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + +diff-sequences@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" + integrity "sha1-VxXWJE4qpl9Iu6C8ly2wsLEelbU= sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" + +diff-sequences@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" + integrity "sha1-SLqZFX3hkjQS7tQdtrbUqpynwLE= sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==" + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity "sha1-YPOuy4nV+uUgwRqhnvwruYKq3n0= sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU= sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==" + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^2.0.0, dir-glob@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity "sha1-+gnwaUFTyJGLGLoN6vrpR2n8UMQ= sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==" + dependencies: + path-type "^3.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity "sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8= sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==" + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity "sha1-s55/HabrCnW6nBcySzR1PEfgZU0= sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" + +dns-packet@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity "sha1-40VQZYJKJQe6iGxVqJljuxB97G8= sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==" + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==" + dependencies: + buffer-indexof "^1.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE= sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==" + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.5.6: + version "0.5.10" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.10.tgz#caa6d08f60388d0bb4539dd75fe458a9a1d0014c" + integrity "sha1-yqbQj2A4jQu0U53XX+RYqaHQAUw= sha512-Xu9mD0UjrJisTmv7lmVSDMagQcU9R5hwAbxsaAE/35XPnPLJobbuREfV/rraiSaEj/UOvgrzQs66zyTWTlyd+g==" + +dom-align@^1.10.4: + version "1.12.2" + resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.2.tgz#0f8164ebd0c9c21b0c790310493cd855892acd4b" + integrity "sha1-D4Fk69DJwhsMeQMQSTzYVYkqzUs= sha512-pHuazgqrsTFrGU2WLDdXxCFabkdQDx72ddkraZNih1KsMcN5qsRSTR9O4VJRlwTPCPb5COYg3LOfiMHHcPInHg==" + +dom-closest@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-closest/-/dom-closest-0.2.0.tgz#ebd9f91d1bf22e8d6f477876bbcd3ec90216c0cf" + integrity "sha1-69n5HRvyLo1vR3h2u80+yQIWwM8= sha512-6neTn1BtJlTSt+XSISXpnOsF1uni1CHsP/tmzZMGWxasYFHsBOqrHPnzmneqEgKhpagnfnfSfbvRRW0xFsBHAA==" + dependencies: + dom-matches ">=1.0.1" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity "sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g= sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==" + dependencies: + utila "~0.4" + +dom-event-types@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dom-event-types/-/dom-event-types-1.0.0.tgz#5830a0a29e1bf837fe50a70cd80a597232813cae" + integrity "sha1-WDCgop4b+Df+UKcM2ApZcjKBPK4= sha512-2G2Vwi2zXTHBGqXHsJ4+ak/iP0N8Ar+G8a7LiD2oup5o4sQWytwqqrZu/O6hIMV0KMID2PL69OhpshLO0n7UJQ==" + +dom-matches@>=1.0.1: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-matches/-/dom-matches-2.0.0.tgz#d2728b416a87533980eb089b848d253cf23a758c" + integrity "sha1-0nKLQWqHUzmA6wibhI0lPPI6dYw= sha512-2VI856xEDCLXi19W+4BechR5/oIS6bKCKqcf16GR8Pg7dGLJ/eBOWVbCmQx2ISvYH6wTNx5Ef7JTOw1dRGRx6A==" + +dom-scroll-into-view@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz#0decc8522801fd8d3f1c6ba355a74d382c5f989b" + integrity "sha1-DezIUigB/Y0/HGujVadNOCxfmJs= sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity "sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E= sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==" + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity "sha1-YgZDfTLO767HFhgDIwx6ILwbTZE= sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==" + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto= sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + +domelementtype@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8= sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity "sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc= sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity "sha1-k3RCZEymoxJh7zbj7Gd/6AVYLJA= sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==" + dependencies: + webidl-conversions "^4.0.2" + +domhandler@^4.0.0, domhandler@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.2.tgz#e825d721d19a86b8c201a35264e226c678ee755f" + integrity "sha1-6CXXIdGahrjCAaNSZOImxnjudV8= sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==" + dependencies: + domelementtype "^2.2.0" + +dompurify@^2.2.9: + version "2.3.3" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.3.tgz#c1af3eb88be47324432964d8abc75cf4b98d634c" + integrity "sha1-wa8+uIvkcyRDKWTYq8dc9LmNY0w= sha512-dqnqRkPMAjOZE0FogZ+ceJNM2dZ3V/yNOuFB7+39qpO93hHhfRpHw3heYQC7DPK9FqbQTfBKUJhiSfz4MvXYwg==" + +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo= sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==" + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^2.5.2, domutils@^2.6.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity "sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU= sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==" + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity "sha1-kMzOcIzZzYLMTcjD3dmr3VWyDog= sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==" + dependencies: + is-obj "^2.0.0" + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity "sha1-P7rwIL/XlIhAcuomsel5HUWmKfA= sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + +dotenv@^8.2.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" + integrity "sha1-Bhr2ZNGff02PxuT/m1hM4jety4s= sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" + +duplexer@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity "sha1-Or5DrvODX4rgd9E23c4PJ2sEAOY= sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity "sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk= sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==" + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +easy-stack@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/easy-stack/-/easy-stack-1.0.1.tgz#8afe4264626988cabb11f3c704ccd0c835411066" + integrity "sha1-iv5CZGJpiMq7EfPHBMzQyDVBEGY= sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==" + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +editorconfig@^0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5" + integrity "sha1-vvhMTnX7jcsM5c7o79UcFZmb78U= sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==" + dependencies: + commander "^2.19.0" + lru-cache "^4.1.5" + semver "^5.6.0" + sigmund "^1.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + +ejs@^2.6.1: + version "2.7.4" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity "sha1-SGYSh1c9zFPjZsehrlLDoSDuybo= sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" + +electron-to-chromium@^1.3.886: + version "1.3.889" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.889.tgz#0b7c6f7628559592d5406deda281788f37107790" + integrity "sha1-C3xvdihVlZLVQG3tooF4jzcQd5A= sha512-suEUoPTD1mExjL9TdmH7cvEiWJVM2oEiAi+Y1p0QKxI2HcRlT44qDTP2c1aZmVwRemIPYOpxmV7CxQCOWcm4XQ==" + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity "sha1-2jfOvTHnmhNn6UG1ku0fvr1Yq7s= sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==" + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emitter-component@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/emitter-component/-/emitter-component-1.1.1.tgz#065e2dbed6959bf470679edabeaf7981d1003ab6" + integrity "sha1-Bl4tvtaVm/RwZ57avq95gdEAOrY= sha512-G+mpdiAySMuB7kesVRLuyvYRqDmshB7ReKEVuyBPkzQlmiDiLrt7hHHIy4Aff552bgknVN7B2/d3lzhGO5dvpQ==" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY= sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + +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==" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity "sha1-TapNnbAPmBmIDHn6RXrlsJof04k= sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==" + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity "sha1-VXBmIEatKeLpFucariYKvf9Pang= sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + +encoding@^0.1.11: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity "sha1-VldK/deR9UqOmyeFwFgqLSYhD6k= sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==" + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA= sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==" + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.0.0, enhanced-resolve@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity "sha1-Lzz9hNvjtIfxjy2y7x4GSlccpew= sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +enquire.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/enquire.js/-/enquire.js-2.1.6.tgz#3e8780c9b8b835084c3f60e166dbc3c2a3c89814" + integrity "sha1-PoeAybi4NQhMP2DhZtvDwqPImBQ= sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==" + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity "sha1-Kn/l3WNKHkElqXXsmU/1RW3Dc00= sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==" + dependencies: + ansi-colors "^4.1.1" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity "sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU= sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + +entities@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY= sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + +errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity "sha1-i7Ppx9Rjvkl2/4iPdrSAnrwugR8= sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==" + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity "sha1-tKxAZIEH/c3PriQvQovqihTU8b8= sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.2: + version "2.0.6" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" + integrity "sha1-WpmnB716TFinl5AtSNgoA+3mqtg= sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==" + dependencies: + stackframe "^1.1.1" + +es-abstract@^1.17.2, es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity "sha1-1IhXlodpFpWd547aoN9FZicRXsM= sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==" + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo= sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==" + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity "sha1-k8WjrP2+8nUiCtcmRK0C7hg2jeE= sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==" + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-iterator@^2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity "sha1-p96IkUGgWpSwhUQDstCg+/qY87c= sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==" + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity "sha1-utXTwbzawoJp9MszHkMceKxwXRg= sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==" + dependencies: + d "^1.0.1" + ext "^1.1.2" + +es6-weak-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity "sha1-ttofFswswNm+Q+a9v8Xn383zHVM= sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==" + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + +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-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity "sha1-owME6Z2qMuI7L9IPUbq9B8/8o0Q= sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + +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==" + +escodegen@^1.11.1, escodegen@^1.9.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity "sha1-TnuB+6YVgdyXWC7XjKt/Do1j9QM= sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==" + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-loader@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-2.2.1.tgz#28b9c12da54057af0845e2a6112701a2f6bf8337" + integrity "sha1-KLnBLaVAV68IReKmEScBova/gzc= sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==" + dependencies: + loader-fs-cache "^1.0.0" + loader-utils "^1.0.2" + object-assign "^4.0.1" + object-hash "^1.1.4" + rimraf "^2.6.1" + +eslint-plugin-jest@^24.3.6: + version "24.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.7.0.tgz#206ac0833841e59e375170b15f8d0955219c4889" + integrity "sha1-IGrAgzhB5Z43UXCxX40JVSGcSIk= sha512-wUxdF2bAZiYSKBclsUMrYHH6WxiBreNjyDxbRv345TIvPeoCEgPNEn3Sa+ZrSqsf1Dl9SqqSREXMHExlMMu1DA==" + dependencies: + "@typescript-eslint/experimental-utils" "^4.0.1" + +eslint-plugin-vue@^7.9.0: + version "7.20.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-7.20.0.tgz#98c21885a6bfdf0713c3a92957a5afeaaeed9253" + integrity "sha1-mMIYhaa/3wcTw6kpV6Wv6q7tklM= sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw==" + dependencies: + eslint-utils "^2.1.0" + natural-compare "^1.4.0" + semver "^6.3.0" + vue-eslint-parser "^7.10.0" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity "sha1-ygODMxD2iJoyZHgaqC5j65z+eEg= sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity "sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw= sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==" + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity "sha1-0t5eA0JOcH3BDHQGjd7a5wh0Gyc= sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==" + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity "sha1-iuuvrOc0W7M1WdsKHxOh0tSMNnI= sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==" + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4= sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity "sha1-9lMoJZMFknOSyTjtROsKXJsr0wM= sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + +eslint@^7.25.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity "sha1-xtMooUvj+wjI0dIeEsAv23oqgS0= sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==" + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.1.2" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity "sha1-d/xy4f10SiBSwg84pbV1gy6Cc0o= sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==" + dependencies: + acorn "^7.1.1" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.1.0" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity "sha1-8t8zC3Usb1UBn4vYm3ZgA5wbu7Y= sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==" + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE= sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity "sha1-IUj/w4uC6McFff7UhCWz5h8PJKU= sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==" + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.1.0, esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity "sha1-eteWTWeauyi+5yzsY3WLHF0smSE= sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0= sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity "sha1-LupSkHAvJquP5TcDcP+GyWXSESM= sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity "sha1-UvAQF4wqTBF6d1fP6UKtt9LaTKw= sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q= sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + +event-emitter@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==" + dependencies: + d "1" + es5-ext "~0.10.14" + +event-pubsub@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/event-pubsub/-/event-pubsub-4.3.0.tgz#f68d816bc29f1ec02c539dc58c8dd40ce72cb36e" + integrity "sha1-9o2Ba8KfHsAsU53FjI3UDOcss24= sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==" + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity "sha1-Lem2j2Uo1WRO9cWVJqG0oHMGFp8= sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity "sha1-Mala0Kkk4tLEGagTrrLE6HjqdAA= sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + +eventsource@^1.0.7: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" + integrity "sha1-AOjKfJIQnpSw3fMtrGd9hBAoz68= sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==" + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI= sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==" + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exec-sh@^0.3.2: + version "0.3.6" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + integrity "sha1-/yZPnjJVGaYMteJzaSlDSDzKY7w= sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" + +execa@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + integrity "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg= sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==" + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^3.3.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" + integrity "sha1-wI7UVQ72XYWPrCaf/IVyRG8364k= sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==" + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +exifr@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/exifr/-/exifr-6.3.0.tgz#ba6a49c0a30372a969d109684e1cd8450a05ba43" + integrity "sha1-umpJwKMDcqlp0QloThzYRQoFukM= sha512-NCSOP15py+4QyvD90etFN0QOVj12ygVE8kfEDG8GDc+SXf9YAOxua2x5kGp6WvxbGjufA5C3r/1ZKHOpHbEWFg==" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity "sha1-t3c14xXOMPa27/D4OwQVGiJEliI= sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" + integrity "sha1-t1FltIFwdPpKFXeU9G/p8boVtso= sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==" + dependencies: + "@jest/types" "^24.9.0" + ansi-styles "^3.2.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.9.0" + +express@^4.16.3, express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ= sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==" + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext@^1.1.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" + integrity "sha1-OHHVBkHodMwXLitT+RmELRnbTFI= sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==" + dependencies: + type "^2.5.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo= sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity "sha1-ywP3QL764D6k0oPK7SdBqD8zVJU= sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==" + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM= sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==" + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extract-from-css@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/extract-from-css/-/extract-from-css-0.4.4.tgz#1ea7df2e7c7c6eb9922fa08e8adaea486f6f8f92" + integrity "sha1-HqffLnx8brmSL6COitrqSG9vj5I= sha512-41qWGBdtKp9U7sgBxAQ7vonYqSXzgW/SiAYzq4tdWSVhAShvpVCH1nyvPQgjse6EdgbW7Y7ERdT3674/lKr65A==" + dependencies: + css "^2.1.0" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity "sha1-jRcsBkhn8jXAyEpZaAbSeb9LzAc= sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==" + +fast-copy@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-2.1.1.tgz#f5cbcf2df64215e59b8e43f0b2caabc19848083a" + integrity "sha1-9cvPLfZCFeWbjkPwssqrwZhICDo= sha512-Qod3DdRgFZ8GUIM6ygeoZYpQ0QLW9cf/FS9KhhjlYggcSZXWAemAw8BOCO5LuYCrR3Uj3qXDVTUzOUwG8C7beQ==" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU= sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + +fast-equals@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-2.0.3.tgz#7039b0a039909f345a2ce53f6202a14e5f392efc" + integrity "sha1-cDmwoDmQnzRaLOU/YgKhTl85Lvw= sha512-0EMw4TTUxsMDpDkCg0rXor2gsg+npVrMIHbEhvD0HZyIhUX6AktC/yasm+qKwfyswd06Qy95ZKk8p2crTo0iPA==" + +fast-glob@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity "sha1-aVOFfDr6R1//ku5gFdUtpwpM050= sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==" + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-glob@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity "sha1-/Wy3otfpqnp4RhEehaGW1rL3ZqE= sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==" + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-patch@^3.0.0-1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-3.1.0.tgz#ec8cd9b9c4c564250ec8b9140ef7a55f70acaee6" + integrity "sha1-7IzZucTFZCUOyLkUDvelX3CsruY= sha512-IhpytlsVTRndz0hU5t0/MGzS/etxLlfrpG5V5M9mVbuj9TrJLWaMfsox9REM5rkuGX0T+5qjpe8XA1o0gZ42nA==" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM= sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity "sha1-YWdg+Ip1Jr38WWt8q4wYk4w2uYw= sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==" + dependencies: + reusify "^1.0.4" + +fault@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" + integrity "sha1-6vz8Cm0hT8lGAeFw3ymVSk+ELxM= sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==" + dependencies: + format "^0.2.0" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity "sha1-fw2Sdc/dhqHJY9yLZfzEUe3Lsdo= sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==" + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity "sha1-/IT7OdJwnPP/bXQ3BhV7tXCKioU= sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==" + dependencies: + bser "2.1.1" + +fbjs@^0.8.9: + version "0.8.18" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.18.tgz#9835e0addb9aca2eff53295cd79ca1cfc7c9662a" + integrity "sha1-mDXgrduayi7/Uylc15yhz8fJZio= sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA==" + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.30" + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity "sha1-tO7oFIq7Adzx0aw0Nn1Z4S+mHW4= sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity "sha1-YlwYvSk8YE3EqN2y/r8MiDQXRq8= sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==" + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity "sha1-IRst2WWcsDlLBz5zI6w8kz1SICc= sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==" + dependencies: + flat-cache "^3.0.4" + +file-loader@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af" + integrity "sha1-eA8ED3KbPRgBnyBgX3I+hEuKWK8= sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==" + dependencies: + loader-utils "^1.2.3" + schema-utils "^2.5.0" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity "sha1-uu98+OGEDfMl5DkLRISHlIDuvk0= sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==" + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity "sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90= sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + +filesize@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity "sha1-CQuz7gG2+AGoqL6Z0xcQs0Irsxc= sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +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" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0= sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==" + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-babel-config@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2" + integrity "sha1-qbezF+tbmGDNqdVHQKjIM3oig6I= sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==" + dependencies: + json5 "^0.5.1" + path-exists "^3.0.0" + +find-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + integrity "sha1-yN765XyKUqinhPnjHFfHQumToLk= sha512-Z9XSBoNE7xQiV6MSgPuCfyMokH2K7JdpRkOYE1+mu3d4BFJtx3GW+f6Bo4q8IX6rlf5MYbLBKW0pjl2cWdkm2A==" + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc= sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==" + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.0.0, find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity "sha1-swxbbv8HMHMa6pu9nb7L2AJW1ks= sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==" + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M= sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==" + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk= sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==" + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity "sha1-YbAzgwKy/p+Vfcwy/CqH8cMEixE= sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==" + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" + integrity "sha1-ZL/tXLaP48p4s+shStl7Y77c5WE= sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==" + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity "sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug= sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==" + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@^1.0.0, follow-redirects@^1.14.0: + version "1.14.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381" + integrity "sha1-8JpYSJgdPHcrU5Iwl3hSP42Fw4E= sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==" + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity "sha1-abRH6IoKXTLD5whPPxcQA0shN24= sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==" + dependencies: + is-callable "^1.1.3" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" + +"fork-ts-checker-webpack-plugin-v5@npm:fork-ts-checker-webpack-plugin@^5.0.11": + version "5.2.1" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-5.2.1.tgz#79326d869797906fa8b24e2abcf9421fc805450d" + integrity "sha1-eTJthpeXkG+osk4qvPlCH8gFRQ0= sha512-SVi+ZAQOGbtAsUWrZvGzz38ga2YqjWvca1pXQFUArIVXqli0lLoDQ8uS0wg0kSpcwpZmaW5jVCZXQebkyUQSsw==" + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + +fork-ts-checker-webpack-plugin@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz#a1642c0d3e65f50c2cc1742e9c0a80f441f86b19" + integrity "sha1-oWQsDT5l9QwswXQunAqA9EH4axk= sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==" + dependencies: + babel-code-frame "^6.22.0" + chalk "^2.4.1" + chokidar "^3.3.0" + micromatch "^3.1.10" + minimatch "^3.0.4" + semver "^5.6.0" + tapable "^1.0.0" + worker-rpc "^0.1.0" + +form-data-encoder@^1.4.3: + version "1.7.0" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.0.tgz#1abcf7ec821e27eea868d5eecf9665910b3ff119" + integrity "sha1-Grz37IIeJ+6oaNXuz5ZlkQs/8Rk= sha512-zGhcpAhxoq7ut+sldaXVwmQHvvrlUHm6jLJoqCMuhf4vjMe+Vn+PAjIB6OrqSFoIk4c3/oK6M69RXJYrYl0zWg==" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity "sha1-3M5SwF9kTymManq5Nr1yTO/786Y= sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +format@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs= sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==" + +formdata-node@^4.0.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-4.3.1.tgz#e7b78a2a51f524ccc483b4d223c89690fd22061d" + integrity "sha1-57eKKlH1JMzEg7TSI8iWkP0iBh0= sha512-8xKSa9et4zb+yziWsD/bI+EYjdg1z2p9EpKr+o+Yk12F/wP66bmDdvjj2ZXd2K/MJlR3HBzWnuV7f82jzHRqCA==" + dependencies: + node-domexception "1.0.0" + web-streams-polyfill "4.0.0-beta.1" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity "sha1-ImmTZCiq1MFcfr6XeahL8LKoGBE= sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==" + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity "sha1-DYUhIuW8W+tFP7Ao6cDJvzY0DJQ= sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity "sha1-TxicRKoSO4lfcigE9V6iPq3DSOk= sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity "sha1-WVRGDHZKjaIJS6NVS/g55rmnyG0= sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==" + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity "sha1-rjrJLVO7Mo7+DpodlUH2rY1I4tM= sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==" + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +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@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg= sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==" + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +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==" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0= sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity "sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA= sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + +get-caller-file@^2.0.1, 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-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity "sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y= sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==" + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity "sha1-tf3nfyLL4185C04ImSLFC85u9mQ= sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==" + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity "sha1-wbJVV189wh1Zv8ec09K0axw6VLU= sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==" + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity "sha1-SWaheV7lrOZecGxLe+txJX1uItM= sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==" + dependencies: + pump "^3.0.0" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity "sha1-f9uByQAQH71WTdXxowr1qtweWNY= sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==" + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==" + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.1.2, 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-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==" + +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity "sha1-0VU1r3cy4C6Uj0xBYovZECk/YCM= sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==" + 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" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4= sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + +globals@^13.6.0, globals@^13.9.0: + version "13.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e" + integrity "sha1-TXM3YDBCMKAILtluIeXFZfiYCJ4= sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==" + dependencies: + type-fest "^0.20.2" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo= sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + +globby@^11.0.3: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity "sha1-LLr/d8Lypi5x6bKBOme5ejowAaU= sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==" + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==" + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" + integrity "sha1-+yzP+UAfhgCUXfral0QMypcrhoA= sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==" + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +globby@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity "sha1-/QKacGxwPSm90XD0tts6P3p8tj0= sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==" + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity "sha1-5BK40z9eAGWTy9PO5t+fLOu+gCo= sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + +graphlib@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" + integrity "sha1-V2HUFHN4cAhMkux7XbywWSydNdo= sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==" + dependencies: + lodash "^4.17.15" + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==" + +gzip-size@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity "sha1-y5vuaS+HwGErIyhAqHOQTkwTUnQ= sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==" + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity "sha1-hX95zjWVgMNA1DCBzGSJcNC7I04= sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity "sha1-HwgDufjLIMD6E4It8ezds2veHv0= sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==" + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==" + dependencies: + ansi-regex "^2.0.0" + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity "sha1-ZP5qywIGc+O3jbA1pa9pqp0HsRM= sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity "sha1-tdRU3CGZriJWmfNGfloH87lVuv0= sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + +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==" + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity "sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM= sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity "sha1-fhM4GKfTlHNPlB5zw9P5KR5liyU= sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==" + dependencies: + has-symbols "^1.0.2" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity "sha1-bWHeldkd/Km5oCCJrThL/49it3E= sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y= sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity "sha1-VcOB2eBuHSmXqIO0o/3f5/DTrzM= sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==" + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash-sum@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" + integrity "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ= sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==" + +hash-sum@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a" + integrity "sha1-gdAbtd6OpKIUrV1urRtSNGCwtFo= sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I= sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==" + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity "sha1-1Xwj9NoWrjxjs7bKRhZoMxNJnDo= sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity "sha1-6HaNfqxWw/3qyKkoMNWOgR5b9kA= sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==" + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +he@1.2.x, he@^1.1.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==" + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity "sha1-TAb8y0YC/iYCs8k9+C1+fb8aio4= sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + +highlight.js@^10.4.1, highlight.js@^10.7.1, highlight.js@~10.7.0: + version "10.7.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity "sha1-aXJy45kTVuQMPKxWanTu9oF1ZTE= sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" + +highlight.js@^9.12.0: + version "9.18.5" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825" + integrity "sha1-0Yo1mGfzeME41oGe38KorNXymCU= sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA==" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==" + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity "sha1-7OCsr3HWLClpwuxZ/v9CpLGoW0U= sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==" + dependencies: + react-is "^16.7.0" + +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity "sha1-YJIH1mEQADOpqUAq096mdzgcGx0= sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity "sha1-3/wL+aIcAiCQkPKqaUKeFBTa8/k= sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==" + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==" + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity "sha1-wc56MWjIxmFAM6S194d/OyJfnDg= sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==" + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity "sha1-5w2EuU2lOqN14R/jo1G+ZkLKRvg= sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==" + dependencies: + whatwg-encoding "^1.0.1" + +html-entities@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + integrity "sha1-z70bAdKvr5rcobEK59/6uYxx0tw= sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity "sha1-39YAJ9o2o238viNiYsAKWCJoFFM= sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + +html-minifier@^3.2.3: + version "3.5.21" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c" + integrity "sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw= sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==" + dependencies: + camel-case "3.0.x" + clean-css "4.2.x" + commander "2.17.x" + he "1.2.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.4.x" + +html-tags@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b" + integrity "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos= sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==" + +html-tags@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" + integrity "sha1-e15vfmZen7QfMAB+2eDUHpf7IUA= sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==" + +html-webpack-plugin@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" + integrity "sha1-sBq71yOsqqeze2r0SS69oD2d03s= sha512-Br4ifmjQojUP4EmHnRBoUIYcZ9J7M4bTMcm7u6xoIAIuq2Nte4TzXX0533owvkQKQD1WeMTTTyD4Ni4QKxS0Bg==" + dependencies: + html-minifier "^3.2.3" + loader-utils "^0.2.16" + lodash "^4.17.3" + pretty-error "^2.0.2" + tapable "^1.0.0" + toposort "^1.0.0" + util.promisify "1.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity "sha1-xNditsM3GgXb5l6UrkOp+EX7j7c= sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==" + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8= sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==" + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==" + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity "sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY= sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==" + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" + integrity "sha1-AdJwnHnUFpi7AdTezF6dpOSgM9k= sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity "sha1-GDx9xKoUeRUDBkmMIQza+WCApDo= sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==" + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy-middleware@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz#43700d6d9eecb7419bf086a128d0f7205d9eb665" + integrity "sha1-Q3ANbZ7st0Gb8IahKND3IF2etmU= sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==" + dependencies: + "@types/http-proxy" "^1.17.5" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.17.0, http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity "sha1-QBVB8FNIhLv5UmAzTnL4juOXZUk= sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==" + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity "sha1-xbHNFPUK6uCatsWf5jujOV/k36M= sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs= sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==" + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity "sha1-pS+AvzjaGVLrXGgXkHGYcaGnJQE= sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==" + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity "sha1-IRcLU3ie4nRHwvR91oMIFAP5pGc= sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==" + dependencies: + postcss "^7.0.14" + +ieee754@^1.1.4, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity "sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I= sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity "sha1-xg7taebY/bazEEofy8ocGS3FtQE= sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==" + +ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity "sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM= sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + +ignore@^4.0.3, ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw= sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + +ignore@^5.1.4, ignore@^5.1.8: + version "5.1.9" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" + integrity "sha1-nsGly+jhRG7GDUQgBg1Dqm5zgvs= sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==" + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==" + +immutable@^3.8.1, immutable@^3.x.x: + version "3.8.2" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" + integrity "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==" + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==" + dependencies: + import-from "^2.1.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity "sha1-2BNVwVYS04bGH53dOSLUMEgipUY= sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==" + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity "sha1-NxYsJfy566oublPVtNiM4X2eDCs= sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==" + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity "sha1-M1238qev/VOqpHHUuAId7ja387E= sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==" + dependencies: + resolve-from "^3.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity "sha1-VQcL44pZk88Y72236WH1vuXFoJ0= sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==" + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity "sha1-khi5srkoojixPcT7a21XbyMUU+o= sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity "sha1-8w9xbI4r00bHtn0985FVZqfAVgc= sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==" + +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity "sha1-xM78qo5RBRwqQLos6KPScpWvlGc= sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + +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, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w= sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==" + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity "sha1-op2kJbSIBvNHZ6Tvzjlyaa8oQyw= sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + +inquirer@^7.1.0: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity "sha1-BNF2sq8Er8FXqD/XwQDpjuCq0AM= sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==" + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity "sha1-hFRSuq2dLKO2nGNaE3rLmg2tCQc= sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==" + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity "sha1-c0fjB97uovqsKsYgXUvH00ln9Zw= sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==" + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity "sha1-Zlq4vE2iendKQFhOgS4+D6RbGh4= sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + +intersperse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/intersperse/-/intersperse-1.0.0.tgz#f2561fb1cfef9f5277cc3347a22886b4351a5181" + integrity "sha1-8lYfsc/vn1J3zDNHoiiGtDUaUYE= sha512-LGcfug7OTeWkaQ8PEq8XbTy9Jl6uCNg8DrPnQUmwxSY8UETj1Y+LLmpdD0qHdEj6KVchuH3BE3ZzIXQ1t3oFUw==" + +invariant@^2.0.0, invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY= sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==" + dependencies: + loose-envify "^1.0.0" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==" + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= sha512-rBtCAQAJm8A110nbwn6YdveUnuZH3WrC36IwkRXxDnq53JvXA2NVQvB7IHyKomxK1MJ4VDNw3UtFDdXQ+AvLYA==" + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM= sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==" + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity "sha1-lsaiK2ojkpsR6gr7GDbDatSl1pg= sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY= sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==" + dependencies: + kind-of "^6.0.0" + +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity "sha1-nn1rlJFr4iFTdF0YTCmMv5hqaG0= sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity "sha1-frmiQx+FX2se8aeOMm31FWlsTb8= sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==" + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity "sha1-FbP4j9oB8ql/7ITKdhpWDxI++ps= sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==" + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity "sha1-RXSirlb3qyBolvtDHq7tBm/fjwM= sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity "sha1-CBR6GHW8KzIAXUHM2Ckd/8ZpHfM= sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==" + dependencies: + has-bigints "^1.0.1" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==" + dependencies: + binary-extensions "^1.0.0" + +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-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity "sha1-XG3CACRt2TIa5LiFoRS7H3X2Nxk= sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==" + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity "sha1-76ouqdqg16suoTqXsritUf776L4= sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity "sha1-RzAdWN0CWUB4ZVR4U99tYf5HGUU= sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" + +is-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity "sha1-43ecjuF/zPQoSI9uKBGH8uYyhBw= sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==" + dependencies: + ci-info "^1.5.0" + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity "sha1-a8YzQYGBDgS1wis9WJ/cpVAmQEw= sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==" + dependencies: + ci-info "^2.0.0" + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==" + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-core-module@^2.2.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" + integrity "sha1-AyEzbD0JJeSX/Zf12VyxFKXM1Ug= sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==" + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc= sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==" + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity "sha1-CEHVU25yTCVZe/bqYuG9OCmN8x8= sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==" + dependencies: + has-tostringtag "^1.0.0" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity "sha1-ZaOllYocW2OnBuGzM9fNn2MNP6U= sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco= sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw= sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==" + +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity "sha1-M+6r4jz+hvFL3kQIoCwM+4U6zao= sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + +is-dom@^1.0.9: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-dom/-/is-dom-1.1.0.tgz#af1fced292742443bb59ca3f76ab5e80907b4e8a" + integrity "sha1-rx/O0pJ0JEO7Wco/dqtegJB7Too= sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ==" + dependencies: + is-object "^1.0.1" + is-window "^1.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ= sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==" + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.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-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity "sha1-fRQK3DiarzARqPKipM+m+q3/sRg= sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==" + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity "sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ= sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity "sha1-zDXJdYjaS9Saju3WvECC1E3LI6c= sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + +is-mobile@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-mobile/-/is-mobile-2.2.2.tgz#f6c9c5d50ee01254ce05e739bdd835f1ed4e9954" + integrity "sha1-9snF1Q7gElTOBec5vdg18e1OmVQ= sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg==" + +is-negative-zero@^2.0.0, is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity "sha1-PedGwY3aIxkkGlNnWQjY92bxHCQ= sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity "sha1-anqvg4x/BoalC0VT9+VKlklOifA= sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==" + dependencies: + has-tostringtag "^1.0.0" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==" + dependencies: + kind-of "^3.0.2" + +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-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity "sha1-PkcprB9f3gJc19g6iW2rn09n2w8= sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==" + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity "sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI= sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + +is-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" + integrity "sha1-pWVS4cZlyelQtKAlRh2ofnL4b88= sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==" + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity "sha1-Z9Q7gmZKe1GR/ZEZEn6zAASKn9s= sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity "sha1-v+Lcomxp85cmWkAJljYCk1oFOss= sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==" + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity "sha1-fJgQWH1lmkDSe8201WFuqwWUlLI= sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==" + dependencies: + path-is-inside "^1.0.2" + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity "sha1-caUMhCnfync8kqOQpKA7OfzVHT4= sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==" + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity "sha1-r28uoUrFpkYYOlu9tbqrvBVq2dc= sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc= sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==" + dependencies: + isobject "^3.0.1" + +is-promise@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity "sha1-OauVnMv5p3TPB597QMeib3YxNfE= sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + +is-regex@^1.0.4, is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity "sha1-7vVmPNWfpMCuM5UFMj32hUuxWVg= sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==" + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity "sha1-/S2INUXEa6xaYz57mgnof6LLUGk= sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg= sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + +is-shallow-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shallow-equal/-/is-shallow-equal-1.0.1.tgz#c410b51eb1c12ee50cd02891d32d1691a132d73c" + integrity "sha1-xBC1HrHBLuUM0CiR0y0WkaEy1zw= sha512-lq5RvK+85Hs5J3p4oA4256M1FEffzmI533ikeDHvJd42nouRRx5wBzt36JuviiGe5dIPyHON/d0/Up+PBo6XkQ==" + +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity "sha1-l7DIX72stZycRG/mU7gs8rW3z+Y= sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==" + +is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity "sha1-EtSj3U5o4Lec6428hBc66A2RykQ= sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity "sha1-+sHj1TuXrVqdCunO8jifWBClwHc= sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity "sha1-DdEr8gBvJVu1j2lREO/3SR7rwP0= sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==" + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity "sha1-ptrJO2NbBjymhyI23oiRClevE5w= sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==" + dependencies: + has-symbols "^1.0.2" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + +is-weakref@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" + integrity "sha1-hC26TsF/qayYUN8tbvvBc3J08qI= sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==" + dependencies: + call-bind "^1.0.0" + +is-whitespace@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f" + integrity "sha1-Fjnssb4DauxppUy7QBz77XEUq38= sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==" + +is-window@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-window/-/is-window-1.0.2.tgz#2c896ca53db97de45d3c33133a65d8c9f563480d" + integrity "sha1-LIlspT25feRdPDMTOmXYyfVjSA0= sha512-uj00kdXyZb9t9RcAUAwMZAnkBUwdYGhYlt7djMXhfyhUCzwNba50tIiBKR7q0l7tdoBtFVw/3JmLY6fI3rmZmg==" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0= sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==" + +is-wsl@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity "sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE= sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==" + dependencies: + is-docker "^2.0.0" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + +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==" + +ismobilejs@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ismobilejs/-/ismobilejs-1.1.1.tgz#c56ca0ae8e52b24ca0f22ba5ef3215a2ddbbaa0e" + integrity "sha1-xWygro5Sskyg8iul7zIVot27qg4= sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity "sha1-TkMekrEalzFjaqH5yNHMvP2reN8= sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==" + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity "sha1-Z18KtpUD+tSx2En3NrqsqAM0T0k= sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==" + +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity "sha1-pfY9kfC7wMPkee9MXeAnM17G1jA= sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==" + dependencies: + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" + semver "^6.0.0" + +istanbul-lib-report@^2.0.4: + version "2.0.8" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + integrity "sha1-WoETzXRtQ8SInro2qxDn1QybTzM= sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==" + dependencies: + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + supports-color "^6.1.0" + +istanbul-lib-source-maps@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity "sha1-KEmXxIIRdS7EhiU9qX44ed77qMg= sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==" + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" + +istanbul-reports@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931" + integrity "sha1-XZOfYjfXtIOTzAlZ6rQM1P0FaTE= sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==" + dependencies: + html-escaper "^2.0.0" + +javascript-stringify@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" + integrity "sha1-J8dlOb4U2L0Sghmi1zGwkzeQTnk= sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==" + +jest-changed-files@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" + integrity "sha1-CNjBXreaf6P8mCabwUtFHugvgDk= sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==" + dependencies: + "@jest/types" "^24.9.0" + execa "^1.0.0" + throat "^4.0.0" + +jest-cli@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" + integrity "sha1-rS3mLQdHLUGcarwwH8QyuYsQ0q8= sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==" + dependencies: + "@jest/core" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + import-local "^2.0.0" + is-ci "^2.0.0" + jest-config "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^13.3.0" + +jest-config@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" + integrity "sha1-+xu8YMc6Rq8DWQcZ76SCXm5N0bU= sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==" + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^24.9.0" + "@jest/types" "^24.9.0" + babel-jest "^24.9.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.9.0" + jest-environment-node "^24.9.0" + jest-get-type "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + micromatch "^3.1.10" + pretty-format "^24.9.0" + realpath-native "^1.1.0" + +jest-diff@^24.3.0, jest-diff@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" + integrity "sha1-kxt9DVd4obr3RSy4FuMl43JAVdo= sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==" + dependencies: + chalk "^2.0.1" + diff-sequences "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-diff@^26.0.0: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" + integrity "sha1-GqdGi1LDpo19XF/c381eSb0WQ5Q= sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==" + dependencies: + chalk "^4.0.0" + diff-sequences "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-docblock@^24.3.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" + integrity "sha1-eXAgGAK6Vg4cQJLMJcvt9a9ajOI= sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==" + dependencies: + detect-newline "^2.1.0" + +jest-each@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" + integrity "sha1-6y2mAuKmEImNvF8fbfO6hrVfiwU= sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==" + dependencies: + "@jest/types" "^24.9.0" + chalk "^2.0.1" + jest-get-type "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + +jest-environment-jsdom-fifteen@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom-fifteen/-/jest-environment-jsdom-fifteen-1.0.2.tgz#49a0af55e0d32737a6114a1575dd714702ad63b0" + integrity "sha1-SaCvVeDTJzemEUoVdd1xRwKtY7A= sha512-nfrnAfwklE1872LIB31HcjM65cWTh1wzvMSp10IYtPJjLDUbTTvDpajZgIxUnhRmzGvogdHDayCIlerLK0OBBg==" + dependencies: + "@jest/environment" "^24.3.0" + "@jest/fake-timers" "^24.3.0" + "@jest/types" "^24.3.0" + jest-mock "^24.0.0" + jest-util "^24.0.0" + jsdom "^15.2.1" + +jest-environment-jsdom@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" + integrity "sha1-SwgGx/yU+V7bNpppzCd47sK3N1s= sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==" + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + jsdom "^11.5.1" + +jest-environment-node@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" + integrity "sha1-Mz0tJ5b5aH8q7r8HQrUZ8zwcv9M= sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==" + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + +jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity "sha1-FoSgyKUPLkkBtmRK6GH1ee7S7w4= sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" + +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" + integrity "sha1-6X3Dw/U8K0Bsp6+u1Ek7HQmRmeA= sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" + +jest-haste-map@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + integrity "sha1-s4pdZCdJNOIfpBeump++t3zqrH0= sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==" + dependencies: + "@jest/types" "^24.9.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.9.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + +jest-jasmine2@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" + integrity "sha1-H3sb0yQsF3TmKsq7NkbZavw75qA= sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==" + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.9.0" + is-generator-fn "^2.0.0" + jest-each "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + throat "^4.0.0" + +jest-leak-detector@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" + integrity "sha1-tmXep8dxAMXE99/LFTtlzwfc+Wo= sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==" + dependencies: + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-matcher-utils@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" + integrity "sha1-9bNmHV5ijf/m3WUlHf2uDofDoHM= sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==" + dependencies: + chalk "^2.0.1" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity "sha1-Un9UoeOA9eICqNEUmw7IcvQxGeM= sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==" + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-mock@^24.0.0, jest-mock@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + integrity "sha1-wig1VB7jebkIZzrVEIeiGFwT8cY= sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==" + dependencies: + "@jest/types" "^24.9.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity "sha1-twSsCuAoqJEIpNBAs/kZ393I4zw= sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" + +jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" + integrity "sha1-wT+zOAveIr9ldUMsST6o/jeWVjY= sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==" + +jest-resolve-dependencies@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" + integrity "sha1-rQVRmJWcTPuopPBmxnOj8HhlB6s= sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==" + dependencies: + "@jest/types" "^24.9.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.9.0" + +jest-resolve@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" + integrity "sha1-3/BMdoevNMTdflJIktnPd+XRcyE= sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==" + dependencies: + "@jest/types" "^24.9.0" + browser-resolve "^1.11.3" + chalk "^2.0.1" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" + integrity "sha1-V0+v29VEVcKzS0vfQ2WiOFf830I= sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==" + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-docblock "^24.3.0" + jest-haste-map "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-leak-detector "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" + integrity "sha1-nxRYOvak9zFKap2fAibhp4HI5Kw= sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==" + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^13.3.0" + +jest-serializer-vue@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/jest-serializer-vue/-/jest-serializer-vue-2.0.2.tgz#b238ef286357ec6b480421bd47145050987d59b3" + integrity "sha1-sjjvKGNX7GtIBCG9RxRQUJh9WbM= sha512-nK/YIFo6qe3i9Ge+hr3h4PpRehuPPGZFt8LDBdTHYldMb7ZWlkanZS8Ls7D8h6qmQP2lBQVDLP0DKn5bJ9QApQ==" + dependencies: + pretty "2.0.0" + +jest-serializer@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + integrity "sha1-5tfX75bTHouQeacUdUxdXFgojnM= sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==" + +jest-snapshot@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" + integrity "sha1-7I6cpPLsDFyHro+SXPl0l7DpUbo= sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==" + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + expect "^24.9.0" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^24.9.0" + semver "^6.2.0" + +jest-transform-stub@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/jest-transform-stub/-/jest-transform-stub-2.0.0.tgz#19018b0851f7568972147a5d60074b55f0225a7d" + integrity "sha1-GQGLCFH3VolyFHpdYAdLVfAiWn0= sha512-lspHaCRx/mBbnm3h4uMMS3R5aZzMwyNpNIJLXj4cEsV0mIUtS4IjYJLSoyjRCtnxb6RIGJ4NL2quZzfIeNhbkg==" + +jest-util@^24.0.0, jest-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + integrity "sha1-c5aBTkhTbS6Fo33j5MQx18sUAWI= sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==" + dependencies: + "@jest/console" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/source-map" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + +jest-validate@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" + integrity "sha1-B3XFU2DRc82FTkAYB1bU/1Le+Ks= sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==" + dependencies: + "@jest/types" "^24.9.0" + camelcase "^5.3.1" + chalk "^2.0.1" + jest-get-type "^24.9.0" + leven "^3.1.0" + pretty-format "^24.9.0" + +jest-watch-typeahead@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz#e5be959698a7fa2302229a5082c488c3c8780a4a" + integrity "sha1-5b6Vlpin+iMCIppQgsSIw8h4Cko= sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==" + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.1" + jest-regex-util "^24.9.0" + jest-watcher "^24.3.0" + slash "^3.0.0" + string-length "^3.1.0" + strip-ansi "^5.0.0" + +jest-watcher@^24.3.0, jest-watcher@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" + integrity "sha1-S1bl0c7/AF9biOUo3Jr8jdTtKzs= sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==" + dependencies: + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + jest-util "^24.9.0" + string-length "^2.0.0" + +jest-worker@^24.6.0, jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity "sha1-Xb/bWy0yLphWeJgjipaXvM5ns+U= sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==" + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + +jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" + integrity "sha1-mH0pDAWgi1LFYYjBAC42jtsAcXE= sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==" + dependencies: + import-local "^2.0.0" + jest-cli "^24.9.0" + +js-base64@^2.6.1: + version "2.6.4" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" + integrity "sha1-9OaGxd4eofhn28rT1G2WlCjfmMQ= sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" + +js-beautify@^1.6.12, js-beautify@^1.6.14: + version "1.14.0" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.14.0.tgz#2ce790c555d53ce1e3d7363227acf5dc69024c2d" + integrity "sha1-LOeQxVXVPOHj1zYyJ6z13GkCTC0= sha512-yuck9KirNSCAwyNJbqW+BxJqJ0NLJ4PwBUzQQACl5O3qHMBXVkXb/rD0ilh/Lat/tn88zSZ+CAHOlk0DsY7GuQ==" + dependencies: + config-chain "^1.1.12" + editorconfig "^0.15.3" + glob "^7.1.3" + nopt "^5.0.0" + +js-file-download@^0.4.12: + version "0.4.12" + resolved "https://registry.yarnpkg.com/js-file-download/-/js-file-download-0.4.12.tgz#10c70ef362559a5b23cdbdc3bd6f399c3d91d821" + integrity "sha1-EMcO82JVmlsjzb3DvW85nD2R2CE= sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg==" + +js-message@1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/js-message/-/js-message-1.0.7.tgz#fbddd053c7a47021871bb8b2c95397cc17c20e47" + integrity "sha1-+93QU8ekcCGHG7iyyVOXzBfCDkc= sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==" + +js-queue@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/js-queue/-/js-queue-2.0.2.tgz#0be590338f903b36c73d33c31883a821412cd482" + integrity "sha1-C+WQM4+QOzbHPTPDGIOoIUEs1II= sha512-pbKLsbCfi7kriM3s1J4DDCo7jQkI58zPLHi0heXPzPlj0hjUsm+FesPUbE0DSbIVIK503A36aUBoCN7eMFedkA==" + dependencies: + easy-stack "^1.0.1" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity "sha1-GSA/tZmR35jjoocFDUZHzerzJJk= sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity "sha1-mGbfOVECEw449/mWvOtlRDIJwls= sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==" + +js-yaml@=4.1.0, 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" + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity "sha1-2ugS/bOCX6MGYJqHFzg8UMNqBTc= sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity "sha1-peZUwuWi3rXyAdls77yoDA7y9RM= sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity "sha1-GoDUDd03ih3lllbp5txaO6hle8g= sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==" + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +jsdom@^15.2.1: + version "15.2.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" + integrity "sha1-0v6xrvcYP4a+UhuMaDP/UpbQfsU= sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==" + dependencies: + abab "^2.0.0" + acorn "^7.1.0" + acorn-globals "^4.3.2" + array-equal "^1.0.0" + cssom "^0.4.1" + cssstyle "^2.0.0" + data-urls "^1.1.0" + domexception "^1.0.1" + escodegen "^1.11.1" + html-encoding-sniffer "^1.0.2" + nwsapi "^2.2.0" + parse5 "5.1.0" + pn "^1.1.0" + request "^2.88.0" + request-promise-native "^1.0.7" + saxes "^3.1.9" + symbol-tree "^3.2.2" + tough-cookie "^3.0.1" + w3c-hr-time "^1.0.1" + w3c-xmlserializer "^1.1.2" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^7.0.0" + ws "^7.0.0" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q= sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk= sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity "sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0= sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + +json-schema-editor-vue@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/json-schema-editor-vue/-/json-schema-editor-vue-1.2.5.tgz#6a4c03ea00f24bd4fef23ea8f0dc6d1f9c161a80" + integrity "sha1-akwD6gDyS9T+8j6o8NxtH5wWGoA= sha512-t63czJnxvOUWOhywnRF8L2vm7D5ZcoSq01MRvePU11etEQ6TNsWf/NnrR9AM67Z/pyEubKLXZemI8Z0Cik88YQ==" + dependencies: + ant-design-vue "^1.7.2" + core-js "^3.6.5" + vue "^2.6.11" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity "sha1-afaofZUTq4u4/mO9sJecRI5oRmA= sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity "sha1-rnvLNlard6c7pcSb9lTzjmtoYOI= sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= sha512-a3xHnILGMtk+hDOqNwHzF6e2fNbiMrXZvxKQiEv2MlgQP+pjIOzqAmKYD2mDpXYE/44M7g+n9p2bKkYWDUcXCQ==" + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= sha512-i/J297TW6xyj7sDFa7AmBPkQvLIxWr2kKPWI26tXydnZrzVAocNqn5DMNT1Mzk0vit1V5UkRM7C1KdVNp7Lmcg==" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + +json2mq@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a" + integrity "sha1-tje9O6nqvhIsg+lyBIOusQ0skEo= sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==" + dependencies: + string-convert "^0.2.0" + +json3@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity "sha1-f8EON1/FrkLEcFpcwKpvYr4wW4E= sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + +json5@2.x, json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity "sha1-Lf7+cgxrpSXZ69kJlQ8FFTFsiaM= sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==" + dependencies: + minimist "^1.2.5" + +json5@^0.5.0, json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==" + +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" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity "sha1-vFWyY0eTxnnsZAMJTrE2mKbsCq4= sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==" + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= sha512-4Dj8Rf+fQ+/Pn7C5qeEX02op1WfOss3PKTE9Nsop3Dx+6UPxlm1dr/og7o2cRa5hNN07CACr4NFzRLtj/rjWog==" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +just-kebab-case@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/just-kebab-case/-/just-kebab-case-1.1.0.tgz#ebe854fde84b0afa4e597fcd870b12eb3c026755" + integrity "sha1-6+hU/ehLCvpOWX/NhwsS6zwCZ1U= sha512-QkuwuBMQ9BQHMUEkAtIA4INLrkmnnveqlFB1oFi09gbU0wBdZo6tTnyxNWMR84zHxBuwK7GLAwqN8nrvVxOLTA==" + +katex@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.6.0.tgz#12418e09121c05c92041b6b3b9fb6bab213cb6f3" + integrity "sha1-EkGOCRIcBckgQbazuftrqyE8tvM= sha512-rS4mY3SvHYg5LtQV6RBcK0if7ur6plyEukAOV+jGGPqFImuzu8fHL6M752iBmRGoUyF0bhZbAPoezehn7xYksA==" + dependencies: + match-at "^0.1.0" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity "sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI= sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity "sha1-IIE989cSkosgc3hpGkUGb65y3Vc= sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==" + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0= sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0= sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity "sha1-p5yezIbuHOP6YgbRIWxQHxR/wH4= sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + +klona@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" + integrity "sha1-0WZXTZAHY5XZljqnqSj6u412r7w= sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==" + +launch-editor-middleware@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz#e14b07e6c7154b0a4b86a0fd345784e45804c157" + integrity "sha1-4UsH5scVSwpLhqD9NFeE5FgEwVc= sha512-s0UO2/gEGiCgei3/2UN3SMuUj1phjQN8lcpnvgLSz26fAzNWPQ6Nf/kF5IFClnfU2ehp6LrmKdMU/beveO+2jg==" + dependencies: + launch-editor "^2.2.1" + +launch-editor@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.2.1.tgz#871b5a3ee39d6680fcc26d37930b6eeda89db0ca" + integrity "sha1-hxtaPuOdZoD8wm03kwtu7aidsMo= sha512-On+V7K2uZK6wK7x691ycSUbLD/FyKKelArkbaAMSSJU8JmqmhwN2+mnJDNINuJWSrh2L0kDk+ZQtbC/gOWUwLw==" + dependencies: + chalk "^2.3.0" + shell-quote "^1.6.1" + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity "sha1-W4o6d2Xf4AEmHd6RVYnngvjJTR4= sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" + +less-loader@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-5.0.0.tgz#498dde3a6c6c4f887458ee9ed3f086a12ad1b466" + integrity "sha1-SY3eOmxsT4h0WO6e0/CGoSrRtGY= sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==" + dependencies: + clone "^2.1.1" + loader-utils "^1.1.0" + pify "^4.0.1" + +less@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/less/-/less-3.0.4.tgz#d27dcedbac96031c9e7b76f1da1e4b7d83760814" + integrity "sha1-0n3O26yWAxyee3bx2h5LfYN2CBQ= sha512-q3SyEnPKbk9zh4l36PGeW2fgynKu+FpbhiUNx/yaiBUQ3V0CbACCgb9FzYWcRgI2DJlP6eI4jc8XPrCTi55YcQ==" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + mime "^1.4.1" + mkdirp "^0.5.0" + promise "^7.1.1" + request "^2.83.0" + source-map "~0.6.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity "sha1-d4kd6DQGTMy6gq54QrtrFKE+1/I= sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity "sha1-rkViwAdHO5MqYgDUAyaN0v/8at4= sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= sha512-8ZmlJFVK9iCmtLz19HpSsR8HaAMWBT284VMNednLwlIMDP2hJDCIhUp0IZ2xUcZ+Ob6BM0VvCSJwzASDM45NLQ==" + +linkify-it@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" + integrity "sha1-47VGl+eL+RXHCjis14/QngBYsc8= sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==" + dependencies: + uc.micro "^1.0.1" + +linkify-it@~1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-1.2.4.tgz#0773526c317c8fd13bd534ee1d180ff88abf881a" + integrity "sha1-B3NSbDF8j9E71TTuHRgP+Iq/iBo= sha512-eGHwtlABkp1NOJSiKUNqBf3SYAS5jPHtvRXPAgNaQwTqmkTahjtiLH9NtxdR5IOPhNvwNMN/diswSfZKzUkhGg==" + dependencies: + uc.micro "^1.0.1" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity "sha1-L19Fq5HjMhYjT9U62rZo607AmTs= sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==" + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +loader-fs-cache@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz#f08657646d607078be2f0a032f8bd69dd6f277d9" + integrity "sha1-8IZXZG1gcHi+LwoDL4vWndbyd9k= sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==" + dependencies: + find-cache-dir "^0.1.1" + mkdirp "^0.5.1" + +loader-runner@^2.3.1, loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c= sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + +loader-utils@^0.2.16: + version "0.2.17" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + integrity "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity "sha1-xXm140yzSxp07cbB+za/o3HVphM= sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==" + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" + integrity "sha1-1uO0+4GHByGuTghoqxHdY4NowSk= sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==" + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4= sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==" + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA= sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==" + dependencies: + p-locate "^4.1.0" + +lodash-es@^4.2.1: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity "sha1-Q+YmxG5lkbd1C+srUBFzkMYJ4+4= sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + +lodash._baseiteratee@~4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz#34a9b5543572727c3db2e78edae3c0e9e66bd102" + integrity "sha1-NKm1VDVycnw9sueO2uPA6eZr0QI= sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ==" + dependencies: + lodash._stringtopath "~4.8.0" + +lodash._basetostring@~4.12.0: + version "4.12.0" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz#9327c9dc5158866b7fa4b9d42f4638e5766dd9df" + integrity "sha1-kyfJ3FFYhmt/pLnUL0Y45XZt2d8= sha512-SwcRIbyxnN6CFEEK4K1y+zuApvWdpQdBHM/swxP962s8HIxPO3alBH5t3m/dl+f4CMUug6sJb7Pww8d13/9WSw==" + +lodash._baseuniq@~4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" + integrity "sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg= sha512-Ja1YevpHZctlI5beLA7oc5KNDhGcPixFhcqSiORHNsp/1QTv7amAXzw+gu4YOvErqVlMVyIJGgtzeepCnnur0A==" + dependencies: + lodash._createset "~4.0.0" + lodash._root "~3.0.0" + +lodash._createset@~4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" + integrity "sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY= sha512-GTkC6YMprrJZCYU3zcqZj+jkXkrXzq3IPBcF/fIPpNEAB4hZEtXU8zp/RwKOvZl43NUmwDbyRk3+ZTbeRdEBXA==" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==" + +lodash._root@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + integrity "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI= sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==" + +lodash._stringtopath@~4.8.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/lodash._stringtopath/-/lodash._stringtopath-4.8.0.tgz#941bcf0e64266e5fc1d66fed0a6959544c576824" + integrity "sha1-lBvPDmQmbl/B1m/tCmlZVExXaCQ= sha512-SXL66C731p0xPDC5LZg4wI5H+dJo/EO4KTqOMwLYCH3+FmmfAKJEZCm6ohGpI+T1xwsDsJCfL4OnhorllvlTPQ==" + dependencies: + lodash._basetostring "~4.12.0" + +lodash.debounce@^4, lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity "sha1-gteb/zCmfEAF/9XiUVMArZyk168= sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + +lodash.defaultsdeep@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6" + integrity "sha1-US6b1yHSctlOPTpjZT+hdRZ0HKY= sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==" + +lodash.kebabcase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + integrity "sha1-hImxyw0p/4gZXM7KRI/21swpXDY= sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==" + +lodash.mapvalues@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" + integrity "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw= sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==" + +lodash.memoize@4.x, lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity "sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo= sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + +lodash.template@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity "sha1-+XYZXPPzR9DV9SSDVp/oAxzM6Ks= sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==" + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity "sha1-5IExDwSdPPbUfpEq0JMTsVTw+zM= sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==" + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + +lodash.transform@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.transform/-/lodash.transform-4.6.0.tgz#12306422f63324aed8483d3f38332b5f670547a0" + integrity "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A= sha512-LO37ZnhmBVx0GvOU/caQuipEh4GN82TcWv3yHlebGDgOxbxiwwzW5Pcx2AcvpIv2WmvmSMoC492yQFNhy/l/UQ==" + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + +lodash.uniqby@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.5.0.tgz#a3a17bbf62eeb6240f491846e97c1c4e2a5e1e21" + integrity "sha1-o6F7v2LutiQPSRhG6XwcTipeHiE= sha512-IRt7cfTtHy6f1aRVA5n7kT8rgN3N1nH6MOWLcHfpWG2SH19E3JksLK38MktLxZDhlAjCP9jpIXkOnRXlu6oByQ==" + dependencies: + lodash._baseiteratee "~4.7.0" + lodash._baseuniq "~4.6.0" + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw= sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo= sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==" + dependencies: + chalk "^2.0.1" + +loglevel@^1.6.8: + 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==" + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8= sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==" + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity "sha1-miyr0bno4K6ZOkv31YdcOcQujqw= sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" + +lowlight@^1.17.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" + integrity "sha1-3bGX0zRirQ2TvxnRe2wwGqOUGIg= sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==" + dependencies: + fault "^1.0.0" + highlight.js "~10.7.0" + +lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80= sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA= sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==" + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ= sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" + dependencies: + yallist "^4.0.0" + +lru-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" + integrity "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==" + dependencies: + es5-ext "~0.10.2" + +luxon@^1.25.0, luxon@^1.27.0: + version "1.28.0" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.28.0.tgz#e7f96daad3938c06a62de0fb027115d251251fbf" + integrity "sha1-5/ltqtOTjAamLeD7AnEV0lElH78= sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ==" + +lz-string@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" + integrity "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==" + +magic-string@^0.25.7: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity "sha1-P0l9b9NMZpxnmNy4IfLvMfVEUFE= sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==" + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU= sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==" + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity "sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8= sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==" + dependencies: + semver "^6.0.0" + +make-error@1.x: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity "sha1-LrLjfqm2fEiR9oShOUeZr0hM96I= sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity "sha1-Pl3SB5qC6BLpg8xmEMSiyw6qgBo= sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==" + dependencies: + tmpl "1.0.5" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==" + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==" + dependencies: + object-visit "^1.0.0" + +markdown-it-abbr@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/markdown-it-abbr/-/markdown-it-abbr-1.0.4.tgz#d66b5364521cbb3dd8aa59dadfba2fb6865c8fd8" + integrity "sha1-1mtTZFIcuz3Yqlna37ovtoZcj9g= sha512-ZeA4Z4SaBbYysZap5iZcxKmlPL6bYA8grqhzJIHB1ikn7njnzaP8uwbtuXc4YXD5LicI4/2Xmc0VwmSiFV04gg==" + +markdown-it-deflist@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/markdown-it-deflist/-/markdown-it-deflist-2.1.0.tgz#50d7a56b9544cd81252f7623bd785e28a8dcef5c" + integrity "sha1-UNela5VEzYElL3YjvXheKKjc71w= sha512-3OuqoRUlSxJiuQYu0cWTLHNhhq2xtoSFqsZK8plANg91+RJQU1ziQ6lA2LzmFAEes18uPBsHZpcX6We5l76Nzg==" + +markdown-it-emoji@^1.1.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz#9bee0e9a990a963ba96df6980c4fddb05dfb4dcc" + integrity "sha1-m+4OmpkKljupbfaYDE/dsF37Tcw= sha512-QCz3Hkd+r5gDYtS2xsFXmBYrgw6KuWcJZLCEkdfAuwzZbShCmCfta+hwAMq4NX/4xPzkSHduMKgMkkPUJxSXNg==" + +markdown-it-footnote@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-it-footnote/-/markdown-it-footnote-2.0.0.tgz#14e9c4f68ff12cf354fa365ae378276e8104ca94" + integrity "sha1-FOnE9o/xLPNU+jZa43gnboEEypQ= sha512-GMWkJXSHh5tiQt77zCLOSZI2Xy3Oqdb82GmT0Q0h2UT6SbUrMCAiHEiMBIt5V7Xfm73rBxS0VOhlLndkn1GPnw==" + +markdown-it-ins@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-it-ins/-/markdown-it-ins-2.0.0.tgz#a5aa6a30f1e2f71e9497567cfdff40f1fde67483" + integrity "sha1-papqMPHi9x6Ul1Z8/f9A8f3mdIM= sha512-DhLLxseIg2C7+AULvoyVI+zMeufR0QFvXJ2o0oV013hN5HvBvNh2rbVtTdxZjI959+hgo2AA0aRdtEIUaKPbhg==" + +markdown-it-katex@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/markdown-it-katex/-/markdown-it-katex-2.0.3.tgz#d7b86a1aea0b9d6496fab4e7919a18fdef589c39" + integrity "sha1-17hqGuoLnWSW+rTnkZoY/e9YnDk= sha512-nUkkMtRWeg7OpdflamflE/Ho/pWl64Lk9wNBKOmaj33XkQdumhXAIYhI0WO03GeiycPCsxbmX536V5NEXpC3Ng==" + dependencies: + katex "^0.6.0" + +markdown-it-mark@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-it-mark/-/markdown-it-mark-2.0.0.tgz#46a1aa947105aed8188978e0a016179e404f42c7" + integrity "sha1-RqGqlHEFrtgYiXjgoBYXnkBPQsc= sha512-iT8ua0Bda8QrVwHDOUNw1eyCuL7irXeYch5n8zGS4tb7wsDIn7EjQZLjihKaijzBiL0ikfWL2zAvL/ECqTvsNA==" + +markdown-it-sub@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/markdown-it-sub/-/markdown-it-sub-1.0.0.tgz#375fd6026eae7ddcb012497f6411195ea1e3afe8" + integrity "sha1-N1/WAm6ufdywEkl/ZBEZXqHjr+g= sha512-z2Rm/LzEE1wzwTSDrI+FlPEveAAbgdAdPhdWarq/ZGJrGW/uCQbKAnhoCsE4hAbc3SEym26+W2z/VQB0cQiA9Q==" + +markdown-it-sup@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/markdown-it-sup/-/markdown-it-sup-1.0.0.tgz#cb9c9ff91a5255ac08f3fd3d63286e15df0a1fc3" + integrity "sha1-y5yf+RpSVawI8/09YyhuFd8KH8M= sha512-E32m0nV9iyhRR7CrhnzL5msqic7rL1juWre6TQNxsnApg7Uf+F97JOKxUijg5YwXz86lZ0mqfOnutoryyNdntQ==" + +markdown-it-task-lists@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/markdown-it-task-lists/-/markdown-it-task-lists-2.1.1.tgz#f68f4d2ac2bad5a2c373ba93081a1a6848417088" + integrity "sha1-9o9NKsK61aLDc7qTCBoaaEhBcIg= sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==" + +markdown-it-toc-and-anchor@^4.1.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/markdown-it-toc-and-anchor/-/markdown-it-toc-and-anchor-4.2.0.tgz#d1613327cc63c61f82cd66cbac5564f4db12c0e9" + integrity "sha1-0WEzJ8xjxh+CzWbLrFVk9NsSwOk= sha512-DusSbKtg8CwZ92ztN7bOojDpP4h0+w7BVOPuA3PHDIaabMsERYpwsazLYSP/UlKedoQjOz21mwlai36TQ04EpA==" + dependencies: + clone "^2.1.0" + uslug "^1.0.4" + +markdown-it@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-6.1.1.tgz#ced037f4473ee9f5153ac414f77dc83c91ba927c" + integrity "sha1-ztA39Ec+6fUVOsQU933IPJG6knw= sha512-woFl7h/sqt9xRmiMweNuO7nu+w8Lz3SXsDlvE3TYeu1SdPqQ+VW4GZyaKP442Bq6XUN6V6IQjJTR93RDYG2mjw==" + dependencies: + argparse "^1.0.7" + entities "~1.1.1" + linkify-it "~1.2.2" + mdurl "~1.0.1" + uc.micro "^1.0.1" + +markdown-it@^8.4.2: + version "8.4.2" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" + integrity "sha1-OG+YmY3BWjdyKqdyIIT0Agvdm1Q= sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==" + dependencies: + argparse "^1.0.7" + entities "~1.1.1" + linkify-it "^2.0.0" + mdurl "^1.0.1" + uc.micro "^1.0.5" + +match-all@^1.2.5: + version "1.2.6" + resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d" + integrity "sha1-ZtJ2rWtJZVVR5j06buU+i+BWb40= sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==" + +match-at@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/match-at/-/match-at-0.1.1.tgz#25d040d291777704d5e6556bbb79230ec2de0540" + integrity "sha1-JdBA0pF3dwTV5lVru3kjDsLeBUA= sha512-h4Yd392z9mST+dzc+yjuybOGFNOZjmXIPKWjxBd1Bb23r4SmDOsk2NYCU2BMUBGbSpZqwVsZYNq26QS3xfaT3Q==" + +math-log2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-log2/-/math-log2-1.0.1.tgz#fb8941be5f5ebe8979e718e6273b178e58694565" + integrity "sha1-+4lBvl9evol55xjmJzsXjlhpRWU= sha512-9W0yGtkaMAkf74XGYVy4Dqw3YUMnTNB2eeiw9aQbUl4A3KmuCEHTt2DgAB07ENzOYAjsYSAYufkAq0Zd+jU7zA==" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8= sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity "sha1-cRP8QoGRfWPOKbQ0RvcB5owlulA= sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity "sha1-aZs8OKxvHXKAkaZGULZdOIUC/Vs= sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + +mdurl@^1.0.1, mdurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + +memfs@^3.1.2: + version "3.3.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.3.0.tgz#4da2d1fc40a04b170a56622c7164c6be2c4cbef2" + integrity "sha1-TaLR/ECgSxcKVmIscWTGvixMvvI= sha512-BEE62uMfKOavX3iG7GYX43QJ+hAeeWnwIAuJ/R6q96jaMtiLzhsxHJC8B1L7fK7Pt/vXDRwb3SG/yBpNGDPqzg==" + dependencies: + fs-monkey "1.0.3" + +memoize-one@^5.0.4: + version "5.2.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + integrity "sha1-gzeqPEM1WBg57AHD1ZQJDOvo8A4= sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + +memoizee@^0.4.15: + version "0.4.15" + resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72" + integrity "sha1-5vPS2oY/MY0CIlORgppsWVZVW3I= sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==" + dependencies: + d "^1.0.1" + es5-ext "^0.10.53" + es6-weak-map "^2.0.3" + event-emitter "^0.3.5" + is-promise "^2.2.2" + lru-queue "^0.1.0" + next-tick "^1.1.0" + timers-ext "^0.1.7" + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity "sha1-MkwBKIuIZSlm0WHbd4OHIIRajjw= sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY= sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==" + dependencies: + source-map "^0.6.1" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A= sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + +merge2@^1.2.3, merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4= sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + +microevent.ts@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" + integrity "sha1-cLCbg/Q99RctAgWmMCW84Pc1f6A= sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity "sha1-cIWbyVyYQJUvNZoGij/En57PrCM= sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity "sha1-iW1Rnf6dsl/OlM63pQCRm/iB6/k= sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==" + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0= sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==" + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.50.0, "mime-db@>= 1.43.0 < 2": + version "1.50.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" + integrity "sha1-q9SslOmNPA4YUBbGerRdX95AwR8= sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==" + +mime-match@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mime-match/-/mime-match-1.0.2.tgz#3f87c31e9af1a5fd485fb9db134428b23bbb7ba8" + integrity "sha1-P4fDHprxpf1IX7nbE0Qosju7e6g= sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==" + dependencies: + wildcard "^1.1.0" + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.33" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb" + integrity "sha1-H6EqkERy+v0GjkjZ6EAfdNP3Dts= sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==" + dependencies: + mime-db "1.50.0" + +mime@1.6.0, mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE= sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + +mime@^2.4.4: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity "sha1-oqaCqVzU0MsdYlfij4PafjWAA2c= sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI= sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs= sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + +mini-css-extract-plugin@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e" + integrity "sha1-R/LPB6oWWrNXM7H8l9TEbAVkM54= sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==" + dependencies: + loader-utils "^1.1.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc= sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + +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.1.1, 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.1.1: + version "3.1.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.5.tgz#71f6251b0a33a49c01b3cf97ff77eda030dff732" + integrity "sha1-cfYlGwozpJwBs8+X/3ftoDDf9zI= sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==" + dependencies: + yallist "^4.0.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity "sha1-6goykfl+C16HdrNj1fChLZTGcCI= sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY= sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, 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" + +moment@^2.10.2, moment@^2.21.0: + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity "sha1-sr52n6MZQL6e7qZGnAdeNQBvo9M= sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==" + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo= sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + +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.1: + 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==" + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==" + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity "sha1-oOx72QVcQoL3kMPIL04o2zsxsik= sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==" + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mutationobserver-shim@^0.3.2: + version "0.3.7" + resolved "https://registry.yarnpkg.com/mutationobserver-shim/-/mutationobserver-shim-0.3.7.tgz#8bf633b0c0b0291a1107255ed32c13088a8c5bf3" + integrity "sha1-i/YzsMCwKRoRByVe0ywTCIqMW/M= sha512-oRIDTyZQU96nAiz2AQyngwx1e89iApl2hN5AOYwyxLUB47UYsU3Wv9lJWqH5y/QdiYkc5HQLi23ZNB3fELdHcQ==" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity "sha1-FjDEKyJR/4HiooPelqVJfqkuXg0= sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + +mz@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity "sha1-lQCAV6Vsr63CvGPd5/n/aVWUjjI= sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==" + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +namespace-emitter@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz#978d51361c61313b4e6b8cf6f3853d08dfa2b17c" + integrity "sha1-l41RNhxhMTtOa4z284U9CN+isXw= sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==" + +nan@^2.12.1: + version "2.15.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" + integrity "sha1-PzSkc/8Y4VwbVia2KQO1rW5mX+4= sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + +nanoid@^3.1.30: + version "3.1.30" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" + integrity "sha1-Y/k8xUjSoRPcXfvGO/oJ4rm2Q2I= sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==" + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk= sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +nanopop@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/nanopop/-/nanopop-2.1.0.tgz#23476513cee2405888afd2e8a4b54066b70b9e60" + integrity "sha1-I0dlE87iQFiIr9LopLVAZrcLnmA= sha512-jGTwpFRexSH+fxappnGQtN9dspgE2ipa1aOjtR24igG0pv6JCxImIAmrLRHX+zUF5+1wtsFVbKyfP51kIGAVNw==" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs= sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity "sha1-tKr7k+OustgXTKU88WOrfXMIMF8= sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + +next-tick@1, next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity "sha1-GDbuMK1W1n7ygbIr0Zn3CUSbNes= sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity "sha1-yobR/ogoFpsBICCOPchCS524NCw= sha512-mc/caHeUcdjnC/boPWJefDr4KUIWQNv+tlnFnJd38QMou86QtxQzBJfxgGRzvx8jazYRqrVlaHarfO72uNxPOg==" + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y= sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw= sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==" + dependencies: + lower-case "^1.1.1" + +node-addon-api@^1.7.1: + version "1.7.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" + integrity "sha1-PfMLlXILU8JOWZSLSVMrZiRE9U0= sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==" + +node-cache@^4.1.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/node-cache/-/node-cache-4.2.1.tgz#efd8474dee4edec4138cdded580f5516500f7334" + integrity "sha1-79hHTe5O3sQTjN3tWA9VFlAPczQ= sha512-BOb67bWg2dTyax5kdef5WfU3X8xu4wPg+zHzkvls0Q/QpYycIFRLEEIdAx9Wma43DxG6Qzn4illdZoYseKWa4A==" + dependencies: + clone "2.x" + lodash "^4.17.15" + +node-domexception@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + integrity "sha1-aIjbRqH3HAt2s/dVUBa2P+ZHZuU= sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" + +node-emoji@^1.10.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity "sha1-aaAVDmlG4vEV6dfqTfeXHiYoMBw= sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==" + dependencies: + lodash "^4.17.21" + +node-fetch@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity "sha1-BFvTI2Mfdu0uK1VXM5RBa2OaAFI= sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity "sha1-mA9vcthSEaU0fGsrwYxbhMPrR+8= sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity "sha1-Mt6ir7Ppkm8C7lzoeUkCaRpna/M= sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + +node-ipc@^9.1.1: + version "9.2.1" + resolved "https://registry.yarnpkg.com/node-ipc/-/node-ipc-9.2.1.tgz#b32f66115f9d6ce841dc4ec2009d6a733f98bb6b" + integrity "sha1-sy9mEV+dbOhB3E7CAJ1qcz+Yu2s= sha512-mJzaM6O3xHf9VT8BULvJSbdVbmHUKRNOH7zDDkCrA1/T+CVjq2WVIDfLt0azZRXpgArJtl3rtmEozrbXPZ9GaQ==" + dependencies: + event-pubsub "4.3.0" + js-message "1.0.7" + js-queue "2.0.2" + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity "sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU= sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==" + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= sha512-JMaRS9L4wSRIR+6PTVEikTrq/lMGEZR43a48ETeilY0Q0iMwVnccMFrUM1k+tNzmYuIU0Vh710bCUqHX+/+ctQ==" + +node-notifier@^5.4.2: + version "5.4.5" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.5.tgz#0cbc1a2b0f658493b4025775a13ad938e96091ef" + integrity "sha1-DLwaKw9lhJO0Ald1oTrZOOlgke8= sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==" + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity "sha1-PR05XyBPHy8ppUNYuftnh2WtL8U= sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity "sha1-UwlCu1ilEvzK/lP+IQ8TolNV3Ig= sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==" + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg= sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==" + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" + integrity "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k= sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA==" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==" + dependencies: + remove-trailing-separator "^1.0.1" + +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==" + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" + +normalize-url@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ==" + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity "sha1-suHE3E98bVd0PfczpPWXjRhlBVk= sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==" + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity "sha1-t+zR5e1T2o43pV4cImnguX7XSOo= sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==" + dependencies: + path-key "^3.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw= sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==" + dependencies: + boolbase "~1.0.0" + +nth-check@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + integrity "sha1-Lv4WL1w9oGoolZ+9PbddvuqfD8I= sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==" + dependencies: + boolbase "^1.0.0" + +null-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/null-loader/-/null-loader-3.0.0.tgz#3e2b6c663c5bda8c73a54357d8fa0708dc61b245" + integrity "sha1-PitsZjxb2oxzpUNX2PoHCNxhskU= sha512-hf5sNLl8xdRho4UPBOOeoIwT3WhjYcMUQm0zj44EhD6UscMAz72o2udpoDFBgykucdEDGIcd6SXbc/G6zssbzw==" + dependencies: + loader-utils "^1.2.3" + schema-utils "^1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==" + +nwsapi@^2.0.7, nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity "sha1-IEh5qePQaP8qVROcLHcngGgaOLc= sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU= sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + +object-assign@4.x, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity "sha1-fn2Fi3gb18mRpBupde04EnVOmYw= sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-hash@^1.1.4: + version "1.3.1" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" + integrity "sha1-/eRSCYqVHLFF8Dm7fUVUSd3BJt8= sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" + +object-hash@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + integrity "sha1-WtUYWB7vxEO9djRyuP8unCwNVKU= sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" + +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity "sha1-nc6xRs7dQUig2eUauI00z1CZIrE= sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity "sha1-ud7qpfx/GEag+uzc7sE45XePU6w= sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==" + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity "sha1-HEfyct8nfzsdrwYWd9nILiMixg4= sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==" + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity "sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA= sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==" + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0, object.getownpropertydescriptors@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" + integrity "sha1-siPPOOF/77l6Y8EMkd9yzLOG354= sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==" + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==" + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity "sha1-lZ9j486e8QhyAzMIITHkpFm3Fqw= sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==" + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4= sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + +omit.js@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/omit.js/-/omit.js-1.0.2.tgz#91a14f0eba84066dfa015bf30e474c47f30bc858" + integrity "sha1-kaFPDrqEBm36AVvzDkdMR/MLyFg= sha512-/QPc6G2NS+8d4L/cQhbk6Yit1WTB6Us2g84A7A/1+w9d/eRGHyEqC5kkQtHVoHZ5NFWGG7tUGgrhVZwgZanKrQ==" + dependencies: + babel-runtime "^6.23.0" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==" + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity "sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8= sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + +once@^1.3.0, once@^1.3.1, once@^1.4.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" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==" + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4= sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==" + dependencies: + mimic-fn "^2.1.0" + +open@^6.3.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" + integrity "sha1-XBPpbQ3IlGhhZPGJZez+iJ7PyKk= sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==" + dependencies: + is-wsl "^1.1.0" + +opener@^1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity "sha1-XTfh81B3udysQwE3InGv3rKhNZg= sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity "sha1-/HFk+rVtI1kExRw7J9pnWMo7m/w= sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==" + dependencies: + is-wsl "^1.1.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity "sha1-hPodA2/p08fiHZmIS2ARZ+yPtJU= sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity "sha1-TyNqY3Pa4FZqbUPhMmZ09QwpFJk= sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==" + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ora@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" + integrity "sha1-vwdSSRBZo+8+1MhQl1Md6f280xg= sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==" + dependencies: + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-spinners "^2.0.0" + log-symbols "^2.2.0" + strip-ansi "^5.2.0" + wcwidth "^1.0.1" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity "sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8= sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==" + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" + +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= sha512-J/e9xiZZQNrt+958FFzJ+auItsBGq+UrQ7nE89AUP7UOTtjHnkISANXLdayhVzh538UnLMCSlf13lFfRIAKQOA==" + dependencies: + p-reduce "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==" + +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity "sha1-vW/KqcVZoJa2gIBvTWV7Pw8kBWE= sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==" + +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE= sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==" + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ= sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==" + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity "sha1-o0KLtwiLOmApL2aRkni3wpetTwc= sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==" + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity "sha1-MQko/u+cnsxltosXaTAYpmXOoXU= sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= sha512-3Tx1T3oM1xO/Y8Gj0sWyE78EIJZ+t+aEmXUdvQgvGmSMri7aPTHoovbXEreWKkL5j21Er60XAWLTzKbAKYOujQ==" + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity "sha1-MWtMiJPiyNwc+okfQGxLQivr8yg= sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==" + dependencies: + retry "^0.12.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY= sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity "sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8= sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity "sha1-kEnKN9bLIYLDsdLHIL6U0UpYFPw= sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==" + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@2.1.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity "sha1-35T9jPZTHs915r75oIWPvHK+Ikc= sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==" + dependencies: + no-case "^2.2.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI= sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity "sha1-OFCAo+wTy2KmLTlAnLPoiETNrtQ= sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==" + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity "sha1-U8brW5MUofTsmfoP33zgHs2gy+g= sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==" + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==" + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity "sha1-x2/Gbe5UIxyWKyK8yKcs8vmXU80= sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==" + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5-htmlparser2-tree-adapter@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity "sha1-LN+a2CMyEUA3DU2/XT6Sx8jdxuY= sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==" + dependencies: + parse5 "^6.0.1" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity "sha1-bXhlbj2o14tOwLkG98CO8d/j9gg= sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" + +parse5@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" + integrity "sha1-xZNByXI/QUxFKXVWTHwApo1YrNI= sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + +parse5@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity "sha1-9o5OW6GFKsLK3AD0VV//bCq7YXg= sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity "sha1-4aHAhcVps9wIMhGE8Zo5zCf3wws= sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ= sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==" + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity "sha1-5sTd1+06onxoogzE5Q4aTug7vEo= sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==" + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" + +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==" + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U= sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity "sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU= sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428= sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==" + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs= sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity "sha1-3YIqoIh1gOUvGgOdw+2hCO+uMHU= sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==" + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + integrity "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU= sha512-YHk5ez1hmMR5LOkb9iJkLKqoBlL7WD5M8ljC75ZfzXriuBIVNuecaXuU7e+hOwyqf24Wxhh7Vxgt7Hnw9288Tg==" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity "sha1-VwZw95NkaFHRuhNZlpYqutWHhZ8= sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity "sha1-y1vcdP8/UYkiNur3nWi8RFZKuBw= sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + 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==" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity "sha1-7RQaasBDqEnqWISY59yosVMw6Qw= sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE= sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity "sha1-ITXW36ejWMBprJsXh3YogihFD/o= sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity "sha1-clVrgM+g1IqXToDnckjoDtT3+HA= sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==" + +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity "sha1-ZDqSyviUVm+RsrmG0sZpUKji+4c= sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==" + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity "sha1-ektQio1bstYp1EcFb/TpyTFM89Q= sha512-c6pv3OE78mcZ92ckebVDqg0aWSoKhOTbwCV6qbCWMk546mAL9pZln0+QsN/yQ7fkucd4+yJPLrCBXNt8Ruk+Eg==" + dependencies: + find-up "^1.0.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM= sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==" + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM= sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==" + dependencies: + find-up "^4.0.0" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity "sha1-4vTO8OIZ9GPBeas3Rj5OHs3Muvs= sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + +pnp-webpack-plugin@^1.6.4: + version "1.7.0" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz#65741384f6d8056f36e2255a8d67ffc20866f5c9" + integrity "sha1-ZXQThPbYBW824iVajWf/wghm9ck= sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==" + dependencies: + ts-pnp "^1.1.6" + +portfinder@^1.0.26: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity "sha1-Z8RiKFK9U3TdHdkA93n1NGL6x3g= sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==" + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==" + +postcss-calc@^7.0.1: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + integrity "sha1-+KbpnxLmGcLrwjz2xIb9wVhgkz4= sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==" + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity "sha1-rgYLzpPteUrHEmTwgTLVUJVr04E= sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==" + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity "sha1-yjgT7U2g+BL51DcDWE5Enr4Ymn8= sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==" + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity "sha1-H7q9LCRr/2qq15l7KwkY9NevQDM= sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==" + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity "sha1-P+EzzTyCKC5VD8myORdqkge3hOs= sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==" + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity "sha1-yMlR6fc+2UKAGUWERKAq2Qu592U= sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==" + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity "sha1-ZSrvipZybwKfXj4AFG7npOdV/1c= sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==" + dependencies: + postcss "^7.0.0" + +postcss-load-config@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" + integrity "sha1-xepQTyxK7zPHNZo03jVzdyrXUCo= sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==" + dependencies: + cosmiconfig "^5.0.0" + import-cwd "^2.0.0" + +postcss-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity "sha1-a5eUPkfHLYRfqeA/Jzdz1OjdbC0= sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==" + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity "sha1-YvSaE+Sg7gTnuY9CuxYGLKJUniQ= sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==" + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity "sha1-NivqT/Wh+Y5AdacTxsslrv75plA= sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==" + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity "sha1-zUw0TM5HQ0P6xdgiBqssvLiv1aY= sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==" + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity "sha1-k7KcL/UJnFNe7NpWxKpuZlpmNHE= sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==" + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity "sha1-a5zvAwwR41Jh+V9hjJADbWgNuHQ= sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==" + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity "sha1-4uXrQL/uUA0M2SQ1APX46kJi+9g= sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==" + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity "sha1-gYcZoa4doyX5gyRGsBE27rSTzX4= sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==" + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + integrity "sha1-uxTgzHgnnVBNvcv9fgyiiZP/u7A= sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==" + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.32" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity "sha1-OFyuATzHdD9afXYC0Qc6iequYu4= sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==" + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity "sha1-W1AA1uuuKbQlUwG0o6VFdEI+fxA= sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==" + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity "sha1-izWt067oOhNrBHHg1ZvlilAoXdQ= sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==" + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity "sha1-Db4EpM6QY9RmftK+R2u4MMglk1o= sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==" + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity "sha1-BfdX+E8mBDc3g2ipH4ky1LECkX8= sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==" + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity "sha1-xOu8KJ85kaAo1EdRy90RkYsXkQw= sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==" + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity "sha1-zUTECrB6DHo23F6Zqs4eyk7CaQw= sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==" + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity "sha1-jgCcoqOUnNr4rSPmtquZy159KNk= sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==" + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity "sha1-hBvUj9zzAZrUuqdJOj02O1KuHPs= sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==" + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity "sha1-EOQ3+GvHx+WPe5ZS7YeNqqlfquE= sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==" + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity "sha1-vx1AcP5Pzqh9E0joJdjMDF+qfYI= sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==" + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity "sha1-DPdcgg7H1cTSgBiVWeC1ceusDu4= sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==" + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity "sha1-f9QuvqXpyBRgljniwuhK4nC6SN8= sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==" + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity "sha1-F++kBerMbge+NBSlyi0QdGgdTik= sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==" + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity "sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA= sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==" + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" + integrity "sha1-LFu6gXSsL2mBq2MaQqsO5UrzMuo= sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==" + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" + integrity "sha1-NDos26yVBdQWJD1Jb3JPOIlMlB4= sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==" + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity "sha1-lEaRHzKJv9ZMbWgPBzwDsfnuS6w= sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==" + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity "sha1-n/giVH4okyE88cMO+lGsX9G6goE= sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity "sha1-RD9qIM7WSBor2k+oUypuVdeJoss= sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity "sha1-liQ3XZZWMOLh8sAqk1yCpZy0gwk= sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==" + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +postcss@^8.1.10: + version "8.3.11" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.11.tgz#c3beca7ea811cd5e1c4a3ec6d2e7599ef1f8f858" + integrity "sha1-w77KfqgRzV4cSj7G0udZnvH4+Fg= sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA==" + dependencies: + nanoid "^3.1.30" + picocolors "^1.0.0" + source-map-js "^0.6.2" + +preact@8.2.9: + version "8.2.9" + resolved "https://registry.yarnpkg.com/preact/-/preact-8.2.9.tgz#813ba9dd45e5d97c5ea0d6c86d375b3be711cc40" + integrity "sha1-gTup3UXl2XxeoNbIbTdbO+cRzEA= sha512-ThuGXBmJS3VsT+jIP+eQufD3L8pRw/PY3FoCys6O9Pu6aF12Pn9zAJDX99TfwRAFOCEKm/P0lwiPTbqKMJp0fA==" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity "sha1-3rxkidem5rDnYRiIzsiAM30xY5Y= sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==" + +"prettier@^1.18.2 || ^2.0.0": + version "2.4.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" + integrity "sha1-Zx4RyJwUpM/Ids5WQQbEpnJsn1w= sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==" + +pretty-bytes@^5.1.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity "sha1-NWJW9kOAR3PIL2RyP+eMksYr6us= sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" + +pretty-error@^2.0.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" + integrity "sha1-von4LYGxyG7I/fvDhQRYgnJ/k7Y= sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==" + dependencies: + lodash "^4.17.20" + renderkid "^2.0.4" + +pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity "sha1-EvrDGzcBmk7qPBGqmpWet2KKp8k= sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==" + dependencies: + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + +pretty-format@^26.0.0, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity "sha1-41wnBfFMt/4v6U+geDRbREEg/JM= sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==" + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + +pretty@2.0.0, pretty@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pretty/-/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5" + integrity "sha1-rbx5YLe7/iiaVX3F9zdhmiINBqU= sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==" + dependencies: + condense-newlines "^0.2.1" + extend-shallow "^2.0.1" + js-beautify "^1.6.12" + +prismjs@^1.22.0, prismjs@~1.25.0: + version "1.25.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.25.0.tgz#6f822df1bdad965734b310b315a23315cf999756" + integrity "sha1-b4It8b2tllc0sxCzFaIzFc+Zl1Y= sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity "sha1-eCDZsWEgzFXKmud5JoCufbptf+I= sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity "sha1-czIwDoQBYb2j5podHZGn1LwW8YI= sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg= sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity "sha1-mEcocL8igTL8vdhoEputEsPAKeM= sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078= sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==" + dependencies: + asap "~2.0.3" + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity "sha1-e1fnOzpIAprRDr1E90sBcipMsGk= sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==" + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.1, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity "sha1-UsQedbjIfnK52TYOAga5ncv/psU= sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==" + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +proper-lockfile@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-2.0.1.tgz#159fb06193d32003f4b3691dd2ec1a634aa80d1d" + integrity "sha1-FZ+wYZPTIAP0s2kd0uwaY0qoDR0= sha512-rjaeGbsmhNDcDInmwi4MuI6mRwJu6zq8GjYCLuSuE7GF+4UjgzkL69sVKKJ2T2xH61kK7rXvGYpvaTu909oXaQ==" + dependencies: + graceful-fs "^4.1.2" + retry "^0.10.0" + +property-expr@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-1.5.1.tgz#22e8706894a0c8e28d58735804f6ba3a3673314f" + integrity "sha1-IuhwaJSgyOKNWHNYBPa6OjZzMU8= sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g==" + +property-information@^5.0.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity "sha1-YWdVRfsjAC8kXGVA7EYHfU2j7Wk= sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==" + dependencies: + xtend "^4.0.0" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + +proxy-addr@~2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity "sha1-8Z/mnOqzEe65S0LnDowgcPm6ECU= sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==" + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity "sha1-0/wRS6BplaRexok/SEzrHXj19HY= sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity "sha1-8FKijacOYYkX7wqKw0wa5aaChrM= sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity "sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ= sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA= sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==" + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk= sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ= sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4= sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==" + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity "sha1-wNWmOycYgArY4esPpSachN1BhF4= sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity "sha1-tYsBCsQMIsVldhbI0sLALHv0eew= sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + +qs-stringify@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/qs-stringify/-/qs-stringify-1.2.1.tgz#9b39ef6b816bd83309628fc9dad435fc0eccc28b" + integrity "sha1-mznva4Fr2DMJYo/J2tQ1/A7Mwos= sha512-2N5xGLGZUxpgAYq1fD1LmBSCbxQVsXYt5JU0nU3FuPWO8PlCnKNFQwXkZgyB6mrTdg7IbexX4wxIR403dJw9pw==" + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw= sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + +qs@^6.9.4: + version "6.10.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" + integrity "sha1-STFIL6jWR6Wqt5nFJx0hM7mB+2o= sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==" + dependencies: + side-channel "^1.0.4" + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY= sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity "sha1-u7aTucqRXCMlFbIosaArYJBD2+s= sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==" + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity "sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y= sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity "sha1-SSkii7xyTfrEPg77BYyve2z7YkM= sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + +raf@^3.1.0, raf@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity "sha1-B0LpmkplUvRF1z4+4DKK8P8e3jk= sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==" + dependencies: + performance-now "^2.1.0" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, 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" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg= sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==" + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE= sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity "sha1-oc5vucm8NWylLoklarWQWeE9AzI= sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==" + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-copy-to-clipboard@5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.3.tgz#2a0623b1115a1d8c84144e9434d3342b5af41ab4" + integrity "sha1-KgYjsRFaHYyEFE6UNNM0K1r0GrQ= sha512-9S3j+m+UxDZOM0Qb8mhnT/rMR0NGSrj9A/073yz2DSxPMYhmYFBMYIdI2X4o8AjOjyFsSNxDRnCX6s/gRxpriw==" + dependencies: + copy-to-clipboard "^3" + prop-types "^15.5.8" + +react-debounce-input@^3.2.3: + version "3.2.5" + resolved "https://registry.yarnpkg.com/react-debounce-input/-/react-debounce-input-3.2.5.tgz#3a29682c4b9dcd62694d6e03f85d7bfa96cec433" + integrity "sha1-OiloLEudzWJpTW4D+F17+pbOxDM= sha512-WDc9nvZ8E/cT4nW1RlD/r+Nsc5Z5+Jmj2v9HT9RzsPtxkwRTQUBCKJvdt1fCYy5ME/nQPoqVYmWUWSv7whGmig==" + dependencies: + lodash.debounce "^4" + prop-types "^15.7.2" + +react-dom@=15.7.0: + version "15.7.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.7.0.tgz#39106dee996d0742fb0f43d567ef8b8153483ab2" + integrity "sha1-ORBt7pltB0L7D0PVZ++LgVNIOrI= sha512-mpjXqC2t1FuYsILOLCj0kg6pbg460byZkVA/80VtDmKU/pYmoTdHOtaMcTRIDiyXLz4sIur0cQ04nOC6iGndJg==" + dependencies: + fbjs "^0.8.9" + loose-envify "^1.1.0" + object-assign "^4.1.0" + prop-types "^15.5.10" + +react-immutable-proptypes@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/react-immutable-proptypes/-/react-immutable-proptypes-2.2.0.tgz#cce96d68cc3c18e89617cbf3092d08e35126af4a" + integrity "sha1-zOltaMw8GOiWF8vzCS0I41Emr0o= sha512-Vf4gBsePlwdGvSZoLSBfd4HAP93HDauMY4fDjXhreg/vg6F3Fj/MXDNyTbltPC/xZKmZc+cjLu3598DdYK6sgQ==" + dependencies: + invariant "^2.2.2" + +react-immutable-pure-component@^1.1.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/react-immutable-pure-component/-/react-immutable-pure-component-1.2.4.tgz#ad2cdbd074fedecc799e5723d5e8e57b429e3e2c" + integrity "sha1-rSzb0HT+3sx5nlcj1ejle0KePiw= sha512-zPXaFWxaF4+ztVMFNMlCFkrhjpb9MPcL3JnXUpb6wKGF1+vBoSgClFbpbOsZAji7gm+RHBE24H44Lday2xxPjw==" + +react-inspector@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-2.3.1.tgz#f0eb7f520669b545b441af9d38ec6d706e5f649c" + integrity "sha1-8Ot/UgZptUW0Qa+dOOxtcG5fZJw= sha512-tUUK7t3KWgZEIUktOYko5Ic/oYwvjEvQUFAGC1UeMeDaQ5za2yZFtItJa2RTwBJB//NxPr000WQK6sEbqC6y0Q==" + dependencies: + babel-runtime "^6.26.0" + is-dom "^1.0.9" + prop-types "^15.6.1" + +react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity "sha1-eJcppNw23imZ3BVt1sHZwYzqVqQ= sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity "sha1-5pHUqOnHiTZWVVOas3J2Kw77VPA= sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + +react-motion@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/react-motion/-/react-motion-0.5.2.tgz#0dd3a69e411316567927917c6626551ba0607316" + integrity "sha1-DdOmnkETFlZ5J5F8ZiZVG6BgcxY= sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ==" + dependencies: + performance-now "^0.2.0" + prop-types "^15.5.8" + raf "^3.1.0" + +react-redux@=4.4.10: + version "4.4.10" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-4.4.10.tgz#ad57bd1db00c2d0aa7db992b360ce63dd0b80ec5" + integrity "sha1-rVe9HbAMLQqn25krNgzmPdC4DsU= sha512-tjL0Bmpkj75Td0k+lXlF8Fc8a9GuXFv/3ahUOCXExWs/jhsKiQeTffdH0j5byejCGCRL4tvGFYlrwBF1X/Aujg==" + dependencies: + create-react-class "^15.5.1" + hoist-non-react-statics "^3.3.0" + invariant "^2.0.0" + lodash "^4.17.11" + loose-envify "^1.4.0" + prop-types "^15.7.2" + +react-syntax-highlighter@^15.4.4: + version "15.4.4" + resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-15.4.4.tgz#dc9043f19e7bd063ff3ea78986d22a6eaa943b2a" + integrity "sha1-3JBD8Z570GP/PqeJhtIqbqqUOyo= sha512-PsOFHNTzkb3OroXdoR897eKN5EZ6grht1iM+f1lJSq7/L0YVnkJaNVwC3wEUYPOAmeyl5xyer1DjL6MrumO6Zw==" + dependencies: + "@babel/runtime" "^7.3.1" + highlight.js "^10.4.1" + lowlight "^1.17.0" + prismjs "^1.22.0" + refractor "^3.2.0" + +react@=15.7.0: + version "15.7.0" + resolved "https://registry.yarnpkg.com/react/-/react-15.7.0.tgz#10308fd42ac6912a250bf00380751abc41ac7106" + integrity "sha1-EDCP1CrGkSolC/ADgHUavEGscQY= sha512-5/MMRYmpmM0sMTHGLossnJCrmXQIiJilD6y3YN3TzAwGFj6zdnMtFv6xmi65PHKRV+pehIHpT7oy67Sr6s9AHA==" + dependencies: + create-react-class "^15.6.0" + fbjs "^0.8.9" + loose-envify "^1.1.0" + object-assign "^4.1.0" + prop-types "^15.5.10" + +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity "sha1-GyIcYIi6d5lgHICPkRYcZuWPiXg= sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==" + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==" + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +read-pkg@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity "sha1-e/KVQ4yloz5WzTDgU7NO5yUMk8w= sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==" + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c= sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity "sha1-M3u9o63AcGvT4CRCaihtS0sskZg= sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==" + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity "sha1-DodiKjMlqjPokihcr4tOhGUppSU= sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==" + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +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" + +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity "sha1-IAMpT+oj+wZy8kduviL89Jii1lw= sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==" + dependencies: + util.promisify "^1.0.0" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==" + dependencies: + resolve "^1.1.6" + +redux-immutable@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/redux-immutable/-/redux-immutable-3.1.0.tgz#cafbd686e0711261119b9c28960935dc47a49d0a" + integrity "sha1-yvvWhuBxEmERm5wolgk13EeknQo= sha512-1W+0w6jKurzRnLLpYXRSOgaBTDpJthbnFJkkRei7598uNkiRYn5BZZ4QcGDX2I5Sin8L7W3hOHzQ9ne0oO8y8A==" + dependencies: + immutable "^3.8.1" + +redux@=3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" + integrity "sha1-BrcxIyFZAdJdBlvjQusCa8HIU3s= sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==" + dependencies: + lodash "^4.2.1" + lodash-es "^4.2.1" + loose-envify "^1.1.0" + symbol-observable "^1.0.3" + +refractor@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.5.0.tgz#334586f352dda4beaf354099b48c2d18e0819aec" + integrity "sha1-M0WG81LdpL6vNUCZtIwtGOCBmuw= sha512-QwPJd3ferTZ4cSPPjdP5bsYHMytwWYnAN5EEnLtGvkqp/FCCnGsBgxrm9EuIDnjUC3Uc/kETtvVi7fSIVC74Dg==" + dependencies: + hastscript "^6.0.0" + parse-entities "^2.0.0" + prismjs "~1.25.0" + +regenerate-unicode-properties@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" + integrity "sha1-VNCccRXh9T3CMUqXSzLBw0Tv4yY= sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==" + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity "sha1-uTRtiCfo9aMve6KWN9OYtpAUhIo= sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk= sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity "sha1-iSV0Kpj/2QgUmI11Zq0wyjsmO1I= sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity "sha1-yY2hVGg2ccnE3LFuznNlF+G3/rQ= sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==" + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw= sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==" + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp.prototype.flags@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity "sha1-fvNSro0VnnWMDq3Kb4/LTu8HviY= sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==" + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpp@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity "sha1-BCWido2PI7rXDKS5BGH6LxIT4bI= sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" + +regexpu-core@^4.7.1: + version "4.8.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" + integrity "sha1-5WBbo2G2excYR4UBMnUC9EeamPA= sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==" + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^9.0.0" + regjsgen "^0.5.2" + regjsparser "^0.7.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +register-service-worker@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/register-service-worker/-/register-service-worker-1.7.2.tgz#6516983e1ef790a98c4225af1216bc80941a4bd2" + integrity "sha1-ZRaYPh73kKmMQiWvEha8gJQaS9I= sha512-CiD3ZSanZqcMPRhtfct5K9f7i3OLCcBBWsJjLh1gW9RO/nS94sVzY59iS+fgYBOBqaBpf4EzfqUF3j9IG+xo8A==" + +regjsgen@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity "sha1-kv8pX7He7L9uzaslQ9IH6RqjNzM= sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + +regjsparser@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" + integrity "sha1-prZntUyIXhi1JVTLSWDvcRh+mWg= sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==" + dependencies: + jsesc "~0.5.0" + +relateurl@0.2.x: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" + +remarkable@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/remarkable/-/remarkable-2.0.1.tgz#280ae6627384dfb13d98ee3995627ca550a12f31" + integrity "sha1-KArmYnOE37E9mO45lWJ8pVChLzE= sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==" + dependencies: + argparse "^1.0.10" + autolinker "^3.11.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity "sha1-wkvOKig62tW8P1jg1IJJuSN52O8= sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + +renderkid@^2.0.4: + version "2.0.7" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" + integrity "sha1-Rk8namvc7mBvShWZP5sp/HTKhgk= sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==" + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^3.0.1" + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity "sha1-vmgVIIR6tYx1aKx1+/rSjtQtOek= sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity "sha1-jcrkcOHIirwtYA//Sndihtp15jc= sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" + +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity "sha1-Pu3UIjII1BmGe3jOgVFn0QWToi8= sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==" + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.5, request-promise-native@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity "sha1-5AcSBSal79yaObKKVnm/R7nZ3Cg= sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==" + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.83.0, request@^2.87.0, request@^2.88.0, request@^2.88.2: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity "sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM= sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +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==" + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity "sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk= sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs= sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + +reselect@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.2.tgz#7bf642992d143d4f3b0f2dca8aa52018808a1d51" + integrity "sha1-e/ZCmS0UPU87Dy3KiqUgGICKHVE= sha512-wg60ebcPOtxcptIUfrr7Jt3h4BR86cCW3R7y4qt65lnNb4yz4QgrXcbSioVsIOYguyz42+XTHIyJ5TEruzkFgQ==" + +resize-observer-polyfill@^1.5.0, resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity "sha1-DpAg3T0hAkRY1OvSfiPkAmmBBGQ= sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==" + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity "sha1-six699nWiBvItuZTM17rywoYh0g= sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY= sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==" + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==" + +resolve@1.x, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.3.2: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity "sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU= sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==" + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity "sha1-n37ih/gv0ybU/RYpI9YhKe7g368= sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity "sha1-OfZ8VLOnpYzqUjbZXPADQjljH34= sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==" + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w= sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + +retry@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" + integrity "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= sha512-ZXUSQYTHdl3uS7IuCehYfMzKyIDBNoAuUblvy5oGO5UJSUTmStUUVPXbA9Qxd173Bgre53yCQczQuHgRWAdvJQ==" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY= sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity "sha1-wODWiC3w4jviVKR16O3UGRX+rrE= sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==" + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==" + +rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w= sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==" + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho= sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==" + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw= sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity "sha1-yPFVMR0Wf2jyHhaN9x7FsIMRNzQ= sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity "sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU= sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity "sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4= sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" + dependencies: + queue-microtask "^1.2.2" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==" + dependencies: + aproba "^1.1.1" + +rxjs@^6.6.0: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity "sha1-kKwBisq/SRv2UEQjXVhjxNq4BMk= sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==" + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity "sha1-mR7GnSluAxN0fVm9/St0XDX4go0= sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.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==" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity "sha1-QKNmnzsHfR6UPURinhV91IAjvy4= sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==" + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo= sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity "sha1-7Ygf2SJzOmxGG8GJ3CtsAG8//e0= sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==" + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sass-loader@^10: + version "10.2.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.2.0.tgz#3d64c1590f911013b3fa48a0b22a83d5e1494716" + integrity "sha1-PWTBWQ+REBOz+kigsiqD1eFJRxY= sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==" + dependencies: + klona "^2.0.4" + loader-utils "^2.0.0" + neo-async "^2.6.2" + schema-utils "^3.0.0" + semver "^7.3.2" + +sass@1.32.12: + version "1.32.12" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.12.tgz#a2a47ad0f1c168222db5206444a30c12457abb9f" + integrity "sha1-oqR60PHBaCIttSBkRKMMEkV6u58= sha512-zmXn03k3hN0KaiVTjohgkg98C3UowhL1/VSGdj4/VAAiMKGQOE80PFPxFP2Kyq0OUskPKcY5lImkhBKEHlypJA==" + dependencies: + chokidar ">=3.0.0 <4.0.0" + +sax@^1.2.4, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity "sha1-KBYjTiN4vdxOU1T6tcqold9xANk= sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + +saxes@^3.1.9: + version "3.1.11" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" + integrity "sha1-1Z0f0zLskq2YouCy7mRHAjhLHFs= sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==" + dependencies: + xmlchars "^2.1.1" + +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity "sha1-FxUfdtjq5n+793lgwzxnatn078c= sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==" + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A= sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==" + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.0.0, schema-utils@^2.5.0, schema-utils@^2.6.5, schema-utils@^2.7.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity "sha1-HKTzLRskxZDCA7jnpQvw6kzTlNc= sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==" + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity "sha1-vHTEtraZXB2I92qLd76nIZ4MgoE= sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==" + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + +selfsigned@^1.10.8: + version "1.10.11" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" + integrity "sha1-JJKc2Qb+D0S20B+yOZmnOVN6y+k= sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==" + dependencies: + node-forge "^0.10.0" + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5, semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc= sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity "sha1-XzyjV2HkfgWyBsba/yz4FPAxa44= sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0= sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + +semver@^7.1.2, semver@^7.2.1, semver@^7.3.2, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity "sha1-C2Ich5NI2JmOSw5L6Us/EuYBjvc= sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==" + dependencies: + lru-cache "^6.0.0" + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg= sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==" + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-error@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-8.1.0.tgz#3a069970c712f78634942ddd50fbbc0eaebe2f67" + integrity "sha1-OgaZcMcS94Y0lC3dUPu8Dq6+L2c= sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==" + dependencies: + type-fest "^0.20.2" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity "sha1-tSXhI4SJpez8Qq+sw/6Z5mb0sao= sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==" + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==" + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk= sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==" + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity "sha1-BF+XgtARrppoA93TgrJDkrPYkPc= sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs= sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4, setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY= sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM= sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + +sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc= sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-equal@^1.0.0, shallow-equal@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da" + integrity "sha1-TBar+lYEOqINBQMk76aJQLDaedo= sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" + +shallowequal@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity "sha1-GI1SHelbkIdAT9TctosT3wrk5/g= sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==" + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo= sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI= sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + +shell-quote@^1.6.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity "sha1-qkDtrBcERbmkMeF7tiwLiBucQSM= sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==" + +shelljs@^0.8.3: + version "0.8.4" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" + integrity "sha1-3naE/ut2f4cWsyYHiooAh1iQ48I= sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity "sha1-1rkYHBpI05cyTISHHvvPxz/AZUs= sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity "sha1-785cj9wQTudRslxY1CkAEfpeos8= sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==" + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +sigmund@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + integrity "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.5" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" + integrity "sha1-nj6MwMdamUcrRDIQM6dwLnc4JS8= sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==" + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity "sha1-E01oEpd1ZDfMBcoBNw06elcQde0= sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==" + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q= sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ= sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity "sha1-UA6N0P1VsFgVCGJVsxla3ypF/ms= sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==" + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs= sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI= sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0= sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sockjs-client@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.2.tgz#4bc48c2da9ce4769f19dc723396b50f5c12330a3" + integrity "sha1-S8SMLanOR2nxnccjOWtQ9cEjMKM= sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==" + dependencies: + debug "^3.2.6" + eventsource "^1.0.7" + faye-websocket "^0.11.3" + inherits "^2.0.4" + json3 "^3.3.3" + url-parse "^1.5.3" + +sockjs@^0.3.21: + version "0.3.21" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" + integrity "sha1-s0/7mOeWkwtgoM+hGQTWozmn1Bc= sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==" + dependencies: + faye-websocket "^0.11.3" + uuid "^3.4.0" + websocket-driver "^0.7.4" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity "sha1-RBttTTRnmPG05J6JIK37oOVD+a0= sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==" + dependencies: + is-plain-obj "^1.0.0" + +sortablejs@1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.10.2.tgz#6e40364d913f98b85a14f6678f92b5c1221f5290" + integrity "sha1-bkA2TZE/mLhaFPZnj5K1wSIfUpA= sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A==" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ= sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + +source-map-js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" + integrity "sha1-C7XeYxtBz72mz7qL0FqA79/SOF4= sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity "sha1-GQhmvs51U+H48mei7oLGBrVQmho= sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==" + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.6, source-map-support@~0.5.12: + version "0.5.20" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" + integrity "sha1-EhZgifj15ejFaSazd2Mzkt0stsk= sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==" + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity "sha1-CvZmBadFpaL5HPG7+KevvCg97FY= sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity "sha1-dHIq8y6WFOnCh6jQu95IteLxomM= sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + +source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M= sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + +sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity "sha1-6oBL2UhXQC5pktBaOO8a41qatMQ= sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity "sha1-hfMsPRDZaCAH6RdBTdxcJtGqaJk= sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity "sha1-3s6BrJweZxPl99G28X1Gj6U9iak= sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==" + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0= sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk= sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==" + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.10" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b" + integrity "sha1-DZvszN5wA9bGWNSH3UijLwvzAUs= sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==" + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity "sha1-ANSGOmQArXXfkzYaFghgXl3NzzE= sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==" + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity "sha1-t09GYgOj7aRSwCSSuR+56EonZ3s= sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==" + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I= sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==" + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc= sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity "sha1-FXk5E08gRk5zAd26PpD/qPdyisU= sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==" + dependencies: + figgy-pudding "^3.5.1" + +ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity "sha1-Y45OQ54v+9LNKJd21cpFfE9Roq8= sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==" + dependencies: + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity "sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88= sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + +stack-utils@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" + integrity "sha1-oZsLAZR+ACnI5FHV1hpJj1uxRxs= sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==" + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" + integrity "sha1-UkKUktY8YuuYmATBFVLj0i53kwM= sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==" + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs= sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64= sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==" + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw= sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==" + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity "sha1-1wiCgVWasneEJCebCHfaPDktWj0= sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + +stream@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stream/-/stream-0.0.2.tgz#7f5363f057f6592c5595f00bc80a27f5cec1f0ef" + integrity "sha1-f1Nj8Ff2WSxVlfALyAon9c7B8O8= sha512-gCq3NDI2P35B2n6t76YJuOp7d6cN/C7Rt0577l91wllh0sY9ZBuw9KaSGqH/b0hzn3CWWJbpbW0W0WvQ1H/Q7g==" + dependencies: + emitter-component "^1.1.1" + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==" + +string-convert@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" + integrity "sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c= sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= sha512-Qka42GGrS8Mm3SZ+7cH8UXiIWI867/b/Z/feQSpQx/rbfB8UGknGEZVaUQMOUVj+soY6NpWAxily63HI1OckVQ==" + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + +string-length@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" + integrity "sha1-EH74wjRW4Yeoq9SmEWL/SsbiWDc= sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==" + dependencies: + astral-regex "^1.0.0" + strip-ansi "^5.2.0" + +string-width@^2.0.0: + 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@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity "sha1-InZ74htirxCBV0MG9prFG2IgOWE= sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==" + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA= sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity "sha1-51rpDClCxjUEaGwYsoe0oLGkX4A= sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==" + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity "sha1-s2OZr0qymZtMnGSL16P7K7Jv7u0= sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==" + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity "sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4= sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==" + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g= sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity "sha1-cDBlrvyhkwDTzoivT1s5VtdVZik= sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==" + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==" + dependencies: + ansi-regex "^2.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@^5, strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4= sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==" + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk= sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" + dependencies: + ansi-regex "^5.0.1" + +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-comments@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" + integrity "sha1-grnEXn8FhzvuU/NxaK+TCqNoZ50= sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==" + dependencies: + babel-extract-comments "^1.0.0" + babel-plugin-transform-object-rest-spread "^6.26.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity "sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0= sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + +strip-indent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + integrity "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==" + +strip-json-comments@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity "sha1-PFMZQukIwml8DsNEhYwobHygpgo= sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" + +strip-json-comments@^3.1.0, 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==" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity "sha1-Zxj8r00eB9ihMYaQiB6NlnJqcdU= sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==" + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8= sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM= sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==" + dependencies: + has-flag "^3.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" + +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" + integrity "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==" + +svgo@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity "sha1-ttxRHAYzRsnkFbgeQ0ARRbltQWc= sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==" + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +swagger-client@^3.17.0: + version "3.17.0" + resolved "https://registry.yarnpkg.com/swagger-client/-/swagger-client-3.17.0.tgz#13e35e8ef7b5f05ab05dfaeb48acaa86b0882c64" + integrity "sha1-E+Nejve18FqwXfrrSKyqhrCILGQ= sha512-d8DOEME49wTXm+uT+lBAjJ5D6IDjEHdbkqa7MbcslR2c+oHIhi13ObwleVWGfr89MPkWgBl6RBq9VUHmrBJRbg==" + dependencies: + "@babel/runtime-corejs3" "^7.11.2" + btoa "^1.2.1" + cookie "~0.4.1" + cross-fetch "^3.1.4" + deep-extend "~0.6.0" + fast-json-patch "^3.0.0-1" + form-data-encoder "^1.4.3" + formdata-node "^4.0.0" + js-yaml "^4.1.0" + lodash "^4.17.21" + qs "^6.9.4" + traverse "~0.6.6" + url "~0.11.0" + +swagger-ui@^3.50.0: + version "3.52.5" + resolved "https://registry.yarnpkg.com/swagger-ui/-/swagger-ui-3.52.5.tgz#bffb736e737ad8783d2d8b06d08224ba611d3507" + integrity "sha1-v/tzbnN62Hg9LYsG0IIkumEdNQc= sha512-GvxNYvSaFkU9OoG4BQxjmengl5fA+A5wAuG4rtAbBLWlrLkBiQiHXKQPzyDMUUa3/8nielKpEK1NunnxwpY9Mg==" + dependencies: + "@babel/runtime-corejs3" "^7.14.7" + "@braintree/sanitize-url" "^5.0.2" + "@kyleshockey/object-assign-deep" "^0.4.2" + "@kyleshockey/xml" "^1.0.2" + base64-js "^1.5.1" + classnames "^2.3.1" + css.escape "1.5.1" + deep-extend "0.6.0" + dompurify "^2.2.9" + ieee754 "^1.2.1" + immutable "^3.x.x" + js-file-download "^0.4.12" + js-yaml "=4.1.0" + lodash "^4.17.21" + memoizee "^0.4.15" + prop-types "^15.7.2" + randombytes "^2.1.0" + react "=15.7.0" + react-copy-to-clipboard "5.0.3" + react-debounce-input "^3.2.3" + react-dom "=15.7.0" + react-immutable-proptypes "2.2.0" + react-immutable-pure-component "^1.1.1" + react-inspector "^2.3.0" + react-motion "^0.5.2" + react-redux "=4.4.10" + react-syntax-highlighter "^15.4.4" + redux "=3.7.2" + redux-immutable "3.1.0" + remarkable "^2.0.1" + reselect "^4.0.0" + serialize-error "^8.1.0" + sha.js "^2.4.11" + swagger-client "^3.17.0" + url-parse "^1.5.2" + xml-but-prettier "^1.0.1" + zenscroll "^4.0.2" + +symbol-observable@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity "sha1-wiaIrtTqs83C3+rLtWFmBWCgCAQ= sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity "sha1-QwY30ki6d+B4iDlR+5qg7tfGP6I= sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + +table@^6.0.9: + version "6.7.3" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.3.tgz#255388439715a738391bd2ee4cbca89a4d05a9b7" + integrity "sha1-JVOIQ5cVpzg5G9LuTLyomk0Fqbc= sha512-5DkIxeA7XERBqMwJq0aHZOdMadBx4e6eDoFRuyT5VR82J0Ycg2DwM6GfA/EQAhJ+toRTaS1lIdSQCqgrmhPnlw==" + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity "sha1-ofzMBrWNth/XpF2i2kT186Pme6I= sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + +terser-webpack-plugin@^1.4.3, terser-webpack-plugin@^1.4.4: + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity "sha1-oheu+uozDnNP+sthIOwfoxLWBAs= sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==" + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity "sha1-YwVjQ9fHC7KfOvZlhlpG/gOg3xc= sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==" + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity "sha1-w9Ph4xHrfuQF4JLawQrv0JCR6sA= sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==" + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==" + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity "sha1-iTLmhqQGYDigFt2eLKRq3Zg4qV8= sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==" + dependencies: + any-promise "^1.0.0" + +thread-loader@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/thread-loader/-/thread-loader-2.1.3.tgz#cbd2c139fc2b2de6e9d28f62286ab770c1acbdda" + integrity "sha1-y9LBOfwrLebp0o9iKGq3cMGsvdo= sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==" + dependencies: + loader-runner "^2.3.1" + loader-utils "^1.1.0" + neo-async "^2.6.0" + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA==" + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0= sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==" + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity "sha1-Wrr3FKlAXbBQRzK7zNLO3Z75U30= sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity "sha1-RKRcEfv0B/NPl7zNFXfGUjYbAO4= sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==" + dependencies: + setimmediate "^1.0.4" + +timers-ext@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" + integrity "sha1-b1ethXjgej+5+R2Th9ZWR1VeJcY= sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==" + dependencies: + es5-ext "~0.10.46" + next-tick "1" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==" + +tinycolor2@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" + integrity "sha1-P2pNEHGtB2dtf6Ry4frECnGdiAM= sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk= sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==" + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity "sha1-hoPguQK7nCDE9ybjwLafNlGMB8w= sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +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" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4= sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==" + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity "sha1-bkWxJj8gF/oKzH2J14sVuL932jI= sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM= sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + +toposort@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" + integrity "sha1-LmhELZ9k7HILjMieZEOsbKqVACk= sha512-FclLrw8b9bMWf4QlCJuHBEVhSRsqDj6u3nIjAzPeJvgl//1hBlffdlk0MALceL14+koWEdU4ofRAXofbODxQzg==" + +tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity "sha1-zZ+yoKodWhK0c72fuW+j3P9lreI= sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==" + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + integrity "sha1-nfT1fnOcJpMKAYGEiH9K233Kc7I= sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==" + dependencies: + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==" + dependencies: + punycode "^2.1.0" + +traverse@~0.6.6: + version "0.6.6" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" + integrity "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc= sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw==" + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity "sha1-8shUBoALmw90yfdGW4HqrSQSUvg= sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + +ts-jest@^24.2.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.3.0.tgz#b97814e3eab359ea840a1ac112deae68aa440869" + integrity "sha1-uXgU4+qzWeqEChrBEt6uaKpECGk= sha512-Hb94C/+QRIgjVZlJyiWwouYUF+siNJHJHknyspaOcZ+OQAIdFG/UrdQVXw/0B8Z3No34xkUXZJpOTy9alOWdVQ==" + dependencies: + bs-logger "0.x" + buffer-from "1.x" + fast-json-stable-stringify "2.x" + json5 "2.x" + lodash.memoize "4.x" + make-error "1.x" + mkdirp "0.x" + resolve "1.x" + semver "^5.5" + yargs-parser "10.x" + +ts-loader@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.2.2.tgz#dffa3879b01a1a1e0a4b85e2b8421dc0dfff1c58" + integrity "sha1-3/o4ebAaGh4KS4XiuEIdwN//HFg= sha512-HDo5kXZCBml3EUPcc7RlZOV/JGlLHwppTLEHb3SHnr5V7NXD4klMEkrhJe5wgRbaWsSXi+Y1SIBN/K9B6zWGWQ==" + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^4.0.0" + semver "^6.0.0" + +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity "sha1-pQCtCEsHmPHDBxrzkeZZEshrypI= sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" + +tsconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" + integrity "sha1-hFOIdaTcIW5cSlQys6Tew9VOkbc= sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==" + dependencies: + "@types/strip-bom" "^3.0.0" + "@types/strip-json-comments" "0.0.30" + strip-bom "^3.0.0" + strip-json-comments "^2.0.0" + +tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA= sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + +tslint@^5.20.1: + version "5.20.1" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d" + integrity "sha1-5AHortoBUrxE3QfmFANPP4DGe30= sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==" + dependencies: + "@babel/code-frame" "^7.0.0" + builtin-modules "^1.1.1" + chalk "^2.3.0" + commander "^2.12.1" + diff "^4.0.1" + glob "^7.1.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + mkdirp "^0.5.1" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.8.0" + tsutils "^2.29.0" + +tsutils@^2.29.0: + version "2.29.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + integrity "sha1-MrSIUBRnrL7dS4VJhnOggSrKC5k= sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==" + dependencies: + tslib "^1.8.1" + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity "sha1-tIcX05TOpsHglpg+7Vjp1hcVtiM= sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==" + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==" + dependencies: + safe-buffer "^5.0.1" + +tus-js-client@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/tus-js-client/-/tus-js-client-2.3.0.tgz#5d76145476cea46a4e7c045a0054637cddf8dc39" + integrity "sha1-XXYUVHbOpGpOfARaAFRjfN343Dk= sha512-I4cSwm6N5qxqCmBqenvutwSHe9ntf81lLrtf6BmLpG2v4wTl89atCQKqGgqvkodE6Lx+iKIjMbaXmfvStTg01g==" + dependencies: + buffer-from "^0.1.1" + combine-errors "^3.0.3" + is-stream "^2.0.0" + js-base64 "^2.6.1" + lodash.throttle "^4.1.1" + proper-lockfile "^2.0.1" + url-parse "^1.4.3" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity "sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE= sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==" + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity "sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ= sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity "sha1-0mCiSwGYQ24TP6JqUkptZfo7Ljc= sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity "sha1-jSojcNPfiG61yQraHFv2GIrPg4s= sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE= sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity "sha1-hI3XaY2vo+VKbEeedZxLw/GIR6A= sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + +type@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" + integrity "sha1-Ci54wud5B7JSq+XymMGwHGPw2z0= sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + +typescript@^4.2.4: + version "4.4.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" + integrity "sha1-LNAaGh8WBwTTEB/VpY/w+fy4Aww= sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==" + +ua-parser-js@^0.7.30: + version "0.7.31" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" + integrity "sha1-ZJplaxkd/6tPIdXgU+J8oXy/9cY= sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==" + +uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity "sha1-nEEagCpAmpH8bPdAgbq6NLJEmaw= sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + +uglify-js@3.4.x: + version "3.4.10" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" + integrity "sha1-mtlWPY6zrN+404WX0q8dgV9qdV8= sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==" + dependencies: + commander "~2.19.0" + source-map "~0.6.1" + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity "sha1-CF4hViXsMWJXTciFmr7nilmxRHE= sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==" + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity "sha1-MBrNxSVjFnDTn2FG4Od/9rvevdw= sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity "sha1-VP0W4OyxZ88Ezx91a9zJLrp5dsM= sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==" + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity "sha1-GgGqVyR8FMVouJd1pUk4eIGJpxQ= sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity "sha1-CjbLmlhcT2q9Ua0d7dsoXBZSl8g= sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc= sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==" + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity "sha1-/+3ks2slKQaW5uFl1KWe25mOawI= sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==" + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA= sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==" + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity "sha1-uqvOkQg/xk6UWw861hPiZPfNTmw= sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==" + dependencies: + imurmurhash "^0.1.4" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY= sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity "sha1-daSYTv7cSwiXXFrrc/Uw0C3yVxc= sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + +"unorm@>= 1.0.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af" + integrity "sha1-ApsolmH7pxTxqa9DnrUdmxbCBa8= sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ= sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34= sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==" + +url-loader@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-2.3.0.tgz#e0e2ef658f003efb8ca41b0f3ffbf76bab88658b" + integrity "sha1-4OLvZY8APvuMpBsPP/v3a6uIZYs= sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==" + dependencies: + loader-utils "^1.2.3" + mime "^2.4.4" + schema-utils "^2.5.0" + +url-parse@^1.4.3, url-parse@^1.4.7, url-parse@^1.5.2, url-parse@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" + integrity "sha1-ccEwPTj7Zjmt4YPCmSyMwGht+GI= sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==" + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0, url@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8= sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + +uslug@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/uslug/-/uslug-1.0.4.tgz#b9a22f0914e0a86140633dacc302e5f4fa450677" + integrity "sha1-uaIvCRTgqGFAYz2swwLl9PpFBnc= sha512-Jrbpp/NS3TvIGNjfJT1sn3/BCeykoxR8GbNYW5lF6fUscLkbXFwj1b7m4DvIkHm8k3Qr6Co68lbTmoZTMGk/ow==" + dependencies: + unorm ">= 1.0.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + +util.promisify@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA= sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==" + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util.promisify@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" + integrity "sha1-d4MvV87SyUeBdBScrpuW6ZGM1Us= sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==" + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + for-each "^0.3.3" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.1" + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity "sha1-a693dLgO6w91INi4HQeYKlmruu4= sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==" + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity "sha1-evsa/lCAUkZInj23/g7TeTNqwPk= sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==" + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE= sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==" + dependencies: + inherits "2.0.3" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + +uuid@^3.3.2, uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4= sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity "sha1-LeGWGMZtwkfc+2+ZM4A12CRaLO4= sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity "sha1-/JH2uce6FchX9MssXe/uw51PQQo= sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==" + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity "sha1-4rgApT56Kbk1BsPPQRANFsTErY4= sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity "sha1-eGQcSIuObKkadfUR56OzKobl3aA= sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + +vue-axios@^3.2.4: + version "3.4.0" + resolved "https://registry.yarnpkg.com/vue-axios/-/vue-axios-3.4.0.tgz#059d7fcbe83f786cda24e9501317174736927b37" + integrity "sha1-BZ1/y+g/eGzaJOlQExcXRzaSezc= sha512-S3YTCJeEndzmtaYzyz919Z54wY1D2OftWEhioGbHED3VUSta8ti0OHjDipTPkb1StxOzQLAAO2hSUq830i14KA==" + +vue-chartjs@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/vue-chartjs/-/vue-chartjs-3.5.1.tgz#d25e845708f7744ae51bed9d23a975f5f8fc6529" + integrity "sha1-0l6EVwj3dErlG+2dI6l19fj8ZSk= sha512-foocQbJ7FtveICxb4EV5QuVpo6d8CmZFmAopBppDIGKY+esJV8IJgwmEW0RexQhxqXaL/E1xNURsgFFYyKzS/g==" + dependencies: + "@types/chart.js" "^2.7.55" + +vue-class-component@^7.2.6: + version "7.2.6" + resolved "https://registry.yarnpkg.com/vue-class-component/-/vue-class-component-7.2.6.tgz#8471e037b8e4762f5a464686e19e5afc708502e4" + integrity "sha1-hHHgN7jkdi9aRkaG4Z5a/HCFAuQ= sha512-+eaQXVrAm/LldalI272PpDe3+i4mPis0ORiMYxF6Ae4hyuCh15W8Idet7wPUEs4N4YptgFHGys4UrgNQOMyO6w==" + +vue-cli-plugin-vuetify@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/vue-cli-plugin-vuetify/-/vue-cli-plugin-vuetify-2.3.1.tgz#9e45a686902351320e876881d057eb69c646a22b" + integrity "sha1-nkWmhpAjUTIOh2iB0FfracZGois= sha512-96NLmCE12FalyWSxbfFerbOKSwuPq5b4zYRei5BRLbdCBq+YgmCMv8zgZl8Rx/kR/91T4i8XZDCNgfQ78mpQ3A==" + dependencies: + null-loader "^3.0.0" + semver "^7.1.2" + shelljs "^0.8.3" + +vue-cropperjs@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/vue-cropperjs/-/vue-cropperjs-4.2.0.tgz#6bce4c17478cecec56571d4060892a386307c60e" + integrity "sha1-a85MF0eM7OxWVx1AYIkqOGMHxg4= sha512-dvwCBtjGMiznkNIK2GFd1SQm1x+wmtWg4g4t+NrJSPj/fpHnubXxAUOIvY7lMFeR2lawRLsigCaGZrcXCzuTKA==" + dependencies: + cropperjs "^1.5.6" + +vue-d3-network@^0.1.28: + version "0.1.28" + resolved "https://registry.yarnpkg.com/vue-d3-network/-/vue-d3-network-0.1.28.tgz#9cfa24f3c7e94a4218da425f1b2bf6387baa7802" + integrity "sha1-nPok88fpSkIY2kJfGyv2OHuqeAI= sha512-36Id0gT/fMEK0i+rV7ikAbqXdB0wDHK9cBOlXDjLK2FYBB8yAExN82dYsmTF4GPiGx59hsQV/MvgWmercRjDww==" + dependencies: + d3-force "^1.0.6" + +vue-eslint-parser@^7.0.0, vue-eslint-parser@^7.10.0: + version "7.11.0" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz#214b5dea961007fcffb2ee65b8912307628d0daf" + integrity "sha1-IUtd6pYQB/z/su5luJEjB2KNDa8= sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg==" + dependencies: + debug "^4.1.1" + eslint-scope "^5.1.1" + eslint-visitor-keys "^1.1.0" + espree "^6.2.1" + esquery "^1.4.0" + lodash "^4.17.21" + semver "^6.3.0" + +vue-hot-reload-api@^2.3.0: + version "2.3.4" + resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" + integrity "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI= sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==" + +vue-jest@^3.0.5: + version "3.0.7" + resolved "https://registry.yarnpkg.com/vue-jest/-/vue-jest-3.0.7.tgz#a6d29758a5cb4d750f5d1242212be39be4296a33" + integrity "sha1-ptKXWKXLTXUPXRJCISvjm+QpajM= sha512-PIOxFM+wsBMry26ZpfBvUQ/DGH2hvp5khDQ1n51g3bN0TwFwTy4J85XVfxTRMukqHji/GnAoGUnlZ5Ao73K62w==" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.26.0" + chalk "^2.1.0" + deasync "^0.1.15" + extract-from-css "^0.4.4" + find-babel-config "^1.1.0" + js-beautify "^1.6.14" + node-cache "^4.1.1" + object-assign "^4.1.1" + source-map "^0.5.6" + tsconfig "^7.0.0" + vue-template-es2015-compiler "^1.6.0" + +"vue-loader-v16@npm:vue-loader@^16.1.0": + version "16.8.3" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-16.8.3.tgz#d43e675def5ba9345d6c7f05914c13d861997087" + integrity "sha1-1D5nXe9bqTRdbH8FkUwT2GGZcIc= sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==" + dependencies: + chalk "^4.1.0" + hash-sum "^2.0.0" + loader-utils "^2.0.0" + +vue-loader@^15.9.2: + version "15.9.8" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.8.tgz#4b0f602afaf66a996be1e534fb9609dc4ab10e61" + integrity "sha1-Sw9gKvr2aplr4eU0+5YJ3EqxDmE= sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog==" + dependencies: + "@vue/component-compiler-utils" "^3.1.0" + hash-sum "^1.0.2" + loader-utils "^1.1.0" + vue-hot-reload-api "^2.3.0" + vue-style-loader "^4.1.0" + +vue-lodash@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/vue-lodash/-/vue-lodash-2.1.2.tgz#1ec2b1471ee289518e8d285250a25516adee6c51" + integrity "sha1-HsKxRx7iiVGOjShSUKJVFq3ubFE= sha512-6QsNC7/XjrK4xKxFhh6Ppvcrfm0uAeR/lFsySsMgfEFUWkvRztcAIS3MsqAI4bBnAaLo9ou+8tUfJ8d+yrljQg==" + +vue-luxon@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/vue-luxon/-/vue-luxon-0.10.0.tgz#82d31da8ca8d2c04166ca591326adb6675564eec" + integrity "sha1-gtMdqMqNLAQWbKWRMmrbZnVWTuw= sha512-edMqK3qfWNze9z7Upbkb6RSI5XFFwaU3LwD6ZPJJPBhinTg1VBH7Rn8qNi5+5GmHMcbp2ybnOWm78m5lTjznFw==" + dependencies: + luxon "^1.25.0" + +vue-markdown@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/vue-markdown/-/vue-markdown-2.2.4.tgz#db0f774178f3bc91ee18c626d86a3a0d2de22746" + integrity "sha1-2w93QXjzvJHuGMYm2Go6DS3iJ0Y= sha512-hoTX/W1UIdHZrp/b0vpHSsJXAEfWsafaQLgtE2VX4gY8O/C3L2Gabqu95gyG429rL4ML1SwGv+xsPABX7yfFIQ==" + dependencies: + highlight.js "^9.12.0" + markdown-it "^6.0.1" + markdown-it-abbr "^1.0.3" + markdown-it-deflist "^2.0.1" + markdown-it-emoji "^1.1.1" + markdown-it-footnote "^2.0.0" + markdown-it-ins "^2.0.0" + markdown-it-katex "^2.0.3" + markdown-it-mark "^2.0.0" + markdown-it-sub "^1.0.0" + markdown-it-sup "^1.0.0" + markdown-it-task-lists "^2.0.1" + markdown-it-toc-and-anchor "^4.1.2" + +vue-native-websocket@^2.0.14: + version "2.0.15" + resolved "https://registry.yarnpkg.com/vue-native-websocket/-/vue-native-websocket-2.0.15.tgz#e94af2bb7f54beeaac5281d953751d2858b76964" + integrity "sha1-6Uryu39UvuqsUoHZU3UdKFi3aWQ= sha512-i3UvRL99rY8ytV0VJzcWDwY3fRPoeh2fGYvB9862JocEQOx/oCw/VtPIUwP4tSzmzJvJZNkvP71wfhfS1sVhxQ==" + +vue-pipeline@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/vue-pipeline/-/vue-pipeline-1.0.12.tgz#d0bcdc352f365336f18c15f548fee1346e0c8bbc" + integrity "sha1-0LzcNS82UzbxjBX1SP7hNG4Mi7w= sha512-iVRGipthPd/KOr9XGw7TJt1VOfJvBYrPUbA4wNW/QQ4GLOrQXC+cMhN7mulJoWlXn0g/FkxM4hnDlPMo36yhvQ==" + dependencies: + string-width "^4.2.0" + +vue-prism-editor@^1.2.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/vue-prism-editor/-/vue-prism-editor-1.3.0.tgz#dcef6d8731623227db27d59be7ffca50bc57b6d3" + integrity "sha1-3O9thzFiMifbJ9Wb5//KULxXttM= sha512-54RfgtMGRMNr9484zKMOZs1wyLDR6EfFylzE2QrMCD9alCvXyYYcS0vX8oUHh+6pMUu6ts59uSN9cHglpU2NRQ==" + +vue-property-decorator@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/vue-property-decorator/-/vue-property-decorator-9.1.2.tgz#266a2eac61ba6527e2e68a6933cfb98fddab5457" + integrity "sha1-JmourGG6ZSfi5oppM8+5j92rVFc= sha512-xYA8MkZynPBGd/w5QFJ2d/NM0z/YeegMqYTphy7NJQXbZcuU6FC6AOdUAcy4SXP+YnkerC6AfH+ldg7PDk9ESQ==" + +vue-ref@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/vue-ref/-/vue-ref-2.0.0.tgz#483084d732abed11da796778a8266a3af0ea1a9c" + integrity "sha1-SDCE1zKr7RHaeWd4qCZqOvDqGpw= sha512-uKNKpFOVeWNqS2mrBZqnpLyXJo5Q+vnkex6JvpENvhXHFNBW/SJTP8vJywLuVT3DpxwXcF9N0dyIiZ4/NpTexQ==" + +vue-router@^3.2.0: + version "3.5.3" + resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.5.3.tgz#041048053e336829d05dafacf6a8fb669a2e7999" + integrity "sha1-BBBIBT4zaCnQXa+s9qj7ZpoueZk= sha512-FUlILrW3DGitS2h+Xaw8aRNvGTwtuaxrRkNSHWTizOfLUie7wuYwezeZ50iflRn8YPV5kxmU2LQuu3nM/b3Zsg==" + +vue-style-loader@^4.1.0, vue-style-loader@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz#6d55863a51fa757ab24e89d9371465072aa7bc35" + integrity "sha1-bVWGOlH6dXqyTonZNxRlByqnvDU= sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==" + dependencies: + hash-sum "^1.0.2" + loader-utils "^1.0.2" + +vue-template-compiler@^2.6.14: + version "2.6.14" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz#a2f0e7d985670d42c9c9ee0d044fed7690f4f763" + integrity "sha1-ovDn2YVnDULJye4NBE/tdpD092M= sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==" + dependencies: + de-indent "^1.0.2" + he "^1.1.0" + +vue-template-es2015-compiler@^1.6.0, vue-template-es2015-compiler@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" + integrity "sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU= sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==" + +vue@2.6.14, vue@^2.5.16, vue@^2.6.11: + version "2.6.14" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.14.tgz#e51aa5250250d569a3fbad3a8a5a687d6036e235" + integrity "sha1-5RqlJQJQ1Wmj+606ilpofWA24jU= sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==" + +vuedraggable@^2.24.3: + version "2.24.3" + resolved "https://registry.yarnpkg.com/vuedraggable/-/vuedraggable-2.24.3.tgz#43c93849b746a24ce503e123d5b259c701ba0d19" + integrity "sha1-Q8k4SbdGokzlA+Ej1bJZxwG6DRk= sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==" + dependencies: + sortablejs "1.10.2" + +vuetify-loader@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/vuetify-loader/-/vuetify-loader-1.7.2.tgz#5cdc45309496cf3a5fe431fd7611706ffa4aa8c8" + integrity "sha1-XNxFMJSWzzpf5DH9dhFwb/pKqMg= sha512-2GSo4KvRAOThBsj8mvtIEeIoyBAZx38GDfh8D90e/or7Hzx4813krJKvcQAllyLO/Ln0eQWrq2IuvBXnZ55cSA==" + dependencies: + decache "^4.6.0" + file-loader "^6.2.0" + loader-utils "^2.0.0" + +vuetify@2.4.6: + version "2.4.6" + resolved "https://registry.yarnpkg.com/vuetify/-/vuetify-2.4.6.tgz#127b37bd36c7a63f61615e0cd6f97e8b203e7a07" + integrity "sha1-Ens3vTbHpj9hYV4M1vl+iyA+egc= sha512-oqAWKAin07ip/QuT/p4bL1LegE3MYPbfojrOcj80RATZDSnJyco2PZD8QuIzd0RhYfdAuSTkY8elvHsLu90RuQ==" + +vuex@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.6.2.tgz#236bc086a870c3ae79946f107f16de59d5895e71" + integrity "sha1-I2vAhqhww655lG8QfxbeWdWJXnE= sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==" + +w3c-hr-time@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity "sha1-ConN9cwVgi35w2BUNnaWPgzDCM0= sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==" + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" + integrity "sha1-MEhcp9cKb9BSQgo9Ev2Q5jOc55Q= sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==" + dependencies: + domexception "^1.0.1" + webidl-conversions "^4.0.2" + xml-name-validator "^3.0.0" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity "sha1-vUmNtHev5XPcBBhfAR06uKjXZT8= sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==" + dependencies: + makeerror "1.0.12" + +warning@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity "sha1-Fungd+uKhtavfWSqHgX9hbRnjKM= sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==" + dependencies: + loose-envify "^1.0.0" + +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity "sha1-OFAAcu5uzmbzdpk2lQ6hdxvhyVc= sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==" + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity "sha1-EmfmxV4Lm1vkTCAjrtVDeiwmxFM= sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==" + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity "sha1-wdjRSTFtPqhShIiVy2oL/oh7h98= sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==" + dependencies: + minimalistic-assert "^1.0.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==" + dependencies: + defaults "^1.0.3" + +web-streams-polyfill@4.0.0-beta.1: + version "4.0.0-beta.1" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.1.tgz#3b19b9817374b7cee06d374ba7eeb3aeb80e8c95" + integrity "sha1-Oxm5gXN0t87gbTdLp+6zrrgOjJU= sha512-3ux37gEX670UUphBF9AMCq8XM6iQ8Ac6A+DSRRjDoRBm1ufCkaCDdNVbaqq60PsEkdNlLKrGtv/YBP4EJXqNtQ==" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity "sha1-qFWYCx8LazWbodXZ+zmulB+qY60= sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + +webpack-bundle-analyzer@^3.8.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz#f6f94db108fb574e415ad313de41a2707d33ef3c" + integrity "sha1-9vlNsQj7V05BWtMT3kGicH0z7zw= sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==" + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + bfj "^6.1.1" + chalk "^2.4.1" + commander "^2.18.0" + ejs "^2.6.1" + express "^4.16.3" + filesize "^3.6.1" + gzip-size "^5.0.0" + lodash "^4.17.19" + mkdirp "^0.5.1" + opener "^1.5.1" + ws "^6.0.0" + +webpack-chain@^6.4.0: + version "6.5.1" + resolved "https://registry.yarnpkg.com/webpack-chain/-/webpack-chain-6.5.1.tgz#4f27284cbbb637e3c8fbdef43eef588d4d861206" + integrity "sha1-TycoTLu2N+PI+970Pu9YjU2GEgY= sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==" + dependencies: + deepmerge "^1.5.2" + javascript-stringify "^2.0.1" + +webpack-dev-middleware@^3.7.2: + version "3.7.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity "sha1-Bjk3KxQyYuK4SrldO5GnWXBhwsU= sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==" + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@^3.11.0: + version "3.11.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz#695ebced76a4929f0d5de7fd73fafe185fe33708" + integrity "sha1-aV687Xakkp8NXef9c/r+GF/jNwg= sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==" + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.3.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.8" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.26" + schema-utils "^1.0.0" + selfsigned "^1.10.8" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "^0.3.21" + sockjs-client "^1.5.0" + spdy "^4.0.2" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "^13.3.2" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity "sha1-W3ko4GN1k/EZ0y9iJ8HgrDHhtH8= sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==" + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-merge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" + integrity "sha1-onxS6ng9E5iv0gh/VH17nS9DY00= sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==" + dependencies: + lodash "^4.17.15" + +webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity "sha1-7t2OwLko+/HL/plOItLYkPMwqTM= sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==" + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.0.0: + version "4.46.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" + integrity "sha1-v5tEBOogoHNgXgoBHRiNd8tq1UI= sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==" + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.5.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity "sha1-ia1Slbv2S0gKvLox5JU6ynBvV2A= sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==" + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity "sha1-f4RzvIOd/YdgituV1+sHUhFXikI= sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity "sha1-WrrPd3wyFmpR0IXWtPPn0nET3bA= sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==" + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@>=0.10.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity "sha1-3O0k838mJO0CgXJdUdDi4/5nf4w= sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity "sha1-PUseAxLSB5h5+Cav8Y2+7KWWD78= sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity "sha1-8t8Cv/F2/WUHDfdK1cy7WhmZZag= sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==" + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity "sha1-wsSS8eymEpiO/T0iZr4bn8YXDQY= sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==" + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity "sha1-E3V7yJsgmwSf5dhkMOIc9AqJqOY= sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==" + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + +which@^1.2.9, which@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo= sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==" + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + 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" + +wildcard@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-1.1.2.tgz#a7020453084d8cd2efe70ba9d3696263de1710a5" + integrity "sha1-pwIEUwhNjNLv5wup02liY94XEKU= sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==" + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w= sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + +workbox-background-sync@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz#26821b9bf16e9e37fd1d640289edddc08afd1950" + integrity "sha1-JoIbm/Funjf9HWQCie3dwIr9GVA= sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==" + dependencies: + workbox-core "^4.3.1" + +workbox-broadcast-update@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz#e2c0280b149e3a504983b757606ad041f332c35b" + integrity "sha1-4sAoCxSeOlBJg7dXYGrQQfMyw1s= sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==" + dependencies: + workbox-core "^4.3.1" + +workbox-build@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-4.3.1.tgz#414f70fb4d6de47f6538608b80ec52412d233e64" + integrity "sha1-QU9w+01t5H9lOGCLgOxSQS0jPmQ= sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==" + dependencies: + "@babel/runtime" "^7.3.4" + "@hapi/joi" "^15.0.0" + common-tags "^1.8.0" + fs-extra "^4.0.2" + glob "^7.1.3" + lodash.template "^4.4.0" + pretty-bytes "^5.1.0" + stringify-object "^3.3.0" + strip-comments "^1.0.2" + workbox-background-sync "^4.3.1" + workbox-broadcast-update "^4.3.1" + workbox-cacheable-response "^4.3.1" + workbox-core "^4.3.1" + workbox-expiration "^4.3.1" + workbox-google-analytics "^4.3.1" + workbox-navigation-preload "^4.3.1" + workbox-precaching "^4.3.1" + workbox-range-requests "^4.3.1" + workbox-routing "^4.3.1" + workbox-strategies "^4.3.1" + workbox-streams "^4.3.1" + workbox-sw "^4.3.1" + workbox-window "^4.3.1" + +workbox-cacheable-response@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz#f53e079179c095a3f19e5313b284975c91428c91" + integrity "sha1-9T4HkXnAlaPxnlMTsoSXXJFCjJE= sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==" + dependencies: + workbox-core "^4.3.1" + +workbox-core@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-4.3.1.tgz#005d2c6a06a171437afd6ca2904a5727ecd73be6" + integrity "sha1-AF0sagahcUN6/WyikEpXJ+zXO+Y= sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" + +workbox-expiration@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-4.3.1.tgz#d790433562029e56837f341d7f553c4a78ebe921" + integrity "sha1-15BDNWICnlaDfzQdf1U8Snjr6SE= sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==" + dependencies: + workbox-core "^4.3.1" + +workbox-google-analytics@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz#9eda0183b103890b5c256e6f4ea15a1f1548519a" + integrity "sha1-ntoBg7EDiQtcJW5vTqFaHxVIUZo= sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==" + dependencies: + workbox-background-sync "^4.3.1" + workbox-core "^4.3.1" + workbox-routing "^4.3.1" + workbox-strategies "^4.3.1" + +workbox-navigation-preload@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz#29c8e4db5843803b34cd96dc155f9ebd9afa453d" + integrity "sha1-Kcjk21hDgDs0zZbcFV+evZr6RT0= sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==" + dependencies: + workbox-core "^4.3.1" + +workbox-precaching@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-4.3.1.tgz#9fc45ed122d94bbe1f0ea9584ff5940960771cba" + integrity "sha1-n8Re0SLZS74fDqlYT/WUCWB3HLo= sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==" + dependencies: + workbox-core "^4.3.1" + +workbox-range-requests@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz#f8a470188922145cbf0c09a9a2d5e35645244e74" + integrity "sha1-+KRwGIkiFFy/DAmpotXjVkUkTnQ= sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==" + dependencies: + workbox-core "^4.3.1" + +workbox-routing@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-4.3.1.tgz#a675841af623e0bb0c67ce4ed8e724ac0bed0cda" + integrity "sha1-pnWEGvYj4LsMZ85O2OckrAvtDNo= sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==" + dependencies: + workbox-core "^4.3.1" + +workbox-strategies@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-4.3.1.tgz#d2be03c4ef214c115e1ab29c9c759c9fe3e9e646" + integrity "sha1-0r4DxO8hTBFeGrKcnHWcn+Pp5kY= sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==" + dependencies: + workbox-core "^4.3.1" + +workbox-streams@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-4.3.1.tgz#0b57da70e982572de09c8742dd0cb40a6b7c2cc3" + integrity "sha1-C1facOmCVy3gnIdC3Qy0Cmt8LMM= sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==" + dependencies: + workbox-core "^4.3.1" + +workbox-sw@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-4.3.1.tgz#df69e395c479ef4d14499372bcd84c0f5e246164" + integrity "sha1-32njlcR5700USZNyvNhMD14kYWQ= sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==" + +workbox-webpack-plugin@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz#47ff5ea1cc074b6c40fb5a86108863a24120d4bd" + integrity "sha1-R/9eocwHS2xA+1qGEIhjokEg1L0= sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==" + dependencies: + "@babel/runtime" "^7.0.0" + json-stable-stringify "^1.0.1" + workbox-build "^4.3.1" + +workbox-window@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-4.3.1.tgz#ee6051bf10f06afa5483c9b8dfa0531994ede0f3" + integrity "sha1-7mBRvxDwavpUg8m436BTGZTt4PM= sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==" + dependencies: + workbox-core "^4.3.1" + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity "sha1-JqlMU5G7ypJhUgAvabhKS/dy5ag= sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==" + dependencies: + errno "~0.1.7" + +worker-rpc@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" + integrity "sha1-y1Zb1tcHGo8WZgaGBR6WmtMvVNU= sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==" + dependencies: + microevent.ts "~0.1.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk= sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==" + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity "sha1-6Tk7oHEC5skaOyIUePAlfNKFblM= sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==" + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +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==" + +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity "sha1-0LBUY8GIroBDlv1asqNwBir4dSk= sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +ws@^5.2.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" + integrity "sha1-BVQQU0FJIbwpxjvuFLiw3VCwez0= sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==" + dependencies: + async-limiter "~1.0.0" + +ws@^6.0.0, ws@^6.2.1: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity "sha1-3Vzb1XqZeZFgl2UtePHMX66gwy4= sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==" + dependencies: + async-limiter "~1.0.0" + +ws@^7.0.0: + version "7.5.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" + integrity "sha1-i0vEr1GM+r0Ec65PmRRCh7M+uIE= sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==" + +xml-but-prettier@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/xml-but-prettier/-/xml-but-prettier-1.0.1.tgz#f5a33267ed42ccd4e355c62557a5e39b01fb40f3" + integrity "sha1-9aMyZ+1CzNTjVcYlV6XjmwH7QPM= sha512-C2CJaadHrZTqESlH03WOyw0oZTtoy2uEg6dSDF6YRg+9GnYNub53RRemLpnvtbHDFelxMx4LajiFsYeR6XJHgQ==" + dependencies: + repeat-string "^1.5.2" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity "sha1-auc+Bt5NjG5H+fsYH3jWSK1FfGo= sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + +xmlchars@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity "sha1-Bg/hvLf5x2/ioX24apvDq4lCEMs= sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q= sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity "sha1-tfJZyCzW4zaSHv17/Yv1YN6e7t8= sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + +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@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0= sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI= sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + +yaml@^1.10.2, yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity "sha1-IwHF/78StGfejaIzOkWeKeeSDks= sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + +yargs-parser@10.x: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity "sha1-cgImW4n36eny5XZeD+c1qQXtuqg= sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==" + dependencies: + camelcase "^4.1.0" + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity "sha1-Ew8JcC667vJlDVTObj5XBvek+zg= sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==" + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +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@^13.3.0, yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity "sha1-rX/+/sGqWVZayRX4Lcyzipwxot0= sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==" + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@^16.0.0: + 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" + +yorkie@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yorkie/-/yorkie-2.0.0.tgz#92411912d435214e12c51c2ae1093e54b6bb83d9" + integrity "sha1-kkEZEtQ1IU4SxRwq4Qk+VLa7g9k= sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==" + dependencies: + execa "^0.8.0" + is-ci "^1.0.10" + normalize-path "^1.0.0" + strip-indent "^2.0.0" + +zenscroll@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/zenscroll/-/zenscroll-4.0.2.tgz#e8d5774d1c0738a47bcfa8729f3712e2deddeb25" + integrity "sha1-6NV3TRwHOKR7z6hynzcS4t7d6yU= sha512-jEA1znR7b4C/NnaycInCU6h/d15ZzCd1jmsruqOKnZP6WXQSMH3W2GL+OXbkruslU4h+Tzuos0HdswzRUk/Vgg==" diff --git a/version.go b/version.go new file mode 100644 index 0000000..3c7fec3 --- /dev/null +++ b/version.go @@ -0,0 +1,13 @@ +package catalyst + +import ( + _ "embed" + "strings" +) + +//go:embed VERSION +var VERSION string + +func GetVersion() string { + return strings.TrimSpace(VERSION) +} diff --git a/websocket.go b/websocket.go new file mode 100644 index 0000000..afd421a --- /dev/null +++ b/websocket.go @@ -0,0 +1,84 @@ +package catalyst + +import ( + "encoding/json" + "log" + "net/http" + "sync" + + "github.com/arangodb/go-driver" + "github.com/gin-gonic/gin" + "github.com/gobwas/ws" + "github.com/gobwas/ws/wsutil" + "github.com/google/uuid" + + "github.com/SecurityBrewery/catalyst/bus" +) + +type websocketBroker struct { + clients map[string]chan []byte + mu sync.Mutex +} + +func (wb *websocketBroker) Publish(b []byte) { + for _, channel := range wb.clients { + channel <- b + } +} + +func (wb *websocketBroker) CloseSocket(id string) { + wb.mu.Lock() + if channel, ok := wb.clients[id]; ok { + close(channel) + delete(wb.clients, id) + } + wb.mu.Unlock() +} + +func (wb *websocketBroker) NewWebsocket() (string, chan []byte) { + id := uuid.New().String() + channel := make(chan []byte, 10) + wb.mu.Lock() + wb.clients[id] = channel + wb.mu.Unlock() + return id, channel +} + +func handleWebSocket(catalystBus *bus.Bus) func(ctx *gin.Context) { + broker := websocketBroker{clients: map[string]chan []byte{}} + + // send all messages from bus to websocket + err := catalystBus.SubscribeUpdate(func(ids []driver.DocumentID) { + b, err := json.Marshal(map[string]interface{}{ + "action": "update", + "ids": ids, + }) + if err != nil { + return + } + + broker.Publish(b) + }) + if err != nil { + log.Println(err) + } + + return func(ctx *gin.Context) { + conn, _, _, err := ws.UpgradeHTTP(ctx.Request, ctx.Writer) + if err != nil { + ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "upgrade failed"}) + return + } + + go func() { + defer conn.Close() + + id, messages := broker.NewWebsocket() + for msg := range messages { + if err := wsutil.WriteServerMessage(conn, ws.OpText, msg); err != nil { + broker.CloseSocket(id) + } + } + }() + } +}

    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
    vmcun>A%v$a4 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

  • +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 V0(L*J@d4oLf{vkfv8Gkf{{ipO4nhC` literal 0 HcmV?d00001 diff --git a/docs/screenshots/playbooks_focus.png b/docs/screenshots/playbooks_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..f776f2481fdfa5d1780bf19ae2eda733c48a5e5d GIT binary patch literal 46562 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 Oe3_eEG$t52#{UoTF6oc} literal 0 HcmV?d00001 diff --git a/docs/screenshots/roles.png b/docs/screenshots/roles.png new file mode 100644 index 0000000000000000000000000000000000000000..e7479458d5dea6f2566cb81f5c081aa9224a0eaf GIT binary patch literal 28104 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