private OSMRelation ParseRelationData( byte[] data #if DEBUG , ElementDebugInfos debugInfos #endif ) { var bufferOffset = 0; #if DEBUG var idPosition = (uint)bufferOffset + 1; #endif var relationId = VarInt.ParseInt64(data, ref bufferOffset) + this._lastRelationId; #if DEBUG debugInfos.Add(idPosition, "start of 'id' (" + relationId + ")."); #endif var o5mRelation = new OSMRelation((ulong)relationId); this._lastRelationId = (long)o5mRelation.Id; #if DEBUG this.ParseVersionData(data, o5mRelation, ref bufferOffset, debugInfos); #else this.ParseVersionData(data, o5mRelation, ref bufferOffset); #endif if (data[bufferOffset] > 0) { KeyValuePair <byte[], byte[]>?typeAndRole; #if DEBUG var referenceLengthPosition = (uint)bufferOffset + 1; #endif var referenceLength = VarInt.ParseUInt64(data, ref bufferOffset); #if DEBUG debugInfos.Add(referenceLengthPosition, "start of 'length of reference section' (" + referenceLength + ")."); #endif var startOffset = bufferOffset; var bytesUnread = referenceLength; while (bytesUnread > 0) { #if DEBUG var referenceIdPosition = (uint)bufferOffset + 1; #endif var currentReferenceId = VarInt.ParseInt64(data, ref bufferOffset) + this._lastReferenceId; #if DEBUG debugInfos.Add(referenceIdPosition, "start of 'reference-id' (" + currentReferenceId + ")."); #endif this._lastReferenceId = currentReferenceId; if (data[bufferOffset] == 0) { #if DEBUG debugInfos.Add((uint)bufferOffset + 1, "start of 'type/role'-pair (raw)."); #endif typeAndRole = StringPair.ParseToTypeRoleByteArray(data, ref bufferOffset); if (typeAndRole.HasValue) { var typeAndRoleValue = typeAndRole.Value; if (typeAndRoleValue.Key.Length + typeAndRoleValue.Value.Length <= 250) { this._storedStringPairs.Insert(0, typeAndRoleValue); } } } else { #if DEBUG var typeRolePosition = (uint)bufferOffset + 1; #endif var storedPosition = VarInt.ParseUInt32(data, ref bufferOffset); #if DEBUG debugInfos.Add(typeRolePosition, "start of stored 'type/role'-pair (" + storedPosition + ")."); #endif typeAndRole = this._storedStringPairs[(int)storedPosition - 1]; } if (typeAndRole?.Key.Length > 0) { var typeValue = (MemberType)(typeAndRole.Value.Key[0] - 0x30); var roleValue = Encoding.UTF8.GetString(typeAndRole.Value.Value); o5mRelation.Members.Add(new OSMMember(typeValue, (ulong)currentReferenceId, roleValue)); } bytesUnread = referenceLength - ((ulong)bufferOffset - (ulong)startOffset); } } #if DEBUG this.ParseTagsData(data, o5mRelation, ref bufferOffset, debugInfos); #else this.ParseTagsData(data, o5mRelation, ref bufferOffset); #endif return(o5mRelation); }