public override IProfiler LoadProfilingSession(Guid sessionId)
        {
            var jsonArray = new JsonArrayObjects();

            // parse json array of specified session
            for (var i = _logFileLines.Length - 1; i >= 0; --i)
            {
                var json = JsonObject.Parse(_logFileLines[i]);
                if (Guid.Parse(json["sessionId"]) == sessionId)
                {
                    jsonArray.Add(json);
                }
            }

            // parse session
            var sessionJson = jsonArray.First(json => json["type"] == "session");
            var session = ParseSessionFields(sessionJson);
            session.StepTimings = new List<SerializableStepTiming>();
            session.CustomTimings = new List<SerializableCustomTiming>();

            // parse step timings
            var stepJsons = jsonArray.Where(json => json["type"] == "step");
            foreach (var stepJson in stepJsons)
            {
                var step = ParseStepFields(stepJson);
                session.StepTimings.Add(step);
            }

            // parse custom timings
            var customJsons = jsonArray.Where(json => json["type"] != "session" && json["type"] != "step");
            foreach (var customJson in customJsons)
            {
                var custom = ParseCustomFields(customJson);
                session.CustomTimings.Add(custom);
            }

            // sort session step & custom timings
            SortSessionTimings(session);

            return session;
        }