Aktuelle Zeit: 31.03.2020 16:14

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Dynamik der Covid-19-Ausbreitung
BeitragVerfasst: 22.03.2020 12:14 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
Die Zahl der Covid-19-Fälle steigt zur Zeit exponentiell ("lawinenartig") an. Ein eingängiges Maß für die Geschwindigkeit der Ausbreitung ist die Zeitspanne, nach der sich die Zahl der Fälle verdoppelt hat. Sie ist natürlich keine Konstante, sondern kann sich ändern ... bzw. soll sich möglichst ändern, sprich verlängern.

Wenn man das freie Statistikprogramm R auf seinem PC hat und der Konstanten #R_Script$ am Beginn dieses Programms den absoluten oder relativen Pfad zu 'Rscript.exe' zuweist, so wird im zweiten Teil des Programms für die Verdoppelungszeit im gewählten Land auch ein aktueller Trend berechnet (Voreinstellung: Trend der letzten 5 Tage).
(Es hätte hier den Rahmen gesprengt, die statistischen Berechnungen in PureBasic selbst zu implementieren.)

Bei der Interpretation aller Zahlen zu Covid-19 sollte man immer daran denken, dass es bei der Zahl der Infizierten eine -- evtl. sehr große -- Dunkelziffer von nicht registrierten Fällen gibt.

Für weitere Informationen s. z.B.

Dank an Kiffi, der hier die Diskussion zu geeigneten Datenquellen aufgebracht und mich durch seine SpiderBasic-WebApp dazu inspiriert hat, mich mit diesem Thema programmiertechnisch zu befassen.

Code:
; <https://www.purebasic.fr/german/viewtopic.php?f=8&t=31922>
; PB 5.71 LTS

EnableExplicit

CompilerIf #PB_Compiler_Debugger = #False
   CompilerError "Debugger einschalten"
CompilerEndIf

#R_Script$ = ""  ; für Trendberechnung: absoluter oder relativer Pfad zum Programm 'Rscript.exe'

;---------------------------------------------------------------------------------------
;- Utility functions

Macro FastMid (_string_, _start_, _length_=-1)
   PeekS(@_string_ + ((_start_)-1)*SizeOf(Character), _length_)
EndMacro


Procedure.i CountStringEx (source$, stringToCount$, quoteChar$=#DQUOTE$)
   ; in : source$       : zu durchsuchender String;
   ;                      Fehlt ein rechtes Anführungszeichen, so wird es am Stringende angenommen.
   ;      stringToCount$: zu zählender String
   ;      quoteChar$    : verwendetes Anführungszeichen (1 Zeichen);
   ;                      "" um Anführungszeichen zu ignorieren
   ; out: Häufigkeit von 'stringToCount$' in 'source$' *außerhalb von Anführungszeichen*,
   ;      -1 bei Fehler
   Protected.i left, right, count=0

   If FindString(stringToCount$, quoteChar$) > 0
      ProcedureReturn -1       ; error
   EndIf

   left = 1
   Repeat
      right = FindString(source$, quoteChar$, left)          ; position of left "
      If right = 0                                           ; z.B. immer wenn quoteChar$ = #Empty$
         count + CountString(FastMid(source$, left), stringToCount$)
         Break
      EndIf

      count + CountString(FastMid(source$, left, right - left), stringToCount$)
      left = FindString(source$, quoteChar$, right+1) + 1    ; position directly behind right "
   Until left = 1                                            ; rechtes " am Stringende angenommen

   ProcedureReturn count
EndProcedure


Procedure.i SplitIntoFields (source$, sep$, Array field$(1), quoteChar$=#DQUOTE$)
   ; -- Aufteilen eines Strings in einzelne Array-Elemente:
   ;    - 'sep$' wird nur außerhalb von Anführungszeichen berücksichtigt
   ;    - ist schneller als der wiederholte Aufruf von StringField()
   ; in : source$   : aufzuteilender String;
   ;                  Fehlt ein rechtes Anführungszeichen, so wird es am Stringende angenommen.
   ;      sep$      : Trennstring (aus 1 oder mehreren Zeichen);
   ;                  Wenn sep$ = "", dann wird ein Array mit 1 Element zurückgegeben
   ;                  das gleich 'source$' ist (analog zu StringField(..., 1, "")).
   ;      quoteChar$: verwendetes Anführungszeichen (1 Zeichen);
   ;                  "" um Anführungszeichen zu ignorieren
   ; out: field$()    : Array mit allen Feldern (von evtl. vorhandene Anführungszeichen eingeschlossen)
   ;      return value: 1 on success
   ;                    0 on warning
   ;                   -1 on error
   Protected.i lastElement, left, right, leftQuote, rightQuote, index=0, ret=1
   Protected.i sourceLen = Len(source$)
   Protected.i sepLen = Len(sep$)

   lastElement = CountStringEx(source$, sep$, quoteChar$)
   If lastElement = -1
      ProcedureReturn -1                        ; error
   EndIf

   Dim field$(lastElement)

   left = 1
   Repeat
      right = FindString(source$, sep$, left)   ; position of sep$
      If right
         leftQuote = FindString(source$, quoteChar$, left)
         If leftQuote > 0 And leftQuote < right
            rightQuote = FindString(source$, quoteChar$, leftQuote+1)
            If rightQuote
               right = FindString(source$, sep$, rightQuote+1)
            Else
               right = sourceLen + 1            ; rechtes " am Stringende angenommen
               ret = 0                          ; warning
            EndIf
         EndIf
      EndIf
      If right = 0
         right = sourceLen + 1
      EndIf

      field$(index) = FastMid(source$, left, right - left)
      index + 1

      left = right + sepLen                     ; position directly behind sep$
   Until left > sourceLen

   ProcedureReturn ret
EndProcedure


Procedure.s RAlign (s$, width.i, char$=" ")
   ; -- String rechts ausrichten
   ; in: s$   : auszurichtender String
   ;     width: auszufüllender Platz (Anzahl Zeichen)
   ;     char$: darf nur 1 Zeichen lang sein!

   If Len(s$) >= width
      ProcedureReturn s$
   Else
      ProcedureReturn RSet(s$, width, char$)
   EndIf
EndProcedure

;---------------------------------------------------------------------------------------

#SecondsPerDay = 24*60*60
#DateMaskIn$  = "%mm/%dd/%yy"
#DateMaskOut$ = "%dd.%mm.%yyyy"
#None$ = "    ----"
#MinCases = 20            ; Mindestanzahl bestätigter Krankheitsfälle pro Land
#TrendDays = 5            ; Anzahl der Tage zur Berechnung des aktuellen Trends

#CSV_IndexCountry   = 1
#CSV_IndexFirstDate = 4

Structure Record
   Array Confirmed.i(0)   ; Anzahl bestätigter Krankheitsfälle pro Land
EndStructure

Structure CSV
   Array Date.i(0)        ; Datumsangaben
   Map Country.Record()   ; alle Länder
EndStructure

Structure CovData
   Nation$
   td.d
EndStructure


Procedure.s GetCSV (download.i)
   ; in: download: #True : download CSV file
   ;               #False: read CSV file in the same directory where the program is
   Protected urlConfirmed$, fileConfirmed$

   ; Übersicht: <https://github.com/CSSEGISandData/COVID-19>
   urlConfirmed$ = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"

   fileConfirmed$ = GetFilePart(GetURLPart(urlConfirmed$, #PB_URL_Path))

   If download = #True
      fileConfirmed$ = GetTemporaryDirectory() + fileConfirmed$
      InitNetwork()
      If ReceiveHTTPFile(urlConfirmed$, fileConfirmed$) = 0
         ProcedureReturn ""
      EndIf
   EndIf

   ProcedureReturn fileConfirmed$
EndProcedure


Procedure.i ReadCSV (file$, *covid.CSV, sep$=",")
   ; -- CSV-Datei lesen
   ; in : file$: local CSV file
   ;      sep$ : separator between data fields
   ; out: *covid      : content of the CSV file
   ;      return value: #True on success, #False on error
   Protected header$, values$, country$
   Protected.i ifn, lastField, i
   Protected Dim head$(0)
   Protected Dim valu$(0)

   ifn = ReadFile(#PB_Any, file$)
   If ifn = 0
      ProcedureReturn #False       ; error
   EndIf

   ReadStringFormat(ifn)
   header$ = ReadString(ifn)
   If SplitIntoFields(header$, sep$, head$()) <= 0
      CloseFile(ifn)
      ProcedureReturn #False       ; error
   EndIf
   lastField = ArraySize(head$())
   If lastField = 0
      CloseFile(ifn)
      ProcedureReturn #False       ; error
   EndIf

   Dim *covid\Date(lastField)
   For i = #CSV_IndexFirstDate To lastField
      *covid\Date(i) = ParseDate(#DateMaskIn$, head$(i))
   Next

   While Eof(ifn) = #False
      values$ = ReadString(ifn)
      If SplitIntoFields(values$, sep$, valu$()) <= 0
         CloseFile(ifn)
         ProcedureReturn #False    ; error
      EndIf
      country$ = Trim(valu$(#CSV_IndexCountry), #DQUOTE$)

      If FindMapElement(*covid\Country(), country$) = 0
         AddMapElement(*covid\Country(), country$, #PB_Map_NoElementCheck)
         Dim *covid\Country()\Confirmed(lastField)
      EndIf
      For i = #CSV_IndexFirstDate To lastField
         *covid\Country()\Confirmed(i) + Val(valu$(i))
      Next
   Wend

   CloseFile(ifn)
   ProcedureReturn #True           ; success
EndProcedure


Procedure.d DoublingTime (*covid.CSV, *country.Record, iTarget.i)
   ; -- Verdoppelungszeit
   ; in : *covid              : content of the CSV file
   ;      *country\Confirmed(): Array mit den betr. Fallzahlen für ein Land,
   ;                            *aufsteigend nach Datum* sortiert
   ;      iTarget             : Index des interessierenden Array-Elements
   ; out: return value: Zeit in Tagen, in der sich die Anzahl der Fälle verdoppelt hat
   ;                    (in Bezug auf *covid\Date(iTarget));
   ;                    0.0 bei Fehler
   Protected.i iDate0, halfCases, diff, halfDate

   halfCases = *country\Confirmed(iTarget) / 2
   iDate0 = iTarget - 1
   While iDate0 >= #CSV_IndexFirstDate
      If *country\Confirmed(iDate0) <= halfCases And *country\Confirmed(iDate0) <> 0
         diff = *country\Confirmed(iDate0+1) - *country\Confirmed(iDate0)
         If diff <> 0
            ; halfDate: durch lineare Interpolation zwischen zwei aufeinanderfolgenden Tagen
            ;           geschätzter Zeitpunkt, an dem die Anzahl der Fälle = halfCases ist
            halfDate = *covid\Date(iDate0) + (*covid\Date(iDate0+1)-*covid\Date(iDate0))/diff * (halfCases-*country\Confirmed(iDate0))
            ProcedureReturn (*covid\Date(iTarget) - halfDate) / #SecondsPerDay
         Else
            Break     ; error
         EndIf
      EndIf

      iDate0 - 1
   Wend

   ProcedureReturn 0.0   ; error
EndProcedure

;---------------------------------------------------------------------------------------

Procedure AllCurrentDoublingTimes (*covid.CSV)
   ; -- alle sinnvoll berechenbaren aktuellen Verdoppelungszeiten
   ; in: *covid: content of the CSV file
   Protected.i iCurDate, curDate$
   Protected NewList DTime.CovData()

   iCurDate = ArraySize(*covid\Date())
   curDate$ = FormatDate(#DateMaskOut$, *covid\Date(iCurDate))

   ForEach *covid\Country()
      AddElement(DTime())
      DTime()\Nation$ = MapKey(*covid\Country())
      If *covid\Country()\Confirmed(iCurDate) >= #MinCases
         DTime()\td = DoublingTime(*covid, *covid\Country(), iCurDate)
      Else
         DTime()\td = 0.0
      EndIf
   Next

   SortStructuredList(DTime(), #PB_Sort_Ascending, OffsetOf(CovData\Nation$), TypeOf(CovData\Nation$))
   SortStructuredList(DTime(), #PB_Sort_Ascending, OffsetOf(CovData\td),      TypeOf(CovData\td))

   Debug curDate$
   Debug ""
   Debug "Verdoppelungszeit   Land"
   Debug "-----------------   ----"
   
   ForEach DTime()
      If DTime()\td > 0.0
         Debug RAlign(StrD(DTime()\td,1), 5) + " Tage" + Space(10) + DTime()\Nation$
      Else
         Debug #None$ + Space(12) + DTime()\Nation$
      EndIf
   Next
EndProcedure


Procedure.i Statistics_R (Array trend.d(1))
   ; -- Script-Datei für R schreiben und ausführen, um auf einen Trend im Verlauf der Verdoppelungs-
   ;    zeiten der letzten #TrendDays Tage zu prüfen (einfache lineare Regression (Pearson));
   ;    getestet mit R 3.6.3
   ; in : trend(): Daten zur Prüfung auf einen Trend
   ; out: return value: #True on success, #False on error
   Protected out$, line$, script$, result$
   Protected slope.d, fn.i, i.i, ret.i=#False

   script$ = GetTemporaryDirectory() + "script.r"
   result$ = GetTemporaryDirectory() + "DTimeTrend.txt"

   fn = CreateFile(#PB_Any, script$)
   If fn = 0
      ProcedureReturn #False    ; error
   EndIf

   out$ = "day <- c("
   For i = 1 To #TrendDays-1
      out$ + Str(i) + ", "
   Next
   out$ + Str(i) + ")"
   WriteStringN(fn, out$)

   out$ = "td <- c("
   For i = 1 To #TrendDays-1
      out$ + StrD(trend(i-1), 1) + ", "
   Next
   out$ + StrD(trend(i-1), 1) + ")"
   WriteStringN(fn, out$)

   WriteStringN(fn, "summary(lm(td ~ day))")
   CloseFile(fn)

   If RunProgram(#R_Script$, script$ + ">" + result$, "", #PB_Program_Wait|#PB_Program_Hide) = #False
      ProcedureReturn #False    ; error
   EndIf

   fn = ReadFile(#PB_Any, result$)
   If fn = 0
      ProcedureReturn #False    ; error
   EndIf

   ReadStringFormat(fn)
   While Eof(fn) = #False
      line$ = ReadString(fn)
      If Left(line$, 3) = "day"
         Debug ""
         out$ = "Trend der letzten " + #TrendDays + " Tage: Die Ausbreitung "
         If Right(RTrim(line$), 1) = "*"
            ; ***  p <= 0.001
            ;  **  p <= 0.01
            ;   *  p <= 0.05
            slope = ValD(Mid(line$, 13, 8))    ; Regressionskoeffizient
            If slope < 0.0
               Debug out$ + "wird schneller."
            Else
               Debug out$ + "wird langsamer."
            EndIf
         Else
            Debug out$ + "bleibt gleich."
         EndIf

         ret = #True    ; success
         Break
      EndIf
   Wend
   CloseFile(fn)

   ProcedureReturn ret
EndProcedure


Procedure.i CourseOfDoublingTime (*covid.CSV, country$)
   ; -- Verlauf der Verdoppelungszeit in einem ausgewählten Land
   ; in : *covid  : content of the CSV file
   ;      country$: country of interest
   ; out: return value: #True on success, #False on error
   Protected out$, td.d, iCurDate.i, iTarget.i, iTrend.i, ret.i=#True
   Protected Dim trend.d(#TrendDays-1)

   If FindMapElement(*covid\Country(), country$) = 0
      ProcedureReturn #False    ; error
   EndIf

   Debug "Dynamik der bestätigten Fälle in: " + country$
   Debug ""
   Debug "Datum          Verdoppelungszeit"
   Debug "-----          -----------------"

   iCurDate = ArraySize(*covid\Date())
   For iTarget = 43 To iCurDate                 ; erst ab 1. März auswerten
      out$ = FormatDate(#DateMaskOut$, *covid\Date(iTarget)) + Space(5)
      If *covid\Country()\Confirmed(iTarget) >= #MinCases
         td = DoublingTime(*covid, *covid\Country(), iTarget)
      Else
         td = 0.0
      EndIf
      If td > 0.0
         Debug out$ + RAlign(StrD(td,1), 5) + " Tage"
      Else
         Debug out$ + #None$
      EndIf

      ; Werte der letzten #TrendDays Tage für Trendberechnung merken
      iTrend = iTarget - iCurDate + #TrendDays - 1
      If iTrend >= 0
         trend(iTrend) = td
      EndIf
   Next

   If Asc(#R_Script$) <> ''
      ret = Statistics_R(trend())
   EndIf

   ProcedureReturn ret
EndProcedure


Define country$, file$, covid.CSV

;-------------------------------------------
;- Verlauf der Verdoppelungszeit zeigen für:
; country$ = "China"
; country$ = "France"
country$ = "Germany"
; country$ = "Italy"
; country$ = "Japan"
; country$ = "Russia"
; country$ = "Singapore"
; country$ = "Spain"
; country$ = "US"
;-------------------------------------------

file$ = GetCSV(#True)
If Asc(file$) = ''
   MessageRequester("DoublingTime", "Error getting CSV file.", #PB_MessageRequester_Error)
   End
EndIf

If ReadCSV(file$, @covid) = 0
   MessageRequester("DoublingTime", "Error reading CSV file '" + file$ + "'.", #PB_MessageRequester_Error)
   End
EndIf

AllCurrentDoublingTimes(@covid)

Debug ""
Debug "==========================================="
Debug ""

If CourseOfDoublingTime(@covid, country$) = 0
   MessageRequester("DoublingTime", "Error processing data for '" + country$ + "'.", #PB_MessageRequester_Error)
   End
EndIf


Code:
28.03.2020

Verdoppelungszeit   Land
-----------------   ----
  [...]
  1.9 Tage          Uganda
  1.9 Tage          Kazakhstan
  2.0 Tage          Turkey
  2.3 Tage          Honduras
  2.4 Tage          Ukraine
  2.5 Tage          Zambia
  2.5 Tage          Bolivia
  2.7 Tage          New Zealand
  2.8 Tage          Cuba
  2.9 Tage          Mauritius
  [...]
 10.3 Tage          Belarus
 10.6 Tage          Bahrain
 10.7 Tage          Brunei
 10.7 Tage          San Marino
 11.8 Tage          Japan
 12.5 Tage          Kuwait
 15.4 Tage          Qatar
 25.5 Tage          Korea, South
 41.0 Tage          Diamond Princess
 47.5 Tage          China

===========================================

Dynamik der bestätigten Fälle in: Germany

Datum          Verdoppelungszeit
-----          -----------------
01.03.2020       1.5 Tage
02.03.2020       2.0 Tage
03.03.2020       2.6 Tage
04.03.2020       3.0 Tage
05.03.2020       1.3 Tage
06.03.2020       1.7 Tage
07.03.2020       2.4 Tage
08.03.2020       2.8 Tage
09.03.2020       3.4 Tage
10.03.2020       3.6 Tage
11.03.2020       3.4 Tage
12.03.2020       4.0 Tage
13.03.2020       2.2 Tage
14.03.2020       1.9 Tage
15.03.2020       2.5 Tage
16.03.2020       3.0 Tage
17.03.2020       3.0 Tage
18.03.2020       2.8 Tage
19.03.2020       2.8 Tage
20.03.2020       2.8 Tage
21.03.2020       3.4 Tage
22.03.2020       4.0 Tage
23.03.2020       4.3 Tage
24.03.2020       4.7 Tage
25.03.2020       5.3 Tage
26.03.2020       5.1 Tage
27.03.2020       4.9 Tage
28.03.2020       5.1 Tage

Trend der letzten 5 Tage: Die Ausbreitung bleibt gleich.

_________________
Dieser Satz ist falsch.


Zuletzt geändert von Nino am 29.03.2020 20:12, insgesamt 6-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dynamik der Covid-19-Ausbreitung
BeitragVerfasst: 23.03.2020 10:54 
Offline
Benutzeravatar

Registriert: 08.09.2004 08:53
Danke :allright:

_________________
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dynamik der Covid-19-Ausbreitung
BeitragVerfasst: 23.03.2020 17:16 
Offline
Benutzeravatar

Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten
Hallo Nino,

wenn ich eine Anfrage mit country$="US" mache, bekomme ich nur die Daten der Province/State Washington,US,47.4009,-121.4905,0,0,... ,0,267,366,442,568,572,643,904,1076,1014,1376,1524,1793,1996 .
Ähnliches passiert bei den Ländern China mit Hubei, Canada mit British Columbia, Australia mit New South Wales, United Kingdom, Australia, Demark, Netherlands.

Weiter habe ich den Eindruck das bei vielen US-Daten, wie New York County, NY 13 führende Nullen fehlen und so die Daten um 13 Tage verschoben sind.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dynamik der Covid-19-Ausbreitung
BeitragVerfasst: 23.03.2020 22:56 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
Hallo!
ReadCSV() hat geschrieben:
; Anm.: Diese Funktion ist einfach gehalten und funktioniert nur richtig
; für Datensätze, die keine in Anführungszeichen eingeschlossenen
; Feld-Trennzeichen enthalten.
:-)
Daher und weil bei manchen Ländern (z.B. China, US) die Anzahl der Fälle auf mehrere Datensätze ("Provinzen") verteilt ist, funktionierte der Code nicht mit allen Ländern.
Es kam mir zunächst v.a. auf die Verdoppelungszeit bei uns in Deutschland an.

Beide Probleme sind jetzt in der neuen Version behoben.

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dynamik der Covid-19-Ausbreitung
BeitragVerfasst: 24.03.2020 12:24 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
Neue Version:
  • Darstellung der aktuellen Verdoppelungszeiten für alle Länder (sofern berechenbar) hinzugefügt
  • einige interne Verbesserungen

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dynamik der Covid-19-Ausbreitung
BeitragVerfasst: 25.03.2020 19:13 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
Neue Version:
  • Da die bisherige Datenquelle nicht mehr aktualisiert wird, verwendet das Programm jetzt eine andere (ebenfalls von der Johns-Hopkins-Universität).
  • Das Programm läuft jetzt deutlich schneller als zuvor.

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dynamik der Covid-19-Ausbreitung
BeitragVerfasst: 29.03.2020 18:59 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
Neue Version:
  • Wenn auf dem PC das freie Statistikprogramm R vorhanden ist, kann im zweiten Teil des Programms für die Verdoppelungszeit im gewählten Land jetzt auch ein aktueller Trend berechnet werden.
  • Wenn die Anzahl der bestätigten Krankheitsfälle in einem Land kleiner als 20 ist, werden keine Berechnungen durchgeführt, da mir diese zu ungenau wären.
  • Diverse kleinere Änderungen.

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye