private Cortege<MultiTree<StringId>, LogHistory> GetMultiTree(List<List<string>> blocks)
        {
            Contract.Requires(blocks != null);
            Contract.Requires(blocks.Any());
            Contract.Requires(blocks.Count % 2 == 1);

            var logHistory = new LogHistory();

            var singleTree = _singleTreeParser.GetSingleTree(blocks[0]);
            logHistory.Add(new SingleTreeResult(singleTree));
            var mainTree = new MultiTree<StringId>(singleTree);

            for (int i = 1; i < blocks.Count; i += 2)
            {
                var minorTree = _singleTreeParser.GetSingleTree(blocks[i]);
                var connectionBlock = blocks[i + 1];

                logHistory.Add(new SingleTreeResult(minorTree));
                logHistory.Add(new CommandsResult(connectionBlock));

                var bindController = new BindContoller<StringId>(mainTree, minorTree);
                AddConnections(bindController, connectionBlock);

                var idGenerator = new IdGenerator(mainTree.ToList());
                var multiNode = _treeConstructor.GetFilledTree(bindController, idGenerator).ToMultiNode();
                mainTree = new MultiTree<StringId>(multiNode);
            }

            return new Cortege<MultiTree<StringId>, LogHistory>(mainTree, logHistory);
        }