diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9039536ed..cb7ca85b0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,7 +27,7 @@ jobs: - name: Install nodejs uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 20 - run: npm install @@ -88,17 +88,26 @@ jobs: - name: Run BioCollect functional tests run: ./src/main/scripts/runFunctionalTests.sh chromeHeadless /tmp/ecodata dev + continue-on-error: true env: GITHUB_ACTOR: ${{env.GITHUB_ACTOR}} GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} + - name: Archive log directory + uses: actions/upload-artifact@v4 + if: ${{ failure() }} + with: + path: ./logs + - name: Clean to remove clover instrumentation uses: gradle/gradle-build-action@v2.4.2 + if: ${{ success() }} with: arguments: clean - name: Publish the JAR to the repository uses: gradle/gradle-build-action@v2.4.2 + if: ${{ success() }} with: arguments: publish env: diff --git a/build.gradle b/build.gradle index fcd17cfbb..2a3133160 100644 --- a/build.gradle +++ b/build.gradle @@ -18,6 +18,10 @@ buildscript { } } +plugins { + id "com.gorylenko.gradle-git-properties" version "2.4.1" +} + version "$biocollectVersion" group "au.org.ala" @@ -111,6 +115,8 @@ dependencies { implementation('org.grails.plugins:http-builder-helper:1.1.0') { exclude group: 'org.apache.httpcomponents', module: 'httpclient' } + + implementation 'com.opencsv:opencsv:5.7.0' implementation "org.apache.httpcomponents:httpclient:4.5.7" runtimeOnly 'org.webjars:jquery:1.12.4' implementation 'dk.glasius:external-config:3.0.0' @@ -151,10 +157,13 @@ dependencies { runtimeOnly 'com.bertramlabs.plugins:less-asset-pipeline:3.3.1' implementation 'com.bertramlabs.plugins:sass-asset-pipeline:3.2.5' implementation 'org.codehaus.groovy:groovy-dateutil:2.5.0' - + implementation "com.nimbusds:nimbus-jose-jwt:9.25.6" + implementation "io.jsonwebtoken:jjwt-impl:0.11.5" + implementation "io.jsonwebtoken:jjwt-jackson:0.11.5" + implementation "io.jsonwebtoken:jjwt-api:0.11.5" if (!Boolean.valueOf(inplace)) { implementation "org.grails.plugins:ala-map-plugin:3.0.1" - implementation "org.grails.plugins:ecodata-client-plugin:7.0" + implementation "org.grails.plugins:ecodata-client-plugin:7.1" } testCompileOnly "org.grails:grails-test-mixins:3.3.0" @@ -200,7 +209,8 @@ assets { maxThreads = 6 minifyOptions = [ languageMode : 'ES6', //languageIn - targetLanguage: 'ES5', // languageOut +// targetLanguage: 'ES5', // languageOut + excludes: ['sw.js', '**/*.min.js'] ] includes = [] @@ -261,6 +271,7 @@ tasks.withType(Test) { wiremock { dir "${project.projectDir}/src/integration-test/resources/wiremock/" params "--port=8018 --global-response-templating --local-response-templating" +// params "--port=8018 --global-response-templating --local-response-templating --verbose --print-all-network-traffic --record-mappings" } assets { diff --git a/forms/hub/agnesTurtleMonitoring/Agnes Turtle Incubation and Emergence Survey v1.json b/forms/hub/agnesTurtleMonitoring/Agnes Turtle Incubation and Emergence Survey v1.json new file mode 100644 index 000000000..a743819d7 --- /dev/null +++ b/forms/hub/agnesTurtleMonitoring/Agnes Turtle Incubation and Emergence Survey v1.json @@ -0,0 +1,515 @@ +{ + "id": "64b8d3bec9b6421068da768e", + "dateCreated": "2023-07-20T06:27:10Z", + "minOptionalSectionsCompleted": 1, + "supportsSites": false, + "tags": [], + "lastUpdated": "2024-11-13T01:45:46Z", + "createdUserId": "35", + "external": false, + "activationDate": null, + "supportsPhotoPoints": false, + "publicationStatus": "published", + "externalIds": null, + "gmsId": null, + "name": "Agnes Turtle Incubation and Emergence Survey", + "sections": [ + { + "collapsedByDefault": false, + "template": { + "modelName": "Agnes Turtle Incubation and Emergence Survey", + "record": true, + "dataModel": [ + { + "dataType": "date", + "name": "eventDate", + "dwcAttribute": "eventDate", + "description": "The date that the survey was undertaken", + "validate": "required,past[now]" + }, + { + "dataType": "time", + "name": "surveyTime", + "dwcAttribute": "eventTime", + "description": "The time of the day that the survey was undertaken" + }, + { + "dataType": "text", + "name": "recordedBy", + "dwcAttribute": "recordedBy", + "description": "The name of the person or group undertaking the survey", + "validate": "required" + }, + { + "dataType": "text", + "name": "beachName", + "validate": "required", + "constraints": [ + "Chinamens", + "Fences beach", + "Main beach", + "North of Surf Club", + "Workmans beach" + ] + }, + { + "name": "nestNumber", + "dataType": "text", + "validate": "required" + }, + { + "name": "tagNumber", + "dataType": "text" + }, + { + "dataType": "species", + "name": "species", + "dwcAttribute": "scientificName", + "description": "The name of the turtle species observed.", + "validate": "required" + }, + { + "dataType": "image", + "name": "observationPhoto", + "description": "Attach nest dig egg count image plus data sheet if used" + }, + { + "dataType": "date", + "name": "nestEstablishedDate", + "description": "The date that eggs were laid", + "validate": "past[now]" + }, + { + "dataType": "date", + "name": "juvenilesEmergedDate", + "description": "The date that juveniles began to emerge from the nest", + "validate": "past[now]" + }, + { + "dataType": "date", + "name": "excavationDate", + "description": "The date that the nest was excavated", + "validate": "past[now]" + }, + { + "dataType": "number", + "name": "nestDepthInCentimetres", + "description": "The depth in centimetres to the bottom of the nest from the general level of the immediate surrounding land", + "decimalPlaces": 1 + }, + { + "defaultAccuracy": 50, + "hideMyLocation": false, + "columns": [ + { + "dwcAttribute": "verbatimLatitude", + "source": "locationLatitude" + }, + { + "dwcAttribute": "verbatimLongitude", + "source": "locationLongitude" + }, + { + "source": "Locality" + }, + { + "source": "Accuracy" + }, + { + "source": "Notes" + }, + { + "source": "Source" + } + ], + "dataType": "geoMap", + "name": "location", + "dwcAttribute": "verbatimCoordinates", + "hideSiteSelection": true, + "zoomToProjectArea": true, + "validate": "required" + }, + { + "dataType": "text", + "name": "habitatBeach", + "constraints": [ + "HW - Below Highwater", + "B - Below Slope", + "S - Slope", + "D - Dune" + ] + }, + { + "dataType": "text", + "name": "habitatVegetation", + "constraints": [ + "S - Bare Sand", + "G - Grass Area", + "Sh - Under Shrub", + "T - Under Tree", + "R - In Rubble Zone" + ] + }, + { + "dataType": "number", + "name": "emptyShellCount", + "validate": "integer,min[0]" + }, + { + "dataType": "number", + "name": "liveHatchlingCount", + "validate": "integer,min[0]" + }, + { + "dataType": "number", + "name": "deadHatchlingCount", + "validate": "integer,min[0]" + }, + { + "dataType": "number", + "name": "unhatchedDevelopmentTotalCount", + "computed": { + "expression": "unhatchedDevelopmentStage2Count+unhatchedDevelopmentStage3Count+unhatchedDevelopmentStage4Count+unhatchedDevelopmentStage5Count+unhatchedDevelopmentStage6Count" + }, + "readOnly": true, + "noEdit": true, + "decimalPlaces": 0 + }, + { + "dataType": "number", + "name": "undevelopedEggsCount", + "validate": "integer,min[0]" + }, + { + "dataType": "number", + "name": "predatedEggsCount", + "validate": "integer,min[0]" + }, + { + "dataType": "number", + "name": "yokelessOrMultiyokeEggsCount", + "validate": "integer,min[0]" + }, + { + "dataType": "number", + "name": "unhatchedDevelopmentStage2Count", + "validate": "integer,min[0]" + }, + { + "dataType": "number", + "name": "unhatchedDevelopmentStage3Count", + "validate": "integer,min[0]" + }, + { + "dataType": "number", + "name": "unhatchedDevelopmentStage4Count", + "validate": "integer,min[0]" + }, + { + "dataType": "number", + "name": "unhatchedDevelopmentStage5Count", + "validate": "integer,min[0]" + }, + { + "dataType": "number", + "name": "unhatchedDevelopmentStage6Count", + "validate": "integer,min[0]" + }, + { + "dataType": "number", + "name": "unhatchedDevelopmentTotalCount", + "computed": { + "expression": "unhatchedDevelopmentStage2Count+unhatchedDevelopmentStage3Count+unhatchedDevelopmentStage4Count+unhatchedDevelopmentStage5Count+unhatchedDevelopmentStage6Count" + }, + "readOnly": true, + "noEdit": true, + "decimalPlaces": 0 + }, + { + "dataType": "text", + "name": "countedBy", + "validate": "required" + }, + { + "dataType": "text", + "name": "eventRemarks", + "description": "", + "dwcAttribute": "eventRemarks", + "jsMain": "https://biocollect.ala.org.au/download/getScriptFile?hub=ala&filename=clearImageDateTimeHandler.js&model=agnesWaterTurtleNestMonitoring" + } + ], + "viewModel": [ + { + "type": "row", + "items": [ + { + "source": "Turtle Incubation and Emergence Survey", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "boxed": true, + "type": "section", + "title": "Event information", + "items": [ + { + "preLabel": "Date", + "source": "eventDate", + "type": "date" + }, + { + "preLabel": "Time", + "source": "surveyTime", + "type": "time" + }, + { + "preLabel": "Recorder", + "source": "recordedBy", + "type": "text" + }, + { + "type": "image", + "source": "observationPhoto", + "css": "img-responsive", + "showMetadata": "false", + "preLabel": "Attach photos" + } + ] + }, + { + "boxed": true, + "type": "section", + "title": "Nest Information", + "items": [ + { + "preLabel": "Beach", + "source": "beachName", + "type": "selectOne" + }, + { + "preLabel": "Nest marker number", + "source": "nestNumber", + "type": "text" + }, + { + "preLabel": "Tag number", + "source": "tagNumber", + "type": "text" + }, + { + "preLabel": "Species", + "source": "species", + "type": "speciesSelect" + } + ] + }, + { + "boxed": true, + "type": "section", + "title": "Key Dates", + "items": [ + { + "preLabel": "Date eggs laid", + "source": "nestEstablishedDate", + "type": "date" + }, + { + "preLabel": "Date of emergence", + "source": "juvenilesEmergedDate", + "type": "date" + }, + { + "preLabel": "Date nest dug/excavated", + "source": "excavationDate", + "type": "date" + } + ] + } + ] + }, + { + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "boxed": true, + "type": "section", + "title": "Nest Location", + "items": [ + { + "includeNotes": false, + "orientation": "vertical", + "autoLocalitySearch": false, + "readonly": false, + "includeSource": false, + "includeAccuracy": false, + "source": "location", + "type": "geoMap", + "includeLocality": false + } + ] + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "preLabel": "Habitat - Across Beach", + "source": "habitatBeach", + "type": "selectOne" + }, + { + "preLabel": "Habitat - Vegetation", + "source": "habitatVegetation", + "type": "selectOne" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "boxed": true, + "type": "section", + "title": "Shell and Egg Counts", + "items": [ + { + "preLabel": "Empty shells (#)", + "source": "emptyShellCount", + "type": "number" + }, + { + "preLabel": "Live hatchlings (#)", + "source": "liveHatchlingCount", + "type": "number" + }, + { + "preLabel": "Dead hatchlings (#)", + "source": "deadHatchlingCount", + "type": "number" + }, + { + "preLabel": "Unhatched eggs (# of UH2 - UH6)", + "source": "unhatchedDevelopmentTotalCount", + "type": "number", + "noEdit": true, + "readOnly": true + }, + { + "preLabel": "Undeveloped eggs (#)", + "source": "undevelopedEggsCount", + "type": "number" + }, + { + "preLabel": "Predated eggs (#)", + "source": "predatedEggsCount", + "type": "number" + }, + { + "preLabel": "Yokeless/multi-yoke eggs (#)", + "source": "yokelessOrMultiyokeEggsCount", + "type": "number" + } + ] + } + ] + }, + { + "type": "col", + "items": [ + { + "boxed": true, + "type": "section", + "title": "Unhatched Stage of Development", + "items": [ + { + "preLabel": "UH2 – some sign of development (#)", + "source": "unhatchedDevelopmentStage2Count", + "type": "number" + }, + { + "preLabel": "UH3 – unpigmented carapace (#)", + "source": "unhatchedDevelopmentStage3Count", + "type": "number" + }, + { + "preLabel": "UH4 – yolk greater than 50% (#)", + "source": "unhatchedDevelopmentStage4Count", + "type": "number" + }, + { + "preLabel": "UH5 – yolk less than 50% (#)", + "source": "unhatchedDevelopmentStage5Count", + "type": "number" + }, + { + "preLabel": "UH6- pipped (#)", + "source": "unhatchedDevelopmentStage6Count", + "type": "number" + }, + { + "preLabel": "UH2 - UH6 Total (#)", + "source": "unhatchedDevelopmentTotalCount", + "type": "number", + "readOnly": true, + "noEdit": true + }, + { + "preLabel": "Counted by", + "source": "countedBy", + "type": "text" + }, + { + "preLabel": "Notes", + "source": "eventRemarks", + "type": "textarea", + "rows": 4 + } + ] + } + ] + } + ] + } + ], + "title": "Turtle Incubation and Emergence Survey" + }, + "modelName": null, + "templateName": "Agnes Turtle Incubation and Emergence Survey", + "optional": false, + "optionalQuestionText": null, + "title": null, + "collapsibleHeading": null, + "name": "Agnes Turtle Incubation and Emergence Survey", + "description": "Generic template for monitoring marine turtle nests" + } + ], + "type": "Assessment", + "category": "Assessment & monitoring", + "status": "active", + "lastUpdatedUserId": "35", + "description": "Generic template for monitoring marine turtle nests", + "formVersion": 1 +} \ No newline at end of file diff --git a/forms/hub/agnesTurtleMonitoring/Marine Turtle Template v2 v2.json b/forms/hub/agnesTurtleMonitoring/Marine Turtle Template v2 v2.json new file mode 100644 index 000000000..bab59f4ff --- /dev/null +++ b/forms/hub/agnesTurtleMonitoring/Marine Turtle Template v2 v2.json @@ -0,0 +1,414 @@ +{ + "id": "6528cd19cd13e43eb3f713d6", + "dateCreated": "2023-10-13T04:52:41Z", + "minOptionalSectionsCompleted": 1, + "supportsSites": false, + "tags": [], + "lastUpdated": "2024-12-02T03:16:04Z", + "createdUserId": "4228", + "external": false, + "activationDate": null, + "supportsPhotoPoints": false, + "publicationStatus": "published", + "externalIds": null, + "gmsId": null, + "name": "Marine Turtle Template v2", + "sections": [ + { + "collapsedByDefault": false, + "template": { + "modelName": "Marine Turtle Template v2", + "record": true, + "dataModel": [ + { + "dataType": "date", + "name": "eventDate", + "dwcAttribute": "eventDate", + "description": "The date that the survey was undertaken", + "validate": "required,past[now]" + }, + { + "dataType": "text", + "name": "surveyTime", + "dwcAttribute": "eventTime", + "description": "The time of the day that the survey was undertaken" + }, + { + "dataType": "text", + "name": "recordedBy", + "dwcAttribute": "recordedBy", + "description": "The name of the person or group undertaking the sampling event", + "validate": "required" + }, + { + "dataType": "species", + "name": "species", + "dwcAttribute": "scientificName", + "description": "The name of the turtle species observed.", + "validate": "required" + }, + { + "name": "nestNumber", + "dataType": "text", + "description": "Enter the identification number of the nest", + "validate": "required" + }, + { + "dataType": "image", + "name": "observationPhoto", + "description": "Attach 3 track photos, plus emergence/predation, etc. as observed.", + "validate": "required" + }, + { + "defaultAccuracy": 50, + "hideMyLocation": false, + "columns": [ + { + "dwcAttribute": "verbatimLatitude", + "source": "locationLatitude" + }, + { + "dwcAttribute": "verbatimLongitude", + "source": "locationLongitude" + }, + { + "source": "Locality" + }, + { + "source": "Accuracy" + }, + { + "source": "Notes" + }, + { + "source": "Source" + } + ], + "dataType": "geoMap", + "name": "location", + "dwcAttribute": "verbatimCoordinates", + "hideSiteSelection": true, + "zoomToProjectArea": true, + "validate": "required" + }, + { + "dataType": "text", + "name": "beachName", + "validate": "required", + "jsMain": "https://biocollect.ala.org.au/download/getScriptFile?hub=acsa&filename=beachName.js&model=marineTurtleTemplateV2" + }, + { + "dataType": "boolean", + "name": "postEmergentPredationIsTrue" + }, + { + "dataType": "text", + "name": "habitatBeach", + "validate": "required", + "constraints": [ + "HW - Below Highwater", + "B - Below Slope", + "S - Slope", + "D - Dune" + ] + }, + { + "dataType": "text", + "name": "hatchlingRemarks" + }, + { + "dataType": "text", + "name": "habitatVegetation", + "validate": "required", + "constraints": [ + "S - Bare Sand", + "G - Grass Area", + "Sh - Under Shrub", + "T - Under Tree", + "R - In Rubble Zone" + ] + }, + { + "dataType": "text", + "name": "activityCode", + "validate": "required", + "constraints": [ + "X - Laid Eggs", + "< - Laid/Disturbed", + "E - No Laying", + "? - Undetermined", + "T - Turnaround" + ] + }, + { + "name": "dateOfEmergence", + "dataType": "date" + }, + { + "dataType": "boolean", + "name": "lightDisorientationIsTrue", + "description": "Please enter observations – Include hatchling disorientation, predation, human interference" + }, + { + "dataType": "stringList", + "name": "threats", + "constraints": [ + "Vehicle", + "Light", + "Beach fires", + "Rubbish", + "Predator – specify below" + ] + }, + { + "name": "dateOfImpact", + "dataType": "date" + }, + { + "name": "nestDamageImpacts", + "dataType": "text", + "constraints": [ + "Predation", + "Inundation", + "Washed away" + ] + }, + { + "dataType": "text", + "name": "damage", + "constraints": [ + "PD - Predation by dog or dingo", + "PF - Predation by a fox", + "PP - Predation by pig", + "PV - Predation by goanna", + "P - Predation by unidentified species", + "PU - Unsuccessful predation attempt on a clutch", + "PW - clutch loss from Erosion or Flooding", + "Other, specify" + ] + }, + { + "name": "protectionActivity", + "dataType": "stringList", + "constraints": [ + "PEX - Predator exclusion device", + "RZ - Relocation" + ] + }, + { + "name": "incubationRemarks", + "description": "Record predator type, and date of PEX & RZ", + "dataType": "text" + }, + { + "dataType": "text", + "name": "threatRemarks" + }, + { + "dataType": "text", + "name": "occurrenceRemarks", + "dwcAttribute": "occurrenceRemarks" + } + ], + "viewModel": [ + { + "type": "row", + "items": [ + { + "source": "Agnes Water Turtle Nest Monitoring", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "boxed": true, + "type": "section", + "title": "Event information", + "items": [ + { + "preLabel": "Date", + "source": "eventDate", + "type": "simpleDate" + }, + { + "preLabel": "Time", + "source": "surveyTime", + "type": "text" + }, + { + "preLabel": "Recorder", + "source": "recordedBy", + "type": "text" + }, + { + "type": "image", + "source": "observationPhoto", + "preLabel": "Attach 3 track photos, plus emergence/predation, etc. as observed", + "css": "img-responsive", + "showMetadata": "false", + "displayOptions": { + "showRemoveButtonWithImage": true + } + } + ] + }, + { + "type": "row", + "items": [ + { + "boxed": true, + "type": "section", + "title": "Location", + "items": [ + { + "includeNotes": false, + "orientation": "vertical", + "autoLocalitySearch": false, + "readonly": false, + "includeSource": false, + "includeAccuracy": false, + "source": "location", + "type": "geoMap", + "includeLocality": false + }, + { + "preLabel": "Beach Name", + "source": "beachName", + "type": "text" + } + ], + "class": "" + } + ] + } + ] + }, + { + "type": "col", + "items": [ + { + "boxed": true, + "type": "section", + "title": "Turtle & Nest", + "items": [ + { + "preLabel": "Nest number", + "source": "nestNumber", + "type": "text" + }, + { + "preLabel": "Species", + "source": "species", + "type": "speciesSelect" + }, + { + "preLabel": "Habitat - Across Beach", + "source": "habitatBeach", + "type": "selectOne" + }, + { + "preLabel": "Habitat - Vegetation", + "source": "habitatVegetation", + "type": "selectOne" + }, + { + "preLabel": "Activity Comments", + "source": "occurrenceRemarks", + "type": "textarea", + "rows": 4 + }, + { + "preLabel": "Activity Code", + "source": "activityCode", + "type": "selectOne" + } + ] + }, + { + "boxed": true, + "type": "section", + "title": "Incubation", + "items": [ + { + "preLabel": "Date of impact", + "source": "dateOfImpact", + "type": "date" + }, + { + "preLabel": "Impacts", + "source": "nestDamageImpacts", + "type": "selectOne" + }, + { + "preLabel": "Activity", + "source": "protectionActivity", + "type": "selectMany", + "rows": 4 + }, + { + "preLabel": "Notes", + "source": "incubationRemarks", + "type": "textarea", + "rows": 4 + } + ] + }, + { + "boxed": true, + "type": "section", + "title": "Emergence", + "items": [ + { + "preLabel": "Date of emergence", + "source": "dateOfEmergence", + "type": "date" + }, + { + "preLabel": "Light disorientation", + "source": "lightDisorientationIsTrue", + "description": "Tick the box if light disorientation occurred and make comments below", + "type": "boolean" + }, + { + "preLabel": "Notes", + "source": "hatchlingRemarks", + "type": "textarea", + "rows": 4 + }, + { + "preLabel": "Scavenged – post emergence predation", + "source": "postEmergentPredationIsTrue", + "type": "boolean" + } + ] + } + ] + } + ] + } + ], + "title": "Marine Turtle Template v2" + }, + "modelName": null, + "templateName": "Marine Turtle Template v2", + "optional": false, + "optionalQuestionText": null, + "title": null, + "collapsibleHeading": null, + "name": "Marine Turtle Template v2", + "description": null + } + ], + "type": "Assessment", + "category": "Assessment & monitoring", + "status": "active", + "lastUpdatedUserId": "4228", + "description": null, + "formVersion": 2 +} \ No newline at end of file diff --git a/forms/hub/friendsGrassTreeHealth/friendsGrassTreeHealthSurvey.json b/forms/hub/friendsGrassTreeHealth/friendsGrassTreeHealthSurvey.json new file mode 100644 index 000000000..6e431b785 --- /dev/null +++ b/forms/hub/friendsGrassTreeHealth/friendsGrassTreeHealthSurvey.json @@ -0,0 +1,608 @@ +{ + "id": "66bc3659f62dc027ba21e634", + "dateCreated": "2024-08-14T04:45:13Z", + "minOptionalSectionsCompleted": 1, + "supportsSites": false, + "tags": [], + "lastUpdated": "2024-08-19T05:45:50Z", + "createdUserId": "56575", + "external": false, + "activationDate": null, + "supportsPhotoPoints": false, + "publicationStatus": "published", + "externalIds": null, + "gmsId": null, + "name": "Grasstree Health Survey", + "sections": [ + { + "collapsedByDefault": false, + "template": { + "modelName": "Grasstree Health Survey", + "dataModel": [ + { + "dataType": "text", + "name": "siteDescription", + "description": "", + "validate": "required" + }, + { + "dataType": "date", + "name": "surveyDate", + "indexName": "surveyDate", + "description": "", + "validate": "required,max[${now}]" + }, + { + "dataType": "text", + "name": "participants", + "description": "", + "validate": "required" + }, + { + "dataType": "text", + "name": "siteCode", + "description": "", + "validate": "required" + }, + { + "dataType": "text", + "name": "drainage", + "constraints": [ + "No drainage line", + "Minor depression", + "Close to creek / water pool" + ] + }, + { + "dataType": "text", + "name": "disturbance", + "constraints": [ + "Not evident", + "Track", + "Tree fallen", + "Fire" + ] + }, + { + "dataType": "text", + "name": "comments" + }, + { + "allowRowDelete": "false", + "columns": [ + { + "dataType": "species", + "name": "grasstreeSpecies", + "dwcAttribute": "scientificName", + "description": "" + }, + { + "dataType": "number", + "name": "healthy", + "defaultValue": 0, + "validate": "min[0]" + }, + { + "dataType": "number", + "name": "minor", + "defaultValue": 0, + "validate": "min[0]" + }, + { + "dataType": "number", + "name": "major", + "defaultValue": 0, + "validate": "min[0]" + }, + { + "dataType": "number", + "name": "dead", + "defaultValue": 0, + "validate": "min[0]" + }, + { + "dataType": "number", + "name": "collapsed", + "defaultValue": 0, + "validate": "min[0]" + } + ], + "dataType": "list", + "name": "grassTreeHealthDetails" + }, + { + "dataType": "boolean", + "name": "gpsDeviceUsed" + }, + { + "defaultAccuracy": 50, + "hideMyLocation": false, + "columns": [ + { + "dwcAttribute": "verbatimLatitude", + "source": "locationLatitude" + }, + { + "dwcAttribute": "verbatimLongitude", + "source": "locationLongitude" + }, + { + "source": "Locality" + }, + { + "source": "Accuracy" + }, + { + "source": "Notes" + }, + { + "source": "Source" + } + ], + "dataType": "geoMap", + "name": "location", + "dwcAttribute": "verbatimCoordinates", + "hideSiteSelection": false, + "zoomToProjectArea": true, + "validate": "required" + }, + { + "allowRowDelete": "false", + "columns": [ + { + "dataType": "species", + "name": "blueLilySpecies", + "dwcAttribute": "scientificName", + "description": "" + }, + { + "dataType": "text", + "name": "estimatedLilyCount", + "constraints": [ + "0", + "1-10", + "11-50", + "51-100", + "101-200", + "> 201" + ] + }, + { + "dataType": "text", + "name": "lilyHealthyPercentage", + "constraints": [ + "0%", + "1-10%", + "11-25%", + "26-50%", + "51-75%", + "76-100%" + ] + } + ], + "dataType": "list", + "name": "lilyDetails" + }, + { + "allowRowDelete": "false", + "columns": [ + { + "dataType": "species", + "name": "daphneHeathSpecies", + "dwcAttribute": "scientificName", + "description": "" + }, + { + "dataType": "text", + "name": "estimatedDaphneHeathCount", + "constraints": [ + "0", + "1-10", + "11-50", + "51-100", + "101-200", + "> 201" + ] + }, + { + "dataType": "text", + "name": "daphneHeathHealthyPercentage", + "constraints": [ + "0%", + "1-10%", + "11-25%", + "26-50%", + "51-75%", + "76-100%" + ] + } + ], + "dataType": "list", + "name": "daphneHeathDetails" + }, + { + "allowRowDelete": "false", + "columns": [ + { + "dataType": "species", + "name": "eucalyptSpecies", + "dwcAttribute": "scientificName", + "description": "" + }, + { + "dataType": "text", + "name": "dieback", + "constraints": [ + "Not evident", + "Isolated", + "Moderate", + "Severe" + ] + } + ], + "dataType": "list", + "name": "eucalyptDetails" + } + ], + "viewModel": [ + { + "type": "row", + "items": [ + { + "source": "

Friends Grasstree Health Data Sheet

", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "computed": null, + "type": "col", + "items": [ + { + "boxed": true, + "title": "Survey Details", + "type": "section", + "items": [ + { + "computed": null, + "type": "row", + "items": [ + { + "computed": null, + "type": "col", + "items": [ + { + "preLabel": "Survey Date:", + "source": "surveyDate", + "type": "date" + }, + { + "preLabel": "Site description (track details):", + "source": "siteDescription", + "type": "textarea", + "rows": 4 + }, + { + "preLabel": "Participants:", + "source": "participants", + "type": "textarea", + "rows": 4 + }, + { + "preLabel": "Site code (date-track e.g. 010924-Sunrise):", + "source": "siteCode", + "type": "text" + }, + { + "source": "drainage", + "preLabel": "Drainage", + "type": "selectOne" + }, + { + "source": "disturbance", + "preLabel": "Disturbance", + "type": "selectOne" + }, + { + "source": "comments", + "preLabel": "Comments", + "type": "textarea", + "rows": 4 + } + ] + } + ] + } + ], + "class": "" + } + ] + }, + { + "computed": null, + "type": "col", + "items": [ + { + "boxed": true, + "title": "Location", + "type": "section", + "items": [ + { + "computed": null, + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "computed": null, + "type": "row", + "items": [ + { + "source": "Select existing location from the drop-down list. If your location is not on the list, you can create one and add it to the list for future use, but please avoid creating duplicate location.

TO CREATE A NEW LOCATION:
Zoom into the map, click on the pin marker tool (left), then find on the map the location of your survey and click on it. This should put a pin on the map. Please give the new location a unique descriptive name and save, e.g. Portsea Pier, Steeles Rocks, Frankston Pier, Brighton Baths
", + "type": "literal" + } + ] + }, + { + "computed": null, + "type": "row", + "items": [ + { + "includeNotes": false, + "orientation": "vertical", + "computed": null, + "autoLocalitySearch": false, + "readonly": false, + "includeSource": false, + "includeAccuracy": false, + "hideSiteSelection": false, + "source": "location", + "type": "geoMap", + "includeLocality": false + } + ] + }, + { + "preLabel": "I used a GPS device to obtain coordinates", + "source": "gpsDeviceUsed", + "type": "boolean" + } + ] + } + ] + } + ], + "class": "" + } + ] + } + ] + }, + { + "type": "row", + "items": [ + { + "computed": null, + "type": "col", + "items": [ + { + "boxed": true, + "title": "Grasstree Health Count", + "type": "section", + "items": [ + { + "computed": null, + "type": "row", + "items": [ + { + "disableTableUpload": true, + "columns": [ + { + "width": "10%", + "min-width": "100px", + "source": "grasstreeSpecies", + "title": "Grasstree Species", + "type": "speciesSelect" + }, + { + "width": "10%", + "source": "healthy", + "title": "Healthy", + "type": "number" + }, + { + "width": "10%", + "source": "minor", + "title": "Minor", + "type": "number" + }, + { + "width": "10%", + "source": "major", + "title": "Major", + "type": "number" + }, + { + "width": "10%", + "source": "dead", + "title": "Dead", + "type": "number" + }, + { + "width": "10%", + "source": "collapsed", + "title": "Collapsed", + "type": "number" + } + ], + "source": "grassTreeHealthDetails", + "type": "table" + } + ] + } + ], + "class": "" + } + ] + } + ] + }, + { + "computed": null, + "type": "col", + "items": [ + { + "boxed": true, + "title": "Nodding Blue Lily", + "type": "section", + "items": [ + { + "computed": null, + "type": "row", + "items": [ + { + "disableTableUpload": true, + "columns": [ + { + "width": "10%", + "min-width": "100px", + "source": "blueLilySpecies", + "title": "Nodding Blue Lily Species", + "type": "speciesSelect" + }, + { + "width": "10%", + "source": "estimatedLilyCount", + "title": "Estimated number of plants", + "type": "selectOne" + }, + { + "width": "10%", + "source": "lilyHealthyPercentage", + "title": "% Healthy", + "type": "selectOne" + } + + ], + "source": "lilyDetails", + "type": "table" + } + ] + } + ], + "class": "" + } + ] + }, + { + "computed": null, + "type": "col", + "items": [ + { + "boxed": true, + "title": "Daphne Heath", + "type": "section", + "items": [ + { + "computed": null, + "type": "row", + "items": [ + { + "disableTableUpload": true, + "columns": [ + { + "width": "10%", + "min-width": "100px", + "source": "daphneHeathSpecies", + "title": "Daphne Heath Species", + "type": "speciesSelect" + }, + { + "width": "10%", + "source": "estimatedDaphneHeathCount", + "title": "Estimated number of plants", + "type": "selectOne" + }, + { + "width": "10%", + "source": "daphneHeathHealthyPercentage", + "title": "% Healthy", + "type": "selectOne" + } + + ], + "source": "daphneHeathDetails", + "type": "table" + } + ] + } + ], + "class": "" + } + ] + }, + { + "computed": null, + "type": "col", + "items": [ + { + "boxed": true, + "title": "Eucalypt", + "type": "section", + "items": [ + { + "computed": null, + "type": "row", + "items": [ + { + "disableTableUpload": true, + "columns": [ + { + "width": "10%", + "min-width": "100px", + "source": "eucalyptSpecies", + "title": "Eucalypt Species", + "type": "speciesSelect" + }, + { + "width": "10%", + "source": "dieback", + "title": "Dieback", + "type": "selectOne" + } + ], + "source": "eucalyptDetails", + "type": "table" + } + ] + } + ], + "class": "" + } + ] + } + ], + "title": "Grasstree Health Survey" + }, + "modelName": null, + "record": "true", + "templateName": "grasstree_Health_Survey", + "optional": false, + "optionalQuestionText": null, + "title": null, + "collapsibleHeading": null, + "name": "Grasstree Health Survey", + "description": null + } + ], + "type": "Assessment", + "category": "Assessment & monitoring", + "status": "active", + "lastUpdatedUserId": "56575", + "description": null, + "formVersion": 1 +} \ No newline at end of file diff --git a/forms/hub/marineMetreSquared/Marine Metre Squared - Rocky Shore Survey v1.json b/forms/hub/marineMetreSquared/Marine Metre Squared - Rocky Shore Survey v1.json new file mode 100644 index 000000000..2fa83656e --- /dev/null +++ b/forms/hub/marineMetreSquared/Marine Metre Squared - Rocky Shore Survey v1.json @@ -0,0 +1,757 @@ +{ + "id": "63cbd5ba00f69e66bb6dcdae", + "dateCreated": "2023-01-21T12:08:26Z", + "minOptionalSectionsCompleted": 1, + "supportsSites": false, + "tags": [], + "lastUpdated": "2024-11-13T22:54:12Z", + "createdUserId": "35", + "external": false, + "activationDate": null, + "supportsPhotoPoints": false, + "publicationStatus": "published", + "externalIds": null, + "gmsId": null, + "name": "Marine Metre Squared - Rocky Shore Survey", + "sections": [ + { + "collapsedByDefault": false, + "template": { + "dataModel": [ + { + "defaultValue": "${now}", + "dataType": "date", + "name": "eventDate", + "indexName": "eventDate", + "dwcAttribute": "eventDate", + "description": "The date of the Survey.", + "validate": "required" + }, + { + "dataType": "time", + "name": "eventStartTime", + "dwcAttribute": "eventTime", + "description": "The time that the survey started.", + "validate": "required" + }, + { + "indexName": "recordedBy", + "dataType": "text", + "name": "recordedBy", + "dwcAttribute": "recordedBy", + "description": "The name of the person leading the survey", + "validate": "required" + }, + { + "dataType": "text", + "name": "otherSurveyors", + "description": "Names of other people involved in the survey" + }, + { + "dataType": "number", + "name": "groupSize", + "description": "The number of people in the survey group", + "validate": "integer,min[0]" + }, + { + "indexName": "groupName", + "dataType": "text", + "name": "groupName", + "description": "The name of the group or school" + }, + { + "dataType": "text", + "name": "surveyorExperience", + "dwcAttribute": "measurementValue", + "measurementUnit": "unitless", + "measurementUnitID": "surveyorExperience", + "measurementType": "text", + "description": "", + "constraints": [ + "Primary school level", + "Secondary School level", + "Tertiary level ", + "Scientifically accurate" + ] + }, + { + "dataType": "text", + "name": "eventRemarks", + "dwcAttribute": "eventRemarks", + "description": "" + }, + { + "indexName": "shoreLevel", + "dataType": "text", + "name": "shoreLevel", + "dwcAttribute": "measurementValue", + "measurementUnit": "unitless", + "measurementUnitID": "shoreLevel", + "measurementType": "text", + "description": "", + "constraints": [ + "Low", + "Mid", + "High" + ] + }, + { + "dataType": "text", + "name": "siteExposure", + "description": "", + "constraints": [ + "Very exposed", + "Exposed", + "Sheltered" + ] + }, + { + "defaultRows": [ + { + "substrateType": "Reef (stable rock cover)", + "substratePercentCover": "" + }, + { + "substrateType": "Boulder (head size)", + "substratePercentCover": "" + }, + { + "substrateType": "Cobble (fist size)", + "substratePercentCover": "" + }, + { + "substrateType": "Gravel (marble size)", + "substratePercentCover": "" + }, + { + "substrateType": "Sand (like the beach)", + "substratePercentCover": "" + }, + { + "substrateType": "Sediment (fine grain size)", + "substratePercentCover": "" + }, + { + "substrateType": "Mud (gloopy)", + "substratePercentCover": "" + } + ], + "columns": [ + { + "dataType": "text", + "name": "substrateType", + "dwcAttribute": "measurementValue", + "measurementUnit": "unitless", + "measurementUnitID": "substrateType", + "measurementType": "${dominantSpeciesPreIntervention.substrateType} - Substrate", + "noEdit": true + }, + { + "dataType": "number", + "name": "substratePercentCover", + "validate": "integer,min[0],max[100]" + } + ], + "dataType": "list", + "userAddedRows": false, + "allowRowDelete": false, + "name": "substrateTable" + }, + { + "dataType": "number", + "name": "substrateTotalPercentCover", + "noEdit": true, + "readOnly": true, + "decimalPlaces": 0, + "computed": { + "expression": "sum(substrateTable, \"substratePercentCover\")" + }, + "validate": "min[100],max[100]" + }, + { + "dataType": "text", + "name": "siteKeyFeatures", + "description": "(e.g. rocky headland with surf beach 3 km to south; freshwater creek 50 m to the north; upper shore modified with harbour wall etc.)" + }, + { + "dataType": "text", + "name": "evidenceOfHumanInfluences", + "description": "(e.g. rubbish, people collecting seafood, tyre tracks on sand, dogs present,people in the water)." + }, + { + "indexName": "locationName", + "dataType": "text", + "name": "locationName", + "dwcAttribute": "verbatimLocality", + "description": "Use town and name of shore or bay. Eg. Portobello – Latham Bay, Auckland – Campbells Bay. Please be consistent.", + "validate": "required" + }, + { + "indexName": "region", + "dataType": "text", + "name": "region", + "dwcAttribute": "locality", + "description": "", + "constraints": [ + "Northland (Te Tai Tokerau)", + "Auckland (Tāmaki-makau-rau)", + "Waikato", + "Bay of Plenty (Te Moana-a-Toi)", + "Gisborne (Te Tairāwhiti)", + "Hawke's Bay (Te Matau-a-Māui)", + "Taranaki", + "Manawatū-Whanganui", + "Wellington (Te Whanga-nui-a-Tara)", + "Tasman (Te Tai-o-Aorere)", + "Nelson (Whakatū)", + "Marlborough (Te Tauihu-o-te-waka)", + "West Coast (Te Tai Poutini)", + "Canterbury (Waitaha)", + "Otago (Ōtākou)", + "Southland (Murihiku)" + ] + }, + { + "dataType": "image", + "name": "locationPhoto", + "description": "Take a photo of your m2 area and put the top of this sheet in the corner for identification later!" + }, + { + "defaultAccuracy": 50, + "hideMyLocation": false, + "columns": [ + { + "dwcAttribute": "verbatimLatitude", + "source": "locationLatitude" + }, + { + "dwcAttribute": "verbatimLongitude", + "source": "locationLongitude" + }, + { + "source": "Locality" + }, + { + "source": "Accuracy" + }, + { + "source": "Notes" + }, + { + "source": "Source" + } + ], + "dataType": "geoMap", + "name": "location", + "dwcAttribute": "verbatimCoordinates", + "hideSiteSelection": true, + "zoomToProjectArea": true, + "validate": "required" + }, + { + "dataType": "text", + "name": "photogrammetrySurveyUndertaken", + "description": "", + "constraints": [ + "Yes", + "No" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "photogrammetrySurveyUrl", + "description": "If you did a photogrammetry survey in conjunction with this survey, please insert the URL link to it here." + }, + { + "columns": [ + { + "dataType": "species", + "name": "seaweedSpecies", + "dwcAttribute": "scientificName", + "description": "" + }, + { + "dataType": "number", + "name": "percentCover", + "description": "", + "validate": "integer,min[0],max[100]" + }, + { + "dataType": "image", + "name": "seaweedPhoto", + "description": "", + "dwcAttribute": "associatedMedia" + } + ], + "dataType": "list", + "name": "plantsTable" + }, + { + "columns": [ + { + "dataType": "species", + "name": "animalSpecies", + "dwcAttribute": "scientificName", + "description": "" + }, + { + "dataType": "number", + "name": "individualCount", + "dwcAttribute": "individualCount", + "description": "", + "validate": "integer,min[0]" + }, + { + "dataType": "image", + "name": "animalPhoto", + "description": "", + "dwcAttribute": "associatedMedia" + } + ], + "dataType": "list", + "name": "animalsTable" + } + ], + "modelName": "Marine Metre Squared - Rocky Shore Survey", + "title": "Marine Metre Squared - Rocky Shore Survey", + "record": "true", + "viewModel": [ + { + "type": "row", + "items": [ + { + "source": "

Rocky Shore Marine Metre2 Survey

", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "boxed": true, + "title": "Survey Details", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "preLabel": "Survey date", + "source": "eventDate", + "type": "date" + }, + { + "preLabel": "Survey time", + "source": "eventStartTime", + "type": "time" + }, + { + "preLabel": "Survey leader name", + "source": "recordedBy", + "type": "text" + }, + { + "preLabel": "Other surveyors", + "source": "otherSurveyors", + "type": "text" + }, + { + "preLabel": "School/Group name", + "source": "groupName", + "type": "text" + }, + { + "preLabel": "Surveyor experience", + "source": "surveyorExperience", + "type": "selectOne" + }, + { + "preLabel": "Group size", + "source": "groupSize", + "type": "number" + }, + { + "preLabel": "Survey notes", + "source": "eventRemarks", + "type": "textarea" + } + ] + } + ] + } + ], + "class": "" + }, + { + "boxed": true, + "title": "Site Details", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "preLabel": "Shore level", + "source": "shoreLevel", + "type": "selectOne" + }, + { + "preLabel": "Site exposure", + "source": "siteExposure", + "type": "selectOne" + }, + { + "type": "row", + "items": [ + { + "footer": { + "rows": [ + { + "columns": [ + { + "colspan": 1, + "source": "Substrate total % cover (must equal 100%)", + "type": "literal" + }, + { + "source": "substrateTotalPercentCover", + "colspan": 1, + "type": "number" + } + ] + } + ] + }, + "source": "substrateTable", + "allowHeaderWrap": true, + "userAddedRows": false, + "allowRowDelete": false, + "disableTableUpload": true, + "type": "table", + "columns": [ + { + "source": "substrateType", + "title": "Substrate", + "type": "text", + "width": "70%", + "noEdit": true + }, + { + "source": "substratePercentCover", + "title": "Percentage cover (%)", + "type": "number", + "width": "30%" + } + ] + } + ] + }, + { + "preLabel": "Key features of this site", + "source": "siteKeyFeatures", + "type": "textarea" + }, + { + "preLabel": "Evidence of human influences", + "source": "evidenceOfHumanInfluences", + "type": "textarea" + } + ] + } + ] + } + ], + "class": "" + } + ] + }, + { + "type": "col", + "items": [ + { + "computed": null, + "type": "row", + "items": [ + { + "boxed": true, + "title": "Location", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "source": "To mark the survey location on the map click on the pin icon (on left) and drag to the location of your survey. Please use the zoom controls and be as accurate as possible. Click the pin icon to cancel and start again.", + "type": "literal" + } + ] + }, + { + "computed": null, + "type": "row", + "items": [ + { + "includeNotes": false, + "orientation": "vertical", + "computed": null, + "autoLocalitySearch": true, + "readonly": false, + "includeSource": false, + "includeAccuracy": false, + "hideSiteSelection": true, + "source": "location", + "type": "geoMap", + "includeLocality": false + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "preLabel": "Location Name", + "source": "locationName", + "type": "text" + }, + { + "preLabel": "Region", + "source": "region", + "type": "selectOne" + }, + { + "preLabel": "Location Photo", + "source": "locationPhoto", + "type": "image" + } + ] + } + ] + } + ], + "class": "" + } + ] + }, + { + "computed": null, + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "boxed": true, + "title": "Photogrammetry Survey", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "preLabel": "Did you do a photogrammetry survey in conjunction with this survey?", + "source": "photogrammetrySurveyUndertaken", + "type": "selectOne" + }, + { + "preLabel": "Please provide the URL link to the photogrammetry survey associated with this survey.", + "source": "photogrammetrySurveyUrl", + "type": "text" + } + ] + } + ] + } + ], + "class": "" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "boxed": true, + "title": "Seaweed Cover", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "source": "

Surface count (in 1m x 1m quadrat)

If you find a species you cannot identify, write a description of it and where it was found in the species list. Make sure you take a photo of it and send all the information to us at marinemetresquared@gmail.com.", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "source": "Record seaweeds and encrusting animals as a percentage (%) cover.", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "allowHeaderWrap": "true", + "computed": null, + "columns": [ + { + "width": "60%", + "source": "seaweedSpecies", + "title": "Species", + "type": "speciesSelect" + }, + { + "width": "15%", + "source": "percentCover", + "title": "% Cover", + "type": "number" + }, + { + "width": "25%", + "source": "seaweedPhoto", + "title": "Photo", + "type": "image", + "css": "img-responsive", + "showMetadata": "false" + } + ], + "userAddedRows": true, + "disableTableUpload": true, + "allowRowDelete": true, + "defaultRows": 1, + "source": "plantsTable", + "type": "table" + } + ] + } + ] + } + ] + } + ] + } + ], + "class": "" + } + ] + }, + { + "type": "col", + "items": [ + { + "boxed": true, + "title": "Live Animal Records", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "source": "Count the number of living animals within the quadrat. Count only live animals.", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "allowHeaderWrap": true, + "disableTableUpload": true, + "allowRowDelete": true, + "userAddedRows": true, + "defaultRows": 1, + "computed": null, + "columns": [ + { + "width": "60%", + "source": "animalSpecies", + "title": "Species", + "type": "speciesSelect" + }, + { + "width": "15%", + "source": "individualCount", + "title": "Species tally (count)", + "type": "number" + }, + { + "width": "25%", + "source": "animalPhoto", + "title": "Photo", + "type": "image", + "css": "img-responsive", + "showMetadata": "false" + } + ], + "source": "animalsTable", + "type": "table" + } + ] + } + ], + "class": "" + } + ] + } + ] + } + ] + }, + "modelName": null, + "templateName": "Marine Metre Squared - Rocky Shore Survey", + "optional": false, + "optionalQuestionText": null, + "title": null, + "collapsibleHeading": null, + "name": "Marine Metre Squared - Rocky Shore Survey", + "description": null + } + ], + "type": "Assessment", + "category": "Assessment and monitoring", + "status": "active", + "lastUpdatedUserId": "129333", + "description": "NZ Marine Metre Squared intertidal quadrat protocol for rock shorelines", + "formVersion": 1 +} \ No newline at end of file diff --git a/forms/hub/marineMetreSquared/Marine Metre Squared - Sandy and Muddy shore Survey v1.json b/forms/hub/marineMetreSquared/Marine Metre Squared - Sandy and Muddy shore Survey v1.json new file mode 100644 index 000000000..973ae201b --- /dev/null +++ b/forms/hub/marineMetreSquared/Marine Metre Squared - Sandy and Muddy shore Survey v1.json @@ -0,0 +1,877 @@ +{ + "id": "63cbd4b400f69e66bb6dcdaa", + "dateCreated": "2023-01-21T12:04:04Z", + "minOptionalSectionsCompleted": 1, + "supportsSites": false, + "tags": [], + "lastUpdated": "2024-11-13T22:53:15Z", + "createdUserId": "35", + "external": false, + "activationDate": null, + "supportsPhotoPoints": false, + "publicationStatus": "published", + "externalIds": null, + "gmsId": null, + "name": "Marine Metre Squared - Sandy and Muddy shore Survey", + "sections": [ + { + "collapsedByDefault": false, + "template": { + "dataModel": [ + { + "defaultValue": "${now}", + "dataType": "date", + "name": "eventDate", + "indexName": "eventDate", + "dwcAttribute": "eventDate", + "description": "The date of the Survey.", + "validate": "required" + }, + { + "dataType": "time", + "name": "eventStartTime", + "dwcAttribute": "eventTime", + "description": "The time that the survey started.", + "validate": "required" + }, + { + "indexName": "recordedBy", + "dataType": "text", + "name": "recordedBy", + "dwcAttribute": "recordedBy", + "description": "The name of the person leading the survey", + "validate": "required" + }, + { + "dataType": "text", + "name": "otherSurveyors", + "description": "Names of other people involved in the survey" + }, + { + "dataType": "number", + "name": "groupSize", + "description": "The number of people in the survey group.", + "validate": "integer,min[0]" + }, + { + "indexName": "groupName", + "dataType": "text", + "name": "groupName", + "description": "The name of the group or school" + }, + { + "dataType": "text", + "name": "surveyorExperience", + "dwcAttribute": "measurementValue", + "measurementUnit": "unitless", + "measurementUnitID": "surveyorExperience", + "measurementType": "text", + "description": "", + "constraints": [ + "Primary school level", + "Secondary School level", + "Tertiary level ", + "Scientifically accurate" + ] + }, + { + "dataType": "text", + "name": "eventRemarks", + "dwcAttribute": "eventRemarks", + "description": "" + }, + { + "indexName": "shoreLevel", + "dataType": "text", + "name": "shoreLevel", + "dwcAttribute": "measurementValue", + "measurementUnit": "unitless", + "measurementUnitID": "shoreLevel", + "measurementType": "text", + "description": "", + "constraints": [ + "Low", + "Mid", + "High" + ] + }, + { + "dataType": "text", + "name": "siteExposure", + "description": "", + "constraints": [ + "Very exposed", + "Exposed", + "Sheltered", + "Estuary (freshwater input)" + ] + }, + { + "defaultRows": [ + { + "substrateType": "Reef (stable rock cover)", + "substratePercentCover": "" + }, + { + "substrateType": "Boulder (head size)", + "substratePercentCover": "" + }, + { + "substrateType": "Cobble (fist size)", + "substratePercentCover": "" + }, + { + "substrateType": "Gravel (marble size)", + "substratePercentCover": "" + }, + { + "substrateType": "Sand (like the beach)", + "substratePercentCover": "" + }, + { + "substrateType": "Sediment (fine grain size)", + "substratePercentCover": "" + }, + { + "substrateType": "Mud (gloopy)", + "substratePercentCover": "" + } + ], + "columns": [ + { + "dataType": "text", + "dwcAttribute": "measurementValue", + "measurementUnit": "unitless", + "measurementUnitID": "substrateType", + "measurementType": "${dominantSpeciesPreIntervention.substrateType} - Substrate", + "name": "substrateType", + "noEdit": true + }, + { + "dataType": "number", + "name": "substratePercentCover", + "validate": "integer,min[0],max[100]" + } + ], + "dataType": "list", + "userAddedRows": false, + "allowRowDelete": false, + "name": "substrateTable" + }, + { + "dataType": "number", + "name": "substrateTotalPercentCover", + "noEdit": true, + "readOnly": true, + "decimalPlaces": 0, + "computed": { + "expression": "sum(substrateTable, \"substratePercentCover\")" + } + }, + { + "dataType": "text", + "name": "siteKeyFeatures", + "description": "(e.g. rocky headland with surf beach 3 km to south; freshwater creek 50 m to the north; upper shore modified with harbour wall etc.)" + }, + { + "dataType": "text", + "name": "evidenceOfHumanInfluences", + "description": "(e.g. rubbish, people collecting seafood, tyre tracks on sand, dogs present,people in the water)." + }, + { + "indexName": "locationName", + "dataType": "text", + "name": "locationName", + "dwcAttribute": "verbatimLocality", + "description": "Use town and name of shore or bay. Eg. Portobello – Latham Bay, Auckland – Campbells Bay. Please be consistent.", + "validate": "required" + }, + { + "dataType": "image", + "name": "locationPhoto", + "description": "Take a photo of your m2 area and put the top of this sheet in the corner for identification later!" + }, + { + "indexName": "region", + "dataType": "text", + "name": "region", + "dwcAttribute": "locality", + "description": "", + "constraints": [ + "Northland (Te Tai Tokerau)", + "Auckland (Tāmaki-makau-rau)", + "Waikato", + "Bay of Plenty (Te Moana-a-Toi)", + "Gisborne (Te Tairāwhiti)", + "Hawke's Bay (Te Matau-a-Māui)", + "Taranaki", + "Manawatū-Whanganui", + "Wellington (Te Whanga-nui-a-Tara)", + "Tasman (Te Tai-o-Aorere)", + "Nelson (Whakatū)", + "Marlborough (Te Tauihu-o-te-waka)", + "West Coast (Te Tai Poutini)", + "Canterbury (Waitaha)", + "Otago (Ōtākou)", + "Southland (Murihiku)" + ] + }, + { + "defaultAccuracy": 50, + "hideMyLocation": false, + "columns": [ + { + "dwcAttribute": "verbatimLatitude", + "source": "locationLatitude" + }, + { + "dwcAttribute": "verbatimLongitude", + "source": "locationLongitude" + }, + { + "source": "Locality" + }, + { + "source": "Accuracy" + }, + { + "source": "Notes" + }, + { + "source": "Source" + } + ], + "dataType": "geoMap", + "name": "location", + "dwcAttribute": "verbatimCoordinates", + "hideSiteSelection": true, + "zoomToProjectArea": true, + "validate": "required" + }, + { + "dataType": "text", + "name": "photogrammetrySurveyUndertaken", + "description": "", + "constraints": [ + "Yes", + "No" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "photogrammetrySurveyUrl", + "description": "If you did a photogrammetry survey in conjunction with this survey, please insert the URL link to it here." + }, + { + "columns": [ + { + "dataType": "species", + "name": "plantSpecies", + "dwcAttribute": "scientificName", + "description": "" + }, + { + "dataType": "number", + "name": "percentCover", + "description": "", + "validate": "integer,min[0],max[100]" + }, + { + "dataType": "image", + "name": "seaweedPhoto", + "description": "", + "dwcAttribute": "associatedMedia" + } + ], + "dataType": "list", + "name": "plantsTable" + }, + { + "columns": [ + { + "dataType": "species", + "name": "animalSpecies", + "dwcAttribute": "scientificName", + "description": "" + }, + { + "dataType": "number", + "name": "individualCount", + "dwcAttribute": "individualCount", + "description": "", + "validate": "integer,min[0]" + }, + { + "dataType": "image", + "name": "animalPhoto", + "description": "", + "dwcAttribute": "associatedMedia" + } + ], + "dataType": "list", + "name": "animalsTable" + }, + { + "dataType": "number", + "name": "rpdLevelCoreMeasurementInMillimetres", + "description": "", + "validate": "integer,min[0]" + }, + { + "dataType": "text", + "name": "rpdLevelCoreTaken", + "description": "", + "constraints": [ + "Yes", + "No" + ], + "validate": "required" + }, + { + "columns": [ + { + "dataType": "species", + "name": "speciesInfauna", + "dwcAttribute": "scientificName", + "description": "" + }, + { + "dataType": "number", + "name": "individualRpdCoreCount", + "description": "", + "validate": "integer,min[0]" + }, + { + "dataType": "number", + "name": "individualRpdCoreTotalCountPerMetreSquared", + "dwcAttribute": "individualCount", + "description": "", + "computed": { + "expression": "individualRpdCoreCount*100" + }, + "decimalPlaces": 0, + "noEdit": true, + "readOnly": true + } + ], + "dataType": "list", + "name": "infaunaCountsTable" + } + ], + "modelName": "Marine Metre Squared - Sandy and Muddy Shore Survey", + "title": "Marine Metre Squared - Sandy and Muddy Shore Survey", + "record": "true", + "viewModel": [ + { + "type": "row", + "items": [ + { + "source": "

Sandy and Muddy Shore Marine Metre2 Survey

", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "boxed": true, + "title": "Survey Details", + "type": "section", + "items": [ + { + "preLabel": "Survey date", + "source": "eventDate", + "type": "date" + }, + { + "preLabel": "Survey time", + "source": "eventStartTime", + "type": "time" + }, + { + "preLabel": "Survey leader name", + "source": "recordedBy", + "type": "text" + }, + { + "preLabel": "Other surveyors", + "source": "otherSurveyors", + "type": "text" + }, + { + "preLabel": "School/Group name", + "source": "groupName", + "type": "text" + }, + { + "preLabel": "Surveyor experience", + "source": "surveyorExperience", + "type": "selectOne" + }, + { + "preLabel": "Group size", + "source": "groupSize", + "type": "number" + }, + { + "preLabel": "Survey notes", + "source": "eventRemarks", + "type": "textarea" + } + ], + "class": "" + }, + { + "boxed": true, + "title": "Site Details", + "type": "section", + "items": [ + { + "preLabel": "Shore level", + "source": "shoreLevel", + "type": "selectOne" + }, + { + "preLabel": "Site exposure", + "source": "siteExposure", + "type": "selectOne" + }, + { + "type": "row", + "items": [ + { + "footer": { + "rows": [ + { + "columns": [ + { + "colspan": 1, + "source": "Substrate total % cover (must equal 100%)", + "type": "literal" + }, + { + "source": "substrateTotalPercentCover", + "colspan": 1, + "type": "number" + } + ] + } + ] + }, + "source": "substrateTable", + "allowHeaderWrap": true, + "userAddedRows": false, + "allowRowDelete": false, + "disableTableUpload": true, + "type": "table", + "columns": [ + { + "source": "substrateType", + "title": "Substrate", + "type": "text", + "width": "80%", + "noEdit": true + }, + { + "source": "substratePercentCover", + "title": "Percentage cover (%)", + "type": "number", + "width": "20%" + } + ] + } + ] + }, + { + "preLabel": "Key features of this site", + "source": "siteKeyFeatures", + "type": "textarea" + }, + { + "preLabel": "Evidence of human influences", + "source": "evidenceOfHumanInfluences", + "type": "textarea" + } + ], + "class": "" + } + ] + }, + { + "type": "col", + "items": [ + { + "computed": null, + "type": "row", + "items": [ + { + "boxed": true, + "title": "Location", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "source": "To mark the survey location on the map click on the pin icon (on left) and drag to the location of your survey. Please use the zoom controls and be as accurate as possible. Click the pin icon to cancel and start again.", + "type": "literal" + } + ] + }, + { + "computed": null, + "type": "row", + "items": [ + { + "includeNotes": false, + "orientation": "vertical", + "computed": null, + "autoLocalitySearch": true, + "readonly": false, + "includeSource": false, + "includeAccuracy": false, + "hideSiteSelection": true, + "source": "location", + "type": "geoMap", + "includeLocality": false + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "preLabel": "Location Name", + "source": "locationName", + "type": "text" + }, + { + "preLabel": "Region", + "source": "region", + "type": "selectOne" + }, + { + "type": "row", + "items": [ + { + "preLabel": "Location Photo", + "source": "locationPhoto", + "type": "image" + } + ] + } + ] + } + ] + } + ], + "class": "" + } + ] + }, + { + "computed": null, + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "boxed": true, + "title": "Photogrammetry Survey", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "preLabel": "Did you do a photogrammetry survey in conjunction with this survey?", + "source": "photogrammetrySurveyUndertaken", + "type": "selectOne" + }, + { + "preLabel": "Please provide the URL link to the photogrammetry survey associated with this survey.", + "source": "photogrammetrySurveyUrl", + "type": "text" + } + ] + } + ] + } + ], + "class": "" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "boxed": true, + "title": "Seaweed Cover", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "source": "

Surface count (in 1m x 1m quadrat)

If you find a species you cannot identify, write a description of it and where it was found in the species list. Make sure you take a photo of it and send all the information to us at marinemetresquared@gmail.com.", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "source": "Record seaweeds and encrusting animals as a percentage (%) cover.", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "allowHeaderWrap": "true", + "computed": null, + "columns": [ + { + "width": "60%", + "source": "plantSpecies", + "title": "Plant Species", + "type": "speciesSelect" + }, + { + "width": "15%", + "source": "percentCover", + "title": "% Cover", + "type": "number" + }, + { + "width": "25%", + "source": "seaweedPhoto", + "title": "Photo", + "type": "image", + "css": "img-responsive", + "showMetadata": "false" + } + ], + "userAddedRows": true, + "disableTableUpload": true, + "allowRowDelete": true, + "defaultRows": 1, + "source": "plantsTable", + "type": "table" + } + ] + } + ] + } + ] + } + ] + } + ], + "class": "" + } + ] + }, + { + "type": "col", + "items": [ + { + "boxed": true, + "title": "Live Animal Records", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "source": "Count the number of living animals within the quadrat. Count only live animals.", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "allowHeaderWrap": true, + "disableTableUpload": true, + "allowRowDelete": true, + "userAddedRows": true, + "defaultRows": 1, + "computed": null, + "columns": [ + { + "width": "60%", + "source": "animalSpecies", + "title": "Animal Species", + "type": "speciesSelect" + }, + { + "width": "15%", + "source": "individualCount", + "title": "Species tally (count)", + "type": "number" + }, + { + "width": "25%", + "source": "animalPhoto", + "title": "Photo", + "type": "image", + "css": "img-responsive", + "showMetadata": "false" + } + ], + "source": "animalsTable", + "type": "table" + } + ] + } + ], + "class": "" + } + ] + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "boxed": true, + "title": "RPD Levels and Infauna Counts (10cm x 10cm core)", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "source": "Take a core sample (inside your m^2). Remember to move surface life out of the way so that it is not counted twice. Slide sediment out of the core carefully. Measure from the surface to where the sediment changes colour (this is your RPD level). Place the sediment in the sieve, rinse, and count the animals living in the mud (infauna).", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "source": "rpdLevelCoreTaken", + "preLabel": "Did you take a RPD level core measurement?", + "type": "selectOne" + }, + { + "source": "rpdLevelCoreMeasurementInMillimetres", + "preLabel": "RPD level - Core measurement (mm)", + "type": "number" + } + ] + } + ] + } + ] + }, + { + "type": "row", + "items": [ + { + "allowHeaderWrap": true, + "disableTableUpload": true, + "userAddedRows": true, + "defaultRows": 1, + "computed": null, + "columns": [ + { + "width": "80%", + "source": "speciesInfauna", + "title": "Infauna species", + "type": "speciesSelect" + }, + { + "width": "10%", + "source": "individualRpdCoreCount", + "title": "RPD Core sample (count or average)", + "type": "number" + }, + { + "width": "10%", + "source": "individualRpdCoreTotalCountPerMetreSquared", + "title": "Total animals per metre2", + "type": "number", + "readOnly": true, + "noEdit": true + } + ], + "allowRowDelete": true, + "source": "infaunaCountsTable", + "type": "table" + } + ] + } + ], + "class": "" + } + ] + } + ] + } + ] + }, + "modelName": null, + "templateName": "Marine Metre Squared - Sandy and Muddy shore Survey", + "optional": false, + "optionalQuestionText": null, + "title": null, + "collapsibleHeading": null, + "name": "Marine Metre Squared - Sandy and Muddy shore Survey", + "description": null + } + ], + "type": "Assessment", + "category": "Assessment & monitoring", + "status": "active", + "lastUpdatedUserId": "129333", + "description": "NZ Marine Metre Squared intertidal zone quadrat protocol", + "formVersion": 1 +} \ No newline at end of file diff --git a/forms/hub/marineMetreSquared/Marine Metre Squared Transect Survey - Rocky Shore v1.json b/forms/hub/marineMetreSquared/Marine Metre Squared Transect Survey - Rocky Shore v1.json new file mode 100644 index 000000000..270e2cf35 --- /dev/null +++ b/forms/hub/marineMetreSquared/Marine Metre Squared Transect Survey - Rocky Shore v1.json @@ -0,0 +1,963 @@ +{ + "id": "6630f6a29666624f81679889", + "dateCreated": "2024-04-30T13:48:18Z", + "minOptionalSectionsCompleted": 1, + "supportsSites": false, + "tags": [], + "lastUpdated": "2024-05-13T12:48:43Z", + "createdUserId": "35", + "external": false, + "activationDate": null, + "supportsPhotoPoints": false, + "publicationStatus": "published", + "externalIds": null, + "gmsId": null, + "name": "Marine Metre Squared Transect Survey - Rocky Shore", + "sections": [ + { + "collapsedByDefault": false, + "template": { + "modelName": "Marine Metre Squared Transect Survey - Rocky Shore", + "dataModel": [ + { + "defaultValue": "${now}", + "dataType": "date", + "name": "eventDate", + "dwcAttribute": "eventDate", + "description": "The date of the Survey.", + "validate": "required" + }, + { + "dataType": "time", + "name": "eventTime", + "dwcAttribute": "eventTime", + "description": "The time that the survey started.", + "validate": "required" + }, + { + "indexName": "recordedBy", + "dataType": "text", + "name": "recordedBy", + "dwcAttribute": "recordedBy", + "description": "The name of the person leading the survey", + "validate": "required" + }, + { + "dataType": "text", + "name": "additionalSurveyors", + "description": "Names of other people involved in the survey" + }, + { + "indexName": "groupName", + "dataType": "text", + "name": "groupName", + "description": "The name of the group or school" + }, + { + "dataType": "number", + "name": "groupSize", + "description": "The number of people participating in the survey group.", + "validate": "min[1],integer" + }, + { + "dataType": "text", + "name": "eventRemarks", + "dwcAttribute": "eventRemarks", + "description": "" + }, + { + "dataType": "text", + "name": "surveyExtent", + "description": "", + "constraints": [ + "From high to low water mark", + "From low to high water mark" + ] + }, + { + "indexName": "surveyorExperience", + "dataType": "text", + "name": "surveyorExperience", + "description": "", + "constraints": [ + "Scientifically accurate", + "Tertiary level", + "Secondary School level", + "Primary School level" + ] + }, + { + "dataType": "number", + "name": "distanceBetweenQuadratsInMetres", + "description": "", + "decimalPlaces": 2, + "validate": "min[0]" + }, + { + "indexName": "siteExposure", + "dataType": "text", + "name": "siteExposure", + "description": "", + "constraints": [ + "Very exposed", + "Exposed", + "Sheltered", + "Estuary (freshwater input)" + ] + }, + { + "columns": [ + { + "dataType": "text", + "name": "quadratNumber" + }, + { + "indexName": "mm2Substrate", + "dataType": "text", + "name": "substrateType", + "dwcAttribute": "measurementValue", + "measurementUnit": "unitless", + "measurementUnitID": "substrateType", + "measurementType": "${dominantSpeciesPreIntervention.substrateType} - Substrate", + "description": ".", + "constraints": [ + "Rock/reef (stable hard surface)", + "Cobble (fist to head size)", + "Mixed (loose assorted stones)", + "Pool of water (rockpool)" + ] + } + ], + "dataType": "list", + "name": "quadratData", + "allowRowDelete": false, + "defaultRows": [ + { + "habitat": "", + "quadratNumber": "1", + "substrate": "" + }, + { + "habitat": "", + "quadratNumber": "2", + "substrate": "" + }, + { + "habitat": "", + "quadratNumber": "3", + "substrate": "" + }, + { + "habitat": "", + "quadratNumber": "4", + "substrate": "" + }, + { + "habitat": "", + "quadratNumber": "5", + "substrate": "" + }, + { + "habitat": "", + "quadratNumber": "6", + "substrate": "" + }, + { + "habitat": "", + "quadratNumber": "7", + "substrate": "" + }, + { + "habitat": "", + "quadratNumber": "8", + "substrate": "" + }, + { + "habitat": "", + "quadratNumber": "9", + "substrate": "" + }, + { + "habitat": "", + "quadratNumber": "10", + "substrate": "" + }, + { + "habitat": "", + "quadratNumber": "11", + "substrate": "" + } + ] + }, + { + "defaultAccuracy": 50, + "hideMyLocation": false, + "columns": [ + { + "dwcAttribute": "verbatimLatitude", + "source": "locationLatitude" + }, + { + "dwcAttribute": "verbatimLongitude", + "source": "locationLongitude" + }, + { + "source": "Locality" + }, + { + "source": "Accuracy" + }, + { + "source": "Notes" + }, + { + "source": "Source" + } + ], + "dataType": "geoMap", + "name": "location", + "dwcAttribute": "verbatimCoordinates", + "hideSiteSelection": true, + "zoomToProjectArea": true, + "validate": "required" + }, + { + "indexName": "locationName", + "dataType": "text", + "name": "locationName", + "dwcAttribute": "verbatimLocality", + "description": "Enter the name of the location. Use town and name of shore or bay. Eg. Portobello – Latham Bay, Auckland – Campbells Bay. Please be consistent.", + "validate": "required" + }, + { + "indexName": "region", + "dataType": "text", + "name": "region", + "dwcAttribute": "locality", + "description": "", + "constraints": [ + "Northland (Te Tai Tokerau)", + "Auckland (Tāmaki-makau-rau)", + "Waikato", + "Bay of Plenty (Te Moana-a-Toi)", + "Gisborne (Te Tairāwhiti)", + "Hawke's Bay (Te Matau-a-Māui)", + "Taranaki", + "Manawatū-Whanganui", + "Wellington (Te Whanga-nui-a-Tara)", + "Tasman (Te Tai-o-Aorere)", + "Nelson (Whakatū)", + "Marlborough (Te Tauihu-o-te-waka)", + "West Coast (Te Tai Poutini)", + "Canterbury (Waitaha)", + "Otago (Ōtākou)", + "Southland (Murihiku)" + ] + }, + { + "dataType": "text", + "name": "siteDescription" + }, + { + "dataType": "image", + "name": "locationPhoto", + "description": "Photo of the survey location" + }, + { + "dataType": "text", + "name": "photogrammetrySurveyUndertaken", + "description": "", + "constraints": [ + "Yes", + "No" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "photogrammetrySurveyUrl", + "description": "If you did a photogrammetry survey in conjunction with this survey, please insert the URL link to it here." + }, + { + "columns": [ + { + "dataType": "species", + "name": "speciesPlants", + "dwcAttribute": "scientificName", + "description": "The species name of the animal (or tracks/evidence of) observed." + }, + { + "dataType": "number", + "name": "percentCoverQ1Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ2Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ3Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ4Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ5Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ6Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ7Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ8Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ9Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ10Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ11Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "text", + "name": "occurrenceRemarksPlants", + "dwcAttribute": "occurrenceRemarks", + "description": "" + }, + { + "dataType": "image", + "name": "associatedMediaPlants", + "dwcAttribute": "associatedMedia", + "description": "" + } + ], + "dataType": "list", + "name": "plantsTable" + }, + { + "columns": [ + { + "dataType": "species", + "name": "speciesAnimals", + "dwcAttribute": "scientificName", + "description": "The species name of the animal (or tracks/evidence of) observed." + }, + { + "dataType": "number", + "name": "individualCountQ1Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ2Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ3Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ4Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ5Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ6Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ7Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ8Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ9Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ10Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ11Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "text", + "name": "occurrenceRemarksAnimals", + "dwcAttribute": "occurrenceRemarks", + "description": "" + }, + { + "dataType": "image", + "name": "associatedMediaAnimals", + "dwcAttribute": "associatedMedia", + "description": "" + } + ], + "dataType": "list", + "name": "animalsTable" + } + ], + "record": "true", + "viewModel": [ + { + "type": "row", + "items": [ + { + "source": "

Rocky Shore Transect Survey

", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "boxed": true, + "title": "Survey Details", + "type": "section", + "items": [ + { + "preLabel": "Survey Date", + "source": "eventDate", + "type": "date" + }, + { + "preLabel": "Survey Time", + "source": "eventTime", + "type": "time" + }, + { + "preLabel": "Survey leader name", + "source": "recordedBy", + "type": "text" + }, + { + "preLabel": "Other surveyors", + "source": "additionalSurveyors", + "type": "text" + }, + { + "preLabel": "School/Group name", + "source": "groupName", + "type": "text" + }, + { + "preLabel": "Surveyor Experience", + "source": "surveyorExperience", + "type": "selectOne" + }, + { + "preLabel": "Group Size", + "source": "groupSize", + "type": "number" + }, + { + "preLabel": "Survey notes", + "source": "eventRemarks", + "type": "textarea" + }, + { + "preLabel": "Exposure", + "source": "siteExposure", + "type": "selectOne" + }, + { + "preLabel": "Survey Extends", + "source": "surveyExtent", + "type": "selectOne" + }, + { + "preLabel": "Distance between quadrats in metres", + "source": "distanceBetweenQuadratsInMetres", + "type": "number" + }, + { + "allowRowDelete": false, + "disableTableUpload": true, + "headerRowsWrap": true, + "columns": [ + { + "noEdit": true, + "source": "quadratNumber", + "title": "Quadrat No.", + "type": "text", + "width": "20%" + }, + { + "source": "substrateType", + "title": "Main Substrate (>50% of quadrat)", + "type": "selectOne", + "width": "80%" + } + ], + "userAddedRows": false, + "source": "quadratData", + "type": "table" + } + ], + "class": "" + } + ], + "class": "" + }, + { + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "boxed": true, + "title": "Location", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "source": "To mark the location of the survey on the map, click on the pin icon (on left) and drag to the location of your survey. Please use the zoom controls and be as accurate as possible. Click the pin icon to cancel and start again.", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "includeNotes": false, + "orientation": "vertical", + "computed": null, + "autoLocalitySearch": true, + "readonly": false, + "includeSource": false, + "includeAccuracy": false, + "hideSiteSelection": true, + "source": "location", + "type": "geoMap", + "includeLocality": false + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Location Name", + "source": "locationName", + "type": "text" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Region", + "source": "region", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Site description (including environmental conditions)", + "source": "siteDescription", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Location Photo", + "source": "locationPhoto", + "type": "image" + } + ] + } + ], + "class": "" + } + ] + }, + { + "computed": null, + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "boxed": true, + "title": "Photogrammetry Survey", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "preLabel": "Did you do a photogrammetry survey in conjunction with this survey?", + "source": "photogrammetrySurveyUndertaken", + "type": "selectOne" + }, + { + "preLabel": "Please provide the URL link to the photogrammetry survey associated with this survey.", + "source": "photogrammetrySurveyUrl", + "type": "text" + } + ] + } + ] + } + ], + "class": "" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "boxed": true, + "title": "Species Records", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "source": "Enter the number of each species counted in each quadrat sampled. Record a description of any species that you could not identify. You can also make a note of the abundance using one of the temporary 'Unknown Species' types from the lists below. (Remember to also post a picture and description on the blog to see if others can help with the id.)", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "boxed": true, + "title": "Plant Species", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "allowHeaderWrap": true, + "computed": null, + "columns": [ + { + "width": "15%", + "source": "speciesPlants", + "title": "Species", + "type": "speciesSelect" + }, + { + "width": "5%", + "source": "percentCoverQ1Plants", + "title": "Q1 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ2Plants", + "title": "Q2 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ3Plants", + "title": "Q3 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ4Plants", + "title": "Q4 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ5Plants", + "title": "Q5 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ6Plants", + "title": "Q6 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ7Plants", + "title": "Q7 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ8Plants", + "title": "Q8 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ9Plants", + "title": "Q9 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ10Plants", + "title": "Q10 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ11Plants", + "title": "Q11 % cover", + "type": "number" + }, + { + "width": "10%", + "source": "occurrenceRemarksPlants", + "title": "Species notes", + "type": "textarea" + }, + { + "width": "15%", + "source": "associatedMediaPlants", + "title": "Photo", + "type": "image" + } + ], + "disableTableUpload": true, + "allowRowDelete": true, + "userAddedRows": true, + "defaultRows": 1, + "source": "plantsTable", + "type": "table" + } + ] + } + ], + "class": "" + }, + { + "boxed": true, + "title": "Animal Species", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "allowHeaderWrap": true, + "computed": null, + "columns": [ + { + "width": "15%", + "source": "speciesAnimals", + "title": "Species", + "type": "speciesSelect" + }, + { + "width": "5%", + "source": "individualCountQ1Animals", + "title": "Q1 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ2Animals", + "title": "Q2 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ3Animals", + "title": "Q3 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ4Animals", + "title": "Q4 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ5Animals", + "title": "Q5 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ6Animals", + "title": "Q6 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ7Animals", + "title": "Q7 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ8Animals", + "title": "Q8 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ9Animals", + "title": "Q9 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ10Animals", + "title": "Q10 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ11Animals", + "title": "Q11 count", + "type": "number" + }, + { + "width": "10%", + "source": "occurrenceRemarksAnimals", + "title": "Species notes", + "type": "textarea" + }, + { + "width": "15%", + "source": "associatedMediaAnimals", + "title": "Photo", + "type": "image" + } + ], + "disableTableUpload": true, + "allowRowDelete": true, + "userAddedRows": true, + "defaultRows": 1, + "source": "animalsTable", + "type": "table" + } + ] + } + ], + "class": "" + } + ] + } + ], + "class": "" + } + ] + } + ] + } + ], + "title": "Marine Metre Squared Transect Survey - Rocky Shore" + }, + "modelName": null, + "templateName": "Marine Metre Squared Transect Survey - Rocky Shore", + "optional": false, + "optionalQuestionText": null, + "title": null, + "collapsibleHeading": null, + "name": "Marine Metre Squared Transect Survey - Rocky Shore", + "description": null + } + ], + "type": "Assessment", + "category": "Assessment & monitoring", + "status": "active", + "lastUpdatedUserId": "35", + "description": "Transect survey for rocky shorelines using the Marine Metre Squared survey protocol.", + "formVersion": 1 +} diff --git a/forms/hub/marineMetreSquared/Marine Metre Squared Transect Survey v1.json b/forms/hub/marineMetreSquared/Marine Metre Squared Transect Survey v1.json new file mode 100644 index 000000000..c972b99c0 --- /dev/null +++ b/forms/hub/marineMetreSquared/Marine Metre Squared Transect Survey v1.json @@ -0,0 +1,1189 @@ +{ + "id": "5d133339e4b00a475b28e29d", + "dateCreated": "2019-06-26T08:56:25Z", + "minOptionalSectionsCompleted": 1, + "supportsSites": false, + "tags": [], + "lastUpdated": "2024-11-11T10:24:05Z", + "createdUserId": "", + "external": false, + "activationDate": null, + "supportsPhotoPoints": false, + "publicationStatus": "published", + "externalIds": null, + "gmsId": null, + "name": "Marine Metre Squared Transect Survey", + "sections": [ + { + "collapsedByDefault": false, + "template": { + "dataModel": [ + { + "defaultValue": "${now}", + "dataType": "date", + "name": "eventDate", + "dwcAttribute": "eventDate", + "description": "The date of the Survey.", + "validate": "required" + }, + { + "dataType": "time", + "name": "eventTime", + "dwcAttribute": "eventTime", + "description": "The time that the survey started.", + "validate": "required" + }, + { + "indexName": "recordedBy", + "dataType": "text", + "name": "recordedBy", + "dwcAttribute": "recordedBy", + "description": "The name of the person leading the survey", + "validate": "required" + }, + { + "dataType": "text", + "name": "additionalSurveyors", + "description": "The names of other people or the group participating in the survey group." + }, + { + "indexName": "groupName", + "dataType": "text", + "name": "groupName", + "description": "The name of the group or school" + }, + { + "dataType": "number", + "name": "groupSize", + "description": "The number of people participating in the survey group.", + "validate": "min[1],integer" + }, + { + "dataType": "text", + "name": "surveyExtent", + "description": "", + "constraints": [ + "From high to low water mark", + "From low to high water mark" + ] + }, + { + "indexName": "surveyorExperience", + "dataType": "text", + "name": "surveyorExperience", + "dwcAttribute": "measurementValue", + "measurementUnit": "unitless", + "measurementUnitID": "surveyorExperience", + "measurementType": "text", + "description": "", + "constraints": [ + "Primary school level", + "Secondary School level", + "Tertiary level ", + "Scientifically accurate" + ] + }, + { + "dataType": "number", + "name": "distanceBetweenQuadratsInMetres", + "description": "", + "decimalPlaces": 2, + "validate": "min[0]" + }, + { + "indexName": "siteExposure", + "dataType": "text", + "name": "siteExposure", + "description": "", + "constraints": [ + "Very exposed", + "Exposed", + "Sheltered", + "Estuary (freshwater input)" + ] + }, + { + "dataType": "text", + "name": "eventRemarks", + "dwcAttribute": "eventRemarks", + "description": "" + }, + { + "columns": [ + { + "dataType": "text", + "name": "quadratNumber" + }, + { + "indexName": "mm2Substrate", + "dataType": "text", + "name": "substrateType", + "dwcAttribute": "measurementValue", + "measurementUnit": "unitless", + "measurementUnitID": "substrateType", + "measurementType": "${dominantSpeciesPreIntervention.substrateType} - Substrate", + "description": "", + "constraints": [ + "Mud (sink >5cm)", + "Sand (sink <2cm)", + "Mixed (sink 2-5cm)", + "Mixed with rocks" + ] + }, + { + "dataType": "number", + "name": "rpdInMillimetres", + "description": "The RPD (Redox Potential Discontinuity) layer is the area where oxygenated substrate (light brown) changes to deoxygenated substrates (black, often smelly).", + "validate": "min[0],integer" + } + ], + "dataType": "list", + "name": "quadratData", + "allowRowDelete": false, + "defaultRows": [ + { + "habitat": "", + "rpdInMillimetres": "", + "quadratNumber": "1", + "substrate": "" + }, + { + "habitat": "", + "rpdInMillimetres": "", + "quadratNumber": "2", + "substrate": "" + }, + { + "habitat": "", + "rpdInMillimetres": "", + "quadratNumber": "3", + "substrate": "" + }, + { + "habitat": "", + "rpdInMillimetres": "", + "quadratNumber": "4", + "substrate": "" + }, + { + "habitat": "", + "rpdInMillimetres": "", + "quadratNumber": "5", + "substrate": "" + }, + { + "habitat": "", + "rpdInMillimetres": "", + "quadratNumber": "6", + "substrate": "" + }, + { + "habitat": "", + "rpdInMillimetres": "", + "quadratNumber": "7", + "substrate": "" + }, + { + "habitat": "", + "rpdInMillimetres": "", + "quadratNumber": "8", + "substrate": "" + }, + { + "habitat": "", + "rpdInMillimetres": "", + "quadratNumber": "9", + "substrate": "" + }, + { + "habitat": "", + "rpdInMillimetres": "", + "quadratNumber": "10", + "substrate": "" + }, + { + "habitat": "", + "rpdInMillimetres": "", + "quadratNumber": "11", + "substrate": "" + } + ] + }, + { + "defaultAccuracy": 50, + "hideMyLocation": false, + "columns": [ + { + "dwcAttribute": "verbatimLatitude", + "source": "locationLatitude" + }, + { + "dwcAttribute": "verbatimLongitude", + "source": "locationLongitude" + }, + { + "source": "Locality" + }, + { + "source": "Accuracy" + }, + { + "source": "Notes" + }, + { + "source": "Source" + } + ], + "dataType": "geoMap", + "name": "location", + "dwcAttribute": "verbatimCoordinates", + "hideSiteSelection": true, + "zoomToProjectArea": true, + "validate": "required" + }, + { + "indexName": "locationName", + "dataType": "text", + "name": "locationName", + "dwcAttribute": "verbatimLocality", + "description": "Enter the name of the location. Use town and name of shore or bay. Eg. Portobello – Latham Bay, Auckland – Campbells Bay. Please be consistent.", + "validate": "required" + }, + { + "indexName": "region", + "dataType": "text", + "name": "region", + "dwcAttribute": "locality", + "description": "", + "constraints": [ + "Northland (Te Tai Tokerau)", + "Auckland (Tāmaki-makau-rau)", + "Waikato", + "Bay of Plenty (Te Moana-a-Toi)", + "Gisborne (Te Tairāwhiti)", + "Hawke's Bay (Te Matau-a-Māui)", + "Taranaki", + "Manawatū-Whanganui", + "Wellington (Te Whanga-nui-a-Tara)", + "Tasman (Te Tai-o-Aorere)", + "Nelson (Whakatū)", + "Marlborough (Te Tauihu-o-te-waka)", + "West Coast (Te Tai Poutini)", + "Canterbury (Waitaha)", + "Otago (Ōtākou)", + "Southland (Murihiku)" + ] + }, + { + "dataType": "text", + "name": "siteDescription", + "description": "" + }, + { + "dataType": "image", + "name": "locationPhoto", + "description": "Photo of the survey location" + }, + { + "dataType": "text", + "name": "photogrammetrySurveyUndertaken", + "description": "", + "constraints": [ + "Yes", + "No" + ], + "validate": "required" + }, + { + "dataType": "text", + "name": "photogrammetrySurveyUrl", + "description": "If you did a photogrammetry survey in conjunction with this survey, please insert the URL link to it here." + }, + { + "columns": [ + { + "dataType": "species", + "name": "speciesPlants", + "dwcAttribute": "scientificName", + "description": "The species name of the animal (or tracks/evidence of) observed." + }, + { + "dataType": "number", + "name": "percentCoverQ1Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ2Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ3Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ4Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ5Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ6Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ7Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ8Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ9Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ10Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "percentCoverQ11Plants", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "text", + "name": "occurrenceRemarksPlants", + "dwcAttribute": "occurrenceRemarks", + "description": "" + }, + { + "dataType": "image", + "name": "associatedMediaPlants", + "dwcAttribute": "associatedMedia", + "description": "" + } + ], + "dataType": "list", + "name": "plantsTable" + }, + { + "columns": [ + { + "dataType": "species", + "name": "speciesAnimals", + "dwcAttribute": "scientificName", + "description": "The species name of the animal (or tracks/evidence of) observed." + }, + { + "dataType": "number", + "name": "individualCountQ1Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ2Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ3Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ4Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ5Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ6Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ7Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ8Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ9Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ10Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ11Animals", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "text", + "name": "occurrenceRemarksAnimals", + "dwcAttribute": "occurrenceRemarks", + "description": "" + }, + { + "dataType": "image", + "name": "associatedMediaAnimals", + "dwcAttribute": "associatedMedia", + "description": "" + } + ], + "dataType": "list", + "name": "animalsTable" + }, + { + "columns": [ + { + "dataType": "species", + "name": "speciesInfauna", + "dwcAttribute": "scientificName", + "description": "The species name of the animal (or tracks/evidence of) observed." + }, + { + "dataType": "number", + "name": "individualCountQ1Infauna", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ2Infauna", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ3Infauna", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ4Infauna", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ5Infauna", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ6Infauna", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ7Infauna", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ8Infauna", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ9Infauna", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ10Infauna", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "number", + "name": "individualCountQ11Infauna", + "description": "The number of individuals of species recorded in quadrat.", + "validate": "min[0],integer" + }, + { + "dataType": "text", + "name": "occurrenceRemarksInfauna", + "dwcAttribute": "occurrenceRemarks", + "description": "" + }, + { + "dataType": "image", + "name": "associatedMediaInfauna", + "dwcAttribute": "associatedMedia", + "description": "" + } + ], + "dataType": "list", + "name": "infaunaTable" + } + ], + "modelName": "marineMeterSquaredTransectSurvey", + "record": "true", + "viewModel": [ + { + "type": "row", + "items": [ + { + "source": "

Sandy and Muddy Shore Transect Survey

", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "boxed": true, + "title": "Survey Details", + "type": "section", + "items": [ + { + "preLabel": "Survey Date", + "source": "eventDate", + "type": "date" + }, + { + "preLabel": "Survey Time", + "source": "eventTime", + "type": "time" + }, + { + "preLabel": "Survey leader name", + "source": "recordedBy", + "type": "text" + }, + { + "preLabel": "Other surveyors", + "source": "additionalSurveyors", + "type": "text" + }, + { + "preLabel": "School/Group name", + "source": "groupName", + "type": "text" + }, + { + "preLabel": "Surveyor Experience", + "source": "surveyorExperience", + "type": "selectOne" + }, + { + "preLabel": "Group Size", + "source": "groupSize", + "type": "number" + }, + { + "preLabel": "Survey notes", + "source": "eventRemarks", + "type": "textarea" + }, + { + "preLabel": "Exposure", + "source": "siteExposure", + "type": "selectOne" + }, + { + "preLabel": "Survey Extends", + "source": "surveyExtent", + "type": "selectOne" + }, + { + "preLabel": "Distance between quadrats in metres", + "source": "distanceBetweenQuadratsInMetres", + "type": "number" + }, + { + "allowRowDelete": false, + "headerRowsWrap": true, + "columns": [ + { + "noEdit": true, + "source": "quadratNumber", + "title": "Quadrat No.", + "type": "text", + "width": "10%" + }, + { + "source": "substrateType", + "title": "Substrate", + "type": "selectOne", + "width": "60%" + }, + { + "source": "rpdInMillimetres", + "title": "RPD (mm)", + "type": "number", + "width": "30%" + } + ], + "userAddedRows": false, + "disableTableUpload": true, + "source": "quadratData", + "type": "table" + } + ], + "class": "" + } + ], + "class": "" + }, + { + "type": "col", + "items": [ + { + "type": "row", + "items": [ + { + "boxed": true, + "title": "Location", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "source": "To mark the location of the survey on the map, click on the pin icon (on left) and drag to the location of your survey. Please use the zoom controls and be as accurate as possible. Click the pin icon to cancel and start again.", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "includeNotes": false, + "orientation": "vertical", + "computed": null, + "autoLocalitySearch": true, + "readonly": false, + "includeSource": false, + "includeAccuracy": false, + "hideSiteSelection": true, + "source": "location", + "type": "geoMap", + "includeLocality": false + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Location Name", + "source": "locationName", + "type": "text" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Region", + "source": "region", + "type": "selectOne" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Site Description (including environmental conditions)", + "source": "siteDescription", + "type": "textarea" + } + ] + }, + { + "type": "row", + "items": [ + { + "preLabel": "Location Photo", + "source": "locationPhoto", + "type": "image" + } + ] + } + ], + "class": "" + } + ] + }, + { + "computed": null, + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "boxed": true, + "title": "Photogrammetry Survey", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "preLabel": "Did you do a photogrammetry survey in conjunction with this survey?", + "source": "photogrammetrySurveyUndertaken", + "type": "selectOne" + }, + { + "preLabel": "Please provide the URL link to the photogrammetry survey associated with this survey.", + "source": "photogrammetrySurveyUrl", + "type": "text" + } + ] + } + ] + } + ], + "class": "" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "row", + "items": [ + { + "type": "col", + "items": [ + { + "boxed": true, + "title": "Species Records", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "source": "Enter the number of each species counted in each quadrat sampled. Record a description of any species that you could not identify. You can also make a note of the abundance using one of the temporary 'Unknown Species' types from the lists below. (Remember to also post a picture and description on the blog to see if others can help with the id.)", + "type": "literal" + } + ] + }, + { + "type": "row", + "items": [ + { + "boxed": true, + "title": "Plant Species", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "allowHeaderWrap": true, + "computed": null, + "columns": [ + { + "width": "15%", + "source": "speciesPlants", + "title": "Species", + "type": "speciesSelect" + }, + { + "width": "5%", + "source": "percentCoverQ1Plants", + "title": "Q1 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ2Plants", + "title": "Q2 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ3Plants", + "title": "Q3 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ4Plants", + "title": "Q4 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ5Plants", + "title": "Q5 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ6Plants", + "title": "Q6 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ7Plants", + "title": "Q7 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ8Plants", + "title": "Q8 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ9Plants", + "title": "Q9 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ10Plants", + "title": "Q10 % cover", + "type": "number" + }, + { + "width": "5%", + "source": "percentCoverQ11Plants", + "title": "Q11 % cover", + "type": "number" + }, + { + "width": "10%", + "source": "occurrenceRemarksPlants", + "title": "Species notes", + "type": "textarea" + }, + { + "width": "15%", + "source": "associatedMediaPlants", + "title": "Photo", + "type": "image" + } + ], + "disableTableUpload": true, + "allowRowDelete": true, + "userAddedRows": true, + "defaultRows": 1, + "source": "plantsTable", + "type": "table" + } + ] + } + ], + "class": "" + }, + { + "boxed": true, + "title": "Animal Species", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "allowHeaderWrap": true, + "computed": null, + "columns": [ + { + "width": "15%", + "source": "speciesAnimals", + "title": "Species", + "type": "speciesSelect" + }, + { + "width": "5%", + "source": "individualCountQ1Animals", + "title": "Q1 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ2Animals", + "title": "Q2 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ3Animals", + "title": "Q3 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ4Animals", + "title": "Q4 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ5Animals", + "title": "Q5 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ6Animals", + "title": "Q6 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ7Animals", + "title": "Q7 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ8Animals", + "title": "Q8 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ9Animals", + "title": "Q9 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ10Animals", + "title": "Q10 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ11Animals", + "title": "Q11 count", + "type": "number" + }, + { + "width": "10%", + "source": "occurrenceRemarksAnimals", + "title": "Species notes", + "type": "textarea" + }, + { + "width": "15%", + "source": "associatedMediaAnimals", + "title": "Photo", + "type": "image" + } + ], + "disableTableUpload": true, + "allowRowDelete": true, + "userAddedRows": true, + "defaultRows": 1, + "source": "animalsTable", + "type": "table" + } + ] + } + ], + "class": "" + }, + { + "boxed": true, + "title": "Infauna Species", + "type": "section", + "items": [ + { + "type": "row", + "items": [ + { + "allowHeaderWrap": true, + "computed": null, + "columns": [ + { + "width": "15%", + "source": "speciesInfauna", + "title": "Species", + "type": "speciesSelect" + }, + { + "width": "5%", + "source": "individualCountQ1Infauna", + "title": "Q1 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ2Infauna", + "title": "Q2 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ3Infauna", + "title": "Q3 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ4Infauna", + "title": "Q4 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ5Infauna", + "title": "Q5 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ6Infauna", + "title": "Q6 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ7Infauna", + "title": "Q7 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ8Infauna", + "title": "Q8 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ9Infauna", + "title": "Q9 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ10Infauna", + "title": "Q10 count", + "type": "number" + }, + { + "width": "5%", + "source": "individualCountQ11Infauna", + "title": "Q11 count", + "type": "number" + }, + { + "width": "10%", + "source": "occurrenceRemarksInfauna", + "title": "Species notes", + "type": "textarea" + }, + { + "width": "15%", + "source": "associatedMediaInfauna", + "title": "Photo", + "type": "image" + } + ], + "disableTableUpload": true, + "allowRowDelete": true, + "userAddedRows": true, + "defaultRows": 1, + "source": "infaunaTable", + "type": "table" + } + ] + } + ], + "class": "" + } + ] + } + ], + "class": "" + } + ] + } + ] + } + ] + }, + "modelName": null, + "templateName": "marineMetreSquaredTransectSurvey", + "optional": false, + "optionalQuestionText": null, + "title": null, + "collapsibleHeading": null, + "name": "Marine Metre Squared Transect Survey", + "description": null + } + ], + "type": "Assessment", + "category": "Assessment & monitoring", + "status": "active", + "lastUpdatedUserId": "", + "description": null, + "formVersion": 1 +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 95fe585c8..98e6bf658 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,8 +1,8 @@ -biocollectVersion=7.0 +biocollectVersion=7.1-SNAPSHOT grailsVersion=6.2.0 grailsGradlePluginVersion=6.1.2 assetPipelineVersion=4.3.0 -alaSecurityLibsVersion=6.3.0-SNAPSHOT +alaSecurityLibsVersion=6.3.0 seleniumVersion=3.12.0 groovyVersion=3.0.21 gorm.version=8.1.2 diff --git a/grails-app/assets/images/map-not-cached.png b/grails-app/assets/images/map-not-cached.png new file mode 100644 index 000000000..0f474dfce Binary files /dev/null and b/grails-app/assets/images/map-not-cached.png differ diff --git a/grails-app/assets/javascripts/MapUtilities.js b/grails-app/assets/javascripts/MapUtilities.js index 390e7e5bd..1f29f251b 100644 --- a/grails-app/assets/javascripts/MapUtilities.js +++ b/grails-app/assets/javascripts/MapUtilities.js @@ -133,7 +133,7 @@ Biocollect.MapUtilities = { var options = {baseLayer: undefined, otherLayers: {}}; baseLayers = baseLayers || []; baseLayers.forEach(function (baseLayer) { - var baseConfig = Biocollect.MapUtilities.getBaseLayer(baseLayer.code); + var baseConfig = Biocollect.MapUtilities.getBaseLayer(baseLayer.code, baseLayer); var title = baseConfig.title || baseLayer.displayText; if (baseLayer.isSelected) { options.baseLayer = baseConfig; @@ -156,15 +156,18 @@ Biocollect.MapUtilities = { /** * Get {L.tileLayer | L.Google} base map for a given code. * @param code + * @param config - used to get basemap url * @returns {L.tileLayer | L.Google} */ - getBaseLayer: function (code) { - var option, layer; + getBaseLayer: function (code, config) { + config = config || {}; + var option, layer, + url = config.url; switch (code) { case 'minimal': option = { // See https://cartodb.com/location-data-services/basemaps/ - url: 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png', + url: url || 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png', options: { subdomains: "abcd", attribution: 'Map data © OpenStreetMap, imagery © CartoDB', @@ -177,7 +180,7 @@ Biocollect.MapUtilities = { case 'worldimagery': option = { // see https://www.arcgis.com/home/item.html?id=10df2279f9684e4a9f6a7f08febac2a9 - url: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', + url: url || 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', options: { attribution: 'Tiles from Esri — Sources: Esri, DigitalGlobe, Earthstar Geographics, CNES/Airbus DS, GeoEye, USDA FSA, USGS, Aerogrid, IGN, IGP, and the GIS User Community', maxZoom: 21, @@ -186,10 +189,22 @@ Biocollect.MapUtilities = { }; layer = L.tileLayer(option.url, option.options); break; + case 'maptilersatellite': + option = { + url: url || 'https://api.maptiler.com/maps/hybrid/256/{z}/{x}/{y}.jpg?key=O11Deo7fBLatChkUYGIH', + options: { + attribution: '© MapTiler © OpenStreetMap contributors', + maxZoom: 21, + maxNativeZoom: 21 + } + }; + layer = L.tileLayer(option.url, option.options); + break; + case 'detailed': option = { // see https://wiki.openstreetmap.org/wiki/Standard_tile_layer - url: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + url: url || 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', options: { subdomains: "abc", attribution: '© OpenStreetMap contributors', @@ -202,7 +217,7 @@ Biocollect.MapUtilities = { case 'topographic': option = { // see https://www.arcgis.com/home/item.html?id=30e5fe3149c34df1ba922e6f5bbf808f - url: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}', + url: url || 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}', options: { attribution: 'Tiles from Esri — Sources: Esri, HERE, Garmin, Intermap, INCREMENT P, GEBCO, USGS, FAO, NPS, NRCAN, GeoBase, IGN, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), © OpenStreetMap contributors, GIS User Community', maxZoom: 21, diff --git a/grails-app/assets/javascripts/biocollect-utils.js b/grails-app/assets/javascripts/biocollect-utils.js new file mode 100644 index 000000000..8a5618b06 --- /dev/null +++ b/grails-app/assets/javascripts/biocollect-utils.js @@ -0,0 +1,115 @@ +var biocollect = { + utils: { + /** + * https://stackoverflow.com/a/20584396 + * @param node + * @returns {*} + */ + nodeScriptReplace: function nodeScriptReplace(node) { + if (biocollect.utils.nodeScriptIs(node) === true) { + node.parentNode.replaceChild(biocollect.utils.nodeScriptClone(node), node); + } else { + var i = -1, children = node.childNodes; + while (++i < children.length) { + biocollect.utils.nodeScriptReplace(children[i]); + } + } + + return node; + }, + + /** + * https://stackoverflow.com/a/20584396 + * @param node + * @returns {HTMLScriptElement} + */ + nodeScriptClone: function nodeScriptClone(node) { + var script = document.createElement("script"); + script.text = node.innerHTML; + + var i = -1, attrs = node.attributes, attr; + while (++i < attrs.length) { + script.setAttribute((attr = attrs[i]).name, attr.value); + } + return script; + }, + + /** + * https://stackoverflow.com/a/20584396 + * @param node + * @returns {boolean} + */ + nodeScriptIs: function nodeScriptIs(node) { + return node.tagName === 'SCRIPT'; + }, + readDocument: function readDocument(file) { + var deferred = $.Deferred(); + if (file) { + var reader = new FileReader(); + reader.onload = function (e) { + var contents = e.target.result; + deferred.resolve({data: {blob: contents, file: file}}); + }; + + reader.onerror = function (e) { + deferred.reject({message: "Failed to read file" + file.name}); + }; + + reader.readAsArrayBuffer(file); + } else { + deferred.reject(); + } + + return deferred.promise(); + }, + saveDocument: function saveDocument(result) { + var deferred = $.Deferred(), + file = result.data.file, + blob = result.data.blob, + document = biocollect.utils.createDocument(file, blob); + + if (window.entities) + window.entities.saveDocument(document).then(deferred.resolve, function (error) { + deferred.reject({data: document, error: error}); + }); + else + deferred.reject(); + + return deferred.promise(); + }, + fetchDocument: function fetchDocument(result) { + var documentId = result.data; + return window.entities.offlineGetDocument(documentId); + }, + addObjectURL: function addObjectURL(document) { + var url = ImageViewModel.createObjectURL(document); + if (url) { + document.thumbnailUrl = document.url = url; + } + }, + createDocument: function createDocument(file, blob) { + return { + blob: blob, + contentType: file.type, + filename: file.name, + name: file.name, + filesize: file.size, + dateTaken: new Date(file.lastModified).toISOStringNoMillis(), + staged: false, + attribution: "", + licence: "", + entityUpdated: true + }; + }, + getReturnToAddressForPWA: function getReturnToAddressForPWA() { + const context = new URL(window.location.href).searchParams.get('context'); + switch (context) { + case 'global': + return fcConfig.globalReturnToAddress; + case 'survey': + default: + return fcConfig.surveyReturnToAddress; + } + } + } +} \ No newline at end of file diff --git a/grails-app/assets/javascripts/enterBioActivityData.js b/grails-app/assets/javascripts/enterBioActivityData.js index d4737da09..8a22cf932 100644 --- a/grails-app/assets/javascripts/enterBioActivityData.js +++ b/grails-app/assets/javascripts/enterBioActivityData.js @@ -12,7 +12,8 @@ function validateDateField(dateField) { /* Master controller for page. This handles saving each model as required. */ function Master(activityId, config) { var self = this, - viewModel; + viewModel, + preventNavigationIfDirty = config.preventNavigationIfDirty === undefined ? true : config.preventNavigationIfDirty; self.subscribers = []; self.deferredObjects = []; @@ -87,6 +88,32 @@ function Master(activityId, config) { return activityData; }; + /** + * Does not check if model is dirty. + * @returns {{}|undefined} + */ + self.getAllModelAsJS = function () { + var activityData, outputs = []; + $.each(this.subscribers, function(i, obj) { + if (obj.model === 'activityModel') { + activityData = obj.get(); + } + else { + outputs.push(obj.get()); + } + }); + + if (activityData === undefined && outputs.length == 0) { + return undefined; + } + if (!activityData) { + activityData = {}; + } + activityData.outputs = outputs; + + return activityData; + }; + self.modelAsJSON = function() { var jsData = self.modelAsJS(); @@ -123,8 +150,7 @@ function Master(activityId, config) { self.listenForResolution = function () { $.when.apply($, self.deferredObjects).then(function () { - if (fcConfig.bulkUpload) - window.parent.postMessage({eventName: 'viewmodelloadded', data: {}}, fcConfig.originUrl); + window.parent.postMessage({eventName: 'viewmodelloadded', event:'viewmodelloadded', data: {}}, "*"); }); } @@ -141,6 +167,39 @@ function Master(activityId, config) { * Validates the entire page before saving. */ self.save = function () { + if (config.enableOffline) { + isOffline().then(function(){ + self.offlineSave(); + }, function() { + self.onlineSave(); + }); + } + else { + self.onlineSave(); + } + }, + + self.offlineSave = function () { + if ($('#validation-container').validationEngine('validate')) { + var toSave = this.getAllModelAsJS(); + toSave.entityUpdated = true; + var projectId = toSave.projectId; + var projectActivityId = toSave.projectActivityId; + toSave = JSON.stringify(toSave); + toSave = JSON.parse(toSave); + blockUIWithMessage("Saving activity data..."); + + entities.saveActivity(toSave).then(function (result) { + var activityId = result.data; + if (config.enableOffline) { + document.location.href = config.returnTo; + } else + document.location.href = fcConfig.activityViewURL + "/" + projectActivityId + "?activityId=" + activityId + "&projectId=" + projectId; + }); + } + }, + + self.onlineSave = function () { if ($('#validation-container').validationEngine('validate')) { var toSave = this.modelAsJS(); toSave = JSON.stringify(toSave); @@ -174,7 +233,8 @@ function Master(activityId, config) { } else { unblock = false; // We will be transitioning off this page. activityId = config.activityId || data.resp.activityId; - config.returnTo = config.bioActivityView + activityId; + if (!config.enableOffline) + config.returnTo = config.bioActivityView + activityId; blockUIWithMessage("Successfully submitted the record."); self.reset(); self.saved(); @@ -229,7 +289,8 @@ function Master(activityId, config) { } else if (config.isMobile) { location.href = config.returnToMobile; - } else { + } + else { document.location.href = config.returnTo; } }; @@ -260,7 +321,7 @@ function Master(activityId, config) { return viewModel; } - autoSaveModel(self, null, {preventNavigationIfDirty: true}); + autoSaveModel(self, null, {preventNavigationIfDirty: preventNavigationIfDirty}); }; function ActivityHeaderViewModel (act, site, project, metaModel, pActivity, config) { @@ -275,6 +336,7 @@ function ActivityHeaderViewModel (act, site, project, metaModel, pActivity, conf self.bulkImportId = ko.observable(act.bulkImportId); self.embargoed = ko.observable(false); self.projectId = act.projectId; + self.projectActivityId = pActivity ? pActivity.projectActivityId : null; // check if project activity requires manual verification by admin var verificationStatus = pActivity.adminVerification ? 'not verified' : 'not applicable'; @@ -297,29 +359,8 @@ function ActivityHeaderViewModel (act, site, project, metaModel, pActivity, conf } return true; }; - self.siteId = ko.vetoableObservable(act.siteId, self.confirmSiteChange); - - self.siteId.subscribe(function (siteId) { - - var matchingSite = $.grep(self.transients.pActivitySites, function (site) { - return siteId == site.siteId - })[0]; - - if (matchingSite && matchingSite.extent && matchingSite.extent.geometry) { - var geometry = matchingSite.extent.geometry; - if (geometry.pid) { - activityLevelData.siteMap.addWmsLayer(geometry.pid); - } else { - var geoJson = ALA.MapUtils.wrapGeometryInGeoJSONFeatureCol(geometry); - activityLevelData.siteMap.setGeoJSON(geoJson); - } - } - self.transients.site(matchingSite); - if (metaModel.supportsPhotoPoints) { - self.updatePhotoPointModel(matchingSite); - } - }); + self.siteId = ko.vetoableObservable(act.siteId, self.confirmSiteChange); self.goToProject = function () { if (self.projectId) { diff --git a/grails-app/assets/javascripts/forms-manifest.js b/grails-app/assets/javascripts/forms-manifest.js index 4775f880d..62345c4ef 100644 --- a/grails-app/assets/javascripts/forms-manifest.js +++ b/grails-app/assets/javascripts/forms-manifest.js @@ -1,3 +1,6 @@ +// from plugin +//= require utils.js + // leaflet //= require leaflet-manifest.js @@ -31,6 +34,7 @@ //= require forms.js // activity +//= require biocollect-utils.js //= require outputs.js //= require parser.js @@ -67,4 +71,9 @@ // comments //= require comment.js +// indexDB +// require dexiejs/dexie.js +//= require dexiejs/dexie.min.js +//= require entities.js + // audio to be included \ No newline at end of file diff --git a/grails-app/assets/javascripts/images.js b/grails-app/assets/javascripts/images.js deleted file mode 100644 index ec20c95b9..000000000 --- a/grails-app/assets/javascripts/images.js +++ /dev/null @@ -1,81 +0,0 @@ -function ImageViewModel(prop, skipFindingDocument) { - var self = this, document; - var documents - - // used by image gallery plugin. document is passed to the function. - if (!skipFindingDocument) { - // activityLevelData is a global variable - documents = activityLevelData.activity.documents; - // dereferencing the document using documentId - documents && documents.forEach(function (doc) { - // newer implementation is passing document object. - var docId = prop.documentId || prop; - if (doc.documentId === docId) { - prop = doc; - } - }); - } - - if (typeof prop !== 'object') { - console.error('Could not find the required document.') - return; - } - - self.dateTaken = ko.observable(prop.dateTaken || (new Date()).toISOStringNoMillis()).extend({simpleDate: false}); - self.contentType = ko.observable(prop.contentType); - self.url = prop.url; - self.filesize = prop.filesize; - self.thumbnailUrl = prop.thumbnailUrl || prop.url; - self.filename = prop.filename; - self.attribution = ko.observable(prop.attribution); - self.licence = ko.observable(prop.licence); - self.licenceDescription = prop.licenceDescription; - self.notes = ko.observable(prop.notes || ''); - self.name = ko.observable(prop.name); - self.formattedSize = formatBytes(prop.filesize); - self.staged = prop.staged || false; - self.documentId = prop.documentId || ''; - self.status = ko.observable(prop.status || 'active'); - self.projectName = prop.projectName; - self.projectId = prop.projectId; - self.activityName = prop.activityName; - self.activityId = prop.activityId; - self.isEmbargoed = prop.isEmbargoed; - self.identifier = prop.identifier; - - - self.remove = function (images, data, event) { - if (data.documentId) { - // change status when image is already in ecodata - data.status('deleted') - } else { - images.remove(data); - } - } - - self.getActivityLink = function () { - return fcConfig.activityViewUrl + '/' + self.activityId; - } - - self.getProjectLink = function () { - return fcConfig.projectIndexUrl + '/' + self.projectId; - } - - self.getImageViewerUrl = function () { - // Let the image viewer render high res image. - self.url = self.url ? self.url.split("/image/proxyImageThumbnailLarge?imageId=").join("/image/proxyImage?imageId=") : self.url; - return fcConfig.imageLeafletViewer + '?file=' + encodeURIComponent(self.url); - } - - self.summary = function () { - var picBy = 'Picture by ' + self.attribution() + '. '; - var takenOn = 'Taken on ' + self.dateTaken.formattedDate() + '.'; - var message = ''; - if (self.attribution()) { - message += picBy; - } - - message += takenOn; - return "

" + self.notes() + '

' + message + ''; - } -} \ No newline at end of file diff --git a/grails-app/assets/javascripts/knockout-custom-bindings.js b/grails-app/assets/javascripts/knockout-custom-bindings.js index 05b91c8a7..8c02359af 100644 --- a/grails-app/assets/javascripts/knockout-custom-bindings.js +++ b/grails-app/assets/javascripts/knockout-custom-bindings.js @@ -701,11 +701,10 @@ ko.bindingHandlers.ticks = { ko.bindingHandlers.fileUploadNoImage = { init: function (element, options) { - + var dropzone = $(element).parent(); var defaults = {autoUpload: true}; var settings = { - pasteZone: null, - dropZone: null + pasteZone: null, dropZone: dropzone }; $.extend(settings, defaults, options()); $(element).fileupload(settings).on('fileuploadadd', function (e, data) { diff --git a/grails-app/assets/javascripts/offline-list.js b/grails-app/assets/javascripts/offline-list.js new file mode 100644 index 000000000..931f59ae4 --- /dev/null +++ b/grails-app/assets/javascripts/offline-list.js @@ -0,0 +1,477 @@ +function ActivitiesViewModel (config) { + var self = this; + var projectActivityId = config.projectActivityId; + var projectId = config.projectId, + calledFromContext = projectActivityId === undefined ? "global" : "survey", + cancelOfflineCheck; + self.activities = ko.observableArray(); + self.pagination = new PaginationViewModel({}, self); + self.online = ko.observable(true); + self.disableUpload = ko.computed(function () { + return self.activities().length === 0 || !self.online(); + }); + // check if any activity is uploading + self.isUploading = ko.computed(function () { + var activities = self.activities(); + for (var i = 0; i < activities.length; i++) { + if (activities[i].uploading()) { + return true; + } + } + }); + + + self.init = function() { + document.addEventListener("online", function() { + self.online(true); + }); + document.addEventListener("offline", function() { + self.online(false); + }); + + cancelOfflineCheck = checkOfflineForIntervalAndTriggerEvents(); + } + + self.load = function(offset) { + if (projectActivityId) { + return self.getActivitiesOfProjectActivity(self.pagination.resultsPerPage() ,offset); + } + else if (projectId) { + return self.getActivitiesForProject(self.pagination.resultsPerPage(), offset); + } + else { + return self.getAllActivities(self.pagination.resultsPerPage(), offset); + } + }; + + self.refreshPage = function (offset) { + self.load(offset); + } + + self.getAllActivities = function(max, offset) { + return entities.offlineGetAllActivities(max, offset).then(function(result) { + var activities = result.data.activities, + total = result.data.total, + container = []; + + activities.forEach(function(activity) { + container.push(new ActivityViewModel(activity, self)); + }); + + self.activities(container); + self.pagination.loadOffset(offset, total); + }); + } + + self.getActivitiesForProject = function(max, offset) { + return entities.offlineGetActivitiesForProject(projectId, max, offset).then(function(result) { + var activities = result.data.activities, + total = result.data.total, + container = []; + + activities.forEach(function(activity) { + container.push(new ActivityViewModel(activity, self)); + }); + + self.activities(container); + self.pagination.loadOffset(offset, total); + }); + } + + self.getActivitiesOfProjectActivity = function(max, offset) { + return entities.getActivitiesForProjectActivity(projectActivityId, max, offset).then(function(result) { + var activities = result.data.activities, + total = result.data.total, + container = []; + + activities.forEach(function(activity) { + container.push(new ActivityViewModel(activity, self)); + }); + + self.activities(container); + self.pagination.loadPagination(offset, total); + }); + } + + self.uploadAllHandler = function() { + var activities = self.activities(), + index = 0; + + self.uploadAnActivity(activities, index); + } + + self.uploadAnActivity = function (activities, index) { + if (index < activities.length) { + activities[index].upload().then(function () { + self.uploadAnActivity(activities, index + 1); + }, function (error) { + console.error(error); + self.uploadAnActivity(activities, index + 1); + }); + } else { + // calling load with offset 0 will load the next batch of activities since current batch of activities are + // deleted from db. + if (self.pagination.totalResults() !== 0) + self.load(0).then(self.uploadAllHandler, function (error) { + console.error("Error loading next page of activities" + error); + }); + } + } + + /** + * Soft delete an activity from list + * @param activity + */ + self.remove = function(activity) { + self.activities.remove(activity); + } + + self.transients = { + addActivityUrl: function() { + return fcConfig.addActivityUrl + "/" + projectActivityId + "?context=" + calledFromContext; + }, + isProjectActivity: !!projectActivityId + } + + self.init(); + self.pagination.first(); +}; + +function ActivityViewModel (activity, parent) { + const IMAGE_DELETED_STATUS = 'deleted' + var self = this, images, loadPromise, + calledFromContext = getParameters().projectActivityId === undefined ? "global" : "survey"; + self.activityId = activity.activityId; + self.projectId = activity.projectId; + self.projectActivityId = activity.projectActivityId; + self.featureImage = ko.observable(); + self.species = ko.observableArray(); + self.surveyDate = ko.observable().extend({simpleDate: false}); + self.uploading = ko.observable(false); + self.disableUpload = ko.computed(function () { + return self.uploading() || !parent.online(); + }); + self.metaModel; + self.imageViewModels = []; + self.transients = { + viewActivityUrl: function() { + return fcConfig.activityViewUrl + "/" + self.projectActivityId + "?projectId=" + self.projectId + "&activityId=" + self.activityId + "&context=" + calledFromContext; + }, + editActivityUrl: function() { + return fcConfig.activityEditUrl + "/" + self.projectActivityId + "?unpublished=true&projectId=" + self.projectId + "&activityId=" + self.activityId + "&context=" + calledFromContext; + } + } + + self.load = function() { + loadPromise = entities.offlineGetMetaModel(activity.type).done(function(result) { + var metaModel = result.data, + imageViewModel, surveyDate; + self.metaModel = new MetaModel(metaModel); + self.species(self.metaModel.getDataForType("species", activity)); + surveyDate = self.metaModel.getDataForType("date", activity) + surveyDate = surveyDate && surveyDate[0] + if (surveyDate) { + self.surveyDate(surveyDate); + } + + self.imageViewModels = []; + images = self.metaModel.getDataForType("image", activity); + if (images && images.length > 0) { + images.forEach(function(image) { + imageViewModel = new ImageViewModel(image, true); + self.imageViewModels.push(imageViewModel); + if (!self.featureImage()) { + self.featureImage(imageViewModel); + } + }); + } + }); + } + + self.upload = function() { + var promises = [], + deferred = $.Deferred(), + forceOnline = false; + isOffline().then(function () { + alert("You are offline. Please connect to the internet and try again."); + deferred.reject(); + }, function () { + loadPromise.then(function (){ + try { + self.uploading(true); + promises.push(self.uploadImages()); + promises.push(self.uploadSite().then(self.updateActivityWithSiteId).then(self.saveAsNewSite)); + $.when.apply($, promises).then(function (imagesToDelete, oldSitesToDelete) { + self.saveActivityToDB().then(self.uploadActivity).then(self.deleteActivityFromDB).then(self.removeMeFromList).then(async function () { + self.uploading(false); + await self.deleteImages(imagesToDelete); + await self.deleteOldSite(oldSitesToDelete); + deferred.resolve({data: {activityId: activity.activityId}}); + }); + }, function (error) { + self.saveActivityToDB().then(function () { + self.uploading(false); + deferred.reject({ + data: {activityId: activity.activityId}, + message: "There was an error uploading activity", + error: error + }); + }); + }); + } + catch (error) { + console.error(error); + deferred.reject(); + alert("There was an error uploading activity"); + } + }, function () { + deferred.reject(); + alert("There was an error fetching metadata for activity"); + }); + }); + + return deferred.promise(); + } + + /** + * Hard delete an activity from the database + */ + self.deleteActivity = function() { + bootbox.confirm("This operation cannot be reversed. Are you sure you want to delete this activity?", function (result) { + if (result) { + self.uploading(true); + images = images || []; + var documentIds = images.map(image => image.documentId); + self.deleteImages({data:documentIds}).then(self.deleteSite).then(self.deleteActivityById).then(function (){ + parent.refreshPage(0); + }).then(function () { + self.uploading(false); + }, function () { + self.uploading(false); + }); + } + }) + } + + self.deleteSite = function () { + return entities.deleteSites([activity.siteId]); + } + + self.deleteActivityById = function () { + return self.deleteActivityFromDB({data: {oldActivityId: activity.activityId}}); + } + + self.removeMeFromList = function() { + parent.remove(self); + } + + self.uploadActivity = function() { + var oldActivityId = self.activityId; + if (entities.utils.isDexieEntityId(activity.activityId)) { + activity.activityId = undefined; + } + + var toSave = JSON.stringify(activity), + deferred = $.Deferred(), + url = fcConfig.bioActivityUpdate + "?pActivityId=" + activity.projectActivityId, + ajaxRequestParams = { + url: url, + type: 'POST', + data: toSave, + contentType: 'application/json', + success: function success(data) { + if (data && data.resp && data.resp.activityId) { + deferred.resolve({data: {oldActivityId: oldActivityId, activityId: data.resp.activityId }}); + } + else { + deferred.reject({data: {oldActivityId: oldActivityId, error: data.errors || data.error}}); + } + }, + error: function (jqXHR, status, error) { + deferred.reject({data: {activity: activity.activityId, error: error}}) + } + }; + + $.ajax(ajaxRequestParams); + return deferred.promise(); + } + + self.saveActivityToDB = function() { + return entities.saveActivity(activity); + } + + self.deleteActivityFromDB = function(result) { + var activityId = result.data.oldActivityId; + return entities.deleteActivities([activityId]); + } + + self.updateActivityWithSiteId = function(result) { + var siteId = result.data.siteId; + activity.siteId = siteId; + var sourceNames = self.metaModel.getNamesForDataType("geoMap"); + self.metaModel.updateDataForSources(sourceNames, activity, siteId); + return result; + } + + self.saveAsNewSite = function(result) { + var site = result.data.site; + if (site && isUuid(site.siteId)) { + entities.saveSite(site); + } + + return result; + } + + self.deleteOldSite = function(result) { + var siteId = result.data.oldSiteId; + if(entities.utils.isDexieEntityId(siteId)) { + return entities.deleteSites([siteId]); + } + else { + return $.Deferred().resolve(result); + } + } + + self.uploadSite = function() { + var siteId = self.metaModel.getDataForType("geoMap", activity)[0] || activity.siteId; + return entities.getSite(siteId).then(function(result) { + var site = result.data, + data = { + site: site, + pActivityId: activity.projectActivityId + }, + id = siteId, + deferred = $.Deferred(); + site['asyncUpdate'] = true; // aysnc update site metadata for performance improvement + if (entities.utils.isDexieEntityId(site.siteId)) { + id = site.siteId = undefined; + } + + $.ajax({ + method: 'POST', + url: id ? fcConfig.updateSiteUrl + "?id=" + id : fcConfig.updateSiteUrl, + data: JSON.stringify(data), + contentType: 'application/json', + dataType: 'json' + }).then(function (result) { + if (result.id) { + deferred.resolve({data: {siteId: result.id, oldSiteId: siteId, site: site}}); + } + else { + deferred.reject({data: result, error : "Site update failed."}); + } + }, function (jqXHR, status, error) { + // if site update fails, reject the promise only if it is a new site. + // if existing site is update is reject, resolve the promise with the site id. This helps sync the activity. + // update can be rejected if user does not have permission on all the project the site is associated. + if (entities.utils.isDexieEntityId(id)) { + deferred.reject({error : error}); + } + else { + deferred.resolve({data: {siteId: siteId, oldSiteId: siteId, site: site}}); + } + }); + + return deferred.promise(); + }); + } + + self.uploadImages = async function() { + var uploadedImages = [], + promises = [], deferred = $.Deferred(); + + for (var index = 0 ; index < self.imageViewModels.length; index++) { + var imageVM = self.imageViewModels[index]; + if (imageVM.isBlobDocument()) { + var image = images[index], promise; + if (image.documentId && entities.utils.isDexieEntityId(image.documentId)) { + if (imageVM.status() !== IMAGE_DELETED_STATUS) + uploadedImages.push(image.documentId); + } + + if (imageVM.status() !== IMAGE_DELETED_STATUS) + promise = self.uploadImage(imageVM).then(self.updateImageMetadata.bind(self, imageVM, image)) + promises.push(promise) + await promise; + } + + } + + $.when.apply($, promises).then(function () { + deferred.resolve({data:uploadedImages}); + }, function (){ + deferred.reject({error: "Image upload failed."}); + }); + + return deferred.promise(); + } + + self.updateImageMetadata = function(imageVM, image, stagedMetadata) { + $.extend(image, stagedMetadata); + imageVM.load(image, true); + if (entities.utils.isDexieEntityId(image.documentId)) { + // clear documentId so that BioCollect will create a new document for the image + image.documentId = undefined; + } + + return image; + } + + self.uploadImage = function(image) { + var formData = new FormData(); + var blob = image.getBlob(); + var file = new File([blob], image.filename, {type: image.contentType()}); + formData.append("files", file); + return $.ajax({ + url: fcConfig.imageUploadUrl, + type: "POST", + data: formData, + processData: false, + contentType: false + }) + .then(function (result) { + return (result.files && result.files[0]) || {}; + }); + } + + self.deleteImages = function(result) { + var imageIds = result.data; + return entities.bulkDeleteDocuments(imageIds).then(function() { + console.log("Successfully deleted images - " + imageIds.toString()); + }, function () { + console.error("Failed to delete images"); + }); + } + + self.load(); +} + +function getParameters (activity) { + var url = new URL(window.location.href); + return { + projectId: url.searchParams.get("projectId"), + projectActivityId: url.searchParams.get("projectActivityId") + } +} + +document.addEventListener("credential-saved", startInitialising); +document.addEventListener("credential-failed", function () { + alert("Error occurred while saving credentials. Please close modal and try again."); +}); + +window.addEventListener('load', function (){ + setTimeout(startInitialising, 2000); + // two event attributes for backward compatibility + window.parent && window.parent.postMessage({eventName: 'viewmodelloadded', event: 'viewmodelloadded', data: {}}, "*"); +}); + +function startInitialising () { + window.uninitialised = window.uninitialised || false; + entities.getCredentials().then(function (result) { + var config = getParameters(), + activitiesViewModel = new ActivitiesViewModel(config); + + !window.uninitialised && ko.applyBindings(activitiesViewModel); + window.uninitialised = true; + }) +} \ No newline at end of file diff --git a/grails-app/assets/javascripts/outputs.js b/grails-app/assets/javascripts/outputs.js index 7cefb6a54..6e2279629 100644 --- a/grails-app/assets/javascripts/outputs.js +++ b/grails-app/assets/javascripts/outputs.js @@ -320,10 +320,31 @@ ko.bindingHandlers.imageUpload = { } window.decreaseAsyncCounter && window.decreaseAsyncCounter(); }).on('fileuploadfail', function(e, data) { - error(data.errorThrown); + if (fcConfig.enableOffline) { + isOffline().then(function () { + var file = data.files[0]; + file && biocollect.utils.readDocument(file).then(biocollect.utils.saveDocument).then(biocollect.utils.fetchDocument).then(addToViewModel); + }, + function () { + error(data.errorThrown); + }); + } + else { + error(data.errorThrown); + } + window.decreaseAsyncCounter && window.decreaseAsyncCounter(); }); + function addToViewModel(result) { + var viewModel; + biocollect.utils.addObjectURL(result.data); + viewModel = new ImageViewModel(result.data, true); + target.push(viewModel); + complete(true); + return viewModel; + }; + ko.applyBindingsToDescendants(innerContext, element); return { controlsDescendantBindings: true }; diff --git a/grails-app/assets/javascripts/pwa-bio-activity-create-or-edit-manifest.js b/grails-app/assets/javascripts/pwa-bio-activity-create-or-edit-manifest.js new file mode 100644 index 000000000..64d98087c --- /dev/null +++ b/grails-app/assets/javascripts/pwa-bio-activity-create-or-edit-manifest.js @@ -0,0 +1,8 @@ +//= require base-bs4.js +//= require jstz/jstz.min.js +//= require common-bs4.js +//= require forms-manifest.js +//= require enterBioActivityData.js +//= require biocollect-utils.js +//= require pwa-messages.js +//= require pwa-form-initialisation-script.js diff --git a/grails-app/assets/javascripts/pwa-bio-activity-index-manifest.js b/grails-app/assets/javascripts/pwa-bio-activity-index-manifest.js new file mode 100644 index 000000000..e0c8f885b --- /dev/null +++ b/grails-app/assets/javascripts/pwa-bio-activity-index-manifest.js @@ -0,0 +1,9 @@ +//= require jstz/jstz.min.js +//= require base-bs4.js +//= require common-bs4.js +//= require knockout-custom-bindings.js +//= require forms-manifest.js +//= require enterBioActivityData.js +//= require biocollect-utils.js +//= require pwa-messages.js +//= require pwa-form-initialisation-script.js \ No newline at end of file diff --git a/grails-app/assets/javascripts/pwa-cache.js b/grails-app/assets/javascripts/pwa-cache.js new file mode 100644 index 000000000..4a3e7027a --- /dev/null +++ b/grails-app/assets/javascripts/pwa-cache.js @@ -0,0 +1,65 @@ +var projectPromise, paPromise; +var surveyName = "Dung Beetle Monitoring", listId = "dr2683", limit=5, query = "", offset = 0; +var db = getDB(); + +function fetchProject() { + if (!projectPromise) { + projectPromise = $.ajax({ + url: fcConfig.projectURL + }); + } + + return projectPromise; +} + +function saveProject (project) { + var deferred = $.Deferred(); + + db.project.put(project).then(function (projectId) { + deferred.resolve({message: "Saved project to db", success: true, data: project}); + }).catch(function () { + deferred.reject({message: "Failed to save project to db", success: false}); + }); + + return deferred.promise(); +} + +function fetchProjectActivity () { + if (!paPromise) { + paPromise = $.ajax({ + url: fcConfig.projectActivityURL + }); + } + + return paPromise; +} + +function saveProjectActivity (pa) { + var deferred = $.Deferred(); + + db.projectActivity.put(pa).then(function () { + deferred.resolve({message: "Saved project activity to db", success: true, data: pa}); + }).catch(function () { + deferred.reject({message: "Failed to save project activity to db", success: false}); + }); + + return deferred.promise(); +} + +fetchProject().then(saveProject).then(fetchProjectActivity).then(saveProjectActivity).done(function (result) { + var pa = result.data; + var promises = []; + pa.speciesFields && pa.speciesFields.forEach(function (field) { + console.log("fetching species"); + promises.push(updateDBForField(field.dataFieldName, field.output)); + }); + + $.when.apply($, promises).always(function () { + console.log("Starting to fetch sites"); + fetchSites(pa.sites, 0).done(function (result) { + console.log(result.message); + }); + }); +}).fail(function () { + alert("Failed to fetch species configuration for survey"); +}); \ No newline at end of file diff --git a/grails-app/assets/javascripts/pwa-form-initialisation-script.js b/grails-app/assets/javascripts/pwa-form-initialisation-script.js new file mode 100644 index 000000000..c32ec47a1 --- /dev/null +++ b/grails-app/assets/javascripts/pwa-form-initialisation-script.js @@ -0,0 +1,45 @@ +var initialisedSuccessfully = false, + delay = 2000; +document.addEventListener("credential-saved", renderPage); +document.addEventListener("credential-failed", function (e) { + alert("Error occurred while saving credentials"); +}); + +window.addEventListener("load", function (e) { + setTimeout(renderPage, delay); +}); + +function renderPage() { + if (initialisedSuccessfully) { + return; + } + + entities.getCredentials().then(function (result) { + var credentials = result.data; + if (credentials && credentials.length > 0) { + var credential = credentials[0]; + var authorization = "Bearer " + credential.token; + $.ajax({ + url: fcConfig.htmlFragmentURL, + dataType: 'html', + headers: { + 'Authorization': authorization + }, + success: function (html) { + // makes sure comments are not removed. Important from KnockoutJS perspective. + const constHtml = html; + initialisedSuccessfully = true; + var element = document.querySelector("#form-placeholder"); + element.innerHTML = constHtml; + biocollect.utils.nodeScriptReplace(element); + getMetadataAndInitialise(); + }, + error: function (){ + alert("Error occurred while getting content. Close the modal and try again. If the problem persists, contact the administrator."); + } + }); + } + }, function () { + alert("Error occurred while getting credentials"); + }); +} \ No newline at end of file diff --git a/grails-app/assets/javascripts/pwa-index.js b/grails-app/assets/javascripts/pwa-index.js new file mode 100644 index 000000000..661c7b1f6 --- /dev/null +++ b/grails-app/assets/javascripts/pwa-index.js @@ -0,0 +1,750 @@ +async function downloadMapTiles(bounds, tileUrl, minZoom, maxZoom, callback) { + minZoom = minZoom || 0; // Minimum zoom level + maxZoom = maxZoom || 20; // Maximum zoom level + const MAX_PARALLEL_REQUESTS = 10; + + var deferred = $.Deferred(), requestArray = []; + // Check if the browser supports the Cache API + if ('caches' in window) { + // Function to fetch and cache the vector basemap tiles for a bounding box at different zoom levels + try { + // Loop through each zoom level + for (let zoom = minZoom; zoom <= maxZoom; zoom++) { + // Loop through the tiles within the bounding box at the current zoom level + var coordinates = getTileCoordinatesForBoundsAtZoom(bounds, zoom), + xMin = coordinates[0][0], + xMax = coordinates[1][0], + yMin = coordinates[0][1], + yMax = coordinates[1][1]; + + for (let x = xMin; x <= xMax; x++) { + for (let y = yMin; y <= yMax; y++) { + try { + const requestUrl = tileUrl.replace('{z}', zoom).replace('{x}', x).replace('{y}', y); + + // Open the cache + const cache = await caches.open(cacheName); + + // Check if the tile is already cached + const cachedResponse = await cache.match(requestUrl); + + if (!cachedResponse) { + console.log(`Tile at zoom ${zoom}, x ${x}, y ${y} not found in cache. Fetching and caching...`); + + // run x number of queries in parallel + if (requestArray.length <= MAX_PARALLEL_REQUESTS) { + requestArray.push(fetch(requestUrl).then(function (response) { + // Clone the response, as it can only be consumed once + const responseClone = response.clone(); + + // Cache the response + cache.put(requestUrl, responseClone); + })); + } else { + await Promise.all(requestArray); + requestArray = []; + } + + console.log(`Tile at zoom ${zoom}, x ${x}, y ${y} cached.`); + } else { + console.log(`Tile at zoom ${zoom}, x ${x}, y ${y} found in cache.`); + } + } catch (e) { + console.error("Error fetching tiles" + e); + } + + callback && callback(); + } + } + } + + if (requestArray.length > 0) { + await Promise.all(requestArray); + } + console.log('Vector basemap tiles cached for the bounding box.'); + deferred.resolve(); + } catch (error) { + console.error('Error caching vector basemap: ' + error); + deferred.reject(); + } // Call the function to cache the vector basemap tiles for the bounding box + } else { + console.log('Cache API not supported in this browser.'); + deferred.reject(); + } + + return deferred.promise(); +} + +async function deleteMapTiles(bounds, tileUrl, minZoom, maxZoom, callback) { + minZoom = minZoom || 0; // Minimum zoom level + maxZoom = maxZoom || 20; // Maximum zoom level + + var deferred = $.Deferred(); + // Check if the browser supports the Cache API + if ('caches' in window) { + // Function to fetch and cache the vector basemap tiles for a bounding box at different zoom levels + try { + // Loop through each zoom level + for (let zoom = minZoom; zoom <= maxZoom; zoom++) { + // Loop through the tiles within the bounding box at the current zoom level + var coordinates = getTileCoordinatesForBoundsAtZoom(bounds, zoom), + xMin = coordinates[0][0], + xMax = coordinates[1][0], + yMin = coordinates[0][1], + yMax = coordinates[1][1]; + + for (let x = xMin; x <= xMax; x++) { + for (let y = yMin; y <= yMax; y++) { + const requestUrl = tileUrl.replace('{z}', zoom).replace('{x}', x).replace('{y}', y); + + // Open the cache + const cache = await caches.open(cacheName); + + // Check if the tile is already cached + await cache.delete(requestUrl); + + callback && callback(); + } + } + } + + console.log('Vector basemap tiles cached for the bounding box.'); + deferred.resolve(); + } catch (error) { + console.error('Error caching vector basemap: ' + error); + deferred.reject(); + } // Call the function to cache the vector basemap tiles for the bounding box + } else { + console.log('Cache API not supported in this browser.'); + deferred.reject(); + } + + return deferred.promise(); +} + +function getTileCoordinatesForBoundsAtZoom (bounds, zoom) { + var nLat = bounds.getNorth(), + sLat = bounds.getSouth(), + wLng = bounds.getWest(), + eLng = bounds.getEast(), + xWest = tileXCoordinateFromLatLng(nLat, wLng, zoom), + xEast = tileXCoordinateFromLatLng(sLat, eLng, zoom), + yNorth = tileYCoordinateFromLatLng(nLat, eLng, zoom), + ySouth = tileYCoordinateFromLatLng(sLat, wLng, zoom), + xMin = Math.min(xWest, xEast), + xMax = Math.max(xWest, xEast), + yMin = Math.min(yNorth, ySouth), + yMax = Math.max(yNorth, ySouth); + + // each zoom level should have at least 25 tiles i.e. 5 in each axis + if ((yMax - yMin) * (xMax - xMin) < minNumberOfTilesPerZoom) { + var xDiff = xMax - xMin, + yDiff = yMax - yMin, + xAddEachSide = Math.floor((maxTilesPerAxis - xDiff) / 2), + yAddEachSide = Math.floor((maxTilesPerAxis - yDiff) / 2), + max = Math.pow(2, zoom) - 1; + + xMin -= xAddEachSide; + xMax += xAddEachSide; + yMin -= yAddEachSide; + yMax += yAddEachSide; + xMin = xMin < 0 ? 0 : xMin; + xMax = xMax > max ? max : xMax; + yMin = yMin < 0 ? 0 : yMin; + yMax = yMax > max ? max : yMax; + } + + return [[xMin, yMin], [xMax, yMax]]; +} + +function totalTilesForBoundsAtZoom (bounds, zoom) { + var coordinates = getTileCoordinatesForBoundsAtZoom(bounds, zoom), + xMin = coordinates[0][0], + xMax = coordinates[1][0], + yMin = coordinates[0][1], + yMax = coordinates[1][1]; + + return (xMax - xMin + 1) * (yMax - yMin + 1); +} + +function totalTilesForBounds(bounds, minZoom, maxZoom) { + var totalTiles = 0; + for (var zoom = minZoom; zoom <= maxZoom; zoom++) { + totalTiles += totalTilesForBoundsAtZoom(bounds, zoom); + } + + return totalTiles; +} + +// Function to convert longitude to tile coordinate +function tileXCoordinateFromLatLng(lat, lng, zoom) { + var latLng = L.latLng(lat, lng); + return Math.floor(crs.latLngToPoint(latLng, zoom).x / tileSize); +} + +// Function to convert latitude to tile coordinate +function tileYCoordinateFromLatLng(lat, lng, zoom) { + var latLng = L.latLng(lat, lng); + return Math.floor(crs.latLngToPoint(latLng, zoom).y / tileSize); +} + +function OfflineViewModel(config) { + var self = this, + minZoom = config.minZoom || 0, + maxZoom = config.maxZoom || 20, + mapId = config.mapId, + overlayLayersMapControlConfig = Biocollect.MapUtilities.getOverlayConfig(), + mapOptions = { + autoZIndex: false, + zoomToObject: true, + preserveZIndex: true, + addLayersControlHeading: false, + drawControl: false, + showReset: false, + draggableMarkers: false, + useMyLocation: true, + maxAutoZoom: maxZoom, + maxZoom: maxZoom, + minZoom: minZoom, + allowSearchLocationByAddress: true, + allowSearchRegionByAddress: true, + trackWindowHeight: false, + baseLayer: L.tileLayer(config.baseMapUrl, config.baseMapOptions), + wmsFeatureUrl: overlayLayersMapControlConfig.wmsFeatureUrl, + wmsLayerUrl: overlayLayersMapControlConfig.wmsLayerUrl + }, + alaMap = new ALA.Map(mapId, mapOptions), + mapImpl = alaMap.getMapImpl(), + pa = null, + project = null, + mapSection = config.mapSection || "mapSection"; + + self.stages = {metadata: 'metadata', species: 'species', map: 'map', form: 'form', sites: "sites"}; + self.statuses = {done: 'downloaded', doing: 'downloading', error: 'error', wait: 'waiting'}; + self.currentStage = ko.observable(); + self.metadataStatus = ko.observable(self.statuses.wait); + self.speciesStatus = ko.observable(self.statuses.wait); + self.sitesStatus = ko.observable(self.statuses.wait); + self.mapStatus = ko.observable(self.statuses.wait); + self.formStatus = ko.observable(self.statuses.wait); + self.isOnline = ko.observable(true); + self.name = ko.observable(); + self.downloading = ko.observable(false); + self.offlineMaps = ko.observableArray([]); + self.bounds = ko.observable(mapImpl.getBounds()); + self.areaInKmOfBounds = ko.pureComputed(function () { + var bounds = self.bounds(); + return bounds && (area( bounds ) / Math.pow(10, 6)); + }) + self.numberOfTilesDownloaded = ko.observable(0); + self.totalNumberOfTiles = ko.observable(1); + self.progress = ko.observable(0); + self.totalCount = ko.observable(1); + self.numberOfFormsDownloaded = ko.observable(0); + self.totalFormDownload = ko.observable(1); + self.loadMetadata = ko.observable(false); + self.totalSiteTilesDownload = ko.observable(1); + self.numberOfSiteTilesDownloaded = ko.observable(0); + self.percentageFormDownloaded = ko.pureComputed(function (){ + return Math.round(self.numberOfFormsDownloaded() / self.totalFormDownload() * 100); + }); + self.percentageSitesDownloaded = ko.pureComputed(function (){ + return Math.round(self.numberOfSiteTilesDownloaded() / self.totalSiteTilesDownload() * 100); + }); + self.isSurveyOfflineCapable = ko.computed(function () { + var statuses = [self.metadataStatus(), self.formStatus(), self.speciesStatus(), self.mapStatus(), self.sitesStatus()] + if (statuses.every(item => item === self.statuses.done)) { + window.parent && window.parent.postMessage && window.parent.postMessage({event: "download-complete"}, "*"); + } + else { + window.parent && window.parent.postMessage && window.parent.postMessage({event: "download-removed"}, "*"); + } + }); + + self.canMapBeOffline = ko.pureComputed(function () { + return self.offlineMaps().length > 0; + }); + self.showSpeciesProgressBar = ko.pureComputed(function () { + return self.progress() > 0; + }); + self.downloadPercentageComplete = ko.pureComputed(function () { + return Math.round(self.numberOfTilesDownloaded() / self.totalNumberOfTiles() * 100); + }); + self.canDownload = ko.computed(function () { + return !!self.name() && self.isBoundsWithinMaxArea(); + }); + self.isBoundsWithinMaxArea = ko.pureComputed(function () { + var bounds = self.bounds(); + return area(bounds) <= maxArea; + }); + + self.speciesDownloadPercentageComplete = ko.pureComputed(function (){ + return Math.round(self.progress() / self.totalCount() * 100); + }); + + self.offlineMaps.subscribe(offlineMapCheck); + self.currentStage.subscribe(function (stage) { + switch (stage) { + case self.stages.metadata: + getProjectActivityMetadata(); + break; + case self.stages.form: + startDownloadingSurveyForms(); + break; + case self.stages.species: + startDownloadingSpecies(); + break; + case self.stages.sites: + startDownloadingSites(); + break; + case self.stages.map: + offlineMapCheck(); + break; + } + }); + + function offlineMapCheck() { + if (self.canMapBeOffline()) { + self.mapStatus(self.statuses.done); + } + else { + self.mapStatus(self.statuses.error); + } + } + + self.clickSpeciesDownload = function () { + self.progress(0); + self.totalCount(1); + entities.deleteSpeciesForProjectActivity(pa).then(function () { + entities.getSpeciesForProjectActivity(pa, updateSpeciesProgressBar).then(completedSpeciesDownload, errorSpeciesDownload); + }); + } + + self.clickDownload = function () { + if (self.canDownload()) { + var bounds = self.bounds(), + baseMapUrl = config.baseMapUrl, + minZoom = config.minZoom || 0; + + self.downloading(true); + self.numberOfTilesDownloaded(0); + self.totalNumberOfTiles(totalTilesForBounds(bounds, minZoom, maxZoom)); + downloadMapTiles(bounds, config.baseMapUrl, minZoom, maxZoom, function () { + self.numberOfTilesDownloaded(self.numberOfTilesDownloaded() + 1); + }).finally(function () { + self.numberOfTilesDownloaded(0); + self.totalNumberOfTiles(1); + self.downloading(false); + entities.saveMap({ + name: self.name(), + bounds: self.getBoundsArray(bounds), + baseMapUrl: baseMapUrl + }).then(function (result) { + self.getOfflineMaps(); + }); + }); + } + } + + self.getOfflineMaps = function () { + entities.getMaps().then(function (result) { + var maps = result.data; + self.offlineMaps(maps); + }); + } + + self.checkSiteInOfflineDownload = function (data) { + var deferred = $.Deferred(); + entities.getMaps().then(function (result) { + var maps = result.data; + var found = maps.find(function (map) { + return map.name === data.name; + }); + + deferred.resolve(!!found, data); + }, deferred.reject); + + return deferred.promise(); + } + + self.getBoundsArray = function (bounds) { + return [{lat: bounds.getNorth(), lng:bounds.getWest()}, {lat: bounds.getSouth(), lng:bounds.getEast()}]; + } + + self.getBoundsFromArray = function (boundsArray) { + var nw = L.latLng(boundsArray[0]), + se = L.latLng(boundsArray[1]); + + return L.latLngBounds(nw, se); + } + + self.preview = function (data) { + var data = this, + boundsArray = data.bounds, + bounds = self.getBoundsFromArray(boundsArray); + + bounds && mapImpl.fitBounds(bounds); + } + + self.removeMe = function () { + var data = this, + boundsArray = data.bounds, + bounds = self.getBoundsFromArray(boundsArray), + minZoom = 14; + + if (data && data.id) { + deleteMapTiles(bounds, data.baseMapUrl).finally(function () { + entities.deleteMap(data.id).then(function (){ + self.offlineMaps.remove(data); + }); + }); + } + } + + self.scrollToMapSection = function () { + var offset = $("#" + mapSection).offset(); + + if (offset) { + $("html, body").animate({ + scrollTop: offset.top + 'px' + }); + } + } + + function area(bounds) { + var pt1 = new L.LatLng(bounds.getNorth(), bounds.getWest()), + pt2 = new L.LatLng(bounds.getNorth(), bounds.getEast()), + pt3 = new L.LatLng(bounds.getSouth(), bounds.getEast()), + pt4 = new L.LatLng(bounds.getSouth(), bounds.getWest()), + area = pt1.distanceTo(pt2) * pt3.distanceTo(pt4); + + console.log(area); + return area; + } + + function SiteSelectionViewModel(sites){ + var self = this, + deferred = $.Deferred(); + self.chosenSites = ko.observableArray(); + self.sites = ko.observableArray(sites); + self.ok = function () { + self.close(); + deferred.resolve(self.chosenSites()); + } + self.siteSearchValue = ko.observable(""); + self.tempSearchValue = ko.observable(""); + self.searchSitesHandler = function () { + self.tempSearchValue(self.siteSearchValue()); + } + self.clearSearch = function () { + self.siteSearchValue(""); + self.tempSearchValue(""); + } + self.isSiteVisible = function (site) { + var name = (site.name || "").trim().toLowerCase(), + query = self.tempSearchValue().trim().toLowerCase(); + return name.indexOf(query) > -1; + }; + + self.cancel = function () { + self.close(); + deferred.resolve(); + } + + self.close = function () { + self.modal && self.modal.close(); + } + + self.promise = deferred.promise(); + } + + /** + * Downloads base map tiles and wms layer of a site for offline use. + * It is done for all sites of a project activity. + * @returns {Promise} + */ + async function startDownloadingSites() { + const TIMEOUT = 3000, // 3 seconds + MAP_LOAD_TIMEOUT = 1000, // 1 seconds + MAX_ZOOM=20, + MIN_ZOOM= 10, + MAX_SITES_DOWNLOADABLE = 30; + var sites = pa.sites || [], zoom = 15, mapZoomedInIndicator, tileLoadedPromise, cancelTimer, + selectedSites = [], + callback = function () { + cancelTimer && clearTimeout(cancelTimer); + cancelTimer = null; + // resolve it in the next event loop + if(mapZoomedInIndicator && mapZoomedInIndicator.state() == 'pending') { + // setTimeout(function () { + mapZoomedInIndicator && mapZoomedInIndicator.resolve(); + // }, 0); + } + }; + self.currentStage(self.stages.sites); + self.sitesStatus(self.statuses.doing); + alaMap.registerListener('dataload', callback); + sites.sort(function (a, b) { + var aName = (a.name || "").trim(), + bName = (b.name || "").trim(); + return aName.localeCompare(bName) + }); + + if (sites.length > MAX_SITES_DOWNLOADABLE) { + var selectionModel = new SiteSelectionViewModel(sites); + var modal = Biocollect.Modals.showModal({ + viewModel: selectionModel, + template: 'ChooseSites' + }); + + selectedSites = await selectionModel.promise; + selectedSites = selectedSites || []; + } else { + selectedSites = sites; + } + + try { + self.numberOfSiteTilesDownloaded(0); + self.totalSiteTilesDownload(selectedSites.length); + for (var i = 0; i < selectedSites.length; i++) { + try { + var site = selectedSites[i], + geoJson = Biocollect.MapUtilities.featureToValidGeoJson(site.extent.geometry), + geoJsonLayer = alaMap.setGeoJSON(geoJson, { + wmsFeatureUrl: overlayLayersMapControlConfig.wmsFeatureUrl, + wmsLayerUrl: overlayLayersMapControlConfig.wmsLayerUrl, + maxZoom: MAX_ZOOM + }), + bounds; + + // so that layer zooms beyond default max zoom of 18 + geoJsonLayer.options.maxZoom = MAX_ZOOM; + mapZoomedInIndicator = $.Deferred(); + // cancel waiting for map to load feature data + cancelTimer = setTimeout(function () { + mapZoomedInIndicator && mapZoomedInIndicator.resolve(); + }, TIMEOUT); + + // no need to wait if promise is resolved. + if (mapZoomedInIndicator && mapZoomedInIndicator.state() == 'pending') { + // wait for map layer to load feature data from spatial server for pid. + await mapZoomedInIndicator.promise(); + } + + // zoom into to map to get tiles and feature from spatial server + for (zoom = MIN_ZOOM; zoom <= MAX_ZOOM; zoom++) { + tileLoadedPromise = $.Deferred(); + mapImpl.setZoom(zoom, {animate: false}); + timer(MAP_LOAD_TIMEOUT, tileLoadedPromise); + if (zoom === MIN_ZOOM) + bounds = mapImpl.getBounds(); + await tileLoadedPromise.promise(); + } + + // save site to offline map list + self.checkSiteInOfflineDownload({ + name: site.name, + bounds: self.getBoundsArray(bounds) + }).then(function (found, data) { + if (!found) { + entities.saveMap({ + name: data.name, + bounds: data.bounds, + baseMapUrl: config.baseMapUrl + }).then(function (result) { + self.getOfflineMaps(); + }); + } + }) + alaMap.clearLayers(); + self.numberOfSiteTilesDownloaded(self.numberOfSiteTilesDownloaded() + 1); + bounds = null; + } + catch (e) { + console.log("Error downloading site " + selectedSites[i].siteId + " " + selectedSites[i].name); + } + } + + alaMap.removeListener('dataload', callback); + completedSitesDownload(); + } catch (e) { + console.error(e); + errorSitesDownload(); + } + } + + function timer(ms, deferred) { + return setTimeout(deferred.resolve, ms); + } + + function completedSitesDownload() { + updateSitesProgressBar(self.totalCount(), self.totalCount()); + self.sitesStatus(self.statuses.done); + if (self.mapStatus() != self.statuses.done) { + self.mapStatus(self.statuses.doing); + self.currentStage(self.stages.map); + } + } + + function errorSitesDownload() { + self.sitesStatus(self.statuses.error); + showReloadPrompt(); + } + + function startDownloadingSpecies() { + self.currentStage(self.stages.species); + self.speciesStatus(self.statuses.doing); + entities.getSpeciesForProjectActivity(pa, updateSpeciesProgressBar).then(completedSpeciesDownload, errorSpeciesDownload); + } + + function updateSitesProgressBar (total, count) { + self.totalCount(total); + self.progress(count); + } + + function completedSpeciesDownload() { + updateSpeciesProgressBar(self.totalCount(), self.totalCount()); + self.speciesStatus(self.statuses.done); + self.sitesStatus(self.statuses.doing); + self.currentStage(self.stages.sites); + } + + function errorSpeciesDownload() { + self.speciesStatus(self.statuses.error); + showReloadPrompt(); + } + + function updateSpeciesProgressBar (total, count) { + self.totalCount(total); + self.progress(count); + } + + function startDownloadingSurveyForms() { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.getRegistration().then( function (){ + self.formStatus(self.statuses.doing); + downloadProjectActivityArtefacts(self).then(completedFormDownload, errorFormDownload); + }, errorFormDownload); + } + else { + errorFormDownload(); + } + } + + function completedFormDownload() { + self.formStatus(self.statuses.done); + self.currentStage(self.stages.species); + self.speciesStatus(self.statuses.doing); + } + + function errorFormDownload() { + self.formStatus(self.statuses.error); + showReloadPrompt(); + } + + function showReloadPrompt () { + bootbox.confirm({ + title: 'Failed to take survey offline', + message: 'Encountered an error while taking survey offline. Click reload to try again. Contact administrator if problem persists.', + buttons: { + cancel: { + label: ' Cancel' + }, + confirm: { + label: ' Reload' + } + }, + callback: function (result) { + if (result) { + window.location.reload(); + } + } + }); + } + + function getProjectActivityMetadata() { + self.metadataStatus(self.statuses.doing); + return entities.getProjectActivityMetadata(config.projectActivityId, undefined).then(function (result) { + var data = result.data, + deferred = $.Deferred(); + pa = data.pActivity; + project = data.project; + entities.saveSites(pa.sites).then(completedMetadataDownload, errorMetadataDownload); + return deferred.promise(); + }); + } + + function completedMetadataDownload() { + self.metadataStatus(self.statuses.done); + self.currentStage(self.stages.form); + self.formStatus(self.statuses.doing); + } + + function errorMetadataDownload() { + self.metadataStatus(self.statuses.error); + showReloadPrompt(); + } + + if (!config.doNotInit) { + (function init() { + alaMap.registerListener('zoomend', function () { + self.bounds(mapImpl.getBounds()); + }) + + self.getOfflineMaps(); + self.currentStage(self.stages.metadata); + })(); + } +} + + +function downloadProjectActivityArtefacts(viewModel) { + var IFRAME_ID = 'form-content', + iframeWindow, + delay = 4 * 60 * 1000, // four minutes + deferred = $.Deferred(); + + var urls = [fcConfig.createActivityUrl, fcConfig.indexActivityUrl, fcConfig.offlineListUrl, fcConfig.settingsUrl], + urlsIndex = 0; + + document.addEventListener('view-model-loaded',function () { + increaseFormDownloadedCount(); + ++urlsIndex; + loadIframe(); + }); + + function loadIframe () { + if (urlsIndex < urls.length) { + var url = urls[urlsIndex], + iframe = document.getElementById(IFRAME_ID); + iframe.src = url; + iframeWindow = iframe.contentWindow; + rejectPromiseIfErrorLoadingPage(urlsIndex); + increaseFormDownloadedCount(); + } else { + console.info("Finished downloading artefacts!"); + deferred.resolve(); + } + } + + function increaseFormDownloadedCount () { + viewModel.numberOfFormsDownloaded(viewModel.numberOfFormsDownloaded() + 1); + } + + function rejectPromiseIfErrorLoadingPage (index) { + setTimeout(function () { + if (index == urlsIndex) { + deferred.reject(); + } + }, delay); + } + + function init(){ + viewModel.totalFormDownload(urls.length * 2); + viewModel.numberOfFormsDownloaded(0); + loadIframe(); + } + + init(); + return deferred.promise(); +}; \ No newline at end of file diff --git a/grails-app/assets/javascripts/pwa-manifest.js b/grails-app/assets/javascripts/pwa-manifest.js new file mode 100644 index 000000000..967050932 --- /dev/null +++ b/grails-app/assets/javascripts/pwa-manifest.js @@ -0,0 +1,13 @@ +//= require base-bs4.js +//= require knockout/3.4.0/knockout-3.4.0.js +//= require knockout-custom-bindings.js +//= require knockout-custom-extenders.js +//= require bootbox/bootbox.min.js +//= require utils.js +//= require dexiejs/dexie.js +//= require ala-map-no-jquery-us.js +//= require MapUtilities.js +//= require entities.js +//= require modals.js +//= require pwa-messages.js +//= require pwa-index.js diff --git a/grails-app/assets/javascripts/pwa-messages.js b/grails-app/assets/javascripts/pwa-messages.js new file mode 100644 index 000000000..7ed92167c --- /dev/null +++ b/grails-app/assets/javascripts/pwa-messages.js @@ -0,0 +1,20 @@ +window.addEventListener('message', function(event) { + var type = event.data.event; + switch (type) { + case 'viewmodelloadded': + // fired by the iframe when the view model is loaded + var viewModelLoadedEvent = new Event('view-model-loaded'); + document.dispatchEvent(viewModelLoadedEvent); + break; + case 'credentials': + entities.saveCredentials(event.data.data).then(function (){ + var credentialSavedEvent = new Event('credential-saved'); + document.dispatchEvent(credentialSavedEvent); + }, function (){ + var credentialFailedEvent = new Event('credential-failed'); + document.dispatchEvent(credentialFailedEvent); + }); + break; + } + +}) \ No newline at end of file diff --git a/grails-app/assets/javascripts/pwa-offline-list-manifest.js b/grails-app/assets/javascripts/pwa-offline-list-manifest.js new file mode 100644 index 000000000..856900c51 --- /dev/null +++ b/grails-app/assets/javascripts/pwa-offline-list-manifest.js @@ -0,0 +1,18 @@ +//= require jquery/3.4.1/jquery-3.4.1.min.js +//= require knockout/3.4.0/knockout-3.4.0.js +//= require dexiejs/dexie.js +//= require emitter/emitter.js +//= require moment/moment.min.js +//= require moment/moment-timezone-with-data.min.js +//= require bootstrap4/js/bootstrap.bundle.min.js +//= require bootbox/bootbox.min.js +//= require knockout-dates.js +//= require fieldcapture-application.js +//= require enterBioActivityData.js +//= require images.js +//= require entities.js +//= require metamodel.js +//= require utils.js +//= require pagination.js +//= require pwa-messages.js +//= require offline-list.js \ No newline at end of file diff --git a/grails-app/assets/javascripts/pwa-settings-manifest.js b/grails-app/assets/javascripts/pwa-settings-manifest.js new file mode 100644 index 000000000..a3c358b5d --- /dev/null +++ b/grails-app/assets/javascripts/pwa-settings-manifest.js @@ -0,0 +1,8 @@ +//= require jquery/3.4.1/jquery-3.4.1.min.js +//= require knockout/3.4.0/knockout-3.4.0.js +//= require utils.js +//= require dexiejs/dexie.js +//= require bootstrap4/js/bootstrap.bundle.min.js +//= require bootbox/bootbox.min.js +//= require entities.js +//= require pwa-settings.js \ No newline at end of file diff --git a/grails-app/assets/javascripts/pwa-settings.js b/grails-app/assets/javascripts/pwa-settings.js new file mode 100644 index 000000000..3c9d97612 --- /dev/null +++ b/grails-app/assets/javascripts/pwa-settings.js @@ -0,0 +1,88 @@ +function StorageViewModel() { + var self = this, + deleteSteps = ['cache', 'db']; + self.maximum = ko.observable(); + self.used = ko.observable(); + self.free = ko.observable(); + self.percentage = ko.computed(function () { + return Math.round(self.used() / self.maximum() * 100); + }); + self.isOffline = ko.observable(false); + self.deleteProgress = ko.observable(0); + self.deleteSteps = ko.observable(deleteSteps.length); + self.deletePercentage = ko.computed(function () { + return Math.round(self.deleteProgress() / self.deleteSteps() * 100); + }); + self.supported = ko.observable(true); + self.refresh = function () { + if (navigator.storage && navigator.storage.estimate) { + navigator.storage.estimate().then( + ({ usage, quota }) => { + var gbUnit = 1024 * 1024 * 1024; + self.maximum(quota / gbUnit); + self.used(usage / gbUnit); + self.free(self.maximum() - self.used()); + }, + error => console.warn(`error estimating quota: ${error.name}: ${error.message}`) + ); + } + else { + self.supported(false); + } + } + + self.clearAll = function () { + self.deleteProgress(0); + bootbox.confirm("This operation cannot be reversed. Are you sure you want to delete?", function (result) { + if (result) { + self.deleteCache().then(self.deleteDBEntries).then(function () { + self.deleteProgress(self.deleteSteps()); + notifyParent(); + }); + } + }); + } + + self.deleteCache = function () { + return caches.keys().then(function (cacheNames) { + return Promise.all( + cacheNames.map(function (cacheName) { + return caches.delete(cacheName); + }) + ); + }).then(function () { + self.refresh(); + self.deleteProgress(self.deleteProgress() + 1); + }); + } + + self.deleteDBEntries = function () { + return entities.deleteTable('offlineMap').then(function () { + return entities.deleteTable('taxon').then(function () { + self.deleteProgress(self.deleteProgress() + 1); + }); + }); + } + + function notifyParent() { + window.parent && window.parent.postMessage({event: "surveys-removed"}, "*"); + } + + document.addEventListener('offline', function () { + self.isOffline(true); + }); + + document.addEventListener('online', function () { + self.isOffline(false); + }); + + self.refresh(); +} + +function initialise() { + var storageViewModel = new StorageViewModel(); + ko.applyBindings(storageViewModel, document.getElementById('storage-settings')); + checkOfflineForIntervalAndTriggerEvents(5000); +} + +$(document).ready(initialise); \ No newline at end of file diff --git a/grails-app/assets/javascripts/sw.js b/grails-app/assets/javascripts/sw.js new file mode 100644 index 000000000..75244aa4c --- /dev/null +++ b/grails-app/assets/javascripts/sw.js @@ -0,0 +1,111 @@ +console.debug("SW Script: start reading"); +importScripts("/pwa/config.js"); +self.addEventListener('install', e => { + // activate SW immediately. This avoids the need to close pages controlled by old SW. + self.skipWaiting(); + // Remove unwanted caches + e.waitUntil( + caches.keys().then(cacheNames => { + return Promise.all( + cacheNames.map(cache => { + if (pwaConfig.oldCacheToDelete === cache) { + console.log('Service Worker: Clearing Old Cache'); + return caches.delete(cache); + } + }) + ); + }) + ); + + e.waitUntil(precache()); + console.log("SW: Install"); +}); +self.addEventListener('activate', e => { + e.waitUntil(self.clients.claim()); + console.log("SW: Activated"); +}); + +self.addEventListener('fetch', e => { + console.log('Service Worker: Fetching'); + e.respondWith( + fetch(e.request) + .then(res => { + // Make copy/clone of response + const resClone = res.clone(); + // Open cache + if (res.ok) { + caches.open(pwaConfig.cacheName).then(cache => { + var path = getPath(e.request.url); + if (!ignoreCachingForPath(path)) { + path = getCachePath(e.request.url); + cache.put(path, resClone); + } + }); + } + + return res; + }) + .catch(err => { + var path = getPath(e.request.url); + if (!ignoreCachingForPath(path)) { + path = getCachePath(e.request.url); + return caches.match(path).then(res => { + if (res) { + return res; + } + else if (isFetchingBaseMap(e.request.url)) { + return caches.match(pwaConfig.noCacheTileFile).then(res => { + if (res) { + return res; + } + }); + } + }); + } + + return err; + }) + ); +}); +console.debug("SW Script: completed registering listeners"); +function getPath(url) { + return new URL(url).pathname; +} + +function getCachePath(url) { + var path = new URL(url).pathname; + for (var i in pwaConfig.cachePathForRequestsStartingWith) { + var cachePath = pwaConfig.cachePathForRequestsStartingWith[i]; + if (path.indexOf(cachePath) === 0) { + return path; + } + } + + return url; +} + +function ignoreCachingForPath(urlPath) { + for (var i in pwaConfig.pathsToIgnoreCache) { + var path = pwaConfig.pathsToIgnoreCache[i]; + if (urlPath.indexOf(path) == 0) { + return true; + } + } + + return false; +} + +function isFetchingBaseMap (url) { + return url.indexOf(pwaConfig.baseMapPrefixUrl) === 0; +} + +async function precache() { + const cache = await caches.open(pwaConfig.cacheName); + + for(var i = 0; i < pwaConfig.filesToPreCache.length; i++) { + await cache.delete(pwaConfig.filesToPreCache[i]); + } + + return cache.addAll(pwaConfig.filesToPreCache); +} +console.debug("SW Script: end reading"); \ No newline at end of file diff --git a/grails-app/assets/javascripts/works.js b/grails-app/assets/javascripts/works.js index 421e028e7..b7ba6fd7c 100644 --- a/grails-app/assets/javascripts/works.js +++ b/grails-app/assets/javascripts/works.js @@ -434,6 +434,39 @@ function PlanViewModel(config) { placeholder = config.placeholder, sites = config.sites; + /** + * Moved resolveSites since this function conflict with resolveSites from utils.js + * It is for projects which contain a list of site ids instead of sites + * e.g workprojects + * @param sites + * @param addNotFoundSite + * @returns {Array} + */ + window.resolveSites = function resolveSites(sites, addNotFoundSite) { + var resolved = []; + sites = sites || []; + + sites.forEach(function (siteId) { + var site; + if(typeof siteId === 'string'){ + site = lookupSite(siteId); + + if(site){ + resolved.push(site); + } else if(addNotFoundSite && siteId) { + resolved.push({ + name: 'User created site', + siteId: siteId + }); + } + } else if(typeof siteId === 'object'){ + resolved.push(siteId); + } + }); + + return resolved; + } + self.userIsCaseManager = ko.observable(fcConfig.isCaseManager); self.selectedWorksActivityViewModel = ko.observable(); self.canEditOutputTargets = ko.computed(function() { @@ -787,12 +820,10 @@ function PlanStage(stage, activities, planViewModel, isCurrentStage, project) { }); }; - function lookupSiteName (siteId) { var site = lookupSite(siteId) || {}; return site.name; } - function lookupSite (siteId) { var site; if (siteId !== undefined && siteId !== '') { @@ -805,38 +836,6 @@ function lookupSite (siteId) { } } } -/** -* It is for projects which contain a list of site ids instead of sites - * e.g workprojects -* @param sites -* @param addNotFoundSite -* @returns {Array} - */ -function resolveSites(sites, addNotFoundSite) { - var resolved = []; - sites = sites || []; - - sites.forEach(function (siteId) { - var site; - if(typeof siteId === 'string'){ - site = lookupSite(siteId); - - if(site){ - resolved.push(site); - } else if(addNotFoundSite && siteId) { - resolved.push({ - name: 'User created site', - siteId: siteId - }); - } - } else if(typeof siteId === 'object'){ - resolved.push(siteId); - } - }); - - return resolved; -} - function drawGanttChart(ganttData) { if (ganttData.length > 0) { $("#gantt-container").gantt({ diff --git a/grails-app/assets/stylesheets/pwa-bio-activity-create-or-edit-manifest.css b/grails-app/assets/stylesheets/pwa-bio-activity-create-or-edit-manifest.css new file mode 100644 index 000000000..eec2edd51 --- /dev/null +++ b/grails-app/assets/stylesheets/pwa-bio-activity-create-or-edit-manifest.css @@ -0,0 +1,4 @@ +/* + *= require base-bs4.css + *= require forms-manifest.css + */ \ No newline at end of file diff --git a/grails-app/assets/stylesheets/pwa-bio-activity-index-manifest.css b/grails-app/assets/stylesheets/pwa-bio-activity-index-manifest.css new file mode 100644 index 000000000..7a34b0103 --- /dev/null +++ b/grails-app/assets/stylesheets/pwa-bio-activity-index-manifest.css @@ -0,0 +1,5 @@ +/* + *= require base-bs4.css + *= require forms-manifest.css + *= require mobile_activity.css + */ \ No newline at end of file diff --git a/grails-app/assets/stylesheets/pwa-manifest.css b/grails-app/assets/stylesheets/pwa-manifest.css new file mode 100644 index 000000000..851d55e95 --- /dev/null +++ b/grails-app/assets/stylesheets/pwa-manifest.css @@ -0,0 +1,7 @@ +/* +*= require base-bs4.css +*= require all.css +*= require v4-shims.css +*= require ala-map.css +*= require Control.FullScreen.css +*/ \ No newline at end of file diff --git a/grails-app/assets/stylesheets/pwa-offline-list-manifest.css b/grails-app/assets/stylesheets/pwa-offline-list-manifest.css new file mode 100644 index 000000000..2d3c4f7b0 --- /dev/null +++ b/grails-app/assets/stylesheets/pwa-offline-list-manifest.css @@ -0,0 +1,3 @@ +/** + *= require base-bs4.css + */ \ No newline at end of file diff --git a/grails-app/assets/stylesheets/pwa-settings-manifest.css b/grails-app/assets/stylesheets/pwa-settings-manifest.css new file mode 100644 index 000000000..2d3c4f7b0 --- /dev/null +++ b/grails-app/assets/stylesheets/pwa-settings-manifest.css @@ -0,0 +1,3 @@ +/** + *= require base-bs4.css + */ \ No newline at end of file diff --git a/grails-app/assets/vendor/responsive-table-stacked/stacked.js b/grails-app/assets/vendor/responsive-table-stacked/stacked.js index 8c29af798..9be7a6326 100644 --- a/grails-app/assets/vendor/responsive-table-stacked/stacked.js +++ b/grails-app/assets/vendor/responsive-table-stacked/stacked.js @@ -14,13 +14,16 @@ * * Created by Temi on 26/02/16. */ -$(document).ready(function() { - $('table:not(.not-stacked-table)').each(function(index, item){ +$(document).ready(initResponsiveTable).on('form-initialised', initResponsiveTable); +$(window).resize(initResponsiveTable); + +function initResponsiveTable(){ + $('table:not(.not-stacked-table):not(.responsive-table-stacked)').each(function(index, item){ $(this).addClass('responsive-table-stacked').parent().addClass('overflow-table'); addAttributeToTd(item) watch(this, addAttributeToTd) }); -}); +} /** * adding data-th attribute to td elements of the table. this attribute is used to display diff --git a/grails-app/conf/application.groovy b/grails-app/conf/application.groovy index 55e423b07..0bae3f49e 100644 --- a/grails-app/conf/application.groovy +++ b/grails-app/conf/application.groovy @@ -101,6 +101,8 @@ environments { grails.mail.port = 3025 // com.icegreen.greenmail.util.ServerSetupTest.SMTP.port temp.dir="/tmp/stylesheet" google.maps.apiKey="testGoogleApi" + speciesCatalog.dir="./src/integration-test/resources/data" + userProfile.userIdAttribute="userid" } production { @@ -145,6 +147,39 @@ webservice['jwt-scopes'] = "ala/internal users/read ala/attrs ecodata/read_test webservice['client-id']='changeMe' webservice['client-secret'] = 'changeMe' +speciesCatalog = [ + url: "To be set", + fileName: "combined.zip", + vernacularFileName: "vernacularname.txt", + taxonFileName: "taxon.txt", + totalFileName: "total.json", + batchSize: 1000, + dir: "/data/biocollect/speciesCatalog", + filters: [ + language: "en", + exclude: [ + unrankedValue: "unranked" + ] + ], + taxon: [ + headerNames: [ + guid: "taxonID", + scientificName: "scientificName", + rankString: "taxonRank", + name: "scientificName" + ] + ], + vernacular: [ + headerNames: [ + taxonID: "taxonID", + vernacularName: "vernacularName", + language: "language", + preferred: "isPreferredName" + ] + ] +] + + dataAccessMethods = [ "oasrdfs", "oaordfs", @@ -687,3 +722,11 @@ if (!app.file.script.path) { app.file.script.path = "/data/biocollect/scripts" } script.read.extensions.list = ['js','min.js','png', 'json', 'jpg', 'jpeg'] + +// yml interpreter doesn't evaluate expression in deep nested objects such as baseLayers below +pwaMapConfig = { def config -> + Map pwa = config.getProperty('pwa', Map) + Map mapConfig = pwa.mapConfig + mapConfig.baseLayers.getAt(0).url = pwa.baseMapUrl + pwa.apiKey + mapConfig +} \ No newline at end of file diff --git a/grails-app/conf/application.yml b/grails-app/conf/application.yml index b2aced28e..273a0962e 100644 --- a/grails-app/conf/application.yml +++ b/grails-app/conf/application.yml @@ -308,5 +308,32 @@ grails: cors: enabled: true +--- +#pwa +pwa: + appUrl: "http://localhost:5173" + cache: + ignore: ["/image/upload", "/ws/attachment/upload"] + maxAreaInKm: 25 + tileSize: 256 + apiKey: "" + cacheVersion: "v3" + oldCacheToDelete: "v2" + serviceWorkerConfig: + pathsToIgnoreCache: [ "/image/upload", "/ws/attachment/upload", "/ajax/keepSessionAlive", "/noop", '/pwa/sw.js', '/pwa/config.js', "/ws/species/speciesDownload" ] + cachePathForRequestsStartingWith: [ "/pwa/bioActivity/edit/", "/pwa/createOrEditFragment/", "/pwa/bioActivity/index/", "/pwa/indexFragment/", "/pwa/offlineList" ] + filesToPreCache: ["webjars/leaflet/0.7.7/dist/images/layers.png", "webjars/leaflet/0.7.7/dist/images/layers-2x.png", "webjars/leaflet/0.7.7/dist/images/marker-icon.png", "webjars/leaflet/0.7.7/dist/images/marker-icon-2x.png", "webjars/leaflet/0.7.7/dist/images/marker-shadow.png", "map-not-cached.png", "font-awesome/5.15.4/svgs/regular/image.svg"] + baseMapPrefixUrl: "https://api.maptiler.com/maps/hybrid/256" + noCacheTileFile: "map-not-cached.png" + baseMapUrl: "${pwa.serviceWorkerConfig.baseMapPrefixUrl}/{z}/{x}/{y}.jpg?key=" + mapConfig: + baseLayers: + - code: 'maptilersatellite' + displayText: 'Satellite' + isSelected: true + attribution: '© MapTiler © OpenStreetMap contributors' + overlays: [ ] + +--- fathom: - enabled: true \ No newline at end of file + enabled: true diff --git a/grails-app/controllers/au/org/ala/biocollect/BioActivityController.groovy b/grails-app/controllers/au/org/ala/biocollect/BioActivityController.groovy index 7f56c6162..718c9ebc7 100644 --- a/grails-app/controllers/au/org/ala/biocollect/BioActivityController.groovy +++ b/grails-app/controllers/au/org/ala/biocollect/BioActivityController.groovy @@ -25,6 +25,7 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirement import io.swagger.v3.oas.annotations.security.SecurityScheme import org.apache.commons.io.FilenameUtils import org.apache.http.HttpStatus +import org.apache.http.entity.ContentType import org.grails.web.json.JSONArray import org.springframework.context.MessageSource import org.springframework.web.multipart.MultipartFile @@ -244,6 +245,179 @@ class BioActivityController { model } + def pwaCreateOrEdit(String projectActivityId) { + Map model = [projectActivityId: projectActivityId, activityId: ""] + if(projectActivityId) { + Map pActivity = projectActivityService.get(projectActivityId, "all", params?.version) + + if(!pActivity.error) { + model.title = messageSource.getMessage('pwa.record.create.title', [].toArray(), '', Locale.default) + String projectId = model.projectId = pActivity.projectId + Map project = projectService.get(projectId, "brief", params?.version) + if (!project.error) { + model.project = project + model.pActivity = pActivity + model.type = pActivity.pActivityFormName + // disable showing verification status on pwa + model.isUserAdminModeratorOrEditor = false + render view: "pwaBioActivityCreateOrEdit", model: model + return + } else { + flash.message = "Project associated with project activity not found" + render status: HttpStatus.SC_NOT_FOUND + return + } + } else { + flash.message = "Project Activity not found" + render status: HttpStatus.SC_NOT_FOUND + return + } + } else { + flash.message = "Project Activity Id must be provided" + render status: HttpStatus.SC_BAD_REQUEST + } + } + + @PreAuthorise(accessLevel = "loggedInUser") + def pwaCreateOrEditFragment(String projectActivityId) { + Map model = [projectActivityId: projectActivityId, activityId: ""] + if(projectActivityId) { + Map pActivity = projectActivityService.get(projectActivityId, "all", params?.version) + + if(!pActivity.error) { + model.title = messageSource.getMessage('pwa.record.create.title', [].toArray(), '', Locale.default) + String projectId = model.projectId = pActivity.projectId + Map project = projectService.get(projectId, "brief", params?.version) + if (!project.error) { + model.project = project + model.pActivity = pActivity + model.type = pActivity.pActivityFormName + // disable showing verification status on pwa + model.isUserAdminModeratorOrEditor = false + addOutputModel(model, model.type) + render view: "pwaBioActivityCreateOrEditFragment", model: model + return + } else { + flash.message = "Project associated with project activity not found" + render status: HttpStatus.SC_NOT_FOUND + return + } + } else { + flash.message = "Project Activity not found" + render status: HttpStatus.SC_NOT_FOUND + return + } + } else { + flash.message = "Project Activity Id must be provided" + render status: HttpStatus.SC_BAD_REQUEST + } + } + + def getProjectActivityMetadata (String projectActivityId, String activityId) { + Map activity + String userId = userService.getCurrentUserId() + Map pActivity = projectActivityService.get(projectActivityId, "all") + if (pActivity.error) { + render text: [message: "An error occurred when accessing project activity"] as JSON, status: HttpStatus.SC_INTERNAL_SERVER_ERROR, contentType: ContentType.APPLICATION_JSON + return + } + + String projectId = pActivity?.projectId + String type = pActivity.pActivityFormName + Map project = projectService.get(projectId) + if(project.error) { + render text: [message: "An error occurred when accessing project"] as JSON, status: HttpStatus.SC_INTERNAL_SERVER_ERROR, contentType: ContentType.APPLICATION_JSON + return + } + + if (activityId) { + activity = activityService.get(activityId, params?.version, userId, true) + if(activity.error) { + render text: [message: "An error occurred when accessing activity"] as JSON, status: HttpStatus.SC_INTERNAL_SERVER_ERROR, contentType: ContentType.APPLICATION_JSON + return + } + } else { + activity = [activityId: '', siteId: '', projectId: projectId, type: type] + } + + Map userPermission = checkUserPermission(project, pActivity, activityId ? activity : null) + if (!userPermission.authorized) { + render text: [message: userPermission.message] as JSON, status: HttpStatus.SC_UNAUTHORIZED, contentType: ContentType.APPLICATION_JSON + return + } + + Map model = activityAndOutputModel(activity, projectId, 'view', params?.version, pActivity?.pActivityFormName) + model.pActivity = pActivity + model.project = project + model.speciesConfig = [surveyConfig: [speciesFields: pActivity?.speciesFields]] + model.projectName = project.name + model.isUserAdminModeratorOrEditor = false + + render text: model as JSON, status: HttpStatus.SC_OK, contentType: ContentType.APPLICATION_JSON + } + + @PreAuthorise(accessLevel = "loggedInUser") + def pwaIndexFragment(String projectActivityId) { + String projectId + def model = [:] + def pActivity = projectActivityService.get(projectActivityId, "all", params?.version) + if(pActivity.error) { + render text: [message: "An error occurred when accessing project activity"] as JSON, contentType: ContentType.APPLICATION_JSON, status: HttpStatus.SC_INTERNAL_SERVER_ERROR + return + } + + model.pActivity = pActivity + model.projectActivityId = projectActivityId + projectId = model.projectId = pActivity?.projectId + String type = pActivity.pActivityFormName + Map project = projectService.get(projectId) + if (project.error) { + render text: [message: "An error occurred when accessing project"] as JSON, status: HttpStatus.SC_INTERNAL_SERVER_ERROR, contentType: ContentType.APPLICATION_JSON + return + } + + addOutputModel(model, type) + model.project = project + model.id = projectActivityId + render view: 'pwaBioActivityIndexFragment', model: model + } + + def pwaIndex(String projectActivityId) { + String projectId + def model = [:] + def pActivity = projectActivityService.get(projectActivityId, "all", params?.version) + if(pActivity.error) { + render text: [message: "An error occurred when accessing project activity"] as JSON, contentType: ContentType.APPLICATION_JSON, status: HttpStatus.SC_INTERNAL_SERVER_ERROR + return + } + + model.pActivity = pActivity + model.projectActivityId = projectActivityId + projectId = model.projectId = pActivity?.projectId + String type = pActivity.pActivityFormName + Map project = projectService.get(projectId) + if (project.error) { + render text: [message: "An error occurred when accessing project"] as JSON, status: HttpStatus.SC_INTERNAL_SERVER_ERROR, contentType: ContentType.APPLICATION_JSON + return + } + + model.project = project + model.id = projectActivityId + render view: 'pwaBioActivityIndex', model: model + } + + def pwaOfflineList() { + } + + def pwa () { + } + + def pwaConfig () { + } + + def pwaSettings () { + } + /** * Preview activity survey form template * @param formName Survey form name @@ -365,7 +539,7 @@ class BioActivityController { model.speciesConfig = [surveyConfig: [speciesFields: pActivity?.speciesFields]] model.projectName = project.name model.returnTo = params.returnTo ? params.returnTo : g.createLink(controller: 'project', id: projectId) - model.autocompleteUrl = "${request.contextPath}/search/searchSpecies/${pActivity.projectActivityId}?limit=10" + model.autocompleteUrl = "${request.contextPath}/search/searchSpecies?projectActivityId=${pActivity.projectActivityId}&limit=10" model.isUserAdminModeratorOrEditor = projectService.isUserAdminForProject(userId, projectId) || projectService.isUserModeratorForProject(userId, projectId) || projectService.isUserEditorForProject(userId, projectId) addOutputModel(model) addDefaultSpecies(activity) @@ -378,6 +552,77 @@ class BioActivityController { model } + /** + * Check if user can create an activity or edit an activity + */ + private Map checkUserCreatePermission (Map project, Map pActivity) { + Map result = [ message: "Access denied: You are not allowed to create activity", authorized: false ] + String userId = userService.getCurrentUserId() + String projectId = project?.projectId + + if (!userId) { + result.message = "Access denied: You are not logged in." + } + else if (isProjectActivityClosed(pActivity)) { + result.message = "Access denied: This survey is closed." + } + else if (!pActivity.publicAccess && !projectService.canUserEditProject(userId, projectId, false)) { + result.message = "Access denied: Only members associated to this project can submit record. For more information, please contact ${grailsApplication.config.biocollect.support.email.address}" + } + else if (projectService.canUserEditProject(userId, projectId, false) || + (pActivity.publicAccess && userId)) { + result.message = "User is authorized to create or edit activity" + result.authorized = true + } + + return result + } + + private Map checkUserEditPermission (Map project, Map activity) { + Map result = [ message: "Access denied: You are not allowed to edit activity", authorized: false ] + String userId = userService.getCurrentUserId() + String projectId = project?.projectId + + if (!userId) { + result.message = "Only members associated to this project can submit record. For more information, please contact ${grailsApplication.config.biocollect.support.email.address}" + } else if (!activity || activity.error) { + result.message = "Invalid activity - ${id}" + } else if (projectService.canUserModerateProjects(userId, projectId) || activityService.isUserOwnerForActivity(userId, activity?.activityId)) { + result.message = "User is authorized to edit activity" + result.authorized = true + } + + return result + } + + private Map checkUserViewPermission (Map project, Map pActivity, Map activity) { + Map result = [ message: "Access denied: You are not allowed to edit activity", authorized: false ] + String userId = userService.getCurrentUserId() + String projectId = project?.projectId + Boolean embargoed = (activity.embargoed == true) || projectActivityService.isEmbargoed(pActivity) + + if (!userId) { + result.message = "Only members associated to this project can submit record. For more information, please contact ${grailsApplication.config.biocollect.support.email.address}" + } else if (!activity || activity.error) { + result.message = "Invalid activity - ${id}" + } else if (embargoed) { + result.message = "Access denied: This activity is embargoed." + } else if (projectService.isUserEditorForProjects(userId, projectId) || activityService.isUserOwnerForActivity(userId, activity?.activityId)) { + result.message = "User is authorized to edit activity" + result.authorized = true + } + + return result + } + + private Map checkUserPermission (Map project, Map pActivity, Map activity) { + if (activity) { + return checkUserViewPermission(project, pActivity, activity) + } else { + return checkUserCreatePermission(project, pActivity) + } + } + private editActivity(String id, boolean mobile = false){ String userId = userService.getCurrentUserId() def activity = activityService.get(id) @@ -566,6 +811,32 @@ class BioActivityController { } } + def ajaxGet(String id) { + String userId = userService.getCurrentUserId() + def activity = activityService.get(id, params?.version, userId, true) + if (activity.error) { + render status: HttpStatus.SC_INTERNAL_SERVER_ERROR, text: [message: activity.error] as JSON, contentType: ContentType.APPLICATION_JSON + return + } + + def pActivity = projectActivityService.get(activity?.projectActivityId, "all", params?.version) + boolean embargoed = (activity.embargoed == true) || projectActivityService.isEmbargoed(pActivity) + boolean userIsOwner = userId && activityService.isUserOwnerForActivity(userId, id) + boolean userIsModerator = userId && projectService.canUserModerateProjects(userId, pActivity?.projectId) + boolean userIsAlaAdmin = userService.userIsAlaOrFcAdmin() + + if (activity && pActivity) { + if (embargoed && !userIsModerator && !userIsOwner && !userIsAlaAdmin) { + def payload = [message: "Access denied: You do not have permission to access the requested resource."] + render status: HttpStatus.SC_UNAUTHORIZED, text: payload as JSON, contentType: ContentType.APPLICATION_JSON + } else { + render text: activity as JSON, contentType: ContentType.APPLICATION_JSON + } + } else { + render status: HttpStatus.SC_NOT_FOUND, text: [message: "Activity not found"] as JSON, contentType: ContentType.APPLICATION_JSON + } + } + /** * List all activity associated to the user based on their role. * @param id activity id @@ -1257,7 +1528,7 @@ class BioActivityController { private Map activityModel(activity, projectId, mode = '', version = null) { Map model = [activity: activity, returnTo: params.returnTo, mode: mode] model.site = model.activity?.siteId ? siteService.get(model.activity.siteId, [view: 'brief', version: version]) : null - model.project = projectId ? projectService.get(model.activity.projectId, null, false, version) : null + model.project = projectId ? projectService.get(projectId, null, false, version) : null model.projectSite = model.project?.sites?.find { it.siteId == model.project.projectSiteId } // Add the species lists that are relevant to this activity. @@ -1284,15 +1555,16 @@ class BioActivityController { model } - private Map activityAndOutputModel(activity, projectId, mode = '', version = null) { + private Map activityAndOutputModel(activity, projectId, mode = '', version = null, type = null) { def model = activityModel(activity, projectId, mode, version) - addOutputModel(model) + addOutputModel(model, type) model } - def addOutputModel(model) { - model.putAll(activityFormService.getActivityAndOutputMetadata(model.activity.type)) + private def addOutputModel(model ,type = null) { + type = type ?: model.activity.type + model.putAll(activityFormService.getActivityAndOutputMetadata(type)) model } @@ -1457,6 +1729,7 @@ class BioActivityController { tags = "biocollect", operationId = "activityoutputs", summary = "Get data for an activity", + deprecated = true, parameters = [ @Parameter( name = "id", @@ -1527,6 +1800,86 @@ class BioActivityController { render model as JSON } + /* + * Simplified version to get data/output for an activity + * Handles both session and non session based request. + * + * @param id activityId + * + * @return activity + * + */ + @Operation( + method = "GET", + tags = "biocollect", + operationId = "simplifiedactivityoutputs", + summary = "Get data for an activity", + parameters = [ + @Parameter( + name = "id", + in = ParameterIn.PATH, + required = true, + description = "Activity id" + ) + ], + responses = [ + @ApiResponse( + responseCode = "200", + content = @Content( + mediaType = "application/json", + schema = @Schema( + implementation = GetOutputForActivitySimplifiedResponse.class + ) + ), + headers = [ + @Header(name = 'Access-Control-Allow-Headers', description = "CORS header", schema = @Schema(type = "String")), + @Header(name = 'Access-Control-Allow-Methods', description = "CORS header", schema = @Schema(type = "String")), + @Header(name = 'Access-Control-Allow-Origin', description = "CORS header", schema = @Schema(type = "String")) + ] + ), + @ApiResponse( + responseCode = "401", + content = @Content( + mediaType = "application/json", + schema = @Schema( + implementation = ErrorResponse.class + ) + ), + headers = [ + @Header(name = 'Access-Control-Allow-Headers', description = "CORS header", schema = @Schema(type = "String")), + @Header(name = 'Access-Control-Allow-Methods', description = "CORS header", schema = @Schema(type = "String")), + @Header(name = 'Access-Control-Allow-Origin', description = "CORS header", schema = @Schema(type = "String")) + ] + ) + ], + security = @SecurityRequirement(name="auth") + ) + @Path("ws/bioactivity/data/simplified/{id}") + def getOutputForActivitySimplified(String id){ + String userId = userService.getCurrentUserId() + def activity = activityService.get(id) + String projectId = activity?.projectId + def model = [:] + + if (!userId) { + response.status = 401 + model.error = "Access denied: User has not been authenticated." + } else if (!activity) { + model.error = "Invalid activity id" + } else if (!activity) { + model.error = "Invalid activity - ${id}" + } else if (!projectId) { + model.error = "No project associated with the activity" + } else if (projectService.isUserAdminForProject(userId, projectId) || activityService.isUserOwnerForActivity(userId, activity?.activityId)) { + model = [activity: activity] + } else { + response.status = 401 + model.error = "Access denied: User is not an owner of this activity ${activity?.activityId}" + } + + render model as JSON + } + /* * Get activity model for a survey/projectActivity * Handles both session and non session based request. @@ -1607,7 +1960,7 @@ class BioActivityController { model = activityModel(activity, projectId) model.pActivity = pActivity model.returnTo = params.returnTo ? params.returnTo : g.createLink(controller: 'project', id: projectId) - model.autocompleteUrl = "${request.contextPath}/search/searchSpecies/${pActivity.projectActivityId}?limit=10" + model.autocompleteUrl = "${request.contextPath}/search/searchSpecies?projectActivityId=${pActivity.projectActivityId}&limit=10" addOutputModel(model) } diff --git a/grails-app/controllers/au/org/ala/biocollect/DocumentController.groovy b/grails-app/controllers/au/org/ala/biocollect/DocumentController.groovy index ac700dddf..69350cc66 100644 --- a/grails-app/controllers/au/org/ala/biocollect/DocumentController.groovy +++ b/grails-app/controllers/au/org/ala/biocollect/DocumentController.groovy @@ -21,6 +21,22 @@ class DocumentController { WebService webService GrailsApplication grailsApplication + def get(String id) { + if (!id) { + render text: [message: "Document not found"] as JSON, status: HttpStatus.SC_NOT_FOUND + return + } + + def document = documentService.get(id) + if (!document.error) { + render text: document as JSON, status: HttpStatus.SC_OK + } + else { + render text: [message: "Document error"] as JSON, status: HttpStatus.SC_INTERNAL_SERVER_ERROR + return + } + } + /** * This function does an elastic search for documents. All elastic search parameters are supported like fq, max etc. * @return diff --git a/grails-app/controllers/au/org/ala/biocollect/ProjectActivityController.groovy b/grails-app/controllers/au/org/ala/biocollect/ProjectActivityController.groovy index 863c36c56..7008ac6bf 100644 --- a/grails-app/controllers/au/org/ala/biocollect/ProjectActivityController.groovy +++ b/grails-app/controllers/au/org/ala/biocollect/ProjectActivityController.groovy @@ -35,8 +35,8 @@ class ProjectActivityController { } } - def ajaxGet(String id) { - def pActivity = projectActivityService.get(params.id) + def ajaxGet(String id, String view) { + def pActivity = projectActivityService.get(id, view) render pActivity as JSON } diff --git a/grails-app/controllers/au/org/ala/biocollect/UrlMappings.groovy b/grails-app/controllers/au/org/ala/biocollect/UrlMappings.groovy index dbb68b009..dc9433ea6 100644 --- a/grails-app/controllers/au/org/ala/biocollect/UrlMappings.groovy +++ b/grails-app/controllers/au/org/ala/biocollect/UrlMappings.groovy @@ -120,6 +120,10 @@ class UrlMappings { controller = 'document' action = 'download' } + "/document/allDocumentsSearch" { + controller = 'document' + action = 'allDocumentsSearch' + } "/$hub/bulkImport" { controller = 'bulkImport' @@ -167,6 +171,22 @@ class UrlMappings { format = 'json' } + "/pwa" (controller: 'bioActivity', action: 'pwa') + + "/sw.js" (uri: '/assets/sw.js') + "/pwa/config.js" (controller: 'bioActivity', action: 'pwaConfig') + + "/pwa/bioActivity/edit/$projectActivityId" (controller: 'bioActivity', action: 'pwaCreateOrEdit') + + "/pwa/createOrEditFragment/$projectActivityId" (controller: 'bioActivity', action: 'pwaCreateOrEditFragment') + + "/pwa/bioActivity/index/$projectActivityId" (controller: 'bioActivity', action: 'pwaIndex') + + "/pwa/indexFragment/$projectActivityId" (controller: 'bioActivity', action: 'pwaIndexFragment') + + "/pwa/offlineList" ( controller: 'bioActivity', action: 'pwaOfflineList' ) + "/pwa/settings" (controller: 'bioActivity', action: 'pwaSettings') + "/referenceAssessment/requestRecords"(controller: "referenceAssessment", action: [POST: "requestRecords"]) "500"(controller:'error', action:'response500') @@ -180,12 +200,47 @@ class UrlMappings { "/ws/attachment/upload"(controller: "image", action: 'upload') "/ws/bioactivity/model/$id"(controller: "bioActivity", action: 'getActivityModel') "/ws/bioactivity/data/$id"(controller: "bioActivity", action: 'getOutputForActivity') + "/ws/bioactivity/data/simplified/$id"(controller: "bioActivity", action: 'getOutputForActivitySimplified') "/ws/species/uniqueId"(controller: "output", action: 'getOutputSpeciesIdentifier') "/ws/bioactivity/save"(controller: "bioActivity", action: 'ajaxUpdate') "/ws/bioactivity/site"(controller: "site", action: 'ajaxUpdate') "/ws/bioactivity/delete/$id"(controller: "bioActivity", action: 'delete') "/ws/bioactivity/search"(controller: "bioActivity", action: 'searchProjectActivities') "/ws/bioactivity/map"(controller: "bioActivity", action: 'getProjectActivitiesRecordsForMapping') + "/ws/project/$id" { + controller = 'project' + action = 'ajaxGet' + } + "/ws/projectActivity/$id" { + controller = 'projectActivity' + action = 'ajaxGet' + } + "/ws/projectActivity/activity" { + controller = 'bioActivity' + action = 'getProjectActivityMetadata' + } + "/ws/activity/$id" { + controller = 'bioActivity' + action = 'ajaxGet' + } + "/ws/site/$id" { + controller = 'site' + action = 'index' + format = 'json' + levelOfDetail = 'brief' + } + "/ws/document/$id" { + controller = 'document' + action = 'get' + } + "/ws/species/speciesDownload" { + controller = 'species' + action = 'speciesDownload' + } + "/ws/species/totalSpecies" { + controller = 'species' + action = 'totalSpecies' + } } } diff --git a/grails-app/controllers/au/org/ala/biocollect/merit/ProjectController.groovy b/grails-app/controllers/au/org/ala/biocollect/merit/ProjectController.groovy index 729878029..c463f4f55 100644 --- a/grails-app/controllers/au/org/ala/biocollect/merit/ProjectController.groovy +++ b/grails-app/controllers/au/org/ala/biocollect/merit/ProjectController.groovy @@ -38,7 +38,7 @@ import static org.apache.http.HttpStatus.* ) @SSO class ProjectController { - + static final String UNPUBLISHED = "unpublished", PUBLISHED = "published" ProjectService projectService MetadataService metadataService OrganisationService organisationService @@ -122,6 +122,29 @@ class ProjectController { render projectActivities as JSON } + /** + * Get a project by id. It will not get project if it is a MERIT project or project is in draft mode. + * @param id + * @return + */ + @NoSSO + def ajaxGet (String id) { + if (id) { + def project = projectService.get(id) + if (project && !project.error) { + if (project.isMERIT || (project.projLifecycleStatus == UNPUBLISHED)) { + render text: [message: "You are not authorised"] as JSON, status: HttpStatus.SC_FORBIDDEN, contentType: "application/json" + } else { + render project as JSON, contentType: "application/json" + } + } else { + render text: [message: "Project not found"] as JSON, status: HttpStatus.SC_NOT_FOUND, contentType: "application/json" + } + } else { + render text: [message: "Project not found"] as JSON, status: HttpStatus.SC_NOT_FOUND, contentType: "application/json" + } + } + /* * Get list of surveys/project activities for a given project * @@ -1437,6 +1460,7 @@ class ProjectController { } //Search species by project activity species constraint. + @NoSSO def searchSpecies(String id, String q, Integer limit, String output, String dataFieldName, String surveyName){ def result = projectService.searchSpecies(id, q, limit, output, dataFieldName, surveyName) diff --git a/grails-app/controllers/au/org/ala/biocollect/merit/SearchController.groovy b/grails-app/controllers/au/org/ala/biocollect/merit/SearchController.groovy index 43dc840e2..142e298b1 100644 --- a/grails-app/controllers/au/org/ala/biocollect/merit/SearchController.groovy +++ b/grails-app/controllers/au/org/ala/biocollect/merit/SearchController.groovy @@ -1,7 +1,7 @@ package au.org.ala.biocollect.merit + import grails.converters.JSON import org.apache.commons.lang.StringUtils -import org.springframework.http.HttpStatus class SearchController { def searchService, webService, speciesService, commonService, projectActivityService @@ -31,10 +31,21 @@ class SearchController { render speciesService.searchSpeciesList(sort, max, offset, guid, order, searchTerm) as JSON } - //Search species by project activity species constraint. - def searchSpecies(String id, String q, Integer limit, String output, String dataFieldName){ + /** + * Search species based on species field configuration of the project activity. + * @param projectActivityId + * @param q + * @param limit + * @param output + * @param dataFieldName + * @param offset + * @return + */ + def searchSpecies(String projectActivityId, String q, Integer limit, String output, String dataFieldName, Integer offset){ try { - def result = projectActivityService.searchSpecies(id, q, limit, output, dataFieldName) + // backward compatibility - id was replaced with projectActivityId + projectActivityId = projectActivityId ?: params.id + def result = projectActivityService.searchSpecies(projectActivityId, q, limit, output, dataFieldName, offset) render result as JSON } catch (Exception ex){ log.error (ex.message.toString(), ex) diff --git a/grails-app/controllers/au/org/ala/biocollect/merit/SiteController.groovy b/grails-app/controllers/au/org/ala/biocollect/merit/SiteController.groovy index abdbb96e2..38ae63f2c 100644 --- a/grails-app/controllers/au/org/ala/biocollect/merit/SiteController.groovy +++ b/grails-app/controllers/au/org/ala/biocollect/merit/SiteController.groovy @@ -18,6 +18,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse import io.swagger.v3.oas.annotations.security.SecurityRequirement import org.apache.commons.lang.StringUtils import org.apache.http.HttpStatus +import org.apache.http.entity.ContentType import static javax.servlet.http.HttpServletResponse.SC_CONFLICT import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT @@ -85,11 +86,11 @@ class SiteController { } @NoSSO - def index(String id) { - + def index(String id, String levelOfDetail) { + levelOfDetail = levelOfDetail ?: 'projects' // Include activities only when biocollect starts supporting NRM based projects. - def site = siteService.get(id, [view: 'projects']) - if (site && site.status != 'deleted') { + def site = siteService.get(id, [view: levelOfDetail]) + if (site && !site.error && (site.status != 'deleted')) { // inject the metadata model for each activity site.activities = site.activities ?: [] site.activities?.each { @@ -113,9 +114,20 @@ class SiteController { result } else { - //forward(action: 'list', model: [error: 'no such id']) - flash.message = "Site not found." - redirect(controller: 'site', action: 'list') + switch (params.format) { + case 'json': + if (site.statusCode) { + render text: [message: "Site not found."] as JSON, status: site.statusCode, contentType: ContentType.APPLICATION_JSON + } + else { + render text: [message: "An error occurred while getting site."] as JSON, status: HttpStatus.SC_INTERNAL_SERVER_ERROR, contentType: ContentType.APPLICATION_JSON + } + break + default: + flash.message = "Site not found." + redirect(controller: 'site', action: 'list') + break + } } } diff --git a/grails-app/controllers/au/org/ala/biocollect/merit/SpeciesController.groovy b/grails-app/controllers/au/org/ala/biocollect/merit/SpeciesController.groovy index 57d40434d..a229d522b 100644 --- a/grails-app/controllers/au/org/ala/biocollect/merit/SpeciesController.groovy +++ b/grails-app/controllers/au/org/ala/biocollect/merit/SpeciesController.groovy @@ -1,6 +1,7 @@ package au.org.ala.biocollect.merit import grails.converters.JSON +import org.apache.http.HttpStatus import javax.servlet.http.HttpServletResponse @@ -45,4 +46,36 @@ class SpeciesController { Map results = speciesService.searchBie(params.q, params.fq, params.limit ?: 10) render results as JSON } + + @PreAuthorise(accessLevel = 'alaAdmin') + def refreshSpeciesCatalog(boolean force) { + force = force ?: false + Map result = speciesService.constructSpeciesFiles(force) + if (result.success) { + render text: result as JSON, status: HttpStatus.SC_OK, contentType: org.apache.http.entity.ContentType.APPLICATION_JSON + } + else { + render text: result as JSON, status: HttpStatus.SC_INTERNAL_SERVER_ERROR, contentType: org.apache.http.entity.ContentType.APPLICATION_JSON + } + } + + def speciesDownload (Integer page) { + File file = new File("${grailsApplication.config.getProperty('speciesCatalog.dir')}/${page}.json") + if (file.exists()) { + render text: file.text, status: HttpStatus.SC_OK, contentType: org.apache.http.entity.ContentType.APPLICATION_JSON + } + else { + render text: [message: "Species file not found"] as JSON, status: HttpStatus.SC_NOT_FOUND, contentType: org.apache.http.entity.ContentType.APPLICATION_JSON + } + } + + def totalSpecies () { + File file = new File("${grailsApplication.config.getProperty('speciesCatalog.dir')}/${grailsApplication.config.getProperty('speciesCatalog.totalFileName')}") + if (file.exists()) { + render text: file.text, status: HttpStatus.SC_OK, contentType: org.apache.http.entity.ContentType.APPLICATION_JSON + } + else { + render text: [message: "Total file not found"] as JSON, status: HttpStatus.SC_NOT_FOUND, contentType: org.apache.http.entity.ContentType.APPLICATION_JSON + } + } } diff --git a/grails-app/i18n/messages.properties b/grails-app/i18n/messages.properties index 9365e81ad..7219283e5 100644 --- a/grails-app/i18n/messages.properties +++ b/grails-app/i18n/messages.properties @@ -740,6 +740,7 @@ project.myrecords.title=My sightings project.userrecords.title=Sightings of allrecords.title=All records myrecords.title=My records +pwa.record.create.title=Create or edit a record record.create.title=Create a record record.edit.title=Edit a sighting record.view.title=View a sighting @@ -977,3 +978,81 @@ project.survey.bulkupload=Bulk import data bulkimport.stepone.describe=Form template bulkimport.steptwo.describe.helptext=Please include title, description of data set, date range and spatial coverage. Remember to create new bulk import for each spreadsheet. bulkimport.admin.actions.title=Actions +pwa.map.name=Enter name +pwa.map.name.help=Give the region you selected a unique name for later reference. +pwa.map.download=Download progress +pwa.map.area=Selection area (km2) +pwa.map.area.help=Area of selected region on map in kilometers. You can only download map if it is below {0} km2. +pwa.map.cache.title=Map tiles +pwa.map.downloaded.regions=Downloaded map tiles +pwa.map.downloaded.regions.serial=Serial number +pwa.map.downloaded.regions.name=Name +pwa.map.downloaded.regions.actions=Actions +pwa.map.downloaded.regions.preview=View on map +pwa.map.downloaded.regions.delete=Delete +pwa.offline.no.maps=No cached maps found +pwa.species.download=Species +pwa.map.download.species.progress=Species download progress +pwa.species.download.offline=Delete species and download again +pwa.species.cached.count=Total species downloaded +pwa.form.download=Survey form +pwa.form.download.progress=Survey form need to be cached before you can use it offline. Once the download has begun, you can track its progress using progress bar. +pwa.form.download.error=An error occurred while downloading survey form. Firstly, check if you are logged in. Lastly, check with project administrator if you have permission to access survey. +pwa.download.status.error=An error occurred while downloading artefact +pwa.download.status.success=Download completed successfully +pwa.download.status.inprogress=Download in progress +pwa.offline.checklist=Offline checklist +pwa.offline.checklist.intro=A survey will work offline once all items in checklist are green. +pwa.metadata.download=Survey metadata +pwa.metadata.download.intro=Downloads survey metadata, sites associated with survey, project metadata etc. +pwa.metadata.download.error=Error downloading metadata +pwa.species.download.error=An error occurred while downloading species. +pwa.species.download.intro=Downloads species information relevant to survey such as lists associated with a field or the whole species dataset. Downloading the whole species dataset can take several mintues. +pwa.map.download.intro=Downloads map tiles for offline use. You atleast need one region downloaded to enable offline access. +pwa.map.download.error=Cannot enable offline access since no map tiles has been downloaded. Scroll down to map download section below to download map. +pwa.offline.options=Advanced options +admin.species.catalog=Regenerate species +admin.species.helptext=Downloads species catalog and transforms it into a downloadable format for PWA mobile clients. +pwa.species.refresh=Refresh species database +pwa.map.download.href=Scroll to map section +pwa.map.download.help=Download map tiles for offline use. You can only download if selection area field is green. \ + Download is restricted to a maximum area of {0} km2 because map tiles can take up a lot of space. \ + However, you can download multiple regions. You need at least one downloaded region to enable offline access. \ + We are investigating ways to improve access to offline map. +pwa.upload.all=Upload all +pwa.add.records=Add record +pwa.activities.empty.msg=Unpublished records not found +pwa.unpublished.heading=Unpublished records +pwa.buttons.actions=Actions +pwa.view.record=View record +pwa.edit.record=Create record +pwa.btn.back=Back to records +pwa.sites.cache.title=Survey sites +pwa.sites.download.intro=Get map tiles for survey sites. This help map tiles to display when a site is selected offline. \ + This can take several minutes depending on the number of sites associated with the survey. +pwa.sites.download.error=Failed to download map tiles for sites associated with survey. +pwa.offlinelist.surveydate.heading=Survey date +pwa.offlinelist.image.heading=Image +pwa.offlinelist.actions.heading=Actions +pwa.offlinelist.species.heading=Species +pwa.offlinelist.record.image.alt=Image associated with record +pwa.offlinelist.record.noimage.alt=No image associated with record +label.upload=Upload +bioactivity.save=Save +pwa.settings.heading=Settings +pwa.settings.storage.heading=Storage quota +pwa.settings.storage.total=Maximum storage (GB) +pwa.settings.storage.totalPercentage=Percentage used +pwa.settings.storage.used=Disk used (GB) +pwa.settings.storage.free=Free space (GB) +pwa.settings.storage.alert.heading=Unsupported +pwa.settings.storage.alert.message=Your browser does not support storage estimation. Some browsers that support this feature are - Safari (17), Chrome (61), Edge(79), Firefox(57) etc. +pwa.settings.storage.btn.refresh=Refresh +pwa.settings.manage.title=Manage storage +pwa.settings.manage.alert.heading=Delete items +pwa.settings.manage.alert.message=Delete items to make disk space. The following items will be deleted. Unpublished records will not be deleted. You will have to re-download surveys for them to wrok offline. +pwa.settings.manage.btn.clearAll=Delete +pwa.settings.manage.delete.progress=Deletion progress +pwa.map.btn.download=Download map +pwa.sites.choose.download.msg=Large number of sites associated with this survey. Since it can take a long time to download, please select the minimum ones you want offline. +g.clear=Clear \ No newline at end of file diff --git a/grails-app/services/au/org/ala/biocollect/ProjectActivityService.groovy b/grails-app/services/au/org/ala/biocollect/ProjectActivityService.groovy index bfb276626..2b1824255 100644 --- a/grails-app/services/au/org/ala/biocollect/ProjectActivityService.groovy +++ b/grails-app/services/au/org/ala/biocollect/ProjectActivityService.groovy @@ -265,11 +265,11 @@ class ProjectActivityService { * @param dataFieldName Identity of field for specific configuration. * @return json structure containing search results suitable for use by the species autocomplete widget on a survey form. */ - def searchSpecies(String id, String q, Integer limit, String output, String dataFieldName) { + def searchSpecies(String id, String q, Integer limit, String output, String dataFieldName, Integer offset = 0) { def pActivity = get(id) Map speciesConfig = getSpeciesConfigForProjectActivity(pActivity, output, dataFieldName) if (speciesConfig) { - def result = speciesService.searchSpeciesForConfig(speciesConfig, q, limit) + def result = speciesService.searchSpeciesForConfig(speciesConfig, q, limit, offset) speciesService.formatSpeciesNameInAutocompleteList(speciesConfig.speciesDisplayFormat, result) } } diff --git a/grails-app/services/au/org/ala/biocollect/merit/SettingService.groovy b/grails-app/services/au/org/ala/biocollect/merit/SettingService.groovy index a1744f7f3..1d5620d8e 100644 --- a/grails-app/services/au/org/ala/biocollect/merit/SettingService.groovy +++ b/grails-app/services/au/org/ala/biocollect/merit/SettingService.groovy @@ -81,10 +81,10 @@ class SettingService { switch (Environment.current) { case Environment.DEVELOPMENT: + case Environment.TEST: // do nothing break case Environment.PRODUCTION: - case Environment.TEST: default: generateStyleSheetForHubs() break diff --git a/grails-app/services/au/org/ala/biocollect/merit/SpeciesService.groovy b/grails-app/services/au/org/ala/biocollect/merit/SpeciesService.groovy index ec6f814a5..0ee7aadbf 100644 --- a/grails-app/services/au/org/ala/biocollect/merit/SpeciesService.groovy +++ b/grails-app/services/au/org/ala/biocollect/merit/SpeciesService.groovy @@ -1,6 +1,20 @@ package au.org.ala.biocollect.merit +import com.opencsv.CSVParser +import com.opencsv.CSVReader +import com.opencsv.CSVReaderBuilder +import com.opencsv.CSVParserBuilder +import grails.converters.JSON +import grails.plugin.cache.Cacheable + +import java.util.zip.ZipEntry +import java.util.zip.ZipFile + class SpeciesService { + static final String COMMON_NAME = 'COMMONNAME' + static final String SCIENTIFIC_NAME = 'SCIENTIFICNAME' + static final String COMMON_NAME_SCIENTIFIC_NAME = 'COMMONNAME(SCIENTIFICNAME)' + static final String SCIENTIFIC_NAME_COMMON_NAME = 'SCIENTIFICNAME(COMMONNAME)' def webService, grailsApplication @@ -35,10 +49,10 @@ class SpeciesService { * @param speciesConfig * @return */ - def searchSpeciesInLists(String searchTerm, Map speciesConfig = [:], limit = 10){ + def searchSpeciesInLists(String searchTerm, Map speciesConfig = [:], limit = 10, offset = 0){ List druids = speciesConfig.speciesLists?.collect{it.dataResourceUid} Map fields = getSpeciesListAutocompleteLookupFields(speciesConfig) - List listResults = searchSpeciesListOnFields(searchTerm, druids, fields.fieldList, limit) + List listResults = searchSpeciesListOnFields(searchTerm, druids, fields.fieldList, limit, offset) formatSpeciesListResultToAutocompleteFormat(listResults, fields.fieldMap) } @@ -123,8 +137,8 @@ class SpeciesService { * @param listId the id of the list to search. * @return */ - private def searchSpeciesListOnFields(String query, List listId = [], List fields = [], limit = 10) { - def listContents = webService.getJson("${grailsApplication.config.lists.baseURL}/ws/queryListItemOrKVP?druid=${listId.join(',')}&fields=${URLEncoder.encode(fields.join(','), "UTF-8")}&q=${URLEncoder.encode(query, "UTF-8")}&includeKVP=true&limit=${limit}") + private def searchSpeciesListOnFields(String query, List listId = [], List fields = [], limit = 10, offset = 0) { + def listContents = webService.getJson("${grailsApplication.config.lists.baseURL}/ws/queryListItemOrKVP?druid=${listId.join(',')}&fields=${URLEncoder.encode(fields.join(','), "UTF-8")}&q=${URLEncoder.encode(query, "UTF-8")}&includeKVP=true&max=${limit}&offset=${offset}") if(listContents.hasProperty('error')){ throw new Exception(listContents.error) @@ -178,33 +192,7 @@ class SpeciesService { String formatSpeciesName(String displayType, Map data){ String name if(data.guid){ - switch (displayType){ - case 'COMMONNAME(SCIENTIFICNAME)': - if(data.commonName){ - name = "${data.commonName} (${data.scientificName})" - } else { - name = "${data.scientificName}" - } - break; - case 'SCIENTIFICNAME(COMMONNAME)': - if(data.commonName){ - name = "${data.scientificName} (${data.commonName})" - } else { - name = "${data.scientificName}" - } - - break; - case 'COMMONNAME': - if(data.commonName){ - name = "${data.commonName}" - } else { - name = "${data.scientificName}" - } - break; - case 'SCIENTIFICNAME': - name = "${data.scientificName}" - break; - } + name = formatTaxonName(data, displayType) } else { // when no guid, append unmatched taxon string name = "${data.rawScientificName?:''} (Unmatched taxon)" @@ -213,7 +201,40 @@ class SpeciesService { name } - Object searchSpeciesForConfig(Map speciesConfig, String q, Integer limit) { + /** format species by specific type **/ + String formatTaxonName (Map data, String displayType) { + String name = '' + switch (displayType){ + case COMMON_NAME_SCIENTIFIC_NAME: + if (data.commonName && data.scientificName) { + name = "${data.commonName} (${data.scientificName})" + } else if (data.commonName) { + name = data.commonName + } else if (data.scientificName) { + name = data.scientificName + } + break + case SCIENTIFIC_NAME_COMMON_NAME: + if (data.scientificName && data.commonName) { + name = "${data.scientificName} (${data.commonName})" + } else if (data.scientificName) { + name = data.scientificName + } else if (data.commonName) { + name = data.commonName + } + break + case COMMON_NAME: + name = data.commonName ?: data.scientificName ?: "" + break + case SCIENTIFIC_NAME: + name = data.scientificName ?: "" + break + } + + name + } + + Object searchSpeciesForConfig(Map speciesConfig, String q, Integer limit, Integer offset = 0) { def result switch (speciesConfig?.type) { case 'SINGLE_SPECIES': @@ -225,7 +246,7 @@ class SpeciesService { break case 'GROUP_OF_SPECIES': - result = searchSpeciesInLists(q, speciesConfig, limit) + result = searchSpeciesInLists(q, speciesConfig, limit, offset) break default: result = [autoCompleteList: []] @@ -288,4 +309,247 @@ class SpeciesService { def url = "${grailsApplication.config.bieWs.baseURL}/ws/species/shortProfile/${id}" webService.getJson(url) } + + Map constructSpeciesFiles (Boolean force = false) { + def config = grailsApplication.config, + result + String taxonFileName = config.getProperty('speciesCatalog.taxonFileName'), + guidHeaderName = config.getProperty('speciesCatalog.taxon.headerNames.guid'), + scientificNameHeaderName = config.getProperty('speciesCatalog.taxon.headerNames.scientificName'), + rankStringHeaderName = config.getProperty('speciesCatalog.taxon.headerNames.rankString'), + directory = config.getProperty('speciesCatalog.dir'), + taxonID, commonName + List> scientificNames = [] + File speciesDir = new File(directory) + // setting force to true will delete all files in the species directory + // and recreate them from the species catalog zip file + // otherwise, it will only create the species files if they don't already exist + if (force) { + speciesDir.listFiles().each { file -> + file.delete() + } + } + else { + if (totalFileExists()) { + return [success: "Species files already exist"] + } + } + + File file = getSpeciesCatalogFile() + ZipFile zipFile = new ZipFile(file) + try { + Map speciesAddedToList = [:] + def isPreferred + ZipEntry entry = zipFile.getEntry(taxonFileName) + List header + String[] line, previous + int count = 1, BATCH_SIZE = grailsApplication.config.getProperty('speciesCatalog.batchSize', Integer), page = 1 + int guidIndex, scientificNameIndex, rankStringIndex + if (entry) { + InputStream is = zipFile.getInputStream(entry) + InputStreamReader inputStreamReader = new InputStreamReader(is, "UTF-8") + CSVParser parser = + new CSVParserBuilder() + .withSeparator('\t'.toCharacter()) + .withIgnoreQuotations(true) + .build() + + CSVReader csvReader = + new CSVReaderBuilder(inputStreamReader) + .withCSVParser(parser) + .build(); + header = csvReader.readNext() + guidIndex = header.findIndexOf { it == guidHeaderName } + rankStringIndex = header.findIndexOf { it == rankStringHeaderName } + scientificNameIndex = header.findIndexOf { it == scientificNameHeaderName } + + while (line = csvReader.readNext()) { + (count, scientificNames, page, speciesAddedToList) = addScientificNameToFile(header, line, count, guidIndex, scientificNames, rankStringIndex, scientificNameIndex, BATCH_SIZE, config, page, commonName, speciesAddedToList) + } + + if (scientificNames) { + saveSpeciesBatchToDisk(config, page, scientificNames) + } + + csvReader.close() + } + + String fileName = "${config.getProperty('speciesCatalog.dir')}/total.json" + new File(fileName).write(([total: page] as JSON).toString()) + result = [success: "constructed species files"] + } + catch (Exception ex) { + result = [error: "Error constructing species files"] + } + finally { + zipFile.close() + } + + result + } + + boolean totalFileExists() { + String fileName = "${grailsApplication.config.getProperty('speciesCatalog.dir')}/total.json" + new File(fileName).exists() + } + + List addScientificNameToFile(List header, String[] line, int count, int guidIndex, ArrayList> scientificNames, int rankStringIndex, int scientificNameIndex, int BATCH_SIZE, config, int page, String commonName, Map speciesAddedToList = [:]) { + String taxonID + String unranked = config.getProperty('speciesCatalog.filters.exclude.unrankedValue') + try { + if (header.size() != line.size()) { + log.error("Error parsing line: ${line} ${count}") + return [count, scientificNames, page, speciesAddedToList] + } + + // skip unranked taxa + if (line[rankStringIndex] == unranked) { + return [count, scientificNames, page, speciesAddedToList] + } + + taxonID = line[guidIndex] + commonName = getCommonName(taxonID) + String scientificName = line[scientificNameIndex], + scientificNameLower = scientificName?.toLowerCase()?.trim() + + if (!speciesAddedToList[scientificNameLower]) { + scientificNames.add([ + guid : taxonID, + commonName : commonName, + listId : "all", + rankString : line[rankStringIndex], + scientificName: scientificName, + name : commonName ? "${scientificName} (${commonName})" : scientificName + ]) + + speciesAddedToList[scientificNameLower] = true + count++ + + if (count % BATCH_SIZE == 0) { + saveSpeciesBatchToDisk(config, page, scientificNames) + scientificNames = [] + page++ + } + } + else { + log.debug("duplicate found - ${scientificName}") + } + } catch (Exception ex) { + log.error("Error parsing line: ${line} ${count}") + } + + [count, scientificNames, page, speciesAddedToList] + } + + public void saveSpeciesBatchToDisk(config, int page, ArrayList> scientificNames) { + String fileName = "${config.getProperty('speciesCatalog.dir')}/${page}.json" + new File(fileName).write((scientificNames as JSON).toString()) + } + + String getCommonName(String guid) { + Map commonNames = getVernacularNamesGroupedByTaxonId() + commonNames[guid]?.size() > 0 ? commonNames[guid][0]?.vernacularName : "" + } + + @Cacheable("vernacularNamesGroupedByTaxonId") + Map getVernacularNamesGroupedByTaxonId () { + def config = grailsApplication.config + Map>> vernacularNames = [:].withDefault {[]} + File file = getSpeciesCatalogFile() + ZipFile zipFile = new ZipFile(file) + String vernacularFileName = grailsApplication.config.getProperty('speciesCatalog.vernacularFileName'), + taxonIDHeaderName = config.getProperty('speciesCatalog.vernacular.headerNames.taxonID'), + vernacularHeaderName = config.getProperty('speciesCatalog.vernacular.headerNames.vernacularName'), + languageHeaderName = config.getProperty('speciesCatalog.vernacular.headerNames.language'), + preferredHeaderName = config.getProperty('speciesCatalog.vernacular.headerNames.preferred'), + languageFilter = config.getProperty("speciesCatalog.filters.language"), + taxonID + def isPreferred + ZipEntry entry = zipFile.getEntry(vernacularFileName) + List header + String[] line, previous + int count = 1 + int taxonIDIndex, vernacularNameIndex, languageIndex, preferredIndex + if (entry) { + InputStream is = zipFile.getInputStream(entry) + InputStreamReader inputStreamReader = new InputStreamReader(is, "UTF-8") + CSVParser parser = + new CSVParserBuilder() + .withSeparator('\t'.toCharacter()) + .withIgnoreQuotations(true) + .build() + CSVReader csvReader = + new CSVReaderBuilder(inputStreamReader) + .withCSVParser(parser) + .build(); + header = csvReader.readNext() + taxonIDIndex = header.findIndexOf { it == taxonIDHeaderName } + vernacularNameIndex = header.findIndexOf { it == vernacularHeaderName } + languageIndex = header.findIndexOf { it == languageHeaderName } + preferredIndex = header.findIndexOf { it == preferredHeaderName } + + while (line = csvReader.readNext()) { + count ++ + try { + if (header.size() != line.size()) { + log.error ("Error parsing line: ${line} ${count}") + continue + } + + taxonID = line[taxonIDIndex] + isPreferred = line[preferredIndex] ?: "true" + isPreferred = Boolean.parseBoolean(isPreferred) + if (languageFilter.equals(line[languageIndex]) && isPreferred) { + vernacularNames[taxonID].add([ + taxonID : taxonID, + vernacularName: line[vernacularNameIndex], + language : line[languageIndex], + preferred : line[preferredIndex] + ]) + } + } catch (Exception ex) { + log.error("Error parsing line: ${line} ${count}") + } + + previous = line + } + + csvReader.close() + } + + zipFile.close() + vernacularNames + } + + File getSpeciesCatalogFile() { + String url = grailsApplication.config.getProperty('speciesCatalog.url') + String directory = grailsApplication.config.getProperty('speciesCatalog.dir') + String fileName = grailsApplication.config.getProperty('speciesCatalog.fileName') + String saveFileName = directory + File.separator + fileName + File dir = new File(directory) + if (!dir.exists()) { + dir.mkdirs() + } + + File file = new File(saveFileName) + if (!file.exists()) { + downloadFile(url, saveFileName) + } + + file + } + + static void downloadFile(String fileURL, String saveFilePath) throws IOException { + URL url = new URL(fileURL); + try (InputStream inputStream = url.openStream(); + BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); + FileOutputStream fileOutputStream = new FileOutputStream(saveFilePath)) { + + byte[] dataBuffer = new byte[1024]; + int bytesRead; + while ((bytesRead = bufferedInputStream.read(dataBuffer, 0, 1024)) != -1) { + fileOutputStream.write(dataBuffer, 0, bytesRead); + } + } + } } diff --git a/grails-app/taglib/au/org/ala/biocollect/TemplateTagLib.groovy b/grails-app/taglib/au/org/ala/biocollect/TemplateTagLib.groovy index 067ebe2bc..97ebaa9d8 100644 --- a/grails-app/taglib/au/org/ala/biocollect/TemplateTagLib.groovy +++ b/grails-app/taglib/au/org/ala/biocollect/TemplateTagLib.groovy @@ -2,6 +2,7 @@ package au.org.ala.biocollect import au.org.ala.biocollect.merit.SettingService import au.org.ala.biocollect.merit.UserService +import grails.converters.JSON import grails.web.mapping.LinkGenerator import org.grails.web.servlet.mvc.GrailsWebRequest import org.springframework.context.MessageSource @@ -336,6 +337,27 @@ class TemplateTagLib { } } + /** + * Generate links to assets like image that need to be pre-cached by PWA app. + */ + def getFilesToPreCacheForPWA = { attrs -> + List originalFiles = grailsApplication.config.getProperty('pwa.serviceWorkerConfig.filesToPreCache', List)?.collect{ + it + } + List resolvedFiles = originalFiles?.collect { + asset.assetPath(src: it) + } + + // adding /asset to path will help finding files when running from jar files. + // Running app from jar file returns path with the updated name. + // We need the updated and original name to be cached by PWA. + originalFiles = originalFiles?.collect { "/assets/" + it } + List mixedFiles = resolvedFiles + originalFiles + mixedFiles = mixedFiles?.unique() + + out << (mixedFiles as JSON).toString() + } + String getCurrentURLFromRequest() { def grailsRequest = GrailsWebRequest.lookup() grailsLinkGenerator.link(absolute: true, params: grailsRequest.originalParams, uri: request.forwardURI) diff --git a/grails-app/views/admin/tools.gsp b/grails-app/views/admin/tools.gsp index b92a0ebd3..7735c3460 100644 --- a/grails-app/views/admin/tools.gsp +++ b/grails-app/views/admin/tools.gsp @@ -129,6 +129,17 @@ alert(result.statusText); }); }); + + $("#speciesCatalog").on('click', function (e) { + e.preventDefault(); + $.ajax( + "${createLink(controller: 'species', action:'refreshSpeciesCatalog')}?force=true" + ).done(function(result) { + alert(result.success); + }).fail(function (result) { + alert(result.statusText); + }); + }); }); @@ -256,6 +267,14 @@ + + + + + + + + diff --git a/grails-app/views/bioActivity/_activities.gsp b/grails-app/views/bioActivity/_activities.gsp index b69239143..4725e02ee 100644 --- a/grails-app/views/bioActivity/_activities.gsp +++ b/grails-app/views/bioActivity/_activities.gsp @@ -237,7 +237,7 @@
-

No data has been recorded for this project yet diff --git a/grails-app/views/bioActivity/_activityInitialisationJavaScript.gsp b/grails-app/views/bioActivity/_activityInitialisationJavaScript.gsp new file mode 100644 index 000000000..8a6715010 --- /dev/null +++ b/grails-app/views/bioActivity/_activityInitialisationJavaScript.gsp @@ -0,0 +1,136 @@ +<%@ page import="grails.converters.JSON; org.grails.web.json.JSONArray" contentType="text/html;charset=UTF-8" %> + + var activity = JSON.parse('${(activity as JSON).toString().encodeAsJavaScript()}'); + var site = JSON.parse('${(site as JSON).toString().encodeAsJavaScript()}'); + var pActivity = JSON.parse('${(pActivity as JSON).toString().encodeAsJavaScript()}'); + var projectSite = JSON.parse('${(projectSite as JSON).toString().encodeAsJavaScript()}'); + var project = ; + var metaModel = ; + var speciesConfig = ; + var outputModels = ; + var mobile = ${mobile ?: false}; + + var master = new Master(fcConfig.activityId, fcConfig); + function ActivityLevelData() { + var self = this; + self.activity = activity; + self.site = site; + self.pActivity = pActivity; + self.projectSite = projectSite; + self.metaModel = metaModel; + self.project = project; + self.mobile = mobile; + } + + var activityLevelData = new ActivityLevelData(); + + $(function() { + + $('#validation-container').validationEngine('attach', {scroll: true}); + + $('.helphover').popover({animation: true, trigger:'hover'}); + + $('#save').on('click',function () { + master.save(); + master.removeTemporarySite(); + }); + + $('#cancel').on('click',function () { + if (fcConfig.bulkUpload) + $(document).trigger('activitycreatecancelled') + else + document.location.href = fcConfig.returnTo; + }); + + $('#reset').on('click',function () { + master.reset(); + }); + + viewModel = new ActivityHeaderViewModel( + activityLevelData.activity, + activityLevelData.site, + activityLevelData.project, + activityLevelData.metaModel, + activityLevelData.pActivity, + fcConfig); + + var activityId = '${activity.activityId}'; + var projectId = '${activity.projectId}'; + var siteId = '${activity.siteId?:""}'; + var outputModelConfig = { + projectId:projectId, + activityId:activityId, + siteId: siteId, + speciesConfig : speciesConfig + }; + master.setViewModel(viewModel); + + outputModelConfig = _.extend(fcConfig, outputModelConfig); + + if(metaModel.supportsSites) { + var mapFeatures = $.parseJSON('${mapFeatures?.encodeAsJavaScript()}'); + var overlayLayersMapControlConfig = Biocollect.MapUtilities.getOverlayConfig(); + var baseLayersAndOverlays = Biocollect.MapUtilities.getBaseLayerAndOverlayFromMapConfiguration(fcConfig.mapLayersConfig); + var mapOptions = { + drawControl: false, + showReset: true, + draggableMarkers: false, + useMyLocation: false, + allowSearchLocationByAddress: false, + allowSearchRegionByAddress: false, + addLayersControlHeading: true, + autoZIndex: false, + preserveZIndex: true, + baseLayer: baseLayersAndOverlays.baseLayer, + otherLayers: baseLayersAndOverlays.otherLayers, + overlays: baseLayersAndOverlays.overlays, + overlayLayersSelectedByDefault: baseLayersAndOverlays.overlayLayersSelectedByDefault, + wmsFeatureUrl: overlayLayersMapControlConfig.wmsFeatureUrl, + wmsLayerUrl: overlayLayersMapControlConfig.wmsLayerUrl + }; + + activityLevelData.siteMap = new ALA.Map("activitySiteMap", mapOptions); + + if (mapFeatures && mapFeatures.features && mapFeatures.features.length > 0) { + if (mapFeatures.features[0].pid) { + activityLevelData.siteMap.addWmsLayer(mapFeatures.features[0].pid); + } else { + var geometry = _.pick(mapFeatures.features[0], "type", "coordinates"); + var geoJson = ALA.MapUtils.wrapGeometryInGeoJSONFeatureCol(geometry); + activityLevelData.siteMap.setGeoJSON(geoJson); + } + } else if (activityLevelData.pActivity.sites.length == 1) { + viewModel.siteId(activityLevelData.pActivity.sites[0].siteId); + } else if (activityLevelData.projectSite && activityLevelData.projectSite.extent) { + activityLevelData.siteMap.fitToBoundsOf(Biocollect.MapUtilities.featureToValidGeoJson(activityLevelData.projectSite.extent.geometry)); + } + } + + ko.applyBindings(viewModel); + viewModel.dirtyFlag.reset(); + master.register('activityModel', viewModel.modelForSaving, viewModel.dirtyFlag.isDirty, viewModel.dirtyFlag.reset); + + + + + var viewModelName = "${blockId}ViewModel", + elementId = "ko${blockId}", + outputName = "${outputName}"; + + var output = $.grep(activity.outputs || [], function(it){return it.name == outputName})[0] || { name: outputName}; + var config = $.grep(metaModel.outputConfig || [], function(it){return it.outputName == outputName})[0] || {}; + config.model = outputModels[outputName]; + config = _.extend(activityLevelData, outputModelConfig, config); + initialiseOutputViewModel(viewModelName, config.model.dataModel, elementId, activity, output, master, config, viewModel); + + setTimeout(function(){ + // Forcing map refresh because of tricky race condition that resets the map + // to the project area. This refresh needs to happen after everything else has run. + ecodata.forms["${blockId}ViewModelInstance"].reloadGeodata(); + }, 0); + + + + master.listenForResolution() +}); + \ No newline at end of file diff --git a/grails-app/views/bioActivity/_asyncActivityInitialisationJavaScript.gsp b/grails-app/views/bioActivity/_asyncActivityInitialisationJavaScript.gsp new file mode 100644 index 000000000..ef3a961a4 --- /dev/null +++ b/grails-app/views/bioActivity/_asyncActivityInitialisationJavaScript.gsp @@ -0,0 +1,160 @@ +<%@ page import="grails.converters.JSON; org.grails.web.json.JSONArray" contentType="text/html;charset=UTF-8" %> + + function getMetadataAndInitialise() { + var activityId = getActivityId(); + var projectActivityMetadataPromise = entities.getProjectActivityMetadata(fcConfig.projectActivityId, activityId); + projectActivityMetadataPromise.then(function (metadataResult){ + var metadata = metadataResult.data; + initialise(metadata) + }, function (){ + alert("${g.message(code: 'project.activity.metadata.error', default:'Error loading survey metadata')}"); + }); + + function getActivityId() { + var url = new URL(window.location.href); + return url.searchParams.get("activityId"); + } + + function initialise(metadata) { + var activity = metadata.activity || null; + var pActivity = metadata.pActivity || null; + var projectSite = metadata.projectSite || null; + var project = metadata.project || null; + var site = metadata.site || null; + var metaModel = metadata.metaModel || null; + var speciesConfig = metadata.speciesConfig; + var outputModels = metadata.outputModels; + var mapFeatures = metadata.mapFeatures; + var mobile = true; + + var master = new Master(activityId, fcConfig); + function ActivityLevelData() { + var self = this; + self.activity = activity; + self.site = site; + self.pActivity = pActivity; + self.projectSite = projectSite; + self.metaModel = metaModel; + self.project = project; + self.mobile = mobile; + } + + window.activityLevelData = new ActivityLevelData(); + + $(function() { + if (window.viewModel) + return; + + $('#validation-container').validationEngine('attach', {scroll: true}); + + $('.helphover').popover({animation: true, trigger:'hover'}); + + $('#save').on('click',function () { + master.save(); + master.removeTemporarySite(); + }); + + $('#saveOffline').on('click',function () { + master.offlineSave(); + }); + + + $('#cancel').on('click',function () { + if (fcConfig.bulkUpload) + $(document).trigger('activitycreatecancelled') + else + document.location.href = fcConfig.returnTo; + }); + + $('#reset').on('click',function () { + master.reset(); + }); + + viewModel = new ActivityHeaderViewModel( + activityLevelData.activity, + activityLevelData.site, + activityLevelData.project, + activityLevelData.metaModel, + activityLevelData.pActivity, + fcConfig); + + var projectId = fcConfig.projectId; + var siteId = activity.siteId; + var outputModelConfig = { + projectId:projectId, + activityId:activityId, + siteId: siteId, + speciesConfig : speciesConfig + }; + master.setViewModel(viewModel); + + outputModelConfig = _.extend(fcConfig, outputModelConfig); + + if(metaModel.supportsSites) { + var mapFeatures = mapFeatures; + var overlayLayersMapControlConfig = Biocollect.MapUtilities.getOverlayConfig(); + var baseLayersAndOverlays = Biocollect.MapUtilities.getBaseLayerAndOverlayFromMapConfiguration(fcConfig.mapLayersConfig); + var mapOptions = { + drawControl: false, + showReset: true, + draggableMarkers: false, + useMyLocation: false, + allowSearchLocationByAddress: false, + allowSearchRegionByAddress: false, + addLayersControlHeading: true, + autoZIndex: false, + preserveZIndex: true, + baseLayer: baseLayersAndOverlays.baseLayer, + otherLayers: baseLayersAndOverlays.otherLayers, + overlays: baseLayersAndOverlays.overlays, + overlayLayersSelectedByDefault: baseLayersAndOverlays.overlayLayersSelectedByDefault, + wmsFeatureUrl: overlayLayersMapControlConfig.wmsFeatureUrl, + wmsLayerUrl: overlayLayersMapControlConfig.wmsLayerUrl + }; + + activityLevelData.siteMap = new ALA.Map("activitySiteMap", mapOptions); + + if (mapFeatures && mapFeatures.features && mapFeatures.features.length > 0) { + if (mapFeatures.features[0].pid) { + activityLevelData.siteMap.addWmsLayer(mapFeatures.features[0].pid); + } else { + var geometry = _.pick(mapFeatures.features[0], "type", "coordinates"); + var geoJson = ALA.MapUtils.wrapGeometryInGeoJSONFeatureCol(geometry); + activityLevelData.siteMap.setGeoJSON(geoJson); + } + } else if (activityLevelData.pActivity.sites.length == 1) { + viewModel.siteId(activityLevelData.pActivity.sites[0].siteId); + } else if (activityLevelData.projectSite && activityLevelData.projectSite.extent) { + activityLevelData.siteMap.fitToBoundsOf(Biocollect.MapUtilities.featureToValidGeoJson(activityLevelData.projectSite.extent.geometry)); + } + } + + ko.applyBindings(viewModel); + viewModel.dirtyFlag.reset(); + master.register('activityModel', viewModel.modelForSaving, viewModel.dirtyFlag.isDirty, viewModel.dirtyFlag.reset); + for(var index in metaModel.outputs) { + var outputName = metaModel.outputs[index]; + if (outputName != 'Photo Points') { + var blockId = outputName.replaceAll(' ', '_'); + var viewModelName = blockId + 'ViewModel'; + var elementId = 'ko' + blockId; + var output = $.grep(activity.outputs || [], function(it){return it.name == outputName})[0] || { name: outputName}; + var config = $.grep(metaModel.outputConfig || [], function(it){return it.outputName == outputName})[0] || {}; + config.model = outputModels[outputName]; + config = _.extend(activityLevelData, outputModelConfig, config); + initialiseOutputViewModel(viewModelName, config.model.dataModel, elementId, activity, output, master, config, viewModel); + + setTimeout(function(){ + // Forcing map refresh because of tricky race condition that resets the map + // to the project area. This refresh needs to happen after everything else has run. + ecodata.forms[blockId + "ViewModelInstance"].reloadGeodata(); + }, 0); + } + } + + master.listenForResolution() + $(document).trigger('form-initialised'); + }); + }; + }; + \ No newline at end of file diff --git a/grails-app/views/bioActivity/_createEditActivityBody.gsp b/grails-app/views/bioActivity/_createEditActivityBody.gsp index 42a76172e..03ede03b9 100644 --- a/grails-app/views/bioActivity/_createEditActivityBody.gsp +++ b/grails-app/views/bioActivity/_createEditActivityBody.gsp @@ -1,5 +1,5 @@ <%@ page import="grails.converters.JSON; org.grails.web.json.JSONArray" contentType="text/html;charset=UTF-8" %> - +
@@ -37,7 +37,7 @@ - + @@ -94,10 +94,15 @@
- + + + + + + - +
@@ -138,148 +143,12 @@

This could be because your login has timed out or the internet is unavailable.

Your data has been saved on this computer but you may need to login again before the data can be sent to the server.

- Click here to refresh your login and reload this page. + Click here to refresh your login and reload this page.

- - - var activity = JSON.parse('${(activity as JSON).toString().encodeAsJavaScript()}'); - var site = JSON.parse('${(site as JSON).toString().encodeAsJavaScript()}'); - var pActivity = JSON.parse('${(pActivity as JSON).toString().encodeAsJavaScript()}'); - var projectSite = JSON.parse('${(projectSite as JSON).toString().encodeAsJavaScript()}'); - var project = ; - var metaModel = ; - var speciesConfig = ; - var outputModels = ; - var mobile = ${mobile ?: false}; - - var master = new Master(fcConfig.activityId, fcConfig); - function ActivityLevelData() { - var self = this; - self.activity = activity; - self.site = site; - self.pActivity = pActivity; - self.projectSite = projectSite; - self.metaModel = metaModel; - self.project = project; - self.mobile = mobile; - } - - var activityLevelData = new ActivityLevelData(); - - $(function() { - - $('#validation-container').validationEngine('attach', {scroll: true}); - - $('.helphover').popover({animation: true, trigger:'hover'}); - - $('#save').on('click',function () { - master.save(); - master.removeTemporarySite(); - }); - - $('#cancel').on('click',function () { - if (fcConfig.bulkUpload) - $(document).trigger('activitycreatecancelled') - else - document.location.href = fcConfig.returnTo; - }); - - $('#reset').on('click',function () { - master.reset(); - }); - - viewModel = new ActivityHeaderViewModel( - activityLevelData.activity, - activityLevelData.site, - activityLevelData.project, - activityLevelData.metaModel, - activityLevelData.pActivity, - fcConfig); - - var activityId = '${activity.activityId}'; - var projectId = '${activity.projectId}'; - var siteId = '${activity.siteId?:""}'; - var outputModelConfig = { - projectId:projectId, - activityId:activityId, - siteId: siteId, - speciesConfig : speciesConfig - }; - master.setViewModel(viewModel); - - outputModelConfig = _.extend(fcConfig, outputModelConfig); - - if(metaModel.supportsSites) { - var mapFeatures = $.parseJSON('${mapFeatures?.encodeAsJavaScript()}'); - var overlayLayersMapControlConfig = Biocollect.MapUtilities.getOverlayConfig(); - var baseLayersAndOverlays = Biocollect.MapUtilities.getBaseLayerAndOverlayFromMapConfiguration(fcConfig.mapLayersConfig); - var mapOptions = { - drawControl: false, - showReset: true, - draggableMarkers: false, - useMyLocation: false, - allowSearchLocationByAddress: false, - allowSearchRegionByAddress: false, - addLayersControlHeading: true, - autoZIndex: false, - preserveZIndex: true, - baseLayer: baseLayersAndOverlays.baseLayer, - otherLayers: baseLayersAndOverlays.otherLayers, - overlays: baseLayersAndOverlays.overlays, - overlayLayersSelectedByDefault: baseLayersAndOverlays.overlayLayersSelectedByDefault, - wmsFeatureUrl: overlayLayersMapControlConfig.wmsFeatureUrl, - wmsLayerUrl: overlayLayersMapControlConfig.wmsLayerUrl - }; - - activityLevelData.siteMap = new ALA.Map("activitySiteMap", mapOptions); - - if (mapFeatures && mapFeatures.features && mapFeatures.features.length > 0) { - if (mapFeatures.features[0].pid) { - activityLevelData.siteMap.addWmsLayer(mapFeatures.features[0].pid); - } else { - var geometry = _.pick(mapFeatures.features[0], "type", "coordinates"); - var geoJson = ALA.MapUtils.wrapGeometryInGeoJSONFeatureCol(geometry); - activityLevelData.siteMap.setGeoJSON(geoJson); - } - } else if (activityLevelData.pActivity.sites.length == 1) { - viewModel.siteId(activityLevelData.pActivity.sites[0].siteId); - } else if (activityLevelData.projectSite && activityLevelData.projectSite.extent) { - activityLevelData.siteMap.fitToBoundsOf(Biocollect.MapUtilities.featureToValidGeoJson(activityLevelData.projectSite.extent.geometry)); - } - } - - ko.applyBindings(viewModel); - viewModel.dirtyFlag.reset(); - master.register('activityModel', viewModel.modelForSaving, viewModel.dirtyFlag.isDirty, viewModel.dirtyFlag.reset); - - - - - var viewModelName = "${blockId}ViewModel", - elementId = "ko${blockId}", - outputName = "${raw(outputName)}"; - - var output = $.grep(activity.outputs || [], function(it){return it.name == outputName})[0] || { name: outputName}; - var config = $.grep(metaModel.outputConfig || [], function(it){return it.outputName == outputName})[0] || {}; - config.model = outputModels[outputName]; - config = _.extend(activityLevelData, outputModelConfig, config); - initialiseOutputViewModel(viewModelName, config.model.dataModel, elementId, activity, output, master, config, viewModel); - - setTimeout(function(){ - // Forcing map refresh because of tricky race condition that resets the map - // to the project area. This refresh needs to happen after everything else has run. - ecodata.forms["${blockId}ViewModelInstance"].reloadGeodata(); - }, 0); - - - - master.listenForResolution() -}); -
\ No newline at end of file diff --git a/grails-app/views/bioActivity/create.gsp b/grails-app/views/bioActivity/create.gsp index 3f47303fb..841271648 100644 --- a/grails-app/views/bioActivity/create.gsp +++ b/grails-app/views/bioActivity/create.gsp @@ -35,8 +35,8 @@ bieWsUrl: "${grailsApplication.config.bieWs.baseURL}", speciesProfileUrl: "${createLink(controller: 'proxy', action: 'speciesProfile')}", imageLocation:"${asset.assetPath(src: '')}", - speciesSearchUrl: "${raw(createLink(controller: 'search', action: 'searchSpecies', params: [id: pActivity.projectActivityId, limit: 10]))}", - searchBieUrl: "${raw(createLink(controller: 'search', action: 'searchSpecies', params: [id: pActivity.projectActivityId, limit: 10]))}", + speciesSearchUrl: "${raw(createLink(controller: 'search', action: 'searchSpecies', params: [projectActivityId: pActivity.projectActivityId, limit: 10]))}", + searchBieUrl: "${raw(createLink(controller: 'search', action: 'searchSpecies', params: [projectActivityId: pActivity.projectActivityId, limit: 10]))}", speciesListUrl: "${createLink(controller: 'proxy', action: 'speciesItemsForList')}", speciesImageUrl:"${createLink(controller:'species', action:'speciesImage')}", bioActivityUpdate: "${raw(createLink(controller: 'bioActivity', action: 'ajaxUpdate', params: [pActivityId: pActivity.projectActivityId]))}", @@ -61,5 +61,6 @@ + diff --git a/grails-app/views/bioActivity/edit.gsp b/grails-app/views/bioActivity/edit.gsp index ef235550a..63c2d800e 100644 --- a/grails-app/views/bioActivity/edit.gsp +++ b/grails-app/views/bioActivity/edit.gsp @@ -35,12 +35,12 @@ bieUrl: "${grailsApplication.config.bie.baseURL}", bieWsUrl: "${grailsApplication.config.bieWs.baseURL}", speciesProfileUrl: "${createLink(controller: 'proxy', action: 'speciesProfile')}", - searchBieUrl: "${raw(createLink(controller: 'search', action: 'searchSpecies', params: [id: pActivity.projectActivityId, limit: 10]))}", + searchBieUrl: "${raw(createLink(controller: 'search', action: 'searchSpecies', params: [projectActivityId: pActivity.projectActivityId, limit: 10]))}", speciesListUrl: "${createLink(controller: 'proxy', action: 'speciesItemsForList')}", speciesImageUrl:"${createLink(controller:'species', action:'speciesImage')}", imageLocation:"${asset.assetPath(src:'')}", uploadImagesUrl: "${createLink(controller: 'image', action: 'upload')}", - speciesSearchUrl: "${raw(createLink(controller: 'search', action: 'searchSpecies', params: [id: pActivity.projectActivityId, limit: 10]))}", + speciesSearchUrl: "${raw(createLink(controller: 'search', action: 'searchSpecies', params: [projectActivityId: pActivity.projectActivityId, limit: 10]))}", bioActivityUpdate: "${raw(createLink(controller: 'bioActivity', action: 'ajaxUpdate', params: [pActivityId: pActivity.projectActivityId, id: id]))}", bioActivityMobileUpdate: "${raw(createLink(controller: 'bioActivity', action: 'ajaxUpdate', params: [pActivityId: pActivity.projectActivityId, id: id, isMobile: true]))}", excelDataUploadUrl: "${createLink(controller:'bioActivity', action:'extractDataFromExcelTemplate', id:projectActivityId)}", @@ -72,5 +72,6 @@ + diff --git a/grails-app/views/bioActivity/index.gsp b/grails-app/views/bioActivity/index.gsp index c25db914c..3599a792c 100644 --- a/grails-app/views/bioActivity/index.gsp +++ b/grails-app/views/bioActivity/index.gsp @@ -42,7 +42,7 @@ activityViewUrl: "${createLink(controller: 'bioActivity', action: 'index')}", getGuidForOutputSpeciesUrl : "${createLink(controller: 'record', action: 'getGuidForOutputSpeciesIdentifier')}", uploadImagesUrl: "${createLink(controller: 'image', action: 'upload')}", - searchBieUrl: "${raw(createLink(controller: 'search', action: 'searchSpecies', params: [id: pActivity.projectActivityId, limit: 10]))}", + searchBieUrl: "${raw(createLink(controller: 'search', action: 'searchSpecies', params: [projectActivityId: pActivity.projectActivityId, limit: 10]))}", speciesListUrl: "${createLink(controller: 'proxy', action: 'speciesItemsForList')}", speciesProfileUrl: "${createLink(controller: 'proxy', action: 'speciesProfile')}", noImageUrl: '${asset.assetPath(src: "font-awesome/5.15.4/svgs/regular/image.svg")}', diff --git a/grails-app/views/bioActivity/previewActivity.gsp b/grails-app/views/bioActivity/previewActivity.gsp index 2c0fdad9c..000d81cd7 100644 --- a/grails-app/views/bioActivity/previewActivity.gsp +++ b/grails-app/views/bioActivity/previewActivity.gsp @@ -27,7 +27,7 @@ bieWsUrl: "${grailsApplication.config.bieWs.baseURL}", speciesProfileUrl: "${createLink(controller: 'proxy', action: 'speciesProfile')}", imageLocation:"${asset.assetPath(src:'')}", - speciesSearch: "${raw(createLink(controller: 'search', action: 'searchSpecies', params: [id: pActivity.projectActivityId, limit: 10]))}", + speciesSearch: "${raw(createLink(controller: 'search', action: 'searchSpecies', params: [projectActivityId: pActivity.projectActivityId, limit: 10]))}", bioActivityUpdate: "${raw(createLink(controller: 'bioActivity', action: 'ajaxUpdate', params: [pActivityId: pActivity.projectActivityId]))}", bioActivityView: "${createLink(controller: 'bioActivity', action: 'index')}/", excelDataUploadUrl: "${raw(createLink(controller:'bioActivity', action:'extractDataFromExcelTemplate', params:[pActivityId:pActivity.projectActivityId]))}", @@ -36,7 +36,7 @@ uploadImagesUrl: "${createLink(controller: 'image', action: 'upload')}", mapLayersConfig: , excelOutputTemplateUrl: "${createLink(controller: 'proxy', action:'excelOutputTemplate')}", - searchBieUrl: "${raw(createLink(controller: 'search', action: 'searchSpecies', params: [id: pActivity.projectActivityId, limit: 10]))}" + searchBieUrl: "${raw(createLink(controller: 'search', action: 'searchSpecies', params: [projectActivityId: pActivity.projectActivityId, limit: 10]))}" } @@ -49,5 +49,6 @@ + \ No newline at end of file diff --git a/grails-app/views/bioActivity/pwa.gsp b/grails-app/views/bioActivity/pwa.gsp new file mode 100644 index 000000000..df245ee0a --- /dev/null +++ b/grails-app/views/bioActivity/pwa.gsp @@ -0,0 +1,365 @@ + + + + + + + window.addEventListener('load', function () { + if('serviceWorker' in navigator) { + navigator.serviceWorker.register("/sw.js", {scope: "/pwa", updateViaCache: 'none'}) + .then(function (registration) { + console.log("Registration successful " + registration.scope); + }) + .catch(function (error) { + console.log("Service worker failed " + error); + }); + + navigator.serviceWorker.onerror = function (error) { + console.log("Service worker error " + error.message); + console.log(JSON.stringify(error)); + }; + } + + }); + + + var params = getParams(), initialized = false; + var fcConfig = { + intersectService: "${createLink(controller: 'proxy', action: 'intersect')}", + featuresService: "${createLink(controller: 'proxy', action: 'features')}", + featureService: "${createLink(controller: 'proxy', action: 'feature')}", + spatialWms: "${grailsApplication.config.spatial.geoserverUrl}", + layersStyle: "${createLink(controller: 'regions', action: 'layersStyle')}", + createActivityUrl: "/pwa/bioActivity/edit/" + params.projectActivityId + "?cache=true", + indexActivityUrl: "/pwa/bioActivity/index/" + params.projectActivityId+ "?cache=true", + settingsUrl: "/pwa/settings", + baseMapUrl: "${grailsApplication.config.getProperty("pwa.baseMapUrl")}${grailsApplication.config.getProperty("pwa.apiKey")}", + baseMapAttribution: "${grailsApplication.config.getProperty("pwa.mapConfig.baseLayers", List)?.getAt(0)?.attribution?.encodeAsJavaScript()}", + fetchSpeciesUrl: "${createLink(controller: 'search', action: 'searchSpecies')}", + metadataURL: "/ws/projectActivity/activity", + siteUrl: '${createLink(controller: 'site', action: 'index' )}', + offlineListUrl: '${createLink(uri: "/pwa/offlineList", params: [cache: true] )}', + totalUrl: '/ws/species/totalSpecies', + downloadSpeciesUrl: '/ws/species/speciesDownload', + originUrl: "${grailsApplication.config.getProperty("server.serverURL")}", + bulkUpload: true, + pwaAppUrl: "${grailsApplication.config.getProperty('pwa.appUrl')}", + maxAreaInKm: ${grailsApplication.config.getProperty("pwa.maxAreaInKm")}, + isCaching: ${params.getBoolean('cache', false)}, + enableOffline: true + }; + + const crs = L.CRS.EPSG3857, + tileSize = ${grailsApplication.config.getProperty("pwa.tileSize", Integer, 512)}, + minNumberOfTilesPerZoom = 25, + maxArea = fcConfig.maxAreaInKm * 1000 * 1000, // 25 sq km + maxTilesPerAxis = 5, + cacheName = 'v3'; + + + function getParams() { + var searchParams = new URL(window.location.href).searchParams; + var params = {}; + searchParams.forEach(function(value, key) { + params[key] = value; + }); + + return params; + }; + + function startInitialising() { + if(navigator.serviceWorker.controller) { + initialise(); + } else { + navigator.serviceWorker.addEventListener('controllerchange', initialise); + } + }; + + function initialise() { + + !initialized && entities.getCredentials().then(function (){ + var vm = new OfflineViewModel({ + projectActivityId: params.projectActivityId, + mapId: 'map', + baseMapUrl: fcConfig.baseMapUrl, + totalUrl: fcConfig.totalUrl, + downloadSpeciesUrl: fcConfig.downloadSpeciesUrl, + baseMapOptions: { + attribution: fcConfig.baseMapAttribution, + maxZoom: 20 + } + }); + + ko.applyBindings(vm); + initialized = true; + }); + }; + + document.addEventListener("credential-saved", startInitialising); + document.addEventListener("credential-failed", function () { + alert("Error occurred while saving credentials. Please close modal and try again."); + }); + + window.addEventListener('load', function (){ + setTimeout(startInitialising, 2000); + }); + + + +
+

+

+ +

+ + +

+
+
+ + + +
+
+
+
+ + + +
+
+ + + +
+ +
+
+
+
+
+
+
+
+
+ +
+
+ +

+
+
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + +
+ +
+
+
+ +

+

+
+
+
+
+ +
+ +
+
+
+
+
+
+
+
+
+
+
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/grails-app/views/bioActivity/pwaBioActivityCreateOrEdit.gsp b/grails-app/views/bioActivity/pwaBioActivityCreateOrEdit.gsp new file mode 100644 index 000000000..fb97f2239 --- /dev/null +++ b/grails-app/views/bioActivity/pwaBioActivityCreateOrEdit.gsp @@ -0,0 +1,85 @@ +<%@ page import="grails.converters.JSON; org.grails.web.json.JSONArray" contentType="text/html;charset=UTF-8" %> + + + + + + Create | <g:message code="g.biocollect"/> + + + var currentURL = window.location.href, + url = new URL(currentURL), + projectId = url.searchParams.get("projectId"), + projectActivityId = url.searchParams.get("projectActivityId"), + activityId = url.searchParams.get("activityId"), + unpublished = url.searchParams.get("unpublished") || false; + + var fcConfig = { + + projectId: "${projectId}", + projectActivityId: "${projectActivityId}", + type: "${type}", + siteUrl: "/ws/site", + activityURL: "/ws/activity", + projectActivityURL: "/ws/projectActivity", + activityViewURL: "/pwa/bioActivity/index", + metadataURL: "/ws/projectActivity/activity", + htmlFragmentURL: "/pwa/createOrEditFragment/${projectActivityId}", + intersectService: "${createLink(controller: 'proxy', action: 'intersect')}", + featuresService: "${createLink(controller: 'proxy', action: 'features')}", + featureService: "${createLink(controller: 'proxy', action: 'feature')}", + spatialWms: "${grailsApplication.config.spatial.geoserverUrl}", + layersStyle: "${createLink(controller: 'regions', action: 'layersStyle')}", + serverUrl: "${grailsApplication.config.grails.serverURL}", + activityUpdateUrl: "${createLink(controller: 'activity', action: 'ajaxUpdate')}", + activityDeleteUrl: "${createLink(controller: 'activity', action: 'ajaxDelete')}", + activityDeleteAndReturnToUrl: "${raw(createLink(action: 'delete', id: activityId, params: [returnTo: grailsApplication.config.grails.serverURL + '/' + returnTo]))}", + documentUpdateUrl: "${g.createLink(controller:"proxy", action:"documentUpdate")}", + documentDeleteUrl: "${g.createLink(controller:"proxy", action:"deleteDocument")}", + projectViewUrl: "${createLink(controller: 'project', action: 'index')}/", + siteViewUrl: "${createLink(controller: 'site', action: 'index')}/", + siteDeleteUrl: "${createLink(controller: 'site', action: 'forceDelete')}/", + bieUrl: "${grailsApplication.config.bie.baseURL}", + bieWsUrl: "${grailsApplication.config.bieWs.baseURL}", + speciesProfileUrl: "${createLink(controller: 'proxy', action: 'speciesProfile')}", + imageLocation:"${asset.assetPath(src: '')}", + speciesSearchUrl: "${raw(createLink(controller: 'search', action: 'searchSpecies', params: [projectActivityId: projectActivityId, limit: 10]))}", + searchBieUrl: "${raw(createLink(controller: 'search', action: 'searchSpecies', params: [projectActivityId: projectActivityId, limit: 10]))}", + speciesListUrl: "${createLink(controller: 'proxy', action: 'speciesItemsForList')}", + speciesImageUrl:"${createLink(controller:'species', action:'speciesImage')}", + bioActivityUpdate: "${raw(createLink(controller: 'bioActivity', action: 'ajaxUpdate', params: [pActivityId: projectActivityId]))}", + bioActivityView: "${createLink(controller: 'bioActivity', action: 'index')}/", + excelDataUploadUrl: "${raw(createLink(controller:'bioActivity', action:'extractDataFromExcelTemplate', params:[pActivityId:projectActivityId]))}", + getOutputSpeciesIdUrl : "${createLink(controller: 'output', action: 'getOutputSpeciesIdentifier')}", + getGuidForOutputSpeciesUrl : "${createLink(controller: 'record', action: 'getGuidForOutputSpeciesIdentifier')}", + imageLeafletViewer: '${createLink(controller: 'resource', action: 'imageviewer', absolute: true)}', + mapLayersConfig: ${ grailsApplication.config.getProperty('pwaMapConfig', Closure)(grailsApplication.config) as JSON }, + excelOutputTemplateUrl: "${createLink(controller: 'proxy', action:'excelOutputTemplate')}", + uploadImagesUrl: "${createLink(controller: 'image', action: 'upload')}", + originUrl: "${grailsApplication.config.getProperty('server.serverURL')}", + pwaAppUrl: "${grailsApplication.config.getProperty('pwa.appUrl')}", + bulkUpload: false, + enableOffline: true, + isCaching: ${params.getBoolean('cache', false)}, + preventNavigationIfDirty: ${params.getBoolean('cache', false) ? false : true}, + globalReturnToAddress: '${createLink(uri: "/pwa/offlineList")}', + surveyReturnToAddress: '${createLink(uri: "/pwa/offlineList", params: [projectActivityId: projectActivityId])}' + + }, + here = document.location.href; + + fcConfig.returnTo = biocollect.utils.getReturnToAddressForPWA(); + + + + + +
+

+ +
+
+
+ + + diff --git a/grails-app/views/bioActivity/pwaBioActivityCreateOrEditFragment.gsp b/grails-app/views/bioActivity/pwaBioActivityCreateOrEditFragment.gsp new file mode 100644 index 000000000..977b02dc2 --- /dev/null +++ b/grails-app/views/bioActivity/pwaBioActivityCreateOrEditFragment.gsp @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/grails-app/views/bioActivity/pwaBioActivityIndex.gsp b/grails-app/views/bioActivity/pwaBioActivityIndex.gsp new file mode 100644 index 000000000..abe8896a0 --- /dev/null +++ b/grails-app/views/bioActivity/pwaBioActivityIndex.gsp @@ -0,0 +1,260 @@ +<%@ page import="grails.converters.JSON; org.grails.web.json.JSONArray" contentType="text/html;charset=UTF-8" %> + + + + + + View | <g:message code="g.biocollect"/> + + + + + + + var fcConfig = { + + projectId: "${projectId}", + projectActivityId: "${projectActivityId}", + type: "${type}", + siteUrl: "/ws/site", + activityURL: "/ws/activity", + projectActivityURL: "/ws/projectActivity", + activityViewURL: "/pwa/bioActivity/index", + metadataURL: "/ws/projectActivity/activity", + htmlFragmentURL: "/pwa/indexFragment/${projectActivityId}", + intersectService: "${createLink(controller: 'proxy', action: 'intersect')}", + featuresService: "${createLink(controller: 'proxy', action: 'features')}", + featureService: "${createLink(controller: 'proxy', action: 'feature')}", + spatialWms: "${grailsApplication.config.spatial.geoserverUrl}", + layersStyle: "${createLink(controller: 'regions', action: 'layersStyle')}", + serverUrl: "${grailsApplication.config.grails.serverURL}", + activityUpdateUrl: "${createLink(controller: 'activity', action: 'ajaxUpdate')}", + activityDeleteUrl: "${createLink(controller: 'activity', action: 'ajaxDelete')}", + projectViewUrl: "${createLink(controller: 'project', action: 'index')}/", + siteViewUrl: "${createLink(controller: 'site', action: 'index')}/", + bieUrl: "${grailsApplication.config.bie.baseURL}", + bieWsUrl: "${grailsApplication.config.bieWs.baseURL}", + imageLocation:"${asset.assetPath(src:'')}", + imageLeafletViewer: '${createLink(controller: 'resource', action: 'imageviewer', absolute: true)}', + projectIndexUrl: "${createLink(controller: 'project', action: 'index')}", + activityViewUrl: "${createLink(controller: 'bioActivity', action: 'index')}", + getGuidForOutputSpeciesUrl : "${createLink(controller: 'record', action: 'getGuidForOutputSpeciesIdentifier')}", + uploadImagesUrl: "${createLink(controller: 'image', action: 'upload')}", + searchBieUrl: "${raw(createLink(controller: 'search', action: 'searchSpecies', params: [projectActivityId: pActivity.projectActivityId, limit: 10]))}", + speciesListUrl: "${createLink(controller: 'proxy', action: 'speciesItemsForList')}", + speciesProfileUrl: "${createLink(controller: 'proxy', action: 'speciesProfile')}", + noImageUrl: '${asset.assetPath(src: "font-awesome/5.15.4/svgs/regular/image.svg")}', + speciesImageUrl:"${createLink(controller:'species', action:'speciesImage')}", + mapLayersConfig: ${ grailsApplication.config.getProperty('pwaMapConfig', Closure)(grailsApplication.config) as JSON }, + excelOutputTemplateUrl: "${createLink(controller: 'proxy', action:'excelOutputTemplate')}", + pwaAppUrl: "${grailsApplication.config.getProperty('pwa.appUrl')}", + bulkUpload: false, + enableOffline: true, + isCaching: ${params.getBoolean('cache', false)}, + globalReturnToAddress: '${createLink(uri: "/pwa/offlineList")}', + surveyReturnToAddress: '${createLink(uri: "/pwa/offlineList", params: [projectActivityId: projectActivityId])}', + ${(params?.version) ? ',version: ' + params?.version : ''} + + }, + here = document.location.href; + fcConfig.returnTo = biocollect.utils.getReturnToAddressForPWA() + + + + +
+

+ +
+
+ + +
+ + diff --git a/grails-app/views/bioActivity/pwaBioActivityIndexFragment.gsp b/grails-app/views/bioActivity/pwaBioActivityIndexFragment.gsp new file mode 100644 index 000000000..a655431d9 --- /dev/null +++ b/grails-app/views/bioActivity/pwaBioActivityIndexFragment.gsp @@ -0,0 +1,34 @@ +
+
+ + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+
+
+ + \ No newline at end of file diff --git a/grails-app/views/bioActivity/pwaConfig.gsp b/grails-app/views/bioActivity/pwaConfig.gsp new file mode 100644 index 000000000..24c39c489 --- /dev/null +++ b/grails-app/views/bioActivity/pwaConfig.gsp @@ -0,0 +1,10 @@ +<%@ page import="grails.converters.JSON;" contentType="text/javascript;charset=UTF-8" defaultCodec="none" %> +const pwaConfig = { + "cacheName": "${grailsApplication.config.getProperty('pwa.cacheVersion')}", + "oldCacheToDelete": , + "pathsToIgnoreCache": , + "cachePathForRequestsStartingWith": , + "filesToPreCache": , + "noCacheTileFile": "${asset.assetPath(src: grailsApplication.config.getProperty("pwa.serviceWorkerConfig.noCacheTileFile"))}", + "baseMapPrefixUrl": "${grailsApplication.config.getProperty('pwa.serviceWorkerConfig.baseMapPrefixUrl')}" +} \ No newline at end of file diff --git a/grails-app/views/bioActivity/pwaOfflineList.gsp b/grails-app/views/bioActivity/pwaOfflineList.gsp new file mode 100644 index 000000000..617805736 --- /dev/null +++ b/grails-app/views/bioActivity/pwaOfflineList.gsp @@ -0,0 +1,116 @@ +<%@ page contentType="text/html;charset=UTF-8" %> + + + + List activities + + + + var fcConfig = { + siteUrl: "/ws/site", + addActivityUrl: "/pwa/bioActivity/edit", + activityViewUrl: "/pwa/bioActivity/index", + activityEditUrl: "/pwa/bioActivity/edit", + imageUploadUrl: "/ws/attachment/upload", + bioActivityUpdate: "/ws/bioactivity/save", + updateSiteUrl: "/ws/bioactivity/site", + noImageUrl: "${asset.assetPath(src: "font-awesome/5.15.4/svgs/regular/image.svg")}", + pwaAppUrl: "${grailsApplication.config.getProperty('pwa.appUrl')}", + isCaching: ${params.getBoolean('cache', false)}, + enableOffline: true + }; + + + + +
+

+ + + + +
+ + + + \ No newline at end of file diff --git a/grails-app/views/bioActivity/pwaSettings.gsp b/grails-app/views/bioActivity/pwaSettings.gsp new file mode 100644 index 000000000..b3a1dda2e --- /dev/null +++ b/grails-app/views/bioActivity/pwaSettings.gsp @@ -0,0 +1,102 @@ +<%@ page contentType="text/html;charset=UTF-8" %> + + + + PWA settings + + + + var fcConfig = { + siteUrl: "/ws/site", + addActivityUrl: "/pwa/bioActivity/edit", + activityViewUrl: "/pwa/bioActivity/index", + activityEditUrl: "/pwa/bioActivity/edit", + imageUploadUrl: "/ws/attachment/upload", + bioActivityUpdate: "/ws/bioactivity/save", + updateSiteUrl: "/ws/bioactivity/site", + noImageUrl: "${asset.assetPath(src: "font-awesome/5.15.4/svgs/regular/image.svg")}", + pwaAppUrl: "${grailsApplication.config.getProperty('pwa.appUrl')}", + isCaching: ${params.getBoolean('cache', false)}, + enableOffline: true + }; + window.addEventListener('load', function () { + window.parent && window.parent.postMessage({event: 'viewmodelloadded', data: {}}, "*"); + }); + + + + +
+

+
+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ +
+ + + + +

+ +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+ + \ No newline at end of file diff --git a/grails-app/views/layouts/pwa.gsp b/grails-app/views/layouts/pwa.gsp new file mode 100644 index 000000000..b337666d0 --- /dev/null +++ b/grails-app/views/layouts/pwa.gsp @@ -0,0 +1,16 @@ +<%@ page contentType="text/html;charset=UTF-8" %> + + + <g:layoutTitle/> + + + + + + +
+ +
+ + + \ No newline at end of file diff --git a/karma.conf.js b/karma.conf.js index c62081f4d..ff649164c 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -2,13 +2,26 @@ // Generated on Thu May 21 2015 09:01:47 GMT+1000 (AEST) module.exports = function (config) { + var sourcePreprocessors = ['coverage']; + var reporters = ['progress', 'coverage', 'verbose']; + + function isDebug(argument) { + return argument === '--debug'; + } + if (process.argv.some(isDebug)) { + sourcePreprocessors = []; + reporters = ['progress']; + } + config.set({ // base path that will be used to resolve all patterns (eg. files, exclude) basePath: '', - plugins: ['@metahub/karma-jasmine-jquery', 'karma-*'], - + plugins: ['@metahub/karma-jasmine-jquery', 'karma-*', 'karma-verbose-reporter'], + htmlReporter: { + outputFile: 'tests/units.html' + }, // frameworks to use // available frameworks: https://npmjs.org/browse/keyword/karma-adapter @@ -23,6 +36,9 @@ module.exports = function (config) { 'grails-app/assets/vendor/knockout/3.4.0/knockout-3.4.0.js', 'grails-app/assets/vendor/knockout.js/knockout.mapping-latest.js', 'grails-app/assets/vendor/underscore/underscore-1.8.3.min.js', + 'grails-app/assets/vendor/bootstrap4/js/bootstrap.bundle.min.js', + 'grails-app/assets/vendor/bootbox/bootbox.min.js', + 'node_modules/jasmine-ajax/lib/mock-ajax.js', 'grails-app/assets/javascripts/knockout-dates.js', 'grails-app/assets/vendor/wmd/showdown.js', 'grails-app/assets/vendor/wmd/wmd.js', @@ -36,10 +52,13 @@ module.exports = function (config) { 'grails-app/assets/javascripts/pagination.js', 'grails-app/assets/javascripts/sites.js', 'grails-app/assets/javascripts/activity.js', + 'grails-app/assets/javascripts/biocollect-utils.js', + 'grails-app/assets/javascripts/pwa-index.js', 'node_modules/leaflet/dist/leaflet.js', 'grails-app/assets/vendor/leaflet-plugins-2.0.0/layer/tile/Google.js', 'grails-app/assets/javascripts/MapUtilities.js', 'https://cdn.jsdelivr.net/gh/AtlasOfLivingAustralia/ecodata-client-plugin/grails-app/assets/vendor/expr-eval/2.0.2/bundle.js', + 'https://cdn.jsdelivr.net/gh/AtlasOfLivingAustralia/ecodata-client-plugin@feature/cognito/grails-app/assets/javascripts/images.js', 'https://cdn.jsdelivr.net/gh/AtlasOfLivingAustralia/ecodata-client-plugin/grails-app/assets/vendor/select2/4.0.3/js/select2.full.js', 'https://cdn.jsdelivr.net/gh/AtlasOfLivingAustralia/ecodata-client-plugin/grails-app/assets/vendor/typeahead/0.11.1/bloodhound.js', 'https://cdn.jsdelivr.net/gh/AtlasOfLivingAustralia/ecodata-client-plugin/grails-app/assets/vendor/expr-eval/2.0.2/bundle.js', @@ -70,13 +89,15 @@ module.exports = function (config) { // preprocess matching files before serving them to the browser // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor - preprocessors: {}, + preprocessors: { + 'grails-app/assets/javascripts/*.js':sourcePreprocessors + }, // test results reporter to use // possible values: 'dots', 'progress' // available reporters: https://npmjs.org/browse/keyword/karma-reporter - // reporters: ['progress', 'coverage'], + reporters: reporters, // web server port port: 9876, @@ -102,6 +123,15 @@ module.exports = function (config) { // Continuous Integration mode // if true, Karma captures browsers, runs the tests and exits - singleRun: true + singleRun: true, + coverageReporter: { + 'dir':'./target', + 'type':"text", + check: { + global: { + lines: 10 + } + } + }, }); }; diff --git a/package-lock.json b/package-lock.json index 5f5cc08ca..1971088d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,142 +1,240 @@ { "name": "biocollect", - "version": "6.0", - "lockfileVersion": 2, + "version": "7.1", + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "biocollect", - "version": "6.0", + "version": "7.1", "devDependencies": { "@metahub/karma-jasmine-jquery": "^2.0.1", - "chromedriver": "^128.0.0", + "@wdio/cli": "^9.2.14", + "@wdio/devtools-service": "^8.40.2", + "@wdio/globals": "^9.2.14", + "@wdio/jasmine-framework": "^9.2.14", + "@wdio/local-runner": "^9.2.14", + "@wdio/sauce-service": "^9.2.14", + "@wdio/spec-reporter": "^9.2.14", + "axios": "^1.7.7", + "chromedriver": "^130.0.4", + "crypto": "^1.0.1", + "eslint": "^8.57.1", + "eslint-config-standard": "^17.1.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^6.4.0", + "eslint-plugin-wdio": "^9.2.11", + "http": "^0.0.1-security", + "http-proxy": "^1.18.1", + "jasmine": "^5.0.0", + "jasmine-ajax": "^4.0.0", "jasmine-core": "^3.5.0", "jasmine-jquery": "^2.0.0", "jquery": "^3.4.1", + "jsonwebtoken": "^9.0.2", "karma": "^6.3.4", "karma-chrome-launcher": "^2.2.0", "karma-coverage": "^2.0.1", "karma-firefox-launcher": "^1.3.0", "karma-jasmine": "^1.1.2", "karma-jquery": "^0.2.4", + "karma-verbose-reporter": "^0.0.8", "knockout": "^3.5.1", "leaflet": "0.7.7", "lodash": "^4.17.21", "moment": "^2.24.0", - "moment-timezone": "^0.5.35" + "moment-timezone": "^0.5.35", + "node-jose": "^2.2.0", + "wdio-video-reporter": "^6.1.1", + "webdriverio": "^9.2.14" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "node_modules/@babel/compat-data": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "node_modules/@babel/generator": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", "dev": true, + "dependencies": { + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "dev": true, + "dependencies": { + "@babel/types": "^7.26.0" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -145,72 +243,45 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", "dev": true, "dependencies": { - "ms": "2.1.2" + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -225,1431 +296,1746 @@ "node": ">=0.1.90" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@eggjs/yauzl": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@eggjs/yauzl/-/yauzl-2.11.0.tgz", + "integrity": "sha512-Jq+k2fCZJ3i3HShb0nxLUiAgq5pwo8JTT1TrH22JoehZQ0Nm2dvByGIja1NYfNyuE4Tx5/Dns5nVsBN/mlC8yg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "buffer-crc32": "~0.2.3", + "fd-slicer2": "^1.2.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], "dev": true, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@metahub/karma-jasmine-jquery": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@metahub/karma-jasmine-jquery/-/karma-jasmine-jquery-2.0.1.tgz", - "integrity": "sha512-dEFzJiGg2O6+vsgJxt/6ILXewWHWBKQUWyj2u1BiRlYKLvGTO1CV2NlwiTkMOsXEwRSSdFV+WoCY9N9Nx34+Ew==", + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jasmine-core": "*", - "jasmine-jquery": "*", - "karma": "*", - "karma-jasmine": "*" + "node": ">=18" } }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "dev": true - }, - "node_modules/@testim/chrome-version": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.4.tgz", - "integrity": "sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g==", - "dev": true - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "dev": true - }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, - "node_modules/@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@types/node": "*" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", - "dev": true - }, - "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], "dev": true, "optional": true, - "dependencies": { - "@types/node": "*" + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 0.6" + "node": ">=18" } }, - "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 14" + "node": ">=18" } }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "ms": "2.1.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=18" } }, - "node_modules/agent-base/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], "dev": true, "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.4.2" + "node": ">=18" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": "^4.5.0 || >= 5.9" + "node": ">=18" } }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=10.0.0" + "node": ">=18" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=18" } }, - "node_modules/body-parser/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.8" + "node": ">=18" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "dev": true, "dependencies": { - "fill-range": "^7.1.1" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "engines": { - "node": "*" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": ">= 0.8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "dependencies": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@ffmpeg-installer/darwin-arm64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/darwin-arm64/-/darwin-arm64-4.1.5.tgz", + "integrity": "sha512-hYqTiP63mXz7wSQfuqfFwfLOfwwFChUedeCVKkBtl/cliaTM7/ePI9bVzfZ2c+dWu3TqCwLDRWNSJ5pqZl8otA==", + "cpu": [ + "arm64" + ], + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@ffmpeg-installer/darwin-x64": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/darwin-x64/-/darwin-x64-4.1.0.tgz", + "integrity": "sha512-Z4EyG3cIFjdhlY8wI9aLUXuH8nVt7E9SlMVZtWvSPnm2sm37/yC2CwjUzyCQbJbySnef1tQwGG2Sx+uWhd9IAw==", + "cpu": [ + "x64" + ], + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@ffmpeg-installer/ffmpeg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/ffmpeg/-/ffmpeg-1.1.0.tgz", + "integrity": "sha512-Uq4rmwkdGxIa9A6Bd/VqqYbT7zqh1GrT5/rFwCwKM70b42W5gIjWeVETq6SdcL0zXqDtY081Ws/iJWhr1+xvQg==", + "dev": true, + "optionalDependencies": { + "@ffmpeg-installer/darwin-arm64": "4.1.5", + "@ffmpeg-installer/darwin-x64": "4.1.0", + "@ffmpeg-installer/linux-arm": "4.1.3", + "@ffmpeg-installer/linux-arm64": "4.1.4", + "@ffmpeg-installer/linux-ia32": "4.1.0", + "@ffmpeg-installer/linux-x64": "4.1.0", + "@ffmpeg-installer/win32-ia32": "4.1.0", + "@ffmpeg-installer/win32-x64": "4.1.0" + } + }, + "node_modules/@ffmpeg-installer/linux-arm": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-arm/-/linux-arm-4.1.3.tgz", + "integrity": "sha512-NDf5V6l8AfzZ8WzUGZ5mV8O/xMzRag2ETR6+TlGIsMHp81agx51cqpPItXPib/nAZYmo55Bl2L6/WOMI3A5YRg==", + "cpu": [ + "arm" + ], + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ffmpeg-installer/linux-arm64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-arm64/-/linux-arm64-4.1.4.tgz", + "integrity": "sha512-dljEqAOD0oIM6O6DxBW9US/FkvqvQwgJ2lGHOwHDDwu/pX8+V0YsDL1xqHbj1DMX/+nP9rxw7G7gcUvGspSoKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ffmpeg-installer/linux-ia32": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-ia32/-/linux-ia32-4.1.0.tgz", + "integrity": "sha512-0LWyFQnPf+Ij9GQGD034hS6A90URNu9HCtQ5cTqo5MxOEc7Rd8gLXrJvn++UmxhU0J5RyRE9KRYstdCVUjkNOQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ffmpeg-installer/linux-x64": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-x64/-/linux-x64-4.1.0.tgz", + "integrity": "sha512-Y5BWhGLU/WpQjOArNIgXD3z5mxxdV8c41C+U15nsE5yF8tVcdCGet5zPs5Zy3Ta6bU7haGpIzryutqCGQA/W8A==", + "cpu": [ + "x64" + ], + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ffmpeg-installer/win32-ia32": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/win32-ia32/-/win32-ia32-4.1.0.tgz", + "integrity": "sha512-FV2D7RlaZv/lrtdhaQ4oETwoFUsUjlUiasiZLDxhEUPdNDWcH1OU9K1xTvqz+OXLdsmYelUDuBS/zkMOTtlUAw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@ffmpeg-installer/win32-x64": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/win32-x64/-/win32-x64-4.1.0.tgz", + "integrity": "sha512-Drt5u2vzDnIONf4ZEkKtFlbvwj6rI3kxw1Ck9fpudmtgaZIHD4ucsWB2lCZBXRxJgXR+2IMSti+4rtM4C4rXgg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">=4" + "node": ">=10.10.0" } }, - "node_modules/chalk/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "engines": { - "node": ">=4" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@inquirer/checkbox": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-3.0.1.tgz", + "integrity": "sha512-0hm2nrToWUdD6/UHnel/UKGdk1//ke5zGUpHIvk5ZWmaKezlGxZkOJXNSWsdxO/rEqTkbB3lNC2J6nBElV2aAQ==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "@inquirer/core": "^9.2.1", + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/@inquirer/confirm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-4.0.1.tgz", + "integrity": "sha512-46yL28o2NJ9doViqOy0VDcoTzng7rAb6yPQKU7VDLqkmbCaH4JqK4yk4XqlzNWy9PVC5pG1ZUXPBQv+VqnYs2w==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "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" + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0" }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=18" } }, - "node_modules/chromedriver": { - "version": "128.0.1", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-128.0.1.tgz", - "integrity": "sha512-UmWqZXXAyuRa37pE+lnU46vJcCM/y0ddF015LHxycEOYfuqsK7k9ZxJuXCQNWbws9e7FAMQj/GJZT92WPgis0g==", + "node_modules/@inquirer/core": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", + "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", "dev": true, - "hasInstallScript": true, "dependencies": { - "@testim/chrome-version": "^1.1.4", - "axios": "^1.7.4", - "compare-versions": "^6.1.0", - "extract-zip": "^2.0.1", - "proxy-agent": "^6.4.0", - "proxy-from-env": "^1.1.0", - "tcp-port-used": "^1.0.2" - }, - "bin": { - "chromedriver": "bin/chromedriver" + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^22.5.5", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { "node": ">=18" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/@inquirer/core/node_modules/@types/node": { + "version": "22.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", + "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", "dev": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "undici-types": "~6.19.8" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@inquirer/core/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/@inquirer/editor": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-3.0.1.tgz", + "integrity": "sha512-VA96GPFaSOVudjKFraokEEmUQg/Lub6OXvbIEZU1SDCmBzRkHGhxoFAVaF30nyiB4m5cEbDgiI2QRacXZ2hw9Q==", "dev": true, "dependencies": { - "delayed-stream": "~1.0.0" + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "external-editor": "^3.1.0" }, "engines": { - "node": ">= 0.8" + "node": ">=18" } }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true - }, - "node_modules/compare-versions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", - "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "node_modules/@inquirer/expand": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-3.0.1.tgz", + "integrity": "sha512-ToG8d6RIbnVpbdPdiN7BCxZGiHOTomOX94C2FaT5KOHupV40tKEDozp12res6cMIfRKrXLJyexAZhWVHgbALSQ==", "dev": true, "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">= 0.10.0" + "node": ">=18" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/@inquirer/figures": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.8.tgz", + "integrity": "sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=18" } }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "node_modules/@inquirer/input": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-3.0.1.tgz", + "integrity": "sha512-BDuPBmpvi8eMCxqC5iacloWqv+5tQSJlUafYWUe31ow1BVXjW2a5qe3dh4X/Z25Wp22RwvcaLCc2siHobEOfzg==", "dev": true, + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=18" } }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "node_modules/@inquirer/number": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-2.0.1.tgz", + "integrity": "sha512-QpR8jPhRjSmlr/mD2cw3IR8HRO7lSVOnqUvQa8scv1Lsr3xoAMMworcYW3J13z3ppjBFBD2ef1Ci6AE5Qn8goQ==", "dev": true, "dependencies": { - "object-assign": "^4", - "vary": "^1" + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">=18" } }, - "node_modules/currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "node_modules/@inquirer/password": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-3.0.1.tgz", + "integrity": "sha512-haoeEPUisD1NeE2IanLOiFr4wcTXGWrBOyAyPZi1FfLJuXOzNmxCJPgUrGYKVh+Y8hfGJenIfz5Wb/DkE9KkMQ==", "dev": true, "dependencies": { - "array-find-index": "^1.0.1" + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "ansi-escapes": "^4.3.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", - "dev": true - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "node_modules/@inquirer/prompts": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-6.0.1.tgz", + "integrity": "sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A==", "dev": true, + "dependencies": { + "@inquirer/checkbox": "^3.0.1", + "@inquirer/confirm": "^4.0.1", + "@inquirer/editor": "^3.0.1", + "@inquirer/expand": "^3.0.1", + "@inquirer/input": "^3.0.1", + "@inquirer/number": "^2.0.1", + "@inquirer/password": "^3.0.1", + "@inquirer/rawlist": "^3.0.1", + "@inquirer/search": "^2.0.1", + "@inquirer/select": "^3.0.1" + }, "engines": { - "node": ">= 14" + "node": ">=18" } }, - "node_modules/date-format": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.6.tgz", - "integrity": "sha512-B9vvg5rHuQ8cbUXE/RMWMyX2YA5TecT3jKF5fLtGNlzPlU7zblSPmAm2OImDbWL+LDOQ6pUm+4LOFz+ywS41Zw==", + "node_modules/@inquirer/rawlist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-3.0.1.tgz", + "integrity": "sha512-VgRtFIwZInUzTiPLSfDXK5jLrnpkuSOh1ctfaoygKAdPqjcjKYmGh6sCY1pb0aGnCGsmhUxoqLDUAU0ud+lGXQ==", "dev": true, + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "yoctocolors-cjs": "^2.1.2" + }, "engines": { - "node": ">=4.0" + "node": ">=18" } }, - "node_modules/dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "node_modules/@inquirer/search": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-2.0.1.tgz", + "integrity": "sha512-r5hBKZk3g5MkIzLVoSgE4evypGqtOannnB3PKTG9NRZxyFRKcfzrdxXXPcoJQsxJPzvdSU2Rn7pB7lw0GCmGAg==", "dev": true, "dependencies": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - }, - "bin": { - "dateformat": "bin/cli.js" + "@inquirer/core": "^9.2.1", + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": "*" + "node": ">=18" } }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@inquirer/select": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-3.0.1.tgz", + "integrity": "sha512-lUDGUxPhdWMkN/fHy1Lk7pF3nK1fh/gqeyWXmctefhxLYxlDsc7vsPBEpxrfVGDsVdyYJsiJoD4bJ1b623cV1Q==", "dev": true, "dependencies": { - "ms": "2.0.0" + "@inquirer/core": "^9.2.1", + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "node_modules/@inquirer/type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", + "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", "dev": true, + "dependencies": { + "mute-stream": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": ">= 14" + "node": ">=12" } }, - "node_modules/degenerator/node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, "engines": { - "node": ">=6.0" + "node": ">=12" }, - "optionalDependencies": { - "source-map": "~0.6.1" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/degenerator/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/degenerator/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, "engines": { - "node": ">=4.0" + "node": ">=8" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "engines": { - "node": ">=0.4.0" + "node": ">=8" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, "engines": { - "node": ">= 0.8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", - "dev": true - }, - "node_modules/dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "dependencies": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">= 0.8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "once": "^1.4.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/engine.io": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", - "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.11.0" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": ">=10.0.0" + "node": ">=6.0.0" } }, - "node_modules/engine.io-parser": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", - "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { - "node": ">=10.0.0" + "node": ">=6.0.0" } }, - "node_modules/engine.io/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, - "dependencies": { - "ms": "2.1.2" - }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=6.0.0" } }, - "node_modules/engine.io/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { - "is-arrayish": "^0.2.1" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/@metahub/karma-jasmine-jquery": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@metahub/karma-jasmine-jquery/-/karma-jasmine-jquery-2.0.1.tgz", + "integrity": "sha512-dEFzJiGg2O6+vsgJxt/6ILXewWHWBKQUWyj2u1BiRlYKLvGTO1CV2NlwiTkMOsXEwRSSdFV+WoCY9N9Nx34+Ew==", "dev": true, "engines": { "node": ">=6" + }, + "peerDependencies": { + "jasmine-core": "*", + "jasmine-jquery": "*", + "karma": "*", + "karma-jasmine": "*" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">= 8" } }, - "node_modules/escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=0.12.0" - }, - "optionalDependencies": { - "source-map": "~0.2.0" + "node": ">= 8" } }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "optional": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, "engines": { - "node": ">=0.8.0" + "node": ">=14" } }, - "node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "node_modules/@promptbook/utils": { + "version": "0.69.5", + "resolved": "https://registry.npmjs.org/@promptbook/utils/-/utils-0.69.5.tgz", + "integrity": "sha512-xm5Ti/Hp3o4xHrsK9Yy3MS6KbDxYbq485hDsFvxqaNA7equHLPdo8H8faTitTeb14QCDfLW4iwCxdVYu5sn6YQ==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" + "funding": [ + { + "type": "individual", + "url": "https://buymeacoffee.com/hejny" + }, + { + "type": "github", + "url": "https://github.com/webgptorg/promptbook/blob/main/README.md#%EF%B8%8F-contributing" + } + ], + "dependencies": { + "spacetrim": "0.11.59" } }, - "node_modules/estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "node_modules/@puppeteer/browsers": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.4.1.tgz", + "integrity": "sha512-0kdAbmic3J09I6dT8e9vE2JOCSt13wHCW5x/ly8TSt2bDtuIWe2TgLZZDHdcziw9AVCzflMAXCrVyRIhIs44Ng==", "dev": true, + "dependencies": { + "debug": "^4.3.7", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.4.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/@puppeteer/browsers/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", "dev": true }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, "engines": { - "node": ">= 10.17.0" + "node": ">=18" }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/extract-zip/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "dev": true + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dev": true, "dependencies": { - "ms": "2.1.2" + "defer-to-connect": "^2.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=10" } }, - "node_modules/extract-zip/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "node_modules/@testim/chrome-version": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.4.tgz", + "integrity": "sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g==", "dev": true }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", "dev": true }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "node_modules/@tracerbench/trace-event": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@tracerbench/trace-event/-/trace-event-8.0.0.tgz", + "integrity": "sha512-V71xTeg0zpn8dQOIU5vxrhhn7a18WtGQiFV+K8wpvx5kom/CKTJKWxr92S6GEmmLb5C2AHo3OQ4ZxlOn4sst4Q==", + "dev": true + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dev": true, "dependencies": { - "pend": "~1.2.0" + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dev": true, "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" + "@types/node": "*" } }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "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" - }, - "engines": { - "node": ">= 0.8" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@types/istanbul-lib-report": "*" } }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "dependencies": { + "@types/node": "*" } }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" + "@types/node": "*" } }, - "node_modules/fs-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "node_modules/@types/node": { + "version": "20.17.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.6.tgz", + "integrity": "sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==", "dev": true, "dependencies": { - "null-check": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "undici-types": "~6.19.2" } }, - "node_modules/fs-extra": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", - "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" + "@types/node": "*" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", + "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "node_modules/@types/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.2.tgz", + "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==", "dev": true }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "dev": true + }, + "node_modules/@types/ws": { + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", + "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" + "dependencies": { + "@types/node": "*" } }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@types/yargs-parser": "*" } }, - "node_modules/get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "dev": true, - "engines": { - "node": ">=0.10.0" + "optional": true, + "dependencies": { + "@types/node": "*" } }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.5.tgz", + "integrity": "sha512-4ZOwtk2bqG5Y6xRGHcveZVr+6txkH7M2e+nPFd6guSoN638v/1XQ0K06eOpi0ptVU/2tW/pIU4IoPotY/GZ9fw==", "dev": true, "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" + "tinyrainbow": "^1.2.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/get-uri": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", - "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "node_modules/@vitest/snapshot": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.5.tgz", + "integrity": "sha512-zmYw47mhfdfnYbuhkQvkkzYroXUumrwWDGlMjpdUr4jBd3HZiV2w7CQHj+z7AAS4VOtWxI4Zt4bWt4/sKcoIjg==", "dev": true, "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4", - "fs-extra": "^11.2.0" + "@vitest/pretty-format": "2.1.5", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@wdio/allure-reporter": { + "version": "9.2.14", + "resolved": "https://registry.npmjs.org/@wdio/allure-reporter/-/allure-reporter-9.2.14.tgz", + "integrity": "sha512-ErIRuwEpc9a3BOGxQt+ypWwXgJA6hkFW57z6F5KHzmjEvXa24BsHY7dcQZOThf3RTun0upjMCQQlqY0loYVOmg==", + "dev": true, + "dependencies": { + "@types/node": "^20.1.0", + "@wdio/reporter": "9.2.14", + "@wdio/types": "9.2.2", + "allure-js-commons": "^2.5.0", + "csv-stringify": "^6.0.4", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18.20.0" + } + }, + "node_modules/@wdio/cli": { + "version": "9.2.14", + "resolved": "https://registry.npmjs.org/@wdio/cli/-/cli-9.2.14.tgz", + "integrity": "sha512-nYNAuF5HPW8b+B21t83N6NGEUpszZZygTDMy+xemBQFrkp7qpDsaeaxv60rFf6AR1mapcnK4ghHJUqod0qL7cg==", + "dev": true, + "dependencies": { + "@types/node": "^20.1.1", + "@vitest/snapshot": "^2.1.1", + "@wdio/config": "9.2.8", + "@wdio/globals": "9.2.14", + "@wdio/logger": "9.1.3", + "@wdio/protocols": "9.2.2", + "@wdio/types": "9.2.2", + "@wdio/utils": "9.2.8", + "async-exit-hook": "^2.0.1", + "chalk": "^5.2.0", + "chokidar": "^4.0.0", + "cli-spinners": "^3.0.0", + "dotenv": "^16.3.1", + "ejs": "^3.1.9", + "execa": "^9.2.0", + "import-meta-resolve": "^4.0.0", + "inquirer": "^11.0.1", + "lodash.flattendeep": "^4.4.0", + "lodash.pickby": "^4.6.0", + "lodash.union": "^4.6.0", + "read-pkg-up": "^10.0.0", + "recursive-readdir": "^2.2.3", + "tsx": "^4.7.2", + "webdriverio": "9.2.14", + "yargs": "^17.7.2" + }, + "bin": { + "wdio": "bin/wdio.js" }, "engines": { - "node": ">= 14" + "node": ">=18.20.0" } }, - "node_modules/get-uri/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@wdio/config": { + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-9.2.8.tgz", + "integrity": "sha512-EGMmBPGJbz6RmgMjebRWkWu3fGyeTIRcusF4UA4f2tiUEKY8nbzUO/ZyDjVQNR+YVB40q0jcqAqpszYRrIzzeg==", "dev": true, "dependencies": { - "ms": "2.1.2" + "@wdio/logger": "9.1.3", + "@wdio/types": "9.2.2", + "@wdio/utils": "9.2.8", + "decamelize": "^6.0.0", + "deepmerge-ts": "^7.0.3", + "glob": "^10.2.2", + "import-meta-resolve": "^4.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=18.20.0" } }, - "node_modules/get-uri/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "node_modules/@wdio/devtools-service": { + "version": "8.40.6", + "resolved": "https://registry.npmjs.org/@wdio/devtools-service/-/devtools-service-8.40.6.tgz", + "integrity": "sha512-5zfzDDMX4WFNZtR9f+XSYiTILGJx9WbMSFdwsI2TXdT9y4Owpp+jzyXdTWTQUo7uoDDReLAX0xhvWGeQ/KTy/w==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@babel/core": "^7.18.0", + "@tracerbench/trace-event": "^8.0.0", + "@types/node": "^22.2.0", + "@wdio/logger": "8.38.0", + "@wdio/types": "8.40.6", + "babel-plugin-istanbul": "^7.0.0", + "devtools-protocol": "^0.0.1359167", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "lighthouse": "8.6.0", + "puppeteer-core": "^21.11.0", + "webdriverio": "8.40.6" }, "engines": { - "node": ">=14.14" + "node": "^16.13 || >=18" } }, - "node_modules/get-uri/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/@wdio/devtools-service/node_modules/@puppeteer/browsers": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.9.1.tgz", + "integrity": "sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==", "dev": true, "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" + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.3.1", + "tar-fs": "3.0.4", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" }, "engines": { - "node": "*" + "node": ">=16.3.0" + } + }, + "node_modules/@wdio/devtools-service/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "dev": true, + "engines": { + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/@wdio/devtools-service/node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "defer-to-connect": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=14.16" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/@wdio/devtools-service/node_modules/@types/node": { + "version": "22.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.0.tgz", + "integrity": "sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "undici-types": "~6.20.0" } }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "node_modules/@wdio/devtools-service/node_modules/@wdio/config": { + "version": "8.40.6", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.40.6.tgz", + "integrity": "sha512-rHCSmrhdJf7FlidcQPDvRKRPLYjklbrdxQa6J20BxHifTO4h2v23Wrq4OqqYIcq23gf9LpZvCA/PAMiET/QdVg==", "dev": true, "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" + "@wdio/logger": "8.38.0", + "@wdio/types": "8.40.6", + "@wdio/utils": "8.40.6", + "decamelize": "^6.0.0", + "deepmerge-ts": "^5.0.0", + "glob": "^10.2.2", + "import-meta-resolve": "^4.0.0" }, "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" + "node": "^16.13 || >=18" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/@wdio/devtools-service/node_modules/@wdio/logger": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", + "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", "dev": true, "dependencies": { - "function-bind": "^1.1.1" + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 0.4.0" + "node": "^16.13 || >=18" } }, - "node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "node_modules/@wdio/devtools-service/node_modules/@wdio/protocols": { + "version": "8.40.3", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.40.3.tgz", + "integrity": "sha512-wK7+eyrB3TAei8RwbdkcyoNk2dPu+mduMBOdPJjp8jf/mavd15nIUXLID1zA+w5m1Qt1DsT1NbvaeO9+aJQ33A==", + "dev": true + }, + "node_modules/@wdio/devtools-service/node_modules/@wdio/repl": { + "version": "8.40.3", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-8.40.3.tgz", + "integrity": "sha512-mWEiBbaC7CgxvSd2/ozpbZWebnRIc8KRu/J81Hlw/txUWio27S7IpXBlZGVvhEsNzq0+cuxB/8gDkkXvMPbesw==", "dev": true, + "dependencies": { + "@types/node": "^22.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^16.13 || >=18" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/@wdio/devtools-service/node_modules/@wdio/types": { + "version": "8.40.6", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.40.6.tgz", + "integrity": "sha512-ALftLri1BdsRuPrQkuW3evBNdOA5n4IkuoegOw6UE2z+R0f1YI5fHGSHNRWLnhtbOECbGyHXXqzbSxCEb+o+MA==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "@types/node": "^22.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^16.13 || >=18" } }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "node_modules/@wdio/devtools-service/node_modules/@wdio/utils": { + "version": "8.40.6", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.40.6.tgz", + "integrity": "sha512-+TWfV6h+4f8gs7QiYUAWbWEylpZudQ+xkJPN34tRzPJK6dOBYEnIT/j6+1m3j39m1WPDehyYxIf1wCsrGKBxNQ==", "dev": true, "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "@puppeteer/browsers": "^1.6.0", + "@wdio/logger": "8.38.0", + "@wdio/types": "8.40.6", + "decamelize": "^6.0.0", + "deepmerge-ts": "^5.1.0", + "edgedriver": "^5.5.0", + "geckodriver": "^4.3.1", + "get-port": "^7.0.0", + "import-meta-resolve": "^4.0.0", + "locate-app": "^2.1.0", + "safaridriver": "^0.1.0", + "split2": "^4.2.0", + "wait-port": "^1.0.4" }, "engines": { - "node": ">= 0.8" + "node": "^16.13 || >=18" } }, - "node_modules/http-errors/node_modules/statuses": { + "node_modules/@wdio/devtools-service/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "engines": { - "node": ">= 0.8" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "node_modules/@wdio/devtools-service/node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, "engines": { - "node": ">=8.0.0" + "node": ">=14.16" } }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "node_modules/@wdio/devtools-service/node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", "dev": true, "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" }, "engines": { - "node": ">= 14" + "node": ">=14.16" } }, - "node_modules/http-proxy-agent/node_modules/debug": { + "node_modules/@wdio/devtools-service/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", @@ -1666,5007 +2052,11451 @@ } } }, - "node_modules/http-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "node_modules/@wdio/devtools-service/node_modules/deepmerge-ts": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz", + "integrity": "sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==", "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, "engines": { - "node": ">= 14" + "node": ">=16.0.0" } }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@wdio/devtools-service/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "dependencies": { - "ms": "2.1.2" - }, "engines": { - "node": ">=6.0" + "node": ">=10" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/https-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/@wdio/devtools-service/node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "node_modules/@wdio/devtools-service/node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", "dev": true, "dependencies": { - "repeating": "^2.0.0" + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.19.0" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "node_modules/@wdio/devtools-service/node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "node_modules/@wdio/devtools-service/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } }, - "node_modules/ip-address": { + "node_modules/@wdio/devtools-service/node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@wdio/devtools-service/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 12" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "node_modules/@wdio/devtools-service/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "node_modules/@wdio/devtools-service/node_modules/normalize-url": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", "dev": true, "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "node_modules/@wdio/devtools-service/node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true, + "engines": { + "node": ">=12.20" + } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/@wdio/devtools-service/node_modules/proxy-agent": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz", + "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", "dev": true, "dependencies": { - "binary-extensions": "^2.0.0" + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" }, "engines": { - "node": ">=8" + "node": ">= 14" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "node_modules/@wdio/devtools-service/node_modules/puppeteer-core": { + "version": "21.11.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.11.0.tgz", + "integrity": "sha512-ArbnyA3U5SGHokEvkfWjW+O8hOxV1RSJxOgriX/3A4xZRqixt9ZFHD0yPgZQF05Qj0oAqi8H/7stDorjoHY90Q==", "dev": true, + "dependencies": { + "@puppeteer/browsers": "1.9.1", + "chromium-bidi": "0.5.8", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1232444", + "ws": "8.16.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=16.13.2" } }, - "node_modules/is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "node_modules/@wdio/devtools-service/node_modules/puppeteer-core/node_modules/chromium-bidi": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.8.tgz", + "integrity": "sha512-blqh+1cEQbHBKmok3rVJkBlBxt9beKBgOsxbFgs7UJcoVbbeZ+K7+6liAsjgpc8l1Xd55cQUy14fXZdGSb4zIw==", "dev": true, "dependencies": { - "number-is-nan": "^1.0.0" + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "devtools-protocol": "*" } }, - "node_modules/is-fullwidth-code-point": { + "node_modules/@wdio/devtools-service/node_modules/puppeteer-core/node_modules/devtools-protocol": { + "version": "0.0.1232444", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1232444.tgz", + "integrity": "sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg==", + "dev": true + }, + "node_modules/@wdio/devtools-service/node_modules/responselike": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "dev": true, + "dependencies": { + "lowercase-keys": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/@wdio/devtools-service/node_modules/tar-fs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", "dev": true, "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^3.1.5" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/@wdio/devtools-service/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "dev": true, - "engines": { - "node": ">=0.12.0" + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" } }, - "node_modules/is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "node_modules/@wdio/devtools-service/node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "dev": true }, - "node_modules/is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", + "node_modules/@wdio/devtools-service/node_modules/webdriver": { + "version": "8.40.6", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.40.6.tgz", + "integrity": "sha512-jkslwUvOmqhFfc1E21Tz48NgYD8ykiR+09iWZlVLtx3P43k4jOfS+CfasvQ+6hJiVck+N5dXjYfg6zDjpkIFRw==", "dev": true, + "dependencies": { + "@types/node": "^22.2.0", + "@types/ws": "^8.5.3", + "@wdio/config": "8.40.6", + "@wdio/logger": "8.38.0", + "@wdio/protocols": "8.40.3", + "@wdio/types": "8.40.6", + "@wdio/utils": "8.40.6", + "deepmerge-ts": "^5.1.0", + "got": "^12.6.1", + "ky": "^0.33.0", + "ws": "^8.8.0" + }, "engines": { - "node": ">=8" + "node": "^16.13 || >=18" } }, - "node_modules/is2": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz", - "integrity": "sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==", + "node_modules/@wdio/devtools-service/node_modules/webdriverio": { + "version": "8.40.6", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.40.6.tgz", + "integrity": "sha512-hMFYRjVU5Nnk2e9Mi8kDx/IVFMWGaVyDCDpv/SeXXCP17DT9jAZtOWlwGhRaLVikN5JYYuHavHyatVa7gj6QTg==", "dev": true, "dependencies": { - "deep-is": "^0.1.3", - "ip-regex": "^4.1.0", - "is-url": "^1.2.4" + "@types/node": "^22.2.0", + "@wdio/config": "8.40.6", + "@wdio/logger": "8.38.0", + "@wdio/protocols": "8.40.3", + "@wdio/repl": "8.40.3", + "@wdio/types": "8.40.6", + "@wdio/utils": "8.40.6", + "archiver": "^7.0.0", + "aria-query": "^5.0.0", + "css-shorthand-properties": "^1.1.1", + "css-value": "^0.0.1", + "devtools-protocol": "^0.0.1359167", + "grapheme-splitter": "^1.0.2", + "import-meta-resolve": "^4.0.0", + "is-plain-obj": "^4.1.0", + "jszip": "^3.10.1", + "lodash.clonedeep": "^4.5.0", + "lodash.zip": "^4.2.0", + "minimatch": "^9.0.0", + "puppeteer-core": "^21.11.0", + "query-selector-shadow-dom": "^1.0.0", + "resq": "^1.9.1", + "rgb2hex": "0.2.5", + "serialize-error": "^11.0.1", + "webdriver": "8.40.6" }, "engines": { - "node": ">=v0.10.0" + "node": "^16.13 || >=18" + }, + "peerDependencies": { + "devtools": "^8.14.0" + }, + "peerDependenciesMeta": { + "devtools": { + "optional": true + } } }, - "node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "node_modules/@wdio/devtools-service/node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "dev": true, "engines": { - "node": ">= 8.0.0" + "node": ">=10.0.0" }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", - "deprecated": "This module is no longer maintained, try this instead:\n npm i nyc\nVisit https://istanbul.js.org/integrations for other alternatives.", - "dev": true, - "dependencies": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" }, - "bin": { - "istanbul": "lib/cli.js" + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "node_modules/@wdio/globals": { + "version": "9.2.14", + "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-9.2.14.tgz", + "integrity": "sha512-Hgi85bp5vpckK+k5iJ6zz8wUUL6IhCzywIG6uXzSgH/zkUOp5Til/NYyJmzSv6hRsfGaFia9WSaoqol93bfEIA==", "dev": true, "engines": { - "node": ">=6" + "node": ">=18.20.0" + }, + "optionalDependencies": { + "expect-webdriverio": "^5.0.1", + "webdriverio": "9.2.14" } }, - "node_modules/istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "node_modules/@wdio/jasmine-framework": { + "version": "9.2.14", + "resolved": "https://registry.npmjs.org/@wdio/jasmine-framework/-/jasmine-framework-9.2.14.tgz", + "integrity": "sha512-jU+xF08Kq2EsX3RnbUzFjbSMg0gdVYJl2p5fc41SRZls2o2EC8Pvo1B0qaWLTpXYYHAD1Q/efKWhT0AOdudQwA==", "dev": true, "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" + "@types/node": "^20.1.0", + "@wdio/globals": "9.2.14", + "@wdio/logger": "9.1.3", + "@wdio/types": "9.2.2", + "@wdio/utils": "9.2.8", + "expect-webdriverio": "^5.0.1", + "jasmine": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=18.20.0" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@wdio/local-runner": { + "version": "9.2.15", + "resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-9.2.15.tgz", + "integrity": "sha512-+qh/fkA362r+Wnu58BsC/O8xJ0TKPxdzdyHNsz5qgBdmromQIniWCC4xoKg7rBLv4aA5nkyJjXhC7lXcuWYkLQ==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "@types/node": "^20.1.0", + "@wdio/logger": "9.1.3", + "@wdio/repl": "9.0.8", + "@wdio/runner": "9.2.15", + "@wdio/types": "9.2.2", + "async-exit-hook": "^2.0.1", + "split2": "^4.1.0", + "stream-buffers": "^3.0.2" + }, + "engines": { + "node": ">=18.20.0" } }, - "node_modules/istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "node_modules/@wdio/logger": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-9.1.3.tgz", + "integrity": "sha512-cumRMK/gE1uedBUw3WmWXOQ7HtB6DR8EyKQioUz2P0IJtRRpglMBdZV7Svr3b++WWawOuzZHMfbTkJQmaVt8Gw==", "dev": true, "dependencies": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=6" + "node": ">=18.20.0" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "node_modules/@wdio/protocols": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-9.2.2.tgz", + "integrity": "sha512-0GMUSHCbYm+J+rnRU6XPtaUgVCRICsiH6W5zCXpePm3wLlbmg/mvZ+4OnNErssbpIOulZuAmC2jNmut2AEfWSw==", + "dev": true + }, + "node_modules/@wdio/repl": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-9.0.8.tgz", + "integrity": "sha512-3iubjl4JX5zD21aFxZwQghqC3lgu+mSs8c3NaiYYNCC+IT5cI/8QuKlgh9s59bu+N3gG988jqMJeCYlKuUv/iw==", "dev": true, + "dependencies": { + "@types/node": "^20.1.0" + }, "engines": { - "node": ">=4" + "node": ">=18.20.0" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "node_modules/@wdio/reporter": { + "version": "9.2.14", + "resolved": "https://registry.npmjs.org/@wdio/reporter/-/reporter-9.2.14.tgz", + "integrity": "sha512-njOqa9+w5zc9AY4fsUmW46EhZ2nzMFRXZPCmwnGZuYk81L3slVfAFhKk1wSTRhSbghjYAZndt9Yo3c4wFLh6Lg==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "@types/node": "^20.1.0", + "@wdio/logger": "9.1.3", + "@wdio/types": "9.2.2", + "diff": "^7.0.0", + "object-inspect": "^1.12.0" }, "engines": { - "node": ">=6" + "node": ">=18.20.0" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "node_modules/@wdio/runner": { + "version": "9.2.15", + "resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-9.2.15.tgz", + "integrity": "sha512-kVQ+YqVijkD2rJPgbJ7yEzzjOUoJ/HKqvBa3Y/kTJPLcSKQCn47GxqzXlOO6wPWLGWkf22Xn7CiTxFN1t+Zz0w==", "dev": true, "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" + "@types/node": "^20.11.28", + "@wdio/config": "9.2.8", + "@wdio/globals": "9.2.14", + "@wdio/logger": "9.1.3", + "@wdio/types": "9.2.2", + "@wdio/utils": "9.2.8", + "deepmerge-ts": "^7.0.3", + "expect-webdriverio": "^5.0.1", + "webdriver": "9.2.8", + "webdriverio": "9.2.14" }, "engines": { - "node": ">=6" + "node": ">=18.20.0" } }, - "node_modules/istanbul-lib-source-maps/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@wdio/sauce-service": { + "version": "9.2.14", + "resolved": "https://registry.npmjs.org/@wdio/sauce-service/-/sauce-service-9.2.14.tgz", + "integrity": "sha512-P9oIQ5HfO6rWgv+seqxxMLXYwObORvB2F4hQPEPcbDqb2ePhJ/KWTRsbunILK/RV0AEdvmIGtproWR5mL13pyQ==", "dev": true, "dependencies": { - "ms": "2.1.2" + "@wdio/logger": "9.1.3", + "@wdio/types": "9.2.2", + "@wdio/utils": "9.2.8", + "saucelabs": "8.0.0", + "webdriverio": "9.2.14" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=18.20.0" } }, - "node_modules/istanbul-lib-source-maps/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "node_modules/@wdio/spec-reporter": { + "version": "9.2.14", + "resolved": "https://registry.npmjs.org/@wdio/spec-reporter/-/spec-reporter-9.2.14.tgz", + "integrity": "sha512-/0QI/Lfld2gKscVAOTxgy1KyshxreDEu2F0FsiNQUUMQXuV8bN85lGgH6K3F+xZ0p17J/tg8UnWQCv2IaXTycw==", "dev": true, "dependencies": { - "html-escaper": "^2.0.0" + "@wdio/reporter": "9.2.14", + "@wdio/types": "9.2.2", + "chalk": "^5.1.2", + "easy-table": "^1.2.0", + "pretty-ms": "^9.0.0" }, "engines": { - "node": ">=6" + "node": ">=18.20.0" } }, - "node_modules/istanbul/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "node_modules/istanbul/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "node_modules/@wdio/types": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-9.2.2.tgz", + "integrity": "sha512-nHZ9Ne9iRQFJ1TOYKUn4Fza69IshTTzk6RYmSZ51ImGs9uMZu0+S0Jm9REdly+VLN3FzxG6g2QSe0/F3uNVPdw==", "dev": true, "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@types/node": "^20.1.0" }, "engines": { - "node": "*" + "node": ">=18.20.0" } }, - "node_modules/istanbul/node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "node_modules/jasmine-core": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", - "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", - "dev": true - }, - "node_modules/jasmine-jquery": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/jasmine-jquery/-/jasmine-jquery-2.1.1.tgz", - "integrity": "sha1-1AleZGlEomdjI1dpqwGNnzDw1Hs=", - "dev": true - }, - "node_modules/jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "node_modules/@wdio/utils": { + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-9.2.8.tgz", + "integrity": "sha512-rKm5FXkpsCyeqh8tdirtRUHvgNytWNMiaVKdctsvKOJvqnDVPAAQcz9Wmgo7bSwoLwtSHcDaRoxY7olV7J4QnA==", "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@puppeteer/browsers": "^2.2.0", + "@wdio/logger": "9.1.3", + "@wdio/types": "9.2.2", + "decamelize": "^6.0.0", + "deepmerge-ts": "^7.0.3", + "edgedriver": "^5.6.1", + "geckodriver": "^4.3.3", + "get-port": "^7.0.0", + "import-meta-resolve": "^4.0.0", + "locate-app": "^2.2.24", + "safaridriver": "^0.1.2", + "split2": "^4.2.0", + "wait-port": "^1.1.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=18.20.0" } }, - "node_modules/js-yaml/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/@zip.js/zip.js": { + "version": "2.7.53", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.53.tgz", + "integrity": "sha512-G6Bl5wN9EXXVaTUIox71vIX5Z454zEBe+akKpV4m1tUboIctT5h7ID3QXCJd/Lfy2rSvmkTmZIucf1jGRR4f5A==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, "engines": { - "node": ">=4" + "bun": ">=0.7.0", + "deno": ">=1.0.0", + "node": ">=16.5.0" } }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "dependencies": { + "event-target-shim": "^5.0.0" }, "engines": { - "node": ">=4" + "node": ">=6.5" } }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "dependencies": { - "universalify": "^2.0.0" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">= 0.6" } }, - "node_modules/karma": { - "version": "6.3.17", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.17.tgz", - "integrity": "sha512-2TfjHwrRExC8yHoWlPBULyaLwAFmXmxQrcuFImt/JsAsSZu1uOWTZ1ZsWjqQtWpHLiatJOHL5jFjXSJIgCd01g==", + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, - "dependencies": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.2.0", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, "bin": { - "karma": "bin/karma" + "acorn": "bin/acorn" }, "engines": { - "node": ">= 10" + "node": ">=0.4.0" } }, - "node_modules/karma-chrome-launcher": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", - "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "dependencies": { - "fs-access": "^1.0.0", - "which": "^1.2.1" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/karma-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.0.1.tgz", - "integrity": "sha512-SnFkHsnLsaXfxkey51rRN9JDLAEKYW2Lb0qOEvcruukk0NkSNDkjobNDZPt9Ni3kIhLZkLtpGOz661hN7OaZvQ==", + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, "dependencies": { - "dateformat": "^1.0.6", - "istanbul": "^0.4.0", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "lodash": "^4.17.11", - "minimatch": "^3.0.0", - "source-map": "^0.5.1" + "debug": "^4.3.4" }, "engines": { - "node": ">=8.0.0" + "node": ">= 14" } }, - "node_modules/karma-coverage/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "engines": { - "node": ">=0.10.0" + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/karma-firefox-launcher": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-1.3.0.tgz", - "integrity": "sha512-Fi7xPhwrRgr+94BnHX0F5dCl1miIW4RHnzjIGxF8GaIEp7rNqX7LSi7ok63VXs3PS/5MQaQMhGxw+bvD+pibBQ==", + "node_modules/allure-js-commons": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/allure-js-commons/-/allure-js-commons-2.15.1.tgz", + "integrity": "sha512-5V/VINplbu0APnfSZOkYpKOzucO36Q2EtTD1kqjWjl7n6tj7Hh+IHCZsH3Vpk/LXRDfj9RuXugBBvwYKV5YMJw==", "dev": true, "dependencies": { - "is-wsl": "^2.1.0" + "md5": "^2.3.0", + "properties": "^1.2.1", + "strip-ansi": "^5.2.0" } }, - "node_modules/karma-jasmine": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", - "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", + "node_modules/allure-js-commons/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "engines": { - "node": ">= 4" - }, - "peerDependencies": { - "jasmine-core": "*", - "karma": "*" + "node": ">=6" } }, - "node_modules/karma-jquery": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/karma-jquery/-/karma-jquery-0.2.4.tgz", - "integrity": "sha512-NkEzqc+ulVlOASeQRZh07wB4mv1yUUQPp5natoqcTxl+oXwIB0Hu4/g3uCIJLzvEydAxD7IxWLhZuqIigsdBOQ==", + "node_modules/allure-js-commons/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, - "peerDependencies": { - "karma": ">=0.9" + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/karma/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "string-width": "^4.1.0" } }, - "node_modules/knockout": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/knockout/-/knockout-3.5.1.tgz", - "integrity": "sha512-wRJ9I4az0QcsH7A4v4l0enUpkS++MBx0BnL/68KaLzJg7x1qmbjSlwEoCNol7KTYZ+pmtI7Eh2J0Nu6/2Z5J/Q==", - "dev": true - }, - "node_modules/leaflet": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-0.7.7.tgz", - "integrity": "sha1-HjUrpU5j0HZFH6NjyQCJDLLPde4=", + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/load-json-file/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/log4js": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.4.tgz", - "integrity": "sha512-ncaWPsuw9Vl1CKA406hVnJLGQKy1OHx6buk8J4rE2lVW+NW5Y82G5/DIloO7NkqLOUtNPEANaWC1kZYVjXssPw==", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "dependencies": { - "date-format": "^4.0.6", - "debug": "^4.3.4", - "flatted": "^3.2.5", - "rfdc": "^1.3.0", - "streamroller": "^3.0.6" + "type-fest": "^0.21.3" }, "engines": { - "node": ">=8.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log4js/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "dependencies": { - "ms": "2.1.2" - }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8" } }, - "node_modules/log4js/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "dependencies": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", "dev": true, "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">= 14" } }, - "node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", "dev": true, + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 14" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "node_modules/archiver-utils/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "dependencies": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">=0.10.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" + "dependencies": { + "safe-buffer": "~5.2.0" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/archiver/node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=8.0.0" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/archiver/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "dependencies": { - "mime-db": "1.52.0" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">= 0.6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/archiver/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "safe-buffer": "~5.2.0" } }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "node_modules/archiver/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" + "sprintf-js": "~1.0.2" } }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, "engines": { - "node": "*" + "node": ">= 0.4" } }, - "node_modules/moment-timezone": { - "version": "0.5.35", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.35.tgz", - "integrity": "sha512-cY/pBOEXepQvlgli06ttCTKcIf8cD1nmNwOKQQAdHBqYApQSpAqotBMX0RJZNgMp6i0PlZuf1mFtnlyEkwyvFw==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "moment": ">= 2.9.0" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" }, "engines": { - "node": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, "engines": { - "node": ">= 0.4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { - "abbrev": "1" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" }, - "bin": { - "nopt": "bin/nopt.js" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/null-check": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.12.0" } }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "node_modules/axe-core": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.2.3.tgz", + "integrity": "sha512-pXnVMfJKSIWU2Ml4JHP7pZEPIrgBO1Fd3WGx+fPBsS+KRGhE4vxooD8XBGWbQOIVSZsVK7pUDBBkCicNu80yzQ==", "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", "dev": true, "dependencies": { - "wrappy": "1" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "dev": true + }, + "node_modules/babel-plugin-istanbul": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.0.tgz", + "integrity": "sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==", "dev": true, "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" + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=12" } }, - "node_modules/pac-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", - "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.2" + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">= 14" + "node": ">=10" } }, - "node_modules/pac-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "ms": "2.1.2" + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=10" } }, - "node_modules/pac-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "node_modules/bare-events": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", + "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", "dev": true, + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", + "dev": true, + "optional": true, "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" } }, - "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "node_modules/bare-os": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", + "dev": true, + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", "dev": true, + "optional": true, "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" + "bare-os": "^2.1.0" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/bare-stream": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.2.tgz", + "integrity": "sha512-EFZHSIBkDgSHIwj2l2QZfP4U5OcD4xFAOwhSb/vlr9PIqyGJGvB/nfClJbcnh3EY4jtPE4zsb5ztae96bVF79A==", "dev": true, - "engines": { - "node": ">= 0.8" + "optional": true, + "dependencies": { + "streamx": "^2.20.0" } }, - "node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true, - "dependencies": { - "pinkie-promise": "^2.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": "^4.5.0 || >= 5.9" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "node_modules/base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" } }, - "node_modules/path-type/node_modules/pify": { + "node_modules/binary-extensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" } }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "dependencies": { - "pinkie": "^2.0.0" + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "engines": { - "node": ">= 0.8.0" + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/proxy-agent": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", - "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", "dev": true, "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.3", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" }, "engines": { - "node": ">= 14" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/boxen/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "ms": "2.1.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6.0" + "node": ">=8" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/pump": { + "node_modules/boxen/node_modules/chalk": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true, + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=0.9" + "node": ">=8" } }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/boxen/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/boxen/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/boxen/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/boxen/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "fill-range": "^7.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "picomatch": "^2.2.1" + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">=8.10.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, "dependencies": { - "is-finite": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/requires-port": { + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true + }, + "node_modules/buffer-fill": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", "dev": true }, - "node_modules/resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, - "dependencies": { - "path-parse": "^1.0.6" + "peer": true, + "engines": { + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/builtins": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", "dev": true, + "peer": true, "dependencies": { - "glob": "^7.1.3" - }, + "semver": "^7.0.0" + } + }, + "node_modules/builtins/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "peer": true, "bin": { - "rimraf": "bin.js" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">= 0.8" } }, - "node_modules/socket.io": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", - "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.4.1", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.1" - }, "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", - "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", - "dev": true, - "dependencies": { - "ws": "~8.11.0" + "node": ">=10.6.0" } }, - "node_modules/socket.io-parser": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", - "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dev": true, "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=8" } }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "dependencies": { - "ms": "2.1.2" + "pump": "^3.0.0" }, "engines": { - "node": ">=6.0" + "node": ">=8" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/socket.io-parser/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/socket.io/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { - "ms": "2.1.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" }, "engines": { - "node": ">=6.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/socket.io/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" + "node": ">=6" } }, - "node_modules/socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" } }, - "node_modules/socks-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "dependencies": { - "ms": "2.1.2" - }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=6" } }, - "node_modules/socks-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/caniuse-lite": { + "version": "1.0.30001680", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", + "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, - "node_modules/spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", "dev": true, "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" } }, - "node_modules/spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "node_modules/spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "node_modules/change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", "dev": true, "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/streamroller": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.6.tgz", - "integrity": "sha512-Qz32plKq/MZywYyhEatxyYc8vs994Gz0Hu2MSYXXLD233UyPeIeRBZARIIGwFer4Mdb8r3Y2UqKkgyDghM6QCg==", + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "dev": true, - "dependencies": { - "date-format": "^4.0.6", - "debug": "^4.3.4", - "fs-extra": "^10.0.1" - }, "engines": { - "node": ">=8.0" + "node": "*" } }, - "node_modules/streamroller/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/cheerio": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", + "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", "dev": true, "dependencies": { - "ms": "2.1.2" + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^9.1.0", + "parse5": "^7.1.2", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^6.19.5", + "whatwg-mimetype": "^4.0.0" }, "engines": { - "node": ">=6.0" + "node": ">=18.17" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, - "node_modules/streamroller/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/chokidar": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "readdirp": "^4.0.1" }, "engines": { - "node": ">=8" + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "node_modules/chrome-launcher": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.14.2.tgz", + "integrity": "sha512-Nk8DUCIfPR6p9WClPPFeP2ztpAdkT8xueoiDS03csea1uoJjm4w0p5Oy1hjykyjT1EQ0MMrEshLD3C8gHXyiZw==", "dev": true, "dependencies": { - "is-utf8": "^0.2.0" + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=12.13.0" } }, - "node_modules/strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "node_modules/chromedriver": { + "version": "130.0.4", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-130.0.4.tgz", + "integrity": "sha512-lpR+PWXszij1k4Ig3t338Zvll9HtCTiwoLM7n4pCCswALHxzmgwaaIFBh3rt9+5wRk9D07oFblrazrBxwaYYAQ==", "dev": true, + "hasInstallScript": true, "dependencies": { - "get-stdin": "^4.0.1" + "@testim/chrome-version": "^1.1.4", + "axios": "^1.7.4", + "compare-versions": "^6.1.0", + "extract-zip": "^2.0.1", + "proxy-agent": "^6.4.0", + "proxy-from-env": "^1.1.0", + "tcp-port-used": "^1.0.2" }, "bin": { - "strip-indent": "cli.js" + "chromedriver": "bin/chromedriver" }, "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "node_modules/chromium-bidi": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.6.3.tgz", + "integrity": "sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "has-flag": "^1.0.0" + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.23.8" }, - "engines": { - "node": ">=0.8.0" + "peerDependencies": { + "devtools-protocol": "*" } }, - "node_modules/tcp-port-used": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", - "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, - "dependencies": { - "debug": "4.3.1", - "is2": "^2.0.6" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" } }, - "node_modules/tcp-port-used/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", "dev": true, - "dependencies": { - "ms": "2.1.2" + "engines": { + "node": ">=6" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.2.0.tgz", + "integrity": "sha512-pXftdQloMZzjCr3pCTIRniDcys6dDzgpgVhAHHk6TKBDbRuP1MkuetTF5KSv4YUutbOPa7+7ZrAJ2kVtbMqyXA==", + "dev": true, "engines": { - "node": ">=6.0" + "node": ">=18.20" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tcp-port-used/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "engines": { + "node": ">= 12" + } }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { - "rimraf": "^3.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=8.17.0" + "node": ">=12" } }, - "node_modules/tmp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "color-convert": "^2.0.1" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "is-number": "^7.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=8.0" + "node": ">=8" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">=0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, + "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.8" } }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dev": true, "dependencies": { - "prelude-ls": "~1.1.2" + "mimic-response": "^1.0.0" }, - "engines": { - "node": ">= 0.8.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 0.6" + "node": ">=7.0.0" } }, - "node_modules/ua-parser-js": { - "version": "0.7.33", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.33.tgz", - "integrity": "sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw==", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], "engines": { - "node": "*" + "node": ">=0.1.90" } }, - "node_modules/uglify-js": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.6.tgz", - "integrity": "sha512-yYqjArOYSxvqeeiYH2VGjZOqq6SVmhxzaPjJC1W2F9e+bqvFL9QXQ2osQuKUFjM2hGjKG2YclQnRKWQSt/nOTQ==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, - "optional": true, "dependencies": { - "commander": "~2.20.3", - "source-map": "~0.6.1" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.8" } }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "dev": true, "engines": { - "node": ">= 10.0.0" + "node": "^12.20.0 || >=14" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "dev": true + }, + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, "engines": { - "node": ">= 0.8" + "node": ">= 14" } }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "node_modules/compress-commons/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "engines": { - "node": ">= 0.4.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/compress-commons/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, "engines": { - "node": ">= 0.8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "node_modules/compress-commons/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "safe-buffer": "~5.2.0" } }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/compressing": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/compressing/-/compressing-1.10.1.tgz", + "integrity": "sha512-XXwUffcVjqv8NGSQu1ttp6eMmuZ3zZEAec28Rt30o/vkXE20jXhowRQ9LXLY4uOgFkxXrNzApLobpam53Dc1AA==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "@eggjs/yauzl": "^2.11.0", + "flushwritable": "^1.0.0", + "get-ready": "^1.0.0", + "iconv-lite": "^0.5.0", + "mkdirp": "^0.5.1", + "pump": "^3.0.0", + "streamifier": "^0.1.1", + "tar-stream": "^1.5.2", + "yazl": "^2.4.2" }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">= 4.0.0" } }, - "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "node_modules/compressing/node_modules/iconv-lite": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", + "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/configstore/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "semver": "^6.0.0" }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.10.0" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "node_modules/constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": ">= 0.6" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==", "dev": true, "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, "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" + "object-assign": "^4", + "vary": "^1" }, "engines": { - "node": ">=10" + "node": ">= 0.10" } }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "dev": true, + "bin": { + "crc32": "bin/crc32.njs" + }, "engines": { - "node": ">=10" + "node": ">=0.8" } }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", "dev": true, "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" } }, - "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "node_modules/crc32-stream/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, - "requires": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "node_modules/crc32-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "dependencies": { + "safe-buffer": "~5.2.0" } }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", "dev": true, - "requires": { - "@babel/types": "^7.22.5" + "dependencies": { + "node-fetch": "^2.6.12" } }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, - "requires": { - "@babel/types": "^7.22.5" + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "node_modules/cross-spawn": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", + "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "engines": { + "node": "*" } }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "node_modules/crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", + "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in.", "dev": true }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "engines": { + "node": ">=8" } }, - "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "node_modules/csp_evaluator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/csp_evaluator/-/csp_evaluator-1.1.0.tgz", + "integrity": "sha512-TcB+ZH9wZBG314jAUpKHPl1oYbRJV+nAT2YwZ9y4fmUN0FkEJa8e/hKZoOgzLYp1Z/CJdFhbhhGIGh0XG8W54Q==", "dev": true }, - "@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "@metahub/karma-jasmine-jquery": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@metahub/karma-jasmine-jquery/-/karma-jasmine-jquery-2.0.1.tgz", - "integrity": "sha512-dEFzJiGg2O6+vsgJxt/6ILXewWHWBKQUWyj2u1BiRlYKLvGTO1CV2NlwiTkMOsXEwRSSdFV+WoCY9N9Nx34+Ew==", - "dev": true, - "requires": {} - }, - "@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "dev": true - }, - "@testim/chrome-version": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.4.tgz", - "integrity": "sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g==", - "dev": true - }, - "@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "node_modules/css-shorthand-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.2.tgz", + "integrity": "sha512-C2AugXIpRGQTxaCW0N7n5jD/p5irUmCrwl03TrnMFBHDbdq44CFWR2zO7rK9xPN4Eo3pUxC4vQzQgbIpzrD1PQ==", "dev": true }, - "@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "node_modules/css-value": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", + "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==", "dev": true }, - "@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, - "requires": { - "@types/node": "*" + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", + "node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, - "@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "node_modules/cssstyle": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.1.tgz", + "integrity": "sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A==", "dev": true, - "optional": true, - "requires": { - "@types/node": "*" + "dependencies": { + "cssom": "0.3.x" } }, - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "node_modules/csv-stringify": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.5.2.tgz", + "integrity": "sha512-RFPahj0sXcmUyjrObAK+DOWtMvMIFV328n4qZJhgX3x2RqkQgOTU2mCUmiFR0CzM6AzChlRSUErjiJeEt8BaQA==", "dev": true }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "dev": true + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "engines": { + "node": ">= 12" } }, - "agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, - "requires": { - "debug": "^4.3.4" - }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "amdefine": { + "node_modules/data-view-byte-length": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, - "requires": { - "color-convert": "^1.9.0" + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "engines": { + "node": ">=4.0" } }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, - "requires": { - "sprintf-js": "~1.0.2" + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "node_modules/decamelize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", "dev": true, - "requires": { - "tslib": "^2.0.1" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, - "requires": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "engines": { + "node": ">=0.10" } }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true - }, - "basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, "dependencies": { - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - } + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, - "requires": { - "fill-range": "^7.1.1" + "engines": { + "node": ">=4.0.0" } }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/deepmerge-ts": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.3.tgz", + "integrity": "sha512-qCSH6I0INPxd9Y1VtAiLpnYvz5O//6rCfJXKk0z66Up9/VOSr+1yS8XSKA5IWRxjocFGlzPyaZYe+jxq7OOLtQ==", "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "engines": { + "node": ">=16.0.0" } }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "optional": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "engines": { + "node": ">=10" } }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.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" + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "chromedriver": { - "version": "128.0.1", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-128.0.1.tgz", - "integrity": "sha512-UmWqZXXAyuRa37pE+lnU46vJcCM/y0ddF015LHxycEOYfuqsK7k9ZxJuXCQNWbws9e7FAMQj/GJZT92WPgis0g==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "requires": { - "@testim/chrome-version": "^1.1.4", - "axios": "^1.7.4", - "compare-versions": "^6.1.0", - "extract-zip": "^2.0.1", - "proxy-agent": "^6.4.0", - "proxy-from-env": "^1.1.0", - "tcp-port-used": "^1.0.2" + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, - "requires": { - "color-name": "1.1.3" + "engines": { + "node": ">=0.4.0" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, - "requires": { - "delayed-stream": "~1.0.0" + "engines": { + "node": ">= 0.8" } }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, - "optional": true + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, - "compare-versions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", - "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==", + "node_modules/devtools-protocol": { + "version": "0.0.1359167", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1359167.tgz", + "integrity": "sha512-f/9PeTaSH3weS/WAwrQb5/s9R3KMOeTGe+Jkhg5952yInub7iDPjdlzRdrDgpLZfxHbTrBuG9aUkAMM+ocVkXQ==", "dev": true }, - "concat-map": { + "node_modules/di": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", "dev": true }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" + "engines": { + "node": ">=0.3.1" } }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true - }, - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "requires": { - "array-find-index": "^1.0.1" + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", - "dev": true - }, - "data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "dev": true - }, - "date-format": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.6.tgz", - "integrity": "sha512-B9vvg5rHuQ8cbUXE/RMWMyX2YA5TecT3jKF5fLtGNlzPlU7zblSPmAm2OImDbWL+LDOQ6pUm+4LOFz+ywS41Zw==", - "dev": true - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, - "requires": { - "ms": "2.0.0" - } + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } }, - "degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, - "requires": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, "dependencies": { - "escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "source-map": "~0.6.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", "dev": true }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, - "destroy": { + "node_modules/easy-table": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true + "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.2.0.tgz", + "integrity": "sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "optionalDependencies": { + "wcwidth": "^1.0.1" + } }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/edge-paths": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-3.0.5.tgz", + "integrity": "sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==", + "dev": true, + "dependencies": { + "@types/which": "^2.0.1", + "which": "^2.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/shirshak55" + } + }, + "node_modules/edge-paths/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "node_modules/edge-paths/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/edgedriver": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-5.6.1.tgz", + "integrity": "sha512-3Ve9cd5ziLByUdigw6zovVeWJjVs8QHVmqOB0sJ0WNeVPcwf4p18GnxMmVvlFmYRloUwf5suNuorea4QzwBIOA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@wdio/logger": "^8.38.0", + "@zip.js/zip.js": "^2.7.48", + "decamelize": "^6.0.0", + "edge-paths": "^3.0.5", + "fast-xml-parser": "^4.4.1", + "node-fetch": "^3.3.2", + "which": "^4.0.0" + }, + "bin": { + "edgedriver": "bin/edgedriver.js" + } + }, + "node_modules/edgedriver/node_modules/@wdio/logger": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", + "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", + "dev": true, + "dependencies": { + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": "^16.13 || >=18" } }, - "ee-first": { + "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.60", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.60.tgz", + "integrity": "sha512-HcraRUkTKJ+8yA3b10i9qvhUlPBRDlKjn1XGek1zDGVfAKcvi8TsUnImGqLiEm9j6ZulxXIWWIo9BmbkbCTGgA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "encodeurl": { + "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", + "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", + "dev": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/encoding-sniffer/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "end-of-stream": { + "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, - "requires": { + "dependencies": { "once": "^1.4.0" } }, - "engine.io": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", - "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", + "node_modules/engine.io": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", + "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==", "dev": true, - "requires": { + "dependencies": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", - "cookie": "~0.4.1", + "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.11.0" + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "engines": { + "node": ">=10.2.0" } }, - "engine.io-parser": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", - "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", - "dev": true - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true, - "requires": { - "is-arrayish": "^0.2.1" + "engines": { + "node": ">=10.0.0" } }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "node_modules/engine.io/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, - "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.2.0" - }, - "dependencies": { - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } - } + "engines": { + "node": ">= 0.6" } }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "node_modules/engine.io/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, - "requires": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" + "engines": { + "node": ">=10.0.0" }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "utf-8-validate": { + "optional": true } } }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, - "requires": { - "pend": "~1.2.0" + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" } }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/enquirer/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { - "to-regex-range": "^5.0.1" + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "node_modules/ent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.1.tgz", + "integrity": "sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A==", "dev": true, - "requires": { - "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-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "dependencies": { + "punycode": "^1.4.1" + }, + "engines": { + "node": ">= 0.4" } }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "dev": true - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "fs-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "requires": { - "null-check": "^1.0.0" + "dependencies": { + "is-arrayish": "^0.2.1" } }, - "fs-extra": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", - "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "node_modules/es-abstract": { + "version": "1.23.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", + "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "fs.realpath": { + "node_modules/es-define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "engines": { + "node": ">= 0.4" } }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, - "requires": { - "pump": "^3.0.0" + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" } }, - "get-uri": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", - "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, - "requires": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4", - "fs-extra": "^11.2.0" - }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" } }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, - "requires": { - "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" + "dependencies": { + "hasown": "^2.0.0" } }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "requires": { - "is-glob": "^4.0.1" + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "dev": true }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, - "requires": { - "function-bind": "^1.1.1" + "engines": { + "node": ">=6" } }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "has-symbols": { + "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "engines": { + "node": ">=10" }, - "dependencies": { - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "requires": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", "dev": true, - "requires": { - "agent-base": "^7.0.2", - "debug": "4" - }, + "peer": true, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" } }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/eslint-compat-utils/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "node_modules/eslint-config-standard": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", "dev": true, - "requires": { - "repeating": "^2.0.0" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0" } }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "requires": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, "dependencies": { - "sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - } + "ms": "^2.1.1" } }, - "ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "dev": true, + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-n": { + "version": "16.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", + "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", + "dev": true, + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "builtins": "^5.0.1", + "eslint-plugin-es-x": "^7.5.0", + "get-tsconfig": "^4.7.0", + "globals": "^13.24.0", + "ignore": "^5.2.4", + "is-builtin-module": "^3.2.1", + "is-core-module": "^2.12.1", + "minimatch": "^3.1.2", + "resolve": "^1.22.2", + "semver": "^7.5.3" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-n/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-n/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "dependencies": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", + "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-wdio": { + "version": "9.2.11", + "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.2.11.tgz", + "integrity": "sha512-EtrbAUdQB9ID6OcASu1fcIgKvIiY+dPsQoPRu5PQbu6wx+7Sly4R6niPlUAABox6Is7Dni4hGmQmT4cy9tHamg==", + "dev": true, + "engines": { + "node": ">=18.20.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.5.1.tgz", + "integrity": "sha512-QY5PPtSonnGwhhHDNI7+3RvY285c7iuJFFB+lU+oEzMY/gEGJ808owqJsrr8Otd1E/x07po1LkUBmdAc5duPAg==", + "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.3", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.0", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expect-webdriverio": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-5.0.4.tgz", + "integrity": "sha512-ctaY0cbpd5VQnlYMfOU31RC0CyWrdDaemGojVXvl+/xYxvOVeIyeVVzGqaMH3zMh/Q+DFIg58iCgwNwuxLWRIQ==", + "dev": true, + "dependencies": { + "@vitest/snapshot": "^2.0.5", + "expect": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "lodash.isequal": "^4.5.0" + }, + "engines": { + "node": ">=18 || >=20 || >=22" + }, + "peerDependencies": { + "@wdio/globals": "^9.0.0", + "@wdio/logger": "^9.0.0", + "webdriverio": "^9.0.0" + }, + "peerDependenciesMeta": { + "@wdio/globals": { + "optional": false + }, + "@wdio/logger": { + "optional": false + }, + "webdriverio": { + "optional": false + } + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-xml-parser": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz", + "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fd-slicer2": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fd-slicer2/-/fd-slicer2-1.2.0.tgz", + "integrity": "sha512-3lBUNUckhMZduCc4g+Pw4Ve16LD9vpX9b8qUkkKq2mgDRLYWzblszZH2luADnJqjJe+cypngjCuKRm/IW12rRw==", + "dev": true, + "dependencies": { + "pend": "^1.2.0" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/flushwritable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/flushwritable/-/flushwritable-1.0.0.tgz", + "integrity": "sha512-3VELfuWCLVzt5d2Gblk8qcqFro6nuwvxwMzHaENVDHI7rxcBRtMCwTk/E9FXcgh+82DSpavPNDueA9+RxXJoFg==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true, + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha512-05cXDIwNbFaoFWaz5gNHlUTbH5whiss/hr/ibzPd4MH3cR4w0ZKeIPiVdbyJurg3O5r/Bjpvn9KOb1/rPMf3nA==", + "dev": true, + "dependencies": { + "null-check": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/geckodriver": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-4.5.1.tgz", + "integrity": "sha512-lGCRqPMuzbRNDWJOQcUqhNqPvNsIFu6yzXF8J/6K3WCYFd2r5ckbeF7h1cxsnjA7YLSEiWzERCt6/gjZ3tW0ug==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@wdio/logger": "^9.0.0", + "@zip.js/zip.js": "^2.7.48", + "decamelize": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "node-fetch": "^3.3.2", + "tar-fs": "^3.0.6", + "which": "^4.0.0" + }, + "bin": { + "geckodriver": "bin/geckodriver.js" + }, + "engines": { + "node": "^16.13 || >=18 || >=20" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-port": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", + "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-ready": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-ready/-/get-ready-1.0.0.tgz", + "integrity": "sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==", + "dev": true + }, + "node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "dev": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/get-uri/node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "dev": true, + "dependencies": { + "ini": "1.3.7" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dev": true, + "dependencies": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/htmlfy": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/htmlfy/-/htmlfy-0.3.2.tgz", + "integrity": "sha512-FsxzfpeDYRqn1emox9VpxMPfGjADoUmmup8D604q497R0VNxiXs4ZZTN2QzkaMA5C9aHGUoe1iQRVSm+HK9xuA==", + "dev": true + }, + "node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/http": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/http/-/http-0.0.1-security.tgz", + "integrity": "sha512-RnDvP10Ty9FxqOtPZuxtebw1j4L/WiqNMDtuc1YMH1XQm5TgDRaR1G9u8upL6KD1bXHSp9eSXo/ED+8Q7FAr+g==", + "dev": true + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-link-header": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-0.8.0.tgz", + "integrity": "sha512-qsh/wKe1Mk1vtYEFr+LpQBFWTO1gxZQBdii2D0Umj+IUQ23r5sT088Rhpq4XzpSyIpaX7vwjB8Rrtx8u9JTg+Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz", + "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-ssim": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/image-ssim/-/image-ssim-0.2.0.tgz", + "integrity": "sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==", + "dev": true + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "dev": true + }, + "node_modules/inquirer": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-11.1.0.tgz", + "integrity": "sha512-CmLAZT65GG/v30c+D2Fk8+ceP6pxD6RL+hIUOWAltCmeyEqWYwqu9v76q03OvjyZ3AB0C1Ala2stn1z/rMqGEw==", + "dev": true, + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/prompts": "^6.0.1", + "@inquirer/type": "^2.0.0", + "@types/mute-stream": "^0.0.4", + "ansi-escapes": "^4.3.2", + "mute-stream": "^1.0.0", + "run-async": "^3.0.0", + "rxjs": "^7.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/intl-messageformat": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-4.4.0.tgz", + "integrity": "sha512-z+Bj2rS3LZSYU4+sNitdHrwnBhr0wO80ZJSW8EzKDBowwUe3Q/UsvgCGjrwa+HPzoGCLEb9HAjfJgo4j2Sac8w==", + "dev": true, + "dependencies": { + "intl-messageformat-parser": "^1.8.1" + } + }, + "node_modules/intl-messageformat-parser": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz", + "integrity": "sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg==", + "deprecated": "We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser", + "dev": true + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, + "node_modules/ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "peer": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "dependencies": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "node_modules/is2": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz", + "integrity": "sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" + }, + "engines": { + "node": ">=v0.10.0" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jasmine": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-5.4.0.tgz", + "integrity": "sha512-E2u4ylX5tgGYvbynImU6EUBKKrSVB1L72FEPjGh4M55ov1VsxR26RA2JU91L9YSPFgcjo4mCLyKn/QXvEYGBkA==", + "dev": true, + "dependencies": { + "glob": "^10.2.2", + "jasmine-core": "~5.4.0" + }, + "bin": { + "jasmine": "bin/jasmine.js" + } + }, + "node_modules/jasmine-ajax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jasmine-ajax/-/jasmine-ajax-4.0.0.tgz", + "integrity": "sha512-htTxNw38BSHxxmd8RRMejocdPqLalGHU6n3HWFbzp/S8AuTQd1MYjkSH3dYDsbZ7EV1Xqx/b94m3tKaVSVBV2A==", + "dev": true + }, + "node_modules/jasmine-core": { + "version": "3.99.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.99.1.tgz", + "integrity": "sha512-Hu1dmuoGcZ7AfyynN3LsfruwMbxMALMka+YtZeGoLuDEySVmVAPaonkNoBRIw/ectu8b9tVQCJNgp4a4knp+tg==", + "dev": true + }, + "node_modules/jasmine-jquery": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/jasmine-jquery/-/jasmine-jquery-2.1.1.tgz", + "integrity": "sha512-13d18zXTGeiNAjd4sAhoUGQbCEXTMbUyjrnQ9JFQM/atyyFubHejL5RCE5iyW7jOh1cwjoqVefAAsSA4SFtooQ==", + "dev": true + }, + "node_modules/jasmine/node_modules/jasmine-core": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.4.0.tgz", + "integrity": "sha512-T4fio3W++llLd7LGSGsioriDHgWyhoL6YTu4k37uwJLF7DzOzspz7mNxRoM3cQdLWtL/ebazQpIf/yZGJx/gzg==", + "dev": true + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", + "dev": true + }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "dev": true + }, + "node_modules/js-library-detector": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/js-library-detector/-/js-library-detector-6.7.0.tgz", + "integrity": "sha512-c80Qupofp43y4cJ7+8TTDN/AsDwLi5oOm/plBrWI+iQt485vKXCco+yVmOwEgdo9VOdsYTuV0UlTeetVPTriXA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dev": true, + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dev": true, + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dev": true, + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/karma": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", + "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", + "dev": true, + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.7.2", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "dev": true, + "dependencies": { + "fs-access": "^1.0.0", + "which": "^1.2.1" + } + }, + "node_modules/karma-chrome-launcher/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/karma-chrome-launcher/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/karma-coverage": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", + "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/karma-firefox-launcher": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-1.3.0.tgz", + "integrity": "sha512-Fi7xPhwrRgr+94BnHX0F5dCl1miIW4RHnzjIGxF8GaIEp7rNqX7LSi7ok63VXs3PS/5MQaQMhGxw+bvD+pibBQ==", + "dev": true, + "dependencies": { + "is-wsl": "^2.1.0" + } + }, + "node_modules/karma-jasmine": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", + "integrity": "sha512-SENGE9DhlIIFTSZWiNq4eGeXL8G6z9cqHIOdkx9jh1qhhQqwEy3tAoLRyER0vOcHqdOlKmGpOuXk+HOipIy7sg==", + "dev": true, + "engines": { + "node": ">= 4" + }, + "peerDependencies": { + "jasmine-core": "*", + "karma": "*" + } + }, + "node_modules/karma-jquery": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/karma-jquery/-/karma-jquery-0.2.4.tgz", + "integrity": "sha512-NkEzqc+ulVlOASeQRZh07wB4mv1yUUQPp5natoqcTxl+oXwIB0Hu4/g3uCIJLzvEydAxD7IxWLhZuqIigsdBOQ==", + "dev": true, + "peerDependencies": { + "karma": ">=0.9" + } + }, + "node_modules/karma-verbose-reporter": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/karma-verbose-reporter/-/karma-verbose-reporter-0.0.8.tgz", + "integrity": "sha512-wHgevIcEpfgKwR3CnWd8t1ErzWeVlctO7ZtXkKFR1inb006ogz+7ZKg95eIVOnHCYWL3Gdy1dRMOGjVP0n4MlA==", + "dev": true, + "dependencies": { + "colors": "1.4.0" + }, + "peerDependencies": { + "karma": ">=0.12" + } + }, + "node_modules/karma/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/karma/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/karma/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/karma/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/karma/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/karma/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/karma/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/karma/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/karma/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/knockout": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/knockout/-/knockout-3.5.1.tgz", + "integrity": "sha512-wRJ9I4az0QcsH7A4v4l0enUpkS++MBx0BnL/68KaLzJg7x1qmbjSlwEoCNol7KTYZ+pmtI7Eh2J0Nu6/2Z5J/Q==", + "dev": true + }, + "node_modules/ky": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", + "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/leaflet": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-0.7.7.tgz", + "integrity": "sha512-H1lR7J5VxhvQJQHlW2UywtxO63zilLrnwVsDvjKeyfntffj63Ml94gCk9YPYWBkiQgxisdiA8aJ30Zoou4VhEA==", + "dev": true + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lighthouse": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-8.6.0.tgz", + "integrity": "sha512-/H7aDL3//Gr0M1v8GGq6k0OTNty7nDVuU/o1cg6opYkfHRz1V3Nhydqz6aBzfXhUQx6iJRnxgRCPya+ZLA2vbg==", + "dev": true, + "dependencies": { + "axe-core": "4.2.3", + "chrome-launcher": "^0.14.0", + "configstore": "^5.0.1", + "csp_evaluator": "1.1.0", + "cssstyle": "1.2.1", + "enquirer": "^2.3.6", + "http-link-header": "^0.8.0", + "intl-messageformat": "^4.4.0", + "jpeg-js": "^0.4.1", + "js-library-detector": "^6.4.0", + "lighthouse-logger": "^1.3.0", + "lighthouse-stack-packs": "^1.5.0", + "lodash.clonedeep": "^4.5.0", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "lodash.set": "^4.3.2", + "lookup-closest-locale": "6.0.4", + "metaviewport-parser": "0.2.0", + "open": "^6.4.0", + "parse-cache-control": "1.0.1", + "ps-list": "^7.2.0", + "raven": "^2.2.1", + "robots-parser": "^2.0.1", + "semver": "^5.3.0", + "speedline-core": "^1.4.3", + "third-party-web": "^0.12.4", + "update-notifier": "^4.1.0", + "ws": "^7.0.0", + "yargs": "^16.1.1", + "yargs-parser": "^20.2.4" + }, + "bin": { + "chrome-debug": "lighthouse-core/scripts/manual-chrome-launcher.js", + "lighthouse": "lighthouse-cli/index.js", + "smokehouse": "lighthouse-cli/test/smokehouse/frontends/smokehouse-bin.js" + }, + "engines": { + "node": ">=12.20.0 12 || >=14.13 14 || >=15" + } + }, + "node_modules/lighthouse-logger": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", + "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "marky": "^1.2.2" + } + }, + "node_modules/lighthouse-logger/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/lighthouse-logger/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/lighthouse-stack-packs": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.12.2.tgz", + "integrity": "sha512-Ug8feS/A+92TMTCK6yHYLwaFMuelK/hAKRMdldYkMNwv+d9PtWxjXEg6rwKtsUXTADajhdrhXyuNCJ5/sfmPFw==", + "dev": true + }, + "node_modules/lighthouse/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/lighthouse/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/lighthouse/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/lighthouse/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/lighthouse/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lighthouse/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lighthouse/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lighthouse/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/locate-app": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.5.0.tgz", + "integrity": "sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://buymeacoffee.com/hejny" + }, + { + "type": "github", + "url": "https://github.com/hejny/locate-app/blob/main/README.md#%EF%B8%8F-contributing" + } + ], + "dependencies": { + "@promptbook/utils": "0.69.5", + "type-fest": "4.26.0", + "userhome": "1.0.1" + } + }, + "node_modules/locate-app/node_modules/type-fest": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.0.tgz", + "integrity": "sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, + "node_modules/lodash.pickby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz", + "integrity": "sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==", + "dev": true + }, + "node_modules/lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==", + "dev": true + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true + }, + "node_modules/lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", + "dev": true + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/loglevel": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/loglevel-plugin-prefix": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", + "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", + "dev": true + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "dev": true + }, + "node_modules/lookup-closest-locale": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/lookup-closest-locale/-/lookup-closest-locale-6.0.4.tgz", + "integrity": "sha512-bWoFbSGe6f1GvMGzj17LrwMX4FhDXDwZyH04ySVCPbtOJADcSRguZNKewoJ3Ful/MOxD/wRHvFPadk/kYZUbuQ==", + "dev": true + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/marky": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", + "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", + "dev": true + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/metaviewport-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/metaviewport-parser/-/metaviewport-parser-0.2.0.tgz", + "integrity": "sha512-qL5NtY18LGs7lvZCkj3ep2H4Pes9rIiSLZRUyfDdvVw7pWFA0eLwmqaIxApD74RGvUrNEtk9e5Wt1rT+VlCvGw==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.46.tgz", + "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==", + "dev": true, + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-jose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-jose/-/node-jose-2.2.0.tgz", + "integrity": "sha512-XPCvJRr94SjLrSIm4pbYHKLEaOsDvJCpyFw/6V/KK/IXmyZ6SFBzAUDO9HQf4DB/nTEFcRGH87mNciOP23kFjw==", + "dev": true, + "dependencies": { + "base64url": "^3.0.1", + "buffer": "^6.0.3", + "es6-promise": "^4.2.8", + "lodash": "^4.17.21", + "long": "^5.2.0", + "node-forge": "^1.2.1", + "pako": "^2.0.4", + "process": "^0.11.10", + "uuid": "^9.0.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha512-j8ZNHg19TyIQOWCGeeQJBuu6xZYIEurf8M1Qsfd8mFrGEfIZytbw18YjKWg+LcO25NowXGZXZpKAx+Ui3TFfDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/open/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "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.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", + "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", + "dev": true, + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.5", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, + "node_modules/package-json/node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json/node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json/node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "node_modules/package-json/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/package-json/node_modules/got/node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/package-json/node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "dev": true + }, + "node_modules/package-json/node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/package-json/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dev": true, + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/package-json/node_modules/responselike/node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "dev": true + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", + "dev": true + }, + "node_modules/parse-json": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz", + "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.21.4", + "error-ex": "^1.3.2", + "json-parse-even-better-errors": "^3.0.0", + "lines-and-columns": "^2.0.3", + "type-fest": "^3.8.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "dev": true, + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dev": true, + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-ms": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.1.0.tgz", + "integrity": "sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==", + "dev": true, + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/properties/-/properties-1.2.1.tgz", + "integrity": "sha512-qYNxyMj1JeW54i/EWEFsM1cVwxJbtgPp8+0Wg9XjNaK6VE/c4oRi6PNu5p7w1mNXEIQIjV5Wwn8v8Gz82/QzdQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/ps-list": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-7.2.0.tgz", + "integrity": "sha512-v4Bl6I3f2kJfr5o80ShABNHAokIgY+wFDTQfE+X3zWYgSGQOCBeYptLZUpoOALBqO5EawmDN/tjTldJesd0ujQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/puppeteer-core": { + "version": "22.15.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.15.0.tgz", + "integrity": "sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@puppeteer/browsers": "2.3.0", + "chromium-bidi": "0.6.3", + "debug": "^4.3.6", + "devtools-protocol": "0.0.1312386", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core/node_modules/@puppeteer/browsers": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.3.0.tgz", + "integrity": "sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.3.5", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.4.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core/node_modules/devtools-protocol": { + "version": "0.0.1312386", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", + "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/puppeteer-core/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/puppeteer-core/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/query-selector-shadow-dom": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz", + "integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==", + "dev": true + }, + "node_modules/query-string": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", + "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", + "dev": true, + "dependencies": { + "decode-uri-component": "^0.2.2", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raven": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/raven/-/raven-2.6.4.tgz", + "integrity": "sha512-6PQdfC4+DQSFncowthLf+B6Hr0JpPsFBgTVYTAOq7tCmx/kR4SXbeawtPch20+3QfUcQDoJBLjWW1ybvZ4kXTw==", + "deprecated": "Please upgrade to @sentry/node. See the migration guide https://bit.ly/3ybOlo7", + "dev": true, + "dependencies": { + "cookie": "0.3.1", + "md5": "^2.2.1", + "stack-trace": "0.0.10", + "timed-out": "4.0.1", + "uuid": "3.3.2" + }, + "bin": { + "raven": "bin/raven" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/raven/node_modules/uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/read-pkg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", + "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^6.0.0", + "parse-json": "^7.0.0", + "type-fest": "^4.2.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.1.0.tgz", + "integrity": "sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0", + "read-pkg": "^8.1.0", + "type-fest": "^4.2.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.27.0.tgz", + "integrity": "sha512-3IMSWgP7C5KSQqmo1wjhKrwsvXAtF33jO3QY+Uy++ia7hqvgSK6iXbbg5PbDBc1P2ZbNEDgejOrN4YooXvhwCw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.27.0.tgz", + "integrity": "sha512-3IMSWgP7C5KSQqmo1wjhKrwsvXAtF33jO3QY+Uy++ia7hqvgSK6iXbbg5PbDBc1P2ZbNEDgejOrN4YooXvhwCw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "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" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "dev": true, + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/resq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/resq/-/resq-1.11.0.tgz", + "integrity": "sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^2.0.1" + } + }, + "node_modules/resq/node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", + "dev": true + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/rgb2hex": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.5.tgz", + "integrity": "sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/robots-parser": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/robots-parser/-/robots-parser-2.4.0.tgz", + "integrity": "sha512-oO8f2SI04dJk3pbj2KOMJ4G6QfPAgqcGmrYGmansIcpRewIPT2ljWEt5I+ip6EgiyaLo+RXkkUWw74M25HDkMA==", + "dev": true + }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safaridriver": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/safaridriver/-/safaridriver-0.1.2.tgz", + "integrity": "sha512-4R309+gWflJktzPXBQCobbWEHlzC4aK3a+Ov3tz2Ib2aBxiwd11phkdIBH1l0EO22x24CJMUQkpKFumRriCSRg==", + "dev": true + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/saucelabs": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-8.0.0.tgz", + "integrity": "sha512-Rj9m4OCniYk+c4MFuZGqvz64RPX6oRzMqt0bTr9T27IXGnA7Ic7Ms/VHgPtRcJFP6H3sQ169WOzazPZcW4BIAg==", + "dev": true, + "dependencies": { + "change-case": "^4.1.2", + "compressing": "^1.10.0", + "form-data": "^4.0.0", + "got": "^11.8.6", + "hash.js": "^1.1.7", + "query-string": "^7.1.3", + "tunnel": "^0.0.6", + "yargs": "^17.2.1" + }, + "bin": { + "sl": "bin/sl" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/serialize-error": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-11.0.3.tgz", + "integrity": "sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==", + "dev": true, + "dependencies": { + "type-fest": "^2.12.2" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/socket.io": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "dev": true, + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spacetrim": { + "version": "0.11.59", + "resolved": "https://registry.npmjs.org/spacetrim/-/spacetrim-0.11.59.tgz", + "integrity": "sha512-lLYsktklSRKprreOm7NXReW8YiX2VBjbgmXYEziOoGf/qsJqAEACaDvoTtUOycwjpaSh+bT8eu0KrJn7UNxiCg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://buymeacoffee.com/hejny" + }, + { + "type": "github", + "url": "https://github.com/hejny/spacetrim/blob/main/README.md#%EF%B8%8F-contributing" + } + ] + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "dev": true + }, + "node_modules/speedline-core": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/speedline-core/-/speedline-core-1.4.3.tgz", + "integrity": "sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog==", + "dev": true, + "dependencies": { + "@types/node": "*", + "image-ssim": "^0.2.0", + "jpeg-js": "^0.4.1" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-buffers": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.3.tgz", + "integrity": "sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/streamifier": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", + "integrity": "sha512-zDgl+muIlWzXNsXeyUfOk9dChMjlpkq0DRsxujtYPgyJ676yQ8jEm6zzaaWHFDg5BNcLuif0eD2MTyJdZqXpdg==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dev": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/streamroller/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/streamroller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/streamroller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/streamx": { + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.2.tgz", + "integrity": "sha512-aDGDLU+j9tJcUdPGOaHmVF1u/hhI+CsGkT02V3OKlHDV7IukOI+nTWAGkiZEKCO35rWN1wIr4tS7YFr1f4qSvA==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { - "binary-extensions": "^2.0.0" + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", "dev": true }, - "is-finite": { + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar-fs": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "node_modules/tar-fs/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tcp-port-used": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", + "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", "dev": true, - "requires": { - "number-is-nan": "^1.0.0" + "dependencies": { + "debug": "4.3.1", + "is2": "^2.0.6" } }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/tcp-port-used/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/tcp-port-used/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", "dev": true, - "requires": { - "is-extglob": "^2.1.1" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/text-decoder": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz", + "integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==", "dev": true }, - "is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "node_modules/third-party-web": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.12.7.tgz", + "integrity": "sha512-9d/OfjEOjyeOpnm4F9o0KSK6BI6ytvi9DINSB5h1+jdlCvQlhKpViMSxWpBN9WstdfDQ61BS6NxWqcPCuQCAJg==", "dev": true }, - "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, - "is2": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz", - "integrity": "sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==", + "node_modules/timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", "dev": true, - "requires": { - "deep-is": "^0.1.3", - "ip-regex": "^4.1.0", - "is-url": "^1.2.4" + "engines": { + "node": ">=0.10.0" } }, - "isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", "dev": true }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", - "dev": true, - "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true, + "engines": { + "node": ">=6" } }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@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" - }, + "node_modules/tsx": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", + "dev": true, + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" + "engines": { + "node": ">=10" }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, - "requires": { - "html-escaper": "^2.0.0" + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" } }, - "jasmine-core": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", - "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", - "dev": true - }, - "jasmine-jquery": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/jasmine-jquery/-/jasmine-jquery-2.1.1.tgz", - "integrity": "sha1-1AleZGlEomdjI1dpqwGNnzDw1Hs=", - "dev": true - }, - "jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "karma": { - "version": "6.3.17", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.17.tgz", - "integrity": "sha512-2TfjHwrRExC8yHoWlPBULyaLwAFmXmxQrcuFImt/JsAsSZu1uOWTZ1ZsWjqQtWpHLiatJOHL5jFjXSJIgCd01g==", + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.2.0", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "karma-chrome-launcher": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", - "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, - "requires": { - "fs-access": "^1.0.0", - "which": "^1.2.1" + "dependencies": { + "is-typedarray": "^1.0.0" } }, - "karma-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.0.1.tgz", - "integrity": "sha512-SnFkHsnLsaXfxkey51rRN9JDLAEKYW2Lb0qOEvcruukk0NkSNDkjobNDZPt9Ni3kIhLZkLtpGOz661hN7OaZvQ==", - "dev": true, - "requires": { - "dateformat": "^1.0.6", - "istanbul": "^0.4.0", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "lodash": "^4.17.11", - "minimatch": "^3.0.0", - "source-map": "^0.5.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "node_modules/ua-parser-js": { + "version": "0.7.39", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.39.tgz", + "integrity": "sha512-IZ6acm6RhQHNibSt7+c09hhvsKy9WUr4DVbeq9U8o71qxyYtJpQeDxQnMrVqnIFMLcQjHO0I9wgfO2vIahht4w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" } + ], + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" } }, - "karma-firefox-launcher": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-1.3.0.tgz", - "integrity": "sha512-Fi7xPhwrRgr+94BnHX0F5dCl1miIW4RHnzjIGxF8GaIEp7rNqX7LSi7ok63VXs3PS/5MQaQMhGxw+bvD+pibBQ==", + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, - "requires": { - "is-wsl": "^2.1.0" + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "karma-jasmine": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", - "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "dev": true, - "requires": {} + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } }, - "karma-jquery": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/karma-jquery/-/karma-jquery-0.2.4.tgz", - "integrity": "sha512-NkEzqc+ulVlOASeQRZh07wB4mv1yUUQPp5natoqcTxl+oXwIB0Hu4/g3uCIJLzvEydAxD7IxWLhZuqIigsdBOQ==", + "node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, - "requires": {} + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } }, - "knockout": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/knockout/-/knockout-3.5.1.tgz", - "integrity": "sha512-wRJ9I4az0QcsH7A4v4l0enUpkS++MBx0BnL/68KaLzJg7x1qmbjSlwEoCNol7KTYZ+pmtI7Eh2J0Nu6/2Z5J/Q==", - "dev": true + "node_modules/undici": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz", + "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==", + "dev": true, + "engines": { + "node": ">=18.17" + } }, - "leaflet": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-0.7.7.tgz", - "integrity": "sha1-HjUrpU5j0HZFH6NjyQCJDLLPde4=", + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, - "levn": { + "node_modules/unicorn-magic": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "engines": { + "node": ">=18" }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "log4js": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.4.tgz", - "integrity": "sha512-ncaWPsuw9Vl1CKA406hVnJLGQKy1OHx6buk8J4rE2lVW+NW5Y82G5/DIloO7NkqLOUtNPEANaWC1kZYVjXssPw==", + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, - "requires": { - "date-format": "^4.0.6", - "debug": "^4.3.4", - "flatted": "^3.2.5", - "rfdc": "^1.3.0", - "streamroller": "^3.0.6" - }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" + "engines": { + "node": ">= 10.0.0" } }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "engines": { + "node": ">= 0.8" } }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, - "requires": { - "mime-db": "1.52.0" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", "dev": true, - "requires": { - "brace-expansion": "^1.1.7" + "dependencies": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" } }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/update-notifier/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { - "minimist": "^1.2.6" + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "dev": true - }, - "moment-timezone": { - "version": "0.5.35", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.35.tgz", - "integrity": "sha512-cY/pBOEXepQvlgli06ttCTKcIf8cD1nmNwOKQQAdHBqYApQSpAqotBMX0RJZNgMp6i0PlZuf1mFtnlyEkwyvFw==", + "node_modules/update-notifier/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "requires": { - "moment": ">= 2.9.0" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true + "node_modules/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } }, - "netmask": { + "node_modules/upper-case-first": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "dev": true + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "requires": { - "abbrev": "1" + "dependencies": { + "punycode": "^2.1.0" } }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "engines": { + "node": ">=6" } }, - "normalize-path": { + "node_modules/url-parse-lax": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "dev": true, + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } }, - "null-check": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", "dev": true }, - "number-is-nan": { + "node_modules/userhome": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "resolved": "https://registry.npmjs.org/userhome/-/userhome-1.0.1.tgz", + "integrity": "sha512-5cnLm4gseXjAclKowC4IjByaGsjtAoV6PrOQOljplNB54ReUYJP8HdAFq2muHinSDAh09PPX/uXDPfdxRHvuSA==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, - "requires": { - "ee-first": "1.1.1" + "engines": { + "node": ">= 0.4.0" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "dev": true, - "requires": { - "wrappy": "1" + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" } }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "requires": { - "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" + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "pac-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", - "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, - "requires": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.2" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "engines": { + "node": ">= 0.8" } }, - "pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", "dev": true, - "requires": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" + "engines": { + "node": ">=0.10.0" } }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "node_modules/wait-port": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-1.1.0.tgz", + "integrity": "sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==", "dev": true, - "requires": { - "error-ex": "^1.2.0" + "dependencies": { + "chalk": "^4.1.2", + "commander": "^9.3.0", + "debug": "^4.3.4" + }, + "bin": { + "wait-port": "bin/wait-port.js" + }, + "engines": { + "node": ">=10" } }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true + "node_modules/wait-port/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "node_modules/wait-port/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "path-is-absolute": { + "node_modules/wcwidth": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "optional": true, + "dependencies": { + "defaults": "^1.0.3" + } }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "node_modules/wdio-video-reporter": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/wdio-video-reporter/-/wdio-video-reporter-6.1.1.tgz", + "integrity": "sha512-hNTjFK2mGTDURiDt8MDuV0TkoF0FeegPN8vmWFm5bdZfvwPzEseyL/mX7SChaX9ldJRu402/6i0AEniXzONXuQ==", + "dev": true, + "dependencies": { + "@ffmpeg-installer/ffmpeg": "^1.1.0", + "@wdio/allure-reporter": "^9.1.3", + "@wdio/globals": "^9.2.6", + "@wdio/logger": "^9.1.3", + "@wdio/reporter": "^9.1.3", + "@wdio/types": "^9.1.3", + "glob": "^11.0.0" + } }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "node_modules/wdio-video-reporter/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "balanced-match": "^1.0.0" } }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true + "node_modules/wdio-video-reporter/node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "node_modules/wdio-video-reporter/node_modules/jackspeak": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true + "node_modules/wdio-video-reporter/node_modules/lru-cache": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "dev": true, + "engines": { + "node": "20 || >=22" + } }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true + "node_modules/wdio-video-reporter/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "node_modules/wdio-video-reporter/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", "dev": true, - "requires": { - "pinkie": "^2.0.0" + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "engines": { + "node": ">= 8" + } }, - "proxy-agent": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", - "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "node_modules/webdriver": { + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-9.2.8.tgz", + "integrity": "sha512-40NtUC1zME9tPHNfZv6ETSE3+aE75qZuKjbVAA0gj02AkO1Nl3yJmf5RLdaLLfIQ2WlrbRP1g8KXlkiiVCmakg==", "dev": true, - "requires": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.3", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" + "dependencies": { + "@types/node": "^20.1.0", + "@types/ws": "^8.5.3", + "@wdio/config": "9.2.8", + "@wdio/logger": "9.1.3", + "@wdio/protocols": "9.2.2", + "@wdio/types": "9.2.2", + "@wdio/utils": "9.2.8", + "deepmerge-ts": "^7.0.3", + "ws": "^8.8.0" + }, + "engines": { + "node": ">=18.20.0" + } + }, + "node_modules/webdriver/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "utf-8-validate": { + "optional": true } } }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "node_modules/webdriverio": { + "version": "9.2.14", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-9.2.14.tgz", + "integrity": "sha512-85yEbwN3MwdrGzKZoGkLUf1J5cpfnc7knL4u/Y6XWd0gGwYjv60I5ZPsgSnXzNXAkq2kmtkammf1AM3ihqFM3A==", + "dev": true, + "dependencies": { + "@types/node": "^20.11.30", + "@types/sinonjs__fake-timers": "^8.1.5", + "@wdio/config": "9.2.8", + "@wdio/logger": "9.1.3", + "@wdio/protocols": "9.2.2", + "@wdio/repl": "9.0.8", + "@wdio/types": "9.2.2", + "@wdio/utils": "9.2.8", + "archiver": "^7.0.1", + "aria-query": "^5.3.0", + "cheerio": "^1.0.0-rc.12", + "css-shorthand-properties": "^1.1.1", + "css-value": "^0.0.1", + "grapheme-splitter": "^1.0.4", + "htmlfy": "^0.3.0", + "import-meta-resolve": "^4.0.0", + "is-plain-obj": "^4.1.0", + "jszip": "^3.10.1", + "lodash.clonedeep": "^4.5.0", + "lodash.zip": "^4.2.0", + "minimatch": "^9.0.3", + "query-selector-shadow-dom": "^1.0.1", + "resq": "^1.11.0", + "rgb2hex": "0.2.5", + "serialize-error": "^11.0.3", + "urlpattern-polyfill": "^10.0.0", + "webdriver": "9.2.8" + }, + "engines": { + "node": ">=18.20.0" + }, + "peerDependencies": { + "puppeteer-core": "^22.3.0" + }, + "peerDependenciesMeta": { + "puppeteer-core": { + "optional": true + } + } }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "node_modules/webdriverio/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/webdriverio/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "requires": { - "side-channel": "^1.0.4" + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, - "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" } }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "engines": { + "node": ">=18" } }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, - "requires": { - "picomatch": "^2.2.1" + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" } }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, - "requires": { - "is-finite": "^1.0.0" + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, - "requires": { - "path-parse": "^1.0.6" + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "dev": true, - "requires": { - "glob": "^7.1.3" + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/widest-line/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true - }, - "socket.io": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", - "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.4.1", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.1" - }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "socket.io-adapter": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", - "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "requires": { - "ws": "~8.11.0" + "engines": { + "node": ">=0.10.0" } }, - "socket.io-parser": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", - "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "requires": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, - "socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "requires": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, - "streamroller": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.6.tgz", - "integrity": "sha512-Qz32plKq/MZywYyhEatxyYc8vs994Gz0Hu2MSYXXLD233UyPeIeRBZARIIGwFer4Mdb8r3Y2UqKkgyDghM6QCg==", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { - "date-format": "^4.0.6", - "debug": "^4.3.4", - "fs-extra": "^10.0.1" - }, "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "string-width": { + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "requires": { + "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "strip-ansi": { + "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { + "dependencies": { "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, - "requires": { - "get-stdin": "^4.0.1" + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, - "tcp-port-used": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", - "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, - "requires": { - "debug": "4.3.1", - "is2": "^2.0.6" + "engines": { + "node": ">=8.3.0" }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "utf-8-validate": { + "optional": true } } }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "dev": true, - "requires": { - "rimraf": "^3.0.0" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "engines": { + "node": ">=8" } }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, - "requires": { - "is-number": "^7.0.0" + "engines": { + "node": ">=0.4" } }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", - "dev": true + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "requires": { - "prelude-ls": "~1.1.2" + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" } }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "engines": { + "node": ">=10" } }, - "ua-parser-js": { - "version": "0.7.33", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.33.tgz", - "integrity": "sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw==", + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "uglify-js": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.6.tgz", - "integrity": "sha512-yYqjArOYSxvqeeiYH2VGjZOqq6SVmhxzaPjJC1W2F9e+bqvFL9QXQ2osQuKUFjM2hGjKG2YclQnRKWQSt/nOTQ==", + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "optional": true, - "requires": { - "commander": "~2.20.3", - "source-map": "~0.6.1" + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true - }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "requires": { - "isexe": "^2.0.0" + "engines": { + "node": ">=12" } }, - "word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3" + } }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "engines": { + "node": ">=10" }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "node_modules/yoctocolors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", "dev": true, - "requires": {} + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "node_modules/zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "dev": true, + "dependencies": { + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/zip-stream/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, - "requires": { - "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" + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true + "node_modules/zip-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" + "optional": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" } } } diff --git a/package.json b/package.json index b3e1baa05..ac4d2ef35 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "biocollect", - "version": "6.0", + "version": "7.1", "description": "Karma / jasmine configuration for testing project javascript", "main": "test/unit/javascript", "directories": { @@ -8,25 +8,52 @@ }, "devDependencies": { "@metahub/karma-jasmine-jquery": "^2.0.1", - "chromedriver": "^128.0.0", + "@wdio/cli": "^9.2.14", + "@wdio/devtools-service": "^8.40.2", + "@wdio/globals": "^9.2.14", + "@wdio/jasmine-framework": "^9.2.14", + "@wdio/local-runner": "^9.2.14", + "@wdio/sauce-service": "^9.2.14", + "@wdio/spec-reporter": "^9.2.14", + "axios": "^1.7.7", + "chromedriver": "^130.0.4", + "crypto": "^1.0.1", + "eslint": "^8.57.1", + "eslint-config-standard": "^17.1.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^6.4.0", + "eslint-plugin-wdio": "^9.2.11", + "http": "^0.0.1-security", + "http-proxy": "^1.18.1", + "jasmine": "^5.0.0", + "jasmine-ajax": "^4.0.0", "jasmine-core": "^3.5.0", "jasmine-jquery": "^2.0.0", "jquery": "^3.4.1", + "jsonwebtoken": "^9.0.2", "karma": "^6.3.4", "karma-chrome-launcher": "^2.2.0", "karma-coverage": "^2.0.1", "karma-firefox-launcher": "^1.3.0", "karma-jasmine": "^1.1.2", "karma-jquery": "^0.2.4", + "karma-verbose-reporter": "^0.0.8", "knockout": "^3.5.1", "leaflet": "0.7.7", "lodash": "^4.17.21", "moment": "^2.24.0", - "moment-timezone": "^0.5.35" + "moment-timezone": "^0.5.35", + "node-jose": "^2.2.0", + "wdio-video-reporter": "^6.1.1", + "webdriverio": "^9.2.14" }, "scripts": { "test": "karma start karma.conf.js", - "debug": "karma start --debug --browsers=ChromeHeadless --single-run=false" + "debug": "karma start --debug --browsers=ChromeHeadless --single-run=false", + "integration-test": "wdio run wdio.local.conf.js", + "integration-test:local": "wdio run wdio.local.conf.js", + "integration-test:sauce": "wdio run wdio.sauce.conf.js" }, "author": "", "license": "" diff --git a/src/integration-test/groovy/au/org/ala/biocollect/StubbedCasSpec.groovy b/src/integration-test/groovy/au/org/ala/biocollect/StubbedCasSpec.groovy index a53d686f4..4b519df57 100644 --- a/src/integration-test/groovy/au/org/ala/biocollect/StubbedCasSpec.groovy +++ b/src/integration-test/groovy/au/org/ala/biocollect/StubbedCasSpec.groovy @@ -2,9 +2,13 @@ package au.org.ala.biocollect import com.github.tomakehurst.wiremock.WireMockServer import com.github.tomakehurst.wiremock.extension.responsetemplating.ResponseTemplateTransformer + +import com.nimbusds.jose.jwk.JWKSet + import com.nimbusds.jose.jwk.RSAKey import geb.Browser import grails.converters.JSON +import io.jsonwebtoken.security.Keys import org.grails.web.converters.marshaller.json.CollectionMarshaller import org.grails.web.converters.marshaller.json.MapMarshaller import org.openqa.selenium.StaleElementReferenceException @@ -18,7 +22,7 @@ import wiremock.com.github.jknack.handlebars.Options import wiremock.com.google.common.collect.ImmutableMap import java.security.KeyPair - +import java.security.interfaces.RSAPublicKey import static com.github.tomakehurst.wiremock.client.WireMock.* import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options @@ -201,6 +205,21 @@ class StubbedCasSpec extends BiocollectFunctionalTest { loggedInUser = userDetails.userId } + def jks() { + KeyPair keyPair = Keys.keyPairFor(SignatureAlgorithm.RS256); + + // Convert the public key to JWKS format + RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); + RSAKey rsaKey = new RSAKey.Builder(publicKey) + .keyID("1") + .build(); + JWKSet jwkSet = new JWKSet(rsaKey); + + // Print the JWKS + System.out.println(jwkSet.toPublicJWKSet().toString()); + + } + def oidcLogin(Map userDetails, Browser browser) { setupOidcAuthForUser(userDetails) browser.go "${browser.getConfig().baseUrl}login" diff --git a/src/integration-test/resources/data/1.json b/src/integration-test/resources/data/1.json new file mode 100644 index 000000000..29b727e3e --- /dev/null +++ b/src/integration-test/resources/data/1.json @@ -0,0 +1,1426 @@ +[ + { + "guid": "NZOR-6-48962", + "commonName": "", + "listId": "all", + "rankString": "kingdom", + "scientificName": "Eukaryota", + "name": "Eukaryota" + }, + { + "guid": "NZOR-6-44464", + "commonName": "", + "listId": "all", + "rankString": "kingdom", + "scientificName": "Prokaryota", + "name": "Prokaryota" + }, + { + "guid": "NZOR-6-29373", + "commonName": "", + "listId": "all", + "rankString": "kingdom", + "scientificName": "Archaea", + "name": "Archaea" + }, + { + "guid": "NZOR-6-73174", + "commonName": "", + "listId": "all", + "rankString": "kingdom", + "scientificName": "Bacteria", + "name": "Bacteria" + }, + { + "guid": "134364ec-2f27-452d-a01c-8f2035ab5053", + "commonName": "", + "listId": "all", + "rankString": "kingdom", + "scientificName": "Chromista", + "name": "Chromista" + }, + { + "guid": "urn:lsid:indexfungorum.org:names:90156", + "commonName": "", + "listId": "all", + "rankString": "kingdom", + "scientificName": "Fungi", + "name": "Fungi" + }, + { + "guid": "https://id.biodiversity.org.au/taxon/apni/51337710", + "commonName": "", + "listId": "all", + "rankString": "kingdom", + "scientificName": "Plantae", + "name": "Plantae" + }, + { + "guid": "urn:lsid:indexfungorum.org:names:99001", + "commonName": "", + "listId": "all", + "rankString": "kingdom", + "scientificName": "Protozoa", + "name": "Protozoa" + }, + { + "guid": "NZOR-6-10705", + "commonName": "", + "listId": "all", + "rankString": "kingdom", + "scientificName": "Viroid", + "name": "Viroid" + }, + { + "guid": "NZOR-6-35107", + "commonName": "", + "listId": "all", + "rankString": "kingdom", + "scientificName": "Virus", + "name": "Virus" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:4647863b-760d-4b59-aaa1-502c8cdf8d3c", + "commonName": "animals", + "listId": "all", + "rankString": "kingdom", + "scientificName": "ANIMALIA", + "name": "ANIMALIA (animals)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:932fe780-c493-4397-9455-69d0e37159a4", + "commonName": "", + "listId": "all", + "rankString": "kingdom", + "scientificName": "PROTISTA", + "name": "PROTISTA" + }, + { + "guid": "NZOR-6-42085", + "commonName": "", + "listId": "all", + "rankString": "subkingdom", + "scientificName": "Negibacteria", + "name": "Negibacteria" + }, + { + "guid": "NZOR-6-8766", + "commonName": "", + "listId": "all", + "rankString": "subkingdom", + "scientificName": "Unibacteria", + "name": "Unibacteria" + }, + { + "guid": "NZOR-6-130416", + "commonName": "", + "listId": "all", + "rankString": "subkingdom", + "scientificName": "Biliphyta", + "name": "Biliphyta" + }, + { + "guid": "NZOR-6-79752", + "commonName": "", + "listId": "all", + "rankString": "subkingdom", + "scientificName": "Dikarya", + "name": "Dikarya" + }, + { + "guid": "NZOR-6-59991", + "commonName": "", + "listId": "all", + "rankString": "subkingdom", + "scientificName": "Hacrobia", + "name": "Hacrobia" + }, + { + "guid": "NZOR-6-21545", + "commonName": "", + "listId": "all", + "rankString": "subkingdom", + "scientificName": "Harosa", + "name": "Harosa" + }, + { + "guid": "NZOR-6-83103", + "commonName": "", + "listId": "all", + "rankString": "subkingdom", + "scientificName": "Rhodoplantae", + "name": "Rhodoplantae" + }, + { + "guid": "NZOR-6-17310", + "commonName": "", + "listId": "all", + "rankString": "subkingdom", + "scientificName": "Viridiplantae", + "name": "Viridiplantae" + }, + { + "guid": "NZOR-6-12915", + "commonName": "", + "listId": "all", + "rankString": "subkingdom", + "scientificName": "Eozoa", + "name": "Eozoa" + }, + { + "guid": "NZOR-6-30747", + "commonName": "", + "listId": "all", + "rankString": "subkingdom", + "scientificName": "Sarcomastigota", + "name": "Sarcomastigota" + }, + { + "guid": "NZOR-6-129274", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Acidobacteria", + "name": "Acidobacteria" + }, + { + "guid": "NZOR-6-15046", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Actinobacteria", + "name": "Actinobacteria" + }, + { + "guid": "ecd9d9369ada5a6b101ed67384738f83", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Aquificae", + "name": "Aquificae" + }, + { + "guid": "NZOR-6-226", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Archaebacteria", + "name": "Archaebacteria" + }, + { + "guid": "NZOR-6-34248", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Armatimonadetes", + "name": "Armatimonadetes" + }, + { + "guid": "NZOR-6-107505", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Bacteroidetes", + "name": "Bacteroidetes" + }, + { + "guid": "61dd3598943ea9f235f636ffb2d10eb5", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Caldiserica", + "name": "Caldiserica" + }, + { + "guid": "7fb1a584281ab78b396f5620de50dc7a", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Chlamydiae", + "name": "Chlamydiae" + }, + { + "guid": "NZOR-6-72846", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Chlorobi", + "name": "Chlorobi" + }, + { + "guid": "NZOR-6-78212", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Chloroflexi", + "name": "Chloroflexi" + }, + { + "guid": "f77893cbc79d80ba59e7e43999216cc4", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Chrysiogenetes", + "name": "Chrysiogenetes" + }, + { + "guid": "NZOR-6-123649", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Crenarchaeota", + "name": "Crenarchaeota" + }, + { + "guid": "NZOR-6-113866", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Cyanobacteria", + "name": "Cyanobacteria" + }, + { + "guid": "81dcbc04262b99ec0f3ea6a249cf9cfe", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Deferribacteres", + "name": "Deferribacteres" + }, + { + "guid": "NZOR-6-80347", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Deinococcus-Thermus", + "name": "Deinococcus-Thermus" + }, + { + "guid": "60e3432a71b5b2fdc119402818f87d2a", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Dictyoglomi", + "name": "Dictyoglomi" + }, + { + "guid": "abb1c5486c19f6bd30a105c29a812ae4", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Elusimicrobia", + "name": "Elusimicrobia" + }, + { + "guid": "NZOR-6-114068", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Eobacteria", + "name": "Eobacteria" + }, + { + "guid": "NZOR-6-30865", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Euryarchaeota", + "name": "Euryarchaeota" + }, + { + "guid": "e77e7fbb0df227fffcfd278dfb3cf322", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Fibrobacteres", + "name": "Fibrobacteres" + }, + { + "guid": "NZOR-6-60155", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Firmicutes", + "name": "Firmicutes" + }, + { + "guid": "NZOR-6-40354", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Fusobacteria", + "name": "Fusobacteria" + }, + { + "guid": "1c7c3316ac727c04346a03ff6cd4917a", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Gemmatimonadetes", + "name": "Gemmatimonadetes" + }, + { + "guid": "d8748a9af6ef6f57158b90df90763634", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Lentisphaerae", + "name": "Lentisphaerae" + }, + { + "guid": "cad3eecd3286dd27efda8fa6635537eb", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Nitrospira", + "name": "Nitrospira" + }, + { + "guid": "3129c26f949d35abf1ee403b7af250bc", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Planctomycetes", + "name": "Planctomycetes" + }, + { + "guid": "NZOR-6-9465", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Posibacteria", + "name": "Posibacteria" + }, + { + "guid": "NZOR-6-129863", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Proteobacteria", + "name": "Proteobacteria" + }, + { + "guid": "NZOR-6-72033", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Sphingobacteria", + "name": "Sphingobacteria" + }, + { + "guid": "16c8c6f073cb5b7cfb4667b3e477c4de", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Spirochaetae", + "name": "Spirochaetae" + }, + { + "guid": "3348d512ea45122c78310ccf19f8814d", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Synergistetes", + "name": "Synergistetes" + }, + { + "guid": "3bc7c644f11b72621ee35c1d860dcd3d", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Tenericutes", + "name": "Tenericutes" + }, + { + "guid": "044b3e3c203559d562f4a9db535e5b7c", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Thermodesulfobacteria", + "name": "Thermodesulfobacteria" + }, + { + "guid": "6d2581bf62879d6a64b229d06dd83349", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Thermotogae", + "name": "Thermotogae" + }, + { + "guid": "NZOR-6-22013", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Verrucomicrobia", + "name": "Verrucomicrobia" + }, + { + "guid": "NZOR-6-61857", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Acrasiomycota", + "name": "Acrasiomycota" + }, + { + "guid": "urn:lsid:indexfungorum.org:names:90876", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Amoebozoa", + "name": "Amoebozoa" + }, + { + "guid": "NZOR-6-73551", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Anamorphic fungi", + "name": "Anamorphic fungi" + }, + { + "guid": "https://id.biodiversity.org.au/node/ausmoss/9873243", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Anthocerotophyta", + "name": "Anthocerotophyta" + }, + { + "guid": "urn:lsid:indexfungorum.org:names:90031", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Ascomycota", + "name": "Ascomycota" + }, + { + "guid": "NZOR-6-50411", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Bacillariophyta", + "name": "Bacillariophyta" + }, + { + "guid": "urn:lsid:indexfungorum.org:names:90050", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Basidiomycota", + "name": "Basidiomycota" + }, + { + "guid": "urn:lsid:indexfungorum.org:names:90874", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Bigyra", + "name": "Bigyra" + }, + { + "guid": "NZOR-6-45238", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Blastocladiomycota", + "name": "Blastocladiomycota" + }, + { + "guid": "https://id.biodiversity.org.au/taxon/ausmoss/10144252", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Bryophyta", + "name": "Bryophyta" + }, + { + "guid": "urn:lsid:indexfungorum.org:names:90830", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Cercozoa", + "name": "Cercozoa" + }, + { + "guid": "https://id.biodiversity.org.au/instance/apni/887198", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Characeae", + "name": "Characeae" + }, + { + "guid": "https://id.biodiversity.org.au/taxon/apni/51337706", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Charophyta", + "name": "Charophyta" + }, + { + "guid": "NZOR-6-84277", + "commonName": "green algae", + "listId": "all", + "rankString": "phylum", + "scientificName": "Chlorophyta", + "name": "Chlorophyta (green algae)" + }, + { + "guid": "urn:lsid:indexfungorum.org:names:90831", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Choanozoa", + "name": "Choanozoa" + }, + { + "guid": "urn:lsid:indexfungorum.org:names:90736", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Chytridiomycota", + "name": "Chytridiomycota" + }, + { + "guid": "NZOR-6-59117", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Ciliophora", + "name": "Ciliophora" + }, + { + "guid": "NZOR-6-131723", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Cryptomycota", + "name": "Cryptomycota" + }, + { + "guid": "NZOR-6-129065", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Cryptophyta", + "name": "Cryptophyta" + }, + { + "guid": "NZOR-6-32770", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Cyanoprokaryota", + "name": "Cyanoprokaryota" + }, + { + "guid": "NZOR-6-107980", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Dictyosteliomycota", + "name": "Dictyosteliomycota" + }, + { + "guid": "NZOR-6-103781", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Dinophyta", + "name": "Dinophyta" + }, + { + "guid": "NZOR-6-19335", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Entorrhizomycota", + "name": "Entorrhizomycota" + }, + { + "guid": "https://id.biodiversity.org.au/name/apni/223968", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Equisetales", + "name": "Equisetales" + }, + { + "guid": "https://id.biodiversity.org.au/name/apni/223963", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Equisetophyta", + "name": "Equisetophyta" + }, + { + "guid": "NZOR-6-30610", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Euglenophyta", + "name": "Euglenophyta" + }, + { + "guid": "NZOR-6-72111", + "commonName": "foraminiferans", + "listId": "all", + "rankString": "phylum", + "scientificName": "Foraminifera", + "name": "Foraminifera (foraminiferans)" + }, + { + "guid": "CAAB:7d687c75:8bc9d974:ac455bde:c3876ffc", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Foraminiferida", + "name": "Foraminiferida" + }, + { + "guid": "NZOR-6-16847", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Fossil Fungi", + "name": "Fossil Fungi" + }, + { + "guid": "NZOR-6-101584", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Glaucophyta", + "name": "Glaucophyta" + }, + { + "guid": "urn:lsid:indexfungorum.org:names:90511", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Glomeromycota", + "name": "Glomeromycota" + }, + { + "guid": "NZOR-6-108720", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Haptophyta", + "name": "Haptophyta" + }, + { + "guid": "NZOR-6-81066", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Heliozoa", + "name": "Heliozoa" + }, + { + "guid": "NZOR-6-25063", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Heterokontophyta", + "name": "Heterokontophyta" + }, + { + "guid": "NZOR-6-80890", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Hyphochytriomycota", + "name": "Hyphochytriomycota" + }, + { + "guid": "NZOR-6-96682", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Incertae sedis", + "name": "Incertae sedis" + }, + { + "guid": "NZOR-6-89559", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Labyrinthista", + "name": "Labyrinthista" + }, + { + "guid": "NZOR-6-129530", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Labyrinthulomycota", + "name": "Labyrinthulomycota" + }, + { + "guid": "https://id.biodiversity.org.au/name/apni/217746", + "commonName": "angiosperms", + "listId": "all", + "rankString": "phylum", + "scientificName": "Magnoliophyta", + "name": "Magnoliophyta (angiosperms)" + }, + { + "guid": "https://id.biodiversity.org.au/taxon/ausmoss/51259285", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Marchantiophyta", + "name": "Marchantiophyta" + }, + { + "guid": "NZOR-6-68860", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Microspora", + "name": "Microspora" + }, + { + "guid": "NZOR-6-44068", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Microsporidia", + "name": "Microsporidia" + }, + { + "guid": "NZOR-6-95922", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Mucoromycota", + "name": "Mucoromycota" + }, + { + "guid": "NZOR-6-90575", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Myxomycota", + "name": "Myxomycota" + }, + { + "guid": "NZOR-6-96134", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Myzozoa", + "name": "Myzozoa" + }, + { + "guid": "NZOR-6-117717", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Neocallimastigomycota", + "name": "Neocallimastigomycota" + }, + { + "guid": "NZOR-6-113445", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Ochrophyta", + "name": "Ochrophyta" + }, + { + "guid": "urn:lsid:indexfungorum.org:names:90276", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Oomycota", + "name": "Oomycota" + }, + { + "guid": "NZOR-6-135898", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Percolozoa", + "name": "Percolozoa" + }, + { + "guid": "NZOR-6-115384", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Pinophyta", + "name": "Pinophyta" + }, + { + "guid": "NZOR-6-85454", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Plasmodiophoromycota", + "name": "Plasmodiophoromycota" + }, + { + "guid": "NZOR-6-132868", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Pteridophyta", + "name": "Pteridophyta" + }, + { + "guid": "51340000", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Radiolaria", + "name": "Radiolaria" + }, + { + "guid": "NZOR-6-76560", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Radiozoa", + "name": "Radiozoa" + }, + { + "guid": "NZOR-6-121299", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Rhodophyta", + "name": "Rhodophyta" + }, + { + "guid": "NZOR-6-33912", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Spermatophyta", + "name": "Spermatophyta" + }, + { + "guid": "https://id.biodiversity.org.au/name/apni/223966", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Sphenophyta", + "name": "Sphenophyta" + }, + { + "guid": "https://id.biodiversity.org.au/name/apni/223965", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Sphenopsida", + "name": "Sphenopsida" + }, + { + "guid": "https://id.biodiversity.org.au/name/ausmoss/10001169", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Streptophyta", + "name": "Streptophyta" + }, + { + "guid": "NZOR-6-33408", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Tracheophyta", + "name": "Tracheophyta" + }, + { + "guid": "NZOR-6-119157", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Zoopagomycota", + "name": "Zoopagomycota" + }, + { + "guid": "urn:lsid:indexfungorum.org:names:90405", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Zygomycota", + "name": "Zygomycota" + }, + { + "guid": "CoL:54767795", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Not assigned", + "name": "Not assigned" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:3cbb537e-ab39-4d85-864e-76cd6b6d6572", + "commonName": "Thorny-headed Worms", + "listId": "all", + "rankString": "phylum", + "scientificName": "ACANTHOCEPHALA", + "name": "ACANTHOCEPHALA (Thorny-headed Worms)" + }, + { + "guid": "0039636a7c3ca71326b92a7f8aa70e6f", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Acavomonidia", + "name": "Acavomonidia" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:1f5a5c77-fcef-45b9-84ad-bfea95fd1e62", + "commonName": "Segmented Worms", + "listId": "all", + "rankString": "phylum", + "scientificName": "ANNELIDA", + "name": "ANNELIDA (Segmented Worms)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:3b1040b4-b593-4e32-b4cf-82a853083ca8", + "commonName": "Apicomplexans", + "listId": "all", + "rankString": "phylum", + "scientificName": "APICOMPLEXA", + "name": "APICOMPLEXA (Apicomplexans)" + }, + { + "guid": "NZOR-6-127078", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Apusozoa", + "name": "Apusozoa" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:ec21b060-78e8-4a37-9e62-b8bef532b001", + "commonName": "Arthropods", + "listId": "all", + "rankString": "phylum", + "scientificName": "ARTHROPODA", + "name": "ARTHROPODA (Arthropods)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:b0d417cf-5c4a-4a07-a8cd-846f0ed5881d", + "commonName": "lamp shells", + "listId": "all", + "rankString": "phylum", + "scientificName": "BRACHIOPODA", + "name": "BRACHIOPODA (lamp shells)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:a1f069f9-eaa8-487c-889a-d3cfb3dd936e", + "commonName": "bryozoans", + "listId": "all", + "rankString": "phylum", + "scientificName": "BRYOZOA", + "name": "BRYOZOA (bryozoans)" + }, + { + "guid": "e8d3db416e6f771ef255af99729d9f1a", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Calcitarcha", + "name": "Calcitarcha" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:797a8754-2f84-4286-a7ea-ee20cdc5e376", + "commonName": "arrow worms", + "listId": "all", + "rankString": "phylum", + "scientificName": "CHAETOGNATHA", + "name": "CHAETOGNATHA (arrow worms)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:065f1da4-53cd-40b8-a396-80fa5c74dedd", + "commonName": "vertebrates", + "listId": "all", + "rankString": "phylum", + "scientificName": "CHORDATA", + "name": "CHORDATA (vertebrates)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:46772087-1328-4a98-9769-423f28f75fec", + "commonName": "Corals", + "listId": "all", + "rankString": "phylum", + "scientificName": "CNIDARIA", + "name": "CNIDARIA (Corals)" + }, + { + "guid": "CAAB:4ebefa19:ba9cb8f0:30169aee:5ea7ac48", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Coelenterata", + "name": "Coelenterata" + }, + { + "guid": "a73f1b028bead70cdf4c0e6ccad6b511", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Cryptista", + "name": "Cryptista" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:680cc112-c755-4203-a078-42bb4a499ebf", + "commonName": "ctenophorans", + "listId": "all", + "rankString": "phylum", + "scientificName": "CTENOPHORA", + "name": "CTENOPHORA (ctenophorans)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:7ed7bdc7-0c4f-4a6a-8866-aaeafe33243c", + "commonName": "Mesozoans", + "listId": "all", + "rankString": "phylum", + "scientificName": "DICYEMIDA", + "name": "DICYEMIDA (Mesozoans)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:1351114d-dd32-4ad1-b4e6-d1c6ffcea710", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "DINOFLAGELLATA", + "name": "DINOFLAGELLATA" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:3b2da402-9136-4f10-a757-6a28e10c7867", + "commonName": "Trepang", + "listId": "all", + "rankString": "phylum", + "scientificName": "ECHINODERMATA", + "name": "ECHINODERMATA (Trepang)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:ac6920d6-1344-4eea-ab7a-116c0008b3ae", + "commonName": "echiuran worms", + "listId": "all", + "rankString": "phylum", + "scientificName": "ECHIURA", + "name": "ECHIURA (echiuran worms)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:4c2714a5-f1ee-4499-a37c-849bb4d7280e", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "XENACOELOMORPHA", + "name": "XENACOELOMORPHA" + }, + { + "guid": "CAAB:b82c7a5b:55c327eb:f13f32ca:8e18369f", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Entoprocta", + "name": "Entoprocta" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:57a22a50-568a-4f29-b0e4-6e9312cc1c65", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "EUGLENOZOA", + "name": "EUGLENOZOA" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:f71a4c71-48e1-4a9f-840e-1bb189611fd4", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "FORNICATA", + "name": "FORNICATA" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:95aa91aa-6cb9-4302-8a8a-48b6abf29ee9", + "commonName": "Gastrotrichs", + "listId": "all", + "rankString": "phylum", + "scientificName": "GASTROTRICHA", + "name": "GASTROTRICHA (Gastrotrichs)" + }, + { + "guid": "NZOR-6-87998", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Gnathifera", + "name": "Gnathifera" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:ee94317b-a133-471e-b128-b3b505500375", + "commonName": "Gnathostomulids", + "listId": "all", + "rankString": "phylum", + "scientificName": "GNATHOSTOMULIDA", + "name": "GNATHOSTOMULIDA (Gnathostomulids)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:c7669f53-b59b-4764-8160-0aff7d3d8db6", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "HAPLOSPORIDIA", + "name": "HAPLOSPORIDIA" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:f6a0d13f-7914-4f99-850b-624ccfb06b74", + "commonName": "hemichordates", + "listId": "all", + "rankString": "phylum", + "scientificName": "HEMICHORDATA", + "name": "HEMICHORDATA (hemichordates)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:7fd008a6-6705-4a62-a627-52d87885f63d", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "HETEROLOBOSEA", + "name": "HETEROLOBOSEA" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:ad23edff-5a7a-48e0-be2a-8633b65ef192", + "commonName": "entoprocts", + "listId": "all", + "rankString": "phylum", + "scientificName": "KAMPTOZOA", + "name": "KAMPTOZOA (entoprocts)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:bedd9bbf-3071-4e09-bbcb-1f8bf2c10644", + "commonName": "Kinorhyncha", + "listId": "all", + "rankString": "phylum", + "scientificName": "KINORHYNCHA", + "name": "KINORHYNCHA (Kinorhyncha)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:0e370d3c-61b5-46c1-adb3-076f6cffe2e4", + "commonName": "Loriciferans", + "listId": "all", + "rankString": "phylum", + "scientificName": "LORICIFERA", + "name": "LORICIFERA (Loriciferans)" + }, + { + "guid": "NZOR-6-112818", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Loukozoa", + "name": "Loukozoa" + }, + { + "guid": "NZOR-6-19441", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Metamonada", + "name": "Metamonada" + }, + { + "guid": "300679cc6fe9da91205e94bca48844b5", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Miozoa", + "name": "Miozoa" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:4fb59020-e4a8-4973-adca-a4f662c4645c", + "commonName": "Molluscs", + "listId": "all", + "rankString": "phylum", + "scientificName": "MOLLUSCA", + "name": "MOLLUSCA (Molluscs)" + }, + { + "guid": "45355e80b0240c3ec5d2cb22d299cecc", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Mycetozoa", + "name": "Mycetozoa" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:0e7e0f7d-4456-495b-b762-2d11f78b9368", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "NEMATODA", + "name": "NEMATODA" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:4b1dd080-6a02-48c4-9f6c-94680f7651dd", + "commonName": "horsehair worms", + "listId": "all", + "rankString": "phylum", + "scientificName": "NEMATOMORPHA", + "name": "NEMATOMORPHA (horsehair worms)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:89e92ab7-7ffc-4cc4-9149-19c8f8079940", + "commonName": "nemertean worms", + "listId": "all", + "rankString": "phylum", + "scientificName": "NEMERTEA", + "name": "NEMERTEA (nemertean worms)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:f9293902-ab93-4293-b0d1-743d9b6cbfcf", + "commonName": "Velvet Worms", + "listId": "all", + "rankString": "phylum", + "scientificName": "ONYCHOPHORA", + "name": "ONYCHOPHORA (Velvet Worms)" + }, + { + "guid": "NZOR-6-116400", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Orthonectida", + "name": "Orthonectida" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:3d2cb502-f403-4d07-ada7-ea680a037cf7", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "PARABASALIA", + "name": "PARABASALIA" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:e2e32d7f-10ec-4a8e-a101-3dc2bd663c85", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "PARAMYXEA", + "name": "PARAMYXEA" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:149897a5-6e1e-403f-bfbe-5e73ef2741a4", + "commonName": "Tube Worms", + "listId": "all", + "rankString": "phylum", + "scientificName": "PHORONIDA", + "name": "PHORONIDA (Tube Worms)" + }, + { + "guid": "8f97c0dbb86a9b83e275958d450643be", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Picozoa", + "name": "Picozoa" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:d214124d-792a-4b34-aff1-2224b0aab03d", + "commonName": "Flatworms", + "listId": "all", + "rankString": "phylum", + "scientificName": "PLATYHELMINTHES", + "name": "PLATYHELMINTHES (Flatworms)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:baad4f23-9085-42af-ae79-9da703ea7e8b", + "commonName": "sponges", + "listId": "all", + "rankString": "phylum", + "scientificName": "PORIFERA", + "name": "PORIFERA (sponges)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:acaeb754-5b53-4f9e-a58d-25bacde13229", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "PREAXOSTYLA", + "name": "PREAXOSTYLA" + }, + { + "guid": "CAAB:d0906bdc:e4b5ec1d:4f687572:dc2a814b", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Priapula", + "name": "Priapula" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:218dac37-ee54-4d67-a2dc-76a07be7a060", + "commonName": "priapulan worms", + "listId": "all", + "rankString": "phylum", + "scientificName": "PRIAPULIDA", + "name": "PRIAPULIDA (priapulan worms)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:e861146c-2b54-4319-baef-1547d930d857", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "RETARIA", + "name": "RETARIA" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:c8f3a49c-bc00-4cf5-bb5a-d221cae09def", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "ROTIFERA", + "name": "ROTIFERA" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:4ecd57eb-02e9-4fb5-97d6-cddafcd6c56c", + "commonName": "Amoebae", + "listId": "all", + "rankString": "phylum", + "scientificName": "SARCOMASTIGOPHORA", + "name": "SARCOMASTIGOPHORA (Amoebae)" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:bdef2233-abd5-4b52-966b-7819b586be39", + "commonName": "peanut worms", + "listId": "all", + "rankString": "phylum", + "scientificName": "SIPUNCULA", + "name": "SIPUNCULA (peanut worms)" + }, + { + "guid": "b0cc473d7c9c38ec35ce77dc1c43a927", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Sulcozoa", + "name": "Sulcozoa" + }, + { + "guid": "urn:lsid:biodiversity.org.au:afd.taxon:0fac364a-0692-4305-a968-7d6abeb99ee9", + "commonName": "Water Bears", + "listId": "all", + "rankString": "phylum", + "scientificName": "TARDIGRADA", + "name": "TARDIGRADA (Water Bears)" + }, + { + "guid": "CAAB:d477534b:8837ce01:54255e6e:4682deed", + "commonName": "", + "listId": "all", + "rankString": "phylum", + "scientificName": "Urochordata", + "name": "Urochordata" + } +] \ No newline at end of file diff --git a/src/integration-test/resources/data/total.json b/src/integration-test/resources/data/total.json new file mode 100644 index 000000000..101087ddf --- /dev/null +++ b/src/integration-test/resources/data/total.json @@ -0,0 +1 @@ +{"total":1} \ No newline at end of file diff --git a/src/integration-test/resources/dataset1/loadDataSet.js b/src/integration-test/resources/dataset1/loadDataSet.js index 3ecc7eb85..e4f7fe9d4 100644 --- a/src/integration-test/resources/dataset1/loadDataSet.js +++ b/src/integration-test/resources/dataset1/loadDataSet.js @@ -45,6 +45,7 @@ var activityProject = { "isWorks" : false, "legalCustodianOrganisation" : "Atlas of Living Australia", "legalCustodianOrganisationType" : "", + "projLifecycleStatus": "published", "mapLayersConfig" : { "baseLayers" : [], "overlays" : [] @@ -54,13 +55,71 @@ var activityProject = { "organisationId" : "3a04141a-2290-4c54-aee3-a433d60b4476", "organisationName" : "Atlas of Living Australia", "plannedStartDate" : ISODate("2022-04-06T14:00:00.000Z"), - "projectSiteId" : "site_1", + "projectSiteId" : "ab9ec9af-241b-49f7-adcf-ca40e474d119", "projectType" : "survey", "regenerateProjectTimeline" : false, "task" : "collect plants", "termsOfUseAccepted" : true }; db.project.insert(activityProject); +var project2 = { + "bushfireCategories" : [], + "origin" : "atlasoflivingaustralia", + "dateCreated" : ISODate("2022-04-07T07:12:58.072Z"), + "promoteOnHomepage" : "no", + "ecoScienceType" : [], + "countries" : [ + "Australia" + ], + "name" : "Test project 2", + "funding" : 0.0, + "isCitizenScience" : true, + "uNRegions" : [ + "Oceania" + ], + "industries" : [], + "tags" : [ + "noCost" + ], + "lastUpdated" : ISODate("2022-04-07T07:12:59.036Z"), + "isBushfire" : false, + "alaHarvest" : false, + "scienceType" : [ + "Birds" + ], + "isMERIT" : false, + "status" : "active", + "isSciStarter" : false, + "isExternal" : false, + "projectId" : "project_2", + "aim" : "Test Aim", + "associatedOrgs" : [], + "associatedProgram" : "Citizen Science Projects", + "baseLayer" : "", + "description" : "Test Description", + "facets" : [], + "fundings" : [], + "isEcoScience" : false, + "isWorks" : false, + "legalCustodianOrganisation" : "Atlas of Living Australia", + "legalCustodianOrganisationType" : "", + "projLifecycleStatus": "published", + "mapLayersConfig" : { + "baseLayers" : [], + "overlays" : [] + }, + "orgGrantee" : "", + "orgSponsor" : "", + "organisationId" : "3a04141a-2290-4c54-aee3-a433d60b4476", + "organisationName" : "Atlas of Living Australia", + "plannedStartDate" : ISODate("2022-04-06T14:00:00.000Z"), + "projectSiteId" : "ab9ec9af-241b-49f7-adcf-ca40e474d119", + "projectType" : "survey", + "regenerateProjectTimeline" : false, + "task" : "collect plants", + "termsOfUseAccepted" : true +}; +db.project.insert(project2); db.userPermission.insert({ entityType: 'au.org.ala.ecodata.Project', entityId: activityProject.projectId, @@ -80,9 +139,9 @@ var projectActivity = { "alaAdminEnforcedEmbargo" : false, "embargoOption" : "NONE" }, - "surveySiteOption" : "sitepick", + "surveySiteOption" : "sitepickcreate", "sites" : [ - "site_1" + "ab9ec9af-241b-49f7-adcf-ca40e474d119" ], "temporalAccuracy" : "high", "canEditAdminSelectedSites" : false, @@ -140,7 +199,7 @@ var projectActivity = { } } ], - "defaultZoomArea" : "site_1", + "defaultZoomArea" : "ab9ec9af-241b-49f7-adcf-ca40e474d119", "published" : true, "relatedDatasets" : [], "allowPolygons" : false, @@ -158,13 +217,14 @@ db.projectActivity.insert(projectActivity); var site = { "projects" : [ - "project_1" + "project_1", + "project_2" ], "dateCreated" : ISODate("2022-04-07T07:12:56.343Z"), "lastUpdated" : ISODate("2022-04-07T07:13:28.815Z"), "catchment" : "", "notes" : "", - "siteId" : "site_1", + "siteId" : "ab9ec9af-241b-49f7-adcf-ca40e474d119", "extent" : { "geometry" : { "datum" : "", diff --git a/src/integration-test/resources/wiremock/mappings/pwaDiscovery.json b/src/integration-test/resources/wiremock/mappings/pwaDiscovery.json new file mode 100644 index 000000000..e4951ea0d --- /dev/null +++ b/src/integration-test/resources/wiremock/mappings/pwaDiscovery.json @@ -0,0 +1,124 @@ +{ + "request": { + "urlPath": "/cas/oidc/.well-known/.well-known/openid-configuration", + "method": "GET" + }, + "response": { + "status": 200, + "headers": { + "content-Type": "text/json" + }, + "transformers": ["response-template"], + "jsonBody": { + "issuer": "http://{{request.host}}:{{request.port}}/cas/oidc", + "scopes_supported": [ + "openid", + "profile", + "email", + "offline_access", + "ala", + "roles", + "users/read", + "users/write", + "ecodata/read_test", + "ecodata/write_test", + "biocache/read", + "biocache/write", + "ala/internal" + ], + "response_types_supported": [ + "code", + "token", + "id_token token" + ], + "subject_types_supported": [ + "public", + "pairwise" + ], + "claim_types_supported": [ + "normal" + ], + "claims_supported": [ + "sub", + "name", + "preferred_username", + "family_name", + "given_name", + "profile", + "locale", + "updated_at", + "email", + "email_verified", + "organisation", + "role", + "authority", + "city", + "state", + "country", + "userid" + ], + "grant_types_supported": [ + "authorization_code", + "password", + "client_credentials", + "refresh_token" + ], + "id_token_signing_alg_values_supported": [ + "RS256", "none" + ], + "id_token_encryption_alg_values_supported": [ + "none" + ], + "id_token_encryption_enc_values_supported": [ + "none" + ], + "userinfo_signing_alg_values_supported": [ + "RS256", "none" + ], + "userinfo_encryption_alg_values_supported": [ + "none" + ], + "userinfo_encryption_enc_values_supported": [ + "none" + ], + "request_object_signing_alg_values_supported": [ + "RS256", "none" + ], + "request_object_encryption_alg_values_supported": [ + "none" + ], + "request_object_encryption_enc_values_supported": [ + "none" + ], + "introspection_endpoint_auth_methods_supported": [ + "client_secret_basic" + ], + "token_endpoint_auth_methods_supported": [ + "client_secret_basic", + "client_secret_post", + "client_secret_jwt", + "private_key_jwt" + ], + "code_challenge_methods_supported": [ + "plain", + "S256" + ], + "claims_parameter_supported": true, + "request_uri_parameter_supported": true, + "request_parameter_supported": true, + "backchannel_logout_supported": true, + "frontchannel_logout_supported": true, + "jwks_uri": "http://{{request.host}}:{{request.port}}/cas/oidc/jwks", + "authorization_endpoint": "http://{{request.host}}:{{request.port}}/cas/oidc/oidcAuthorize", + "userinfo_endpoint": "http://{{request.host}}:{{request.port}}/cas/oidc/oidcProfile", + "pushed_authorization_request_endpoint": "http://{{request.host}}:{{request.port}}/cas/oidc/oidcPushAuthorize", + "registration_endpoint": "http://{{request.host}}:{{request.port}}/cas/oidc/register", + "end_session_endpoint": "http://{{request.host}}:{{request.port}}/cas/oidc/oidcLogout", + "introspection_endpoint": "http://{{request.host}}:{{request.port}}/cas/oidc/introspect", + "revocation_endpoint": "http://{{request.host}}:{{request.port}}/cas/oidc/revoke", + "backchannel_logout_session_supported": true, + "frontchannel_logout_session_supported": true, + "token_endpoint": "http://{{request.host}}:{{request.port}}/cas/oidc/oidcAccessToken" + } + } +} \ No newline at end of file diff --git a/src/integration-test/resources/wiremock/mappings/webServiceAccessToken.json b/src/integration-test/resources/wiremock/mappings/webServiceAccessToken.json new file mode 100644 index 000000000..9007fe5b6 --- /dev/null +++ b/src/integration-test/resources/wiremock/mappings/webServiceAccessToken.json @@ -0,0 +1,20 @@ +{ + "request": { + "urlPath": "/cas/oidc/.well-known", + "method": "POST" + }, + "response": { + "status": 200, + "headers": { + "content-Type": "text/json" + }, + "jsonBody": { + "access_token": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJjbGllbnRfMSIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiZWNvZGF0YS93cml0ZV90ZXN0IHVzZXJzL3JlYWQiLCJhdXRoX3RpbWUiOjE2ODU1MzUzNDMsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODAxOC9jYXMvb2lkYyIsImV4cCI6MjMxNjI1NjE5NSwiaWF0IjoxNjg1NTM1MzQzLCJ2ZXJzaW9uIjoyLCJqdGkiOiIxIiwiY2xpZW50X2lkIjoiY2xpZW50XzEifQ.P8PT6BOhWQ_YAAxG6QDbhJMgFzhho1x1egJtnUbD-g31bYvTZUtwyVqzfDt1Es3kpyvnp46cbq3TDrgeX6zy4jBZPtUTPRl_EkXZyv27B3pHl7tqnWM4sethQXFppxxLJrmDqTgNEBuqDikiCXDVmdkbYe99kBGwg7yiMnHogRA", + "id_token": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJjbGllbnRfMSIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiZWNvZGF0YS93cml0ZV90ZXN0IHVzZXJzL3JlYWQiLCJhdXRoX3RpbWUiOjE2ODU1MzUzNDMsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODAxOC9jYXMvb2lkYyIsImV4cCI6MjMxNjI1NjE5NSwiaWF0IjoxNjg1NTM1MzQzLCJ2ZXJzaW9uIjoyLCJqdGkiOiIxIiwiY2xpZW50X2lkIjoiY2xpZW50XzEifQ.P8PT6BOhWQ_YAAxG6QDbhJMgFzhho1x1egJtnUbD-g31bYvTZUtwyVqzfDt1Es3kpyvnp46cbq3TDrgeX6zy4jBZPtUTPRl_EkXZyv27B3pHl7tqnWM4sethQXFppxxLJrmDqTgNEBuqDikiCXDVmdkbYe99kBGwg7yiMnHogRA", + "refresh_token": null, + "token_type": "bearer", + "expires_in": 86400, + "scope": "users/read ecodata/write_test" + } + } +} \ No newline at end of file diff --git a/src/main/groovy/au/org/ala/biocollect/projectresult/BioCollect.groovy b/src/main/groovy/au/org/ala/biocollect/projectresult/BioCollect.groovy index b2c942f56..f4b0768a8 100644 --- a/src/main/groovy/au/org/ala/biocollect/projectresult/BioCollect.groovy +++ b/src/main/groovy/au/org/ala/biocollect/projectresult/BioCollect.groovy @@ -64,7 +64,15 @@ class BioCollect { projectType : doc.projectType, isMERIT : doc.isMERIT, tags : doc.tags, - containsActivity : doc.containsActivity + containsActivity : doc.containsActivity, + projectEquipment : doc.gear, + projectHowToParticipate: doc.getInvolved, + projectLogoImageCredit : doc.logoAttribution, + projectLogoImage : doc.imageUrl, + projectTask : doc.task, + projectActivities : doc.projectActivities, + contactName : doc.managerEmail, + contactDetails : doc.manager ] } } diff --git a/src/main/groovy/au/org/ala/biocollect/swagger/model/BioCollectModels.groovy b/src/main/groovy/au/org/ala/biocollect/swagger/model/BioCollectModels.groovy index ada7b07b0..a057a2e2f 100644 --- a/src/main/groovy/au/org/ala/biocollect/swagger/model/BioCollectModels.groovy +++ b/src/main/groovy/au/org/ala/biocollect/swagger/model/BioCollectModels.groovy @@ -309,3 +309,10 @@ class ProjectSearchResponse { Integer total List facets } + +// classes for "ws/bioactivity/data/simplified/{id} +@JsonIgnoreProperties('metaClass') +class GetOutputForActivitySimplifiedResponse { + Map activity + String error +} diff --git a/src/main/java/au/org/ala/biocollect/IntegrationTestConfiguration.java b/src/main/java/au/org/ala/biocollect/IntegrationTestConfiguration.java deleted file mode 100644 index 0209ff7a5..000000000 --- a/src/main/java/au/org/ala/biocollect/IntegrationTestConfiguration.java +++ /dev/null @@ -1,18 +0,0 @@ -package au.org.ala.biocollect; - -import au.org.ala.ws.security.AlaWsSecurityConfiguration; -import com.nimbusds.jose.jwk.JWKSet; -import com.nimbusds.jose.jwk.source.ImmutableJWKSet; -import com.nimbusds.jose.jwk.source.JWKSource; -import com.nimbusds.jose.proc.SecurityContext; -import org.pac4j.oidc.config.OidcConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class IntegrationTestConfiguration extends AlaWsSecurityConfiguration { - @Bean - JWKSource jwkSource(OidcConfiguration oidcConfiguration) { - return new ImmutableJWKSet(new JWKSet()); - } -} diff --git a/src/main/scripts/runFunctionalTests.sh b/src/main/scripts/runFunctionalTests.sh index 53fc75a7d..5808cbdd7 100755 --- a/src/main/scripts/runFunctionalTests.sh +++ b/src/main/scripts/runFunctionalTests.sh @@ -12,11 +12,21 @@ if [ -z $BRANCH ]; then BRANCH=dev fi +PWA_BRANCH=$5 +if [ -z $PWA_BRANCH ]; then + PWA_BRANCH=testing +fi + ECODATA_LOCAL_DIR=$2 if [ -z $ECODATA_LOCAL_DIR ]; then ECODATA_LOCAL_DIR=/tmp/ecodata fi +PWA_LOCAL_DIR=$4 +if [ -z $PWA_LOCAL_DIR ]; then + PWA_LOCAL_DIR=/tmp/biocollect-pwa +fi + if [ ! -d $ECODATA_LOCAL_DIR ]; then cd /tmp git clone https://github.com/AtlasOfLivingAustralia/ecodata.git @@ -27,9 +37,22 @@ else cd $ECODATA_LOCAL_DIR git checkout $BRANCH git pull - echo "Updated ecodata $BRANCH in /tmp/ecodata" fi +if [ ! -d $PWA_LOCAL_DIR ]; then + cd /tmp + git clone https://github.com/AtlasOfLivingAustralia/biocollect-pwa + cd biocollect-pwa + git checkout $PWA_BRANCH + echo "Cloned biocollect pwa $PWA_BRANCH into /tmp/biocollect-pwa" +else + cd $PWA_LOCAL_DIR + git checkout $PWA_BRANCH + git pull + echo "Updated pwa $PWA_BRANCH in $PWA_LOCAL_DIR" +fi + + echo "Dropping database" mongosh ecodata-functional-test --eval 'db.dropDatabase();' mongosh ecodata-functional-test --eval 'db.project.count();' @@ -41,7 +64,14 @@ cat /etc/hosts cd $BIOCOLLECT_DIR echo "Starting wire mock" -./gradlew startWireMock & +./gradlew startWireMock + +cd $PWA_LOCAL_DIR +echo "Starting biocollect-pwa" +cd $PWA_LOCAL_DIR +npm install +npm run run:functionaltest & +sleep 15 cd $ECODATA_LOCAL_DIR echo "Starting ecodata from `pwd`" @@ -50,16 +80,20 @@ GRADLE_OPTS="-Xmx1g" ./gradlew bootRun "-Dorg.gradle.jvmargs=-Xmx1g" -Dgrails.en sleep 240 cd $BIOCOLLECT_DIR -echo "Starting biocollect" +echo "Starting biocollect from `pwd`" GRADLE_OPTS="-Xmx1g" ./gradlew bootRun "-Dorg.gradle.jvmargs=-Xmx1g" -Dgrails.env=test -Dgrails.server.port.http=8087 & -sleep 200 +sleep 180 chmod u+x src/main/scripts/loadFunctionalTestData.sh echo "Running functional tests" -GRADLE_OPTS="-Xmx1g" ./gradlew integrationTest "-Dorg.gradle.jvmargs=-Xmx1g" --stacktrace -Dgeb.env=$GEB_ENV +node_modules/@wdio/cli/bin/wdio.js run wdio.local.conf.js RETURN_VALUE=$? +jobs + +kill %4 +kill %3 kill %2 kill %1 diff --git a/src/test/groovy/au/org/ala/biocollect/TemplateTagLibSpec.groovy b/src/test/groovy/au/org/ala/biocollect/TemplateTagLibSpec.groovy new file mode 100644 index 000000000..e5b59b75d --- /dev/null +++ b/src/test/groovy/au/org/ala/biocollect/TemplateTagLibSpec.groovy @@ -0,0 +1,48 @@ +package au.org.ala.biocollect + +import asset.pipeline.grails.AssetProcessorService +import asset.pipeline.grails.AssetsTagLib +import asset.pipeline.grails.AssetMethodTagLib +import grails.testing.web.taglib.TagLibUnitTest +import groovy.json.JsonSlurper +import spock.lang.Specification + +class TemplateTagLibSpec extends Specification implements TagLibUnitTest { + AssetProcessorService assetProcessorServiceEx + @Override + Closure doWithSpring() { + {-> + assetProcessorServiceEx = Mock(AssetProcessorService) + assetProcessorServiceEx.assetBaseUrl(_, _) >> { it } + assetProcessorServiceEx.getAssetPath(_, _) >> { it } + + assetProcessorService assetProcessorServiceEx + } + } + + def setupSpec() { + mockTagLibs(AssetsTagLib, AssetMethodTagLib) + } + + def "test getFilesToPreCacheForPWA"() { + given: + def attrs = [:] // Add any required attributes here + + and: + grailsApplication.config.pwa.serviceWorkerConfig.filesToPreCache = ['ala.svg'] + + when: + def result = tagLib.getFilesToPreCacheForPWA(attrs) + + then: + result != null + result instanceof String + + and: + def json = new JsonSlurper().parseText(result) + json instanceof List + + and: + json[0].contains("ala.svg") + } +} diff --git a/src/test/groovy/au/org/ala/biocollect/merit/SpeciesServiceSpec.groovy b/src/test/groovy/au/org/ala/biocollect/merit/SpeciesServiceSpec.groovy index 9827fc4b8..f59abc4de 100644 --- a/src/test/groovy/au/org/ala/biocollect/merit/SpeciesServiceSpec.groovy +++ b/src/test/groovy/au/org/ala/biocollect/merit/SpeciesServiceSpec.groovy @@ -1,8 +1,7 @@ package au.org.ala.biocollect.merit -import grails.testing.spring.AutowiredTest +import grails.testing.services.ServiceUnitTest import spock.lang.Specification - /* * Copyright (C) 2021 Atlas of Living Australia * All Rights Reserved. @@ -20,12 +19,8 @@ import spock.lang.Specification * Created by Temi on 3/8/21. */ -class SpeciesServiceSpec extends Specification implements AutowiredTest{ - Closure doWithSpring() {{ -> - service SpeciesService - }} +class SpeciesServiceSpec extends Specification implements ServiceUnitTest { - SpeciesService service def setup() { service.grailsApplication = grailsApplication service.grailsApplication.config.lists.baseURL = "xyz" @@ -55,4 +50,33 @@ class SpeciesServiceSpec extends Specification implements AutowiredTest{ 1 * service.webService.getJson(url) >> [:] } + + def "formatTaxonName should format name based on displayType"() { + setup: + Map data = [commonName: commonName, scientificName: scientificName] + + when: + String result = service.formatTaxonName(data, displayType) + + then: + result == expectedName + + where: + commonName | scientificName | displayType | expectedName + 'Blackbird' | 'Turdus merula' | service.COMMON_NAME_SCIENTIFIC_NAME | 'Blackbird (Turdus merula)' + 'Blackbird' | 'Turdus merula' | service.SCIENTIFIC_NAME_COMMON_NAME | 'Turdus merula (Blackbird)' + 'Blackbird' | 'Turdus merula' | service.COMMON_NAME | 'Blackbird' + null | 'Turdus merula' | service.COMMON_NAME | 'Turdus merula' + 'Blackbird' | 'Turdus merula' | service.SCIENTIFIC_NAME | 'Turdus merula' + null | 'Turdus merula' | service.SCIENTIFIC_NAME | 'Turdus merula' + null | 'Turdus merula' | service.COMMON_NAME_SCIENTIFIC_NAME | 'Turdus merula' + null | 'Turdus merula' | service.SCIENTIFIC_NAME_COMMON_NAME | 'Turdus merula' + 'Blackbird' | null | service.COMMON_NAME_SCIENTIFIC_NAME | 'Blackbird' + 'Blackbird' | null | service.SCIENTIFIC_NAME_COMMON_NAME | 'Blackbird' + 'Blackbird' | null | service.COMMON_NAME | 'Blackbird' + null | null | service.COMMON_NAME | '' + null | null | service.SCIENTIFIC_NAME | '' + null | null | service.COMMON_NAME_SCIENTIFIC_NAME | '' + null | null | service.SCIENTIFIC_NAME_COMMON_NAME | '' + } } diff --git a/src/test/js/integration/pageobjects/AddBioActivityPage.js b/src/test/js/integration/pageobjects/AddBioActivityPage.js new file mode 100644 index 000000000..60446593d --- /dev/null +++ b/src/test/js/integration/pageobjects/AddBioActivityPage.js @@ -0,0 +1,71 @@ +// const StubbedCasSpec = require('./StubbedCasSpec.js') +const ReloadablePage = require('./ReloadablePage.js') +class AddBioActivityPage extends ReloadablePage { + get addSiteInput() { return $("#siteLocation"); } + get surveyDateInput() { return $('.inputDatePicker'); } + get addSpeciesInput() { return $('.speciesInputTemplates'); } + get speciesAutocomplete() { return $('.ui-autocomplete'); } + get firstSpecies() { return $('.ui-autocomplete li a:nth-child(1)'); } + get imageUploadInput() { return $("input[name=files][accept='image/*']"); } + get imageTitleInput() { return $(".image-title-input"); } + get saveButton() { return $("#save"); } + get okButtonBootBoxDialog(){ return $(".bootbox-accept")} + get iframe() { return $("iframe"); } + + async open(projectActivityId) { + console.log(`Opening ${this.baseUrl}/bioActivity/create/${projectActivityId}`); + await browser.url(`${this.baseUrl}/bioActivity/create/${projectActivityId}`); + } + + async at() { + let title = await browser.getTitle(); + return /Create \| .* \| BioCollect/i.test(title); + } + + async setSite(site) { + await this.addSiteInput.selectByAttribute("value", site); + } + + async setDate(date) { + await this.surveyDateInput.setValue(date); + } + + async setSpecies(species, iframe = false) { + await this.addSpeciesInput.setValue(species); + if (iframe) { + // iframe has difficulty checking if element is available + await browser.pause(5000); + } + else { + await browser.waitUntil(async () => { + return (await this.speciesAutocomplete.isDisplayed()) === true; + }, { timeout: 10000 }); + } + await this.firstSpecies.click(); + } + + async uploadImage(imagePath, iframe = false) { + await this.imageUploadInput.addValue(imagePath); + + if (iframe) { + // iframe has difficulty checking if element is available + await browser.pause(5000); + } + else { + await browser.waitUntil(async () => { + return (await this.imageTitleInput.isDisplayed()) === true; + }, { timeout: 10000 }); + } + } + + async saveActivity() { + await this.saveButton.click(); + } + + async dismissBootBoxDialog(){ + await this.okButtonBootBoxDialog.waitForClickable({ timeout: 20000 }); + await this.okButtonBootBoxDialog.click(); + } +} + +module.exports = AddBioActivityPage; \ No newline at end of file diff --git a/src/test/js/integration/pageobjects/AdminToolsPage.js b/src/test/js/integration/pageobjects/AdminToolsPage.js new file mode 100644 index 000000000..b8a31db69 --- /dev/null +++ b/src/test/js/integration/pageobjects/AdminToolsPage.js @@ -0,0 +1,34 @@ +const ReloadablePage = require('./ReloadablePage'); +class AdminToolsPage extends ReloadablePage { + + url = browser.options.testConfig.baseUrl + "/admin/tools"; + + async open() { + console.log(`Opening ${this.url}`); + await browser.url(this.url); + } + async at () { + let title = await browser.getTitle(); + return /Tools | Admin/i.test(title); + } + + get reindexButton () { return $('#btnReindexAll'); } + get clearMetaDataCacheButton () { return $("#btnClearMetadataCache"); } + + async clearMetadata() { + await this.clearMetaDataCacheButton.click(); + } + + async reindex() { + console.log(`Opening ${this.url}`); + await browser.url(this.url) + await this.reindexButton.click(); + await this.hasBeenReloaded(); + } + + async clearCache() { + await this.clearMetadata(); + } +} + +module.exports = AdminToolsPage; \ No newline at end of file diff --git a/src/test/js/integration/pageobjects/HomePage.js b/src/test/js/integration/pageobjects/HomePage.js new file mode 100644 index 000000000..5d9e7e387 --- /dev/null +++ b/src/test/js/integration/pageobjects/HomePage.js @@ -0,0 +1,15 @@ +const StubbedCasSpec = require("./StubbedCasSpec"); + +class HomePage extends StubbedCasSpec { + async open() { + console.log(`Opening ${this.baseUrl}`); + await browser.url(`${this.baseUrl}`); + } + + async at() { + let title = await browser.getTitle(); + return /Homepage/i.test(title); + } +} + +module.exports = HomePage; \ No newline at end of file diff --git a/src/test/js/integration/pageobjects/OfflineListPage.js b/src/test/js/integration/pageobjects/OfflineListPage.js new file mode 100644 index 000000000..83eb6bfb8 --- /dev/null +++ b/src/test/js/integration/pageobjects/OfflineListPage.js @@ -0,0 +1,67 @@ +const SubbedCasSpec = require("./StubbedCasSpec"); + +class OfflineListPage extends SubbedCasSpec { + url = browser.options.testConfig.pwaUrl; + get frame () { + return $("iframe"); + } + + get heading () { + return $("h1=Unpublished records"); + } + + get offlineList() { + return $$('table#offlineList tbody tr'); + } + + get alert() { + return $('div.alert.alert-info'); + } + + get uploadAllButton() { + return $('.upload-records'); + } + + get uploadButton() { + return $$('.upload-record'); + } + get firstUploadButton() { + return $('.upload-record'); + } + async open() { + console.log(`Opening ${this.url}`); + await browser.url(`${this.url}`); + } + + async at() { + // let frame = await this.frame + // await browser.switchFrame(frame); + let h1 = await this.heading; + // await h1.waitForExist({timeout: 30000}); + let title = await h1.getText(); + return /Unpublished records/i.test(title); + } + + async getNumberOfRecords() { + let records = await this.offlineList; + return records.length; + } + + async uploadRecords() { + // await this.uploadButton.waitForClickable({timeout: 3000}); + // await browser.pause(5000); + // while (await this.uploadButton.isClickable() === false) { + // let resolve; + // let promise = new Promise((res)=>{resolve = res;}); + // setTimeout(() => { + // resolve(); + // }, 1000); + // await promise; + // } + await this.uploadAllButton.click(); + // await this.alert.waitForExist({timeout: 30000}); + // return records[index]; + } +} + +module.exports = OfflineListPage; \ No newline at end of file diff --git a/src/test/js/integration/pageobjects/PwaAppPage.js b/src/test/js/integration/pageobjects/PwaAppPage.js new file mode 100644 index 000000000..bad38cc66 --- /dev/null +++ b/src/test/js/integration/pageobjects/PwaAppPage.js @@ -0,0 +1,119 @@ +const StubbedCasSpec = require('./StubbedCasSpec.js') +class PwaAppPage extends StubbedCasSpec { + url = browser.options.testConfig.pwaUrl; + + get getStarted() { + return $('#getStarted'); + } + + get avatar() { + return $('.mantine-Avatar-placeholder'); + } + + get signOut() { + return $('#signOut'); + } + + get signIn() { + return $('#signIn'); + } + + get viewRecordBtn() { + return $$('[data-testid="view-record"]'); + } + project(projectId) { + return $('#' + projectId); + } + + projectActivityDownload(paId) { + return $(`#${paId}Download`); + } + + addRecordBtn(paId) { + return $(`#${paId}AddRecord`); + } + + viewRecordsBtn(paId) { + return $(`#${paId}ViewRecord`); + } + + viewUnpublishedRecordsBtn(paId) { + return $(`#${paId}UnpublishedRecords`); + } + get modalConfirmationButton() { + return $('#confirmDownloadModal'); + } + get modalCloseBtn() { + return $('.mantine-Modal-close'); + } + + get rightDrawer() { + return $('.mantine-Drawer-content'); + } + + async open() { + console.log(`Opening ${this.url}`); + await browser.url(this.url); + } + + async at() { + return /BioCollect PWA/i.test(await browser.getTitle()); + } + + async atSignIn() { + await this.signIn.waitForDisplayed({ timeout: 10000 }); + return await this.signIn.isDisplayed(); + } + + async start() { + await this.getStarted.waitForDisplayed({ timeout: 10000 }); + await this.getStarted.click(); + } + + async logout(){ + await this.avatar.click(); + await this.signOut.click(); + } + + async viewProject(projectId) { + await this.project(projectId).click() + } + + async viewRecords(paId) { + await this.viewRecordsBtn(paId).click() + await this.rightDrawer.waitForExist({ timeout: 10000 }); + } + + async viewUnpublishedRecords(paId) { + var btn = this.viewUnpublishedRecordsBtn(paId) + await btn.waitForEnabled({ timeout: 10000 }); + await this.viewUnpublishedRecordsBtn(paId).click() + await this.modalCloseBtn.waitForExist({ timeout: 10000 }); + } + async downloadProjectActivity(paId){ + await this.projectActivityDownload(paId).click(); + } + + async downloadComplete() { + let btn = this.modalConfirmationButton + await browser.waitUntil(() => btn.isClickable(), {timeout: 5*60*60*1000}); + await btn.click(); + } + + async addRecord(paId){ + await this.addRecordBtn(paId).click(); + } + + async closeModal(){ + let modal = this.modalCloseBtn; + await modal.waitForEnabled({ timeout: 10000 }); + await modal.click(); + } + + async viewNthRecord(number= 0){ + await this.viewRecordBtn[number].click(); + await this.modalCloseBtn.waitForExist({ timeout: 10000 }); + } +} + +module.exports = PwaAppPage; \ No newline at end of file diff --git a/src/test/js/integration/pageobjects/ReloadablePage.js b/src/test/js/integration/pageobjects/ReloadablePage.js new file mode 100644 index 000000000..a9a976f59 --- /dev/null +++ b/src/test/js/integration/pageobjects/ReloadablePage.js @@ -0,0 +1,45 @@ +const StubbedCasSpec = require('./StubbedCasSpec.js') +class ReloadablePage extends StubbedCasSpec { + + atCheckTime = 0 + + /** + * Extends the standard at check to set a javascript variable that can later be + * checked to detect a pageload. + */ + async verifyAt() { + let result = await this.at(); + if (result) { + await this.saveAtCheckTime() + } + return result + } + + async saveAtCheckTime() { + this.atCheckTime = Date.now().toString() + let self = this; + await browser.execute(() => { + window.atCheckTime = self.atCheckTime; + }); + } + + async getAtCheckTime() { + return await browser.execute(() => { + return window.atCheckTime; + }); + } + + + /** Returns true if the page has been reloaded since the most recent "at" check */ + async hasBeenReloaded() { + return browser.waitUntil(async() => { + return ! await this.getAtCheckTime(); + }, + { + timeout: browser.options.testConfig.waitforTimeout, + timeoutMsg: "Page did not reload after reindexing" + }); + } +} + +module.exports = ReloadablePage; \ No newline at end of file diff --git a/src/test/js/integration/pageobjects/StubbedCasSpec.js b/src/test/js/integration/pageobjects/StubbedCasSpec.js new file mode 100644 index 000000000..6e67ecf96 --- /dev/null +++ b/src/test/js/integration/pageobjects/StubbedCasSpec.js @@ -0,0 +1,450 @@ +const jose = require('node-jose'); +const jwt = require('jsonwebtoken'); +const crypto = require('crypto'); +const axios = require('axios'); +const {startServer, stopServer,blockSite, unblockSite} = require('../utils/proxy'); +const util = require('node:util'); +const execFile = util.promisify(require('node:child_process').execFile); +const path = require('node:path'); +class StubbedCasSpec { + READ_ONLY_USER_ID = '1000' + GRANT_MANAGER_USER_ID = '1001' + MERIT_ADMIN_USER_ID = '1002' + ALA_ADMIN_USER_ID = '2000' + offlineMock = null; + loggedInUser = null; + baseUrl = ''; + serverUrl = ''; + testConfig = {}; + jwk = { + p: "ybsLU3Xf05Nkmfthec3Gf5SCR1cMG4gHYTJh9dP575RavQO63oxS9G-srVmNTmCYsoi-KJs9RODO8Ive701DrpSBkeM7cYZ5_7J3Zt7kTtIPCavwJsb0yhyJQGcm6v7iuF8GIRukeKLT57LwjhSPPqZgdOu9elsc3T7-D9jPPBE", + kty: "RSA", + q: "rA9mDEolsAG9br7CJlgPIaNsAdpPmqwGTnaHZgJCeN3XwKLlTkLiBlH66OdvakvoFHuvoiaUXFx2xd0G-WrBdePnqZcAb0SdLMp0RxDCRyC4HwJSE9YwieOpIO8EvgzYZKL7liUKR0fz3HAciV9oW3lA6bnh1doSVadw18LMKZk", + d: "GDawqqYZsTqZpR3WRyK1YoSI0qO4RS61jvW-l72SbpILYHl9M0cZewef95OrT9yl4-7SurBV15j7wkqLvLxmQNxpIs-yXRK5hpmvxa07SiXZOtwW7EvG_PMx9tyQ8LiyM8MnTr-qknh_Rtbjr9bH0mrMeUCQfVj5VSSF8SNHEVPGy_QxQoswIhRgzcq9tOaGP1W-FoVCaQjAxJG4boAselX_bvYe3IVuDwE_ZV8KPCQcZISEqrY8B8-b8AdTgecORODQB5lChElqRBeKUeoOtVMvD8rlwUgjV9ir_QK25Vq8rLcEkdPrRhV0EKKnr1eBir1WSpdLjzIUhAsF5HPUAQ", + e: "AQAB", + qi: "kuYhMgrJR1fTuX0IJar-SjWhrn3EV96bfaObAkxMZDHes-tthLxcZ58PpKKbsMSK8kncT41JMb0Irb9HC12B6aSDy3Kzsns-gzcD38m9YcdOk80kyjCqLIceU2tmMIeIxSF54wGwVO_p4p94xeANf4si450ssqdPM_q1n1SRu88", + dp: "Gx8Nj8P6OqzHSrh0S3bx5_ckaMj4NL9eFqA6cV11bdNpO55DwmXlRT26Xnf6un3cKayevEDaxObgi5CSgWPG5LLMlLuTI1ksD8eDrA3tbfdp1CgMmnoHMSETBtiXb-Kiwpzr6wmXXCywBqeVFdUHySl_MFj9WXTkdY5hg-nnOrE", + dq: "DwhxZBV-YXhlcq2cDPmYqNm8cBUA64SoMGbOwazk3eaUGTKiUkopsV-sSnkeFO1444FDASnZwJAbmIINP_GB4aj97qVQ1mfqS6WMr0DZmJlVPPBY9365UvLfLg90HJ7GsVREIwQtd7jjp5jsBVyeo49eio1BHAwnmfA9Pby5VdE", + n: "h5XN-_LL1yXb8oPWHOTNMby0Y6olpByVCNJGo1mjhk9PUoX8bfu6wNr4G7oR7O0NfIQVNLykqE7Q04RrP7JfexI97UuH5B0xBjHVo-S5SxeyUrVSQBpRu6EisQzxxF3a038a0GHYJpA5YUAZWD7Pux0yqJ5ly1y2Sn7uGb_JJ_bJ86EVWs3AxE1RZHmeY975A1kk470ylDAyfQuW_GU-gUzG5vdE1wAEIKe6GFtg5ulA_n_XVsrz9qio7ZtEyWZDAOCtk0jfg8iTJf5eLP2Q3D8ePy_6IvYvFDuQLmvKHn1jg5MnnDWZHV3GBRnfU8CtPu2ChFKhXedcrhQhhAWfKQ" + }; + privateKey = ''; + systemToken = ''; + constructor () { + this.testConfig = browser.options.testConfig; + this.baseUrl = this.testConfig.baseUrl; + this.serverUrl = this.testConfig.serverUrl; + } + + async at() { + throw new Error('Method at() is not implemented'); + } + + async loginAsAlaAdmin() { + await this.login({userId:this.ALA_ADMIN_USER_ID, role:"ROLE_ADMIN", userName: 'ala_admin@nowhere.com', email: 'ala_admin@nowhere.com', firstName:"ALA", lastName:"Administrator"}) + } + + async loginAsPwaUser(expired = false) { + let userDetails = this.getUserDetails('1'); + await this.setupUserProfileLookup(userDetails) + let {tokenSet, profile} = await this.setupOidcAuthForUser(userDetails, expired); + tokenSet.profile = profile; + let key = this.localStorageTokenKey; + console.log(`key - ${key}`); + console.log(`key - ${JSON.stringify(tokenSet)}`); + await browser.execute(function (key, tokenSet) { + localStorage.setItem(key, JSON.stringify(tokenSet)); + console.log('Token set in local storage'); + console.log(localStorage.getItem(key)); + }, key, tokenSet); + return tokenSet; + } + + get localStorageTokenKey() { + return `oidc.user:${browser.options.testConfig.wireMockBaseUrl}/cas/oidc/.well-known:${this.testConfig.oidc.clientId}` + } + + async loginAsUser(userId) { + const reservedUserIds = [ + this.MERIT_ADMIN_USER_ID, + this.READ_ONLY_USER_ID, + this.GRANT_MANAGER_USER_ID, + this.ALA_ADMIN_USER_ID + ]; + + // Check if userId is one of the reserved IDs + if (reservedUserIds.includes(userId)) { + throw new Error(`${userId} is reserved for users with higher level roles`); + } + + // User login data + const userDetails = this.getUserDetails(userId); + + // Call the login function, assuming it exists + await this.login(userDetails); + } + + getUserDetails(userId) { + return { + userId: userId, + username: userId, + email: `user${userId}@nowhere.com`, + firstName: "MERIT", + lastName: `User ${userId}` + }; + } + + async login(userDetails) { + if (this.loggedInUser != userDetails.userId) { + await this.logout() + } + await this.oidcLogin(userDetails) + this.loggedInUser = userDetails.userId; + } + + async logout(returnPage = 'EntryPage') { + const logoutButtonSelector = '.custom-header-login-logout'; + const logoutButton = await browser.$(logoutButtonSelector); + + if (await logoutButton.isDisplayed()) { + const buttonText = await logoutButton.getText(); + if (buttonText.trim() === "Logout") { + try { + await logoutButton.click(); + await browser.waitUntil(async () => { + const currentUrl = await browser.getUrl(); + // Adjust this condition to check if you are on the expected return page + return currentUrl.includes(returnPage); + }, { + timeout: 25000, // Wait for up to 25 seconds + timeoutMsg: 'Timed out after 25 seconds waiting for return page' + }); + } catch (error) { + console.warn("Test ended during page reload or with a modal backdrop resulting in failure to click logout button - directly navigating browser"); + await this.logoutViaUrl(); + } + } else { + await this.logoutViaUrl(); + } + } else { + await this.logoutViaUrl(); + } + } + + async logoutViaUrl() { + console.log('Navigating to logout page - ' + `${this.baseUrl}/logout?appUrl=${this.baseUrl}`); + await browser.url(`${this.baseUrl}/logout?appUrl=${this.baseUrl}`); + } + + async oidcLogin(userDetails) { + await this.setupOidcAuthForUser(userDetails) + console.log('Navigating to login page - ' + `${this.baseUrl}/login`); + await browser.url(`${this.baseUrl}/login`) + } + + async setupOidcAuthForUser(userDetails, expired = false) { + // Get the test configuration (assuming getTestConfig is defined elsewhere) + const clientId = this.testConfig.oidc.clientId; + const clientSecret = this.testConfig.oidc.secret; + + // Base64 encode clientId:clientSecret + const base64EncodedAuth = 'Basic ' + Buffer.from(`${clientId}:${clientSecret}`).toString('base64'); + + // Set default roles and append additional role if provided + let roles = ['ROLE_USER']; + if (userDetails.role) { + roles.push(userDetails.role); + } + + // Define ID Token Claims + let {payload, expiresIn, expiresAt} = this.getUserTokenClaim(userDetails, roles, clientId, expired); + const idToken = await this.signPayload(payload); + let tokenSet = this.getUserToken(idToken, expiresIn, expiresAt); + + // Stub the POST request for token exchange (using nock) + await this.setupAccessToken('/cas/oidc/oidcAccessToken', tokenSet, base64EncodedAuth); + let profile = await this.setupProfileEndpoint(userDetails, idToken); + + // Return the ID token + return {tokenSet, profile}; + } + + getUserToken(idToken, expiresIn, expiresAt) { + return { + access_token: idToken, + id_token: idToken, + refresh_token: null, + token_type: 'bearer', + expires_in: expiresIn, + expires_at: expiresAt, + scope: this.testConfig.oidc.scope + }; + } + + getUserTokenClaim(userDetails, roles, clientId, expired = false) { + let expiresIn = expired ? -1 * 3 * 24 * 60 * 60 : 365 * 24 * 60 * 60; + let expiresAt = Math.floor(Date.now() / 1000) + expiresIn; + console.log('Expires In: ', expiresIn); + console.log('Expires At: ', expiresAt); + let payload= { + at_hash: 'KX-L2Fj6Z9ow-gOpYfehRA', + sub: userDetails.userId, + username: userDetails.userId, + email_verified: true, + role: roles, + amr: 'DelegatedClientAuthenticationHandler', + iss: `${this.testConfig.wireMockBaseUrl}/cas/oidc`, + preferred_username: userDetails.email, + given_name: userDetails.firstName, + family_name: userDetails.lastName, + client_id: clientId, + sid: 'test_sid', + aud: clientId, + audience: clientId, + name: `${userDetails.firstName} ${userDetails.lastName}`, + state: 'maybe_this_matters', + auth_time: -1, + nbf: Math.floor(Date.now() / 1000) - 365 * 24 * 60 * 60, // Not before (one year ago) + exp: expiresAt, + iat: Math.floor(Date.now() / 1000), // Issued at + jti: 'id', + email: userDetails.email, + scope: this.testConfig.oidc.scope + }; + return {payload, expiresIn, expiresAt}; + } + + async setupUserProfileLookup(userDetails) { + try { + await axios.post(`${this.testConfig.wireMockBaseUrl}/__admin/mappings`, { + request: { + method: 'POST', + url: this.testConfig.wireMockBaseUrl + '/userdetails/userDetails/getUserDetails', + queryParameters: { + userName: { + "equalTo": userDetails.userId + }, + includeProps: { + "equalTo": "true" + } + } + }, + response: { + status: 200, + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(userDetails), + transformers: ['response-template'] + } + }); + console.log('user lookup stub configured successfully.'); + } catch (error) { + console.error('Error configuring stub:', error); + } + } + + async setupAccessToken(url, body, base64EncodedAuth){ + try { + // Set up POST request to "/cas/oidc/oidcAccessToken" + await axios.post(`${this.testConfig.wireMockBaseUrl}/__admin/mappings`, { + request: { + method: 'POST', + url: url, + headers: { + 'Authorization': { + "equalTo": base64EncodedAuth + } + } + }, + response: { + status: 200, + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(body), + transformers: ['response-template'] + } + }); + console.log('Stub configured successfully.'); + } catch (error) { + console.error('Error configuring stub:', error); + } + } + + async setupProfileEndpoint(userDetails, userToken){ + // Create user profile + const profile = { + userid: userDetails.userId, + sub: userDetails.userId, + name: `${userDetails.firstName} ${userDetails.lastName}`, + given_name: userDetails.firstName, + family_name: userDetails.lastName, + email: userDetails.email + }; + + await axios.post(`${this.testConfig.wireMockBaseUrl}/__admin/mappings`, { + request: { + method: 'GET', + url: '/cas/oidc/oidcProfile', + headers: { + 'Authorization': { + "equalTo": `Bearer ${userToken}` + } + } + }, + response: { + status: 200, + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(profile) + } + }); + + return profile; + } + + async setupTokenForSystem() { + // The test config isn't a normal grails config object (probably need to to into why) so getProperty doesn't work. + let clientId = this.testConfig.webservice["client-id"] + let clientSecret = this.testConfig.webservice["client-secret"] + let base64EncodedAuth = "Basic " + Buffer.from(`${clientId}:${clientSecret}`).toString('base64'); + + let idTokenClaims = this.getTokenClaims(clientId) + // Simulate generating JWT (signing token) - Assuming you have RSA private key in 'privateKey' + this.systemToken = await this.signPayload(idTokenClaims); + let token = this.getToken(this.systemToken); + + await this.setupAccessToken("/cas/oidc/oidcAccessToken", token, base64EncodedAuth); + + return this.systemToken; + } + + getToken(idToken) { + let token = {} + token.access_token = idToken + token.id_token = idToken + token.refresh_token = null + token.token_type = "bearer" + token.expires_in = 86400 + token.scope = this.testConfig.webservice["jwt-scopes"] + return token; + } + + getTokenClaims(clientId) { + return { + at_hash: "KX-L2Fj6Z9ow-gOpYfehRA", + sub: clientId, + amr: "DelegatedClientAuthenticationHandler", + iss: "http://localhost:8018/cas/oidc", + client_id: clientId, + aud: clientId, + audience: clientId, + state: "maybe_this_matters", + auth_time: -1, + nbf: Math.floor(Date.now() / 1000) - 365 * 24 * 60 * 60, // Not before (one year ago) + exp: Math.floor(Date.now() / 1000) + 365 * 24 * 60 * 60, // Expires in one year + iat: Math.floor(Date.now() / 1000), // Issued at + jti: "id-system", + scope: this.testConfig.webservice["jwt-scopes"] + }; + } + + async createPrivateKey() { + if (!this.privateKey) { + const keyStore = jose.JWK.createKeyStore(); + this.privateKey = await keyStore.add(this.jwk, 'private', {kid: "localhost:8018"}); + console.log("Private Key Created: ", this.privateKey); + } + + return this.privateKey; + } + + async signPayload(payload){ + await this.createPrivateKey(); + let accessToken = await jose.JWS.createSign({format:"compact", fields: { + alg: 'RS256', + kid: "localhost:8018", + }}, this.privateKey) + .update(JSON.stringify(payload)) + .final(); + console.log("Access Token Created: ", accessToken); + return accessToken; + } + + + async loadDataSet(dataSet) { + const targetDir = path.resolve(this.testConfig.resourceDir, dataSet); + let args = [targetDir]; + if (this.testConfig.databaseUserName) { + args.push(this.testConfig.databaseUserName); + } + if (this.testConfig.databasePassword) { + args.push(this.testConfig.databasePassword); + } + const {error, stdout, stderr} = await execFile(this.testConfig.datasetLoadScript, args) + console.log(`result of command ${JSON.stringify(error)} \n\n ${JSON.stringify(stderr)} \n\n ${JSON.stringify(stdout)}`); + } + + async setOffline(){ + console.log('Going offline - ' + this.baseUrl); + this.offlineMock = await browser.mock(`${this.baseUrl}/**`); + await this.offlineMock.abort("Failed"); + } + + async setOnline(){ + if (this.offlineMock) { + console.log('Going online'); + await this.offlineMock.restore(); + this.offlineMock = null; + } + } + + /** + * wait until knockout binding has been applied. + */ + async waitForKnockoutBinding(selector, element) { + return browser.waitUntil(async () => { + var result = await element.execute(` + if (typeof ko === 'undefined') { + return false; + } + return !!ko.dataFor(document.querySelector("${selector}"));`); + return result; + }, {timeout: 180000}); + } + + async takeScreenShot(name){ + var body = await $("body"); + await body.saveScreenshot(`./logs/${name}.png`); + } + + /** + * Drop a pin on the map + * @returns {Promise} + */ + async dropPin() { + // Select the marker draw button + const markerDraw = $('.leaflet-draw-draw-marker'); + await markerDraw.waitForDisplayed(); + + // Move to the marker button and click it + await markerDraw.moveTo(); + await markerDraw.click(); + + // Wait for the draw actions menu to appear + const drawActions = $('.leaflet-draw-actions'); // Get the first draw action + await drawActions.waitForDisplayed(); + + // click on the map pane to drop the pin + const mapPane = await $('.leaflet-map-pane'); + await mapPane.moveTo(); + await mapPane.click({x: 100, y: 100}); + + // wait for the point to be added to dropdown + const dropdown = $('.select2-selection__rendered'); + await dropdown.waitForDisplayed(); + } +} + +module.exports = StubbedCasSpec; \ No newline at end of file diff --git a/src/test/js/integration/pageobjects/ViewBioActivityPage.js b/src/test/js/integration/pageobjects/ViewBioActivityPage.js new file mode 100644 index 000000000..b7dd0bbe9 --- /dev/null +++ b/src/test/js/integration/pageobjects/ViewBioActivityPage.js @@ -0,0 +1,17 @@ +// const StubbedCasSpec = require('./StubbedCasSpec.js') +const ReloadablePage = require('./ReloadablePage.js') +class ViewBioActivityPage extends ReloadablePage { + get backBtn() { + return $('#backButton'); + } + async at() { + var title = await browser.getTitle(); + return /View \\| .* \\| BioCollect/i.test(title); + } + + speciesSelector(name) { + return $(`span=${name}`); + } +} + +module.exports = ViewBioActivityPage; diff --git a/src/test/js/integration/specs/activity/AddBioActivitySpec.js b/src/test/js/integration/specs/activity/AddBioActivitySpec.js new file mode 100644 index 000000000..e73dc0bd8 --- /dev/null +++ b/src/test/js/integration/specs/activity/AddBioActivitySpec.js @@ -0,0 +1,84 @@ +const AddBioActivityPage = require('../../pageobjects/AddBioActivityPage.js'); +const ViewBioActivityPage = require('../../pageobjects/ViewBioActivityPage.js'); +const projectId = "project_1" +const projectActivityId = 'pa_1' +const site = "ab9ec9af-241b-49f7-adcf-ca40e474d119" + +describe('Add BioActivity Spec', function () { + let addBioActivityPage, viewBioActivityPage; + beforeAll(async function() { + addBioActivityPage = new AddBioActivityPage(); + viewBioActivityPage = new ViewBioActivityPage(); + await addBioActivityPage.loadDataSet('dataset1'); + await addBioActivityPage.setupTokenForSystem(); + }); + + afterAll(async function() { + }); + + afterEach(async function() { + await addBioActivityPage.takeScreenShot("afterEachAddBioActivitySpec"); + await addBioActivityPage.logout(); + }); + + it('should add an activity', async () => { + await addBioActivityPage.loginAsUser('1'); + let promises = []; + // Navigate to the Add Bio Activity page + await addBioActivityPage.open(projectActivityId); + await addBioActivityPage.takeScreenShot("shouldAddAnActivitySurvey"); + // Set the site, date, and species + promises.push(addBioActivityPage.setSite(site)); + promises.push(addBioActivityPage.setDate('01/01/2020')); + + // Upload an image + promises.push(addBioActivityPage.uploadImage(`${addBioActivityPage.testConfig.resourceDir}/images/10_years.png`)); + + // Wait for all promises to resolve + await Promise.all(promises); + await addBioActivityPage.setSpecies('acacia') + await addBioActivityPage.takeScreenShot("shouldAddAnActivityBeforeSave"); + // Save the activity + await addBioActivityPage.saveActivity(); + await browser.pause(30000); + await addBioActivityPage.hasBeenReloaded(); + // Verify that the ViewBioActivityPage is loaded + expect(await viewBioActivityPage.at()).toBeTrue(); + await addBioActivityPage.takeScreenShot("shouldAddAnActivityAtViewBioActivityPage"); + }); + + it("should not be able to submit an activity when no network", async () => { + await addBioActivityPage.loginAsUser('1'); + let promises = []; + // Navigate to the Add Bio Activity page + await addBioActivityPage.open(projectActivityId); + await addBioActivityPage.takeScreenShot("shouldNotBeAbleToSubmitAnActivityWhenNoNetworkSurvey"); + // Set the site, date, and species + promises.push(addBioActivityPage.setSite(site)); + promises.push(addBioActivityPage.setDate('01/01/2020')); + + // Upload an image + promises.push(addBioActivityPage.uploadImage(`${addBioActivityPage.testConfig.resourceDir}/images/10_years.png`)); + + // Wait for all promises to resolve + await Promise.all(promises); + await addBioActivityPage.setSpecies('acacia') + await addBioActivityPage.setOffline(); + // Save the activity + await addBioActivityPage.saveActivity(); + await addBioActivityPage.takeScreenShot("shouldNotBeAbleToSubmitAnActivityWhenNoNetworkBeforeSave"); + // await browser.dismissAlert(); + await addBioActivityPage.dismissBootBoxDialog(); + await addBioActivityPage.takeScreenShot("shouldNotBeAbleToSubmitAnActivityWhenNoNetworkAfterDismiss"); + // Verify that the ViewBioActivityPage is loaded + expect(await addBioActivityPage.at()).toBeTrue(); + + // go online + await addBioActivityPage.setOnline() + await addBioActivityPage.saveActivity(); + await addBioActivityPage.hasBeenReloaded(); + expect(await viewBioActivityPage.at()).toBeTrue(); + await addBioActivityPage.takeScreenShot("shouldNotBeAbleToSubmitAnActivityWhenNoNetworkAfterSuccessfullSave"); + }) + +}); \ No newline at end of file diff --git a/src/test/js/integration/specs/pwa/InstallationSpec.js b/src/test/js/integration/specs/pwa/InstallationSpec.js new file mode 100644 index 000000000..8d00f9056 --- /dev/null +++ b/src/test/js/integration/specs/pwa/InstallationSpec.js @@ -0,0 +1,214 @@ +const AdminToolsPage = require('../../pageobjects/AdminToolsPage'); +const PwaAppPage = require('../../pageobjects/PwaAppPage'); +const AddBioActivityPage = require("../../pageobjects/AddBioActivityPage"); +const ViewBioActivityPage = require("../../pageobjects/ViewBioActivityPage"); +const HomePage = require("../../pageobjects/HomePage"); +const OfflineListPage = require("../../pageobjects/OfflineListPage"); +const {startServer, stopServer} = require('../../utils/proxy'); +const {browser} = require("@wdio/globals"); + +describe("Application installation Spec", function () { + var pa = 'pa_1', project = 'project_1', site = "ab9ec9af-241b-49f7-adcf-ca40e474d119", promises = [], url, + adminToolsPage, pwaAppPage, addBioActivityPage, homePage, offlineListPage, timeout = 4000; + + + beforeAll(async function () { + adminToolsPage = new AdminToolsPage(); + homePage = new HomePage(); + pwaAppPage = new PwaAppPage(); + addBioActivityPage = new AddBioActivityPage(); + url = `${pwaAppPage.baseUrl}/pwa/bioActivity/edit/${pa}`; + await startServer(); + await adminToolsPage.loadDataSet('dataset1'); + await adminToolsPage.setupTokenForSystem(); + await homePage.open(); + await adminToolsPage.loginAsAlaAdmin(); + await adminToolsPage.reindex(); + }); + + beforeEach(async function () { + console.log("before each"); + await pwaAppPage.open(); + console.log("before each - open"); + await pwaAppPage.loginAsPwaUser(); + console.log("before each - login"); + await pwaAppPage.open(); + console.log("before each - open again"); + // await browser.pause(5000); + // await pwaAppPage.start(); + // console.log("before each - start"); + }); + + afterEach(async function () { + await pwaAppPage.logout(); + }); + + afterAll(async function () { + await stopServer(); + }); + + it("submit record offline and publish it when network returns", async function () { + console.log(url); + await pwaAppPage.start(); + await addBioActivityPage.takeScreenShot("openProjectAndTakeItOffline"); + await pwaAppPage.viewProject(project); + await pwaAppPage.downloadProjectActivity(pa); + await addBioActivityPage.takeScreenShot("openProjectAndTakeItOfflineBeforeDownload"); + await pwaAppPage.downloadComplete(); + await stopServer(); + await pwaAppPage.addRecord(pa); + await browser.pause(5000); + let iframe = await browser.findElement('tag name', 'iframe'); + let contextId = await browser.switchToFrame(iframe); + console.log("iframe context id- " +contextId); + await addBioActivityPage.setSite(site); + await addBioActivityPage.uploadImage(`${addBioActivityPage.testConfig.resourceDir}/images/10_years.png`, true); + // Wait for all promises to resolve + await Promise.all(promises); + await addBioActivityPage.setDate('01/01/2020'); + await addBioActivityPage.setSpecies('Acavomonidia', true) + // Save the activity + await addBioActivityPage.saveActivity(); + await addBioActivityPage.takeScreenShot("openProjectAndTakeItOfflineAfterSave"); + contextId = await browser.switchToFrame(null); + console.log("main frame context id- " +contextId); + contextId = await browser.switchFrame(null); + console.log("main frame context id- " +contextId); + await pwaAppPage.closeModal(); + console.log("number of records checked again"); + + await startServer(); + await pwaAppPage.open(); + await pwaAppPage.viewProject(project); + await pwaAppPage.viewRecords(pa); + await pwaAppPage.viewUnpublishedRecords(pa); + await addBioActivityPage.takeScreenShot("openProjectAndTakeItOfflineUnpublishedRecords"); + + iframe = await browser.findElement('tag name', 'iframe'); + console.log("iframe url - " + JSON.stringify(iframe)); + contextId = await browser.switchToFrame(iframe); + console.log("iframe context id- " +contextId); + + offlineListPage = new OfflineListPage(); + expect(await offlineListPage.at()).toEqual(true); + await expect(offlineListPage.uploadAllButton).toBeEnabled(); + await expect(offlineListPage.firstUploadButton).toBeEnabled(); + await offlineListPage.uploadRecords(); + await addBioActivityPage.takeScreenShot("openProjectAndTakeItOfflinePublishedRecords"); + await browser.pause(5000); + await expect(offlineListPage.uploadAllButton).toBeDisabled(); + + await expect(await offlineListPage.alert).toHaveText("Unpublished records not found"); + await browser.switchToFrame(null); + await pwaAppPage.closeModal(); + + // check if the record is uploaded + await pwaAppPage.viewRecords(pa); + await pwaAppPage.viewNthRecord(); + await browser.pause(3000); + iframe = $("iframe"); + contextId = await browser.switchFrame(iframe); + console.log("iframe context id- " +contextId); + let viewBioActivityPage = new ViewBioActivityPage(); + var speciesEl = viewBioActivityPage.speciesSelector("Acavomonidia"); + await addBioActivityPage.takeScreenShot("openProjectAndTakeItOfflineViewPublishedRecord"); + await speciesEl.scrollIntoView(); + await expect(speciesEl).toBeDisplayed(); + await browser.switchFrame(null); + await pwaAppPage.closeModal(); + }); + + it("submit record offline and choose a site on map and publish it when network returns", async function () { + console.log(url); + let getStarted = await pwaAppPage.getStarted; + if (getStarted && (await getStarted.isDisplayed())) { + await pwaAppPage.start(); + } + await addBioActivityPage.takeScreenShot("pinSubmitRecordOfflineAndChooseSiteOnMap"); + await pwaAppPage.viewProject(project); + await stopServer(); + await pwaAppPage.addRecord(pa); + await browser.pause(5000); + let iframe = await browser.findElement('tag name', 'iframe'); + let contextId = await browser.switchFrame($("iframe")); + console.log("iframe context id- " +contextId); + await addBioActivityPage.dropPin(); + await addBioActivityPage.uploadImage(`${addBioActivityPage.testConfig.resourceDir}/images/10_years.png`, true); + // Wait for all promises to resolve + await Promise.all(promises); + await addBioActivityPage.setDate('01/01/2020'); + await addBioActivityPage.setSpecies('Fungi', true) + // Save the activity + await addBioActivityPage.saveActivity(); + await addBioActivityPage.takeScreenShot("pinSubmitRecordOfflineAndChooseSiteOnMapAfterSave"); + contextId = await browser.switchFrame(null); + console.log("main frame context id- " +contextId); + await pwaAppPage.closeModal(); + console.log("number of records checked again"); + + await startServer(); + await pwaAppPage.open(); + await pwaAppPage.viewProject(project); + await pwaAppPage.viewRecords(pa); + await pwaAppPage.viewUnpublishedRecords(pa); + await addBioActivityPage.takeScreenShot("pinSubmitRecordOfflineAndChooseSiteOnMapUnpublishedRecords"); + + contextId = await browser.switchFrame($('iframe')); + console.log("iframe context id- " +contextId); + + offlineListPage = new OfflineListPage(); + expect(await offlineListPage.at()).toEqual(true); + await expect(offlineListPage.uploadAllButton).toBeEnabled(); + await expect(offlineListPage.firstUploadButton).toBeEnabled(); + await offlineListPage.uploadRecords(); + await addBioActivityPage.takeScreenShot("pinSubmitRecordOfflineAndChooseSiteOnMapPublishedRecords"); + await browser.pause(5000); + await expect(offlineListPage.uploadAllButton).toBeDisabled(); + + await expect(await offlineListPage.alert).toHaveText("Unpublished records not found"); + await browser.switchFrame(null); + await pwaAppPage.closeModal(); + + // check if the record is uploaded + await pwaAppPage.viewRecords(pa); + await browser.pause(5000); + await pwaAppPage.viewNthRecord(); + await browser.pause(3000); + iframe = $("iframe"); + contextId = await browser.switchFrame(iframe); + console.log("iframe context id- " +contextId); + let viewBioActivityPage = new ViewBioActivityPage(); + var speciesEl = viewBioActivityPage.speciesSelector("Fungi"); + await addBioActivityPage.takeScreenShot("pinSubmitRecordOfflineAndChooseSiteOnMapViewPublishedRecord"); + await speciesEl.scrollIntoView(); + await expect(speciesEl).toBeDisplayed(); + // map pin should be displayed + var pin =$('.leaflet-marker-icon'); + await pin.scrollIntoView(); + await expect(pin).toBeDisplayed(); + await browser.switchFrame(null); + await pwaAppPage.closeModal(null); + }); + + it("login with expired token", async function () { + console.log("login with expired token - start"); + await pwaAppPage.logout(); + console.log("login with expired token - logout"); + await pwaAppPage.atSignIn(); + console.log("login with expired token - at sign in page"); + await pwaAppPage.loginAsPwaUser(true); + console.log("login with expired token - login as pwa user with expired token"); + await pwaAppPage.open(); + await browser.pause(2000); + // await browser.getUrl(); + console.log("login with expired token - open"); + expect(await pwaAppPage.atSignIn()).toEqual(true); + console.log("login with expired token - expect to be at sign in page"); + await pwaAppPage.loginAsPwaUser(false); + console.log("login with expired token - login as pwa user not expired"); + await pwaAppPage.open(); + console.log("login with expired token - open again"); + await pwaAppPage.at(); + console.log("login with expired token - at pwa app page"); + }); +}); \ No newline at end of file diff --git a/src/test/js/integration/utils/proxy.js b/src/test/js/integration/utils/proxy.js new file mode 100644 index 000000000..dd4c06ef2 --- /dev/null +++ b/src/test/js/integration/utils/proxy.js @@ -0,0 +1,66 @@ +const http = require('http'); +const httpProxy = require('http-proxy'); +// Start an HTTP server to handle requests +let server +let block = "" +const target_address = "http://localhost:8087" +async function startServer(blockUrl="", port=8081) { + const proxy = httpProxy.createProxyServer({}); + server = http.createServer((req, res) => { + // Example blacklist: Block localhost:8080 + console.log(`block: ${block}`); + if (block) { + console.log(`Blocking request to ${req.url}`); + res.writeHead(503, { 'Content-Type': 'text/plain' }); + res.end('Service Unavailable - Simulating Offline Mode'); + } else { + console.log(`Received request for ${req.url}`); + // Otherwise, forward the request to the target server + proxy.web(req, res, { target: target_address }); + } + }); + + return new Promise(resolve => { + server.listen(port, () => { + console.log(`Proxy server listening on port ${port}`); + resolve(server); + }); + }) +} + +function stopServer() { + if(server) { + server.on('close', (err) => { + console.log('shutting down server'); + }); + + let promise = new Promise((resolve, reject) => { + server.close((err) => { + if (err) { + reject(err); + } else { + resolve(); + server = null; + } + }); + }); + + return promise; + } + + return Promise.resolve(); +} + + + +function blockSite(blockUrl) { + block = blockUrl; + console.log(`Blocking site: ${block}`); +} + +function unblockSite() { + block = ""; + console.log(`Unblocking site`); +} + +module.exports = {startServer, stopServer, blockSite, unblockSite}; \ No newline at end of file diff --git a/src/test/js/spec/BiocollectUtilsSpec.js b/src/test/js/spec/BiocollectUtilsSpec.js new file mode 100644 index 000000000..52e3f8adc --- /dev/null +++ b/src/test/js/spec/BiocollectUtilsSpec.js @@ -0,0 +1,217 @@ +describe("BiocollectUtilsSpec", function () { + describe('saveDocument', function () { + var mockResult; + // Define test data + beforeEach(function () { + mockResult = { + data: { + file: { + type: "text/plain", + name: "mockFileName", + size: 100, + lastModified: "2019" + }, + blob: 'mockBlobData' + } + }; + + window.entities = { + saveDocument: function (document) { + } + } + }); + + it('should resolve the promise when save operation is successful', async function (done) { + // Mock the window.entities.saveDocument function to return a resolved promise + spyOn(window.entities, 'saveDocument').and.returnValue(Promise.resolve({data: 1})); + await biocollect.utils.saveDocument(mockResult).then(function (result) { + expect(result.data).toBe(1); + done(); + }) + }); + + it('should reject the promise when save operation fails', async function (done) { + // Mock the window.entities.saveDocument function to return a rejected promise + spyOn(window.entities, 'saveDocument').and.returnValue(Promise.reject('Save failed')); + biocollect.utils.saveDocument(mockResult).then(function (result) { + }, function (error) { + expect(error.error).toBe('Save failed'); + done(); + }); + }); + + it('should reject the promise when window.entities is not defined', function (done) { + // Undefine window.entities + window.entities = undefined; + biocollect.utils.saveDocument(mockResult).then(function (result) { + }, function (error) { + expect(error).toBeUndefined(); + done(); + }); + }); + + it('should reject the promise when createDocument fails', async function (done) { + // Mock createDocument to throw an error + spyOn(biocollect.utils, 'createDocument').and.throwError('Document creation error'); + try { + biocollect.utils.saveDocument(mockResult); + } catch (error) { + expect(error.message).toBe('Document creation error'); + done(); + } + }); + }); + + + describe('addObjectURL', function () { + // Test case 1: Valid Blob + it('should set thumbnailUrl and url when a valid blob is provided', function () { + var mockDocument = { + blob: 'mockBlobData', + contentType: 'image/jpeg' + }; + + biocollect.utils.addObjectURL(mockDocument); + + expect(mockDocument.blobObject instanceof Blob).toBe(true); + expect(mockDocument.thumbnailUrl).toBeDefined(); + expect(mockDocument.url).toBeDefined(); + }); + + // Test case 2: No Blob Provided + it('should not modify document properties when no blob is provided', function () { + var mockDocument = {}; + + biocollect.utils.addObjectURL(mockDocument); + + expect(mockDocument.blobObject).toBeUndefined(); + expect(mockDocument.thumbnailUrl).toBeUndefined(); + expect(mockDocument.url).toBeUndefined(); + }); + }); + + describe('nodeScriptReplace', () => { + it('should replace a script node with its clone if it is a script node', () => { + // Create a sample DOM structure with a script node + const scriptNode = document.createElement('script'); + const parentNode = document.createElement('div'); + parentNode.appendChild(scriptNode); + + // Call the function + const result = biocollect.utils.nodeScriptReplace(parentNode); + + // Expect that the script node is replaced by its clone + expect(result.childNodes.length).toBe(1); + expect(result.childNodes[0].tagName).toBe('SCRIPT'); + expect(result.childNodes[0]).not.toBe(scriptNode); + }); + + it('should recursively replace script nodes within a nested structure', () => { + // Create a nested DOM structure with script nodes + const root = document.createElement('div'); + const div1 = document.createElement('div'); + const scriptNode1 = document.createElement('script'); + div1.appendChild(scriptNode1); + + const div2 = document.createElement('div'); + const scriptNode2 = document.createElement('script'); + div2.appendChild(scriptNode2); + + root.appendChild(div1); + root.appendChild(div2); + + // Call the function + const result = biocollect.utils.nodeScriptReplace(root); + + // Expect that all script nodes are replaced by their clones + expect(result.childNodes.length).toBe(2); + + const replacedDiv1 = result.childNodes[0]; + expect(replacedDiv1.childNodes.length).toBe(1); + expect(replacedDiv1.childNodes[0].tagName).toBe('SCRIPT'); + expect(replacedDiv1.childNodes[0]).not.toBe(scriptNode1); + + const replacedDiv2 = result.childNodes[1]; + expect(replacedDiv2.childNodes.length).toBe(1); + expect(replacedDiv2.childNodes[0].tagName).toBe('SCRIPT'); + expect(replacedDiv2.childNodes[0]).not.toBe(scriptNode2); + }); + }); + + describe('nodeScriptClone', () => { + it('should clone a script node with its attributes and text', () => { + // Create a sample script node with attributes and text + const scriptNode = document.createElement('script'); + scriptNode.setAttribute('src', 'sample.js'); + scriptNode.innerHTML = 'console.log("Hello, World!");'; + + // Call the function + const clonedNode = biocollect.utils.nodeScriptClone(scriptNode); + + // Expect that the cloned node has the same attributes and text + expect(clonedNode.tagName).toBe('SCRIPT'); + expect(clonedNode.getAttribute('src')).toBe('sample.js'); + expect(clonedNode.innerHTML).toBe('console.log("Hello, World!");'); + }); + }); + + describe('nodeScriptIs', () => { + it('should return true if the node is a script node', () => { + // Create a sample script node + const scriptNode = document.createElement('script'); + + // Call the function + const isScript = biocollect.utils.nodeScriptIs(scriptNode); + + // Expect that it returns true + expect(isScript).toBe(true); + }); + + it('should return false if the node is not a script node', () => { + // Create a sample div node + const divNode = document.createElement('div'); + + // Call the function + const isScript = biocollect.utils.nodeScriptIs(divNode); + + // Expect that it returns false + expect(isScript).toBe(false); + }); + }); + + + describe("readDocument", function() { + it("should resolve the deferred with blob and file data when reading succeeds", function(done) { + // Create a mock file + const mockFile = new Blob(['Test content'], { type: 'text/plain' }); + + // Create a mock FileReader + const mockFileReader = { + onload: null, + onerror: null, + readAsArrayBuffer: function(file) { + // Simulate successful reading + this.onload({ target: { result: 'Mock ArrayBuffer Data' } }); + } + }; + + // Spy on the FileReader constructor to return the mock FileReader + spyOn(window, 'FileReader').and.returnValue(mockFileReader); + + // Call the readDocument function with the mock file + biocollect.utils.readDocument(mockFile) + .then(function(result) { + // Expect the promise to be resolved with the expected data + expect(result).toEqual({ data: { blob: 'Mock ArrayBuffer Data', file: mockFile } }); + done(); // Call done to signal the test is complete + }) + .catch(function(error) { + // Fail the test if there's an error + fail('Promise was rejected: ' + error); + done(); + }); + }); + }); + +}); + diff --git a/src/test/js/spec/ProjectActivitySpec.js b/src/test/js/spec/ProjectActivitySpec.js index 2dc31dba0..074dde0ba 100644 --- a/src/test/js/spec/ProjectActivitySpec.js +++ b/src/test/js/spec/ProjectActivitySpec.js @@ -18,7 +18,7 @@ describe("ProjectActivityViewModel Spec", function () { activityViewUrl: "/biocollect/sightings/bioActivity/index", getGuidForOutputSpeciesUrl : "/biocollect/sightings/record/getGuidForOutputSpeciesIdentifier", uploadImagesUrl: "/biocollect/ws/attachment/upload?hub=sightings", - searchBieUrl: "/biocollect/search/searchSpecies/e61eb018-02a9-4e3b-a4b3-9d6be33d9cbb?limit=10&hub=sightings", + searchBieUrl: "/biocollect/search/searchSpecies?projectActivityId=e61eb018-02a9-4e3b-a4b3-9d6be33d9cbb&limit=10&hub=sightings", speciesListUrl: "/biocollect/sightings/proxy/speciesItemsForList", speciesProfileUrl: "/biocollect/sightings/proxy/speciesProfile", noImageUrl: '/biocollect/assets/no-image-2-14a0a809823b65b821d14e1b5f6e2e9f.png', @@ -198,7 +198,7 @@ describe("pActivityInfo Spec", function () { activityViewUrl: "/biocollect/sightings/bioActivity/index", getGuidForOutputSpeciesUrl : "/biocollect/sightings/record/getGuidForOutputSpeciesIdentifier", uploadImagesUrl: "/biocollect/ws/attachment/upload?hub=sightings", - searchBieUrl: "/biocollect/search/searchSpecies/e61eb018-02a9-4e3b-a4b3-9d6be33d9cbb?limit=10&hub=sightings", + searchBieUrl: "/biocollect/search/searchSpecies?projectActivityId=e61eb018-02a9-4e3b-a4b3-9d6be33d9cbb&limit=10&hub=sightings", speciesListUrl: "/biocollect/sightings/proxy/speciesItemsForList", speciesProfileUrl: "/biocollect/sightings/proxy/speciesProfile", noImageUrl: '/biocollect/assets/no-image-2-14a0a809823b65b821d14e1b5f6e2e9f.png', @@ -262,7 +262,7 @@ describe("SpeciesConstraintViewModel Spec", function () { activityViewUrl: "/biocollect/sightings/bioActivity/index", getGuidForOutputSpeciesUrl : "/biocollect/sightings/record/getGuidForOutputSpeciesIdentifier", uploadImagesUrl: "/biocollect/ws/attachment/upload?hub=sightings", - searchBieUrl: "/biocollect/search/searchSpecies/e61eb018-02a9-4e3b-a4b3-9d6be33d9cbb?limit=10&hub=sightings", + searchBieUrl: "/biocollect/search/searchSpecies?projectActivityId=e61eb018-02a9-4e3b-a4b3-9d6be33d9cbb&limit=10&hub=sightings", speciesListUrl: "/biocollect/sightings/proxy/speciesItemsForList", speciesProfileUrl: "/biocollect/sightings/proxy/speciesProfile", noImageUrl: '/biocollect/assets/no-image-2-14a0a809823b65b821d14e1b5f6e2e9f.png', @@ -326,7 +326,7 @@ describe("SpeciesListsViewModel Spec", function () { activityViewUrl: "/biocollect/sightings/bioActivity/index", getGuidForOutputSpeciesUrl : "/biocollect/sightings/record/getGuidForOutputSpeciesIdentifier", uploadImagesUrl: "/biocollect/ws/attachment/upload?hub=sightings", - searchBieUrl: "/biocollect/search/searchSpecies/e61eb018-02a9-4e3b-a4b3-9d6be33d9cbb?limit=10&hub=sightings", + searchBieUrl: "/biocollect/search/searchSpecies?projectActivityId=e61eb018-02a9-4e3b-a4b3-9d6be33d9cbb&limit=10&hub=sightings", speciesListUrl: "/biocollect/sightings/proxy/speciesItemsForList", speciesProfileUrl: "/biocollect/sightings/proxy/speciesProfile", noImageUrl: '/biocollect/assets/no-image-2-14a0a809823b65b821d14e1b5f6e2e9f.png', @@ -364,7 +364,7 @@ describe("SurveyVisibilityViewModel Spec", function () { activityViewUrl: "/biocollect/sightings/bioActivity/index", getGuidForOutputSpeciesUrl : "/biocollect/sightings/record/getGuidForOutputSpeciesIdentifier", uploadImagesUrl: "/biocollect/ws/attachment/upload?hub=sightings", - searchBieUrl: "/biocollect/search/searchSpecies/e61eb018-02a9-4e3b-a4b3-9d6be33d9cbb?limit=10&hub=sightings", + searchBieUrl: "/biocollect/search/searchSpecies?projectActivityId=e61eb018-02a9-4e3b-a4b3-9d6be33d9cbb&limit=10&hub=sightings", speciesListUrl: "/biocollect/sightings/proxy/speciesItemsForList", speciesProfileUrl: "/biocollect/sightings/proxy/speciesProfile", noImageUrl: '/biocollect/assets/no-image-2-14a0a809823b65b821d14e1b5f6e2e9f.png', diff --git a/src/test/js/spec/PwaIndexSpec.js b/src/test/js/spec/PwaIndexSpec.js new file mode 100644 index 000000000..74d9fae78 --- /dev/null +++ b/src/test/js/spec/PwaIndexSpec.js @@ -0,0 +1,344 @@ +describe("PwaIndexSpec", function (){ + beforeEach(function() { + window.tileSize = 256; + window.crs = L.CRS.EPSG3857; + window.minNumberOfTilesPerZoom = 25; + window.maxTilesPerAxis = 5; + }); + afterEach(function() { + delete window.titleSize; + delete window.crs; + delete window.minNumberOfTilesPerZoom; + delete window.maxTilesPerAxis; + }); + describe("tileYCoordinateFromLatLng", function() { + it("should return the correct tile coordinate for a given latitude, longitude, and zoom level", function() { + expect(tileYCoordinateFromLatLng(0, 0, 0)).toBe(0); + expect(tileYCoordinateFromLatLng(51, 0, 10)).toBe(342); + expect(tileYCoordinateFromLatLng(-33, -32, 12)).toBe(2446); + window.tileSize = 512; + expect(tileYCoordinateFromLatLng(51, 0, 10)).toBe(171); + expect(tileYCoordinateFromLatLng(-33, -32, 12)).toBe(1223); + }); + }); + + describe("tileXCoordinateFromLatLng", function() { + it("should return the correct tile coordinate for a given latitude, longitude, and zoom level", function() { + expect(tileXCoordinateFromLatLng(0, 0, 0)).toBe(0); + expect(tileXCoordinateFromLatLng(0, 180, 10)).toBe(1024); + expect(tileXCoordinateFromLatLng(0, -90, 10)).toBe(256); + window.tileSize = 512; + expect(tileXCoordinateFromLatLng(0, 180, 10)).toBe(512); + expect(tileXCoordinateFromLatLng(0, -90, 10)).toBe(128); + }); + }); + + describe("totalTilesForBoundsAtZoom", function() { + it("should return the correct total number of tiles for a given bounds and zoom level", function() { + var bounds1 = L.latLngBounds(L.latLng(0, 0), L.latLng(85.0511, 180)); + expect(totalTilesForBoundsAtZoom(bounds1, 0)).toBe(1); + + var bounds2 = L.latLngBounds(L.latLng(0, 0), L.latLng(85.0511, 180)); + expect(totalTilesForBoundsAtZoom(bounds2, 10)).toBe(263169); + }); + }); + + describe("totalTilesForBounds", function() { + it("should return the correct total number of tiles for a given bounds and range of zoom levels", function() { + var bounds1 = L.latLngBounds(L.latLng(0, 0), L.latLng(85.0511, 180)); + expect(totalTilesForBounds(bounds1, 0, 0)).toBe(1); + + var bounds2 = L.latLngBounds(L.latLng(0, 0), L.latLng(85.0511, 180)); + expect(totalTilesForBounds(bounds2, 5, 7)).toBe(5603); + }); + }); + + describe("deleteMapTiles", function() { + it("should delete map tiles within the specified bounds and zoom levels", async function() { + const bounds = L.latLngBounds(L.latLng(0, 0), L.latLng(0.1, 0.1)); + const tileUrl = "https://abc.com/{Z}/{y}/{x}.png"; + const minZoom = 0; + const maxZoom = 2; + window.cacheName = "v1"; + const callback = jasmine.createSpy("callback"); + const fakeCache = { + delete: async function(requestUrl) { + return Promise.resolve(); + } + }; + spyOn(caches, "open").and.returnValue(fakeCache); + await deleteMapTiles(bounds, tileUrl, minZoom, maxZoom, callback); + expect(callback).toHaveBeenCalled(); + }); + }); + + describe("downloadMapTiles", function() { + it("should delete map tiles within the specified bounds and zoom levels", async function() { + const bounds = L.latLngBounds(L.latLng(0, 0), L.latLng(0.1, 0.1)); + const tileUrl = "https://abc.com/{Z}/{y}/{x}.png"; + const minZoom = 0; + const maxZoom = 2; + window.cacheName = "v1"; + const callback = jasmine.createSpy("callback"); + const fakeCache = { + match: async function(requestUrl) { + return Promise.resolve({}); + } + }; + spyOn(caches, "open").and.returnValue(fakeCache); + await downloadMapTiles(bounds, tileUrl, minZoom, maxZoom, callback); + expect(callback).toHaveBeenCalled(); + }); + }); + + describe("downloadProjectActivityArtefacts", function() { + var fakeIframe; + + beforeAll(function() { + jasmine.Ajax.install(); + // Create a fake iframe element + fakeIframe = document.createElement("iframe"); + fakeIframe.id = "form-content"; + document.body.appendChild(fakeIframe); + }); + + afterAll(function() { + jasmine.Ajax.uninstall(); + // Remove the fake iframe and restore original functions + document.body.removeChild(fakeIframe); + }); + + it("should resolve the promise when all URLs are successfully loaded", async function() { + // Mock the viewModel and fcConfig objects + var viewModel = { + numberOfFormsDownloaded: jasmine.createSpy("numberOfFormsDownloaded"), + totalFormDownload: jasmine.createSpy("totalFormDownload"), + }; + + window.fcConfig = { + createActivityUrl: "data:text/html,

This is a mock content 1

", + indexActivityUrl: "data:text/html,

This is a mock content 2

", + offlineListUrl: "data:text/html,

This is a mock content 3

", + }; + + var intervalId = setInterval(function() { + var viewModelLoadedEvent = new Event('view-model-loaded'); + document.dispatchEvent(viewModelLoadedEvent); + },1000); + + await downloadProjectActivityArtefacts(viewModel, fcConfig); + expect(viewModel.numberOfFormsDownloaded).toHaveBeenCalled(); + expect(viewModel.totalFormDownload).toHaveBeenCalled(); + clearInterval(intervalId); + }); + }); + + describe("OfflineViewModel", function() { + var div, viewModel, sw, fakeIframe, intervalId, + site ={ siteId: 'site1', name: "site 1", extent: { geometry: { type: 'Point', coordinates: [ 149.12043571472168, -35.301817150253676 ] } } }; + + beforeAll(function() { + window.maxArea = 25 * 1000 * 1000; + window.L.Google = function(){}; + window.L.Google.isGoogleMapsReady = function () {return false}; + window.ALA = { + MapConstants : { + /** + * Types of drawing objects + */ + DRAW_TYPE: { + POINT_TYPE: "Point", + CIRCLE_TYPE: "Circle", + POLYGON_TYPE: "Polygon", + LINE_TYPE: "LineString" + }, + + /** + * Types of layers + */ + LAYER_TYPE: { + MARKER: "marker" + } + }, + Map: function () { + return { + getMapImpl: function () { + return { + getZoom: function () { + return 15; + }, + getBounds: function () { + }, + fitBounds: function () { + }, + invalidateSize: function (){} + }; + }, + addLayer: function () { + }, + removeLayer: function () { + }, + getBounds: function () { + }, + getZoom: function () { + return 15; + }, + fitBounds: function () { + }, + registerListener: function () { + }, + } + } + }; + window.fcConfig = { + createActivityUrl: "data:text/html,

This is a mock content 1

", + indexActivityUrl: "data:text/html,

This is a mock content 2

", + offlineListUrl: "data:text/html,

This is a mock content 3

", + }; + }); + + beforeEach(function() { + window.entities = { + getSpeciesForProjectActivity: function (pa, fn) {viewModel.progress(100); viewModel.totalCount(100); return Promise.resolve({data: []})}, + getProjectActivityMetadata: function () {return Promise.resolve({data: { pActivity: { sites: [ + site + ] }, project: {}}})}, + saveSites: function () {return Promise.resolve({data: undefined})}, + deleteAllSpecies: function () {return Promise.resolve({data: undefined})}, + saveMap: function () {return Promise.resolve({data: undefined})}, + getMaps: function () {return Promise.resolve({data: [{id: 1, name: "test"}]})}, + deleteMap: function () {return Promise.resolve({data: undefined})}, + }; + + spyOn(window.entities, "getSpeciesForProjectActivity").and.callThrough(); + spyOn(window.entities, "getProjectActivityMetadata").and.callThrough(); + spyOn(window.entities, "saveSites").and.callThrough(); + spyOn(window.entities, "deleteAllSpecies").and.callThrough(); + spyOn(window.entities, "saveMap").and.callThrough(); + spyOn(window.entities, "getMaps").and.callThrough(); + spyOn(window.entities, "deleteMap").and.callThrough(); + sw = navigator.serviceWorker.getRegistration; + spyOn(navigator.serviceWorker, 'getRegistration').and.callFake(function () { + intervalId = setInterval(function () { + var viewModelLoadedEvent = new Event('view-model-loaded'); + document.dispatchEvent(viewModelLoadedEvent); + }, 1000); + + return Promise.resolve({}); + }); + + + jasmine.Ajax.install(); + div = document.createElement("div"); + div.id = "map1"; + document.body.appendChild(div); + + fakeIframe = document.createElement("iframe"); + fakeIframe.id = "form-content"; + document.body.appendChild(fakeIframe); + }); + + afterEach(function() { + jasmine.Ajax.uninstall(); + navigator.serviceWorker = sw; + clearInterval(intervalId); + document.body.removeChild(div); + document.body.removeChild(fakeIframe); + }); + + it("should check if survey is offline capable", async function() { + initViewModel(); + var originalPostMessage = window.parent.postMessage; + spyOn(window.parent, 'postMessage'); + viewModel.metadataStatus(viewModel.statuses.done); + viewModel.formStatus(viewModel.statuses.done); + viewModel.speciesStatus(viewModel.statuses.done); + viewModel.mapStatus(viewModel.statuses.done); + viewModel.sitesStatus(viewModel.statuses.done); + expect(window.parent.postMessage).toHaveBeenCalled(); + expect(window.parent.postMessage).toHaveBeenCalledTimes(5); + expect(window.parent.postMessage).toHaveBeenCalledWith({event: "download-removed"}, "*"); + expect(window.parent.postMessage).toHaveBeenCalledWith({event: "download-complete"}, "*"); + window.parent.postMessage = originalPostMessage; + }); + + it("should automatically check if bound is within permitted area", async function() { + initViewModel(); + viewModel.bounds(L.latLngBounds(L.latLng(-33, 150), L.latLng(-34, 151))); + expect(viewModel.isBoundsWithinMaxArea()).toBe(false); + expect(Number.parseInt(viewModel.areaInKmOfBounds().toString())).toBe(8615); + viewModel.bounds(L.latLngBounds(L.latLng(-35.301817150253676, 149.12043571472168), L.latLng(-35.336693572690436, 149.08198356628418))); + expect(viewModel.isBoundsWithinMaxArea()).toBe(true); + expect(Number.parseInt(viewModel.areaInKmOfBounds().toString())).toBe(12); + }); + + it("should download tiles when the download button is clicked", async function() { + initViewModel(); + viewModel.bounds(L.latLngBounds(L.latLng(-35.301817150253676, 149.12043571472168), L.latLng(-35.336693572690436, 149.08198356628418))); + viewModel.name("Canberra"); + var originalDownloadMapTiles = downloadMapTiles; + spyOn(window, "downloadMapTiles").and.callFake(function() { + return Promise.resolve(); + }); + + viewModel.clickDownload(); + + return new Promise(function(resolve, reject) { + setTimeout(function() { + expect(entities.saveMap).toHaveBeenCalledTimes(1); + expect(entities.getMaps).toHaveBeenCalledTimes(1); + expect(viewModel.downloading()).toBe(false); + + window.downloadMapTiles = originalDownloadMapTiles; + resolve(); + }, 1000); + }); + }); + + it("should sequentially call appropriate function as stage changes", async function() { + initViewModel({doNotInit: false}); + viewModel.offlineMaps([]) + spyOn(viewModel, "numberOfFormsDownloaded").and.callThrough(); + spyOn(viewModel, "totalFormDownload").and.callThrough(); + var originalDownloadMapTiles = downloadMapTiles; + spyOn(window, "downloadMapTiles").and.callFake(function() { + return Promise.resolve(); + }); + + return new Promise(function(resolve, reject) { + setTimeout(function() { + expect(entities.getProjectActivityMetadata).toHaveBeenCalledTimes(1); + expect(entities.getProjectActivityMetadata).toHaveBeenCalledWith("abc123", undefined); + expect(entities.saveSites).toHaveBeenCalledWith([site]); + expect(entities.saveSites).toHaveBeenCalledTimes(1); + expect(viewModel.numberOfFormsDownloaded).toHaveBeenCalled(); + expect(viewModel.totalFormDownload).toHaveBeenCalled(); + expect(entities.getSpeciesForProjectActivity).toHaveBeenCalledTimes(1); + expect(entities.getMaps).toHaveBeenCalledTimes(1); + expect(viewModel.currentStage()).toBe(viewModel.stages.sites); + clearInterval(intervalId); + window.downloadMapTiles = originalDownloadMapTiles; + resolve(); + }, 10000); + }); + }, 1000000000); + + function initViewModel (config) { + config = Object.assign({}, { + mapId: "map1", + baseMapUrl: "https://abc.com/{Z}/{y}/{x}.png", + projectActivityId: 'abc123', + totalUrl: "/totalUrl", + downloadSpeciesUrl: "/downloadSpeciesUrl", + doNotInit: true, + baseMapOptions: { + maxZoom: 20, + attribution: "abc" + } + }, config); + + viewModel = new OfflineViewModel(config); + return viewModel; + } + }); +}); \ No newline at end of file diff --git a/wdio.local.conf.js b/wdio.local.conf.js new file mode 100644 index 000000000..b0a3be83a --- /dev/null +++ b/wdio.local.conf.js @@ -0,0 +1,50 @@ +const path = require('node:path'); +const sharedConfig = require('./wdio.shared.conf.js').config; + +const config = { + ...sharedConfig, + ...{ + // specs: [ + // './src/test/js/integration/specs/pwa/InstallationSpec.js' + // ], + maxInstances: 1, + // services: ['devtools'], + capabilities: [{ + browserName: 'chrome', + 'goog:chromeOptions': { + // args: ['--auto-open-devtools-for-tabs','disable-gpu'] + args: ['headless', 'disable-gpu', '--window-size=1280,1024'] + // args: ['disable-gpu', '--window-size=1280,1024'] + }, + 'wdio:chromedriverOptions': { + binary: "./node_modules/chromedriver/lib/chromedriver/chromedriver" + } + }], + testConfig: { + baseUrl: 'http://localhost:8087', + serverUrl: 'http://localhost:8087', + wireMockBaseUrl: 'http://localhost:8018', + pwaUrl: 'http://localhost:5173/mobile-app', + proxyUrl: 'http://localhost:8081', + proxyPort: 8081, + dirName: __dirname, + resourceDir: path.resolve(__dirname, 'src', 'integration-test', 'resources'), + datasetLoadScript: path.resolve(__dirname, 'src', 'main', 'scripts', 'loadFunctionalTestData.sh'), + databaseName: "ecodata-functional-test", + databaseUserName: undefined, + databasePassword: undefined, + oidc: { + clientId: 'oidcId', + secret: 'oidcSecret', + scope: "openid profile email roles user_defined ala" + }, + webservice: { + "client-id": "jwtId", + "client-secret": "jwtSecret", + "jwt-scopes": "ala/internal users/read ala/attrs ecodata/read_test ecodata/write_test" + } + } + } +} + +module.exports = { config }; \ No newline at end of file diff --git a/wdio.shared.conf.js b/wdio.shared.conf.js new file mode 100644 index 000000000..eb381d2c6 --- /dev/null +++ b/wdio.shared.conf.js @@ -0,0 +1,262 @@ +const url= require('node:url') +const path = require('node:path') + +// const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) + +const config = { + // + // ==================== + // Runner Configuration + // ==================== + // + // WebdriverIO allows it to run your tests in arbitrary locations (e.g. locally or + // on a remote machine). + runner: 'local', + // + // ================== + // Specify Test Files + // ================== + // Define which test specs should run. The pattern is relative to the directory + // from which `wdio` was called. Notice that, if you are calling `wdio` from an + // NPM script (see https://docs.npmjs.com/cli/run-script) then the current working + // directory is where your package.json resides, so `wdio` will be called from there. + // + specs: [ + './src/test/js/integration/specs/**/*.js' + ], + // Patterns to exclude. + exclude: [ + // 'path/to/excluded/files' + ], + // + // ============ + // Capabilities + // ============ + // Define your capabilities here. WebdriverIO can run multiple capabilities at the same + // time. Depending on the number of capabilities, WebdriverIO launches several test + // sessions. Within your capabilities you can overwrite the spec and exclude options in + // order to group specific specs to a specific capability. + // + // First, you can define how many instances should be started at the same time. Let's + // say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have + // set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec + // files and you set maxInstances to 10, all spec files will get tested at the same time + // and 30 processes will get spawned. The property handles how many capabilities + // from the same test should run tests. + // + maxInstances: 10, + // + // =================== + // Test Configurations + // =================== + // Define all options that are relevant for the WebdriverIO instance here + // + // Level of logging verbosity: trace | debug | info | warn | error | silent + logLevel: 'trace', + outputDir: path.resolve(__dirname, 'logs'), + // + // Set specific log levels per logger + // loggers: + // - webdriver, webdriverio + // - @wdio/applitools-service, @wdio/browserstack-service, @wdio/devtools-service, @wdio/sauce-service + // - @wdio/mocha-framework, @wdio/jasmine-framework + // - @wdio/local-runner, @wdio/lambda-runner + // - @wdio/sumologic-reporter + // - @wdio/cli, @wdio/config, @wdio/sync, @wdio/utils + // Level of logging verbosity: trace | debug | info | warn | error | silent + logLevels: { + webdriver: 'trace', + '@wdio/devtools-service': 'trace', + '@wdio/jasmine-framework': 'trace', + '@wdio/local-runner': 'trace' + }, + // + // If you only want to run your tests until a specific amount of tests have failed use + // bail (default is 0 - don't bail, run all tests). + bail: 0, + // + // Set a base URL in order to shorten url command calls. If your `url` parameter starts + // with `/`, the base url gets prepended, not including the path portion of your baseUrl. + // If your `url` parameter starts without a scheme or `/` (like `some/path`), the base url + // gets prepended directly. + baseUrl: 'http://the-internet.herokuapp.com', + // + // Default timeout for all waitFor* commands. + waitforTimeout: 10000, + implicit: 10000, + // + // Default timeout in milliseconds for request + // if browser driver or grid doesn't send response + connectionRetryTimeout: 90000, + // + // Default request retries count + connectionRetryCount: 3, + // + // Framework you want to run your specs with. + // The following are supported: Mocha, Jasmine, and Cucumber + // see also: https://webdriver.io/docs/frameworks.html + // + // Make sure you have the wdio adapter package for the specific framework installed + // before running any tests. + framework: 'jasmine', + // + // The number of times to retry the entire specfile when it fails as a whole + // specFileRetries: 1, + // + // Whether or not retried specfiles should be retried immediately or deferred to the end of the queue + // specFileRetriesDeferred: false, + // + // Test reporter for stdout. + // The only one supported by default is 'dot' + // see also: https://webdriver.io/docs/dot-reporter.html + reporters: ['spec', ['video', { + saveAllVideos: true, // If true, also saves videos for successful test cases + videoSlowdownMultiplier: 10, // Higher to get slower videos, lower for faster videos [Value 1-100] + }]], + // + // Options to be passed to Jasmine. + jasmineOpts: { + // Jasmine default timeout + defaultTimeoutInterval: 240000, + wait: 8000, + interval: 1000 + // + // The Jasmine framework allows interception of each assertion in order to log the state of the application + // or website depending on the result. For example, it is pretty handy to take a screenshot every time + // an assertion fails. + // expectationResultHandler: function(passed, assertion) { + // do something + // } + } + // + // ===== + // Hooks + // ===== + // WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance + // it and to build services around it. You can either apply a single function or an array of + // methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got + // resolved to continue. + /** + * Gets executed once before all workers get launched. + * @param {Object} config wdio configuration object + * @param {Array.} capabilities list of capabilities details + */ + // onPrepare: function (config, capabilities) { + // }, + /** + * Gets executed before a worker process is spawned and can be used to initialise specific service + * for that worker as well as modify runtime environments in an async fashion. + * @param {String} cid capability id (e.g 0-0) + * @param {[type]} caps object containing capabilities for session that will be spawn in the worker + * @param {[type]} specs specs to be run in the worker process + * @param {[type]} args object that will be merged with the main configuration once worker is initialised + * @param {[type]} execArgv list of string arguments passed to the worker process + */ + // onWorkerStart: function (cid, caps, specs, args, execArgv) { + // }, + /** + * Gets executed just before initialising the webdriver session and test framework. It allows you + * to manipulate configurations depending on the capability or spec. + * @param {Object} config wdio configuration object + * @param {Array.} capabilities list of capabilities details + * @param {Array.} specs List of spec file paths that are to be run + */ + // beforeSession: function (config, capabilities, specs) { + // }, + /** + * Gets executed before test execution begins. At this point you can access to all global + * variables like `browser`. It is the perfect place to define custom commands. + * @param {Array.} capabilities list of capabilities details + * @param {Array.} specs List of spec file paths that are to be run + */ + // before: function (capabilities, specs) { + // }, + /** + * Runs before a WebdriverIO command gets executed. + * @param {String} commandName hook command name + * @param {Array} args arguments that command would receive + */ + // beforeCommand: function (commandName, args) { + // }, + /** + * Hook that gets executed before the suite starts + * @param {Object} suite suite details + */ + // beforeSuite: function (suite) { + // }, + /** + * Function to be executed before a test (in Mocha/Jasmine) starts. + */ + // beforeTest: function (test, context) { + // }, + /** + * Hook that gets executed _before_ a hook within the suite starts (e.g. runs before calling + * beforeEach in Mocha) + */ + // beforeHook: function (test, context) { + // }, + /** + * Hook that gets executed _after_ a hook within the suite starts (e.g. runs after calling + * afterEach in Mocha) + */ + // afterHook: function (test, context, { error, result, duration, passed, retries }) { + // }, + /** + * Function to be executed after a test (in Mocha/Jasmine). + */ + // afterTest: function(test, context, { error, result, duration, passed, retries }) { + // }, + + + /** + * Hook that gets executed after the suite has ended + * @param {Object} suite suite details + */ + // afterSuite: function (suite) { + // }, + /** + * Runs after a WebdriverIO command gets executed + * @param {String} commandName hook command name + * @param {Array} args arguments that command would receive + * @param {Number} result 0 - command success, 1 - command error + * @param {Object} error error object if any + */ + // afterCommand: function (commandName, args, result, error) { + // }, + /** + * Gets executed after all tests are done. You still have access to all global variables from + * the test. + * @param {Number} result 0 - test pass, 1 - test fail + * @param {Array.} capabilities list of capabilities details + * @param {Array.} specs List of spec file paths that ran + */ + // after: function (result, capabilities, specs) { + // }, + /** + * Gets executed right after terminating the webdriver session. + * @param {Object} config wdio configuration object + * @param {Array.} capabilities list of capabilities details + * @param {Array.} specs List of spec file paths that ran + */ + // afterSession: function (config, capabilities, specs) { + // }, + /** + * Gets executed after all workers got shut down and the process is about to exit. An error + * thrown in the onComplete hook will result in the test run failing. + * @param {Object} exitCode 0 - success, 1 - fail + * @param {Object} config wdio configuration object + * @param {Array.} capabilities list of capabilities details + * @param {} results object containing test results + */ + // onComplete: function(exitCode, config, capabilities, results) { + // }, + /** + * Gets executed when a refresh happens. + * @param {String} oldSessionId session ID of the old session + * @param {String} newSessionId session ID of the new session + */ + //onReload: function(oldSessionId, newSessionId) { + //} +} + +module.exports = { config }; \ No newline at end of file