MUSCLE

Screenshot der Software:
MUSCLE
Softwarebeschreibung:
Version: 6.82 Aktualisiert
Upload-Datum: 22 Jun 18
Entwickler: Jeremy Friesner
Lizenz: Frei
Popularität: 76

Rating: 5.0/5 (Total Votes: 1)

MUSCLE steht für die Client-Linkage-Umgebung von Multi User Server und es ist ein Open-Source-, kostenloses, robustes, skalierbares und plattformübergreifendes Messaging-System, das Server- und Client-Komponenten umfasst. Es wird Ihnen helfen, alle Arten von verteilter Software, von Multiplayer-Spielen und IRC-Chat-Clients, zu SETI-Berechnungs-Apps zu schreiben.


Funktionen auf einen Blick

Mit MUSCLE können Benutzer den mitgelieferten "muscled server" einfach anpassen, indem sie ihre eigene Sitzungslogik oder ihr Message-Streaming-Protokoll definieren. Die Software hilft Ihnen, Ihren Client-Code in den Programmiersprachen C ++, C, C #, Java, Delphi oder Python zu schreiben.

Das Programm verwendet BMessage-artige Muskel :: Nachrichten, unterstützt das Senden von abgeflachten Muskel :: Nachrichten zwischen Computern über TCP (Transmission Control Protocol) Streams, entfaltet einen "muskulösen Server" & ldquo; Auf einem Servercomputer können Sie Client-Programme schreiben, die für die Kommunikation mit dem Server verwendet werden können.

Zusätzlich enthält es single- und multi-threaded Messaging-APIs, die alle oben genannten Programmiersprachen unterstützen. Der & quot; bemuskelte Server & rdquo; kann leicht angepasst werden, indem ein Nachrichten-Streaming-Protokoll oder eine Sitzungslogik definiert wird.

Erste Schritte mit MUSCLE

Nach einer erfolgreichen Anmeldung können die Client-Programme feststellen, wer noch am zentralen Server angemeldet ist, sowie muscle :: Messages im RAM (Systemspeicher) speichern und muscle :: Messages an andere angeschlossene Clients senden zum Server. Bitte beachten Sie, dass Client-Programme bestimmte Daten auf dem Server abonnieren und sofortige Benachrichtigungen erhalten können, wenn sich die Daten ändern.


Unterstützt eine Vielzahl von Nachrichten-Routings

Die Software wurde entwickelt, um eine breite Palette von Nachrichten-Routings zu unterstützen, einschließlich Unicast-Stil, Broadcast-Stil und Multicast-Stil durch einen intelligenten, hierarchischen Pattern-Matching-Routing-Mechanismus.


Unterstützte Betriebssysteme und Verfügbarkeit

MUSCLE läuft auf jedem POSIX-kompatiblen Betriebssystem. Es wird als ein einziges, universelles Quellenarchiv verteilt, mit dem Benutzer die Anwendung für ihr GNU / Linux-System optimieren können. Sowohl die 32-Bit- als auch die 64-Bit-Hardwareplattform werden zu diesem Zeitpunkt unterstützt.

Was ist neu in dieser Version :

  • tests / Makefile-mt versucht nicht mehr, testreflectionsession zu kompilieren, außer wenn es auf einem Betriebssystem ausgeführt wird, das von testreflectsession unterstützt wird.
  • Habe etwas geringfügiges Editieren und Neuanordnen von "MUSCLE by Example" gemacht. Seiten.
  • Eine Anzahl von "Tags" in den MkDocs wurde durch [URLs] (...)
  • ersetzt
  • Die private Vererbung von "CountedObject" wurde aus allen Klassen entfernt, in denen sie enthalten war. Sie enthalten jetzt eine private Member-Variable "CountedObject". Dies wurde nur getan, weil all diese private Vererbung die Doxygen-Vererbungsgraphen überlagert hat.
  • Es wurde ein DECLARE_COUNTED_OBJECT Makro zu CountedObject.h hinzugefügt, so dass jeder mögliche Speicher-Overhead von CountedObjects in Fällen eliminiert werden kann, in denen Objektzählung nicht erwünscht ist.
  • Die Unterstützung für die -DMUSCLE_AVOID_OBJECT_COUNTING wurde entfernt und an ihrer Stelle wurde das Makro -DMUSCLE_ENABLE_OBJECT_COUNTING hinzugefügt. (Das heißt, die CountedObject-Klasse ist jetzt standardmäßig deaktiviert und muss explizit aktiviert werden, damit sie verwendet werden kann)
  • Hinzugefügt "MUSCLE by Example" & quot; Dokumentation für MiscUtilityFunctions. {cpp, h}
  • Eine Anzahl von "Tags" in der MUSCLE-by-Example-MkDocs-Quelle wurde in [urls] geändert, so dass die von ihnen genannten Methoden schnell überprüft werden können.
  • server / Makefile gibt nun libmuscle.a nach der main () .o Datei an.
  • Einige gcc-Warnungen im Testordner wurden korrigiert (nach Mika's Vorschlägen)
  • UnparseFile () hat Schlüsselwörter mit Leerzeichen nicht richtig zitiert. Behoben.
  • Die Abhängigkeiten in "MUSCLE by Example" wurden behoben. Beispiele 'Makefiles.

Was ist neu in Version:

  • Eine ShrinkToFit () - Eingabemethode wurde der Queue, Hashtable hinzugefügt. und String-Klassen. Diese Methode verkleinert das Objekt, sodass die Größe des intern zugewiesenen Speichers der Größe der Daten entspricht, die es tatsächlich enthält.
  • Hashtable :: EnsureSize () und Queue :: EnsureSize () nehmen nun ein optionales Argument (allowShrink), das (falls es auf true gesetzt ist) zulässt, dass das intern zugewiesene Array des Objekts kleiner zugewiesen wird, wenn es größer als nötig ist.
  • Das Buffer-Expansion-Verhalten der String-Klasse wurde etwas effizienter gestaltet.
  • Es wurde ein Schutz vor einer möglichen unendlichen Rekursion hinzugefügt, die beim Protokollieren eines "OUT OF MEMORY" -Modus auftreten könnte. Fehler nach einem Speicherzuordnungsfehler, wenn ein LogCallback versucht hat, Speicher zuzuordnen.

Was ist neu in Version 6.01:

  • Der String-Klasse wurde eine PrependWord () - Methode hinzugefügt.
  • Der String-Klasse wurden WithReplacements () - Methoden hinzugefügt.
  • Eine SetExplicitDelayMicros () -Methode für die DetectNetworkConfigChangesSession-Klasse hinzugefügt.
  • Der Klasse NetworkInterfaceInfo wurde eine IsCopperDetected () -Methode hinzugefügt, sodass der Code erkennen kann, ob an einer Ethernet-Buchse ein Kabel angeschlossen ist.
  • Ein "quiet send" wurde hinzugefügt. Argument zu hexterm.
  • Die virtuelle Methode NetworkInterfacesChanged () in der Klasse DetectNetworkConfigChangesSession wurde geändert, um ein Argument zu verwenden, das angibt, welche Netzwerkschnittstellen sich insbesondere geändert haben. Diese Funktionalität wird derzeit nur unter Linux, MacOS / X und Windows implementiert. Bei anderen Betriebssystemen ist das Argument immer eine leere Liste.
  • Es wurde ein Fehler in der Linux-Implementierung von DetectNetworkConfigChangesSession behoben, der einen Segmentierungsfehler verursachen konnte, wenn recvmsg () einen Fehler zurückgab (z. B. aufgrund eines empfangenen Signals).

Was ist neu in Version 6.00:

  • Die SSLSocketDataIO-Klasse wurde neu geschrieben, damit sie besser mit nicht blockierenden E / A funktioniert (in Verbindung mit der neuen SSLSocketAdapterGateway-Klasse).
  • Es wurden Implementierungen von SSLSocketDataIO :: SetPrivateKey () und SSLSocketDataIO :: SetCertificate () hinzugefügt, die einen ByteBuffer als Argument verwenden.
  • Es wurde eine SSLSocketAdapterGateway-Klasse hinzugefügt, mit der der interne Zustandsautomat von OpenSSL verwaltet wird, wenn eine SSLSocketDataIO-Klasse mit Ihrem Gateway verwendet wird.
  • Die Methoden SetSSLPrivateKey () und GetSSLPrivateKey () wurden der ReflectServer-Klasse hinzugefügt, um die SSL-Authentifizierung für alle eingehenden TCP-Verbindungen einfacher zu aktivieren. Diese Methoden sind verfügbar, wenn MUSCLE_ENABLE_SSL definiert ist.
  • Die Methoden SetSSLPublicKeyCertificate () und GetSSLPublicKeyCertificate () wurden der ReflectServer-Klasse hinzugefügt, um die SSL-Authentifizierung bei ausgehenden TCP-Verbindungen einfacher zu aktivieren. Diese Methoden sind verfügbar, wenn MUSCLE_ENABLE_SSL definiert ist.
  • Die Methoden SetSSLPrivateKey () und SetSSLPublicKeyCertificate () wurden der MessageTransceiverThread-Klasse hinzugefügt, um die SSL-Funktionalität bei der Verwendung von Thread-E / A zu vereinfachen.
  • Es wurde ein ssl_data-Ordner mit einigen Informationen zum Generieren von OpenSSL-Public / Private-Schlüsselpaaren und ein Beispiel für ein Schlüsselpaar zum Testen von OpenSSL hinzugefügt.
  • Wenn MUSCLE_ENABLE_SSL definiert ist, akzeptiert muscle jetzt ein optionales Argument 'privatekey = filename'. Wenn angegeben, wird der SSL-Modus aktiviert und akzeptiert nur eingehende TCP-Verbindungen mit öffentlichen Schlüsseln, die diesem privaten Schlüssel / Zertifikat entsprechen.
  • Wenn MUSCLE_ENABLE_SSL definiert ist, akzeptieren portablereflectclient und qt_example jetzt ein optionales Argument 'publickey = filename'. Wenn angegeben, wird der SSL-Modus aktiviert und diese Clients verbinden sich mit OpenSSL und präsentieren diese Datei als ihre Anmeldeinformationen.
  • Hinzugefügt ein & quot; Animate & quot; Kontrollkästchen für die Demo von qt_example. Wenn Sie es überprüfen, verschiebt das Fenster automatisch seinen Indikator. Das macht Spaß und ist auch nützlich, wenn Sie ein Szenario testen möchten, in dem mehrere Clients gleichzeitig Datenverkehr generieren.
  • Machte das qt_example Demo hübscher.
  • Die C ++ 11-Hilfsmakros in Hashtable.h und Queue.h wurden umbenannt, damit sie weniger mit anderen Makros kollidieren. * Einige kleinere Fehler in der Klasse SSLSocketDataIO wurden behoben. o Umbenennung von SSLSocketDataIO :: SetKey () in SetPrivateKey (). o Umbenennung von SSLSocketDataIO :: SetCertificate () in SetPublicKeyCertificate (). o AbstractMessageIOGateway :: SetDataIO () ist jetzt eine virtuelle Methode.

Was ist neu in Version 5.92:

  • Verbesserte Unterstützung für C ++ 11 move-semantics in den Warteschlangen- und Hashtable-Klassen (nur aktiviert, wenn -DMUSCLE_USE_CPLUSPLUS11 definiert ist)
  • Instrumentierung der String-Klasse hinzugefügt, damit ich beobachten kann, wie oft ein String-Objekt kopiert, verschoben usw. wird (nur aktiviert, wenn -DUSUS_COUNT_STRING_COPY_OPERATIONS definiert ist)
  • Eine PrintAndClearStringCopyCounts () - Funktion wurde hinzugefügt, die die oben gesammelten String-Operation-Daten ausgibt.
  • SFUSE magic wurde zu muscleSwap () hinzugefügt, so dass es ausgetauscht wird, indem SwapContents () aufgerufen wird, wenn möglich, und nicht durch Kopieren in ein temporäres Objekt.
  • Ein Initialisierungslistenkonstruktor und eine Überladung von AddTailMulti () zur Queue-Klasse hinzugefügt (nur verfügbar, wenn -DMUSCLE_USE_CPLUSPLUS11 natürlich definiert ist)
  • Die Warteschlangen- und Array-Überladungen von Queue :: AddTail () wurden in AddTailMulti () umbenannt, um Konflikte mit der neuen C ++ 11-Vorlage-Analyseunterstützung zu vermeiden.
  • Die Warteschlangen- und Array-Überladungen von Queue :: AddHead () wurden in AddHeadMulti () umbenannt, um Konflikte mit der neuen C ++ 11-Vorlagenanalyseunterstützung zu vermeiden.
  • Ersetzt das Makro MCRASH_IMPL durch einen Aufruf von assert (false).
  • Ein bisschen mehr Android-Kompatibilität Tweakage.
  • Viele der Programme im Testordner kompilierten nicht unter C ++ 11. Behoben.
  • Es wurden mehrere potentielle Fehler behoben, die vom statischen Analyse-Tool von clang entdeckt wurden.

Was ist neu in Version 5.91:

  • Die Methode EnsureCanPut () wurde der Hashtable-Klasse hinzugefügt.
  • Der Queue-Klasse wurde die Methode EnsureCanAdd () hinzugefügt.
  • DoMutexAtomicIncrement () wurde zu einer Inline-Funktion geändert, um den Aufruf effizienter zu gestalten.
  • QMessageTransceiverThread und QAcceptSocketsThread wurden geändert, um QCoreApplication :: postEvent () anstelle von QApplication :: postEvent () aufzurufen, um QT-Apps ohne GUI zu ermöglichen.
  • Das Beginner's Guide-Dokument wurde aktualisiert, um die verbesserte UDP-Unterstützung von MUSCLE widerzuspiegeln.
  • In einigen Android-Kompatibilitätsänderungen, die von Jean-Françaois Mullet zur Verfügung gestellt wurden, zusammengefasst.
  • Die Verwendung des Kompilierungs-Flags MUSCLE_USE_MUTEXES_FOR_ATOMIC_OPERATIONS würde MUSCLE beim Start aufgrund eines Vorgangsfolgenproblems zum Absturz bringen. Dies wurde jetzt behoben.
  • Das Kompilierungsflag MUSCLE_USE_MUTEXES_FOR_ATOMIC_OPERATIONS wurde bisher nur verwendet, wenn keine andere Implementierung von AtomicCounter verfügbar war. Jetzt hat das Flag eine höhere Priorität, das Setzen des Flags bedeutet also, dass Mutex verwendet wird, auch wenn ein anderer (effizienterer) Mechanismus verfügbar ist.

Was ist neu in Version 5.90:

  • Der DataIO-Klasse wurde eine GetPacketMaximumSize () -Methode hinzugefügt, damit der Gateway-Code die paketierte UDP-basierte Kommunikation intelligenter handhaben kann.
  • MessageIOGateway funktioniert jetzt sinnvollerweise in Verbindung mit UDPSocketDataIO.
  • Zu Message.h wurden CreateObjectFromArchiveMessage () - Template-Funktionen hinzugefügt, um als Gegenstück zu GetArchiveMessageFromPool () usw. auf der Wiederherstellungsseite zu dienen.
  • AtomicCounter :: AtomicIncrement () gibt jetzt einen booleschen Wert zurück (true, wenn der neue Zählerwert gleich eins ist).
  • Die HashtableIterator-Klasse wurde geändert, sodass schreibgeschützte Hashtable-Iterationen nun threadsicher sind, selbst wenn das HTIT_FLAG_NOREGISTER-Flag nicht angegeben ist.
  • Zu SetupSystem.h wurde eine muscle_thread_id-Klasse hinzugefügt, um eine Thread-ID in einer implementierungsneutralen Weise korrekt darzustellen.
  • Ein "Deadlock" hinzugefügt Programm zum Testordner. Dieses Programm läuft bewusst Gefahr, einen Deadlock zu erzeugen, um den Deadlockfinder-Test zu demonstrieren.
  • Zusätzliche Unterstützung für das Befehlszeilen-Flag -DMUSCLE_AVOID_THREAD_SAFE_HASHTABLE_ITERATORS für diejenigen, die lieber den Overhead der automatischen Thread-Sicherheit vermeiden und versprechen, HTIT_FLAG_NOREGISTER-Argumente bei Bedarf manuell bereitzustellen.
  • Der Funktion GetHostByName () wurde ein optionaler LRU-Lookup-Cache hinzugefügt, damit er schneller zurückkehren kann, wenn dieselben Hostnamen immer wieder aufgelöst werden.
  • Eine SetHostNameCacheSettings () -Funktion hinzugefügt, die den LRU-Lookup-Cache in GetHostByName () aktiviert und anpasst.
  • Zusätzliche Unterstützung für & quot; dnscache & quot; und & rdquo; dnscachesize & rdquo; Befehlszeilenargumente in HandleStandardDaemonArgs (), um die Befehlszeilenspezifikation des Verhaltens des LRU-Lookupcaches zu ermöglichen.
  • Die Hashtable-Klasse wurde geändert, sodass die Memberwerte _iterHead, _iterTail und _freeHead jetzt uint32s anstelle von Zeigern sind, um die Speichernutzung zu reduzieren.
  • Die ThreadLocalStorage :: SetFreeHeldObjectsOnExit () -Methode wurde entfernt und stattdessen ein boolesches Argument zum Konstruktor hinzugefügt, da pthreads es nicht erlaubt, diese Einstellung zu ändern, nachdem pthread_key_create () aufgerufen wurde.
  • GetCurrentThreadID () in die muscle_thread_id-Klasse als statische Member-Funktion verschoben und geändert, um ein muscle_thread_id-Objekt anstelle von unsigned long zurückzugeben.
  • Der Standard-Hostname für Sitzungen ohne eine bekannte IP-Adresse wurde von & quot; bis & quot; _unknown_ & quot ;, da die spitzen Klammern in der früheren Zeichenkette eine spezielle Bedeutung wie bei der Version 5.84 haben, und die den Knotenpfad-Abgleich in unbeabsichtigter Weise stören könnten.
  • Die CalculateChecksum () - Methoden in Message.cpp wurden so modifiziert, dass sie bei der Erkennung von Datenversetzungsdifferenzen robuster sind.
  • Die Unterstützung für MUSCLE_USE_QT_FOR_ATOMIC_OPERATIONS wurde von AtomicCounter.h entfernt, da die QAtomicInt-Klasse von Qt die Funktionalität, die der neue Rückgabewert der AtomicIncrement () -Methode erfordert, nicht unterstützt.
  • MessageIOGateway :: FlattenMessage () und MessageIOGateway :: UnflattenMessage () wurden entfernt. An ihrer Stelle hinzugefügt: MessageIOGateway :: FlattenHeaderAndMessage () und MessageIOGateway :: UnflattenHeaderAndMessage (). Diese neuen Methoden befassen sich gleichzeitig mit den Header-Bytes und dem Nachrichtentext.
  • Eine Datei "udpproxy.vcproj" wurde zum Testordner hinzugefügt, um das Kompilieren von "udpproxy" unter Windows zu unterstützen.
  • Nachricht: Flatten () durchläuft die Felder in der Nachricht jetzt einmal anstatt zweimal.
  • GetCurrentThreadID () ist jetzt eine Inline-Funktion, da sie jetzt oft von HashtableIterator aufgerufen werden kann.
  • Der Deadlockfinder-Code wurde geändert, um Warteschlangen anstelle von Hashtables zu verwenden, da muscle_thread_id nicht mehr als Hashtable-Schlüsseltyp verwendet werden kann.
  • Feste testudp.cpp, um einen MessageIOGateway für seine UDP-Kommunikation richtig zu verwenden.
  • Die ifdefs in FilePathInfo.cpp wurden etwas mehr angepasst, so dass auf statInfo.st_birthtimespec nicht zugegriffen wird, wenn MacOS / X SDKs verwendet werden, die es nicht bereitstellen.
  • MessageDataIOGateway versucht nicht mehr, eine Nachricht von einem zlib-deflationierten Datenpuffer zu entfernen, den sie nicht erneut inflatieren konnte.
  • Ein Fehler in SendDataUDP () wurde behoben, der dazu führen konnte, dass SendDataUDP () beim Senden an eine Multicast-Adresse im nicht blockierenden Modus einen Fehler zurückgab und der Ausgabepuffer voll war.

Was ist neu in Version 5.85:

  • LogTime (MUSCLE_LOG_DEBUG) Aufrufe zu allen Fehlerpfaden in MessageIOGateway :: DoInputImplementation () und Message :: Unflatten () hinzugefügt, so dass es einfacher ist festzustellen, wann TCP-Verbindungen aufgrund von Daten abgebrochen werden Korruption.
  • Eine Funktion "PreviousOperationHadTransientFailure ()" wurde hinzugefügt, die "true" zurückgibt, wenn es sich bei Fehlern um EINTR oder ENOBUFS handelt.
  • Wenn spamespersecond = -1 angegeben wird, sendet hexterm Spam-Daten so schnell wie möglich.
  • Die MUSCLE_USE_POLL-Implementierung von SocketMultiplexer.h lieferte POLLERR an WSAPoll (), aber WSAPoll () unterstützt POLLERR nicht, sodass WSAPoll () einen Fehler zurückgab, wenn dies auftrat. Umgangen wurde das Problem durch Ausfiltern von POLLERR beim Kompilieren unter Windows.
  • Es wurde ein Fehler behoben, durch den send () beim Zurücksenden von ENOBUFS dazu führen konnte, dass die Socket-Verbindung beendet wurde, obwohl ENOBUFS keine schwerwiegende Bedingung war.
  • SocketMultiplexer.cpp kompiliert nicht, wenn MUSCLE_USE_POLL definiert wurde. Behoben.
  • Die ZLibCodec :: Deflate () -Methode kann nicht alle Daten in einem sehr großen Puffer (z. B. über 42 MB) komprimieren. Behoben.

Was ist neu in Version 5.84:

  • Die Syntax für den Zahlenbereich der StringMatcher-Klasse wurde erweitert, sodass Sie jetzt mehrere Bereiche angeben können. Zum Beispiel "& quot; würde den Strings "19", "20", "21", "25", "30", "31", [...] und "50" entsprechen
  • Die GetCurrentTime64ForRunTime64 () - und GetRunTime64ForCurrenTime64 () - Konvertierungsfunktionen wurden zu TimeUtilityFunctions.h. hinzugefügt.
  • Der DataNode-Klasse wurde eine GetDescendant () - Dienstprogrammmethode hinzugefügt.
  • C ++ 11 move-constructors und move-assignment-operators zu den Hashtable-, Queue-, String-, Message- und ByteBuffer-Klassen hinzugefügt. Aus Gründen der Abwärtskompatibilität mit älteren Compilern wird dieser Code nur kompiliert, wenn in der Kompilierzeile -DMUSCLE_USE_CPLUSPLUS11 angegeben ist.
  • SharedMemory-Klasse wird jetzt in eine nicht gemeinsam genutzte Speicherklasse nerf, wenn -DMUSCLE_FAKE_SHARED_MEMORY angegeben wird.
  • Ein testfilepathinfo-Test wurde dem Testordner hinzugefügt.
  • Alle Header für Copyright-Hinweise wurden aktualisiert, um Meyer Sound 2000-2013 zu lesen.
  • Zusätzliche Leerzeichen zwischen Makro-Token (z. B. UINT32_FORMAT_SPEC) und Zeichenfolgenkonstanten (z. B. "Hello"), um C ++ 11-Compiler glücklich zu machen.
  • ByteBuffer.cpp hatte einen Syntaxfehler, der die Kompilierung auf Big-Endian-Hosts verhindern würde. Behoben.
  • Nur MacOS / X: Ersetzte veraltete Carbon Function-Aufrufe durch Mach-Äquivalente, um veraltete Warnungen unter 10.8.x zu vermeiden.

Was ist neu in Version 5.83:

  • Zusätzliche Versionen von InflateByteBuffer () und DeflateByteBuffer () wurden hinzugefügt nimm einen ByteBufferRef als Argument.
  • Einige veraltete / nicht verwendete Methoden (EnsureBufferSize () und FreeLargeBuffer ()) aus der Klasse AbstractMessageIOGateway entfernt.
  • Einige Tippfehler in den Kommentaren im Delphi-Unterordner behoben.
  • Die Hashtable-Klasse generiert keine Warnungen mehr, wenn sie unter MSVC mit -DMUSCLE_AVOID_MINIMIZED_HASHTABLES kompiliert wurde.
  • Es wurde ein Fehler in IPAddressAndPort :: ToString () behoben, der dazu führte, dass IPv4-Adresszeichenfolgen mehrdeutig formatiert wurden, wenn (preferIPv4Style) auf false gesetzt war.

Ähnliche Software

groonga
groonga

17 Feb 15

DB2
DB2

19 Feb 15

Oracle Database
Oracle Database

17 Feb 15

Andere Software von Entwickler Jeremy Friesner

AudioMove
AudioMove

2 Jun 15

Kommentare zu MUSCLE

Kommentare nicht gefunden
Kommentar hinzufügen
Schalten Sie auf die Bilder!