Inheritance: ServerInfoModel
        private static async Task<int> HandleNative(ISteamSessionLocator locator, bool inclRules,
            List<Tuple<string, string>> filter, Action<ArmaServerInfoModel> act) {
            var api = new SteamApi(locator);

            var degreeOfParallelism = inclRules ? 30 : 1;
            using (var bc = new BlockingCollection<ArmaServerInfoModel>()) {
                // TODO: better MT model
                var bcT = TaskExt.StartLongRunningTask(async () => {
                    await Task.WhenAll(Enumerable.Range(1, degreeOfParallelism).Select(_ =>
                            Task.Run(async () => {
                                foreach (var s in bc.GetConsumingEnumerable()) {
                                    await UpdateServerInfo(s, api, inclRules).ConfigureAwait(false);
                                    act(s);
                                }
                            })
                    ));
                });
                var c2 = await api.GetServerInfo(locator.Session.AppId, x => {
                    try {
                        var ip = x.m_NetAdr.GetQueryAddressString().Split(':').First();
                        var ipAddress = IPAddress.Parse(ip);
                        var map = x.GetMap();
                        var s = new ArmaServerInfoModel(new IPEndPoint(ipAddress, x.m_NetAdr.GetQueryPort())) {
                            ConnectionEndPoint = new IPEndPoint(ipAddress, x.m_NetAdr.GetConnectionPort()),
                            Name = x.GetServerName(),
                            Tags = x.GetGameTags(),
                            Mission = string.IsNullOrEmpty(map) ? null : x.GetGameDescription(),
                            Map = map,
                            Ping = x.m_nPing,
                            MaxPlayers = x.m_nMaxPlayers,
                            CurrentPlayers = x.m_nPlayers,
                            RequirePassword = x.m_bPassword,
                            IsVacEnabled = x.m_bSecure,
                            ServerVersion = x.m_nServerVersion
                        };
                        bc.Add(s);
                    } catch (Exception ex) {
                        Console.WriteLine(ex);
                    }
                }, filter);
                bc.CompleteAdding();
                await bcT;
                return c2;
            }
        }
 private static async Task UpdateServerInfo(ArmaServerInfoModel s, SteamApi api, bool inclRules) {
     s.GameTags = s.Tags == null ? null : GameTags.Parse(s.Tags);
     if (inclRules) {
         var rules = await api.GetServerRules(s.QueryEndPoint).ConfigureAwait(false);
         var mods = SourceQueryParser.GetList(rules, "modNames");
         s.SignatureList = SourceQueryParser.GetList(rules, "sigNames").ToHashSet();
         s.ModList = mods.Select(x => new ServerModInfo {Name = x}).ToList();
     }
 }