public static CanvasDocument Merge(CanvasDocument ours, CanvasDocument theirs, CanvasDocument commonParent)
        {
            var ourDeltas   = Diff.ComputeDelta(commonParent, ours);
            var theirDeltas = Diff.ComputeDelta(commonParent, theirs);

            var resultDelta = UnionDelta(ourDeltas, theirDeltas);

            return(ApplyDelta(commonParent, resultDelta));
        }
        // Verify there are no deltas (detected via smart merge) between doc1 and doc2
        // Strict =true, also compare entropy files.
        private static bool HasNoDeltas(CanvasDocument doc1, CanvasDocument doc2, bool strict = false)
        {
            var ourDeltas = Diff.ComputeDelta(doc1, doc1);

            // ThemeDelta always added
            ourDeltas = ourDeltas.Where(x => x.GetType() != typeof(ThemeChange)).ToArray();

            if (ourDeltas.Any())
            {
                foreach (var diff in ourDeltas)
                {
                    Console.WriteLine($"  {diff.GetType().Name}");
                }
                // Error! app shouldn't have any diffs with itself.
                return(false);
            }


            // Save and verify checksums.
            using (var temp1 = new TempFile())
                using (var temp2 = new TempFile())
                {
                    doc1.SaveToMsApp(temp1.FullPath);
                    doc2.SaveToMsApp(temp2.FullPath);

                    bool same;
                    if (strict)
                    {
                        same = Compare(temp1.FullPath, temp2.FullPath, Console.Out);
                    }
                    else
                    {
                        var doc1NoEntropy = RemoveEntropy(temp1.FullPath);
                        var doc2NoEntropy = RemoveEntropy(temp2.FullPath);

                        same = Compare(doc1NoEntropy, doc2NoEntropy, Console.Out);
                    }

                    if (!same)
                    {
                        return(false);
                    }
                }

            return(true);
        }