{
  "Name": "RenderToImage",
  "_id": "605d497b-689b-4067-a86d-d3f212732484",
  "Namespace": "lib.image.render",
  "Description": "Note:\r\n- Depth stencil buffer is not avalable in the context output.\r\n- A SampleCount of 0 will use the context variable \"Sample\". Most supported sample counts are 1 (no ms), 2, 4, 8.\r\n- A size of 0 will use in the incoming size for rendering.",
  "Inputs": [
    {
      "Name": "Code",
      "MetaInstanceID": "963609dc-85f5-4acd-9f8c-4bc451180084",
      "DefaultValue": {
        "Type": "Text",
        "Value": [
          "//>>> _common parameters\r",
          "float4x4 objectToWorldMatrix;",
          "float4x4 worldToCameraMatrix;",
          "float4x4 projMatrix;",
          "Texture2D txDiffuse;",
          "float2 RenderTargetSize;",
          "//<<< _common parameters\r",
          "\r",
          "//>>> _parameters\r",
          "float2 Size;",
          "float4 Color;",
          "float SampleCount;",
          "float ClearBackground;",
          "//<<< _parameters\r",
          "Texture2DMS<float, 4> txMSDepth;\r",
          " \r",
          "//>>> _declarations\r",
          "struct VS_IN",
          "{",
          "    float4 pos : POSITION;",
          "    float2 texCoord : TEXCOORD;",
          "};",
          "",
          "struct PS_IN",
          "{",
          "    float4 pos : SV_POSITION;",
          "    float2 texCoord: TEXCOORD0;",
          "};",
          "//<<< _declarations\r",
          "\r",
          "//>>> _GS\r",
          "",
          "//<<< _GS\r",
          "\r",
          "//>>> _VS \r",
          "PS_IN VS( VS_IN input )",
          "{",
          "    PS_IN output = (PS_IN)0;",
          "",
          "    output.pos = mul(input.pos, worldToCameraMatrix);",
          "    output.pos = mul(output.pos, projMatrix);",
          "    output.texCoord = input.texCoord;",
          "",
          "    return output;",
          "}",
          "//<<< _VS\r",
          "\r",
          "//>>> PS\r",
          "float PS( PS_IN input ) : SV_Depth\r",
          "{\r",
          "    uint width, height, samples;\r",
          "    txMSDepth.GetDimensions(width, height, samples);\r",
          "    int2 pos = int2(input.texCoord.x*width, input.texCoord.y*height);\r",
          "\r",
          "    return txMSDepth.Load(pos, int2(0, 0), 0);\r",
          "\r",
          "    //float d = 0;\r",
          "    //for (int i = 0; i < 4; ++i)\r",
          "    //    d += txMSDepth.Load(pos, int2(0, 0), i);\r",
          "    //d /= i;\r",
          "    //return d;\r",
          "}\r",
          "//<<< PS\r",
          "\r",
          "//>>> _technique\r",
          "technique10 Render",
          "{",
          "    pass P0",
          "    {",
          "        SetGeometryShader( 0 );",
          "        SetVertexShader( CompileShader( vs_4_0, VS() ) );",
          "        SetPixelShader( CompileShader( ps_4_0, PS() ) );",
          "    }",
          "}",
          "//<<< _technique\r",
          ""
        ]
      },
      "MetaID": "c522a66e-3260-4692-b3e3-79fd0361fa3d",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Scene",
      "MetaInstanceID": "c81346af-6726-4c48-b3b1-d7f3af772d23",
      "DefaultValue": {
        "Type": "Scene",
        "Value": "Framefield.Core.Scene"
      },
      "MetaID": "79122951-7bc4-4c68-b085-866eab828248",
      "IsMultiInput": "False",
      "Relevance": "Required",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Size.X",
      "MetaInstanceID": "1f5e5bc9-f6de-4d5c-87b4-43cc13ece576",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "0",
      "Max": "100000",
      "Scale": "1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Size.Y",
      "MetaInstanceID": "0a0cf660-9f08-4b4a-b177-0412bda5702d",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "0",
      "Max": "100000",
      "Scale": "1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Color.R",
      "MetaInstanceID": "1cc0d86d-2d99-4463-8c97-01e2ab02cf83",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "0",
      "Max": "1",
      "Scale": "0.01",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Color.G",
      "MetaInstanceID": "1654a999-350a-41cb-9f20-d634af71041e",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "0",
      "Max": "1",
      "Scale": "0.01",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Color.B",
      "MetaInstanceID": "a75d0316-afd5-4607-ad18-4dd5cf0d86fb",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "0",
      "Max": "1",
      "Scale": "0.01",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Color.A",
      "MetaInstanceID": "d3a59492-a17b-4d56-89bf-a91109bc2da8",
      "DefaultValue": {
        "Type": "Float",
        "Value": "1"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "0",
      "Max": "1",
      "Scale": "0.01",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "ClearBackground",
      "MetaInstanceID": "a729ddaf-315f-4e2c-bda7-64b9cf421b42",
      "DefaultValue": {
        "Type": "Float",
        "Value": "1"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": [
        {
          "Name": "Leave",
          "Value": "0"
        },
        {
          "Name": "Clear",
          "Value": "1"
        }
      ]
    },
    {
      "Name": "ImageBufferID",
      "MetaInstanceID": "9fc3c13b-811d-419d-975a-2ac13f375be0",
      "DefaultValue": {
        "Type": "Text",
        "Value": "ImageBuffer1"
      },
      "MetaID": "c522a66e-3260-4692-b3e3-79fd0361fa3d",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    }
  ],
  "Outputs": [
    {
      "Name": "Image",
      "MetaInstanceID": "b003cd1c-7328-401f-b60f-2e95b6f9ddcb",
      "MetaID": "9848060d-fd84-45b0-b658-d0d531c61dab"
    }
  ],
  "OperatorParts": [
    {
      "MetaInstanceID": "abfa35fb-328c-463c-97d6-e8379c4959e1",
      "MetaID": "844f313d-e59e-4987-9bcc-dcb3185125c1",
      "Name": "RenderToImageFunc",
      "Version": "38ae00be-5575-4b90-ab9d-c9046654a4b8",
      "Type": "Float",
      "IsMultiInput": "True",
      "Script": [
        "//>>> _using",
        "using System;",
        "using System.Collections.Generic;",
        "using System.Linq;",
        "using System.Text;",
        "using SharpDX;",
        "using SharpDX.Direct3D11;",
        "using SharpDX.Windows;",
        "//<<< _using",
        "using SharpDX.DXGI;",
        "using Framefield.Core.Rendering;",
        "using SharpDX.Direct3D;",
        "",
        "namespace Framefield.Core.ID844f313d_e59e_4987_9bcc_dcb3185125c1",
        "{",
        "    public class Class_RenderToImage : FXSourceCodeFunction",
        "    {",
        "        //>>> _inputids",
        "        private enum InputId",
        "        {",
        "            Code = 0,",
        "            Scene = 1,",
        "            SizeX = 2,",
        "            SizeY = 3,",
        "            ColorR = 4,",
        "            ColorG = 5,",
        "            ColorB = 6,",
        "            ColorA = 7,",
        "            ClearBackground = 8,",
        "            ImageBufferID = 9",
        "        }",
        "        //<<< _inputids",
        "",
        "        public override void Dispose()",
        "        {",
        "            ResourceManager.Dispose(_resolvedImageResource);",
        "            ResourceManager.Dispose(_resolvedDepthResource);",
        "            Utilities.DisposeObj(ref _resolvedTargetDepthView);",
        "            ResourceManager.Dispose(_renderTargetMSResource);",
        "            Utilities.DisposeObj(ref _renderTargetMSView);",
        "            ResourceManager.Dispose(_renderDepthMSResource);",
        "            Utilities.DisposeObj(ref _renderTargetDepthMSView);",
        "            Utilities.DisposeObj(ref _renderer);",
        "            base.Dispose();",
        "        }",
        "",
        "        public override OperatorPartContext Eval(OperatorPartContext context, List<OperatorPart> inputs, int outputIdx)",
        "        {",
        "            //>>> _params",
        "            var Code = inputs[(int)InputId.Code].Eval(context).Text;",
        "            var Scene = inputs[(int)InputId.Scene];",
        "            var SizeX = inputs[(int)InputId.SizeX].Eval(context).Value;",
        "            var SizeY = inputs[(int)InputId.SizeY].Eval(context).Value;",
        "            var Size = new Vector2(SizeX, SizeY);",
        "            var ColorR = inputs[(int)InputId.ColorR].Eval(context).Value;",
        "            var ColorG = inputs[(int)InputId.ColorG].Eval(context).Value;",
        "            var ColorB = inputs[(int)InputId.ColorB].Eval(context).Value;",
        "            var ColorA = inputs[(int)InputId.ColorA].Eval(context).Value;",
        "            var Color = new Color4(ColorR, ColorG, ColorB, ColorA);",
        "            var ClearBackground = (int) inputs[(int)InputId.ClearBackground].Eval(context).Value;",
        "            var ImageBufferID = inputs[(int)InputId.ImageBufferID].Eval(context).Text;",
        "            //<<< _params",
        "",
        "            if (_firstEval)",
        "            {",
        "                for (int i = 0; i < NumCodes(); ++i)",
        "                    Compile(i);",
        "                _firstEval = false;",
        "                Changed = true;",
        "            }",
        "",
        "            if (_effect == null)",
        "                return context;",
        "",
        "            if (_renderer == null)",
        "                 _renderer = new BaseRenderer();",
        "",
        "            //if (SampleCount < 0.5f)",
        "            //{",
        "            //    float sc;",
        "            //    if (context.Variables.TryGetValue(\"Samples\", out sc))",
        "            //        SampleCount = sc;",
        "            //}",
        "            //SampleCount = Utilities.Clamp(SampleCount, 1, 8);",
        "",
        "            //currently we only support 4xms because the depth resolving is currently not flexible enough",
        "            int SampleCount = 4;",
        "",
        "            if (SizeX == 0 || SizeY == 0)",
        "            {",
        "                SizeX = context.Viewport.Width;",
        "                SizeY = context.Viewport.Height;",
        "            }",
        "",
        "            if (BuildRenderTarget((int)SizeX, (int)SizeY, (int)SampleCount, context.D3DDevice))",
        "                Changed = true;",
        "",
        "            if (Changed)",
        "            {",
        "                var subContext = new OperatorPartContext(context);",
        "                var D3DDevice = context.D3DDevice;",
        "",
        "                float aspect = (float)SizeX / (float)SizeY;",
        "                subContext.CameraProjection = Matrix.PerspectiveFovLH(3.1415f / 4.0f, aspect, 0.01f, 1000);",
        "                subContext.WorldToCamera = Matrix.LookAtLH(new Vector3(0, 0, -2.415f), new Vector3(0, 0, 0), new Vector3(0, 1, 0));",
        "                subContext.ObjectTWorld = Matrix.Identity;",
        "                subContext.TextureMatrix = Matrix.Identity;",
        "                subContext.Renderer = OperatorPartContext.DefaultRenderer;",
        "                subContext.RenderTargetView = _renderTargetMSView;",
        "                subContext.DepthStencilView = _renderTargetDepthMSView;",
        "                subContext.Objects[OperatorPartContext.MATERIAL_ID] = new DefaultMaterial();",
        "",
        "                subContext.DepthStencilState = OperatorPartContext.DefaultRenderer.DefaultDepthStencilState;",
        "                subContext.RasterizerState = OperatorPartContext.DefaultRenderer.DefaultRasterizerState;",
        "                subContext.BlendState = OperatorPartContext.DefaultRenderer.DefaultBlendState;",
        "                subContext.BlendFactor = OperatorPartContext.DefaultRenderer.DefaultBlendFactor;",
        "                subContext.Viewport = new ViewportF(0, 0, SizeX, SizeY, 0.0f, 1.0f);",
        "",
        "                subContext.InputLayout = OperatorPartContext.DefaultRenderer.SceneDefaultInputLayout;",
        "                subContext.Effect = OperatorPartContext.DefaultRenderer.SceneDefaultEffect;",
        "",
        "                D3DDevice.ImmediateContext.ClearDepthStencilView(_renderTargetDepthMSView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);",
        "                if (ClearBackground > 0.5f)",
        "                    D3DDevice.ImmediateContext.ClearRenderTargetView(_renderTargetMSView, new SharpDX.Color4(ColorR, ColorG, ColorB, ColorA));",
        "",
        "                // Set buffer for feedback effects",
        "                subContext.Objects[ImageBufferID] = _resolvedImageResource;",
        "                Scene.Eval(subContext);",
        "                subContext.Objects.Remove(ImageBufferID);",
        "",
        "                D3DDevice.ImmediateContext.ResolveSubresource(_renderTargetMSResource.Texture, 0, _resolvedImageResource.Texture, 0,",
        "                                                              _resolvedImageResource.Texture.Description.Format);",
        "",
        "",
        "                //manually resolve the multisampled depth buffer",
        "                subContext.D3DDevice.ImmediateContext.ClearDepthStencilView(_resolvedTargetDepthView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0xff);",
        "",
        "                var shaderDesc = new ShaderResourceViewDescription();",
        "                shaderDesc.Format = Format.R32_Float;",
        "                shaderDesc.Dimension = (int)SampleCount > 1 ? ShaderResourceViewDimension.Texture2DMultisampled : ShaderResourceViewDimension.Texture2D;",
        "                shaderDesc.Texture2D.MipLevels = 1;",
        "",
        "                using (var msDepthView = new ShaderResourceView(D3DDevice, _renderDepthMSResource.Texture, shaderDesc))",
        "                {",
        "                    _effect.GetVariableByName(\"txMSDepth\").AsShaderResource().SetResource(msDepthView);",
        "    ",
        "                    var context2 = new OperatorPartContext(subContext)",
        "                                         {",
        "                                             DepthStencilView = _resolvedTargetDepthView,",
        "                                             RenderTargetView = null,",
        "                                             Effect = _effect,",
        "                                             Renderer = _renderer,",
        "                                             InputLayout = subContext.Renderer.ScreenQuadInputLayout,",
        "                                             CameraProjection = Matrix.OrthoLH(1, 1, -100, 100),",
        "                                             WorldToCamera = Matrix.Identity,",
        "                                             ObjectTWorld = Matrix.Identity,",
        "                                             TextureMatrix = Matrix.Identity",
        "                                         };",
        "                    context2.Renderer.SetupEffect(context2);",
        "                    context2.Renderer.Render(context2.Renderer._screenQuadMesh, context2);",
        "                }",
        "",
        "                Changed = false;",
        "            }",
        "",
        "            context.Image = _resolvedImageResource.Texture;",
        "            context.DepthImage = _resolvedDepthResource.Texture;",
        "",
        "            return context;",
        "        }",
        "",
        "        private bool BuildRenderTarget(int width, int height, int samples, SharpDX.Direct3D11.Device device)",
        "        {",
        "            var textureDesc = ResourceManager.GetTextureDescription(BindFlags.ShaderResource, Format.R8G8B8A8_UNorm, width, height);",
        "            var resolvedImageResourceChanged = ResourceManager.ValidateResource(ref _resolvedImageResource, OperatorPart, device, textureDesc);",
        "",
        "            var depthStencilResourceChanged = ResourceManager.ValidateDepthStencilResource(ref _resolvedDepthResource, OperatorPart, device,",
        "                                                                                           width, height);",
        "            if (depthStencilResourceChanged)",
        "            {",
        "                Utilities.DisposeObj(ref _resolvedTargetDepthView);",
        "",
        "                var depthViewDesc = new DepthStencilViewDescription",
        "                                        {",
        "                                            Format = Format.D32_Float, ",
        "                                            Dimension = DepthStencilViewDimension.Texture2D",
        "                                        };",
        "",
        "                _resolvedTargetDepthView = new DepthStencilView(device, _resolvedDepthResource.Texture, depthViewDesc);",
        "            }",
        "",
        "",
        "            var textureMSDesc = ResourceManager.GetTextureDescription(BindFlags.RenderTarget | BindFlags.ShaderResource, Format.R8G8B8A8_UNorm, width, height);",
        "            textureMSDesc.SampleDescription = new SampleDescription(samples, 0);",
        "            var renderTargetMSResourceChanged = ResourceManager.ValidateResource(ref _renderTargetMSResource, OperatorPart, device, textureMSDesc);",
        "",
        "            if (renderTargetMSResourceChanged)",
        "            {",
        "                Utilities.DisposeObj(ref _renderTargetMSView);",
        "                var viewDesc = new RenderTargetViewDescription();",
        "                viewDesc.Format = textureMSDesc.Format;",
        "                viewDesc.Dimension = samples > 1 ? RenderTargetViewDimension.Texture2DMultisampled : RenderTargetViewDimension.Texture2D;",
        "",
        "                _renderTargetMSView = new RenderTargetView(device, _renderTargetMSResource.Texture, viewDesc);",
        "            }",
        "",
        "            var depthMSDesc = ResourceManager.GetTextureDescription(BindFlags.DepthStencil | BindFlags.ShaderResource, Format.R32_Typeless, width, height);",
        "            depthMSDesc.SampleDescription = new SampleDescription(samples, 0);",
        "",
        "            var depthStencilMSResourceChanged = ResourceManager.ValidateResource(ref _renderDepthMSResource, OperatorPart, device, depthMSDesc);",
        "            if (depthStencilMSResourceChanged)",
        "            {",
        "                Utilities.DisposeObj(ref _renderTargetDepthMSView);",
        "",
        "                var depthViewDesc = new DepthStencilViewDescription();",
        "                depthViewDesc.Format = Format.D32_Float;",
        "                depthViewDesc.Dimension = samples > 1 ? DepthStencilViewDimension.Texture2DMultisampled : DepthStencilViewDimension.Texture2D;",
        "",
        "                _renderTargetDepthMSView = new DepthStencilView(device, _renderDepthMSResource.Texture, depthViewDesc);",
        "            }",
        "",
        "            return resolvedImageResourceChanged || depthStencilResourceChanged || renderTargetMSResourceChanged || depthStencilMSResourceChanged;",
        "        }",
        "",
        "        Resource _renderTargetMSResource;",
        "        RenderTargetView _renderTargetMSView;",
        "        Resource _renderDepthMSResource;",
        "        DepthStencilView _renderTargetDepthMSView;",
        "",
        "        Resource _resolvedImageResource;",
        "        Resource _resolvedDepthResource;",
        "        DepthStencilView _resolvedTargetDepthView;",
        "        protected bool _firstEval = true;",
        "        protected BaseRenderer _renderer;",
        "    }",
        "}",
        "",
        ""
      ],
      "AdditionalAssemblies": []
    }
  ],
  "Operators": [],
  "Connections": [
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "abfa35fb-328c-463c-97d6-e8379c4959e1",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "b003cd1c-7328-401f-b60f-2e95b6f9ddcb"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "963609dc-85f5-4acd-9f8c-4bc451180084",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "abfa35fb-328c-463c-97d6-e8379c4959e1"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "c81346af-6726-4c48-b3b1-d7f3af772d23",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "abfa35fb-328c-463c-97d6-e8379c4959e1"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "1f5e5bc9-f6de-4d5c-87b4-43cc13ece576",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "abfa35fb-328c-463c-97d6-e8379c4959e1"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "0a0cf660-9f08-4b4a-b177-0412bda5702d",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "abfa35fb-328c-463c-97d6-e8379c4959e1"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "1cc0d86d-2d99-4463-8c97-01e2ab02cf83",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "abfa35fb-328c-463c-97d6-e8379c4959e1"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "1654a999-350a-41cb-9f20-d634af71041e",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "abfa35fb-328c-463c-97d6-e8379c4959e1"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "a75d0316-afd5-4607-ad18-4dd5cf0d86fb",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "abfa35fb-328c-463c-97d6-e8379c4959e1"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "d3a59492-a17b-4d56-89bf-a91109bc2da8",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "abfa35fb-328c-463c-97d6-e8379c4959e1"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "a729ddaf-315f-4e2c-bda7-64b9cf421b42",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "abfa35fb-328c-463c-97d6-e8379c4959e1"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "9fc3c13b-811d-419d-975a-2ac13f375be0",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "abfa35fb-328c-463c-97d6-e8379c4959e1"
    }
  ]
}