private void createNew_clicked(object sender, RoutedEventArgs e)
        {
            if (!checkBeforeExit()) { return; }

            try
            {
                NewScenario newscen = new NewScenario();
                if (newscen.ShowDialog() == true)
                {
                    currentScenario = new Scenario(
                        newscen.NameOfScenario,
                        System.IO.Path.Combine(dirOfScenaries, newscen.NameOfScenario + ".xml")
                        );
                    if (!currentScenario.exportScenario2XML(dirOfScenaries))
                    {
                        MessageBox.Show(
                            "Не удалось экспортировать сценарий в XML. Однако, вы можете продолжать работать с ним.",
                            "Ошибка экспорта сценария",
                            MessageBoxButton.OK,
                            MessageBoxImage.Warning
                            );
                    }

                    gitRepo.Clear();
                    lb_paths.Items.Clear();

                    activateWindow(true);
                    changeSavedStatus(true);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(
                    "Ошибка при создании файла сценария. " + ex.Message,
                    "Ошибка создания нового сценария",
                    MessageBoxButton.OK,
                    MessageBoxImage.Error
                    );
            }
        }
        private void doTheShit(Scenario currentScenario, CancellationToken cancellationToken)
        {
            int max = currentScenario.paths2servers.Count;
            this.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() =>
            {
                pb_updating.Value = 0;
                pb_updating.Maximum = max;
            }
            ));

            try
            {
                foreach (string path2update in currentScenario.paths2servers)
                {
                    string path = path2update.TrimEnd('\\');
                    // [debug]
                    //Thread.Sleep(1500);

                    // получить из центрального репозитория последнюю инфу
                    using (Process proc = new Process
                    {
                        StartInfo = new ProcessStartInfo
                        {
                            FileName = "git.exe",
                            Arguments = string.Format("--git-dir=\"{0}\" --work-tree=\"{1}\" fetch --all",
                                System.IO.Path.Combine(path, ".git"),
                                path
                                ),
                            UseShellExecute = false,
                            RedirectStandardOutput = true,
                            CreateNoWindow = true
                        }
                    })
                    {
                        proc.Start();
                        while (!proc.HasExited) { }
                    }

                    // выкатить в репозиторий свежую ветку
                    using (Process proc = new Process
                    {
                        StartInfo = new ProcessStartInfo
                        {
                            FileName = "git.exe",
                            Arguments = string.Format("--git-dir=\"{0}\" --work-tree=\"{1}\" reset --hard {2}",
                                System.IO.Path.Combine(path, ".git"),
                                path,
                                currentScenario.gitBranch
                                ),
                            UseShellExecute = false,
                            RedirectStandardOutput = true,
                            CreateNoWindow = true
                        }
                    })
                    {
                        proc.Start();
                        while (!proc.HasExited) { }
                    }

                    // прогресс
                    this.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() =>
                    {
                        pb_updating.Value++;
                    }
                    ));

                    // проверяем, не был ли процесс отменён
                    cancellationToken.ThrowIfCancellationRequested();
                }
            }
            catch (Exception ex)
            {
                this.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() =>
                {
                    MessageBox.Show(
                        "Во время обновления произошла ошибка. Перехваченное исключение: " + ex.Message,
                        "Ошибка обновления репозиториев на серверах",
                        MessageBoxButton.OK,
                        MessageBoxImage.Error
                        );
                }
                ));
            }
        }
        public void loadScenario(string path)
        {
            try { currentScenario = new Scenario(path); }
            catch (Exception ex)
            {
                MessageBox.Show(
                    "Ошибка при открытии сценария. Возможно, этот файл не является сценарием для обновления. Перехваченное исключение: " + ex.Message,
                    "Не удалось открыть сценарий",
                    MessageBoxButton.OK,
                    MessageBoxImage.Error
                    );
                return;
            }

            crntScenName.Content = currentScenario.name;
            gitRepo.Text = currentScenario.gitLink;
            tb_localRepo.Text = currentScenario.gitLocal;
            tb_branch.Text = currentScenario.gitBranch;

            lb_paths.Items.Clear();
            foreach (string p2s in currentScenario.paths2servers) { lb_paths.Items.Add(p2s); }

            activateWindow(true); // if (!isActive) { activateWindow(true); }
            changeSavedStatus(true);
        }