{
  "Name": "RadialGlow",
  "_id": "80beee15-70e3-423c-93f5-a88d818dc0af",
  "Namespace": "lib.image.blur",
  "Description": "Good for faking god rays\r\n\r\n",
  "Inputs": [
    {
      "Name": "Code",
      "MetaInstanceID": "794fee5d-c40c-461a-a0a5-335df721c306",
      "DefaultValue": {
        "Type": "Text",
        "Value": [
          "//>>> _common parameters\r",
          "float4x4 objectToWorldMatrix;",
          "float4x4 worldToCameraMatrix;",
          "float4x4 projMatrix;",
          "Texture2D txDiffuse;",
          "float2 RenderTargetSize;",
          "//<<< _common parameters\r",
          "\r",
          "//>>> __parameters\r",
          "//godrays",
          "Texture2D Image;",
          "float Strength;",
          "float Threshold;",
          "float ShiftDepth;",
          "float Size;",
          "float RaySamples;",
          "float4 Color;\r",
          "\r",
          "float2 Center;\r",
          "float BlurSize;\r",
          "float BlurSamples;\r",
          "//<<< __parameters\r",
          "\r",
          "//Texture2D txDepth;\r",
          "float4x4 viewToCamera;\r",
          " \r",
          "//>>> _setup\r",
          "SamplerState samLinear",
          "{",
          "    Filter = MIN_MAG_MIP_LINEAR;",
          "    AddressU = Clamp;",
          "    AddressV = Clamp;",
          "};",
          "//<<< _setup\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 )\r",
          "{\r",
          "    PS_IN output = (PS_IN)0;\r",
          "\r",
          "    input.pos = mul(input.pos, objectToWorldMatrix); \r",
          "    output.pos = mul(input.pos, worldToCameraMatrix);\r",
          "    output.pos = mul(output.pos, projMatrix);\r",
          "    output.texCoord = input.texCoord;\r",
          "\r",
          "    return output;\r",
          "}\r",
          "//<<< VS\r",
          "\r",
          "\r",
          "//>>> PSGodRays\r",
          "float4 psGodRays( PS_IN input ) : SV_Target\r",
          "{\r",
          "    float4 c = Image.Sample(samLinear, input.texCoord);\r",
          "    float4 c2 = Image.Sample(samLinear, input.texCoord);\r",
          "    float depth = Image.SampleLevel(samLinear, input.texCoord, 0).r;\r",
          "    float4 viewTFragPos = float4(input.texCoord.x*2.0 - 1.0, -input.texCoord.y*2.0 + 1.0, depth, 1.0);\r",
          "    float4 cameraTFragPos = mul(viewTFragPos, viewToCamera);\r",
          "    cameraTFragPos /= cameraTFragPos.w;\r",
          "\r",
          "    //float2 CenterInView = float2(0.5, 0.5);\r",
          "\r",
          "    float sampleStep = 1;    \r",
          "    float2 sampleDir = viewTFragPos.xy - Center;\r",
          "    sampleDir.x = -sampleDir.x;\r",
          "    float2 dir = sampleStep*Size/RaySamples*sampleDir;\r",
          "\r",
          "    float2 pos = dir;\r",
          "    float distanceToCenter;\r",
          "    for (int i = 0; i < RaySamples; ++i)\r",
          "    {\r",
          "        float2 p = input.texCoord + pos;\r",
          "                \r",
          "        if (p.x > 0 && p.x < 1 && p.y > 0 && p.y < 1)\r",
          "        {\r",
          "            float1 cP2 = Image.SampleLevel(samLinear, p, 0);\r",
          "            float f= 1-i/RaySamples;\r",
          "            c += max(0, cP2 - Threshold) * Strength * f;\r",
          "        }        \r",
          "        pos += dir;\r",
          "    }\r",
          "    c /= RaySamples;\r",
          "    c*=Color;\r",
          "    return c;\r",
          "}\r",
          "//<<< PSGodRays\r",
          "\r",
          "//>>> PSRadialBlur\r",
          "static const int NUMWT = 10;\r",
          "static const float Gauss[NUMWT] = { 0.93, 0.86, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1 };\r",
          "\r",
          "float4 psRadialBlur( PS_IN input ) : SV_Target\r",
          "{\r",
          "    float4 cOrg = Image.Sample(samLinear, input.texCoord);\r",
          "\r",
          "    float2 viewTFragPos = float2(input.texCoord.x*2.0 - 1.0, -input.texCoord.y*2.0 + 1.0);\r",
          "\r",
          "    float sampleStep = 1;\r",
          "\r",
          "    float2 sampleDir = viewTFragPos.xy - Center;\r",
          "    sampleDir.x = -sampleDir.x;\r",
          "    float2 dir = sampleStep*BlurSize/BlurSamples*sampleDir;\r",
          "\r",
          "    float4 c = float4(0, 0, 0, 0);\r",
          "    float totalWeight = 0;\r",
          "    float2 pos = dir - BlurSamples*0.5*dir;\r",
          "    float distanceToCenter;\r",
          "    for (int i = 0; i < BlurSamples; ++i)\r",
          "    {\r",
          "        float2 p = input.texCoord + pos;\r",
          "        \r",
          "        if (p.x > 0 && p.x < 1 && p.y > 0 && p.y < 1)\r",
          "        {\r",
          "            float ir = i/floor(BlurSamples);\r",
          "            float weightIndex = (int)(abs(ir*2-1)*1 * (NUMWT-1));\r",
          "            float weight = lerp(Gauss[weightIndex], Gauss[(int)weightIndex + 1], frac(weightIndex));\r",
          "            c += txDiffuse.Sample(samLinear, p)*weight;\r",
          "            totalWeight += weight;\r",
          "        }        \r",
          "        pos += dir;\r",
          "    }\r",
          "    c+= cOrg;\r",
          "    c.a = clamp(c.a, 0,1);\r",
          "    return c;\r",
          "}\r",
          "//<<< PSRadialBlur\r",
          "\r",
          "//>>> __technique\r",
          "technique10 GodRays",
          "{",
          "    pass GodRays",
          "    {",
          "        SetGeometryShader( 0 );",
          "        SetVertexShader( CompileShader( vs_4_0, VS() ) );",
          "        SetPixelShader( CompileShader( ps_4_0, psGodRays() ) );",
          "    }",
          "}",
          "technique10 RadialBlur\r",
          "{\r",
          "    pass RadialBlur\r",
          "    {\r",
          "        SetGeometryShader( 0 );\r",
          "        SetVertexShader( CompileShader( vs_4_0, VS() ) );\r",
          "        SetPixelShader( CompileShader( ps_4_0, psRadialBlur() ) );\r",
          "    }\r",
          "}\r",
          "//<<< __technique\r",
          ""
        ]
      },
      "MetaID": "c522a66e-3260-4692-b3e3-79fd0361fa3d",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Image",
      "MetaInstanceID": "e4a7e90d-f1cf-43b1-8ee9-886ca6ea9344",
      "DefaultValue": {
        "Type": "Image",
        "Value": "Framefield.Core.Image"
      },
      "MetaID": "9848060d-fd84-45b0-b658-d0d531c61dab",
      "IsMultiInput": "False",
      "Relevance": "Required",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Strength",
      "MetaInstanceID": "5725e771-61bf-4d86-9cc4-80c050567ddb",
      "DefaultValue": {
        "Type": "Float",
        "Value": "6"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "0.01",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Threshold",
      "MetaInstanceID": "9ff9bdcd-484a-4b8e-8048-5400c14261f1",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0.5"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "0.001",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "RaySamples",
      "MetaInstanceID": "cf4cbbad-a2ce-4077-9883-cf98f1bd108d",
      "DefaultValue": {
        "Type": "Float",
        "Value": "20"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "1",
      "Max": "100",
      "Scale": "1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Size",
      "MetaInstanceID": "a4b69bdb-1347-4d4c-929c-72f4496ecb9d",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0.5"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Color.R",
      "MetaInstanceID": "39956949-ee2e-4cc4-a4f1-ef35a61afb0c",
      "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": "Color.G",
      "MetaInstanceID": "a363bfcc-b7bb-43e2-afde-2434292def37",
      "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": "Color.B",
      "MetaInstanceID": "2dbeb173-5a17-4c61-838f-74dc6189ed18",
      "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": "Color.A",
      "MetaInstanceID": "401052cb-98ef-422f-80e3-41a924da97f2",
      "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": "BlurSamples",
      "MetaInstanceID": "1cb529d9-e845-476c-a535-4a3dac72a3b6",
      "DefaultValue": {
        "Type": "Float",
        "Value": "8"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "BlurSize",
      "MetaInstanceID": "29e2986a-8e96-406c-b722-62c18e55dd0a",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0.06999998"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "0",
      "Max": "100000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Center.X",
      "MetaInstanceID": "0cff0abc-3d64-4d06-b4a4-20d63f5da612",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-10000",
      "Max": "10000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Center.Y",
      "MetaInstanceID": "a5073831-55c2-4e75-9770-20f0bd74d323",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-10000",
      "Max": "10000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    }
  ],
  "Outputs": [
    {
      "Name": "Image",
      "MetaInstanceID": "05f1b491-769d-4bb5-8fa1-9a4b6fbe69db",
      "MetaID": "9848060d-fd84-45b0-b658-d0d531c61dab"
    }
  ],
  "OperatorParts": [
    {
      "MetaInstanceID": "74eca212-f49e-4260-9b49-cf0709df4450",
      "MetaID": "91f0b9c3-c8e9-493b-b15e-9d60cb296b74",
      "Name": "RadialGlowFunc",
      "Version": "1ce2e78b-c81f-440f-897c-6fe091f39c6f",
      "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 SharpDX.D3DCompiler;",
        "using SharpDX.Direct3D; ",
        "using Framefield.Core.Rendering;",
        "using System.Dynamic;",
        "using Framefield.Core;",
        "",
        "namespace Framefield.Core.ID91f0b9c3_c8e9_493b_b15e_9d60cb296b74",
        "{",
        "    public class Class_RadialGlow : FXImageFunction",
        "    {",
        "        //>>> _inputids",
        "        private enum InputId",
        "        {",
        "            Code = 0,",
        "            Image = 1,",
        "            Strength = 2,",
        "            Threshold = 3,",
        "            RaySamples = 4,",
        "            Size = 5,",
        "            ColorR = 6,",
        "            ColorG = 7,",
        "            ColorB = 8,",
        "            ColorA = 9,",
        "            BlurSamples = 10,",
        "            BlurSize = 11,",
        "            CenterX = 12,",
        "            CenterY = 13",
        "        }",
        "        //<<< _inputids",
        "",
        "        protected override bool NeedsDepth { get { return false; } }",
        "",
        "        protected override bool BuildRenderTarget(SharpDX.DXGI.Format imageBufferFormat)",
        "        {",
        "            var pass1ResourceChanged = ResourceManager.ValidateRenderTargetResource(ref _pass1RenderTargetResource, OperatorPart, D3DDevice.Device,",
        "                                                                                    (int)_usedViewport.Width, (int)_usedViewport.Height);",
        "            if (pass1ResourceChanged)",
        "            {",
        "                Utilities.DisposeObj(ref _pass1RenderTargetView);",
        "                _pass1RenderTargetView = new RenderTargetView(D3DDevice.Device, _pass1RenderTargetResource.Texture);",
        "            }",
        "",
        "            return base.BuildRenderTarget(imageBufferFormat) || pass1ResourceChanged;",
        "        }",
        "",
        "        public override void Dispose()",
        "        {",
        "            ResourceManager.Dispose(_pass1RenderTargetResource);",
        "            Utilities.DisposeObj(ref _pass1RenderTargetView);",
        "            base.Dispose();",
        "        }",
        "",
        "        public override OperatorPartContext Eval(OperatorPartContext context, List<OperatorPart> inputs, int outputIdx)",
        "        {",
        "            return PrepareAndEvalOnChange(context, () =>",
        "            {",
        "                //>>> __params",
        "                var Code = inputs[(int)InputId.Code].Eval(context).Text;",
        "                var imageInput = inputs[(int)InputId.Image].Eval(context);",
        "",
        "                var Strength = inputs[(int)InputId.Strength].Eval(context).Value;",
        "                var Rays = inputs[(int)InputId.Threshold].Eval(context).Value;",
        "                var RaySamples = inputs[(int)InputId.RaySamples].Eval(context).Value;",
        "                var Size = inputs[(int)InputId.Size].Eval(context).Value;",
        "                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 BlurSamples = inputs[(int)InputId.BlurSamples].Eval(context).Value;",
        "                var BlurSize = inputs[(int)InputId.BlurSize].Eval(context).Value;",
        "                var CenterX = inputs[(int)InputId.CenterX].Eval(context).Value;",
        "                var CenterY = inputs[(int)InputId.CenterY].Eval(context).Value;",
        "                var Center = new Vector2(CenterX, CenterY);                ",
        "                //<<< __params",
        "               ",
        "                var image = imageInput.Image;",
        "                //var depthImage = imageInput.DepthImage;",
        "                //if (image == null || depthImage == null)",
        "                if (image == null)",
        "                {",
        "                    Logger.Error(this, \"Image input missing\");",
        "                    return;",
        "                }",
        "    ",
        "                if (_renderer2 == null)",
        "                {",
        "                     _renderer2 = new BaseRenderer();",
        "                }",
        "",
        "                var D3DDevice = context.D3DDevice;",
        "",
        "",
        "                var shaderDesc = new ShaderResourceViewDescription();",
        "                shaderDesc.Format = Format.R32_Float;",
        "                shaderDesc.Dimension = ShaderResourceViewDimension.Texture2D;",
        "                shaderDesc.Texture2D.MipLevels = 1;",
        "",
        "",
        "                //pass 1: original godrays",
        "                //using (var depthTexture = new ShaderResourceView(context.D3DDevice, depthImage, shaderDesc))",
        "                using (var ImageView = new ShaderResourceView(context.D3DDevice, image))",
        "                {",
        "                    D3DDevice.ImmediateContext.ClearRenderTargetView(_pass1RenderTargetView, new SharpDX.Color4(0, 0, 0, 1));",
        "",
        "                    var pass1SubContext = new OperatorPartContext(context);",
        "                    pass1SubContext.DepthStencilView = null;",
        "                    pass1SubContext.RenderTargetView = _pass1RenderTargetView;",
        "                    pass1SubContext.Effect = _effect;",
        "                    pass1SubContext.Renderer = _renderer;",
        "                    pass1SubContext.InputLayout = context.Renderer.ScreenQuadInputLayout;",
        "                    pass1SubContext.CameraProjection = Matrix.OrthoLH(1, 1, -100, 100);",
        "                    pass1SubContext.WorldToCamera = Matrix.Identity;",
        "                    pass1SubContext.ObjectTWorld = Matrix.Identity;",
        "                    pass1SubContext.TextureMatrix = Matrix.Identity;",
        "",
        "                    pass1SubContext.Renderer.SetupEffect(pass1SubContext);",
        "",
        "                    _effect.GetVariableByName(\"RenderTargetSize\").AsVector().Set(new Vector2(_usedViewport.Width, _usedViewport.Height));",
        "                    _effect.GetVariableByName(\"Image\").AsShaderResource().SetResource(ImageView);",
        "                    _effect.GetVariableByName(\"Strength\").AsScalar().Set(Strength);",
        "                    _effect.GetVariableByName(\"Threshold\").AsScalar().Set(Rays);",
        "                    _effect.GetVariableByName(\"Size\").AsScalar().Set(Size);",
        "                    _effect.GetVariableByName(\"RaySamples\").AsScalar().Set(RaySamples);",
        "                    _effect.GetVariableByName(\"Color\").AsVector().Set(Color);",
        "",
        "                    pass1SubContext.Renderer.Render(pass1SubContext.Renderer._screenQuadMesh, pass1SubContext, 0);",
        "                }",
        "                ",
        "",
        "                //pass 2 directional blur",
        "                using (var textureView = new ShaderResourceView(D3DDevice, _pass1RenderTargetResource.Texture))",
        "                {",
        "                    D3DDevice.ImmediateContext.ClearRenderTargetView(_renderTargetView, new SharpDX.Color4(0, 0, 0, 1));",
        "",
        "                    var pass2SubContext = new OperatorPartContext(context);",
        "                    pass2SubContext.DepthStencilView = null;",
        "                    pass2SubContext.RenderTargetView = _renderTargetView;",
        "                    pass2SubContext.Effect = _effect;",
        "                    pass2SubContext.Renderer = _renderer2;",
        "                    pass2SubContext.InputLayout = context.Renderer.ScreenQuadInputLayout;",
        "                    pass2SubContext.CameraProjection = Matrix.OrthoLH(1, 1, -100, 100);",
        "                    pass2SubContext.WorldToCamera = Matrix.Identity;",
        "                    pass2SubContext.ObjectTWorld = Matrix.Identity;",
        "                    pass2SubContext.TextureMatrix = Matrix.Identity;",
        "                    pass2SubContext.Texture0 = textureView;",
        "                    pass2SubContext.Renderer.SetupEffect(pass2SubContext);",
        "",
        "                    _effect.GetVariableByName(\"BlurSamples\").AsScalar().Set(BlurSamples);",
        "                    _effect.GetVariableByName(\"BlurSize\").AsScalar().Set(BlurSize);",
        "                    _effect.GetVariableByName(\"Center\").AsVector().Set(Center);",
        "",
        "                    pass2SubContext.Renderer.Render(pass2SubContext.Renderer._screenQuadMesh, pass2SubContext, 1);",
        "                }",
        "            });",
        "        }",
        "",
        "        BaseRenderer _renderer2;",
        "        Resource _pass1RenderTargetResource = null;",
        "        RenderTargetView _pass1RenderTargetView = null;",
        "    }",
        "}",
        "",
        ""
      ],
      "AdditionalAssemblies": []
    }
  ],
  "Operators": [],
  "Connections": [
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "74eca212-f49e-4260-9b49-cf0709df4450",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "05f1b491-769d-4bb5-8fa1-9a4b6fbe69db"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "794fee5d-c40c-461a-a0a5-335df721c306",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "74eca212-f49e-4260-9b49-cf0709df4450"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "e4a7e90d-f1cf-43b1-8ee9-886ca6ea9344",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "74eca212-f49e-4260-9b49-cf0709df4450"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "5725e771-61bf-4d86-9cc4-80c050567ddb",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "74eca212-f49e-4260-9b49-cf0709df4450"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "9ff9bdcd-484a-4b8e-8048-5400c14261f1",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "74eca212-f49e-4260-9b49-cf0709df4450"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "cf4cbbad-a2ce-4077-9883-cf98f1bd108d",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "74eca212-f49e-4260-9b49-cf0709df4450"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "a4b69bdb-1347-4d4c-929c-72f4496ecb9d",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "74eca212-f49e-4260-9b49-cf0709df4450"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "39956949-ee2e-4cc4-a4f1-ef35a61afb0c",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "74eca212-f49e-4260-9b49-cf0709df4450"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "a363bfcc-b7bb-43e2-afde-2434292def37",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "74eca212-f49e-4260-9b49-cf0709df4450"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "2dbeb173-5a17-4c61-838f-74dc6189ed18",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "74eca212-f49e-4260-9b49-cf0709df4450"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "401052cb-98ef-422f-80e3-41a924da97f2",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "74eca212-f49e-4260-9b49-cf0709df4450"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "1cb529d9-e845-476c-a535-4a3dac72a3b6",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "74eca212-f49e-4260-9b49-cf0709df4450"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "29e2986a-8e96-406c-b722-62c18e55dd0a",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "74eca212-f49e-4260-9b49-cf0709df4450"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "0cff0abc-3d64-4d06-b4a4-20d63f5da612",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "74eca212-f49e-4260-9b49-cf0709df4450"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "a5073831-55c2-4e75-9770-20f0bd74d323",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "74eca212-f49e-4260-9b49-cf0709df4450"
    }
  ]
}