public ContestSettings CreateSettings(IContestInformation contest) { var defaultCat = RegisterCategory? .Where(k => k.Value != 0) .ToDictionary(k => k.Key, v => v.Value); if (defaultCat?.Count == 0) { defaultCat = null; } if (RestrictToIpRanges) { IpRanges ??= string.Empty; } else { IpRanges = null; } int restriction = (RestrictToIpRanges ? 1 : 0) | (RestrictToMinimalSite ? 2 : 0) | (RestrictToLastLoginIp ? 4 : 0); var penaltyTime = contest.RankingStrategy == CcsDefaults.RuleXCPC && PenaltyTime != 20 ? PenaltyTime : default(int?); var scoreboardPagingEnabled = UseScoreboardPaging switch { 1 => true, 2 => false, _ => default(bool?), }; var settings = contest.Settings.Clone(); settings.BalloonAvailable = contest.Kind == CcsDefaults.KindDom && UseBalloon; settings.EventAvailable = contest.Kind == CcsDefaults.KindDom && UseEvents; settings.Languages = Languages; settings.PrintingAvailable = contest.Kind == CcsDefaults.KindDom && UsePrintings; settings.RegisterCategory = defaultCat; settings.StatusAvailable = StatusAvailable; settings.PenaltyTime = penaltyTime; settings.ScoreboardPaging = scoreboardPagingEnabled; settings.PreferGymUI = contest.Kind == CcsDefaults.KindDom && PreferGymUI ? true : default(bool?); settings.RestrictIp = contest.Kind != CcsDefaults.KindDom || restriction == 0 ? default(int?) : restriction; settings.IpRanges = IpRanges?.Split(';', StringSplitOptions.RemoveEmptyEntries); return(settings); }