Einführung in Nzym: Ein Whitepaper zur Programmiersprache, die Multimedia revolutionieren wird

Published on 12 Aug 2023

Nzym-Logo

Einführung

Nzym ist eine neue Programmiersprache, die darauf abzielt, das Programmieren einfacher, unkomplizierter und schneller zu machen, die Produktionszeit zu verkürzen und sogar bessere Ergebnisse zu erzielen, insbesondere bei Multimedia-Anwendungen. Der Kern von Nzym ist ein Skriptdateiobjekt, das allein existieren oder in Verbindung mit anderen verknüpft werden kann. Mithilfe dieser Skriptobjekte kann der Nzym-Interpreter Programme und Inhaltsseiten generieren. Dieses Dokument dient dazu, diese Sprache und die darin enthaltenen neuen Konzepte vorzustellen.


Nzym-Syntax

Die grundlegende Syntax von Nzym ist sehr einfach. Objekte werden erstellt, indem einer Variablen des entsprechenden Typs ein Wert zugewiesen wird. Um beispielsweise ein neues Objekt vom Typ „Zahl“ zu erstellen, würden Sie Folgendes schreiben:

Zahl meineInteger = 10;

Methoden werden für Objekte mithilfe der Punktnotation aufgerufen. Um beispielsweise die Add -Methode für ein Objekt vom Typ „Zahl“ aufzurufen, schreiben Sie Folgendes:

meineInteger.Add = 6;
// Wenn der Wert von myInteger vorher gleich 10 war, ist er jetzt 16

Es ist auch wichtig zu beachten, dass das Semikolon ( ; ) zum Beenden aller Anweisungen verwendet wird und ein Kommentar durch die Verwendung von zwei Schrägstrichen (//) und normalerweise einem Leerzeichen danach erstellt wird.

Primitive Typen

Nzym führt nur fünf grundlegende primitive Typen ein:
  • Zahl – speichert Ganzzahlen, Gleitkommazahlen oder eine Mischung aus beidem
  • String – speichert Zeichen und kann für komplexere Ausdrücke verwendet werden
  • Boolean – ein binärer Typ, der „true“ oder „false“ speichert
  • Gruppe – ein Array von Objekten, das zum Erstellen und Definieren komplexerer Elemente verwendet wird
  • Link – ein eindeutiger Typ, der ungültig sein kann oder auf eine Funktion verweist

Klassen & Methoden

Nzym-Klassen können zum Erstellen benutzerdefinierter Typen verwendet werden. Jede Skriptdatei in einem Projekt kann als Klasse aufgerufen und darauf zugegriffen werden. Innerhalb einer Skriptdatei können jedoch andere Klassen erstellt werden. Nzym hat auch eine einzigartige Herangehensweise an Methoden. Es gibt zwei Arten von Methoden hinsichtlich ihrer Erstellung, und dies hängt davon ab, wo sie erstellt werden. Diejenigen, die in verschachtelten Klassen enthalten sind, werden einfach als Methoden bezeichnet. Diejenigen außerhalb einer Klasse werden als Funktionen bezeichnet. Der folgende Code gibt ein Beispiel für die beiden:


Klassenmensch;
Stringname = Kein Name;
Anzahl Alter = 18;
Methode ShowName;
Rohname;
Zurückkehren;
Zurückkehren;
Funktion GetPerson = String;
Person zufälligePerson;
randomPerson.name = Ein Fremder;
zufälligePerson.Name anzeigen;
Zurückkehren;

Der obige Code erstellt eine Klasse namens „Person“ und instanziiert die Eigenschaften „Name“ und „Alter“, indem er sie mit Standardvariablen einrichtet. In „Person“ befindet sich außerdem eine Methode, die den Namen der angegebenen Personenklasse ausgibt. Die Funktion „GetPerson“ hat einen Rückgabetyp von „String“ und erstellt tatsächlich eine neue Person und gibt ihren Namen auf dem Bildschirm aus, sofern die Methode der Klasse „Person“ verwendet wird.


Nachlass

Nzym-Klassen können von anderen Klassen erben. Dadurch können Sie Code wiederverwenden und komplexere Typen erstellen. Um von einer Klasse zu erben, verwenden Sie nach dem Erstellen der Klasse das Gleichheitszeichen. Beispielsweise erbt die folgende Klasse von der Klasse „Person“:

Klasse Superheld = Person;
Gruppen-Superkräfte = (Laseraugen, Superstärke, Fliegen);
Anzahl Aktivleistung = 1;
Methode PowerInUse;
Rohe Superkräfte [activePower];
Zurückkehren;
Zurückkehren;

Die SuperHero-Klasse hat außerdem Zugriff auf alle Eigenschaften und Methoden der Person-Klasse.

Nzym Schlagworte

Nzym: Eine einfache, objektorientierte, interpretierte, imperative, plattformübergreifende, leistungsstarke, mehrthreadige und dynamische Sprache.

Viele Programmiersprachensysteme verwenden eine Reihe von Standardschlüsselwörtern, die sie charakterisieren. Diese sind nach ihren Paradigmen, ihrer Typisierungsdisziplin und den Problemen geordnet, die die Sprache lösen soll. Wir verwenden diese Schlüsselwörter, die wir hier als Schlagworte bezeichnen, um Nzym zu beschreiben und den Kern seiner Struktur und seines Ökosystems vorzustellen.

Sadomba-Mahari Computers (Private) Limited (oder einfach SM), das Unternehmen hinter der Entwicklung von Nzym, stieg 2010, also einige Monate nach seiner Registrierung, in die Webentwicklungsbranche ein und beschäftigte sich auch mit der Entwicklung spezieller Software für die lokale Filmindustrie in Simbabwe. Etwa ein paar Jahre später begannen sie auch mit der Entwicklung mobiler Anwendungen für höherwertige Mobiltelefone auf den Plattformen Android, Windows Phone und iOS. Die eingerückten, kursiv gedruckten Abschnitte unten sollen einen Überblick über die Probleme geben, mit denen SM konfrontiert ist, und Beispiele für die vorgestellten Schlüsselwörter von Nzym liefern.

Einfach

Einer der Hauptgründe für die Entwicklung von Nzym war, dass Bedarf an Systemen bestand, die sich ohne viel Schulung leicht programmieren ließen und einige Ähnlichkeiten mit früheren Konzepten aufwiesen, aber einen einfacheren Touch hatten, der selbst die meisten Programmieranfänger ansprechen würde. Die am häufigsten gelehrten Programmiersprachen während der Entwicklung von Nzym waren solche, die der C++-Syntax ähnelten, darunter C++, C#, Java und Python. Diese Programmiersprachen sind ebenfalls objektorientiert. Während C++ einige Komplexitätsstufen aufwies, die die anderen genannten Sprachen nicht hatten, wie z. B. fehlende Speicherverwaltung und das Konzept von Zeigern und Operatorüberladung, versuchten die anderen, diese Konzepte zu verbessern, aber es blieb dennoch eine steile Lernkurve für Programmierer, um sie mit zusätzlichen Overheads und Konzepten wie Garbage Collection, Mehrfachvererbung und umfangreichen automatischen Zwangsmaßnahmen zu meistern.
Nzym konzentriert sich auf das Objekt und macht Klammern und viele Klammertypen oder sogar Anführungszeichen vollständig überflüssig. Für jede Aussage in Nzym gibt es normalerweise zwei bis drei Teile, hauptsächlich in der Form:

Typname des Typs = Wert;
Typname.Typmethode = Wert2;
Klasse NameDerKlasse = InheritFrom;
Funktion NameOfFx = Rückgabetyp;
Methode NameDerMethode = Rückgabetyp;

Durch die Beseitigung der selten verwendeten, schlecht verstandenen und verwirrenden Funktionen von C++ und der manchmal verwirrenden Aspekte der C-Typsyntax, die für viele eine Menge Schmerz und Kummer verursacht hat, entstand eine einfachere Sprache.

Zu Beginn beschäftigte SM nur drei Vollzeitprogrammierer, von denen zwei Praktikanten der Universität waren. Die größte Herausforderung für sie bestand darin, statische Websites zu erstellen und zu replizieren, die auf verschiedene Arten von Kunden zugeschnitten waren, aber gleichzeitig die Produktionszeit verkürzen sollten. Natürlich würden sich die Stylesheets von Projekt zu Projekt unterscheiden, aber es gab Elemente, die in jedem Projekt vorhanden sein würden und die in allen Projekten vorhanden sein würden, insbesondere Navigation, Footer-Widgets, die Homepage, die Kontaktseite, eine Infoseite und eine Seite zum Hervorheben von Produkten und Anzeigen von Portfolios. Es musste eine einfachere Möglichkeit zum Prototyping und zur Produktion geben …

Ein weiterer Aspekt der Einfachheit ist die visuelle Portabilität. Eines der Ziele von Nzym ist es, die Erstellung von Medienanwendungen zu ermöglichen, die auf jeder Plattform ausgeführt werden können und dabei ihr visuelles Erscheinungsbild und ihre Attraktivität beibehalten. Die Verwendung von Cascading Stylesheets und Webtechnologieelementen zur Erstellung standardisierter visueller Anzeigen wurde zu einem zentralen Zielmerkmal der Nzym-Entwicklung. Das Erscheinungsbild eines Bildschirms in einem Browser, in einer mobilen Anwendung und in einer Desktopanwendung wird auf allen Plattformen gleich oder zumindest einheitlich sein.

Objektorientiert

Dies ist wohl eines der am häufigsten verwendeten Schlagworte, wenn es um die Beschreibung einer Programmiersprache geht, aber es ist tatsächlich ein Schlüsselkonzept bei der Beschreibung von Nzym. Objektorientierte Programmierung als Programmierparadigma basiert auf Objekten, die aus Daten und Code bestehen. In Nzym liegen die Daten in Form der Typen vor, die die verschiedenen Eigenschaften eines Objekts bilden, und der Code wird dann in den Methoden (den Prozeduren) gespeichert. Nzym verwendet objektorientiertes Design, da es die saubere Definition von Schnittstellen erleichtert und die Bereitstellung wiederverwendbarer Elemente ermöglicht.

Die objektorientierten Funktionen von Nzym entsprechen im Wesentlichen denen der meisten C-artigen Sprachen, die davor existierten, jedoch mit einer anderen Syntax und viel lockereren Regeln. Nzym-Skriptdateien sind die Schlüsselobjekte eines Nzym-Projekts und können darin Klassen enthalten, die ebenfalls als Objekte behandelt werden.

Bei der Arbeit an einer Website wusste das Team von SM, dass es immer gängige Elemente wie das Kontaktformular oder ein Dropdown-Menü neu erstellen musste, allerdings mit einigen vom Kunden gewünschten Änderungen. Da sie sich hauptsächlich mit der Erstellung statischer Websites beschäftigten, schien es eine gute Idee zu sein, diese gemeinsamen Elemente in separaten Dateien zu gruppieren, um sie bei Bedarf einfach in ein Projekt importieren zu können, wobei für den Kunden nur geringfügige Änderungen erforderlich waren. Beispielsweise Farbänderungen, das Hinzufügen oder Entfernen bestimmter Felder aus einem Formular oder die Aufnahme von Symbolen in das Menü.

Interpretiert

Nzym-Skriptdateien werden mithilfe des Nzym Builder-Interpreters (der Elephant genannt wird) interpretiert und die Ausgabe kann eine ganze Website in einer Nzym-Datei sein, die als Bibliothek für die Verwendung in anderen Nzym-Projekten dient, oder eine ctlyst-Datei, die Nzym-Bytecode ist und mit einer Implementierung von Nzym Console auf jedem Gerät oder Computer ausgeführt werden kann. Während Nzym Console jetzt für die meisten Betriebssysteme verfügbar ist, werden weitere Implementierungen entwickelt, die die Ausführung eines kompilierten Nzym-Programms auf jedem Gerät ermöglichen. Wenn jedoch ein Nzym-Programm in eine Website interpretiert wird, ist die Ausgabe sofort zum Portieren auf jedes Gerät oder einen Server zum Hosten verfügbar, normalerweise als statische Website.

Das Team bei SM verwendete Bootstrap oder eine damals vorhandene interne Boilerplate, um verschiedene Arten von Websites nachzubilden und zu generieren. Diese Codeblöcke hatten jedoch viele Nachteile, insbesondere bei der Anzeige auf verschiedenen Geräten und älteren Browsern.

Ein Hauptziel des Interpretationsprozesses bestand für Nzym auch darin, Produkte zu schaffen, die auf jedem Gerät und auf jeder Plattform funktionieren und dabei nicht nur die visuelle Portabilität, sondern auch die gleiche Funktionalität und Leistung aufweisen.

Imperativ

Nzym verwendet Anweisungen, um den Status des Programms zu ändern. Daher handelt es sich in diesem Fall um eine imperative Programmiersprache, die beschreibt, wie das Programm in jedem Schritt funktioniert. Nzym kann auch den Grundsätzen der prozeduralen Programmierung folgen, in dem Sinne, dass ein Programm mithilfe von Funktionen aus einer oder mehreren Prozeduren erstellt werden kann, wodurch die Statusänderungen auf bestimmte Methoden beschränkt werden können.

Eine Schwierigkeit bei der Arbeit des Teams bei SM bestand darin, genau zu bestimmen, wo die Elemente platziert werden sollten, die sie in jedem Projekt wiederverwendeten. Eine Website hatte ein Menüsystem oben auf der Seite über der Kopfzeile und eine andere hatte ein Menü unter der Kopfzeile. Manchmal wurde das Menü in der Kopfzeile zwischen anderen Kopfzeilenelementen platziert und manchmal war es getrennt davon. Zu wissen, wo der Codeblock mit den Menüs zu platzieren war, war eine Aufgabe, die viel Sorgfalt erforderte, und wenn man sein Projekt für eine Weile unterbrach, war es immer schwierig, es fortzusetzen. Es war ebenso irritierend, wenn jemand ein laufendes Projekt von einer anderen Person übernehmen musste und nicht auf einen Blick erkennen konnte, wohin das Projekt ging und was getan worden war.

Die imperative Programmierung für Nzym macht die Sprache leicht zu erlernen, da ein klarer Kontrollfluss angezeigt werden kann, der dem Benutzer mehr Möglichkeiten gibt, das Programm zu ändern und zu optimieren. Dies schafft auch mehr Effizienz in dem Sinne, dass der Programmierer dem Computerprogramm genau sagen kann, was es tun soll. Auf der prozeduralen Seite gibt es den Vorteil der Modularität, da ein Programm in kleinere wiederverwendbare Prozeduren zerlegt werden kann, die wiederum in anderen Programmen wiederverwendbar sein können. Auch das Debuggen ist aufgrund des imperativen Paradigmas viel einfacher.

Multiplattform

Nzym wurde nicht nur für das Internet, sondern für Multimediaanwendungen im Allgemeinen entwickelt. Unter Multimediaanwendungen verstehen wir interaktive Software, die verschiedene Medientypen wie Text, Bilder, Video und Audio kombiniert, um einem Publikum Informationen zu vermitteln. Diese Anwendungen sind der vorherrschende Softwaretyp, der auf verschiedenen Arten von Geräten und Hardware zu finden ist und verschiedene Betriebssysteme, Spielekonsolen und Verbrauchergeräte wie Mobiltelefone und Uhren umfasst.

Während die Arbeit an den Websites das Hauptgeschäft von SM war, gab es noch ein weiteres großes Projekt, an dem SM beteiligt war. Dabei ging es um die Arbeit an einem Multimedia-Softwarepaket namens AVisPar (African Visual Package). AVisPar war eine Reihe von Softwareprogrammen und Tools zum Erstellen von 3D-Visualisierungen, Filmen, Spielen, Spielressourcen und visuellen Effekten. Das Besondere an AVisPar war die Fähigkeit, mithilfe einer Grafikkarte hochwertige 3D-Renderings zu erstellen und diese nahezu in Echtzeit auf der Festplatte zu speichern. AVisPar wurde außerdem so entwickelt, dass es nicht nur auf den gängigsten kommerziellen Desktop-Betriebssystemen, sondern auch auf einigen Linux-Distributionen funktioniert.

Da Nzym Websites mit Web-Assets erstellen kann, einschließlich HTML-Seiten mit JavaScript und CSS, kann es als plattformübergreifend beschrieben werden. Wenn Nzym jedoch eine ctlyst-Datei erstellt, kann die Datei auf jeder Plattform ausgeführt werden, auf der eine Implementierung der Nzym-Konsole vorhanden ist.

Hohe Leistung

Was das ctlyst-Dateiformat betrifft, so ist die Nzym-Konsole so konzipiert, dass sie es direkt in Maschinencode für die jeweilige CPU konvertiert, auf der die Anwendung zur Laufzeit ausgeführt wird. Das Dateiformat ist so passend nach dem Wort Katalysator benannt, das sich auf das bezieht, was eine chemische Reaktion beschleunigt. In diesem Fall führt die Nzym-Konsole jedoch die ctlyst-Datei aus und ermöglicht so eine Umgebung, in der das Programm wie jede andere Anwendung auf dem System ausgeführt werden kann.

Die neueste Implementierung von Nzym und Nzym Console wurde mit Rust erstellt und hat fortan zusätzliche Hochleistungsmerkmale der Sprache geerbt, da der Rust-Compiler den Code auf Geschwindigkeit optimieren konnte. Darüber hinaus bietet die Rust-Standardbibliothek eine Reihe effizienter Algorithmen und Datenstrukturen, die bei der Erstellung des aktuellen Builds von Nzym verwendet wurden. Hier ein kurzer Überblick darüber, was dies für Nzym-Programme bedeutet:

  • Speichersicherheit : Das Eigentümersystem von Rust stellt sicher, dass der Speicher immer korrekt verwaltet wird, wodurch Speicherlecks und Abstürze verhindert werden können. Dies kann zu erheblichen Leistungsverbesserungen führen, da Nzym keine Zeit mit der manuellen Speicherverwaltung verbringen muss.
  • Effizienz : Der Compiler von Rust ist sehr gut darin, Code auf Geschwindigkeit zu optimieren. Das bedeutet, dass Nzym Console auch bei komplexen Aufgaben so schnell wie möglich ausgeführt werden kann.

Mehrfädig

Um eine beeindruckend leistungsstarke und interaktive Multimedia-Anwendung zu erstellen, muss man normalerweise interaktive Reaktionsfähigkeit in Echtzeit und eine bessere Synchronisierung aller beteiligten Elemente bewältigen können. Das bedeutet, dass die Anwendung mehrere Prozesse gleichzeitig bewältigen können muss, was mehrere Threads und gleichzeitig auftretende Ereignisse bedeutet.

AVisPar war für das SM-Team ein einzigartiges Projekt. Es ermöglichte viel Experimentieren hinsichtlich der Erstellung der entsprechenden Lösungen, aber das Team stand vor einem großen Problem, nämlich der Handhabung gleichzeitiger Ereignisse. Die ursprüngliche Codebasis von AVisPar war in C++ geschrieben und enthielt einige Bibliotheken anderer 3D-Spiele-Engines wie Irrlicht. Insbesondere die 3D-Spiele-Engine Irrlicht verfügte über einige Multithreading-Funktionen, die einfach zu verwenden und anzupassen waren, um mehrere Prozesse auf einer einzigen Maschine auszuführen. Wenn jedoch mehrere Threads in einem Netzwerk mit verschiedenen beteiligten CPUs und Grafikprozessoren ausgeführt wurden, wurde die Handhabung der Threads wirklich schwierig und kompliziert.

C und C++ sind herkömmlicherweise Single-Threaded und die Verwendung einiger Bibliotheken zur Erstellung mehrerer Threads führt zu denselben Nachteilen, mit denen die meisten Programmierer konfrontiert sind, wenn sie Java oder Objective C zur Erstellung von Multithread-Anwendungen verwenden. Normalerweise ergeben sich Probleme aus der Komplexität, da herausgefunden werden muss, wie die Threads interagieren, aus Leistungsproblemen, da das Betriebssystem zwischen Threads wechselt, wenn das Design nicht sorgfältig durchgeführt wird, und letztendlich aus einem höheren Ressourcenverbrauch. Nzym hingegen verwendet Rusts async/await-Modell für gleichzeitigen Code, wenn auf die Erstellung einer ctlyst-Datei zurückgegriffen wird. Nzym hat jedoch auch einen Fallback in Bezug auf die Verwendung von Web Workers, ähnlich wie JavaScript, da mehrere Threads für Website-Projekte in JavaScript konvertiert werden können und dann von der verbesserten Leistung, Reaktionsfähigkeit und Skalierbarkeit profitieren, von der JavaScript-Anwendungen mit mehreren Threads profitieren.

Dynamisch

Nzym wird noch immer weiterentwickelt und entwickelt sich ständig weiter. Es wurde so konzipiert, dass es sich an eine sich bereits ständig weiterentwickelnde technologische Landschaft anpasst. Mit der kontinuierlichen Entwicklung und Erweiterung der Nzym-Konsole und ihrer Implementierungen kann Nzym zur bevorzugten Sprache für die Erstellung von Anwendungen für tragbare und mobile Geräte, einschließlich Smartwatches und Smartphones, werden.

Von Anfang 2011 bis Ende 2012 verzeichnete SM einen Anstieg der Kunden, die die Dienste von SM in Anspruch nahmen, um mobile Anwendungen für sie zu entwickeln. SM verwendete Java, um Apps für Smartphones dieser Zeit zu erstellen, die Java unterstützten, darunter auch Android-Telefone, die damals einen großen Marktanteil gewannen. Das Problem bestand darin, dass der Code für diese Plattformen, obwohl in derselben Sprache geschrieben, nicht derselbe war und nicht sein konnte. Die visuelle Darstellung war nicht portierbar und die Funktionalität sowie die bei der Entwicklung verwendeten Bibliotheken unterschieden sich stark.

Java war einst die bevorzugte Sprache für die Entwicklung mobiler Sprachen, hat aber in den letzten Jahren gegenüber neueren Sprachen wie Kotlin und Swift an Boden verloren. Die Hauptprobleme von Java waren und bleiben

  • Leistung : Java ist nicht so leistungsfähig wie einige der neueren Sprachen, was zu langsameren Apps führen kann.
  • Komplexität : Java ist eine komplexe Sprache, die das Erlernen und Verwenden erschweren kann.
  • Fragmentierung : Es gibt viele verschiedene Java-Versionen, was die Entwicklung von Apps, die auf allen Geräten funktionieren, erschweren kann.

Obwohl Java aufgrund seines Ökosystems aus Bibliotheken und Tools, der Unterstützung durch viele Anbieter und seiner Reife weiterhin beliebt für die Entwicklung mobiler Anwendungen ist, gewinnen neuere Sprachen an Boden. Mit der Initiative von Nzym, diesem Weg zu folgen und das Erstellen und Portieren von Anwendungen auf so viele Geräte wie möglich mit einer einzigen Codebasis einfacher, besser und schneller zu machen, ist Nzym zweifellos eine Sprache, die man im Auge behalten sollte, da sie auf dieses Ziel hinarbeitet.


Abschluss

Nzym ist eine neue Programmiersprache, die einfach, elegant und leistungsstark sein soll. Obwohl sie sich noch in der Anfangsphase befindet, soll sie die erste Wahl für Programmierer werden, die objektorientierte Medienanwendungen und Websites erstellen möchten. Dank ihrer Einfachheit sind geschweifte Klammern und Anführungszeichen für Zeichenfolgen nicht mehr erforderlich, und die Syntax ist einfacher und direkter.

Aktuelle Entwicklung

Die ursprüngliche Implementierungssprache von Nzym war C++, aber mit dem Erscheinen und der Veröffentlichung der ersten stabilen Version von Rust 1.0 im Jahr 2015 wechselten Entwicklung und Produktion von Nzym zur neuen Sprache. Die Entscheidung für eine Sprache, die Speichersicherheit erzwingt, ohne dass Garbage Collection oder Referenzzählung erforderlich sind, schien eine großartige Option für eine Sprache zu sein, mit der leistungsstarke Medienanwendungen mit hoher Leistung und sehr wenigen Fehlern erstellt werden können.

Zukünftige Entwicklung

Da Nzym noch in der Entwicklung ist, sind für zukünftige Versionen eine Reihe von Funktionen geplant. Zu diesen Funktionen gehören:
  • Vorgefertigte Bibliotheken für eine einfachere und schnellere App-Erstellung
  • Leistungsstärkere Klassen und Objekte
  • Ein besserer Debugger
  • Eine einfache, aber benutzerfreundlichere IDE
Nzym ist eine vielversprechende neue Programmiersprache, die das Potenzial hat, eine beliebte Wahl für objektorientierte Programmierung zu werden. Sie ist eine gute Wahl für Programmierer, die einfache, elegante und schnelle Anwendungen erstellen möchten, insbesondere für verschiedene Plattformen, darunter Mobilgeräte und das Internet. Für weitere Informationen senden Sie eine E-Mail an hello@nzym.org.
Tags
  • #Technik
Icon
THANK YOU

You will receive an email with a download link. To access the link, please check your inbox or spam folder