public static bool SyncronizeColumns(this ChartScriptEntity chartScript, IChartBase chart)
        {
            bool result = false;

            if (chartScript == null)
            {
                result = true;
                chart.Columns.Clear();
            }

            for (int i = 0; i < chartScript.Columns.Count; i++)
            {
                if (chart.Columns.Count <= i)
                {
                    chart.Columns.Add(new ChartColumnEntity());
                    result = true;
                }

                chart.Columns[i].parentChart = chart;
                chart.Columns[i].ScriptColumn = chartScript.Columns[i];
             
                if (!result)
                    result = chart.Columns[i].IntegrityCheck() != null;
            }

            if (chart.Columns.Count > chartScript.Columns.Count)
            {
                chart.Columns.RemoveRange(chartScript.Columns.Count, chart.Columns.Count - chartScript.Columns.Count);
                result = true;
            }

            if (chart.Parameters.Modified != ModifiedState.Sealed)
            {
                if (chart.Parameters.Select(a => a.Name).OrderBy().SequenceEqual(chartScript.Parameters.Select(a => a.Name).OrderBy()))
                {
                    foreach (var cp in chart.Parameters)
                    {
                        var sp = chartScript.Parameters.FirstEx(a => a.Name == cp.Name);

                        cp.parentChart = chart;
                        cp.ScriptParameter = sp;
                        //if (cp.PropertyCheck(() => cp.Value).HasText())
                        //    cp.Value = sp.DefaultValue(cp.GetToken());
                    }
                }
                else
                {
                    var byName = chart.Parameters.ToDictionary(a => a.Name);
                    chart.Parameters.Clear();
                    foreach (var sp in chartScript.Parameters)
                    {
                        var cp = byName.TryGetC(sp.Name);

                        if (cp != null)
                        {
                            cp.parentChart = chart;
                            cp.ScriptParameter = sp;

                            //if (cp.PropertyCheck(() => cp.Value).HasText())
                            //    cp.Value = sp.DefaultValue(cp.GetToken());
                        }
                        else
                        {
                            cp = new ChartParameterEntity
                            {
                                Name = sp.Name,
                                parentChart = chart,
                                ScriptParameter = sp,
                            };

                            cp.Value = sp.DefaultValue(sp.GetToken(chart));
                        }

                        chart.Parameters.Add(cp);
                    }
                }
            }

            if (chartScript.GroupBy == GroupByChart.Always && chart.GroupResults == false)
            {
                chart.GroupResults = true;
                result = true;
            }
            else if (chartScript.GroupBy == GroupByChart.Never && chart.GroupResults == true)
            {
                chart.GroupResults = false;
                result = true;
            }

            return result;
        }
        private static FixTokenResult FixParameter(ChartParameterEntity item, ref string val)
        {
            var error = item.PropertyCheck(nameof(item.Value));
            if (error == null)
                return FixTokenResult.Nothing;

            SafeConsole.WriteLineColor(ConsoleColor.White, "Parameter Name: {0}".FormatWith(item.ScriptParameter.Name));
            SafeConsole.WriteLineColor(ConsoleColor.White, "Parameter Definition: {0}".FormatWith(item.ScriptParameter.ValueDefinition));
            SafeConsole.WriteLineColor(ConsoleColor.White, "CurrentValue: {0}".FormatWith(item.Value));
            SafeConsole.WriteLineColor(ConsoleColor.White, "Error: {0}.".FormatWith(error));
            SafeConsole.WriteLineColor(ConsoleColor.Yellow, "- s: Skip entity");
            SafeConsole.WriteLineColor(ConsoleColor.DarkRed, "- r: Remove parame");
            SafeConsole.WriteLineColor(ConsoleColor.Red, "- d: Delete entity");
            SafeConsole.WriteLineColor(ConsoleColor.Green, "- freeText: New value");

            string answer = Console.ReadLine();

            if (answer == null)
                throw new InvalidOperationException("Impossible to synchronize interactively without Console");

            string a = answer.ToLower();

            if (a == "s")
                return FixTokenResult.SkipEntity;

            if (a == "r")
                return FixTokenResult.RemoveToken;

            if (a == "d")
                return FixTokenResult.DeleteEntity;

            val = answer;
            return FixTokenResult.Fix;
        }