Add EveUnity scene UPM artifact smoke
This commit is contained in:
parent
bdafa0295a
commit
b20e534c9c
13 changed files with 101 additions and 12 deletions
|
|
@ -652,10 +652,12 @@ Recently cut:
|
|||
Unity UI Toolkit. The `unity-scene` runtime capability manifest names
|
||||
`gamecult.eve.runtime_release_request.v1`, the shared
|
||||
`tools/eveunity/eveunity-release-contract.mjs` request builder,
|
||||
`tools/eveunity/eveunity-release-artifact.mjs` artifact builder,
|
||||
`runtimes/incubating/eve-unity-scene/package.json` as the version source, and
|
||||
the `eveunity-scene-v{version}` tag/artifact pattern.
|
||||
`scripts/run-eveunity-scene-release-contract-smoke.ps1` proves the request
|
||||
without pretending the tagged UPM package has been published.
|
||||
`scripts/run-eveunity-scene-release-artifact-smoke.ps1` now produces the
|
||||
declared Unity scene UPM `.tgz` as local smoke evidence without pretending the
|
||||
tagged UPM package has been published from EveUnity.
|
||||
- EveTui capture lifecycle now carries a structured terminal cell-grid capture
|
||||
contract and typed artifact. `captureContract` names the TUI runtime,
|
||||
`terminal-cell-grid` capture kind, `json-grid` artifact kind, conformance
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@
|
|||
"lifecycle": {
|
||||
"release": {
|
||||
"ownerRepo": "EveUnity",
|
||||
"status": "pending-unity-scene-package",
|
||||
"status": "unity-scene-upm-artifact-smoke",
|
||||
"releaseContract": {
|
||||
"ownerRepo": "EveUnity",
|
||||
"packageName": "org.gamecult.eve.unity-scene",
|
||||
|
|
@ -87,6 +87,7 @@
|
|||
"artifactKind": "upm-package",
|
||||
"requestSchema": "gamecult.eve.runtime_release_request.v1",
|
||||
"requestBuilder": "tools/eveunity/eveunity-release-contract.mjs",
|
||||
"artifactBuilder": "tools/eveunity/eveunity-release-artifact.mjs",
|
||||
"artifactPattern": "artifacts/eveunity-scene-release/{version}/org.gamecult.eve.unity-scene-{version}.tgz",
|
||||
"publishProof": "Tagged Unity scene package release is created from the EveUnity repo and references the provider-agnostic scene package root.",
|
||||
"requiredPackageDependencies": [
|
||||
|
|
@ -109,8 +110,11 @@
|
|||
"runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json",
|
||||
"scripts/run-eveunity-scene-split-handoff-smoke.ps1",
|
||||
"scripts/run-eveunity-scene-release-contract-smoke.ps1",
|
||||
"scripts/run-eveunity-scene-release-artifact-smoke.ps1",
|
||||
"tools/eveunity/eveunity-release-contract.mjs",
|
||||
"tools/eveunity/eveunity-release-contract.test.mjs"
|
||||
"tools/eveunity/eveunity-release-contract.test.mjs",
|
||||
"tools/eveunity/eveunity-release-artifact.mjs",
|
||||
"tools/eveunity/eveunity-release-artifact.test.mjs"
|
||||
],
|
||||
"pendingProofs": [
|
||||
"Unity scene package release is cut from EveUnity rather than Eve incubation."
|
||||
|
|
|
|||
|
|
@ -25,6 +25,24 @@
|
|||
"destinationOwner": "EveUnity",
|
||||
"replacementProof": "EveUnity hosts a provider-agnostic Unity scene lowerer that consumes provider advertisements and world surfaces without importing Aetheria runtime internals."
|
||||
},
|
||||
{
|
||||
"id": "unity-scene-upm-package",
|
||||
"stage": "release",
|
||||
"currentPaths": [
|
||||
"runtimes/incubating/eve-unity-scene/package.json",
|
||||
"runtimes/incubating/eve-unity-scene/Runtime/GameCult.Eve.UnityScene.asmdef",
|
||||
"runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs",
|
||||
"runtimes/incubating/eve-unity-scene/Tests/Editor/GameCult.Eve.UnityScene.Tests.asmdef",
|
||||
"tools/eveunity/eveunity-release-contract.mjs",
|
||||
"tools/eveunity/eveunity-release-contract.test.mjs",
|
||||
"tools/eveunity/eveunity-release-artifact.mjs",
|
||||
"tools/eveunity/eveunity-release-artifact.test.mjs",
|
||||
"scripts/run-eveunity-scene-release-contract-smoke.ps1",
|
||||
"scripts/run-eveunity-scene-release-artifact-smoke.ps1"
|
||||
],
|
||||
"destinationOwner": "EveUnity",
|
||||
"replacementProof": "EveUnity builds the provider-agnostic Unity scene UPM package artifact now; the split is not complete until the tagged Unity scene release is cut from EveUnity."
|
||||
},
|
||||
{
|
||||
"id": "unity-scene-world-surface-lowering",
|
||||
"stage": "world-surface-lowering",
|
||||
|
|
@ -120,6 +138,7 @@
|
|||
],
|
||||
"requiredExternalProofs": [
|
||||
"EveUnity publishes a Unity scene runtime capability manifest.",
|
||||
"EveUnity builds the provider-agnostic Unity scene UPM package artifact.",
|
||||
"EveUnity owns a provider-agnostic scene graph lowerer that consumes advertised worldInteraction boundaries without importing Aetheria internals.",
|
||||
"EveUnity owns the provider-agnostic scene graph lowerer outside Eve incubation.",
|
||||
"EveUnity owns the Unity scene Sai projection adapter outside Eve incubation without importing Sai story state or VN/Ink internals.",
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
param(
|
||||
[string] $CapabilityManifestPath = "packages\org.gamecult.eve.unity-uitoolkit\eve-runtime-capability.json",
|
||||
[string] $RequestOutputPath = "artifacts\eveunity-uitoolkit-release-contract\latest\release-request.json",
|
||||
[string] $ProofOutputPath = "artifacts\eveunity-uitoolkit-release\latest\release-artifact.json"
|
||||
[string] $ProofOutputPath = "artifacts\eveunity-uitoolkit-release\latest\release-artifact.json",
|
||||
[string] $ReleaseContractSmokePath = "scripts\run-eveunity-release-contract-smoke.ps1"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
|
@ -45,13 +46,21 @@ $artifactBuilderPath = Join-Path $projectRoot $releaseContract.artifactBuilder
|
|||
if (-not (Test-Path -LiteralPath $artifactBuilderPath)) {
|
||||
throw "EveUnity release artifact builder not found: $($releaseContract.artifactBuilder)"
|
||||
}
|
||||
$releaseContractSmoke = if ([System.IO.Path]::IsPathRooted($ReleaseContractSmokePath)) {
|
||||
$ReleaseContractSmokePath
|
||||
} else {
|
||||
Join-Path $projectRoot $ReleaseContractSmokePath
|
||||
}
|
||||
if (-not (Test-Path -LiteralPath $releaseContractSmoke)) {
|
||||
throw "EveUnity release contract smoke not found: $ReleaseContractSmokePath"
|
||||
}
|
||||
|
||||
node --test (Join-Path $projectRoot "tools\eveunity\eveunity-release-artifact.test.mjs")
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "EveUnity release artifact tests failed with exit code $LASTEXITCODE"
|
||||
}
|
||||
|
||||
& (Join-Path $projectRoot "scripts\run-eveunity-release-contract-smoke.ps1") `
|
||||
& $releaseContractSmoke `
|
||||
-CapabilityManifestPath $CapabilityManifestPath `
|
||||
-OutputPath $RequestOutputPath
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ foreach ($stage in @("release", "test", "capture")) {
|
|||
}
|
||||
|
||||
$releaseContract = $manifest.lifecycle.release.releaseContract
|
||||
foreach ($field in @("ownerRepo", "packageName", "packageRoot", "versionSource", "tagPattern", "artifactKind", "requestSchema", "requestBuilder", "artifactPattern", "publishProof")) {
|
||||
foreach ($field in @("ownerRepo", "packageName", "packageRoot", "versionSource", "tagPattern", "artifactKind", "requestSchema", "requestBuilder", "artifactBuilder", "artifactPattern", "publishProof")) {
|
||||
if (-not $releaseContract.$field) {
|
||||
throw "EveUnity scene release contract missing $field"
|
||||
}
|
||||
|
|
@ -157,7 +157,7 @@ foreach ($pathProperty in @("packageRoot", "versionSource")) {
|
|||
throw "EveUnity scene release contract $pathProperty does not exist: $relativePath"
|
||||
}
|
||||
}
|
||||
foreach ($pathProperty in @("requestBuilder")) {
|
||||
foreach ($pathProperty in @("requestBuilder", "artifactBuilder")) {
|
||||
$relativePath = $releaseContract.$pathProperty
|
||||
$absolutePath = Join-Path $projectRoot $relativePath
|
||||
if (-not (Test-Path -LiteralPath $absolutePath)) {
|
||||
|
|
@ -223,6 +223,7 @@ foreach ($pathProperty in @("requestBuilder", "advertisementPath")) {
|
|||
& (Join-Path $projectRoot "scripts\run-eveunity-scene-split-handoff-smoke.ps1")
|
||||
& (Join-Path $projectRoot "scripts\run-eveunity-scene-provider-shell-smoke.ps1")
|
||||
& (Join-Path $projectRoot "scripts\run-eveunity-scene-release-contract-smoke.ps1")
|
||||
& (Join-Path $projectRoot "scripts\run-eveunity-scene-release-artifact-smoke.ps1")
|
||||
& (Join-Path $projectRoot "scripts\run-eveunity-scene-capture-contract-smoke.ps1")
|
||||
& (Join-Path $projectRoot "scripts\run-eveunity-scene-capture-smoke.ps1")
|
||||
|
||||
|
|
|
|||
18
scripts/run-eveunity-scene-release-artifact-smoke.ps1
Normal file
18
scripts/run-eveunity-scene-release-artifact-smoke.ps1
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
param(
|
||||
[string] $CapabilityManifestPath = "runtimes\incubating\eve-unity-scene\eve-runtime-capability.json",
|
||||
[string] $RequestOutputPath = "artifacts\eveunity-scene-release-contract\latest\release-request.json",
|
||||
[string] $ProofOutputPath = "artifacts\eveunity-scene-release\latest\release-artifact.json"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
$projectRoot = Split-Path -Parent $PSScriptRoot
|
||||
& (Join-Path $projectRoot "scripts\run-eveunity-release-artifact-smoke.ps1") `
|
||||
-CapabilityManifestPath $CapabilityManifestPath `
|
||||
-RequestOutputPath $RequestOutputPath `
|
||||
-ProofOutputPath $ProofOutputPath `
|
||||
-ReleaseContractSmokePath "scripts\run-eveunity-scene-release-contract-smoke.ps1"
|
||||
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "EveUnity scene release artifact smoke failed with exit code $LASTEXITCODE"
|
||||
}
|
||||
|
|
@ -26,7 +26,7 @@ $releaseContract = $manifest.lifecycle.release.releaseContract
|
|||
if ($null -eq $releaseContract) {
|
||||
throw "EveUnity scene release contract missing lifecycle.release.releaseContract"
|
||||
}
|
||||
foreach ($field in @("ownerRepo", "packageName", "packageRoot", "versionSource", "tagPattern", "artifactKind", "requestSchema", "requestBuilder", "artifactPattern", "publishProof")) {
|
||||
foreach ($field in @("ownerRepo", "packageName", "packageRoot", "versionSource", "tagPattern", "artifactKind", "requestSchema", "requestBuilder", "artifactBuilder", "artifactPattern", "publishProof")) {
|
||||
if (-not $releaseContract.$field) {
|
||||
throw "EveUnity scene release contract missing $field"
|
||||
}
|
||||
|
|
@ -45,9 +45,10 @@ if ($releaseContract.artifactKind -ne "upm-package") {
|
|||
}
|
||||
|
||||
$builderPath = Join-Path $projectRoot $releaseContract.requestBuilder
|
||||
$artifactBuilderPath = Join-Path $projectRoot $releaseContract.artifactBuilder
|
||||
$packagePath = Join-Path $projectRoot $releaseContract.versionSource
|
||||
$packageRoot = Join-Path $projectRoot $releaseContract.packageRoot
|
||||
foreach ($path in @($builderPath, $packagePath, $packageRoot)) {
|
||||
foreach ($path in @($builderPath, $artifactBuilderPath, $packagePath, $packageRoot)) {
|
||||
if (-not (Test-Path -LiteralPath $path)) {
|
||||
throw "EveUnity scene release contract path not found: $path"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ if (-not (Test-Path -LiteralPath $sourcePackageRoot)) {
|
|||
$moveSets = @($handoff.moveSets)
|
||||
$expectedMoveSets = @{
|
||||
"unity-scene-runtime-body" = "runtime-body"
|
||||
"unity-scene-upm-package" = "release"
|
||||
"unity-scene-world-surface-lowering" = "world-surface-lowering"
|
||||
"unity-scene-sai-plugin-projection" = "plugin-projection"
|
||||
"unity-scene-norn-plugin-projection" = "plugin-projection"
|
||||
|
|
@ -68,7 +69,7 @@ foreach ($id in $expectedMoveSets.Keys) {
|
|||
}
|
||||
$currentPaths = if ($null -eq $moveSet.currentPaths) { @() } else { @($moveSet.currentPaths) }
|
||||
$observedProviderPaths = if ($null -eq $moveSet.observedProviderPaths) { @() } else { @($moveSet.observedProviderPaths) }
|
||||
if ($id -in @("unity-scene-runtime-body", "unity-scene-world-surface-lowering", "unity-scene-sai-plugin-projection", "unity-scene-norn-plugin-projection", "unity-scene-tex-plugin-projection", "unity-scene-command-transport", "unity-scene-capture-lifecycle")) {
|
||||
if ($id -in @("unity-scene-runtime-body", "unity-scene-upm-package", "unity-scene-world-surface-lowering", "unity-scene-sai-plugin-projection", "unity-scene-norn-plugin-projection", "unity-scene-tex-plugin-projection", "unity-scene-command-transport", "unity-scene-capture-lifecycle")) {
|
||||
if ($currentPaths.Count -eq 0) {
|
||||
throw "EveUnity scene split handoff move set $id must name current Eve incubation paths"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@ try {
|
|||
& (Join-Path $PSScriptRoot "run-eveunity-split-handoff-smoke.ps1")
|
||||
& (Join-Path $PSScriptRoot "run-eveunity-release-artifact-smoke.ps1")
|
||||
& (Join-Path $PSScriptRoot "run-eveunity-scene-split-handoff-smoke.ps1")
|
||||
& (Join-Path $PSScriptRoot "run-eveunity-scene-release-artifact-smoke.ps1")
|
||||
& (Join-Path $PSScriptRoot "run-eveunity-scene-lifecycle-smoke.ps1")
|
||||
& (Join-Path $PSScriptRoot "run-eveelectron-split-handoff-smoke.ps1")
|
||||
& (Join-Path $PSScriptRoot "run-eveelectron-lifecycle-smoke.ps1")
|
||||
|
|
|
|||
|
|
@ -218,7 +218,7 @@ node $consumerScript $consumerExport `
|
|||
--expect-runtime-lifecycle-field "unity-uitoolkit:capture:captureContract.additionalProviderSurfaces.0.surfaceId:eve.world-smoke.surface" `
|
||||
--expect-runtime-lifecycle-field "unity-uitoolkit:capture:captureContract.additionalProviderSurfaces.1.providerId:aetheria" `
|
||||
--expect-runtime-lifecycle-field "unity-uitoolkit:capture:captureContract.additionalProviderSurfaces.1.surfaceId:aetheria.daemon.editor" `
|
||||
--expect-runtime-lifecycle-status unity-scene:release:pending-unity-scene-package `
|
||||
--expect-runtime-lifecycle-status unity-scene:release:unity-scene-upm-artifact-smoke `
|
||||
--expect-runtime-lifecycle-status unity-scene:test:provider-shell-contract-skeleton `
|
||||
--expect-runtime-lifecycle-status unity-scene:capture:pending-unity-scene-capture `
|
||||
--expect-runtime-lifecycle-pending "unity-scene:release:Unity scene package release" `
|
||||
|
|
@ -230,6 +230,7 @@ node $consumerScript $consumerExport `
|
|||
--expect-runtime-lifecycle-field "unity-scene:release:releaseContract.versionSource:runtimes/incubating/eve-unity-scene/package.json" `
|
||||
--expect-runtime-lifecycle-field "unity-scene:release:releaseContract.requestSchema:gamecult.eve.runtime_release_request.v1" `
|
||||
--expect-runtime-lifecycle-field "unity-scene:release:releaseContract.requestBuilder:tools/eveunity/eveunity-release-contract.mjs" `
|
||||
--expect-runtime-lifecycle-field "unity-scene:release:releaseContract.artifactBuilder:tools/eveunity/eveunity-release-artifact.mjs" `
|
||||
--expect-runtime-lifecycle-field "unity-scene:release:releaseContract.artifactPattern:artifacts/eveunity-scene-release/{version}/org.gamecult.eve.unity-scene-{version}.tgz" `
|
||||
--expect-runtime-lifecycle-field "unity-scene:release:releaseContract.requiredPackageDependencies.0.packageName:org.gamecult.eve.surface" `
|
||||
--expect-runtime-lifecycle-field "unity-scene:release:releaseContract.requiredPackageDependencies.0.ownerRepo:Eve" `
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ try {
|
|||
--expect-split-target-blocker-record EveUnity:runtime-status:unity-scene `
|
||||
--expect-split-target-blocker-record "EveUnity:pending-proof:Unity scene runtime body graduates to EveUnity outside Aetheria product code." `
|
||||
--expect-split-handoff-move EveUnity:unity-scene:unity-scene-runtime-body:current:exists:EveUnitySceneSurfaceLowerer.cs `
|
||||
--expect-split-handoff-move EveUnity:unity-scene:unity-scene-upm-package:current:exists:eveunity-release-artifact.mjs `
|
||||
--expect-split-handoff-move EveUnity:unity-scene:unity-scene-world-surface-lowering:current:exists:EveUnitySceneSurfaceLowerer.cs `
|
||||
--expect-split-handoff-move EveUnity:unity-scene:unity-scene-sai-plugin-projection:current:exists:SaiVisualNovelUnitySceneProjectionAdapter.cs `
|
||||
--expect-split-handoff-move EveUnity:unity-scene:unity-scene-norn-plugin-projection:current:exists:NornGraphUnitySceneProjectionAdapter.cs `
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ import { buildUnityReleaseArtifactPlan } from "./eveunity-release-artifact.mjs";
|
|||
|
||||
const capabilityManifest = JSON.parse(readFileSync(new URL("../../packages/org.gamecult.eve.unity-uitoolkit/eve-runtime-capability.json", import.meta.url), "utf8"));
|
||||
const packageManifest = JSON.parse(readFileSync(new URL("../../packages/org.gamecult.eve.unity-uitoolkit/package.json", import.meta.url), "utf8"));
|
||||
const sceneCapabilityManifest = JSON.parse(readFileSync(new URL("../../runtimes/incubating/eve-unity-scene/eve-runtime-capability.json", import.meta.url), "utf8"));
|
||||
const scenePackageManifest = JSON.parse(readFileSync(new URL("../../runtimes/incubating/eve-unity-scene/package.json", import.meta.url), "utf8"));
|
||||
|
||||
test("plans npm pack for the EveUnity UI Toolkit UPM artifact", () => {
|
||||
const request = buildUnityReleaseRequest({
|
||||
|
|
@ -28,6 +30,27 @@ test("plans npm pack for the EveUnity UI Toolkit UPM artifact", () => {
|
|||
]);
|
||||
});
|
||||
|
||||
test("plans npm pack for the EveUnity scene UPM artifact", () => {
|
||||
const request = buildUnityReleaseRequest({
|
||||
capabilityManifest: sceneCapabilityManifest,
|
||||
packageManifest: scenePackageManifest,
|
||||
capabilityManifestPath: "runtimes/incubating/eve-unity-scene/eve-runtime-capability.json",
|
||||
packageManifestPath: "runtimes/incubating/eve-unity-scene/package.json",
|
||||
});
|
||||
const plan = buildUnityReleaseArtifactPlan({ request, packageManifest: scenePackageManifest });
|
||||
|
||||
assert.equal(plan.packageRoot, "runtimes/incubating/eve-unity-scene");
|
||||
assert.equal(plan.artifactPath, "artifacts/eveunity-scene-release/0.1.0/org.gamecult.eve.unity-scene-0.1.0.tgz");
|
||||
assert.equal(plan.artifactDirectory, "artifacts/eveunity-scene-release/0.1.0");
|
||||
assert.equal(plan.expectedFileName, "org.gamecult.eve.unity-scene-0.1.0.tgz");
|
||||
assert.deepEqual(plan.npmPackArguments, [
|
||||
"pack",
|
||||
"runtimes/incubating/eve-unity-scene",
|
||||
"--pack-destination",
|
||||
"artifacts/eveunity-scene-release/0.1.0",
|
||||
]);
|
||||
});
|
||||
|
||||
test("rejects release artifact plans for mismatched package identity", () => {
|
||||
const request = buildUnityReleaseRequest({ capabilityManifest, packageManifest });
|
||||
|
||||
|
|
|
|||
|
|
@ -654,6 +654,7 @@
|
|||
"evidencePaths": [
|
||||
"runtimes/incubating/eve-unity-scene/eve-runtime-capability.json",
|
||||
"scripts/run-eveunity-scene-lifecycle-smoke.ps1",
|
||||
"scripts/run-eveunity-scene-release-artifact-smoke.ps1",
|
||||
"scripts/run-eveunity-scene-provider-shell-smoke.ps1"
|
||||
]
|
||||
},
|
||||
|
|
@ -1089,11 +1090,14 @@
|
|||
"runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json",
|
||||
"scripts/run-eveunity-scene-lifecycle-smoke.ps1",
|
||||
"scripts/run-eveunity-scene-release-contract-smoke.ps1",
|
||||
"scripts/run-eveunity-scene-release-artifact-smoke.ps1",
|
||||
"scripts/run-eveunity-scene-provider-shell-smoke.ps1",
|
||||
"scripts/run-eveunity-scene-capture-contract-smoke.ps1",
|
||||
"scripts/run-eveunity-scene-capture-smoke.ps1",
|
||||
"tools/eveunity/eveunity-release-contract.mjs",
|
||||
"tools/eveunity/eveunity-release-contract.test.mjs",
|
||||
"tools/eveunity/eveunity-release-artifact.mjs",
|
||||
"tools/eveunity/eveunity-release-artifact.test.mjs",
|
||||
"tools/eveunity/eveunity-capture-contract.mjs",
|
||||
"tools/eveunity/eveunity-capture-contract.test.mjs",
|
||||
"tools/eveunity/eveunity-scene-capture-artifact.mjs",
|
||||
|
|
@ -1135,6 +1139,10 @@
|
|||
{
|
||||
"path": "tools/eveunity/eveunity-release-contract.test.mjs",
|
||||
"contains": ["builds EveUnity scene UPM release request from package manifest", "eveunity-scene-v0.1.0", "artifacts/eveunity-scene-release/0.1.0/org.gamecult.eve.unity-scene-0.1.0.tgz"]
|
||||
},
|
||||
{
|
||||
"path": "tools/eveunity/eveunity-release-artifact.test.mjs",
|
||||
"contains": ["plans npm pack for the EveUnity scene UPM artifact", "runtimes/incubating/eve-unity-scene", "org.gamecult.eve.unity-scene-0.1.0.tgz"]
|
||||
}
|
||||
],
|
||||
"capture": {
|
||||
|
|
|
|||
Loading…
Reference in a new issue