From d05d8f76dd37815d6dec2f8866cab80d0b28dd3d Mon Sep 17 00:00:00 2001 From: boryanagoncharenko <3010723+boryanagoncharenko@users.noreply.github.com> Date: Fri, 17 Jan 2025 11:07:56 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9C=20Fix=20daily=20weblate=20errors?= =?UTF-8?q?=20(#6109)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Translated using Weblate (Turkish) Currently translated at 90.9% (424 of 466 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (403 of 403 strings) Translated using Weblate (Turkish) Currently translated at 90.7% (423 of 466 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (24 of 24 strings) Translated using Weblate (Turkish) Currently translated at 56.8% (421 of 740 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (67 of 67 strings) Translated using Weblate (English) Currently translated at 100.0% (403 of 403 strings) Translated using Weblate (English) Currently translated at 100.0% (403 of 403 strings) Translated using Weblate (English) Currently translated at 100.0% (466 of 466 strings) Translated using Weblate (English) Currently translated at 100.0% (740 of 740 strings) Translated using Weblate (Ukrainian) Currently translated at 99.7% (402 of 403 strings) Translated using Weblate (Turkish) Currently translated at 62.0% (250 of 403 strings) Translated using Weblate (Turkish) Currently translated at 90.7% (423 of 466 strings) Translated using Weblate (Turkish) Currently translated at 68.1% (441 of 647 strings) Translated using Weblate (Turkish) Currently translated at 56.0% (415 of 740 strings) Translated using Weblate (English) Currently translated at 100.0% (403 of 403 strings) Translated using Weblate (English) Currently translated at 100.0% (740 of 740 strings) Co-authored-by: Yılmaz Durmaz Translate-URL: https://hosted.weblate.org/projects/hedy/adventures/en/ Translate-URL: https://hosted.weblate.org/projects/hedy/adventures/tr/ Translate-URL: https://hosted.weblate.org/projects/hedy/client-messages/tr/ Translate-URL: https://hosted.weblate.org/projects/hedy/keywords/tr/ Translate-URL: https://hosted.weblate.org/projects/hedy/slides/en/ Translate-URL: https://hosted.weblate.org/projects/hedy/slides/tr/ Translate-URL: https://hosted.weblate.org/projects/hedy/slides/uk/ Translate-URL: https://hosted.weblate.org/projects/hedy/web-texts/tr/ Translate-URL: https://hosted.weblate.org/projects/hedy/webpages/en/ Translate-URL: https://hosted.weblate.org/projects/hedy/webpages/tr/ Translation: Hedy/Adventures Translation: Hedy/Keywords Translation: Hedy/Texts Translation: Hedy/Webpages Translation: Hedy/client-messages Translation: Hedy/slides * Translated using Weblate (Ukrainian) Currently translated at 99.0% (399 of 403 strings) Translated using Weblate (Ukrainian) Currently translated at 99.6% (645 of 647 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (740 of 740 strings) Translated using Weblate (Ukrainian) Currently translated at 99.7% (738 of 740 strings) Co-authored-by: Максим Горпиніч Translate-URL: https://hosted.weblate.org/projects/hedy/adventures/uk/ Translate-URL: https://hosted.weblate.org/projects/hedy/slides/uk/ Translate-URL: https://hosted.weblate.org/projects/hedy/web-texts/uk/ Translation: Hedy/Adventures Translation: Hedy/Texts Translation: Hedy/slides * Translated using Weblate (German) Currently translated at 90.9% (673 of 740 strings) Co-authored-by: Bob Idle <102661087+bobidle@users.noreply.github.com> Translate-URL: https://hosted.weblate.org/projects/hedy/adventures/de/ Translation: Hedy/Adventures * Translated using Weblate (French) Currently translated at 60.8% (394 of 647 strings) Co-authored-by: pinage404 Translate-URL: https://hosted.weblate.org/projects/hedy/web-texts/fr/ Translation: Hedy/Texts * Fix failing and incorrect snippets * 🤖 Automatically update generated files --------- Co-authored-by: Yılmaz Durmaz Co-authored-by: Максим Горпиніч Co-authored-by: Bob Idle <102661087+bobidle@users.noreply.github.com> Co-authored-by: pinage404 Co-authored-by: boryanagoncharenko --- content/adventures/de.yaml | 128 ++++----- content/adventures/en.yaml | 10 +- content/adventures/tr.yaml | 18 +- content/adventures/uk.yaml | 18 +- content/client-messages/tr.yaml | 11 +- content/keywords/tr.yaml | 17 ++ content/pages/en.yaml | 20 +- content/pages/tr.yaml | 28 +- content/slides/de.yaml | 4 +- content/slides/en.yaml | 26 +- content/slides/tr.yaml | 368 ++++++++++++++++++------ content/slides/uk.yaml | 14 +- grammars/keywords-tr.lark | 6 +- highlighting/highlighting-trad.json | 10 +- static/js/appbundle.js | 14 +- static/js/appbundle.js.map | 2 +- static/js/message-translations.ts | 4 +- translations/fr/LC_MESSAGES/messages.po | 10 +- translations/tr/LC_MESSAGES/messages.po | 8 +- translations/uk/LC_MESSAGES/messages.po | 19 +- 20 files changed, 480 insertions(+), 255 deletions(-) diff --git a/content/adventures/de.yaml b/content/adventures/de.yaml index 1c8dc82f162..fb03b30012f 100644 --- a/content/adventures/de.yaml +++ b/content/adventures/de.yaml @@ -265,7 +265,7 @@ adventures: ``` add_remove_command: name: '{add} {to_list} & {remove} {from}' - description: Einführung von {add} {to_list} und {remove} {from} + description: Einführung von {add} {to} und {remove} {from} levels: 3: story_text: | @@ -458,10 +458,10 @@ adventures: Großartig! Fast alle Punkte können jetzt berechnet werden. Bis auf eine Ausnahme: 2 Asse. Wenn du 2 Asse bekommst, gibt es dafür 12 Punkte und nicht 22 (weil du mit 22 Punkten schon verloren hättest). Das gilt natürlich auch für den Geber. ***Zeige den Punktestand*** - Zuletzt soll das Program noch ausgeben, welchen Karte du gezogen hast und wieviele Punkte es dafür gibt. Dann zeige, welche Karten der Geber hat und wie viele Punkte sie zählen. + Zuletzt soll das Programm noch ausgeben, welchen Karte du gezogen hast und wie viele Punkte es dafür gibt. Dann zeige, welche Karten der Geber hat und wie viele Punkte sie zählen. - ***Weiter geht es mit dem nächsten Tab*** - Ausgezeichnet! Du hast diesen Teil des Spiels beendet! Kopiere dein Programm und gehe zum nächsten Tab um zu lernen, wie du nach einer extra Karte fragen und den Gewinner bestimmen kannst. + ***Weiter geht es mit dem nächsten Abenteuer*** + Ausgezeichnet! Du hast diesen Teil des Spiels beendet! Kopiere dein Programm und gehe zum nächsten Abenteuer um zu lernen, wie du nach einer extra Karte fragen und den Gewinner bestimmen kannst. example_code: | ``` # Kopiere deine Programm aus dem vorherigen Abenteuer hier her @@ -498,11 +498,11 @@ adventures: levels: 17: story_text: | - In den vorherigen Tabs hast du gelernt, wie du 2 zufällige Karten für dich und den Geber ziehen kannst und zu berechnen, wie viele Punkte ihr beiden habt. + In den vorherigen Abenteuern hast du gelernt, wie du 2 zufällige Karten für dich und den Geber ziehen kannst und zu berechnen, wie viele Punkte ihr beiden habt. In diesem Abenteuer fügen wir für dich und den Geber die Möglichkeit hinzu, nach einer weiteren Karte zu fragen. ### Übung - ***Füge dein Programm aus dem vorherigen Abenteuer ein*** Kopiere zunächst das Programm aus dem vorherigen Tab und füge es hier ein. + ***Füge dein Programm aus dem vorherigen Abenteuer ein*** Kopiere zunächst das Programm aus dem vorherigen Abenteuer und füge es hier ein. ***Extra Karte für dich*** Wenn du willst, kannst du eine weitere Karte bekommen, um mit deinen Gesamtpunkten so nah wie möglich an 21 zu kommen. Frage zuerst den Spieler, ob er noch eine Karte will. Falls ja, wähle eine zufällige Karte und drucke, was gezogen wurde. Falls die Karte kein Ass ist, kannst du die Funktion aufrufen und die Punkte zu deinen Gesamtpunkten hinzuzählen. @@ -608,19 +608,19 @@ adventures: zahl_1 = _ zahl_2 = _ richtige_antwort = zahl_1 * zahl_2 - gegebene_antwort = 'Was ist ' zahl_1 ' mal ' zahl_2 '?' + gegebene_antwort = {ask} 'Was ist ' zahl_1 ' mal ' zahl_2 '?' {if} _ {else} _ ``` 9: story_text: | - In Level 6 hast du einen Taschenrechner erstellt. In diesem Level kannst du den Code erweitern, so dass er mehrere Fragen stellt. + Im vorhergehenden Level hast du einen Taschenrechner erstellt. In diesem Level kannst du den Code erweitern, so dass er mehrere Fragen stellt. ### Übung 1 Kannst du Zeile 10 vervollständigen, damit das Programm funktioniert? ### Übung 2 - Gib dem Spieler eine Rückmeldung, wenn er eine richtige oder falsche Antwort eingegeben hat. Um das zu erreichen, erweitere dein Programm mit einem `{else}`. + Gib dem Spieler eine Rückmeldung, wenn er eine richtige oder falsche Antwort eingegeben hat, beispielsweise mit `{print} 'Richtig!'` oder `{print} 'Falsch! Die richtige Antwort ist ' richtige_antwort`. example_code: | ``` Punkte = 0 @@ -725,7 +725,7 @@ adventures: * Dann setzen wir den Rückgabewert. Wir wollen den Durchschnitt zurückgeben, also gesamt geteilt durch die Anzahl Tests (4). * Zuletzt vervollständigen wir den Code indem wir die Funktion in Zeile 8 aufrufen. - Hast du es hingekriegt? Wirklich toll! Willst du noch andere Sachen mit deinem Taschenrechner machen? **Dieses Abenteuer geht auf dem nächsten Tab weiter!** + Hast du es hingekriegt? Wirklich toll! Willst du noch andere Sachen mit deinem Taschenrechner machen? **Im nächsten Abenteuer geht es weiter!** example_code: | ``` {define} berechne_notendurchschnitt @@ -733,7 +733,7 @@ adventures: {for} i {in} {range} 1 {to} 4 note = {ask} _ gesamt = gesamt + _ - return _ / 4 + {return} _ / 4 notendurchschnitt = {call} _ {print} 'Dein Notendurchschnitt ist ' notendurchschnitt @@ -753,7 +753,7 @@ adventures: 14: story_text: | ### Übung 2 - **Das ist der zweite Teil dieses Abenteuers.** Das Abenteuer startet im vorherigen Tab. + **Das ist der zweite Teil dieses Abenteuers.** Das Abenteuer startet im vorherigen Abenteuer. Natürlich willst du nicht immer nur den Durchschnitt von 4 Tests berechnen. Vielleicht willst du den Mittelwert von 10 Tests oder nur 2 berechnen? Du kannst das Problem beheben, indem du ein Argument und die Variable 'anzahl_von_tests' ergänzt. * Beginne eine neue Zeile in der Zeile 3. Setze die anzahl_von_tests indem du die Schüler:in danach fragst, wie viele Tests geschrieben wurden. @@ -969,9 +969,6 @@ adventures: preis = menge * 6 {print} 'Das kostet 'preis euro' bitte' ``` - - preis = menge * 6 - {print} 'Das kostet 'preis euro' bitte' 10: story_text: |- ### Übung @@ -1013,7 +1010,7 @@ adventures: tage = 30 {if} monat = Februar schaltjahre = 2020, 2024, 2028, 2036, 2040, 2044, 2028 - jahr = ask 'Welches Jahr haben wir?' + jahr = {ask} 'Welches Jahr haben wir?' {if} jahr {in} schaltjahre tage = 29 {else} @@ -1071,12 +1068,12 @@ adventures: empfohlener_file = komödien {at} {random} {if} stimmung {is} 'romantisch' empfohlener_file = romantische_filme - {if} stimmung is 'komödie' + {if} stimmung {is} 'komödie' empfohlener_film = komödien {at} {random} {print} 'Ich würde dir ' empfohlener_file ' für ' name ' empfehlen.' - {name} = {ask} 'Wer will den Film sehen?' + name = {ask} 'Wer will den Film sehen?' empfehlung = {ask} 'Möchtest du gerne eine Empfehlung?' {if} empfehlung {is} 'ja' {print} filmempfehlung {with} name @@ -1238,11 +1235,11 @@ adventures: levels: 1: story_text: | - Willkommen bei Hedy! In Level 1 kannst du anfangen eine Geschichte auszugeben. + Willkommen bei Hedy! In Level 1 kannst du anfangen eine Geschichte auszugeben. Probiere den Code selbst mit der grünen Schaltfläche 'Programm ausführen' unter dem Programmierfeld aus. - Bereit? Dann gehe zum nächsten Tab um deinen ersten Befehl zu lernen! + Bereit? Dann gehe zum nächsten Abenteuer um deinen ersten Befehl zu lernen! example_code: | ``` {print} Hallo Welt! @@ -1252,8 +1249,9 @@ adventures: Glückwunsch! Du hast Level 2 erreicht. Hoffentlich hast du bereits einige tolle Programme erstellt! Auf Level 1 ist dir vielleicht aufgefallen, dass der Befehl `{echo}` jeweils nur einen Teil an Information speichern kann. Im Restaurant-Abenteuer konntest du beispielsweise in einem Satz wiedergeben, was der Kunde essen oder trinken möchte, aber nicht beides. - Das ändert sich in Level 2. In Level 2 lernst du, mit Variablen zu arbeiten. Diese erlauben es, mehrere Informationen zu speichern und an jedem beliebigen Ort auszudrucken. - Gehen wir also zum nächsten Tab! + + Das ändert sich in Level 2. In Level 2 lernst du, mit Variablen zu arbeiten. Diese erlauben es, mehrere Informationen zu speichern und an jedem beliebigen Ort auszugeben. + Gehen wir also zum nächsten Abenteuer! example_code: | **Warnung! Dieser Code funktioniert nicht!** In Hedy ändern sich die Befehle manchmal. `{echo}` funtioniert beispielsweise nur auf Level 1. Auf diesem Level lernst du eine bessere Möglichkeit, Antworten zurückzugeben. @@ -1269,7 +1267,7 @@ adventures: Im vorherigen Level hast du gelernt, was eine Variable ist und wie du sie verwenden kannst, um deine Abenteuer interaktiver zu gestalten. Aber... das ist nicht das Einzige, was du mit Variablen machen kannst! Du kannst Variablen auch zum Erstellen von Listen verwenden. Und du kannst Hedy sogar ein zufälliges Wort aus einer Liste auswählen lassen, wodurch du echte Spiele erstellen kannst! - Wirf einen kurzen Blick auf den nächsten Tab! + Wirf einen kurzen Blick auf das nächste Abenteuer! 4: story_text: | In den vorherigen Levels hast du mit Variablen geübt, bist aber möglicherweise auf dieses Problem gestoßen. @@ -1325,22 +1323,8 @@ adventures: Du kannst jetzt mehrere Zeilen gruppieren, aber du musst den Code dafür *einrücken*. Das bedeutet, dass du die Befehlszeilen mit vier Leerzeichen beginnen musst. Das gilt auch, wenn du einen Block mit nur einer Zeile schreiben möchtest. example_code: | - Der `{repeat}` Befehl funktioniert jetzt so: - ``` - {repeat} 5 {times} - {print} 'Hallo zusammen' - {print} 'Das hier wird fünf Mal wiederholt' ``` - Die Befehle `{if}` und `{else}` funktionieren jetzt so: - - ``` - name {is} {ask} 'Wie heißt du?' - {if} name {is} Hedy - {print} 'Willkommen Hedy' - {print} 'Du kannst an deinem Computer spielen' - {else} - {print} 'EINDRINGLING!' - {print} 'Du darfst diesen Rechner nicht benutzen!' + {repeat} 5 {times} {print} 'Im nächsten Abenteuer kannst du mehrere Zeilen auf einmal ausgeben! ``` 9: story_text: | @@ -1481,7 +1465,7 @@ adventures: example_code: | ``` Würfelseiten {is} 1, 2, 3, 4, 5, Regenwurm - {print} Du warfst _ {at} {random} + {print} Du warfst _ {at} {random} ! ``` story_text_2: | ### Übung @@ -1509,7 +1493,7 @@ adventures: ``` würfelseiten {is} 1, 2, 3, 4, 5, Regenwurm wurf {is} würfelseiten {at} {random} - {print} 'Du hast gewürfelt: ' würfelseiten + {print} 'Du hast gewürfelt: ' wurf _ wurf {is} Regenwurm {print} 'Du kannst aufhören zu würfeln.' _ {print} 'Du musst nochmal würfeln!' ``` @@ -1531,13 +1515,13 @@ adventures: {print} 'Jetzt hast Du ' Punkte ' Punkte.' ``` example_code_2: | - Ist es dir gelungen, die Gesamtpunktzahl für 8 Würfel auszurechnen? Dafür musstest du ganz schön viel hin und her kopieren, oder?In Level 7 machen wir das einfacher! + Ist es dir gelungen, die Gesamtpunktzahl für 8 Würfel auszurechnen? Dafür musstest du ganz schön viel hin und her kopieren, oder? In Level 7 machen wir das einfacher! 7: story_text: | - Auch in Level 5 kannst du wieder einen Würfel programmieren. Mit dem Befehl `{repeat}` kannst du ganz einfach eine ganze Handvoll Würfel werfen. + Auch in diesem Level kannst du wieder einen Würfel programmieren. Mit dem Befehl `{repeat}` kannst du ganz einfach eine ganze Handvoll Würfel werfen. ### Übung - Versuche, den Beispiel-Code zu vervollständigen! **(extra)** Denke an ein Spiel, das du kennst, bei dem es um Würfel geht und programmiere es mit dem Befehl `{repeat}`. + Versuche, den Beispiel-Code zu vervollständigen! **Extra** Denke an ein Spiel, das du kennst, bei dem es um Würfel geht und programmiere es mit dem Befehl `{repeat}`. example_code: | ``` Würfelseiten = 1, 2, 3, 4, 5, 6 @@ -1625,8 +1609,8 @@ adventures: Wenn Du ganz großes Pech hast, könnte Dich das vorigen Programm für die ganze Woche als Abwäscher bestimmen. Das ist ungerecht! Um das System gerechter zu gestalten, kannst Du mit dem Befehl `{remove}` die ausgewählt Person von der Liste entfernen. Auf diese Weise musst Du nicht nochmal abwaschen, bis jeder einmal dran war. - Montag and Dienstag sind schon vorbereitet! Kannst Du den Rest der Woche vervollständigen? - Und... Kannst Du dir etwas einfallen lassen für den Fall, dass die Liste leer ist? + Montag und Dienstag sind schon vorbereitet! Kannst Du den Rest der Woche vervollständigen? + Und… Kannst Du dir etwas einfallen lassen für den Fall, dass die Liste leer ist? example_code_2: | ``` Familienmitglieder = Mama, Papa, Emma, Sophie @@ -1685,7 +1669,6 @@ adventures: tierarten = Hunde, Katzen, Blobfische {for} art {in} tierarten {print} 'Ich mag ' art - ``` story_text_2: | ### Übung @@ -1706,7 +1689,7 @@ adventures: In diesem Level fügen wir eine neue Form des Befehls `{for}` hinzu. In früheren Leveln haben wir `{for}` mit Listen benutzt, aber wir können `{for}` auch mit Zahlen verwenden. Dies machen wir, indem wir einen Variablennamen und dann `{in}` `{range}` schreiben. Dahinter schreiben wir die Zahl bei der es losgehen soll, `{to}` und dann die Zahl, wo es aufhört. - Probiere das Beispiel aus, um zu sehen was passiert! In diesem Level musst du wieder Einrückung in den Zeilen unter dem `{for}` anwenden. + Probiere das Beispiel aus, um zu sehen was passiert! In diesem Level musst du wieder Einrückungen in den Zeilen unter dem `{for}` anwenden. example_code: | ``` {for} zähler {in} {range} 1 {to} 10 @@ -1725,6 +1708,7 @@ adventures: 18: story_text: | Zuletzt, machen wir aus `{for} i {in} {range} 1 {to} 5` so richtigen Python Code: + example_code: "```\n{for} i {in} {range}(1,5):\n {print} (i)\n```\n" name: '{for}' fortune: name: Wahrsagerin @@ -1858,7 +1842,7 @@ adventures: Frage = {ask} 'Was möchtest du wissen?' {print} Frage {sleep} - {print} 'Meine Kristallkugel sagt...' Antworten {at} {random} + {print} 'Meine Kristallkugel sagt... ' Antworten {at} {random} ``` 10: story_text: | @@ -1934,7 +1918,7 @@ adventures: 13: story_text: | Nun, da du gelernt hast, wie Funktionen verwendet werden, wirst du lernen, wie du eine Funktion mit einem Argument verwenden kannst. - EIn **Argument** ist eine Variable, die in einer Funktion verwendet wird. Ausserhalb der Funktion wird sie nicht verwendet. + Ein **Argument** ist eine Variable, die in einer Funktion verwendet wird. Außerhalb der Funktion wird sie nicht verwendet. In diesem Code haben wir die beispielsweise die erste Strophe des Liedes 'My Bonnie is over the ocean' programmiert. Im Beispielcode wird das Argument `ort`verwendet. Ort ist eine Variable, die nur in der Funktion genutzt wird, also ein Argument. @@ -1944,10 +1928,12 @@ adventures: ### Übung Die nächste Strophe des Liedes geht so: + ```not_hedy_code Last night as I lay on my pillow Last night as I lay on my bed Last night as I lay on my pillow I dreamed that my Bonnie is dead + ``` Kannst Du diese Strophe so programmieren wie das Beispiel? 14: @@ -2104,7 +2090,8 @@ adventures: Monster_3 {is} 👶 {print} Du gehst ins Spukhaus. {print} Plötzlich siehst du ein Monster_1 - {print} Du läufst in den anderen Raum, aber ein Monster_2 wartet dort auf dich! + {print} Du läufst in den anderen Raum... + {print} Aber ein Monster_2 wartet dort auf dich! {print} Oh nein! Schnell flitzt du in die Küche. {print} Aber als du reinkommst greift dich Monster_3 an! ``` @@ -2119,7 +2106,8 @@ adventures: Monster3 {is} _ {print} Du betrittst das Spukhaus. {print} Plötzlich siehst du ein Monster1 - {print} Du rennst in den anderen Raum, aber ein Monster2 wartet dort auf dich! + {print} Du rennst in den anderen Raum... + {print} Aber ein Monster2 wartet dort auf dich! {print} Oh nein! Schnell in die Küche. {print} Aber als du hineingehst attackiert dich Monster3 ! ``` @@ -2231,7 +2219,7 @@ adventures: 2. Stelle sicher, dass der Spieler eine Möglichkeit auswählen kann. Nutze `{ask}` 3. Ist die Antwort richtig? Dann darf er zum nächsten Monster fortfahren. Gibt er eine falsche Antwort? Lass es den Spieler mit `{print}` wissen. - **(extra)** Wenn man eine falsche Wahl trifft, wird immer noch ein Monster angezeigt! Wie könntest du das ändern? + **Extra** Wenn man eine falsche Wahl trifft, wird immer noch ein Monster angezeigt! Wie könntest du das ändern? example_code: | ``` {print} 'Entkomme aus dem Spukhaus!' @@ -2817,11 +2805,11 @@ adventures: example_code: | ``` {print} Ich bin Hedy der Papagei. - Name {is} {ask} Wie lautet Dein Name? + Name _ _ Wie lautet Dein Name? {print} Name - {sleep} + _ {print} Aaaaaak - {sleep} + _ {print} Name ``` story_text_2: | @@ -2831,7 +2819,7 @@ adventures: story_text: | Bringe Deinem Papageien mit dem Befehl `{add}` neue Wörter bei. ### Übung - Kannst du den `{add} {to_list}` Befehl hinzufügen, so dass der Code funktioniert? + Kannst du den `{add} {to}` Befehl hinzufügen, so dass der Code funktioniert? example_code: | ``` Wörter {is} Aaaaaaak, Hedy @@ -2884,7 +2872,7 @@ adventures: ### Übung Beende den Code, um zu berechnen, wie viel Geld du hast und wie lange du sparen musst, um dir zu kaufen, was du willst! - **(extra)** Vielleicht hast du schon etwas Geld gespart? Ziehe das von dem Betrag ab, den du noch sparen musst. + **Extra** Vielleicht hast du schon etwas Geld gespart? Ziehe das von dem Betrag ab, den du noch sparen musst. example_code: | ``` {print} 'Das digitale Sparschwein' @@ -2955,7 +2943,7 @@ adventures: ### Übung Der Code, den du in Level 5 gesehen hast, prüft die Taste nur einmal. Kopiere den Beispielcode und füge ein `{repeat}` hinzu, so dass du die Tasten mehrmals drücken kannst. Benutze diesen Code, um etwas Schönes zu zeichnen. 9: - story_text: "Da du jetzt weißt wie man Befehle kombiniert, kannst du mit Hilfe von `{pressed}` ein Touch-Type-Tool erstellen. \n\n### Übung\nVervollständige den Code. Jedes Mal soll ein zufälliger Buchstabe ausgewählt werden. Diesen muss man drücken. Du bekommst einen Punkt für die richtige Taste und zwei Punkte Abzug für die falsche Taste.\n**(extra)** Lösche den Bildschirm nach jedem Buchstaben und zeige dem Benutzer, wie viele Punkte er erreicht hat.\n" + story_text: "Da du jetzt weißt wie man Befehle kombiniert, kannst du mit Hilfe von `{pressed}` ein Touch-Type-Tool erstellen. \n\n### Übung\nVervollständige den Code. Jedes Mal soll ein zufälliger Buchstabe ausgewählt werden. Diesen muss man drücken. Du bekommst einen Punkt für die richtige Taste und zwei Punkte Abzug für die falsche Taste.\n**Extra** Lösche den Bildschirm nach jedem Buchstaben und zeige dem Benutzer, wie viele Punkte er erreicht hat.\n" example_code: "```\nPunkte = 0\nBuchstaben = a, b, c, d, e\n{repeat} 10 {times}\n Buchstabe = _ _ _ \n {print} 'Drück den Buchstaben ' Buchstabe\n {if} Buchstabe {is} {pressed}\n _\n _\n _\n```\n" print_command: levels: @@ -3356,7 +3344,7 @@ adventures: ### Übung Kannst du die Lücken füllen? Hedy muss diese Frage so oft wiederholen wie Leute da sind. Wenn also 5 Leute da sind, muss die Frage 5 mal gestellt werden. - **(extra)** Erweitere deinen Code mit mehr Fragen, zum Beispiel zu Getränken oder Soßen. + **Extra** Erweitere deinen Code mit mehr Fragen, zum Beispiel zu Getränken oder Soßen. example_code: | ``` {print} 'Willkommen im Restaurant Chez Hedy' @@ -3419,7 +3407,7 @@ adventures: example_code_2: | ``` _ Kurse = Vorspeise, Hauptgericht, Nachtisch - _ Namen = Timon, Onno + _ Namen = Timon, Ono _ {for} Name {in} Namen _ {for} Kurs {in} Kurse _ Essen = {ask} Name ', Was möchten Sie als ' Kurs '?' @@ -3433,7 +3421,7 @@ adventures: Beende den Restaurant-Code, sodass du nach den Bestellungen mehrerer Gäste fragen kannst. Gib jedes Mal die Bestellnummer aus: 'Bestellung 1', 'Bestellung 2', usw. Bist du dir nicht sicher, wie du das anstellen sollst? Schau dir deinen Level 8 Code an. - **(extra)** In Level 9 benutzte das Restaurant auch Preise. Das kannst du hier ebenfalls hinzufügen! + **Extra** In Level 9 benutzte das Restaurant auch Preise. Das kannst du hier ebenfalls hinzufügen! example_code: | ``` {print} 'Willkommen im Restaurant Hedy!' @@ -3590,7 +3578,7 @@ adventures: ### Übung Kannst du den Code vervollständigen? Das Programm muss für jede Kombination sagen, wer gewonnen hat. - **(extra)** Möchtest du mehr als eine Runde spielen? Erweitere den Code, sodass du mehrere Runden spielen kannst. Du kannst sogar ein `{ask}` verwenden, um die Nutzer zu fragen, wie viele Runden sie spielen möchten. + **Extra** Möchtest du mehr als eine Runde spielen? Erweitere den Code, sodass du mehrere Runden spielen kannst. Du kannst sogar ein `{ask}` verwenden, um die Nutzer zu fragen, wie viele Runden sie spielen möchten. example_code: | ``` Auswahl = Schere, Stein, Papier @@ -3695,7 +3683,7 @@ adventures: example_code: | ``` Name = {ask} 'Wie heißt du?' - if Name {is} '_' + {if} Name {is} _ a = 'Geh zum Flughafen ' {else} a = 'Geh zum Bahnhof ' @@ -3703,7 +3691,7 @@ adventures: {if} Passwort {is} _ b = 'Morgen um 2 Uhr' {else} - b = 'Morgen um 10 Uhr' + b = 'Heute um 10 Uhr' {print} _ _ _ ``` 13: @@ -3824,7 +3812,7 @@ adventures: ### Übung 2 Gib das Lied Fünf kleine Affen springen auf dem Bett aus. Schlag den Text nach, falls du dich nicht daran erinnerst. - **(extra)** Gib das Lied Old MacDonald hat 'ne Farm aus und stelle sicher, dass alle Tiere ein unterschiedliches Geräusch machen, indem du `{if}` benutzt. + **Extra** Gib das Lied Old MacDonald hat 'ne Farm aus und stelle sicher, dass alle Tiere ein unterschiedliches Geräusch machen, indem du `{if}` benutzt. example_code_2: | ``` affen = 5, 4, 3, 2, 1 @@ -3965,8 +3953,11 @@ adventures: In diesen Level kann du Variablen nutzen, um die Schildkröte interaktiv zu machen. Du kannst zum Beispiel die Spieler fragen, wie viele Schritte die Schildkröte machen soll. example_code: | ``` - antwort {is} {ask} Wie viele Schritte soll die Schildkröte machen? - {forward} antwort + {forward} 80 + {turn} 90 + {forward} 50 + {turn} 180 + {forward} 100 ``` story_text_2: | In Level 1 konnte sich die Schildkröte außerdem nur nach links oder rechts drehen. Das ist ein bisschen langweilig! @@ -3984,6 +3975,8 @@ adventures: {forward} 25 {turn} winkel {forward} 25 + {turn} winkel + {forward} 25 ``` 3: story_text: | @@ -4503,6 +4496,7 @@ adventures: ``` {for} Zahl {in} {range} _ {to} _ {print} Zahl + {sleep} {print} 'Frohes neues Jahr!' ``` tic: diff --git a/content/adventures/en.yaml b/content/adventures/en.yaml index 8908ba5347f..c4b1f5e56ac 100644 --- a/content/adventures/en.yaml +++ b/content/adventures/en.yaml @@ -2151,18 +2151,18 @@ adventures: ***Paste your code*** Copy your code from the previous adventure and paste the code in the programming field. - ***The game*** This games continues playing until Player 2 is game over. Fill in the while command accordingly. Now, Player 2 is allowed to guess a letter, so ask Player 2 to guess a letter. + ***The game*** This game continues playing until Player 2 is game over. Fill in the while command accordingly. Now, Player 2 is allowed to guess a letter, so ask Player 2 to guess a letter. We need to check if their answer is correct, so check if their `guess` is (somewhere) in the (list) `answer`. Then we let the computer figure out which of the letter(s) is the guess. We have already programmed that part for you. - Next we want to compliment the player for finding a correct letter and we want to print the list `guessed_letters`, so the player can see their progress. + Next, we want to compliment the player for finding a correct letter and we want to print the list `guessed_letters`, so the player can see their progress. - The next part we're going to program is what happens when the player has guessed all of the letters. So if their list of `guessed_letters` is the same as our list `answer`. + The next part we're going to program is what happens when the player has guessed all of the letters. So, if their list of `guessed_letters` is the same as our list `answer`. If the lists are the same, congratulate Player 2 with their victory and set the variable `game_over` to `True`. - Next we'll program what happens when Player 2 guesses wrong (so the `{else}` command). First, tell the player that their guess was wrong. Then increase the `mistakes_made` variable by 1. + Next, we'll program what happens when Player 2 guesses wrong (so the `{else}` command). First, tell the player that their guess was wrong. Then increase the `mistakes_made` variable by 1. For the last part we'll program what happens when Player 2 has made 10 mistakes. We'll print that Player 1 has won the game. Then we'll print the correct answer. And finally, we'll set our `game_over` variable to `True`, so the game stops. - ***Go to the next adventure*** Amazing work! Your game is playable, but wouldn't it be fun if the hangman was actually drawn when Player 2 makes a mistake..? + ***Go to the next adventure*** Amazing work! Your game is playable, but wouldn't it be fun if the hangman was actually drawn when Player 2 makes a mistake? example_code: | ``` # Paste your code here diff --git a/content/adventures/tr.yaml b/content/adventures/tr.yaml index c07e62d8d5f..36c6440e5fa 100644 --- a/content/adventures/tr.yaml +++ b/content/adventures/tr.yaml @@ -64,11 +64,11 @@ adventures: Hikayenizde `{add}` komutu da kullanışlı olabilir. example_code_2: | ``` - {print} They hear a sound - animals {is} 🐿, 🦔, 🦇, 🦉 - animal {is} {ask} What do you think it is? - {add} animal {to_list} animals - {print} it was an animals {at} {random} + {print} Bir ses duydular + hayvanlar {is} 🐿, 🦔, 🦇, 🦉 + hayvan {is} {ask} Ne olduğunu düşünüyorsun? + {add} hayvan {to_list} hayvanlar + {print} bu bir hayvanlar {at} {random} ``` story_text_3: | Bu, hikayenizdeki `{remove}` komutunun bir örneğidir @@ -266,12 +266,12 @@ adventures: add_remove_command: name: '{add} {to} & {remove} {from}' default_save_name: ekle_çıkar_komutu - description: '{add} {to_list} ve {remove} {from} giriş' + description: '{add} {to_list} ve {remove} {from} komutlarına giriş' levels: 3: story_text: | ## ekle şuraya - Listeye `{add} {to_list}` komutu ile yeni öğeler ekleyebilirsiniz. Listeye bir öğe eklemek için sadece şunu yazın: `{add} penguen {to} hayvanlar` , ya da örnek koddaki gibi `{ask}` komutunu kullanabilirsiniz. + Listeye `{add} {to}` komutu ile yeni öğeler ekleyebilirsiniz. Listeye bir öğe eklemek için sadece şunu yazın: `{add} penguen {to} hayvanlar` , ya da örnek koddaki gibi `{ask}` komutunu kullanabilirsiniz. example_code: | ``` hayvanlar {is} köpek, kedi, kanguru @@ -583,9 +583,9 @@ adventures: story_text: | Hedy'ye hoş geldiniz! Seviye 1'de, bir hikaye yazdırarak başlayabilirsiniz. - Programlama alanının altındaki yeşil 'Kodu çalıştır' düğmesini kullanarak kodu kendiniz deneyin. + Programlama alanının altındaki yeşil 'Kodu Çalıştır' düğmesini kullanarak kodu kendiniz deneyin. - Hazır mısınız? O zaman ilk komutunuzu öğrenmek için bir sonraki sekmeye gidin! + Hazır mısınız? O zaman ilk komutunuzu öğrenmek için bir sonraki maceraya gidin! 2: story_text: | Tebrikler! Seviye 2'ye ulaştınız. Umarım şimdiden bazı harika kodlar yapmışsınızdır! diff --git a/content/adventures/uk.yaml b/content/adventures/uk.yaml index 90094492142..b55e5af106f 100644 --- a/content/adventures/uk.yaml +++ b/content/adventures/uk.yaml @@ -64,11 +64,11 @@ adventures: Команда `{add}` також може стати в нагоді у вашій історії. example_code_2: | ``` - {print} They hear a sound - animals {is} 🐿, 🦔, 🦇, 🦉 - animal {is} {ask} What do you think it is? - {add} animal {to_list} animals - {print} it was an animals {at} {random} + {print} Вони чують звук + тварини {is} 🐿, 🦔, 🦇, 🦉 + тварина {is} {ask} Як ви думаєте, що це? + {add} тварина {to_list} тварини + {print} це були тварини {at} {random} ``` story_text_3: | Це приклад команди `{remove}` у вашій історії @@ -259,17 +259,17 @@ adventures: ``` add_remove_command: default_save_name: javascript licenses api веб-сайт go1.13.8 - description: '{add} {to_list} і {remove} {from}' + description: 'представляємо {add} {to_list} і {remove} {from}' levels: 3: story_text: | ## Додати до - Ви можете додати елементи до списку за допомогою команди `{add} {to_list}`. Щоб додати елемент до списку, ви можете просто ввести: `{add} penguin {to_list} animals` або ви можете скористатися командою `{ask}`, як у прикладі коду. + Ви можете додати елементи до списку за допомогою команди `{add} {to_list}`. Щоб додати елемент до списку, ви можете просто ввести: `{add} penguin {to_list} animals` або ви можете скористатися командою `{ask}`, як у прикладі co story_text_3: | ### Вправи Спробуйте нові команди у цьому віртуальному ресторані. Додайте смак, на який гравець сподівається, до списку та видаліть смаки, на які у нього алергія. story_text_2: "## Видалити з\nЯкщо ви можете додавати елементи до списку, ви, звичайно, можете їх і вилучати. Це робиться за допомогою команди `{remove} {from}`.\n" - example_code: "```\nanimals {is} dog, cat, kangaroo\nlike {is} {ask} What is your favorite animal?\n{add} like {to_list} animals\n{print} I choose animals {at} {random}\n```\n" + example_code: "```\nтварини {is} собака, кіт, кенгуру\nяк {is} {ask} Яка твоя улюблена тварина?\n{add} як {to_list} тварини\n{print} Я вибираю тварини {at} {random}\n```\n" example_code_3: "```\n{print} Mystery milkshake\nароматизатори{is} полуниця, шоколад, ваніль\nнадія {is} {ask} На який смак ти сподіваєшся?\n_\nалергія {is} {ask} У вас алергія на будь-які смаки?\n_\n{print} Ви отримуєте молочний коктейль зі смаком {at} {random}\n```\n" example_code_2: "```\nanimals {is} dog, cat, kangaroo\ndislike {is} {ask} What animal do you not like?\n{remove} dislike {from} animals\n{print} I choose animals {at} {random}\n```\n" name: '{add} {to_list} & {remove} {from}' @@ -2781,7 +2781,7 @@ adventures: hangman_2: levels: 17: - story_text: "Тепер настав час запрограмувати гру «ката». \n\n### Вправи\n\n***Вставте свій код*** Скопіюйте свій код із попередньої пригоди та вставте код у поле програмування. \n\n***Гра*** Ці ігри тривають, поки гравець 2 не закінчить гру. Заповніть команду while відповідно. Тепер гравцеві 2 дозволено вгадати літеру, тому попросіть гравця 2 вгадати літеру. \nНам потрібно перевірити, чи правильна їхня відповідь, тому перевірте, чи є їхня (десь) у (списку) . Потім ми дозволяємо комп’ютеру визначити, яка з літер є вгадкою. Ми вже запрограмували цю частину для вас. \nДалі ми хочемо похвалити гравця за те, що він знайшов правильну літеру, і ми хочемо надрукувати список `guessed_letters`, щоб гравець міг бачити свій прогрес. \n\nНаступна частина, яку ми плануємо запрограмувати, це те, що станеться, коли гравець вгадає всі літери. Отже, якщо їхній список `answer` збігається з нашим списком `guess`. \nЯкщо списки однакові, привітайте Гравця 2 з перемогою та встановіть для змінної `game_over` значення `True`. \n\nДалі ми запрограмуємо, що станеться, якщо гравець 2 вгадає неправильно (тому команда `{else}`). Спочатку скажіть гравцеві, що його припущення було неправильним. Потім збільште змінну `mistakes_made` на 1. \n\nВ останній частині ми запрограмуємо, що станеться, коли Гравець 2 зробить 10 помилок. Ми надрукуємо, що Гравець 1 виграв гру. Тоді ми надрукуємо правильну відповідь. І, нарешті, ми встановимо для нашої змінної `game_over` значення `True`, щоб гра зупинилася. \n\n***До наступної пригоди*** Чудова робота! У вашу гру можна грати, але хіба не було б весело, якби ката справді витягнули, коли Гравець 2 зробив помилку..?\n" + story_text: "Тепер настав час запрограмувати гру «ката». \n\n### Вправи\n\n***Вставте свій код*** Скопіюйте свій код із попередньої пригоди та вставте код у поле програмування. \n\n***Гра*** Ця гра триває, доки Гравець 2 не закінчить гру. Заповніть команду while відповідно. Тепер гравцеві 2 дозволено вгадати букву, тому попросіть гравця 2 вгадати літеру. \nНам потрібно перевірити, чи правильна їхня відповідь, тому перевірте, чи є їхня припущення (десь) у (списку) відповіді. Потім ми дозволяємо комп’ютеру визначити, яка з літер є вгадкою. Ми вже запрограмували цю частину для вас. \nДалі ми хочемо похвалити гравця за те, що він знайшов правильну літеру, і ми хочемо надрукувати список `guessed_letters`, щоб гравець міг бачити свій прогрес. \n\nНаступна частина, яку ми плануємо запрограмувати, це те, що станеться, коли гравець вгадає всі літери. Отже, якщо їхній список `answer` збігається з нашим списком `guess`. \nЯкщо списки однакові, привітайте Гравця 2 з перемогою та встановіть для змінної `game_over` значення `True`. \n\nДалі ми запрограмуємо, що станеться, якщо гравець 2 вгадає неправильно (тому команда `{else}`). Спочатку скажіть гравцеві, що його припущення було неправильним. Потім збільште змінну `mistakes_made` на 1. \n\nВ останній частині ми запрограмуємо, що станеться, коли Гравець 2 зробить 10 помилок. Ми надрукуємо, що Гравець 1 виграв гру. Тоді ми надрукуємо правильну відповідь. І, нарешті, ми встановимо для нашої змінної `game_over` значення `True`, щоб гра зупинилася. \n\n***До наступної пригоди*** Чудова робота! У вашу гру можна грати, але хіба не було б весело, якби ката справді витягнули, коли Гравець 2 зробив помилку?\n" example_code: "``` \n# Вставте свій код сюди \n\n# Гра \n{while} game_over _ \n здогадка = _ \n {if} _ \n {for} i {in} {range} 1 {to} сума_букв: \n if answer[i] == guess: \n guessed_letters[i] = здогадка \n {print} _ \n {if} вгадані_літери == _: \n {print} _ \n game_over = _ \n {else}:\n {print} _ \n зроблені_помилки_ \n {if}_ == 10: \n {print} _ \n {print} _ \n _ \n```\n" name: Шибениця 2 default_save_name: Шибениця_2 diff --git a/content/client-messages/tr.yaml b/content/client-messages/tr.yaml index 1dfddff10d5..941db75bd0f 100644 --- a/content/client-messages/tr.yaml +++ b/content/client-messages/tr.yaml @@ -2,11 +2,11 @@ CheckInternet: İnternet bağlantınızın çalışıp çalışmadığını kont Connection_error: Sunucuya ulaşamadık. Empty_output: Bu kod çalışıyor ama hiçbir şey yazdırmıyor. Kodunuzda bir yazdırma komutu kullanın veya bir çıktı almak için kaplumbağayı kullanın. Errors_found: Bir hata yaptınız! Endişelenmeyin, programı yine de çalıştırdık -Execute_error: Programı çalıştırırken bir şeyler ters gitti. +Execute_error: Bir şeyler ters gitti. Other_error: Oops! Belki küçük bir hata yapmış olabiliriz. Program_repair: Bu doğru kod olabilirdi, onu düzeltebilir misin? Program_too_long: Programınızın çalışması çok uzun sürüyor. -ServerError: Bizim beklemediğimiz bir program yazdınız. Eğer yardım etmek isterseniz, bize hello@hedy.org adresinden ilgili seviye ve programınızla birlikte bir e-posta gönderin. Bu arada, biraz farklı bir şey deneyin ve örneklere bir kez daha göz atın. Teşekkürler! +ServerError: Bulunduğunuz seviyeyi ve programınızı içeren bir e-postayı hello@hedy.org adresine göndererek bize yardımcı olabilirsiniz. Bu arada, biraz farklı bir yaklaşım deneyin. Teşekkürler! Transpile_error: Programını çalıştıramıyoruz. Transpile_success: - Aferin! @@ -16,3 +16,10 @@ Transpile_success: - Çok iyiydin! Transpile_warning: Uyarı! Unsaved_Changes: Kaydedilmemiş bir programın var. Kaydetmeden ayrılmak mı istiyorsun? +fortune: 🔮, ✨ +dice: 🎲 +songs: 🎵,🎶 +haunted: 🦇, 👻, 🎃 +restaurant: 🍣, 🍕, 🍔 +turtle: 🐢 +rock: ✂️, 📜, 🗻 diff --git a/content/keywords/tr.yaml b/content/keywords/tr.yaml index f921fa5b8c5..f691936e0e0 100644 --- a/content/keywords/tr.yaml +++ b/content/keywords/tr.yaml @@ -48,3 +48,20 @@ while: şu iken white: beyaz with: ile yellow: sarı +comma: ',' +d1: '1' +d6: '6' +d7: '7' +d0: '0' +d5: '5' +d8: '8' +quote: "'" +d2: '2' +d3: '3' +d4: '4' +play: oynat +d9: '9' +'false': yanlış +'False': Yanlış +'true': doğru +'True': Doğru diff --git a/content/pages/en.yaml b/content/pages/en.yaml index 5ad9ceffea0..3221c121204 100644 --- a/content/pages/en.yaml +++ b/content/pages/en.yaml @@ -1,4 +1,4 @@ -title: Hedy documentation +title: Hedy Documentation home-sections: - title: Textual programming made easy! text: |- @@ -53,15 +53,15 @@ join-sections: learn-more-sections: - title: The Hedy foundation text: |- - Hedy is maintained by the Hedy Foundation (Stichting Hedy), Sportmanstaat 8, 2341 JG Oegstgeest, Dutch Chamber of Commerce number 94013985. + Hedy is maintained by the Hedy Foundation (Stichting Hedy), Sportmanstaat 8, 2341 JG Oegstgeest, Dutch Chamber of Commerce number 94013985. - The board of the foundation consists of: - - * Felienne Hermans, president - * Eelko Huizing, finance - * Renée Merbis, secretary - - The board of Stichting Hedy does not get any financial compensation for their tasks. + The board of the foundation consists of: + + * Felienne Hermans, president + * Eelko Huizing, finance + * Renée Merbis, secretary + + The board of Stichting Hedy does not get any financial compensation for their tasks. - title: A deep dive! text: |- Want to know more about Hedy's philosophy and design? Check out this talk Felienne gave at the StrangeLoop Conference in 2022: @@ -422,7 +422,7 @@ teacher-guide: - title: Common mistakes key: common_mistakes intro: |- - You can learn from your mistakes, especially in coding! Making mistakes is unavoidable, and a great opportunity to learn, but for teachers, it can be a challenge to find the correct fix for a mistake! Especially as the programs get longer and longer as the students progress through the levels. That's why we've made a list with frequently made mistakes in each level, and their solutions. + You can learn from your mistakes, especially in coding! Making mistakes is unavoidable, and a great opportunity to learn, but for teachers, it can be a challenge to find the correct fix for a mistake! Especially as the programs get longer and longer as the students progress through the levels. That's why we've made a list with frequently made mistakes in each level, and their solutions. levels: - level: '1' sections: diff --git a/content/pages/tr.yaml b/content/pages/tr.yaml index 5a56111c8f1..0761b237ff4 100644 --- a/content/pages/tr.yaml +++ b/content/pages/tr.yaml @@ -1,4 +1,4 @@ -title: Hedy belgeleri +title: Hedy Belgeleri home-sections: - title: Metinsel programlama kolaylaştı! text: |- @@ -11,14 +11,14 @@ home-sections: 1. Hedy çok dillidir, Hedy'yi kendi dilinizde kullanabilirsiniz 2. Hedy aşamalıdır, böylece bir seferde bir kavramı ve sözdizimini öğrenebilirsiniz 3. Hedy sınıf için tasarlanmıştır ve öğretmenlerin öğrencilerinin deneyimini tamamen özelleştirmesine olanak tanır -- title: Dilin iyileştirilmesi/geliştirilmesi +- title: Çok-dilli programlama text: Neredeyse tüm metinsel programlama dillerinde `for` veya `repeat` gibi İngilizce anahtar kelimeler bulunurken, Hedy her dilde kullanılabilir! Şu anda Türkçe, Hollandaca, İspanyolca, Arapça, Çince ve Hintçe dahil olmak üzere 47 farklı dili destekliyoruz. Eğer diliniz mevcut değilse her zaman yeni bir çeviri başlatabilirsiniz. -- title: Hedy için çeviri yapılması +- title: Adım adım öğrenme text: Bir programlama dilini öğrenmek çok zorlayıcı ve ağır gelebilir, çünkü öğrenciler aynı anda hem kavramları (örneğin if-else veya döngüler) hem de sözdizimini (tırnak işaretleri veya yuvarlak parantezler gibi) öğrenmek zorundadır. Hedy'de kavramlar önce çok az sözdizimi ile tanıtılır ve daha sonra geliştirilir. Öğrenmenin bilimsel olarak kanıtlanmış bir yolu! -- title: Öğretmenlerin başlamasına yardımcı olun +- title: Sınıf için tasarlandı text: |- - Hedy, öğretmenlerin sınıfta programlama dersleri vermelerini desteklemek için tasarlanmıştır. Bir sınıf oluşturma, onu özelleştirme ve öğrencilerinizin neler yaptığını görme seçeneği gibi belirli öğretmen özelliklerine sahibiz. - Hedy'yi beğendiyseniz, öğretmenlerin başlamasına yardımcı olmak için tanıdığınız okullara ulaşabilirsiniz! Discord aracılığı ile okul veya öğretmen bulmanıza yardımcı olabiliriz. + Hedy, 10 yaş ve üzeri çocuklar için uygundur ve sınıf kullanımı için tasarlanmıştır. + Öğretmenler ücretsiz, yerleşik ders planlarımızı kullanabilir, ancak kendi derslerini de yazabilir ve bunları Hedy kullanıcı arayüzüne yükleyebilirler. - title: Bağlam içinde programlama text: Hedy, programlamayı mümkün olan en geniş şekilde gösterir ve çeşitli heyecan verici şekillerde kullanılabilir. Hedy, dijital ve etkileşimli hikayelerin, ekranda gösterilebilmelerinin yanı sıra bir kalem çiziciyle çizilebilen veya bir tişört üzerine işlenebilen renkli çizimlerin, ve düğmeler ve klavye eylemleriyle oynanabilir oyunların veya uygulamaların oluşturulmasına olanak tanır. - title: Hedy ücretsiz mi? @@ -36,11 +36,11 @@ home-sections: join-sections: - title: Hedy'yi Desteklemek text: "# Hedy'yi destekleyebileceğiniz üç yol var!" -- title: Dilin iyileştirilmesi/geliştirilmesi için yardım edin +- title: Dilin iyileştirilmesi/geliştirilmesi text: |- Hedy'nin kademeli ve çok dilli yapısı birçok ilginç teknik zorluk karşımıza çıkarıyor. Bu problemleri Github üzerinde bulabilirsiniz. -- title: Hedy için çeviri yapın +- title: Hedy için çeviri yapılması text: |- Programcı değil misiniz? Sorun değil! Hedy'yi desteklemenin bir başka yolu da anahtar kelimeleri, hata mesajlarını, maceraları ve diğer içerikleri çevirmek. Mevcut durum şu, bir dili tamamlamamıza veya yeni bir dil eklememize yardımcı olun! @@ -52,7 +52,7 @@ join-sections: Hedy'yi beğendiyseniz, öğretmenlerin başlamasına yardımcı olmak için tanıdığınız okullara ulaşabilirsiniz! Discord aracılığı ile okul veya öğretmen bulmanıza yardımcı olabiliriz. learn-more-sections: - text: "Hedy, Hedy Vakfı (Stichting Hedy) tarafından desteklenmektedir. Sportmanstaat 8, 2341 JG Oegstgeest, Hollanda Ticaret Odası numarası 94013985.\n\nVakfın yönetim kurulu şu kişilerden oluşmaktadır:\n\n *Felienne Hermans**, başkan\n *Eelko Huizing**, mali işler\n *Renée Merbis**, sekreter\n\nStichting Hedy yönetim kurulu, görevleri için herhangi bir maddi karşılık almamaktadır. " - title: Hedy kuruluşu + title: Hedy Vakfı - title: Derin bir dalış! text: |- Hedy'nin felsefesi ve tasarımı hakkında daha fazla bilgi edinmek ister misiniz? Felienne'in 2022'de StrangeLoop Konferansında yaptığı bu konuşmaya göz atın: @@ -83,8 +83,8 @@ learn-more-sections: * [AG Connect (Hollandaca), Nisan 2020](https://www.agconnect.nl/artikel/stapsgewijs-python-leren-programmeren-met-nieuwe-taal-hedy) start-sections: - title: Hedy ile çalışmaya başlamak - text: "Hedy'e hoş geldiniz, Hedy ile başlamanıza yardımcı olmaktan mutluluk duyuyoruz.\n\n[Öğretmen Kılavuzumuz](https://www.hedy.org/for-teachers/manual), tüm özelliklerin detaylı bir özeti bulunmaktadır. Bu sayfa ise size neyin ne olduğunu bilmeniz için kısa bir genel bakış sunmaktadır.\n\nBilmeniz gereken birkaç önemli nokta:\n- Hedy, çocukların programlama sınıfını yönetmeye yardımcı olmak için tasarlanmış bir araçtır! Kendi sınıflarınızı, ders planlarınızı oluşturabilir ve çocukların nasıl ilerlediğini takip edebilirsiniz.\n- Başlangıçta çok fazla programlama bilmenize gerek yok, Hedy sizin için de adım adım çalışır!\n- Hedy'yi kendi ana dilinizde kullanabilirsiniz çünkü birçok dile çevrilmiştir!\n- Her çocuk program yapabilir! Hedy, özellikle görme problemi olan çocuklar için faydalıdır çünkü fareye ihtiyaç duymadan materyalleri size sesli olarak okuyabilir.\n- Size yardımcı olmak için buradayız, bizi örneğin [Discord](https://discord.gg/8yY7dEme9r) üzerinden bulabilir veya [bize e-posta gönderebilirsiniz](mailto:hello@hedy.org)." -- title: Diğer öğretmenler Hedy hakkında ne diyor + text: "Hedy'e hoş geldiniz, Hedy ile başlamanıza yardımcı olmaktan mutluluk duyuyoruz.\n\n[Öğretmen Kılavuzumuz](https://www.hedy.org/for-teachers/manual), tüm özelliklerin detaylı bir bakışı içermektedir. Bu sayfa ise size sadece neyin ne olduğunu bilmeniz için kısa genel bir bakış sunmaktadır.\n\nBilmeniz gereken birkaç önemli nokta:\n- Hedy, çocuklar için programlama sınıflarını yönetmeye yardımcı olmak için tasarlanmış bir araçtır! Kendi sınıflarınızı, ders planlarınızı oluşturabilir ve çocukların nasıl ilerlediğini takip edebilirsiniz.\n- Başlangıçta çok fazla programlama bilmenize gerek yok, Hedy sizin için de adım adım çalışır!\n- Hedy'yi kendi ana dilinizde kullanabilirsiniz çünkü birçok dile çevrilmiştir!\n- Her çocuk programlama yapabilir! Hedy, özellikle görme problemi olan çocuklar için faydalıdır çünkü materyalleri fareye ihtiyaç duymadan size sesli olarak okuyabilir.\n- Size yardımcı olmak için buradayız, bizi örneğin [Discord](https://discord.gg/8yY7dEme9r) üzerinden bulabilir veya [bize e-posta gönderebilirsiniz](mailto:hello@hedy.org)." +- title: Öğretmenlerin Hedy'e hakkında düşündükleri text: |- Bir süre önce birkaç kısa Hedy öğretmen anketi düzenledik. Sorular, iyileştirme önerileri ile Hedy'nin en iyi özellikleri arasında gidip geliyor. @@ -134,7 +134,7 @@ teacher-guide: Scratch gibi çocuklara yönelik programlama dillerinin aksine, Hedy kod blokları değil, metinsel kod kullanır. Böylece Hedy ile gerçek programcıların yaptığı gibi kod yazmayı öğreneceksiniz, ancak eğlenceli alıştırmalarla ve küçük adımlarla. Bu şekilde Hedy, Python gibi gerçek programlama dillerine doğru erişilebilir ve çoğunlukla eğlenceli bir şekilde bir basamak olarak işlev görebilir! - Daha fazlasını öğrenmek istiyorsanız, Hedy'nin bir programlama dili olarak gelişimi hakkındaki bu video 'yu izleyebilirsiniz. + Daha fazlasını öğrenmek istiyorsanız, Hedy'nin bir programlama dili olarak gelişimi hakkındaki bu videoyu izleyebilirsiniz. - title: Hedef kitle text: |- Hedy, ortaokul ve lise öğrencileri (10 - 15 yaş) düşünülerek geliştirilmiştir. @@ -159,7 +159,7 @@ teacher-guide: text: |- Bütün Hedy öğretmenleri, programcıları ve diğer hayranları Discord sunucumuza katılmaya davetlidir. Burası Hedy hakkında sohbet etmek için ideal bir yer: harika projelerinizi ve derslerinizi gösterebileceğiniz kanallarımız, hataları bildirebileceğiniz kanallarımız ve diğer öğretmenlerle ve Hedy ekibiyle sohbet edebileceğiniz kanallarımız var. Burada Discord Topluluğuna nasıl katılacağınıza dair bir video bulabilirsiniz. - - title: Hedy and the GDPR + - title: Hedy ve GDPR text: |- Organizations in the EU have to comply with the GDPR (General Data Protection Regulation) when processing personal data. Because this is a complex issue for many schools, you can use all Hedy programming functionalities without sharing personal data. @@ -349,7 +349,7 @@ teacher-guide: Hata ayıklayıcı, kodlama ekranınızdaki uğur böceği düğmesidir. Buna basarsanız, hatanızı bulmak için kodunuzu satır satır çalıştırabilirsiniz. Hatayı buldunuz mu? Kırmızı durdurma düğmesine basarsanız hata ayıklayıcı kapanacaktır. - title: Sesli oku - text: Programınızın çıktısının yüksek sesle okunmasını ister misiniz? O zaman kodlama ekranınızdaki 'kodu çalıştır' düğmesinin altında bulunan sesli okuma işlevini kullanabilirsiniz. + text: Programınızın çıktısının yüksek sesle okunmasını ister misiniz? O zaman kodlama ekranınızdaki 'Kodu Çalıştır' düğmesinin altında bulunan sesli okuma işlevini kullanabilirsiniz. - title: Programcı kipi text: |- Tüm maceralar dikkatinizi mi dağıtıyor, yoksa uzun bir program mı yapmak istiyorsunuz? O zaman kodlama ekranınızın altındaki 'Programcı Kipi' anahtarına göz atın. diff --git a/content/slides/de.yaml b/content/slides/de.yaml index ba693c61622..e01b1589a2e 100644 --- a/content/slides/de.yaml +++ b/content/slides/de.yaml @@ -183,7 +183,7 @@ levels: 6: header: Entfernen von code: "tiere {is} Hunde, Katzen, Kängurus\nnicht_mögen {is} {ask} Welche Tiere magst du nicht?\n{remove} nicht_mögen {from} tiere\n{print} Ich wähle tiere {at} {random}" - text: "Das Gegenstück zum `{add}` `{to}` Befehl ist der `{remove}` `{from}` Befehl.\nDieser Befehlt entfernt ein Element von der Liste." + text: "Das Gegenstück zum `{add}` `{to_list}` Befehl ist der `{remove}` `{from}` Befehl.\nDieser Befehlt entfernt ein Element von der Liste." 7: debug: Wahr header: Debugging @@ -201,7 +201,7 @@ levels: header: Zufällig 5: code: "tiere {is} Hunde, Katzen, Kängurus\nmag {is} {ask} Welches ist dein Lieblingstier?\n{add} mag {to_list} tiere\n{print} Ich wähle tiere {at} {random}" - text: "Du kannst der Liste Elemente mit dem `{add}` `{to}` Befehl hinzufügen.\n\nDu kannst auswählen, was du zur Liste hingefügt wird oder den `{add}` `{to}` Befehlt in Kombination mit dem `{ask}` Befehl nutzen.\nSo kannst du den Spieler entscheiden lassen, was der Liste hinzugefügt wird." + text: "Du kannst der Liste Elemente mit dem `{add}` `{to_list}` Befehl hinzufügen.\n\nDu kannst auswählen, was du zur Liste hingefügt wird oder den `{add}` `{to_list}` Befehlt in Kombination mit dem `{ask}` Befehl nutzen.\nSo kannst du den Spieler entscheiden lassen, was der Liste hinzugefügt wird." header: Hinzufügen 4: 9: diff --git a/content/slides/en.yaml b/content/slides/en.yaml index d8450538917..548d370f27a 100644 --- a/content/slides/en.yaml +++ b/content/slides/en.yaml @@ -251,7 +251,7 @@ levels: text: Let's debug this code! editor: |- music_genres {is} rock, pop, metal, indie, jazz - chosen_genre is music {at} {random} + chosen_genre {is} music {at} {random} {print} Let's listen to chosen genre nice {ask} Do you like that genre? {remove} chosen_genre {from} chosen_genre @@ -803,9 +803,9 @@ levels: 4: header: Functions! text: |- - In this level you'll learn how to use functions. A function is a block of code you can easily use multiple times. Using functions helps us organize pieces of code that we can use again and again. To create a function, use define and give the function a name. Then put all the lines you want in the function in a indented block under the define line. Leave one empty line in your code to make it look nice and neat. Great job! You have created a function! + In this level you'll learn how to use functions. A function is a block of code you can easily use multiple times. Using functions helps us organize pieces of code that we can use again and again. To create a function, use `{define}` and give the function a name. Then put all the lines you want in the function in a indented block under the `{define}` line. Leave one empty line in your code to make it look nice and neat. Great job! You have created a function! - Now, whenever we need that block of code, we just use call with the function's name to call it up! We don't have to type that block of code again. + Now, whenever we need that block of code, we just use `{call}` with the function's name to call it up! We don't have to type that block of code again. 5: header: Twinkle Twinkle little star! text: |- @@ -846,7 +846,7 @@ levels: 1: header: Welcome to level 13 text: |- - We are now going to learn `{and}` and `{or}`! If you want to check two statements, you don't have to use two ifs but can use and and or. + We are now going to learn `{and}` and `{or}`! If you want to check two statements, you don't have to use two `{if}`s but can use`{and}` and `{or}` instead. From now on you could also use arguments in your functions. 2: header: The and command @@ -890,11 +890,11 @@ levels: What happens if you make these changes: ``` - define song with place - print 'My Bonnie is ' place + {define} song {with} place + {print} 'My Bonnie is ' place - answer is ask 'Where is my Bonnie?' - call song with answer + answer {is} {ask} 'Where is my Bonnie?' + {call} song {with} answer ``` code: |- {define} song {with} place @@ -911,12 +911,12 @@ levels: Note how the variables and the arguments have the same name. This is allowed. Does it confuse you? Just use different names, that is allowed as well. ``` - define song with name, place - print 'My ' name ' is ' place + {define} song {with} name, place + {print} 'My ' name ' is over the ' place - name is ask 'Who?' - place is ask 'Where are they?' - call song with name, place + name {is} {ask} 'Who?' + place {is} {ask} 'Where are they?' + {call} song {with} name, place ``` code: |- {define} song {with} place diff --git a/content/slides/tr.yaml b/content/slides/tr.yaml index cfb88a745a1..e3fcb560317 100644 --- a/content/slides/tr.yaml +++ b/content/slides/tr.yaml @@ -1,7 +1,7 @@ levels: 0: 1: - header: Hedy'ye hoş geldin! + header: Hedy'ye hoş geldiniz! text: Hedy bir programlama dilidir. 2: header: Programlama @@ -27,27 +27,30 @@ levels: 5: header: Hedy'de Programlama text: Hedy'de `{print}` gibi özel kodlar kullanırız. + code: "{print} Hedy'ye hoş geldiniz!" 6: header: Hedy'de Programlama text: Kod kelimeleri pembe renkte gösterilecektir. - code: '{print} Hedy''e hoşgeldiniz!' + code: '{print} Hedy''ye hoş geldiniz!' 7: header: Hedy'de Programlama - text: Kodun altındaki Kodu çalıştır düğmesi ile kodu başlatıyoruz. + text: Kodun altındaki Kodu Çalıştır düğmesi ile kodu başlatıyoruz. + code: "{print} Hedy'ye hoş geldiniz!" 8: header: Hedy'de Programlama text: Çıktısı sağ tarafta görünür. + code: "{print} Hedy'ye hoş geldiniz!" 9: header: Hedy'de Programlama text: Çıktı bir çizim de olabilir. code: |- {forward} 100 - {turn} left + {turn} {left} 1: 1: - header: 1. seviyeye hoş geldiniz! + header: Seviye 1'e hoş geldiniz! text: |- - 1. seviyede, Hedy'de hikayeler oluşturarak başlayacağız! + Seviye 1'de, Hedy'de hikayeler oluşturarak başlayacağız! Etkileşimli hikayeler oluşturmak için üç metin koduna ihtiyacımız var. 2: @@ -55,55 +58,69 @@ levels: Seviye 1'de kullanabileceğiniz ilk kod `{print}`. `{print}` ekranda metin göstermek için kullanılır. - code: '{print} Put text on the screen' + code: '{print} Bu yazıyı ekranda göster' + header: '{print}' 3: header: '{print} komutu' text: |- - Yazdır komutundan sonraki metni istediğiniz şekilde değiştirebilirsiniz. + Bu yazdırma komutundan sonraki metni istediğiniz şekilde değiştirebilirsiniz. Ya da `{print}` ile başlayan başka bir kod satırı ekleyerek birden fazla satır yazdırabilirsiniz. - code: '{print} Put text on the screen' + code: '{print} Hedy''ye hoş geldiniz! + + {print} Artık programlamaya başladık!' 4: text: |- Seviye 1`de kullanabileceğiniz ikinci kod `{ask}`. - `{ask}` cevaplanabilecek bir soru sormak için kullanılır. + `{ask}` cevaplanmasını istediğimiz bir soru sormak için kullanılır. + header: '{ask}' + code: "{print} Kendi taş kağıt makas oyununa hoş geldin!\n{ask} Hangisini seçeceksin?" 5: text: |- Önceki örnekte görebileceğiniz gibi, eğer `{ask}` komutunu kullanırsanız, bir soru sorabilirsiniz. - Ancak cevap çıktı ekranında gösterilmez. - Eğer cevabın gösterilmesini istiyorsanız, bu seviyenin son komutunu kullanabilirsiniz: `{echo}`. - - `{echo}` bir `{ask}` cevabını tekrarlamak için kullanılır. + Eğer verilen cevabın gösterilmesini istiyorsanız, bu seviyenin son komutunu kullanabilirsiniz: `{echo}`. + `{echo}` bir `{ask}` komutuna verilen cevabı tekrarlamak için kullanılır. + header: '{echo}' + code: "{print} Merhaba!\n{ask} Adın ne senin?\n{echo} merhaba" 6: header: Programlama! text: |- - `{print}`, `{ask}` ve `{echo}` ile artık küçük bir hikaye oluşturabilirsiniz. - Papağan, Masal, ve Taş, Kağıt, Makas maceralarını denemek için iyi bir zaman. + `{print}`, `{ask}` ve `{echo}` ile artık küçük bir hikaye yazmaya yetecek kadar şey biliyorsunuz. + Papağan, Masal, ve Taş Kağıt Makas maceralarını denemek için iyi bir zaman. + editor: /hedy/1 7: header: Programlama! - text: Maceralar, sekmeler halinde gösterilir. + text: Maceralar, sekmeler halinde gösteriliyor. + editor: /hedy/1 8: header: Programlama! text: Sarı ok düğmeleri örnekleri kopyalamak için kullanılabilir. - editor: /hedy/1 + editor: /hedy#print_command 9: header: Kaplumbağa ile çizim yapmak - text: Metin ile kodlamayı gördüğümüze göre, şimdi çizim kodlarına bakacağız. + text: Metin ile kodlamayı gördüğümüze göre, şimdi çizim yapma kodlarına bakacağız. 10: header: 'Kaplumbağa ile çizim yapmak: {forward}' text: '`{forward}` kaplumbağayı ileri hareket ettirmek için kullanılır.' code: |- {forward} 50 - {turn} left 11: header: 'Kaplumbağa ile çizim yapmak: {turn}' text: '`{turn}` kaplumbağanın sola veya sağa dönmesini sağlamak için kullanılır.' code: |- {forward} 50 - {turn} left + {turn} {left} + 12: + code: "Ben DJ Hedy\n{print} Hangi şarkıyı dinlemek istersiniz?\n{ask} O şarkıyı ben de severim!\n{print} Sıradaki parçamız... {echo}" + header: Hata Ayıklama + text: Bir kodun hatalarını ayıklamak, koddaki hatalardan kurtulmak demektir. Gelin bu kodda birlikte hata ayıklayalım. Hata ayıklayıcıyı başlatmak için uğur böceği düğmesine tıklayın. + debug: 'True' + 13: + header: Programlama eğlencesi başlasın! + text: Seviye 1'deki maceraların tadını çıkarın! 2: 1: header: Seviye 2'ye hoş geldiniz @@ -116,29 +133,39 @@ levels: 2: header: Değişkenler text: Bir değişken oluşturmak veya 'ayarlamak' için `{is}` komutunu kullanırız + code: "isim {is} Hedy\nyaş {is} 15\n{print} isim yaş yaşındadır" 3: header: Etkileşimli text: |- - Soru sorarak da bir değişken belirleyebiliriz. + Bir değişkenin değerini soru sorarak belirleyebiliriz. - Sorunun yanıtı değişkende saklanır. + Sorunun yanıtını değişkende saklarız. Bu şekilde `{echo}` komutuna ihtiyaç duymayız. + code: "isim {is} {ask} Adın ne senin?\n{print} Merhaba isim" 4: header: Çoklu değişkenler - text: Artık değişkenleri kullandığımıza göre, tek bir `{echo}` komutu yerine birden fazla değişken kullanabiliriz. + text: Artık değişkenleri kullanabildiğimize göre, tek bir `{echo}` komutu yerine birden fazla değişkeni birlikte kullanabiliriz. + code: "isim {is} {ask} Adın ne senin?\n{print} Merhaba isim\nyaş {is} {ask} Kaç yaşındasın?\n{print} isim yaş yaşındadır." 5: - header: Uyku + header: Uyu text: Kodu bir süreliğine duraklatmak için `{sleep}` komutunu da kullanabilirsiniz. + code: "{print} En sevdiğim renk...\n{sleep} 2\n{print} yeşil!" 6: - header: Uyku 5 + header: Uyu 5 text: |- Duraklamanın daha uzun olmasını istiyorsanız `{sleep}` komutundan sonra bir sayı ekleyebilirsiniz. - İsterseniz, uyku komutunun süresine karar vermek için bir sayı yerine bir değişken bile kullanabilirsiniz. + İsterseniz,` {sleep}` komutunun süresine karar vermek için bir sayı yerine bir değişken bile kullanabilirsiniz. + code: "süre {is} 10\n{print} En sevdiğim renk...\n{sleep} süre\n{print} yeşil!" 8: header: Programlama eğlencesi başlasın! text: Seviye 2'deki maceraların tadını çıkarın! + 7: + text: Bir kodun hatalarını ayıklamak, koddaki hatalardan kurtulmak demektir. Gelin bu kodda birlikte hata ayıklayalım. Hata ayıklayıcıyı başlatmak için uğur böceği düğmesine tıklayın. + debug: 'True' + header: Hata Ayıklama + code: "{print} Donut dükkanına hoş geldiniz!\ndolgu {is} İçinde ne tür bir dolgu istersiniz?\n{print} Seçimin... Dolgu! Hmm!\nsos {ask} Üstüne ne tür bir sos istersiniz?\nsos çok lezzetli!\n{print} Gidip çöreğini getireyim. {sleep}\n{print} Al bakalım! sos soslu bir dolgu dolu çörek!\n{ask} İyi günler dilerim!" 3: 1: header: Seviye 3'e hoş geldiniz @@ -146,67 +173,87 @@ levels: 2: header: Bir liste yapmak text: |- - Bir listeyi `{is}` ile yaparsınız. + Bir listeyi yine `{is}` ile yaparsınız. - Listenizdeki öğeleri virgülle ayırın. + Listenizdeki öğeleri virgülle ayırmalısınız. + code: hayvanlar {is} köpekler, kediler, kangurular 3: header: Rastgele text: |- Listeyi `{at}` `{random}` komutu ile kullanabilirsiniz. Bilgisayar listeden rastgele bir öğe seçecektir. Bu kodu her çalıştırdığınızda çıktı farklı olacaktır. + code: "hayvanlar {is} köpekler, kediler, kangurular\n{print} hayvanlar {at} {random}" 4: header: Cümle içinden rastgele - text: Bir cümle için de `{at}` `{random}` komutunu kullanabilirsiniz. + text: Bir cümle içinde de `{at}` `{random}` komutunu kullanabilirsiniz. + code: "hayvanlar {is} köpekler, kediler, kangurular\n{print} En sevdiğim hayvan hayvanlar {at} {random}" 5: - header: Eklemek için + header: İçine Ekle text: |- - Listeye `{add}` `{to}` komutu ile öğe ekleyebilirsiniz. + Listeye `{add}` `{to_list}` komutu ile öğe ekleyebilirsiniz. - Listeye neyin ekleneceğini seçebilir veya `{add}` `{to}` komutunu `{ask}` komutuyla birlikte kullanabilirsiniz. + Listeye neyin ekleneceğini seçebilir veya `{add}` `{to_list}` komutunu `{ask}` komutuyla birlikte kullanabilirsiniz. Bu şekilde, listeye ne ekleneceğine oyuncunun karar vermesine izin verebilirsiniz. + code: "hayvanlar {is} köpek, kedi, kanguru\nsevilen {is} {ask} En sevdiğin hayvan hangisi?\n{add} sevilen {to_list} hayvanlar\n{print} Benim seçimim hayvanlar {at} {random}" 6: - header: İçinden kaldırmak + header: İçinden kaldır text: |- - `{add}` `{to}` komutunun tersi `{remove}` `{from}` komutudur. + `{add}` `{to_list}` komutunun tersi `{remove}` `{from}` komutudur. Bu komut listeden bir öğeyi kaldırır. + code: "hayvanlar {is} köpek, kedi, kanguru\nsevilmeyen {is} {ask} Hangi hayvanı sevmiyorsun?\n{remove} sevilmeyen {from} hayvanlar\n{print}Benim seçimim hayvanlar {at} {random}" 8: header: Hadi işe koyulalım! text: Seviye 3'teki maceraların tadını çıkarın! + 7: + header: Hata Ayıklama + text: Bu kodda hata ayıklayalım! + editor: "müzik_türleri {is} rock, pop, metal, indie, caz\nseçilen_tür {is} müzik {at} {random}\n{print} Hadi seçilen türü dinleyelim\ngüzel {ask} Bu türü sever misin?\n{remove} seçilen_tür {to_list} seçilen_tür\nikinci_tercih {is} müzik_türleri\n{print} yoksa şunu mu tercih edersiniz... ikinci_tercih {at} {random}\n{remove} ikinci_tercih {from} müzik_türleri\n{print} Ben en çok müzik_türleri {random} severim!" + debug: 'True' 4: 1: - header: 4. seviyeye hoş geldiniz + header: Seviye 4'e hoş geldiniz text: Bu seviyede tırnak işaretlerini nasıl kullanacağınızı öğreneceksiniz. + code: "{print} 'tırnak işaretleriyle yazdıralım!'" 2: text: 'Önceki seviyelerde, bu sorunla karşılaşmış olabilirsiniz:' + debug: 'True' + header: Sorun var + code: "adım {is} Sophie\n{print} Benim adım adım" 3: - header: Bunu tırnak işaretleri ile düzeltmek + header: Bunu tırnak işaretleri ile düzeltelim text: |- Bu seviyede tırnak işaretlerini kullanarak bu sorunu çözeceğiz. Bu aynı zamanda kodumuzun 'gerçek' Python koduna daha çok benzemesini sağlar. 4: header: Yazdır ile tırnak işaretleri - text: '`{print}` komutunu her kullandığınızda, ekranda görünmesini istediğiniz metni tırnak içine almanız gerekir.' + text: 'Artık `{print}` komutunu her kullandığınızda, ekranda görünmesini istediğiniz metni tırnak içine almanız gerekir.' + code: "{print} 'tırnak içinde yazdıralım!'" 5: - header: Sor ile tırnak işaretleri + header: Sor ile tırnak işaretleri kullanalım text: Bu aynı zamanda `{ask}` komutu için de geçerlidir. + code: isim {is} {ask} 'isim alayım lütfen?' 6: header: Tırnak işaretleri ve değişkenler text: |- Değişken adlarının ekrana yazdırılmasını istemezsiniz. Bu nedenle değişkenler tırnak işaretlerinin dışında bırakılmalıdır, bunun gibi: + code: "isim {is} Harry\n{print} 'Merhaba ' isim" 7: header: Tırnak işaretleri ve değişkenler text: |- Değişken adları bir cümlenin ortasında kullanıldığında, değişkenleri tırnak işaretlerinin dışında bırakmanız gerekir. Ancak cümlenin geri kalanında tırnak işaretlerine ihtiyaç vardır. Bu şuna benziyor: + code: "isim {is} Harry\n{print} 'Marhaba ' isim ', nasılsın?'" 8: header: Tırnak işaretleri ve kısaltmalar text: |- Dikkatli olun! Artık tırnak işareti kullandığınıza göre, kısaltmalarda ve özel isimlerde kesme işareti kullanamazsınız. Lütfen aşağıdaki ekranda "Hedy'nin" veya "TC'de" gibi bir özel isim veya kısaltma yazdırmayı deneyin ve ne olduğunu görün... + debug: 'True' + code: "{print} 'Bu işe yaramaz: Hedy'yi çağır!'" 9: header: Temizle text: |- @@ -214,9 +261,15 @@ levels: Bu komut ile çıktı ekranınızdaki tüm metni silebilirsiniz. Her zaman uyku komutu kullanmaya da dikkat edin. Eğer bunu yapmazsanız bilgisayar siz okuyamadan tüm metni silecektir! + code: "{print} '3'\n{clear}\n{print} '2'\n{clear}\n{print} '1'\n{clear}\n{print} 'SÜRPRİZ!'" 11: header: Hazır Ol, Ayarla, Başla! text: Seviye 4'teki maceraların tadını çıkarın! + 10: + header: Hata Ayıklama + code: "{clear}\n{print} Sahile gitmek için ne güzel bir gün!\n{ask} 'Kumdan kale mi yapmak yoksa okyanusta yüzmek istersin?'\n{print} 'Demek aktivite istiyorsunuz '\n{print} 'Hedy'yi de çağıralım'\n{print} 'Şu güzel deniz kabuklarına bak!'\nrenkler {is} 'turuncu, gümüş, beyaz, kahverengi'\n{print} 'Renklerden en sevdiğim renkler {at} {random}'\nseçim{is} {ask} Hangisini seviyorsun?" + text: Bu kodda hata ayıklayalım! + debug: 'True' 5: 1: header: Seviye 5'e hoş geldiniz @@ -227,82 +280,116 @@ levels: `{if}` komutu iki seçenek arasında seçim yapmanızı sağlar. Bu örnekte, verilen cevap Hedy ise bilgisayar 'güzel' yazdıracaktır. Eğer cevap Hedy değilse, bilgisayar hiçbir şey yapmayacaktır. + code: "isim {is} {ask} 'Adın ne senin?'\n{if} isim {is} Hedy {print} 'güzel'" 3: header: Yazdırmayı unutmayın - text: '`{if}` komutunu kullanırken, `{print}` komutunu kullanmayı unutmayın.' + text: '`{if}` komutunu kullanırken, `{print}` komutunu kullanmayı unutmayın. + + Şu kod çalışmayacak!' + code: "{if} isim {is} Hedy 'güzel'" + debug: 'True' 4: header: değilse text: |- Bir `{if}` komutu kullanırken, bir `{else}` komutu da ekleyebilirsiniz. Eğer cevap Hedy ise, bilgisayar 'güzel' yazacaktır. - Ancak cevap başka bir şeyse bilgisayar 'böö' yazacaktır. + Ancak cevap başka bir şeyse bilgisayar 'böö' yazacaktır + code: "{if} isim {is} Hedy {print} 'güzel' {else} {print} 'böö!'" 5: header: Uzun satırlar text: |- Hem `{if}` hem de `{else}` komutuna sahip olduğunuzda satırlarınızın çok uzun olabileceğini fark etmiş olabilirsiniz. Komutları ayırmayı ve aşağıdaki gibi 2 satıra koymayı seçebilirsiniz: + code: "{if} isim {is} Hedy {print} 'güzel'\n{else} {print} 'böö!'" 6: header: Bir başka yeni komut text: |- Eğer `{if}` ve `{else}` komutları ile pratik yaptıysanız, `{in}` komutunu da deneyebilirsiniz. - Örneğin `{in}` ile bilgisayarın bir öğenin bir listede olup olmadığını kontrol etmesini sağlayabilirsiniz: + Örneğin `{in}` ile bilgisayarın bir öğenin bir liste içinde olup olmadığını kontrol etmesini sağlayabilirsiniz: Hedy'nin büyük/küçük harfe duyarlı olduğunu lütfen unutmayın. Bu, "yeşil" yerine "Yeşil" yanıtını verirseniz, Hedy'nin "eh işte" yazdıracağı anlamına gelir. + code: "güzel_renkler {is} yeşil, sarı\nsevilen_renk {is} {ask} 'En sevdiğin renk hangisi?'\n{if} sevilen_renk {in} güzel_renkler {print} 'güzel!'\n{else} {print} 'eh işte'" 8: header: Hadi başlayalım! text: Seviye 5'teki maceraların tadını çıkarın! + 7: + header: Hata Ayıklama + text: Bu kodda hata ayıklayalım! + code: "{print} HedyAir Güvenlik'e Hoş Geldiniz!\nuçak_bileti {is} {ask} 'Uçak biletiniz yanınızda mı?'\n{if} uçak_bileti evet {print} Harika!\n{else} Lütfen uçak biletinizi hazırlayın..\npasaport {is} 'Pasaportunuzu görebilir miyim, lütfen?'\n{if} pasaport {is} evet 'Teşekkür ederim.'\n{else} 'Pasaportunuz olmadan uçamazsınız'\nbildirim {is} {ask} Bildirmek istediğiniz bir eşyanız var mı?\n{if} bildirim {is} evet\nbildirilecek_eşya {is} {ask} 'Neyi bildirmek istersiniz'\n{else} Pekala.\n{print} Teşekkür ederim. Lütfen A22 kapısına gidin.'" + debug: 'True' 6: 1: header: Seviye 6'ya hoş geldiniz - text: Bu seviyede kodlarımıza matematiği de ekliyoruz. + text: Bu seviyede kodlarımıza artık matematiği de ekliyoruz. 2: header: Toplama text: Bir toplama işlemini hesaplamak istiyorsanız, artı işaretini kullanmanız yeterlidir. + code: "{print} '5 artı 5 eder ' 5 + 5" 3: header: Çıkarma text: Çıkarma işlemi yapmak istiyorsanız, eksi işaretini kullanabilirsiniz. + code: "{print} '5 eksi 5 eder ' 5 - 5" 4: header: Çarpma text: Eğer çarpma işlemi yapmak istiyorsanız, yıldız işaretini kullanabilirsiniz. + code: "{print} '5 kere 5 eder ' 5 * 5" 5: header: Bölme text: Bölme işlemi için sağa eğik çizgiyi kullanabilirsiniz. + code: "{print} '5 bölü 5 eder ' 5 / 5" 6: header: Özet text: Özetle, matematik yapmak için +, -, * ve / işaretlerini kullanabilirsiniz. + code: "{print} '5 artı 5 eder ' 5 + 5\n{print} '5 eksi 5 eder ' 5 - 5\n{print} '5 kere 5 eder ' 5 * 5\n{print} '5 bölü 5 eder ' 5 / 5" 7: header: = sembolü text: |- Şu andan itibaren `{is}` komutu yerine = sembolünü de kullanabilirsiniz. Bu hem sayılar hem de kelimeler için geçerlidir ve ayrıca `{if}` veya `{else}` komutlarından sonra gelir. + code: "isim = Hedy\ncevap = 20 + 4" 8: header: Değişkenlerle hesaplamalar yapmak text: 'Hesaplamaları sayılarla yapabilirsiniz, ancak hesaplama yapmak için değişkenleri de kullanabilirsiniz, bunun gibi:' + code: "sayı_1 = {ask} 'Birinci sayıyı girin:'\nsayı_2 = {ask} 'İkinci sayıyı girin:'\ndoğru_cevap = sayı_1 * sayı_2\n{print} sayı_1 ' kere ' sayı_2 ' eder ' doğru_cevap" 10: header: Hadi işe koyulalım! text: Seviye 6'daki maceraların tadını çıkarın! + 9: + code: "{print} 'Bu bir su parkı bilet makinesidir'\n{print} 'Fiyat listesi: 12 yaş altı çocuklar 3$, Yetişkinler 5$'\n{print} 'Pazartesi günleri %25 indirim'\nçocuk_sayısı = 'Kaç tane çocuk bileti istiyorsunuz?'\nyetişkin_sayısı = 'Kaç tane yetişkin bileti istiyorsunuz?'\nhaftanın_günü = {ask} 'Bugün günlerden ne?'\n{clear}\nçocuk_ücreti = çocuk sayısı * 3\nyetişkin_ücreti = yetişkin_sayısı + 5\ntoplam_ücret = yetişkin_ücreti * çocuk_ücreti\n{if} gün {is} Pazartesi\ntoplam_ücret = toplam_ücret * 0.25\n{print} 'Tamamı toplam_ücret tutuyor, lütfen'" + header: Hata Ayıklama + text: Bu kodda hata ayıklayalım! + debug: 'True' 7: 1: header: Seviye 7'ye hoş geldiniz text: Bu seviyede bir kod satırını istediğiniz kadar tekrarlamayı öğreneceksiniz. 2: - header: tekrar 3 kere + header: tekrarla 3 kere text: |- Bir kod satırını tekrarlamak istiyorsanız, `{repeat}` 3 `{times}` kodunu kullanabilirsiniz. Satırı daha fazla kez tekrarlamak istiyorsanız, sadece sayıyı değiştirin. Örneğin: Karakterinizin 5 kez yardım için bağırdığı bir hikaye programlıyorsanız, bu şöyle görünebilir: + code: "{print} 'Prens sürekli yardım istiyordu.'\n{repeat} 5 {times} {print} 'Yardım edin!'\n{print} 'Neden kimse bana yardım etmiyor?'" 3: header: Yazdır komutunu unutmayın - text: tekrar komutunu kullanırken `{print}` komutunu unutmayın. + text: tekrarla komutunu kullanırken `{print}` komutunu unutmayın. + debug: 'True' + code: "{repeat} 5 {times} 'Yardım edin!'" 4: header: Bir sor komutunu tekrarlayın - text: Ayrıca bir `{ask}`, `{if}` veya `{else}` komutunu birden çok kez tekrarlayabilirsiniz. + text: Ayrıca bir `{ask}`, `{if}` veya `{else}` komutunu da birden çok kez tekrarlayabilirsiniz. + code: "{repeat} 2 {times} cevap = {ask} 'Bir soruyu birden fazla kez sorabileceğinizi biliyor muydunuz?'\n{if} cevap {is} evet {repeat} 2 {times} {print} 'Bunu zaten biliyordunuz!'\n{else} {repeat} 3 {times} {print} 'Yeni bir şey öğrendiniz!'" 6: header: Hazır ol Ayarla Başla! text: Seviye 7'deki maceraların tadını çıkarın! + 5: + debug: 'True' + code: "{print} Issız bir adada mahsur kaldınız.\n{repeat} 3 'Yardım edin!'\nkurtarıldı = {ask} Kurtarmaya gelen oldu mu?\n{if} kurtarıldı evet {is}\n{print} Şanslısınız!\n{else} {repeat} 3 {times} 'YARDIM EDİN!'\nkurtarıldı = 'Peki ya şimdi?'\n{if} Evet.\n{print} 'Yaşasın!\n{else} 'Çok yazık. Pekala... bir barınak inşa etme ve biraz yiyecek bulma zamanı.'" + header: Hata Ayıklama + text: Bu kodda hata ayıklayalım! 8: 1: header: Seviye 8'e hoş geldiniz @@ -312,7 +399,9 @@ levels: text: |- Önceki seviyelerde, `{repeat}` komutu aşağıdaki gibi görünüyordu: - Yalnızca bir satır kodu tekrarlayabilirsiniz. + Yalnızca bir satır kodu tekrarlayabiliyordunuz. + code: "{repeat} 5 {times} {print} 'Yardım edin!'" + debug: 'True' 3: header: şimdiki {repeat} komutları text: |- @@ -320,24 +409,30 @@ levels: Bunu girinti kullanarak yaparsınız. Tekrarlamak istediğiniz her satırın başında aşağıdaki gibi 4 boşluk (veya bir sekme) kullanın: + code: "{repeat} 5 {times}\n {print} 'Herkese merhaba'\n {print} 'Bu 5 kez yazdırılacaktır'" 4: header: şimdiki {repeat} komutları text: |- İsterseniz `{repeat}` komutundan sonra girinti yapmadan devam edebilirsiniz. Girinti ile başlamayan satırlar tekrarlanmayacaktır. + code: "{repeat} 3 {times}\n {print} 'Merhaba!'\n{print} 'Tekrarlamaktan bıktık!'" 5: header: önceki eğer ve değilse text: |- Aynı şey `{if}` ve `{else}` komutları için de geçerlidir. Bunlar daha önceki komutlardı: + code: "{if} isim {is} Hedy {print} 'güzel'\n{else} {print} 'böö!'" + debug: 'True' 6: header: şimdiki eğer ve değilse text: |- Bunlar şimdiki `{if}` ve `{else}` komutlarıdır. `{if}` ve `{else}` komutlarından sonraki her satır girinti ile başlar. + code: "isim = {ask} 'Adın ne senin?'\n{if} isim {is} Hedy\n {print} 'Hoş geldin Hedy'\n{else}\n {print} 'Hoş geldin programcı!'" 7: header: girintiyi durdurmak - text: Tıpkı `{repeat}` komutunda olduğu gibi, girinti kullanmayı bırakırsanız satırlar her zaman gösterilecektir., sadece ifade doğru olunca değil. + text: Tıpkı `{repeat}` komutunda olduğu gibi, girinti kullanmayı bırakırsanız satırlar her zaman gösterilecektir, sadece ifade doğru olunca değil. + code: "isim = {ask} 'Adın ne senin?'\n{if} isim {is} Hedy\n {print} 'Hoş geldin Hedy'\n{else}\n {print} 'Hoş geldin programcı!' \n{print} '3..2..1.. Programlamaya başla!'" 8: header: eğer ifadeleri içinde eğer ifadeleri text: |- @@ -346,103 +441,178 @@ levels: 10: header: Hadi maceralara bir göz atalım! text: Seviye 8'deki maceraların tadını çıkarın! + 9: + debug: 'True' + header: Hata Ayıklama + text: Bu kodda hata ayıklayalım! + code: "{print} 'HedyWheels otobüs bileti makinesi'\nbölge_1 = Belediye Binası, Kütüphane, Kampüs, Pazar Yeri\nbölge_2 = Yüzme Havuzu, Kaykay Parkı, Alışveriş Merkezi, Havaalanı\nhedef = 'Nereye gitmek istiyorsun?'\n{if} hedef {in} bölge 1\n{print} hedef ' bölge 1 içinde'\nücret = 30 lira\n {if} hedef {is} bölge_2\n{print} hedef 'bölge 2 içinde'\nücret = 60\nbilet_türü = {ask} 'Tek kullanımlık bilet için 1'e basın.\nGidiş-dönüş bileti için 2'ye basın:'\n{if} bilet_türü = 1\n{print} 'Tek kullanımlık bir bilet seçtiniz'\n{else}\n {print} Gidiş-dönüş bileti seçtiniz'\nücret * 2\n{print} 'Toplam ' ücret ' lira tutuyor'" 9: 1: - header: 9. seviyeye hoş geldiniz + header: Seviye 9'a hoş geldiniz text: |- - Bu seviyede, bir `{if}` veya bir `{repeat}` komutundan sonra birden fazla kod satırı kullanabilirsiniz. + Bu seviyede artık, bir `{if}` veya bir `{repeat}` komutundan sonra birden fazla kod satırı kullanabilirsiniz. Bir `{repeat}` komutunu başka bir `{repeat}` komutunun içine bile koyabilirsiniz. 2: header: '`{repeat}`dan sonra çoklu satırlar' - text: Artık `{repeat}` dan sonra birden fazla satır kullanmanıza izin var. + text: Bu seviyede artık `{repeat}` ve `{if}` komutlarını birleştirerek kullanabilirsiniz. + code: "{repeat} 3 {times}\n yemek = {ask} 'Ne yemek istiyorsun?'\n {if} yemek {is} pizza\n {print} 'güzel!'\n {else}\n {print} 'pizza daha iyi'" 3: header: Girinti önemlidir! text: Girinti, bilgisayara hangi satırların tekrarlanması gerektiğini ve hangi satırların yalnızca bir kez çalıştırılması gerektiğini söylemek için çok önemlidir. + code: "{repeat} 3 {times}\n {print} 'Bu satır tekrarlanacaktır...'\n {print} 'Bu da öyle...'\n{print} 'ama bunun tekrarı olmayacak!'" 4: header: '`{if}` den sonra çoklu satırlar' text: '`{if}` den sonra da birden fazla satır kullanabilirsiniz' + code: "devam = {ask} 'Devam etmek istiyor musun?'\n{if} devam = evet\n emin = {ask} 'Emin misin?'\n {if} emin {is} evet\n {print} 'Devam edeceğiz'\n {else}\n {print} 'Emin değilsin'\n{else}\n {print} 'Devam etmek istemiyorsun'" 5: header: Girinti önemlidir text: Tekrarlayalım, girinti hala çok önemlidir ve kodda büyük bir fark yaratabilir. + code: "devam = {ask} 'Devam etmek istiyor musun?'\n{if} devam = evet\n emin = {ask} 'Emin misin?'\n {if} emin {is} evet\n {print} 'Devam edeceğiz'\n{else}\n {print} 'Emin değilsin'" 6: header: Bir `{repeat}` içinde bir `{if}` text: |- Artık bu komutlardan sonra birden fazla kod satırı kullanabildiğinize göre, bunları birbirinin içine de koyabilirsiniz. Şuna bir bakın: + code: "{repeat} 3 {times}\n yemek = {ask} 'Ne yemek istiyorsun?'\n {if} yemek {is} pizza\n {print} 'güzel!'\n {else}\n {print} 'pizza daha iyi'" 7: header: Girintiye dikkat edin text: Bu kodun dördüncü ve altıncı satırlarının 8 boşluklu girinti ile başladığına dikkat edin. + code: "{repeat} 3 {times}\n yemek = {ask} 'Ne yemek istiyorsun?'\n {if} yemek {is} pizza\n {print} 'güzel!'\n {else}\n {print} 'pizza daha iyi'" 9: header: Hadi başlayalım! text: Seviye 9'daki maceraların tadını çıkarın! + 8: + debug: 'True' + code: "{print} 'Paraşütle atlama maceranız HedyJumps'a hoş geldiniz!'\nkişiler = {ask} 'Bugün kaç kişiyle birlikte atlıyorsunuz?\n{print} 'Güvenlik nedeniyle hepinize bazı sorular soracağız.'\nek_talimatlar_kişiler = a, b\n{repeat} 3 {times}\n isim = {ask} 'Adınız nedir?'\nönceki_atlayış = 'Daha önce hiç paraşütle atladınız mı, ' isim '?'\n{if} önceki_atlayış hayır\n{print} 'Endişelenmeyin, 13 numaralı odada ekstra bir güvenlik eğitimi alacaksınız'\n{add} isim {to_list} ek_talimatlar_kişiler\n{else}\n{print} 'Eğlenceli!'\n{print} 'Güvenlik sorularını doldurduğunuz için herkese teşekkürler. Atlayışınızın tadını çıkarın!'" + header: Hata Ayıklama + text: Bu kodda hata ayıklayalım! 10: 1: - header: 10. seviyeye hoş geldiniz + header: Seviye 10'a hoş geldiniz text: 'Bu seviyede yeni bir komut öğreneceksiniz: `{for}`.' 2: header: için komutu - text: '"için" ile bir liste oluşturabilir ve bu listedeki tüm öğeleri kullanabilirsiniz. `{for}`, "tekrar" gibi bir blok oluşturur ve eğer öyleyse bloktaki tüm satırların girinti ile başlaması gerekir (4 boşluk).' + text: '`{for}` ile bir liste oluşturabilir ve bu listedeki tüm öğeleri kullanabilirsiniz. `{for}`, `{repeat}` gibi bir blok oluşturur ve bu yüzden bloktaki tüm satırların girinti ile başlaması gerekir (4 boşluk).' + code: "hayvanlar = köpek, kedi, blob balığı\n{for} hayvan {in} hayvanlar\n {print} 'Benim sevdiğim ' hayvan" 3: header: için komutu text: 'Burada `{for}` komutunun başka bir örneğini görüyorsunuz:' + code: "günler = Pazartesi, Salı, Çarşamba, Perşembe, Cuma, Cumartesi, Pazar\nisimler = anne, baba, Ceyda, Emine\n{for} gün {in} günler\n {print} isimler {at} {random} ' bulaşıkları ' gün ' günü yıkayacak.'" 5: header: Programlama zamanı! text: Seviye 10'daki maceraların tadını çıkarın! + 4: + header: Hata Ayıklama + debug: 'True' + text: Bu kodda hata ayıklayalım + code: "{print} 'Bayanlar ve baylar!'\n{print} 'Bir geceliğine ve sadece bir geceliğine Hedy sirkinde!'\ngösteriler = bir topun içinden ateşlenme, ipte yürüme, kendini bir bavula koyma,\nkişiler = İnanılmaz Iris Muhteşem Ahmet Fantastik Francis\n {for} kişiler {in} gösteriler\nseçilen_kişi {is} kişiler {random}\n seçilen_kişi ' bize ' gösteri ' gösterisini yapacak'\n{add} seçilen_kişi {from} kişiler\n{print} 'Gelin ve bu akşamki gösterimizi izleyin!'\n{print} 'Biletler sadece gişeden temin edilebilir" 11: 1: header: Seviye 11'e hoş geldiniz text: |- - Bu seviyede, `{for}` komutunun yeni bir şeklini ekliyoruz. Daha önceki seviyelerde "için" komutunu bir liste ile kullanmıştık, ancak "için" komutunu sayılarla da kullanabiliriz. + Bu seviyede, `{for}` komutunun yeni bir şeklini ekliyoruz. Daha önceki seviyelerde `{for}` komutunu bir liste ile birlikte kullanmıştık, ancak `{for}` komutunu sayılarla da kullanabiliriz. Bu şekilde artık `{repeat}` komutuna ihtiyaç duymayız. 2: header: için komutu - text: 'Yeni "için" komutu bu şekilde görünür:' + text: 'Yenilenmiş `{for}` komutu bu şekilde görünür:' + code: "{for} sayaç {in} {range} 1 {to} 10\n {print} sayaç\n{print} 'Önüm arkam sağım solum sobe, saklanmayan ebe!'" 3: header: i değişkeni text: |- Önceki slaytta değişkene 'sayaç' ismi verilmişti, çünkü geri sayım yapıyordu. Elbette değişken için istediğiniz herhangi bir ismi kullanabilirsiniz. - Python gibi programlama dillerinde bu durumdaki değişkenler için kullanılan standart isim 'i' dir. + Python gibi programlama dillerinde bu durumdaki değişkenler için verilen standart isim 'i' dir. Şuna benziyor: + code: "sayı = 10\n{for} i {in} {range} 1 {to} 10\n {print} i * sayı" 5: header: Hadi programlamaya geçelim! text: Seviye 11'deki maceraların tadını çıkarın! + 4: + code: "çarpan {is} {ask} 'Çarpım tablosunun hangi kısmına ihtiyacınız var?'\n{repeat} {for} sayılar {in} {range} 1 {to} 10 {times}\n {print} Bu, çarpan için çarpım tablosudur\n {print} sayı ' x ' çarpan ' = ' i * çarpan" + text: Bu kodda hata ayıklayalım! + header: Hata Ayıklama + debug: 'True' 12: 1: - header: 12. seviyeye hoş geldiniz - text: Bu seviyeden itibaren ondalık sayıları kullanmanıza izin var ve tırnak işaretlerinde bazı değişiklikler yapılır. + header: Seviye 12'ye hoş geldiniz + text: "Bu seviyeden itibaren ondalıklı sayıları kullanmanıza izin var ve tırnak işaretleriyle ilgili bazı değişiklikler yapıldı.\nAyrıca, bu seviyeden itibaren fonksiyonları da kullanabilirsiniz!" 2: header: Tırnak işaretleri text: |- Bu seviye tırnak işaretlerinin kullanımında bazı değişiklikler yapar. Şu andan itibaren, **tüm metinlerin** tırnak işareti içinde olması gerekmektedir. Buna değişkenlerin değerleri, listelerdeki öğeler ve {if} komutlarından sonraki metinler de dahildir. + code: "isim = 'Robot Hedy'\n{print} 'Merhaba ' isim" 3: - header: Ondalık sayılar + header: Ondalıklı sayılar text: |- Bu seviyeden itibaren ondalık sayıları kullanmanıza da izin verilir. Bu, restoranınız gibi programları daha da iyi hale getirebilir! - Sayılar tırnak içine alınmaz. + Sayıların, sayısal değeri gerekmiyorsa tırnak içine alınması gerekmez. + code: "{print} 'ondalık sayıların artık bir nokta kullanması gerekiyor'\n{print} 2.5 + 2.5" + 5: + text: "Bu programda bir fonksiyon örneği görüyorsunuz.\nBakalım şarkının geri kalanını doldurursanız ne olacak!" + header: Parla parla küçük yıldız! + code: "{define} parla\n {print} 'Twinkle'\n {print} '...'\n\n{call} parla\n{print} 'Up above the world so high'\n{print} 'Like a diamond in the sky'\n{call} parla" + 8: + text: Seviye 12'deki maceraların tadını çıkarın! + header: Denemeye hazır mısınız? + 4: + header: Fonksiyonlar! + text: "Bu seviyede fonksiyonları nasıl kullanacağınızı öğreneceksiniz. Bir fonksiyon, birden çok kez kolayca kullanabileceğiniz bir kod bloğudur. Fonksiyonları kullanmak, tekrar tekrar kullanacağımız kod parçalarını düzenlememize yardımcı olur. Bir fonksiyon oluşturmak için `{define}` kullanın ve fonksiyona bir isim verin. Ardından fonksiyonda olmasını istediğiniz tüm satırları `{define}` satırının altına girintili bir blok halinde yerleştirin. Güzel ve düzenli görünmesi için kodunuzun sonunda boş bir satır bırakın. Harika bir iş çıkardınız! Bir fonksiyon yarattınız!\n\nŞimdi, bu kod bloğuna ne zaman ihtiyacımız olursa, onu çağırmak için fonksiyonun adıyla birlikte `{call}` kullanmamız yeterli! O kod bloğunu tekrar yazmak zorunda değiliz." + 7: + text: Bu kodda hata ayıklayalım! + header: Hata Ayıklama + debug: 'True' + code: "{call} yeni_üye\n{print} 'Merhaba yeni üye!'\nkullanıcı_adı = {ask} 'Kullanıcı adınız nedir?'\nşifre = 'Parolanız nedir?'\n{print} 'Kulübümüze hoş geldiniz!'\n\nkullanıcı_adı = {ask} 'Lütfen kullanıcı adınızı giriniz. Yeni üye misiniz? O zaman Yeni Üye yazın'\n{if} kullanıcı_adı = Yeni Üye\n{call} yeni̇ üye\n {else}\n şifre = {ask} 'Lütfen şifreyi girin'" + 6: + header: Fonksiyonlar + text: Örnekte görebileceğiniz gibi bir fonksiyon, herhangi bir zamanda çağrılabilen bir kod bloğudur. Fonksiyonu ayarlamak için `{define}` ve kullanmak için `{call}` kullanırsınız. 13: 1: - header: 13. seviyeye hoş geldiniz - text: Şimdi `{and}` ve `{or}` komutlarını öğreneceğiz! İki ifadeyi kontrol etmek istiyorsanız, iki if kullanmak zorunda değilsiniz, ancak "ve" ve "veya" kullanabilirsiniz. + header: Seviye 13'e hoş geldiniz + text: "Şimdi `{and}` ve `{or}` komutlarını öğreneceğiz! İki tane ifadeyi kontrol etmek istiyorsanız, iki tane `{if}` kullanmak zorunda değilsiniz, bunun yerine`{and}` ve `{or}`kullanabilirsiniz.\nAyrıca, şu andan itibaren fonksiyonlarınızda argümanlar da kullanabilirsiniz." 2: - header: '"ve" komutu' + header: '`{and}` komutu' text: |- - `{and}` komutu her zaman {if} komutu ile birlikte kullanılır. + `{and}` komutu her zaman `{if}` komutu ile birlikte kullanılır. Bu şekilde 2 ifadenin doğru olup olmadığını kontrol edebilirsiniz. Örneğin: + code: "isim = {ask} 'Adınız nedir?'\nyaş = {ask} 'Yaşınız kaç?'\n{if} isim {is} 'Hedy' {and} yaş {is} 2\n {print} \"Sen gerçek Hedy'sin!\"" 3: - header: '"veya" komutu' + header: '`{or}` komutu' text: |- - `{veya}`, {ve}` komutuyla aynı şekilde çalışır, ancak iki ifadeden yalnızca birinin doğru olması gerekir. + `{or}`, `{and}` komutuyla aynı şekilde çalışır, ancak iki ifadeden yalnızca birinin doğru olması yeterlidir. - Şimdi `{ve}` yerine `{veya}` yazdığınızda ne olacağını görelim. + Şimdi `{and}` yerine `{or}` yazdığınızda ne olacağını görelim. + code: "isim = {ask} 'Adınız nedir?'\n{if} isim {is} 'Hedy' {or} isim {is} 'hedy'\n {print} 'Hoş geldiniz!!'" + 9: + header: Hadi başlayalım! + text: Seviye 13'teki maceraların tadını çıkarın! + 6: + header: Değişkenlerle örnek + text: "Fonksiyonları bir soru ile birleştirip kullanabilirsiniz\n\nBu değişiklikleri yaparsanız ne olur?\n```\n{define} şarkı {with} yer\n {print} 'My Bonnie is ' yer\n\ncevap {is} {ask} 'Where is my Bonnie?'\n{call} şarkı {with} cevap\n```" + code: "{define} şarkı {with} yer\n {print} 'My Bonnie is over the ' yer\n\n{call} şarkı {with} 'ocean'\n{call} şarkı {with} 'sea'\n{call} şarkı {with} 'ocean'" + 8: + header: Hata Ayıklama + text: Bu kodda hata ayıklayalım! + code: "{define} mutluluk{with} kişi\n {print} '🥳'\n{play} G\n{play} A\n{play} B\n{print} 'Partiye devam, ' isim\n{define} mutsuzluk\n{print} '😞'\n{play} E\n{play} D\n{play} C\n{print} 'Umarım daha iyi hissedersin, ' name\n\nisim = {ask} 'Nedir senin' isim '?'\nruh_hali = {ask} 'Mutlu musun yoksa üzgün mü?'\n{if} ruh_hali = mutlu\n {call} mutluluk {with} kişi\n{else} ruh_hali = üzgün\n {define} mutsuzluk {to} isim" + debug: 'True' + 5: + header: Örnek + text: "Bu örnekte 'yer' argümanının fonksiyonda nasıl kullanıldığını görüyorsunuz.\nKodu çalıştırın ve 'ocean' ve 'sea'yi başka bir şeyle değiştirin ve ne olduğunu görün." + code: "{define} şarkı {with} yer\n {print} 'My Bonnie is over the ' yer\n\n{call} şarkı {with} 'ocean'\n{call} şarkı {with} 'sea'\n{call} şarkı {with} 'ocean'" + 4: + header: Argümanlı fonksiyonlar + text: Artık fonksiyonları nasıl kullanacağınızı öğrendiğinize göre, bir fonksiyonu bir **argüman** ile nasıl kullanacağınızı öğreneceksiniz. Argüman, bir fonksiyonun içinde kullanılan bir değişkendir. Fonksiyonun dışında kullanılmaz. + 7: + code: "{define} şarkı {with} yer\n {print} 'My Bonnie is over the ' yer\n\n{call} şarkı {with} 'ocean'\n{call} şarkı {with} 'sea'\n{call} şarkı {with} 'ocean'" + text: "Şimdi fonksiyon ile daha fazla soruyu birleştirdik. Bu kodu yazın ve ne olacağını görün.\n\nDeğişkenlerin ve argümanların nasıl aynı isme sahip olduğuna dikkat edin. Buna izin verilir.\nKafanızı karıştırıyor mu? Sadece farklı isimler kullanın, buna da izin verilir.\n```\n{define} şarkı {with} isim, yer\n {print} 'My ' isim ' is over the ' yer\n\nisim {is} {ask} 'Kim?'\nyer {is} {ask} 'Nerede?'\n{call} şarkı {with} isim, yer\n```" + header: Daha fazla soru! 14: 1: - header: 14. seviyeye hoş geldiniz - text: Bu seviyede, programlarınızı geliştirmenize yardımcı olabilecek ">" gibi bazı yeni semboller öğreneceksiniz. + header: Seviye 14'e hoş geldiniz + text: Bu seviyede, programlarınızı geliştirmenize yardımcı olabilecek ">" gibi bazı yeni semboller öğreneceksiniz. Ayrıca bir fonksiyonun geri dönüş değerleriyle çalışmayı da öğreneceksiniz. 2: header: Semboller text: |- @@ -457,6 +627,7 @@ levels: <= küçük veya eşittir anlamına gelir... Bunları şu şekilde kullanabilirsiniz: + code: "yaş = {ask} 'Kaç yaşındasın?'\n{if} yaş < 13\n {print} 'Sen benden daha gençsin!'\n{else}\n {print} 'Sen benden daha yaşlısın!'" 3: header: Semboller text: |- @@ -467,55 +638,92 @@ levels: != benzer/eşit değil == `{if}` ifadelerinde kullanılır. + code: "cevap = {ask} 'Daha fazlasını öğrenmek ister misiniz?'\n{if} cevap == 'evet'\n {print} 'Sıradaki maceraya gidin!'\n{if} cevap != 'evet'\n {print} 'Yazık oldu!'" + 4: + header: Dönüş değeri + text: Önceki seviyelerde fonksiyon oluşturmayı ve onlarla argüman kullanmayı öğrendiniz. Bir fonksiyonun bir başka harika kullanımı da sizin için bir şey hesaplamasına izin vermektir. Fonksiyona bir hesaplama verebilirsiniz ve o da size hesaplamanın cevabını verecektir. Bu cevaba **geri dönüş değeri** denir. + 6: + header: Hata Ayıklama + debug: 'True' + text: Bu kodda hata ayıklayalım! + code: "ürün = 'satın alınmadı'\n{print} 'Bu ürünü satın almak istiyorum'\nücret == {ask} 'Fiyatı ne kadar?'\n{if} ücret küçük yada eşit 10\n {print} 'Bu harika bir anlaşma!'\n ürün = 'satıldı'\n{if} ücret büyük yada eşit 10 {and} küçük yada eşit 20\n {print} 'Tamamdır'\n ürün = 'satıldı'\n{if} ücret büyük yada eşit 20 {and} küçük 50\n {print} 'Bu biraz fazla!'\n{if} ücret büyük yada eşit 50\n {print} 'İmkanı yok.!'\n{if} ürün =! satıldı\n {print} 'Yazık... Satın almayacağım.'\n{else}\n {print} 'Satın alacağım! Teşekkür ederim!'" + 5: + header: Dönüş değeri + code: "{define} yeni_ücreti_hesapla {with} miktar, yüzdelik\n yüzdelik = yüzdelik / 100\n indirim_miktarı = miktar * yüzdelik\n {return} miktar - indirim_miktarı\n\neski_ücret = {ask} 'Fiyat etiketinde ne kadar yazıyor?'\nindirim = {ask} 'İndirim yüzde kaç?'\n\nyeni_ücret = {call} yeni_ücreti_hesapla {with} eski_ücret, indirim\n{print} 'Yeni fiyat ' yeni_ücret ' liradır'" + text: Örneğin, bu kodda yeni_ücreti_hesapla fonksiyonu herhangi bir öğenin yeni fiyatını hesaplayacaktır. Size geri dönüş değeri olarak yeni fiyatı verecektir. + 7: + header: Hadi işe koyulalım! + text: Seviye 14'teki maceraların tadını çıkarın! 15: 1: header: Seviye 15'e hoş geldiniz text: Bu seviyede `{while}` döngüsü hakkında bilgi edineceksiniz. 2: text: |- - Yeni bir döngü öğreneceğiz, "iken" döngüsü! Döngü, ifade doğru olduğu sürece devam eder. Bu yüzden döngü içinde bu değeri değiştirmeyi unutmayın. + Yeni bir döngü öğreneceğiz, `{while}` döngüsü! Döngü, ifade doğru olduğu sürece devam eder. Bu yüzden döngü içinde bu değeri değiştirmeyi unutmayın. Bu örnek kodda, doğru bir cevap verilene kadar devam ediyoruz. Doğru cevap hiç verilmezse, döngü asla sona ermeyecektir! + header: '{while}' + code: "cevap = 0\n{while} cevap != 25\n cevap = {ask} '5 kere 5 kaç eder?'\n{print} 'Doğru bir cevap verildi!'" 4: - header: Hadi deneyelim! + header: Hadi gidip deneyelim! text: Seviye 15'teki maceraların tadını çıkarın! + 3: + header: Hata Ayıklama + code: "sayılar = 1, 2\n\n{for} i {in} {range} 3 {to} 50\n {add} x {to_list} sayılar\n i = + 1\n\nrastgele_sayı = sayılar {random}\ntahminler = 10\n\n{while} tahmin = 0\n cevap = 'Sayıyı tahmin et:'\n {if} cevap >= rastgele_sayı\n {print} 'aşağı in'\n tahminler = tahminler -1\n {if} cevap > rastgele_sayı\n {print} 'yukarı çık!'\n tahminler = tahminler\n {else} cevap = rastgele_sayı\n {print} 'doğru'\n tahminler = 10" + text: Bu kodda hata ayıklayalım! + debug: 'True' 16: 1: - header: 16. seviyeye hoş geldiniz + header: Seviye 16'ya hoş geldiniz text: Bu seviyede [köşeli parantezler] hakkında bilgi edinecek ve bunları nasıl kullanacağınızı öğreneceksiniz. 2: header: Köşeli parantezler - text: Python yöntemiyle listeler yapacağız, ve bu listelerin etrafında köşeli parantezler olacak! Ayrıca önceki seviyelerde öğrendiğimiz gibi her öğenin etrafında tırnak işaretlerini tutuyoruz. Köşeli parantezleri listedeki bir yeri belirtmek için kullanıyoruz. "rastgele" komutu artık kullanılamaz. + text: Python'un kullandığı yoldan listeler yapacağız ve bu listelerin etrafında köşeli parantezler olacak! Ayrıca önceki seviyelerde öğrendiğimiz gibi her öğenin etrafında tırnak işaretlerini tutuyoruz. Köşeli parantezleri listedeki bir yeri belirtmek için kullanıyoruz. `{at} {random}` komutu artık kullanılamaz. + code: "arkadaşlar = ['Ahmed', 'Ben', 'Cayden']\n{print} arkadaşlar[1] ' listedeki ilk arkadaştır.'\n{print} arkadaşlar[2] ' listedeki ikinci arkadaştır.'\n{print} arkadaşlar[3] ' listedeki üçüncü arkadaştır.'\n# şimdi i değişkenini kullanarak 2 listeyi eşleştireceğiz\nşanslı_numaralar = [15, 18, 6]\n{for} i {in} {range} 1 {to} 3\n {print} arkadaşlar[i] ' için şanslı numara ' şanslı_numaralar[i]" 4: header: Hadi deneyelim! text: Seviye 16'daki maceraların tadını çıkarın! + 3: + text: Bu kodda hata ayıklayalım! + header: Hata Ayıklama + debug: 'True' + code: "{print} 'Arkadaşlık testi'\n{konular} = ['şarkı', 'film', 'yiyecek', 'içecek']\ncevaplar_oyuncu_1 = []\ncevaplar_oyuncu_2 = []\npuan = 100\n\n{for} i {in} {range} 1 {to} 4\n cevap = {ask} 'En sevdiğin' konular[i] ' hangisi?'\n{add} cevap {to_list} cevaplar_oyuncu_1\n\n{print} 'Oyuncu 2, sıra sende!'\n{for} i {in} {range} 0 {to} 4\n cevap_oyuncu_2 = {ask} 'oyuncu 1'in en sevdiği ' konular ' hangisidir?'\n {add} cevap_oyuncu_2 {in} cevaplar_oyuncu_2\n {if} cevaplar_oyuncu_2[2] == cevaplar_oyuncu_1[1]\n {print} 'Doğru!'\n {else}\n {print} 'Yanlış!'\n puan = puan - 25\n\n{print} 'Oyuncu 2, toplam puanın %' puan\n\n{if} puan = 100\n {print} 'Sen harika bir arkadaşsın'\n{if} puan < 100 {or} puan >= 50\n {print} 'Daha iyisini yapabilirsin'\n{else} puan < 50\n {print} 'Bu kişiyi tanıyor musun ki?!'" 17: 1: header: Seviye 17'ye hoş geldiniz - text: Bu seviyede iki nokta üst üste işaretinin nasıl kullanılacağını ve "değileğer" komutunu öğreneceksiniz. + text: Bu seviyede iki nokta üst üste işaretinin nasıl kullanılacağını ve `{elif}` komutunu öğreneceksiniz. 2: header: İki nokta üstüste text: Şimdi girintilemeyi biraz değiştireceğiz. Girintiye ihtiyaç duyduğumuz her seferinde, girintiden önceki satırda ":" işaretine ihtiyacımız var. + code: "ücretler = ['1 milyon dolar', 'bir elmalı turta', 'hiçbir şey']\nsenin_ücretin = ücretler[{random}]\n{print} 'Kazandığın ' senin_ücretin\n{if} senin_ücretin == '1 milyon dolar' :\n {print} 'Evet! Sen artık zenginsin!'\n{else}:\n {print} 'Bir dahaki sefere iyi şanslar.'" 3: - header: değileğer - text: 'Bu seviyede yeni bir komutu da kullanabilirsiniz: değileğer. değileğer, "değilse eğer" ''in kısaltmasıdır ve 3 (veya daha fazla!) seçenek yapmak istediğinizde buna ihtiyacınız vardır. Şuna bir göz atın!' + header: '`{elif}`' + text: 'Bu seviyede yeni bir komutu da kullanabilirsiniz: `{elif}`. `{elif}`, "değilse eğer" ''in kısaltmasıdır ve 3 (veya daha fazla!) seçenek yapmak istediğinizde buna ihtiyacınız vardır. Şuna bir göz atın!' + code: "ücretler = ['1 milyon dolar', 'bir elmalı turta', 'hiçbir şey']\nsenin_ücretin = ücretler[{random}]\n{print} 'Kazandığın ' senin_ücretin\n{if} senin_ücretin == '1 milyon dolar' :\n {print} 'Evet! Sen artık zenginsin!'\n{elif} senin_ücretin == 'bir elmalı turta' :\n {print} 'Çok güzel, elmalı turta!'\n{else}:\n {print} 'Bir dahaki sefere iyi şanslar.'" 5: header: Hadi deneyelim! text: Seviye 17'deki maceraların tadını çıkarın! + 4: + debug: 'True' + text: Bu kodda hata ayıklayalım! + header: Hata Ayıklama + code: "{define} yön_sor\n yön = {ask} 'Nereye gitmek istiyorsun?'\n {if} yön = 'geriye'\n {turn} 180\n {else} yön == 'sağa'\n {turn} 90\n {else} yön == 'sola'\n {turn} 270\n {forward} 100\n\ndevam = 'evet'\n\n{while} devam == 'evet'\n {print} yön_sor\n {sleep}\n devam = 'Biraz daha çizmek ister misin?'\n {sleep}" 18: 1: - header: 18. seviyeye hoş geldiniz - text: Tebrikler! Hedy'nin son seviyesine ulaştınız! Burada oluşturduğunuz kodu replit veya PyCharm gibi gerçek Python ortamlarına kopyalayabilir ve orada öğrenmeye devam edebilirsiniz! Ancak Python'un yalnızca İngilizce komutları okuyabildiğini unutmayın, bu nedenle başka diller kullanıyorsanız, şimdi İngilizce'ye geçmeniz gerekecektir. + header: Seviye 18'e hoş geldiniz + text: Tebrikler! Hedy'nin son seviyesine ulaştınız! Burada oluşturduğunuz kodu replit veya PyCharm gibi gerçek Python ortamlarına kopyalayabilir ve orada öğrenmeye devam edebilirsiniz! Ancak Python'un yalnızca İngilizce komutları okuyabildiğini unutmayın, bu nedenle başka diller kullanıyorsanız, şimdi sayfayı İngilizce'ye geçirmeniz gerekecektir. 2: header: Python yolu text: |- - Gerçek Python koduna ulaştık! Bu, bundan sonra yazdır ve aralık ile parantez kullanmamız gerektiği anlamına geliyor. + Gerçek Python koduna ulaştık! Bu, bundan sonra `{print}` ve `{range}` ile parantez kullanmamız gerektiği anlamına geliyor. Ayrıca, birden fazla öğe yazdırmak istiyorsanız, bunları virgülle ayırmanız gerekir. - Python kodunu elde etmek için yapmamız gereken son değişiklik "sor" komutunu "girdi" komutu ile değiştirmek. + Python kodunu elde etmek için yapmamız gereken son değişiklik `{ask}` komutunu `{input}` komutu ile değiştirmek. Tüm örnekler için 'yazdır' sekmesine tıklayın. + editor: /hedy/18 3: header: En son maceralar! text: Seviye 18'de en son maceraların tadını çıkarın! diff --git a/content/slides/uk.yaml b/content/slides/uk.yaml index a3f7b2d128f..7a46c1245de 100644 --- a/content/slides/uk.yaml +++ b/content/slides/uk.yaml @@ -562,7 +562,7 @@ levels: code: |- {define} пісня {with} місце {print} 'Мій Бонні над ' місце - + {call} пісня {with} 'океан' {call} пісня {with} 'море' {call} пісня {with} 'океан' @@ -589,7 +589,7 @@ levels: code: |- {define} пісня {with} місце {print} «Моя Бонні тут » місце - + {call} пісня {with} 'океан' {call} пісня {with} 'море' {call} пісня {with} 'океан' @@ -600,7 +600,7 @@ levels: code: |- {define} щастя {with} name {print} '🥳' - + {play} G {play} A {play} B @@ -619,7 +619,7 @@ levels: {define} печаль {to} імя 1: header: Ласкаво просимо на 13 рівень - text: "Зараз ми вивчимо `{and}` та `{or}`! Якщо ви хочете перевірити два твердження, вам не обов’язково використовувати два ifs, але можна використовувати and і or.\nВідтепер ви також можете використовувати аргументи у своїх функціях." + text: "Зараз ми вивчимо `{and}` та `{or}`! Якщо ви хочете перевірити два твердження, вам не обов’язково використовувати два `{if}``, але замість них можна використати `{and}` і `{or}``. \nВідтепер ви також можете використовувати аргументи у своїх функціях." 3: header: Команда або text: "Команда `{or}` працює так само, як команда `{and}``, але лише 1 із двох тверджень має бути істинним.\n\nДавайте подивимося, що станеться, коли ви зміните `{and}` на `{or}`." @@ -649,10 +649,10 @@ levels: відсоток = відсоток / 100 знижка = ціна * відсоток {return} ціна - знижка - + старa_ціна = {ask} 'Як багато коштує на цінному тегі?' знижка = {ask} 'Що відсоток є знижка?' - + нова_ціна = {call} розрахунок_нова_ціна {with} старa_ціна, знижка {print} 'Нова ціна ' нова_ціна ' долар ' text: Наприклад, у цьому коді функція calculate_new_price обчислить нову ціну будь-якого товару. Це дасть вам нову ціну як значення повернення. @@ -715,7 +715,7 @@ levels: {define} близнюки {print} 'Помилки' {print} '...' - + {call} близнюки {print} 'Зверху над світом так висока' {print} 'Подивитися діамант в небі' diff --git a/grammars/keywords-tr.lark b/grammars/keywords-tr.lark index b7191f6165a..ad375779c8a 100644 --- a/grammars/keywords-tr.lark +++ b/grammars/keywords-tr.lark @@ -4,7 +4,7 @@ _WITH: ("ile" | "with") _SPACE? _DEF: ("tanı" | "def") _SPACE? _RETURN: ("geridön" | "return") _SPACE? _PRINT: ("yazdır" | "print") _SPACE? -_PLAY: ("play" | "play") _SPACE +_PLAY: ("oynat" | "play") _SPACE _ASK: ("sor" | "ask") _ECHO: ("yankıla" | "echo") _SPACE? _FORWARD: ("ileri" | "forward") _SPACE? @@ -50,5 +50,5 @@ _LENGTH: "uzunluk" | "length" _COLOR : ("renk" | "color") _SPACE? _PRESSED: ("basılı" | "pressed") _SPACE? clear: ("temizle" | "clear") _SPACE? -TRUE: ("true" | "True" | "true" | "True") _SPACE? -FALSE: ("false" | "False" | "false" | "False") _SPACE? +TRUE: ("doğru" | "Doğru" | "true" | "True") _SPACE? +FALSE: ("yanlış" | "Yanlış" | "false" | "False") _SPACE? diff --git a/highlighting/highlighting-trad.json b/highlighting/highlighting-trad.json index e96e7f2050c..21f0b44ca7f 100644 --- a/highlighting/highlighting-trad.json +++ b/highlighting/highlighting-trad.json @@ -3245,8 +3245,8 @@ "DIGIT": "0123456789" }, "tr": { - "False": "False", - "True": "True", + "False": "Yanlış|False", + "True": "Doğru|True", "add": "ekle|add", "and": "ve|and", "ask": "sor|ask", @@ -3263,7 +3263,7 @@ "echo": "yankıla|echo", "elif": "değileğer|elif", "else": "değilse|else", - "false": "false", + "false": "yanlış|false", "for": "şunun için|for", "forward": "ileri|forward", "from": "şuradan|from", @@ -3279,7 +3279,7 @@ "or": "veya|or", "orange": "turuncu|orange", "pink": "pembe|pink", - "play": "play", + "play": "oynat|play", "pressed": "basılı|pressed", "print": "yazdır|print", "purple": "mor|purple", @@ -3295,7 +3295,7 @@ "times": "kere|times", "to": "şuraya|to", "to_list": "şuraya|to", - "true": "true", + "true": "doğru|true", "turn": "döndür|turn", "while": "şu iken|while", "white": "beyaz|white", diff --git a/static/js/appbundle.js b/static/js/appbundle.js index ae1f33082d8..84a10a2005d 100644 --- a/static/js/appbundle.js +++ b/static/js/appbundle.js @@ -62897,11 +62897,11 @@ ${o3}` : i3; "Connection_error": "Sunucuya ula\u015Famad\u0131k.", "Empty_output": "Bu kod \xE7al\u0131\u015F\u0131yor ama hi\xE7bir \u015Fey yazd\u0131rm\u0131yor. Kodunuzda bir yazd\u0131rma komutu kullan\u0131n veya bir \xE7\u0131kt\u0131 almak i\xE7in kaplumba\u011Fay\u0131 kullan\u0131n.", "Errors_found": "Bir hata yapt\u0131n\u0131z! Endi\u015Felenmeyin, program\u0131 yine de \xE7al\u0131\u015Ft\u0131rd\u0131k", - "Execute_error": "Program\u0131 \xE7al\u0131\u015Ft\u0131r\u0131rken bir \u015Feyler ters gitti.", + "Execute_error": "Bir \u015Feyler ters gitti.", "Other_error": "Oops! Belki k\xFC\xE7\xFCk bir hata yapm\u0131\u015F olabiliriz.", "Program_repair": "Bu do\u011Fru kod olabilirdi, onu d\xFCzeltebilir misin?", "Program_too_long": "Program\u0131n\u0131z\u0131n \xE7al\u0131\u015Fmas\u0131 \xE7ok uzun s\xFCr\xFCyor.", - "ServerError": "Bizim beklemedi\u011Fimiz bir program yazd\u0131n\u0131z. E\u011Fer yard\u0131m etmek isterseniz, bize hello@hedy.org adresinden ilgili seviye ve program\u0131n\u0131zla birlikte bir e-posta g\xF6nderin. Bu arada, biraz farkl\u0131 bir \u015Fey deneyin ve \xF6rneklere bir kez daha g\xF6z at\u0131n. Te\u015Fekk\xFCrler!", + "ServerError": "Bulundu\u011Funuz seviyeyi ve program\u0131n\u0131z\u0131 i\xE7eren bir e-postay\u0131 hello@hedy.org adresine g\xF6ndererek bize yard\u0131mc\u0131 olabilirsiniz. Bu arada, biraz farkl\u0131 bir yakla\u015F\u0131m deneyin. Te\u015Fekk\xFCrler!", "Transpile_error": "Program\u0131n\u0131 \xE7al\u0131\u015Ft\u0131ram\u0131yoruz.", "Transpile_success": "Aferin!\n\u0130nan\u0131lmaz!\n\u0130yi i\u015Fti, Aferin!\nM\xFCkemmel!\n\xC7ok iyiydin!", "Transpile_warning": "Uyar\u0131!", @@ -100147,8 +100147,8 @@ def note_with_error(value, err): DIGIT: "0123456789" }; var tr = { - False: "False", - True: "True", + False: "Yanl\u0131\u015F|False", + True: "Do\u011Fru|True", add: "ekle|add", and: "ve|and", ask: "sor|ask", @@ -100165,7 +100165,7 @@ def note_with_error(value, err): echo: "yank\u0131la|echo", elif: "de\u011File\u011Fer|elif", else: "de\u011Filse|else", - false: "false", + false: "yanl\u0131\u015F|false", for: "\u015Funun i\xE7in|for", forward: "ileri|forward", from: "\u015Furadan|from", @@ -100181,7 +100181,7 @@ def note_with_error(value, err): or: "veya|or", orange: "turuncu|orange", pink: "pembe|pink", - play: "play", + play: "oynat|play", pressed: "bas\u0131l\u0131|pressed", print: "yazd\u0131r|print", purple: "mor|purple", @@ -100197,7 +100197,7 @@ def note_with_error(value, err): times: "kere|times", to: "\u015Furaya|to", to_list: "\u015Furaya|to", - true: "true", + true: "do\u011Fru|true", turn: "d\xF6nd\xFCr|turn", while: "\u015Fu iken|while", white: "beyaz|white", diff --git a/static/js/appbundle.js.map b/static/js/appbundle.js.map index ba580ed07ae..63b7afccf17 100644 --- a/static/js/appbundle.js.map +++ b/static/js/appbundle.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../node_modules/jszip/dist/jszip.min.js", "../../node_modules/@babel/runtime/helpers/arrayWithHoles.js", "../../node_modules/@babel/runtime/helpers/iterableToArrayLimit.js", "../../node_modules/@babel/runtime/helpers/arrayLikeToArray.js", "../../node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js", "../../node_modules/@babel/runtime/helpers/nonIterableRest.js", "../../node_modules/@babel/runtime/helpers/slicedToArray.js", "../../node_modules/@babel/runtime/helpers/classCallCheck.js", "../../node_modules/@babel/runtime/helpers/typeof.js", "../../node_modules/@babel/runtime/helpers/toPrimitive.js", "../../node_modules/@babel/runtime/helpers/toPropertyKey.js", "../../node_modules/@babel/runtime/helpers/createClass.js", "../../node_modules/automation-events/build/es5/bundle.js", "../../node_modules/dompurify/src/utils.js", "../../node_modules/dompurify/src/tags.js", "../../node_modules/dompurify/src/attrs.js", "../../node_modules/dompurify/src/regexp.js", "../../node_modules/dompurify/src/purify.js", "ckeditor.js", "index.ts", "message-translations.ts", "client-messages.ts", "modal.ts", "app.ts", "../../node_modules/tone/Tone/version.ts", "../../node_modules/standardized-audio-context/src/module.ts", "../../node_modules/standardized-audio-context/src/factories/abort-error.ts", "../../node_modules/standardized-audio-context/src/factories/add-active-input-connection-to-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/add-audio-node-connections.ts", "../../node_modules/standardized-audio-context/src/factories/add-audio-param-connections.ts", "../../node_modules/standardized-audio-context/src/globals.ts", "../../node_modules/standardized-audio-context/src/helpers/is-constructible.ts", "../../node_modules/standardized-audio-context/src/helpers/split-import-statements.ts", "../../node_modules/standardized-audio-context/src/factories/add-audio-worklet-module.ts", "../../node_modules/standardized-audio-context/src/helpers/get-value-for-key.ts", "../../node_modules/standardized-audio-context/src/helpers/pick-element-from-set.ts", "../../node_modules/standardized-audio-context/src/helpers/delete-passive-input-connection-to-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/get-event-listeners-of-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/set-internal-state-to-active.ts", "../../node_modules/standardized-audio-context/src/guards/audio-worklet-node.ts", "../../node_modules/standardized-audio-context/src/helpers/set-internal-state-to-passive.ts", "../../node_modules/standardized-audio-context/src/helpers/set-internal-state-to-passive-when-necessary.ts", "../../node_modules/standardized-audio-context/src/factories/add-connection-to-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/add-passive-input-connection-to-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/add-silent-connection.ts", "../../node_modules/standardized-audio-context/src/factories/add-unrendered-audio-worklet-node.ts", "../../node_modules/standardized-audio-context/src/factories/analyser-node-constructor.ts", "../../node_modules/standardized-audio-context/src/helpers/is-owned-by-context.ts", "../../node_modules/standardized-audio-context/src/factories/analyser-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-buffer-copy-channel-methods-out-of-bounds-support.ts", "../../node_modules/standardized-audio-context/src/factories/index-size-error.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-buffer-get-channel-data-method.ts", "../../node_modules/standardized-audio-context/src/factories/audio-buffer-constructor.ts", "../../node_modules/standardized-audio-context/src/constants.ts", "../../node_modules/standardized-audio-context/src/helpers/is-active-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/audio-buffer-source-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/audio-buffer-source-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/guards/audio-buffer-source-node.ts", "../../node_modules/standardized-audio-context/src/guards/biquad-filter-node.ts", "../../node_modules/standardized-audio-context/src/guards/constant-source-node.ts", "../../node_modules/standardized-audio-context/src/guards/gain-node.ts", "../../node_modules/standardized-audio-context/src/guards/oscillator-node.ts", "../../node_modules/standardized-audio-context/src/guards/stereo-panner-node.ts", "../../node_modules/standardized-audio-context/src/helpers/get-audio-node-connections.ts", "../../node_modules/standardized-audio-context/src/helpers/get-audio-param-connections.ts", "../../node_modules/standardized-audio-context/src/helpers/deactivate-active-audio-node-input-connections.ts", "../../node_modules/standardized-audio-context/src/helpers/deactivate-audio-graph.ts", "../../node_modules/standardized-audio-context/src/helpers/is-valid-latency-hint.ts", "../../node_modules/standardized-audio-context/src/factories/audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/audio-destination-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/audio-destination-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/audio-listener-factory.ts", "../../node_modules/standardized-audio-context/src/guards/audio-node.ts", "../../node_modules/standardized-audio-context/src/guards/audio-node-output-connection.ts", "../../node_modules/standardized-audio-context/src/helpers/insert-element-in-set.ts", "../../node_modules/standardized-audio-context/src/helpers/add-active-input-connection-to-audio-param.ts", "../../node_modules/standardized-audio-context/src/helpers/add-passive-input-connection-to-audio-param.ts", "../../node_modules/standardized-audio-context/src/guards/native-audio-node-faker.ts", "../../node_modules/standardized-audio-context/src/helpers/connect-native-audio-node-to-native-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/delete-active-input-connection.ts", "../../node_modules/standardized-audio-context/src/helpers/delete-active-input-connection-to-audio-param.ts", "../../node_modules/standardized-audio-context/src/helpers/delete-event-listeners-of-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/delete-passive-input-connection-to-audio-param.ts", "../../node_modules/standardized-audio-context/src/helpers/disconnect-native-audio-node-from-native-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/get-native-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/get-native-audio-param.ts", "../../node_modules/standardized-audio-context/src/helpers/is-part-of-a-cycle.ts", "../../node_modules/standardized-audio-context/src/helpers/is-passive-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-node-disconnect-method-support.ts", "../../node_modules/standardized-audio-context/src/helpers/visit-each-audio-node-once.ts", "../../node_modules/standardized-audio-context/src/guards/native-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-node-disconnect-method.ts", "../../node_modules/standardized-audio-context/src/factories/audio-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/audio-param-factory.ts", "../../node_modules/standardized-audio-context/src/factories/audio-param-renderer.ts", "../../node_modules/standardized-audio-context/src/read-only-map.ts", "../../node_modules/standardized-audio-context/src/factories/audio-worklet-node-constructor.ts", "../../node_modules/standardized-audio-context/src/helpers/copy-from-channel.ts", "../../node_modules/standardized-audio-context/src/helpers/copy-to-channel.ts", "../../node_modules/standardized-audio-context/src/helpers/create-nested-arrays.ts", "../../node_modules/standardized-audio-context/src/helpers/get-audio-worklet-processor.ts", "../../node_modules/standardized-audio-context/src/factories/audio-worklet-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/base-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/biquad-filter-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/biquad-filter-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/cache-test-result.ts", "../../node_modules/standardized-audio-context/src/factories/channel-merger-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/channel-merger-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/channel-splitter-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/channel-splitter-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/connect-audio-param.ts", "../../node_modules/standardized-audio-context/src/factories/connect-multiple-outputs.ts", "../../node_modules/standardized-audio-context/src/factories/connected-native-audio-buffer-source-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/constant-source-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/constant-source-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/convert-number-to-unsigned-long.ts", "../../node_modules/standardized-audio-context/src/factories/convolver-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/convolver-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/create-native-offline-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/data-clone-error.ts", "../../node_modules/standardized-audio-context/src/helpers/detach-array-buffer.ts", "../../node_modules/standardized-audio-context/src/factories/decode-audio-data.ts", "../../node_modules/standardized-audio-context/src/factories/decrement-cycle-counter.ts", "../../node_modules/standardized-audio-context/src/factories/delay-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/delay-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/delete-active-input-connection-to-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/delete-unrendered-audio-worklet-node.ts", "../../node_modules/standardized-audio-context/src/guards/delay-node.ts", "../../node_modules/standardized-audio-context/src/factories/detect-cycles.ts", "../../node_modules/standardized-audio-context/src/factories/disconnect-multiple-outputs.ts", "../../node_modules/standardized-audio-context/src/factories/dynamics-compressor-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/dynamics-compressor-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/encoding-error.ts", "../../node_modules/standardized-audio-context/src/factories/evaluate-source.ts", "../../node_modules/standardized-audio-context/src/factories/event-target-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/expose-current-frame-and-current-time.ts", "../../node_modules/standardized-audio-context/src/factories/fetch-source.ts", "../../node_modules/standardized-audio-context/src/factories/gain-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/gain-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/get-active-audio-worklet-node-inputs.ts", "../../node_modules/standardized-audio-context/src/factories/get-audio-node-renderer.ts", "../../node_modules/standardized-audio-context/src/factories/get-audio-node-tail-time.ts", "../../node_modules/standardized-audio-context/src/factories/get-audio-param-renderer.ts", "../../node_modules/standardized-audio-context/src/factories/get-backup-offline-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/invalid-state-error.ts", "../../node_modules/standardized-audio-context/src/factories/get-native-context.ts", "../../node_modules/standardized-audio-context/src/factories/get-or-create-backup-offline-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/get-unrendered-audio-worklet-nodes.ts", "../../node_modules/standardized-audio-context/src/factories/invalid-access-error.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-iir-filter-node-get-frequency-response-method.ts", "../../node_modules/standardized-audio-context/src/factories/iir-filter-node-constructor.ts", "../../node_modules/standardized-audio-context/src/helpers/filter-buffer.ts", "../../node_modules/standardized-audio-context/src/factories/iir-filter-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/increment-cycle-counter-factory.ts", "../../node_modules/standardized-audio-context/src/factories/is-any-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/is-any-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/is-any-audio-param.ts", "../../node_modules/standardized-audio-context/src/factories/is-any-offline-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/is-native-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/is-native-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/is-native-audio-param.ts", "../../node_modules/standardized-audio-context/src/factories/is-native-context.ts", "../../node_modules/standardized-audio-context/src/factories/is-native-offline-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/is-secure-context.ts", "../../node_modules/standardized-audio-context/src/factories/media-element-audio-source-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/media-stream-audio-destination-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/media-stream-audio-source-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/media-stream-track-audio-source-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/minimal-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/minimal-base-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/helpers/test-promise-support.ts", "../../node_modules/standardized-audio-context/src/factories/minimal-offline-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/monitor-connections.ts", "../../node_modules/standardized-audio-context/src/helpers/assign-native-audio-node-option.ts", "../../node_modules/standardized-audio-context/src/helpers/assign-native-audio-node-options.ts", "../../node_modules/standardized-audio-context/src/helpers/test-analyser-node-get-float-time-domain-data-method-support.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-analyser-node-get-float-time-domain-data-method.ts", "../../node_modules/standardized-audio-context/src/factories/native-analyser-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-buffer-constructor.ts", "../../node_modules/standardized-audio-context/src/helpers/assign-native-audio-node-audio-param-value.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-buffer-source-node-start-method-consecutive-calls.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-scheduled-source-node-start-method-negative-parameters.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-scheduled-source-node-stop-method-negative-parameters.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-buffer-source-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-destination-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-worklet-node-constructor.ts", "../../node_modules/standardized-audio-context/src/helpers/test-clonability-of-audio-worklet-node-options.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-worklet-node-factory.ts", "../../node_modules/standardized-audio-context/src/helpers/compute-buffer-size.ts", "../../node_modules/standardized-audio-context/src/helpers/clone-audio-worklet-node-options.ts", "../../node_modules/standardized-audio-context/src/helpers/create-audio-worklet-processor-promise.ts", "../../node_modules/standardized-audio-context/src/helpers/create-audio-worklet-processor.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-worklet-node-faker-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-biquad-filter-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-channel-merger-node-factory.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-channel-splitter-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-channel-splitter-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-constant-source-node-factory.ts", "../../node_modules/standardized-audio-context/src/helpers/intercept-connections.ts", "../../node_modules/standardized-audio-context/src/factories/native-constant-source-node-faker-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-convolver-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-delay-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-dynamics-compressor-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-gain-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-iir-filter-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-iir-filter-node-faker-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-media-element-audio-source-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-media-stream-audio-destination-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-media-stream-audio-source-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-media-stream-track-audio-source-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-offline-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/native-oscillator-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-panner-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-panner-node-faker-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-periodic-wave-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-script-processor-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-stereo-panner-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-stereo-panner-node-faker-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-wave-shaper-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-wave-shaper-node-faker-factory.ts", "../../node_modules/standardized-audio-context/src/factories/not-supported-error.ts", "../../node_modules/standardized-audio-context/src/factories/offline-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/oscillator-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/oscillator-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/panner-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/panner-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/periodic-wave-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/render-automation.ts", "../../node_modules/standardized-audio-context/src/factories/render-inputs-of-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/render-inputs-of-audio-param.ts", "../../node_modules/standardized-audio-context/src/factories/render-native-offline-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/set-active-audio-worklet-node-inputs.ts", "../../node_modules/standardized-audio-context/src/factories/set-audio-node-tail-time.ts", "../../node_modules/standardized-audio-context/src/factories/start-rendering.ts", "../../node_modules/standardized-audio-context/src/factories/stereo-panner-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/stereo-panner-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/test-audio-buffer-constructor-support.ts", "../../node_modules/standardized-audio-context/src/factories/test-audio-worklet-processor-post-message-support.ts", "../../node_modules/standardized-audio-context/src/factories/test-offline-audio-context-current-time-support.ts", "../../node_modules/standardized-audio-context/src/factories/unknown-error.ts", "../../node_modules/standardized-audio-context/src/factories/wave-shaper-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/wave-shaper-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/window.ts", "../../node_modules/standardized-audio-context/src/factories/wrap-audio-buffer-copy-channel-methods.ts", "../../node_modules/standardized-audio-context/src/factories/wrap-audio-buffer-copy-channel-methods-out-of-bounds.ts", "../../node_modules/standardized-audio-context/src/factories/wrap-audio-buffer-source-node-stop-method-nullified-buffer.ts", "../../node_modules/standardized-audio-context/src/factories/wrap-channel-merger-node.ts", "../../node_modules/standardized-audio-context/src/helpers/get-first-sample.ts", "../../node_modules/standardized-audio-context/src/helpers/is-dc-curve.ts", "../../node_modules/standardized-audio-context/src/helpers/overwrite-accessors.ts", "../../node_modules/standardized-audio-context/src/helpers/sanitize-audio-worklet-node-options.ts", "../../node_modules/standardized-audio-context/src/helpers/sanitize-channel-splitter-options.ts", "../../node_modules/standardized-audio-context/src/helpers/sanitize-periodic-wave-options.ts", "../../node_modules/standardized-audio-context/src/helpers/set-value-at-time-until-possible.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-buffer-source-node-start-method-consecutive-calls-support.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-buffer-source-node-start-method-offset-clamping-support.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-buffer-source-node-stop-method-nullified-buffer-support.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-scheduled-source-node-start-method-negative-parameters-support.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-scheduled-source-node-stop-method-consecutive-calls-support.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-scheduled-source-node-stop-method-negative-parameters-support.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-worklet-node-options-clonability.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-buffer-source-node-start-method-offset-clamping.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-scheduled-source-node-stop-method-consecutive-calls.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-event-listener.ts", "../../node_modules/tone/Tone/core/util/Debug.ts", "../../node_modules/tone/Tone/core/util/TypeCheck.ts", "../../node_modules/tone/Tone/core/context/AudioContext.ts", "../../node_modules/tslib/tslib.es6.mjs", "../../node_modules/tone/Tone/core/clock/Ticker.ts", "../../node_modules/tone/Tone/core/util/AdvancedTypeCheck.ts", "../../node_modules/tone/Tone/core/util/Defaults.ts", "../../node_modules/tone/Tone/core/Tone.ts", "../../node_modules/tone/Tone/core/util/Math.ts", "../../node_modules/tone/Tone/core/util/Timeline.ts", "../../node_modules/tone/Tone/core/context/ContextInitialization.ts", "../../node_modules/tone/Tone/core/util/Emitter.ts", "../../node_modules/tone/Tone/core/context/BaseContext.ts", "../../node_modules/tone/Tone/core/context/Context.ts", "../../node_modules/tone/Tone/core/context/DummyContext.ts", "../../node_modules/tone/Tone/core/util/Interface.ts", "../../node_modules/tone/Tone/core/context/ToneAudioBuffer.ts", "../../node_modules/tone/Tone/core/context/OfflineContext.ts", "../../node_modules/tone/Tone/core/Global.ts", "../../node_modules/tone/Tone/core/type/Conversions.ts", "../../node_modules/tone/Tone/core/type/TimeBase.ts", "../../node_modules/tone/Tone/core/type/Time.ts", "../../node_modules/tone/Tone/core/type/Frequency.ts", "../../node_modules/tone/Tone/core/type/TransportTime.ts", "../../node_modules/tone/Tone/core/context/ToneWithContext.ts", "../../node_modules/tone/Tone/core/util/StateTimeline.ts", "../../node_modules/tone/Tone/core/context/Param.ts", "../../node_modules/tone/Tone/core/context/ToneAudioNode.ts", "../../node_modules/tone/Tone/core/context/Gain.ts", "../../node_modules/tone/Tone/source/OneShotSource.ts", "../../node_modules/tone/Tone/signal/ToneConstantSource.ts", "../../node_modules/tone/Tone/signal/Signal.ts", "../../node_modules/tone/Tone/core/clock/TickParam.ts", "../../node_modules/tone/Tone/core/clock/TickSignal.ts", "../../node_modules/tone/Tone/core/clock/TickSource.ts", "../../node_modules/tone/Tone/core/clock/Clock.ts", "../../node_modules/tone/Tone/core/context/ToneAudioBuffers.ts", "../../node_modules/tone/Tone/core/type/Midi.ts", "../../node_modules/tone/Tone/core/type/Ticks.ts", "../../node_modules/tone/Tone/core/util/Draw.ts", "../../node_modules/tone/Tone/core/util/IntervalTimeline.ts", "../../node_modules/tone/Tone/component/channel/Volume.ts", "../../node_modules/tone/Tone/core/context/Destination.ts", "../../node_modules/tone/Tone/core/util/TimelineValue.ts", "../../node_modules/tone/Tone/core/clock/TransportEvent.ts", "../../node_modules/tone/Tone/core/clock/TransportRepeatEvent.ts", "../../node_modules/tone/Tone/core/clock/Transport.ts", "../../node_modules/tone/Tone/source/Source.ts", "../../node_modules/tone/Tone/source/buffer/ToneBufferSource.ts", "../../node_modules/tone/Tone/source/Noise.ts", "../../node_modules/tone/Tone/source/oscillator/OscillatorInterface.ts", "../../node_modules/tone/Tone/source/oscillator/ToneOscillatorNode.ts", "../../node_modules/tone/Tone/source/oscillator/Oscillator.ts", "../../node_modules/tone/Tone/signal/SignalOperator.ts", "../../node_modules/tone/Tone/signal/WaveShaper.ts", "../../node_modules/tone/Tone/signal/AudioToGain.ts", "../../node_modules/tone/Tone/signal/Multiply.ts", "../../node_modules/tone/Tone/source/oscillator/AMOscillator.ts", "../../node_modules/tone/Tone/source/oscillator/FMOscillator.ts", "../../node_modules/tone/Tone/source/oscillator/PulseOscillator.ts", "../../node_modules/tone/Tone/source/oscillator/FatOscillator.ts", "../../node_modules/tone/Tone/source/oscillator/PWMOscillator.ts", "../../node_modules/tone/Tone/source/oscillator/OmniOscillator.ts", "../../node_modules/tone/Tone/core/util/Decorator.ts", "../../node_modules/tone/Tone/source/buffer/Player.ts", "../../node_modules/tone/Tone/component/envelope/Envelope.ts", "../../node_modules/tone/Tone/instrument/Instrument.ts", "../../node_modules/tone/Tone/instrument/Monophonic.ts", "../../node_modules/tone/Tone/component/envelope/AmplitudeEnvelope.ts", "../../node_modules/tone/Tone/instrument/Synth.ts", "../../node_modules/tone/Tone/instrument/MembraneSynth.ts", "../../node_modules/tone/Tone/core/worklet/WorkletGlobalScope.ts", "../../node_modules/tone/Tone/core/worklet/ToneAudioWorkletProcessor.worklet.ts", "../../node_modules/tone/Tone/core/worklet/SingleIOProcessor.worklet.ts", "../../node_modules/tone/Tone/core/worklet/DelayLine.worklet.ts", "../../node_modules/tone/Tone/component/filter/FeedbackCombFilter.worklet.ts", "../../node_modules/tone/Tone/instrument/PolySynth.ts", "../../node_modules/tone/Tone/instrument/Sampler.ts", "../../node_modules/tone/Tone/component/channel/Panner.ts", "../../node_modules/tone/Tone/effect/BitCrusher.worklet.ts", "../../node_modules/tone/Tone/effect/Freeverb.ts", "../../node_modules/tone/Tone/effect/JCReverb.ts", "../../node_modules/tone/Tone/component/channel/Solo.ts", "../../node_modules/tone/Tone/component/channel/PanVol.ts", "../../node_modules/tone/Tone/component/channel/Channel.ts", "../../node_modules/tone/Tone/core/context/Listener.ts", "../../node_modules/tone/Tone/index.ts", "event-emitter.ts", "tabs.ts", "pythonPrefixes.ts", "types.ts", "tutorials/utils.ts", "tutorials/intro.ts", "tutorials/teacher.ts", "tutorials/level1.ts", "tutorials/tutorial.ts", "editor.ts", "../../node_modules/@codemirror/state/dist/index.js", "../../node_modules/style-mod/src/style-mod.js", "../../node_modules/w3c-keyname/index.js", "../../node_modules/@codemirror/view/dist/index.js", "../../node_modules/@lezer/common/dist/index.js", "../../node_modules/@lezer/highlight/dist/index.js", "../../node_modules/@codemirror/language/dist/index.js", "../../node_modules/@codemirror/commands/dist/index.js", "../../node_modules/crelt/index.js", "../../node_modules/@codemirror/search/dist/index.js", "cm-decorations.ts", "../../node_modules/@lezer/lr/dist/index.js", "lezer-parsers/level1-parser.terms.ts", "lezer-parsers/level2-parser.terms.ts", "lezer-parsers/level3-parser.terms.ts", "lezer-parsers/level4-parser.terms.ts", "lezer-parsers/level5-parser.terms.ts", "lezer-parsers/level6-parser.terms.ts", "lezer-parsers/level7-parser.terms.ts", "lezer-parsers/level8-parser.terms.ts", "lezer-parsers/level10-parser.terms.ts", "lezer-parsers/level11-parser.terms.ts", "lezer-parsers/level12-parser.terms.ts", "lezer-parsers/level13-parser.terms.ts", "lezer-parsers/level14-parser.terms.ts", "lezer-parsers/level15-parser.terms.ts", "lezer-parsers/level16-parser.terms.ts", "lezer-parsers/level17-parser.terms.ts", "lezer-parsers/level18-parser.terms.ts", "lezer-parsers/tokens.ts", "lezer-parsers/level1-parser.ts", "lezer-parsers/level2-parser.ts", "lezer-parsers/level3-parser.ts", "lezer-parsers/level4-parser.ts", "lezer-parsers/level5-parser.ts", "lezer-parsers/level6-parser.ts", "lezer-parsers/level7-parser.ts", "lezer-parsers/level8-parser.ts", "lezer-parsers/level9-parser.ts", "lezer-parsers/level10-parser.ts", "lezer-parsers/level11-parser.ts", "lezer-parsers/level12-parser.ts", "lezer-parsers/level13-parser.ts", "lezer-parsers/level14-parser.ts", "lezer-parsers/level15-parser.ts", "lezer-parsers/level16-parser.ts", "lezer-parsers/level17-parser.ts", "lezer-parsers/level18-parser.ts", "lezer-parsers/language-packages.ts", "cm-monokai-theme.ts", "cm-editor.ts", "../../node_modules/sortablejs/modular/sortable.esm.js", "parsons.ts", "browser-helpers/on-element-becomes-visible.ts", "debugging.ts", "local.ts", "teachers.ts", "adventure.ts", "autosave.ts", "../../node_modules/@kurkle/color/dist/color.esm.js", "../../node_modules/chart.js/src/helpers/helpers.core.ts", "../../node_modules/chart.js/src/helpers/helpers.math.ts", "../../node_modules/chart.js/src/helpers/helpers.collection.ts", "../../node_modules/chart.js/src/helpers/helpers.extras.ts", "../../node_modules/chart.js/src/helpers/helpers.easing.ts", "../../node_modules/chart.js/src/helpers/helpers.color.ts", "../../node_modules/chart.js/src/core/core.animations.defaults.js", "../../node_modules/chart.js/src/core/core.layouts.defaults.js", "../../node_modules/chart.js/src/helpers/helpers.intl.ts", "../../node_modules/chart.js/src/core/core.ticks.js", "../../node_modules/chart.js/src/core/core.scale.defaults.js", "../../node_modules/chart.js/src/core/core.defaults.js", "../../node_modules/chart.js/src/helpers/helpers.canvas.ts", "../../node_modules/chart.js/src/helpers/helpers.options.ts", "../../node_modules/chart.js/src/helpers/helpers.config.ts", "../../node_modules/chart.js/src/helpers/helpers.curve.ts", "../../node_modules/chart.js/src/helpers/helpers.dom.ts", "../../node_modules/chart.js/src/helpers/helpers.interpolation.ts", "../../node_modules/chart.js/src/helpers/helpers.rtl.ts", "../../node_modules/chart.js/src/helpers/helpers.segment.js", "../../node_modules/chart.js/src/core/core.animator.js", "../../node_modules/chart.js/src/core/core.animation.js", "../../node_modules/chart.js/src/core/core.animations.js", "../../node_modules/chart.js/src/core/core.datasetController.js", "../../node_modules/chart.js/src/controllers/controller.bar.js", "../../node_modules/chart.js/src/controllers/controller.bubble.js", "../../node_modules/chart.js/src/controllers/controller.doughnut.js", "../../node_modules/chart.js/src/controllers/controller.line.js", "../../node_modules/chart.js/src/controllers/controller.polarArea.js", "../../node_modules/chart.js/src/controllers/controller.pie.js", "../../node_modules/chart.js/src/controllers/controller.radar.js", "../../node_modules/chart.js/src/controllers/controller.scatter.js", "../../node_modules/chart.js/src/core/core.adapters.ts", "../../node_modules/chart.js/src/core/core.interaction.js", "../../node_modules/chart.js/src/core/core.layouts.js", "../../node_modules/chart.js/src/platform/platform.base.js", "../../node_modules/chart.js/src/platform/platform.basic.js", "../../node_modules/chart.js/src/platform/platform.dom.js", "../../node_modules/chart.js/src/platform/index.js", "../../node_modules/chart.js/src/core/core.element.ts", "../../node_modules/chart.js/src/core/core.scale.autoskip.js", "../../node_modules/chart.js/src/core/core.scale.js", "../../node_modules/chart.js/src/core/core.typedRegistry.js", "../../node_modules/chart.js/src/core/core.registry.js", "../../node_modules/chart.js/src/core/core.plugins.js", "../../node_modules/chart.js/src/core/core.config.js", "../../node_modules/chart.js/src/core/core.controller.js", "../../node_modules/chart.js/src/elements/element.arc.ts", "../../node_modules/chart.js/src/elements/element.line.js", "../../node_modules/chart.js/src/elements/element.point.ts", "../../node_modules/chart.js/src/elements/element.bar.js", "../../node_modules/chart.js/src/plugins/plugin.colors.ts", "../../node_modules/chart.js/src/plugins/plugin.decimation.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.segment.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.helper.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.options.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.target.stack.js", "../../node_modules/chart.js/src/plugins/plugin.filler/simpleArc.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.target.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.drawing.js", "../../node_modules/chart.js/src/plugins/plugin.filler/index.js", "../../node_modules/chart.js/src/plugins/plugin.legend.js", "../../node_modules/chart.js/src/plugins/plugin.title.js", "../../node_modules/chart.js/src/plugins/plugin.subtitle.js", "../../node_modules/chart.js/src/plugins/plugin.tooltip.js", "../../node_modules/chart.js/src/scales/scale.category.js", "../../node_modules/chart.js/src/scales/scale.linearbase.js", "../../node_modules/chart.js/src/scales/scale.linear.js", "../../node_modules/chart.js/src/scales/scale.logarithmic.js", "../../node_modules/chart.js/src/scales/scale.radialLinear.js", "../../node_modules/chart.js/src/scales/scale.time.js", "../../node_modules/chart.js/src/scales/scale.timeseries.js", "../../node_modules/chart.js/src/index.ts", "loading.ts", "comm.ts", "auth.ts", "local-save-warning.ts", "utils.ts", "user-activity.ts", "index-tabs.ts", "htmx-integration.ts", "statistics.ts", "logs.ts", "admin.ts", "profile.ts", "initialize.ts", "../../node_modules/tw-elements/src/js/dom/data.js", "../../node_modules/tw-elements/src/js/util/index.js", "../../node_modules/tw-elements/src/js/dom/event-handler.js", "../../node_modules/tw-elements/src/js/base-component.js", "../../node_modules/tw-elements/src/js/components/button.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/enums.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getNodeName.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getWindow.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/instanceOf.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/applyStyles.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getBasePlacement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/math.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/userAgent.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/contains.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/isTableElement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getParentNode.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/within.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getFreshSideObject.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/mergePaddingObject.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/expandToHashMap.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/arrow.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getVariation.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/computeStyles.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/eventListeners.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getOppositePlacement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/rectToClientRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/computeOffsets.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/detectOverflow.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/flip.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/hide.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/offset.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/popperOffsets.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getAltAxis.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/preventOverflow.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/orderModifiers.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/debounce.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/format.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/validateModifiers.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/uniqueBy.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/mergeByName.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/createPopper.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/popper-lite.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/popper.js", "../../node_modules/tw-elements/src/js/dom/manipulator.js", "../../node_modules/tw-elements/src/js/dom/selector-engine.js", "../../node_modules/tw-elements/src/js/components/dropdown.js", "../../node_modules/tw-elements/src/js/components/collapse.js", "../../node_modules/tw-elements/src/js/util/scrollbar.js", "../../node_modules/tw-elements/src/js/util/backdrop.js", "../../node_modules/tw-elements/src/js/util/focusTrap.js", "../../node_modules/tw-elements/src/js/util/component-functions.js", "../../node_modules/tw-elements/src/js/components/offcanvas.js", "../../node_modules/tw-elements/src/js/components/alert.js", "../../node_modules/tw-elements/src/js/components/carousel.js", "../../node_modules/tw-elements/src/js/components/modal.js", "../../node_modules/tw-elements/src/js/util/sanitizer.js", "../../node_modules/tw-elements/src/js/components/tooltip.js", "../../node_modules/tw-elements/src/js/components/popover.js", "../../node_modules/tw-elements/src/js/navigation/scrollspy.js", "../../node_modules/tw-elements/src/js/navigation/tab.js", "../../node_modules/tw-elements/src/js/components/toast.js", "../../node_modules/tw-elements/node_modules/detect-autofill/dist/detect-autofill.js", "../../node_modules/tw-elements/src/js/forms/input.js", "../../node_modules/tw-elements/src/js/content-styles/animate.js", "../../node_modules/tw-elements/src/js/methods/ripple.js", "../../node_modules/tw-elements/src/js/forms/datepicker/date-utils.js", "../../node_modules/tw-elements/src/js/forms/datepicker/templates.js", "../../node_modules/tw-elements/src/js/util/keycodes.js", "../../node_modules/tw-elements/src/js/forms/datepicker/index.js", "../../node_modules/tw-elements/src/js/forms/timepicker/templates.js", "../../node_modules/tw-elements/src/js/forms/timepicker/utils.js", "../../node_modules/tw-elements/src/js/forms/timepicker/index.js", "../../node_modules/tw-elements/src/js/util/touch/swipe.js", "../../node_modules/tw-elements/src/js/util/touch/index.js", "../../node_modules/tw-elements/src/js/navigation/sidenav.js", "../../node_modules/tw-elements/src/js/components/stepper.js", "../../node_modules/tw-elements/src/js/forms/select/select-option.js", "../../node_modules/tw-elements/src/js/forms/select/selection-model.js", "../../node_modules/tw-elements/src/js/forms/select/util.js", "../../node_modules/tw-elements/src/js/forms/select/templates.js", "../../node_modules/tw-elements/src/js/forms/select/index.js", "../../node_modules/tw-elements/src/js/components/chips/templates.js", "../../node_modules/tw-elements/src/js/components/chips/chip.js", "../../node_modules/tw-elements/src/js/components/chips/index.js", "../../node_modules/tw-elements/src/js/data/chart/chartDefaults.js", "../../node_modules/tw-elements/node_modules/deepmerge/dist/cjs.js", "../../node_modules/tw-elements/src/js/data/chart/charts.js", "../../node_modules/tw-elements/node_modules/perfect-scrollbar/dist/perfect-scrollbar.esm.js", "../../node_modules/tw-elements/src/js/methods/perfect-scrollbar.js", "../../node_modules/tw-elements/src/js/data/datatables/html/pagination.js", "../../node_modules/tw-elements/src/js/data/datatables/html/columns.js", "../../node_modules/tw-elements/src/js/data/datatables/html/rows.js", "../../node_modules/tw-elements/src/js/data/datatables/html/table.js", "../../node_modules/tw-elements/src/js/data/datatables/util.js", "../../node_modules/tw-elements/src/js/data/datatables/index.js", "../../node_modules/tw-elements/src/js/components/rating.js", "../../node_modules/tw-elements/src/js/components/popconfirm.js", "../../node_modules/tw-elements/src/js/components/lightbox.js", "../../node_modules/tw-elements/src/js/forms/validation/rules.js", "../../node_modules/tw-elements/src/js/forms/validation/validation.js", "../../node_modules/tw-elements/src/js/methods/touch/touchUtil.js", "../../node_modules/tw-elements/src/js/methods/touch/press.js", "../../node_modules/tw-elements/src/js/methods/touch/swipe.js", "../../node_modules/tw-elements/src/js/methods/touch/pan.js", "../../node_modules/tw-elements/src/js/methods/touch/pinch.js", "../../node_modules/tw-elements/src/js/methods/touch/tap.js", "../../node_modules/tw-elements/src/js/methods/touch/rotate.js", "../../node_modules/tw-elements/src/js/methods/touch/index.js", "../../node_modules/tw-elements/src/js/methods/smooth-scroll.js", "../../node_modules/tw-elements/src/js/methods/lazy-load.js", "../../node_modules/tw-elements/src/js/methods/clipboard.js", "../../node_modules/tw-elements/src/js/methods/infinite-scroll.js", "../../node_modules/tw-elements/src/js/methods/loading-management/templates.js", "../../node_modules/tw-elements/src/js/methods/loading-management/index.js", "../../node_modules/tw-elements/src/js/forms/dateTimepicker/utils.js", "../../node_modules/tw-elements/src/js/forms/dateTimepicker/templates.js", "../../node_modules/tw-elements/src/js/forms/dateTimepicker/index.js", "../../node_modules/tw-elements/src/js/methods/sticky.js", "../../node_modules/tw-elements/src/js/autoinit/jqueryInit.js", "../../node_modules/tw-elements/src/js/autoinit/autoinitCallbacks.js", "../../node_modules/tw-elements/src/js/autoinit/chartsInit.js", "../../node_modules/tw-elements/src/js/autoinit/Register.js", "../../node_modules/tw-elements/src/js/autoinit/index.js", "tailwind.ts", "public-adventures.ts", "microbit.ts", "custom-elements.ts"], - "sourcesContent": ["/*!\n\nJSZip v3.10.1 - A JavaScript class for generating and reading zip files\n\n\n(c) 2009-2016 Stuart Knightley \nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown.\n\nJSZip uses the library pako released under the MIT license :\nhttps://github.com/nodeca/pako/blob/main/LICENSE\n*/\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{(\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).JSZip=e()}}(function(){return function s(a,o,h){function u(r,e){if(!o[r]){if(!a[r]){var t=\"function\"==typeof require&&require;if(!e&&t)return t(r,!0);if(l)return l(r,!0);var n=new Error(\"Cannot find module '\"+r+\"'\");throw n.code=\"MODULE_NOT_FOUND\",n}var i=o[r]={exports:{}};a[r][0].call(i.exports,function(e){var t=a[r][1][e];return u(t||e)},i,i.exports,s,a,o,h)}return o[r].exports}for(var l=\"function\"==typeof require&&require,e=0;e>2,s=(3&t)<<4|r>>4,a=1>6:64,o=2>4,r=(15&i)<<4|(s=p.indexOf(e.charAt(o++)))>>2,n=(3&s)<<6|(a=p.indexOf(e.charAt(o++))),l[h++]=t,64!==s&&(l[h++]=r),64!==a&&(l[h++]=n);return l}},{\"./support\":30,\"./utils\":32}],2:[function(e,t,r){\"use strict\";var n=e(\"./external\"),i=e(\"./stream/DataWorker\"),s=e(\"./stream/Crc32Probe\"),a=e(\"./stream/DataLengthProbe\");function o(e,t,r,n,i){this.compressedSize=e,this.uncompressedSize=t,this.crc32=r,this.compression=n,this.compressedContent=i}o.prototype={getContentWorker:function(){var e=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new a(\"data_length\")),t=this;return e.on(\"end\",function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error(\"Bug : uncompressed data size mismatch\")}),e},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo(\"compressedSize\",this.compressedSize).withStreamInfo(\"uncompressedSize\",this.uncompressedSize).withStreamInfo(\"crc32\",this.crc32).withStreamInfo(\"compression\",this.compression)}},o.createWorkerFrom=function(e,t,r){return e.pipe(new s).pipe(new a(\"uncompressedSize\")).pipe(t.compressWorker(r)).pipe(new a(\"compressedSize\")).withStreamInfo(\"compression\",t)},t.exports=o},{\"./external\":6,\"./stream/Crc32Probe\":25,\"./stream/DataLengthProbe\":26,\"./stream/DataWorker\":27}],3:[function(e,t,r){\"use strict\";var n=e(\"./stream/GenericWorker\");r.STORE={magic:\"\\0\\0\",compressWorker:function(){return new n(\"STORE compression\")},uncompressWorker:function(){return new n(\"STORE decompression\")}},r.DEFLATE=e(\"./flate\")},{\"./flate\":7,\"./stream/GenericWorker\":28}],4:[function(e,t,r){\"use strict\";var n=e(\"./utils\");var o=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t){return void 0!==e&&e.length?\"string\"!==n.getTypeOf(e)?function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t[a])];return-1^e}(0|t,e,e.length,0):function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t.charCodeAt(a))];return-1^e}(0|t,e,e.length,0):0}},{\"./utils\":32}],5:[function(e,t,r){\"use strict\";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(e,t,r){\"use strict\";var n=null;n=\"undefined\"!=typeof Promise?Promise:e(\"lie\"),t.exports={Promise:n}},{lie:37}],7:[function(e,t,r){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Uint32Array,i=e(\"pako\"),s=e(\"./utils\"),a=e(\"./stream/GenericWorker\"),o=n?\"uint8array\":\"array\";function h(e,t){a.call(this,\"FlateWorker/\"+e),this._pako=null,this._pakoAction=e,this._pakoOptions=t,this.meta={}}r.magic=\"\\b\\0\",s.inherits(h,a),h.prototype.processChunk=function(e){this.meta=e.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,e.data),!1)},h.prototype.flush=function(){a.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new i[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var t=this;this._pako.onData=function(e){t.push({data:e,meta:t.meta})}},r.compressWorker=function(e){return new h(\"Deflate\",e)},r.uncompressWorker=function(){return new h(\"Inflate\",{})}},{\"./stream/GenericWorker\":28,\"./utils\":32,pako:38}],8:[function(e,t,r){\"use strict\";function A(e,t){var r,n=\"\";for(r=0;r>>=8;return n}function n(e,t,r,n,i,s){var a,o,h=e.file,u=e.compression,l=s!==O.utf8encode,f=I.transformTo(\"string\",s(h.name)),c=I.transformTo(\"string\",O.utf8encode(h.name)),d=h.comment,p=I.transformTo(\"string\",s(d)),m=I.transformTo(\"string\",O.utf8encode(d)),_=c.length!==h.name.length,g=m.length!==d.length,b=\"\",v=\"\",y=\"\",w=h.dir,k=h.date,x={crc32:0,compressedSize:0,uncompressedSize:0};t&&!r||(x.crc32=e.crc32,x.compressedSize=e.compressedSize,x.uncompressedSize=e.uncompressedSize);var S=0;t&&(S|=8),l||!_&&!g||(S|=2048);var z=0,C=0;w&&(z|=16),\"UNIX\"===i?(C=798,z|=function(e,t){var r=e;return e||(r=t?16893:33204),(65535&r)<<16}(h.unixPermissions,w)):(C=20,z|=function(e){return 63&(e||0)}(h.dosPermissions)),a=k.getUTCHours(),a<<=6,a|=k.getUTCMinutes(),a<<=5,a|=k.getUTCSeconds()/2,o=k.getUTCFullYear()-1980,o<<=4,o|=k.getUTCMonth()+1,o<<=5,o|=k.getUTCDate(),_&&(v=A(1,1)+A(B(f),4)+c,b+=\"up\"+A(v.length,2)+v),g&&(y=A(1,1)+A(B(p),4)+m,b+=\"uc\"+A(y.length,2)+y);var E=\"\";return E+=\"\\n\\0\",E+=A(S,2),E+=u.magic,E+=A(a,2),E+=A(o,2),E+=A(x.crc32,4),E+=A(x.compressedSize,4),E+=A(x.uncompressedSize,4),E+=A(f.length,2),E+=A(b.length,2),{fileRecord:R.LOCAL_FILE_HEADER+E+f+b,dirRecord:R.CENTRAL_FILE_HEADER+A(C,2)+E+A(p.length,2)+\"\\0\\0\\0\\0\"+A(z,4)+A(n,4)+f+b+p}}var I=e(\"../utils\"),i=e(\"../stream/GenericWorker\"),O=e(\"../utf8\"),B=e(\"../crc32\"),R=e(\"../signature\");function s(e,t,r,n){i.call(this,\"ZipFileWorker\"),this.bytesWritten=0,this.zipComment=t,this.zipPlatform=r,this.encodeFileName=n,this.streamFiles=e,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}I.inherits(s,i),s.prototype.push=function(e){var t=e.meta.percent||0,r=this.entriesCount,n=this._sources.length;this.accumulate?this.contentBuffer.push(e):(this.bytesWritten+=e.data.length,i.prototype.push.call(this,{data:e.data,meta:{currentFile:this.currentFile,percent:r?(t+100*(r-n-1))/r:100}}))},s.prototype.openedSource=function(e){this.currentSourceOffset=this.bytesWritten,this.currentFile=e.file.name;var t=this.streamFiles&&!e.file.dir;if(t){var r=n(e,t,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},s.prototype.closedSource=function(e){this.accumulate=!1;var t=this.streamFiles&&!e.file.dir,r=n(e,t,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),t)this.push({data:function(e){return R.DATA_DESCRIPTOR+A(e.crc32,4)+A(e.compressedSize,4)+A(e.uncompressedSize,4)}(e),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},s.prototype.flush=function(){for(var e=this.bytesWritten,t=0;t=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo(\"string\",this.readData(e))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC(1980+(e>>25&127),(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=i},{\"../utils\":32}],19:[function(e,t,r){\"use strict\";var n=e(\"./Uint8ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./Uint8ArrayReader\":21}],20:[function(e,t,r){\"use strict\";var n=e(\"./DataReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},i.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},i.prototype.readAndCheckSignature=function(e){return e===this.readData(4)},i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./DataReader\":18}],21:[function(e,t,r){\"use strict\";var n=e(\"./ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./ArrayReader\":17}],22:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"../support\"),s=e(\"./ArrayReader\"),a=e(\"./StringReader\"),o=e(\"./NodeBufferReader\"),h=e(\"./Uint8ArrayReader\");t.exports=function(e){var t=n.getTypeOf(e);return n.checkSupport(t),\"string\"!==t||i.uint8array?\"nodebuffer\"===t?new o(e):i.uint8array?new h(n.transformTo(\"uint8array\",e)):new s(n.transformTo(\"array\",e)):new a(e)}},{\"../support\":30,\"../utils\":32,\"./ArrayReader\":17,\"./NodeBufferReader\":19,\"./StringReader\":20,\"./Uint8ArrayReader\":21}],23:[function(e,t,r){\"use strict\";r.LOCAL_FILE_HEADER=\"PK\u0003\u0004\",r.CENTRAL_FILE_HEADER=\"PK\u0001\u0002\",r.CENTRAL_DIRECTORY_END=\"PK\u0005\u0006\",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR=\"PK\u0006\u0007\",r.ZIP64_CENTRAL_DIRECTORY_END=\"PK\u0006\u0006\",r.DATA_DESCRIPTOR=\"PK\u0007\\b\"},{}],24:[function(e,t,r){\"use strict\";var n=e(\"./GenericWorker\"),i=e(\"../utils\");function s(e){n.call(this,\"ConvertWorker to \"+e),this.destType=e}i.inherits(s,n),s.prototype.processChunk=function(e){this.push({data:i.transformTo(this.destType,e.data),meta:e.meta})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],25:[function(e,t,r){\"use strict\";var n=e(\"./GenericWorker\"),i=e(\"../crc32\");function s(){n.call(this,\"Crc32Probe\"),this.withStreamInfo(\"crc32\",0)}e(\"../utils\").inherits(s,n),s.prototype.processChunk=function(e){this.streamInfo.crc32=i(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=s},{\"../crc32\":4,\"../utils\":32,\"./GenericWorker\":28}],26:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataLengthProbe for \"+e),this.propName=e,this.withStreamInfo(e,0)}n.inherits(s,i),s.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}i.prototype.processChunk.call(this,e)},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],27:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataWorker\");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type=\"\",this._tickScheduled=!1,e.then(function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=n.getTypeOf(e),t.isPaused||t._tickAndRepeat()},function(e){t.error(e)})}n.inherits(s,i),s.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=null,t=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case\"string\":e=this.data.substring(this.index,t);break;case\"uint8array\":e=this.data.subarray(this.index,t);break;case\"array\":case\"nodebuffer\":e=this.data.slice(this.index,t)}return this.index=t,this.push({data:e,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],28:[function(e,t,r){\"use strict\";function n(e){this.name=e||\"default\",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}n.prototype={push:function(e){this.emit(\"data\",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit(\"end\"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit(\"error\",e)}return!0},error:function(e){return!this.isFinished&&(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit(\"error\",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var r=0;r \"+e:e}},t.exports=n},{}],29:[function(e,t,r){\"use strict\";var h=e(\"../utils\"),i=e(\"./ConvertWorker\"),s=e(\"./GenericWorker\"),u=e(\"../base64\"),n=e(\"../support\"),a=e(\"../external\"),o=null;if(n.nodestream)try{o=e(\"../nodejs/NodejsStreamOutputAdapter\")}catch(e){}function l(e,o){return new a.Promise(function(t,r){var n=[],i=e._internalType,s=e._outputType,a=e._mimeType;e.on(\"data\",function(e,t){n.push(e),o&&o(t)}).on(\"error\",function(e){n=[],r(e)}).on(\"end\",function(){try{var e=function(e,t,r){switch(e){case\"blob\":return h.newBlob(h.transformTo(\"arraybuffer\",t),r);case\"base64\":return u.encode(t);default:return h.transformTo(e,t)}}(s,function(e,t){var r,n=0,i=null,s=0;for(r=0;r>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t}(e)},s.utf8decode=function(e){return h.nodebuffer?o.transformTo(\"nodebuffer\",e).toString(\"utf-8\"):function(e){var t,r,n,i,s=e.length,a=new Array(2*s);for(t=r=0;t>10&1023,a[r++]=56320|1023&n)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)}(e=o.transformTo(h.uint8array?\"uint8array\":\"array\",e))},o.inherits(a,n),a.prototype.processChunk=function(e){var t=o.transformTo(h.uint8array?\"uint8array\":\"array\",e.data);if(this.leftOver&&this.leftOver.length){if(h.uint8array){var r=t;(t=new Uint8Array(r.length+this.leftOver.length)).set(this.leftOver,0),t.set(r,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var n=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}(t),i=t;n!==t.length&&(h.uint8array?(i=t.subarray(0,n),this.leftOver=t.subarray(n,t.length)):(i=t.slice(0,n),this.leftOver=t.slice(n,t.length))),this.push({data:s.utf8decode(i),meta:e.meta})},a.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:s.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},s.Utf8DecodeWorker=a,o.inherits(l,n),l.prototype.processChunk=function(e){this.push({data:s.utf8encode(e.data),meta:e.meta})},s.Utf8EncodeWorker=l},{\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./support\":30,\"./utils\":32}],32:[function(e,t,a){\"use strict\";var o=e(\"./support\"),h=e(\"./base64\"),r=e(\"./nodejsUtils\"),u=e(\"./external\");function n(e){return e}function l(e,t){for(var r=0;r>8;this.dir=!!(16&this.externalFileAttributes),0==e&&(this.dosPermissions=63&this.externalFileAttributes),3==e&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||\"/\"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===s.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===s.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===s.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===s.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(e){var t,r,n,i=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.index+4>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t},r.buf2binstring=function(e){return l(e,e.length)},r.binstring2buf=function(e){for(var t=new h.Buf8(e.length),r=0,n=t.length;r>10&1023,o[n++]=56320|1023&i)}return l(o,n)},r.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}},{\"./common\":41}],43:[function(e,t,r){\"use strict\";t.exports=function(e,t,r,n){for(var i=65535&e|0,s=e>>>16&65535|0,a=0;0!==r;){for(r-=a=2e3>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t[a])];return-1^e}},{}],46:[function(e,t,r){\"use strict\";var h,c=e(\"../utils/common\"),u=e(\"./trees\"),d=e(\"./adler32\"),p=e(\"./crc32\"),n=e(\"./messages\"),l=0,f=4,m=0,_=-2,g=-1,b=4,i=2,v=8,y=9,s=286,a=30,o=19,w=2*s+1,k=15,x=3,S=258,z=S+x+1,C=42,E=113,A=1,I=2,O=3,B=4;function R(e,t){return e.msg=n[t],t}function T(e){return(e<<1)-(4e.avail_out&&(r=e.avail_out),0!==r&&(c.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function N(e,t){u._tr_flush_block(e,0<=e.block_start?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,F(e.strm)}function U(e,t){e.pending_buf[e.pending++]=t}function P(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function L(e,t){var r,n,i=e.max_chain_length,s=e.strstart,a=e.prev_length,o=e.nice_match,h=e.strstart>e.w_size-z?e.strstart-(e.w_size-z):0,u=e.window,l=e.w_mask,f=e.prev,c=e.strstart+S,d=u[s+a-1],p=u[s+a];e.prev_length>=e.good_match&&(i>>=2),o>e.lookahead&&(o=e.lookahead);do{if(u[(r=t)+a]===p&&u[r+a-1]===d&&u[r]===u[s]&&u[++r]===u[s+1]){s+=2,r++;do{}while(u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&sh&&0!=--i);return a<=e.lookahead?a:e.lookahead}function j(e){var t,r,n,i,s,a,o,h,u,l,f=e.w_size;do{if(i=e.window_size-e.lookahead-e.strstart,e.strstart>=f+(f-z)){for(c.arraySet(e.window,e.window,f,f,0),e.match_start-=f,e.strstart-=f,e.block_start-=f,t=r=e.hash_size;n=e.head[--t],e.head[t]=f<=n?n-f:0,--r;);for(t=r=f;n=e.prev[--t],e.prev[t]=f<=n?n-f:0,--r;);i+=f}if(0===e.strm.avail_in)break;if(a=e.strm,o=e.window,h=e.strstart+e.lookahead,u=i,l=void 0,l=a.avail_in,u=x)for(s=e.strstart-e.insert,e.ins_h=e.window[s],e.ins_h=(e.ins_h<=x&&(e.ins_h=(e.ins_h<=x)if(n=u._tr_tally(e,e.strstart-e.match_start,e.match_length-x),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=x){for(e.match_length--;e.strstart++,e.ins_h=(e.ins_h<=x&&(e.ins_h=(e.ins_h<=x&&e.match_length<=e.prev_length){for(i=e.strstart+e.lookahead-x,n=u._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-x),e.lookahead-=e.prev_length-1,e.prev_length-=2;++e.strstart<=i&&(e.ins_h=(e.ins_h<e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(j(e),0===e.lookahead&&t===l)return A;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,N(e,!1),0===e.strm.avail_out))return A;if(e.strstart-e.block_start>=e.w_size-z&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):(e.strstart>e.block_start&&(N(e,!1),e.strm.avail_out),A)}),new M(4,4,8,4,Z),new M(4,5,16,8,Z),new M(4,6,32,32,Z),new M(4,4,16,16,W),new M(8,16,32,32,W),new M(8,16,128,128,W),new M(8,32,128,256,W),new M(32,128,258,1024,W),new M(32,258,258,4096,W)],r.deflateInit=function(e,t){return Y(e,t,v,15,8,0)},r.deflateInit2=Y,r.deflateReset=K,r.deflateResetKeep=G,r.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?_:(e.state.gzhead=t,m):_},r.deflate=function(e,t){var r,n,i,s;if(!e||!e.state||5>8&255),U(n,n.gzhead.time>>16&255),U(n,n.gzhead.time>>24&255),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(U(n,255&n.gzhead.extra.length),U(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=p(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(U(n,0),U(n,0),U(n,0),U(n,0),U(n,0),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,3),n.status=E);else{var a=v+(n.w_bits-8<<4)<<8;a|=(2<=n.strategy||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(a|=32),a+=31-a%31,n.status=E,P(n,a),0!==n.strstart&&(P(n,e.adler>>>16),P(n,65535&e.adler)),e.adler=1}if(69===n.status)if(n.gzhead.extra){for(i=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending!==n.pending_buf_size));)U(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindexi&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindexi&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.status=103)}else n.status=103;if(103===n.status&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&F(e),n.pending+2<=n.pending_buf_size&&(U(n,255&e.adler),U(n,e.adler>>8&255),e.adler=0,n.status=E)):n.status=E),0!==n.pending){if(F(e),0===e.avail_out)return n.last_flush=-1,m}else if(0===e.avail_in&&T(t)<=T(r)&&t!==f)return R(e,-5);if(666===n.status&&0!==e.avail_in)return R(e,-5);if(0!==e.avail_in||0!==n.lookahead||t!==l&&666!==n.status){var o=2===n.strategy?function(e,t){for(var r;;){if(0===e.lookahead&&(j(e),0===e.lookahead)){if(t===l)return A;break}if(e.match_length=0,r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):3===n.strategy?function(e,t){for(var r,n,i,s,a=e.window;;){if(e.lookahead<=S){if(j(e),e.lookahead<=S&&t===l)return A;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=x&&0e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=x?(r=u._tr_tally(e,1,e.match_length-x),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):h[n.level].func(n,t);if(o!==O&&o!==B||(n.status=666),o===A||o===O)return 0===e.avail_out&&(n.last_flush=-1),m;if(o===I&&(1===t?u._tr_align(n):5!==t&&(u._tr_stored_block(n,0,0,!1),3===t&&(D(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),F(e),0===e.avail_out))return n.last_flush=-1,m}return t!==f?m:n.wrap<=0?1:(2===n.wrap?(U(n,255&e.adler),U(n,e.adler>>8&255),U(n,e.adler>>16&255),U(n,e.adler>>24&255),U(n,255&e.total_in),U(n,e.total_in>>8&255),U(n,e.total_in>>16&255),U(n,e.total_in>>24&255)):(P(n,e.adler>>>16),P(n,65535&e.adler)),F(e),0=r.w_size&&(0===s&&(D(r.head),r.strstart=0,r.block_start=0,r.insert=0),u=new c.Buf8(r.w_size),c.arraySet(u,t,l-r.w_size,r.w_size,0),t=u,l=r.w_size),a=e.avail_in,o=e.next_in,h=e.input,e.avail_in=l,e.next_in=0,e.input=t,j(r);r.lookahead>=x;){for(n=r.strstart,i=r.lookahead-(x-1);r.ins_h=(r.ins_h<>>=y=v>>>24,p-=y,0===(y=v>>>16&255))C[s++]=65535&v;else{if(!(16&y)){if(0==(64&y)){v=m[(65535&v)+(d&(1<>>=y,p-=y),p<15&&(d+=z[n++]<>>=y=v>>>24,p-=y,!(16&(y=v>>>16&255))){if(0==(64&y)){v=_[(65535&v)+(d&(1<>>=y,p-=y,(y=s-a)>3,d&=(1<<(p-=w<<3))-1,e.next_in=n,e.next_out=s,e.avail_in=n>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function s(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new I.Buf16(320),this.work=new I.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function a(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=P,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new I.Buf32(n),t.distcode=t.distdyn=new I.Buf32(i),t.sane=1,t.back=-1,N):U}function o(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,a(e)):U}function h(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15=s.wsize?(I.arraySet(s.window,t,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(n<(i=s.wsize-s.wnext)&&(i=n),I.arraySet(s.window,t,r-n,i,s.wnext),(n-=i)?(I.arraySet(s.window,t,r-n,n,0),s.wnext=n,s.whave=s.wsize):(s.wnext+=i,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,r.check=B(r.check,E,2,0),l=u=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&u)<<8)+(u>>8))%31){e.msg=\"incorrect header check\",r.mode=30;break}if(8!=(15&u)){e.msg=\"unknown compression method\",r.mode=30;break}if(l-=4,k=8+(15&(u>>>=4)),0===r.wbits)r.wbits=k;else if(k>r.wbits){e.msg=\"invalid window size\",r.mode=30;break}r.dmax=1<>8&1),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=3;case 3:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<>>8&255,E[2]=u>>>16&255,E[3]=u>>>24&255,r.check=B(r.check,E,4,0)),l=u=0,r.mode=4;case 4:for(;l<16;){if(0===o)break e;o--,u+=n[s++]<>8),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=5;case 5:if(1024&r.flags){for(;l<16;){if(0===o)break e;o--,u+=n[s++]<>>8&255,r.check=B(r.check,E,2,0)),l=u=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(o<(d=r.length)&&(d=o),d&&(r.head&&(k=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),I.arraySet(r.head.extra,n,s,d,k)),512&r.flags&&(r.check=B(r.check,n,d,s)),o-=d,s+=d,r.length-=d),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===o)break e;for(d=0;k=n[s+d++],r.head&&k&&r.length<65536&&(r.head.name+=String.fromCharCode(k)),k&&d>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=12;break;case 10:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<>>=7&l,l-=7&l,r.mode=27;break}for(;l<3;){if(0===o)break e;o--,u+=n[s++]<>>=1)){case 0:r.mode=14;break;case 1:if(j(r),r.mode=20,6!==t)break;u>>>=2,l-=2;break e;case 2:r.mode=17;break;case 3:e.msg=\"invalid block type\",r.mode=30}u>>>=2,l-=2;break;case 14:for(u>>>=7&l,l-=7&l;l<32;){if(0===o)break e;o--,u+=n[s++]<>>16^65535)){e.msg=\"invalid stored block lengths\",r.mode=30;break}if(r.length=65535&u,l=u=0,r.mode=15,6===t)break e;case 15:r.mode=16;case 16:if(d=r.length){if(o>>=5,l-=5,r.ndist=1+(31&u),u>>>=5,l-=5,r.ncode=4+(15&u),u>>>=4,l-=4,286>>=3,l-=3}for(;r.have<19;)r.lens[A[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,S={bits:r.lenbits},x=T(0,r.lens,0,19,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg=\"invalid code lengths set\",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=_,l-=_,r.lens[r.have++]=b;else{if(16===b){for(z=_+2;l>>=_,l-=_,0===r.have){e.msg=\"invalid bit length repeat\",r.mode=30;break}k=r.lens[r.have-1],d=3+(3&u),u>>>=2,l-=2}else if(17===b){for(z=_+3;l>>=_)),u>>>=3,l-=3}else{for(z=_+7;l>>=_)),u>>>=7,l-=7}if(r.have+d>r.nlen+r.ndist){e.msg=\"invalid bit length repeat\",r.mode=30;break}for(;d--;)r.lens[r.have++]=k}}if(30===r.mode)break;if(0===r.lens[256]){e.msg=\"invalid code -- missing end-of-block\",r.mode=30;break}if(r.lenbits=9,S={bits:r.lenbits},x=T(D,r.lens,0,r.nlen,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg=\"invalid literal/lengths set\",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,S={bits:r.distbits},x=T(F,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,S),r.distbits=S.bits,x){e.msg=\"invalid distances set\",r.mode=30;break}if(r.mode=20,6===t)break e;case 20:r.mode=21;case 21:if(6<=o&&258<=h){e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,r.hold=u,r.bits=l,R(e,c),a=e.next_out,i=e.output,h=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,u=r.hold,l=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;g=(C=r.lencode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,r.length=b,0===g){r.mode=26;break}if(32&g){r.back=-1,r.mode=12;break}if(64&g){e.msg=\"invalid literal/length code\",r.mode=30;break}r.extra=15&g,r.mode=22;case 22:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;g=(C=r.distcode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,64&g){e.msg=\"invalid distance code\",r.mode=30;break}r.offset=b,r.extra=15&g,r.mode=24;case 24:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg=\"invalid distance too far back\",r.mode=30;break}r.mode=25;case 25:if(0===h)break e;if(d=c-h,r.offset>d){if((d=r.offset-d)>r.whave&&r.sane){e.msg=\"invalid distance too far back\",r.mode=30;break}p=d>r.wnext?(d-=r.wnext,r.wsize-d):r.wnext-d,d>r.length&&(d=r.length),m=r.window}else m=i,p=a-r.offset,d=r.length;for(hd?(m=R[T+a[v]],A[I+a[v]]):(m=96,0),h=1<>S)+(u-=h)]=p<<24|m<<16|_|0,0!==u;);for(h=1<>=1;if(0!==h?(E&=h-1,E+=h):E=0,v++,0==--O[b]){if(b===w)break;b=t[r+a[v]]}if(k>>7)]}function U(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function P(e,t,r){e.bi_valid>d-r?(e.bi_buf|=t<>d-e.bi_valid,e.bi_valid+=r-d):(e.bi_buf|=t<>>=1,r<<=1,0<--t;);return r>>>1}function Z(e,t,r){var n,i,s=new Array(g+1),a=0;for(n=1;n<=g;n++)s[n]=a=a+r[n-1]<<1;for(i=0;i<=t;i++){var o=e[2*i+1];0!==o&&(e[2*i]=j(s[o]++,o))}}function W(e){var t;for(t=0;t>1;1<=r;r--)G(e,s,r);for(i=h;r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],G(e,s,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,s[2*i]=s[2*r]+s[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,s[2*r+1]=s[2*n+1]=i,e.heap[1]=i++,G(e,s,1),2<=e.heap_len;);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,i,s,a,o,h=t.dyn_tree,u=t.max_code,l=t.stat_desc.static_tree,f=t.stat_desc.has_stree,c=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,m=0;for(s=0;s<=g;s++)e.bl_count[s]=0;for(h[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;r<_;r++)p<(s=h[2*h[2*(n=e.heap[r])+1]+1]+1)&&(s=p,m++),h[2*n+1]=s,u>=7;n>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return o;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return h;for(t=32;t>>3,(s=e.static_len+3+7>>>3)<=i&&(i=s)):i=s=r+5,r+4<=i&&-1!==t?J(e,t,r,n):4===e.strategy||s===i?(P(e,2+(n?1:0),3),K(e,z,C)):(P(e,4+(n?1:0),3),function(e,t,r,n){var i;for(P(e,t-257,5),P(e,r-1,5),P(e,n-4,4),i=0;i>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(A[r]+u+1)]++,e.dyn_dtree[2*N(t)]++),e.last_lit===e.lit_bufsize-1},r._tr_align=function(e){P(e,2,3),L(e,m,z),function(e){16===e.bi_valid?(U(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):8<=e.bi_valid&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},{\"../utils/common\":41}],53:[function(e,t,r){\"use strict\";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(e,t,r){(function(e){!function(r,n){\"use strict\";if(!r.setImmediate){var i,s,t,a,o=1,h={},u=!1,l=r.document,e=Object.getPrototypeOf&&Object.getPrototypeOf(r);e=e&&e.setTimeout?e:r,i=\"[object process]\"==={}.toString.call(r.process)?function(e){process.nextTick(function(){c(e)})}:function(){if(r.postMessage&&!r.importScripts){var e=!0,t=r.onmessage;return r.onmessage=function(){e=!1},r.postMessage(\"\",\"*\"),r.onmessage=t,e}}()?(a=\"setImmediate$\"+Math.random()+\"$\",r.addEventListener?r.addEventListener(\"message\",d,!1):r.attachEvent(\"onmessage\",d),function(e){r.postMessage(a+e,\"*\")}):r.MessageChannel?((t=new MessageChannel).port1.onmessage=function(e){c(e.data)},function(e){t.port2.postMessage(e)}):l&&\"onreadystatechange\"in l.createElement(\"script\")?(s=l.documentElement,function(e){var t=l.createElement(\"script\");t.onreadystatechange=function(){c(e),t.onreadystatechange=null,s.removeChild(t),t=null},s.appendChild(t)}):function(e){setTimeout(c,0,e)},e.setImmediate=function(e){\"function\"!=typeof e&&(e=new Function(\"\"+e));for(var t=new Array(arguments.length-1),r=0;r arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}\nmodule.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var arrayLikeToArray = require(\"./arrayLikeToArray.js\");\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}\nmodule.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nmodule.exports = _nonIterableRest, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var arrayWithHoles = require(\"./arrayWithHoles.js\");\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit.js\");\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray.js\");\nvar nonIterableRest = require(\"./nonIterableRest.js\");\nfunction _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}\nmodule.exports = _slicedToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nmodule.exports = _classCallCheck, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return (module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports), _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nmodule.exports = toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : String(i);\n}\nmodule.exports = toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}\nmodule.exports = _createClass, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@babel/runtime/helpers/slicedToArray'), require('@babel/runtime/helpers/classCallCheck'), require('@babel/runtime/helpers/createClass')) :\n typeof define === 'function' && define.amd ? define(['exports', '@babel/runtime/helpers/slicedToArray', '@babel/runtime/helpers/classCallCheck', '@babel/runtime/helpers/createClass'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.automationEvents = {}, global._slicedToArray, global._classCallCheck, global._createClass));\n})(this, (function (exports, _slicedToArray, _classCallCheck, _createClass) { 'use strict';\n\n var createExtendedExponentialRampToValueAutomationEvent = function createExtendedExponentialRampToValueAutomationEvent(value, endTime, insertTime) {\n return {\n endTime: endTime,\n insertTime: insertTime,\n type: 'exponentialRampToValue',\n value: value\n };\n };\n\n var createExtendedLinearRampToValueAutomationEvent = function createExtendedLinearRampToValueAutomationEvent(value, endTime, insertTime) {\n return {\n endTime: endTime,\n insertTime: insertTime,\n type: 'linearRampToValue',\n value: value\n };\n };\n\n var createSetValueAutomationEvent = function createSetValueAutomationEvent(value, startTime) {\n return {\n startTime: startTime,\n type: 'setValue',\n value: value\n };\n };\n\n var createSetValueCurveAutomationEvent = function createSetValueCurveAutomationEvent(values, startTime, duration) {\n return {\n duration: duration,\n startTime: startTime,\n type: 'setValueCurve',\n values: values\n };\n };\n\n var getTargetValueAtTime = function getTargetValueAtTime(time, valueAtStartTime, _ref) {\n var startTime = _ref.startTime,\n target = _ref.target,\n timeConstant = _ref.timeConstant;\n return target + (valueAtStartTime - target) * Math.exp((startTime - time) / timeConstant);\n };\n\n var isExponentialRampToValueAutomationEvent = function isExponentialRampToValueAutomationEvent(automationEvent) {\n return automationEvent.type === 'exponentialRampToValue';\n };\n\n var isLinearRampToValueAutomationEvent = function isLinearRampToValueAutomationEvent(automationEvent) {\n return automationEvent.type === 'linearRampToValue';\n };\n\n var isAnyRampToValueAutomationEvent = function isAnyRampToValueAutomationEvent(automationEvent) {\n return isExponentialRampToValueAutomationEvent(automationEvent) || isLinearRampToValueAutomationEvent(automationEvent);\n };\n\n var isSetValueAutomationEvent = function isSetValueAutomationEvent(automationEvent) {\n return automationEvent.type === 'setValue';\n };\n\n var isSetValueCurveAutomationEvent = function isSetValueCurveAutomationEvent(automationEvent) {\n return automationEvent.type === 'setValueCurve';\n };\n\n var getValueOfAutomationEventAtIndexAtTime = function getValueOfAutomationEventAtIndexAtTime(automationEvents, index, time, defaultValue) {\n var automationEvent = automationEvents[index];\n return automationEvent === undefined ? defaultValue : isAnyRampToValueAutomationEvent(automationEvent) || isSetValueAutomationEvent(automationEvent) ? automationEvent.value : isSetValueCurveAutomationEvent(automationEvent) ? automationEvent.values[automationEvent.values.length - 1] : getTargetValueAtTime(time, getValueOfAutomationEventAtIndexAtTime(automationEvents, index - 1, automationEvent.startTime, defaultValue), automationEvent);\n };\n\n var getEndTimeAndValueOfPreviousAutomationEvent = function getEndTimeAndValueOfPreviousAutomationEvent(automationEvents, index, currentAutomationEvent, nextAutomationEvent, defaultValue) {\n return currentAutomationEvent === undefined ? [nextAutomationEvent.insertTime, defaultValue] : isAnyRampToValueAutomationEvent(currentAutomationEvent) ? [currentAutomationEvent.endTime, currentAutomationEvent.value] : isSetValueAutomationEvent(currentAutomationEvent) ? [currentAutomationEvent.startTime, currentAutomationEvent.value] : isSetValueCurveAutomationEvent(currentAutomationEvent) ? [currentAutomationEvent.startTime + currentAutomationEvent.duration, currentAutomationEvent.values[currentAutomationEvent.values.length - 1]] : [currentAutomationEvent.startTime, getValueOfAutomationEventAtIndexAtTime(automationEvents, index - 1, currentAutomationEvent.startTime, defaultValue)];\n };\n\n var isCancelAndHoldAutomationEvent = function isCancelAndHoldAutomationEvent(automationEvent) {\n return automationEvent.type === 'cancelAndHold';\n };\n\n var isCancelScheduledValuesAutomationEvent = function isCancelScheduledValuesAutomationEvent(automationEvent) {\n return automationEvent.type === 'cancelScheduledValues';\n };\n\n var getEventTime = function getEventTime(automationEvent) {\n if (isCancelAndHoldAutomationEvent(automationEvent) || isCancelScheduledValuesAutomationEvent(automationEvent)) {\n return automationEvent.cancelTime;\n }\n if (isExponentialRampToValueAutomationEvent(automationEvent) || isLinearRampToValueAutomationEvent(automationEvent)) {\n return automationEvent.endTime;\n }\n return automationEvent.startTime;\n };\n\n var getExponentialRampValueAtTime = function getExponentialRampValueAtTime(time, startTime, valueAtStartTime, _ref) {\n var endTime = _ref.endTime,\n value = _ref.value;\n if (valueAtStartTime === value) {\n return value;\n }\n if (0 < valueAtStartTime && 0 < value || valueAtStartTime < 0 && value < 0) {\n return valueAtStartTime * Math.pow(value / valueAtStartTime, (time - startTime) / (endTime - startTime));\n }\n return 0;\n };\n\n var getLinearRampValueAtTime = function getLinearRampValueAtTime(time, startTime, valueAtStartTime, _ref) {\n var endTime = _ref.endTime,\n value = _ref.value;\n return valueAtStartTime + (time - startTime) / (endTime - startTime) * (value - valueAtStartTime);\n };\n\n var interpolateValue = function interpolateValue(values, theoreticIndex) {\n var lowerIndex = Math.floor(theoreticIndex);\n var upperIndex = Math.ceil(theoreticIndex);\n if (lowerIndex === upperIndex) {\n return values[lowerIndex];\n }\n return (1 - (theoreticIndex - lowerIndex)) * values[lowerIndex] + (1 - (upperIndex - theoreticIndex)) * values[upperIndex];\n };\n\n var getValueCurveValueAtTime = function getValueCurveValueAtTime(time, _ref) {\n var duration = _ref.duration,\n startTime = _ref.startTime,\n values = _ref.values;\n var theoreticIndex = (time - startTime) / duration * (values.length - 1);\n return interpolateValue(values, theoreticIndex);\n };\n\n var isSetTargetAutomationEvent = function isSetTargetAutomationEvent(automationEvent) {\n return automationEvent.type === 'setTarget';\n };\n\n var AutomationEventList = /*#__PURE__*/function (_Symbol$iterator) {\n function AutomationEventList(defaultValue) {\n _classCallCheck(this, AutomationEventList);\n this._automationEvents = [];\n this._currenTime = 0;\n this._defaultValue = defaultValue;\n }\n _createClass(AutomationEventList, [{\n key: _Symbol$iterator,\n value: function value() {\n return this._automationEvents[Symbol.iterator]();\n }\n }, {\n key: \"add\",\n value: function add(automationEvent) {\n var eventTime = getEventTime(automationEvent);\n if (isCancelAndHoldAutomationEvent(automationEvent) || isCancelScheduledValuesAutomationEvent(automationEvent)) {\n var index = this._automationEvents.findIndex(function (currentAutomationEvent) {\n if (isCancelScheduledValuesAutomationEvent(automationEvent) && isSetValueCurveAutomationEvent(currentAutomationEvent)) {\n return currentAutomationEvent.startTime + currentAutomationEvent.duration >= eventTime;\n }\n return getEventTime(currentAutomationEvent) >= eventTime;\n });\n var removedAutomationEvent = this._automationEvents[index];\n if (index !== -1) {\n this._automationEvents = this._automationEvents.slice(0, index);\n }\n if (isCancelAndHoldAutomationEvent(automationEvent)) {\n var lastAutomationEvent = this._automationEvents[this._automationEvents.length - 1];\n if (removedAutomationEvent !== undefined && isAnyRampToValueAutomationEvent(removedAutomationEvent)) {\n if (lastAutomationEvent !== undefined && isSetTargetAutomationEvent(lastAutomationEvent)) {\n throw new Error('The internal list is malformed.');\n }\n var startTime = lastAutomationEvent === undefined ? removedAutomationEvent.insertTime : isSetValueCurveAutomationEvent(lastAutomationEvent) ? lastAutomationEvent.startTime + lastAutomationEvent.duration : getEventTime(lastAutomationEvent);\n var startValue = lastAutomationEvent === undefined ? this._defaultValue : isSetValueCurveAutomationEvent(lastAutomationEvent) ? lastAutomationEvent.values[lastAutomationEvent.values.length - 1] : lastAutomationEvent.value;\n var value = isExponentialRampToValueAutomationEvent(removedAutomationEvent) ? getExponentialRampValueAtTime(eventTime, startTime, startValue, removedAutomationEvent) : getLinearRampValueAtTime(eventTime, startTime, startValue, removedAutomationEvent);\n var truncatedAutomationEvent = isExponentialRampToValueAutomationEvent(removedAutomationEvent) ? createExtendedExponentialRampToValueAutomationEvent(value, eventTime, this._currenTime) : createExtendedLinearRampToValueAutomationEvent(value, eventTime, this._currenTime);\n this._automationEvents.push(truncatedAutomationEvent);\n }\n if (lastAutomationEvent !== undefined && isSetTargetAutomationEvent(lastAutomationEvent)) {\n this._automationEvents.push(createSetValueAutomationEvent(this.getValue(eventTime), eventTime));\n }\n if (lastAutomationEvent !== undefined && isSetValueCurveAutomationEvent(lastAutomationEvent) && lastAutomationEvent.startTime + lastAutomationEvent.duration > eventTime) {\n var duration = eventTime - lastAutomationEvent.startTime;\n var ratio = (lastAutomationEvent.values.length - 1) / lastAutomationEvent.duration;\n var length = Math.max(2, 1 + Math.ceil(duration * ratio));\n var fraction = duration / (length - 1) * ratio;\n var values = lastAutomationEvent.values.slice(0, length);\n if (fraction < 1) {\n for (var i = 1; i < length; i += 1) {\n var factor = fraction * i % 1;\n values[i] = lastAutomationEvent.values[i - 1] * (1 - factor) + lastAutomationEvent.values[i] * factor;\n }\n }\n this._automationEvents[this._automationEvents.length - 1] = createSetValueCurveAutomationEvent(values, lastAutomationEvent.startTime, duration);\n }\n }\n } else {\n var _index = this._automationEvents.findIndex(function (currentAutomationEvent) {\n return getEventTime(currentAutomationEvent) > eventTime;\n });\n var previousAutomationEvent = _index === -1 ? this._automationEvents[this._automationEvents.length - 1] : this._automationEvents[_index - 1];\n if (previousAutomationEvent !== undefined && isSetValueCurveAutomationEvent(previousAutomationEvent) && getEventTime(previousAutomationEvent) + previousAutomationEvent.duration > eventTime) {\n return false;\n }\n var persistentAutomationEvent = isExponentialRampToValueAutomationEvent(automationEvent) ? createExtendedExponentialRampToValueAutomationEvent(automationEvent.value, automationEvent.endTime, this._currenTime) : isLinearRampToValueAutomationEvent(automationEvent) ? createExtendedLinearRampToValueAutomationEvent(automationEvent.value, eventTime, this._currenTime) : automationEvent;\n if (_index === -1) {\n this._automationEvents.push(persistentAutomationEvent);\n } else {\n if (isSetValueCurveAutomationEvent(automationEvent) && eventTime + automationEvent.duration > getEventTime(this._automationEvents[_index])) {\n return false;\n }\n this._automationEvents.splice(_index, 0, persistentAutomationEvent);\n }\n }\n return true;\n }\n }, {\n key: \"flush\",\n value: function flush(time) {\n var index = this._automationEvents.findIndex(function (currentAutomationEvent) {\n return getEventTime(currentAutomationEvent) > time;\n });\n if (index > 1) {\n var remainingAutomationEvents = this._automationEvents.slice(index - 1);\n var firstRemainingAutomationEvent = remainingAutomationEvents[0];\n if (isSetTargetAutomationEvent(firstRemainingAutomationEvent)) {\n remainingAutomationEvents.unshift(createSetValueAutomationEvent(getValueOfAutomationEventAtIndexAtTime(this._automationEvents, index - 2, firstRemainingAutomationEvent.startTime, this._defaultValue), firstRemainingAutomationEvent.startTime));\n }\n this._automationEvents = remainingAutomationEvents;\n }\n }\n }, {\n key: \"getValue\",\n value: function getValue(time) {\n if (this._automationEvents.length === 0) {\n return this._defaultValue;\n }\n var indexOfNextEvent = this._automationEvents.findIndex(function (automationEvent) {\n return getEventTime(automationEvent) > time;\n });\n var nextAutomationEvent = this._automationEvents[indexOfNextEvent];\n var indexOfCurrentEvent = (indexOfNextEvent === -1 ? this._automationEvents.length : indexOfNextEvent) - 1;\n var currentAutomationEvent = this._automationEvents[indexOfCurrentEvent];\n if (currentAutomationEvent !== undefined && isSetTargetAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent) || nextAutomationEvent.insertTime > time)) {\n return getTargetValueAtTime(time, getValueOfAutomationEventAtIndexAtTime(this._automationEvents, indexOfCurrentEvent - 1, currentAutomationEvent.startTime, this._defaultValue), currentAutomationEvent);\n }\n if (currentAutomationEvent !== undefined && isSetValueAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent))) {\n return currentAutomationEvent.value;\n }\n if (currentAutomationEvent !== undefined && isSetValueCurveAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent) || currentAutomationEvent.startTime + currentAutomationEvent.duration > time)) {\n if (time < currentAutomationEvent.startTime + currentAutomationEvent.duration) {\n return getValueCurveValueAtTime(time, currentAutomationEvent);\n }\n return currentAutomationEvent.values[currentAutomationEvent.values.length - 1];\n }\n if (currentAutomationEvent !== undefined && isAnyRampToValueAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent))) {\n return currentAutomationEvent.value;\n }\n if (nextAutomationEvent !== undefined && isExponentialRampToValueAutomationEvent(nextAutomationEvent)) {\n var _getEndTimeAndValueOf = getEndTimeAndValueOfPreviousAutomationEvent(this._automationEvents, indexOfCurrentEvent, currentAutomationEvent, nextAutomationEvent, this._defaultValue),\n _getEndTimeAndValueOf2 = _slicedToArray(_getEndTimeAndValueOf, 2),\n startTime = _getEndTimeAndValueOf2[0],\n value = _getEndTimeAndValueOf2[1];\n return getExponentialRampValueAtTime(time, startTime, value, nextAutomationEvent);\n }\n if (nextAutomationEvent !== undefined && isLinearRampToValueAutomationEvent(nextAutomationEvent)) {\n var _getEndTimeAndValueOf3 = getEndTimeAndValueOfPreviousAutomationEvent(this._automationEvents, indexOfCurrentEvent, currentAutomationEvent, nextAutomationEvent, this._defaultValue),\n _getEndTimeAndValueOf4 = _slicedToArray(_getEndTimeAndValueOf3, 2),\n _startTime = _getEndTimeAndValueOf4[0],\n _value = _getEndTimeAndValueOf4[1];\n return getLinearRampValueAtTime(time, _startTime, _value, nextAutomationEvent);\n }\n return this._defaultValue;\n }\n }]);\n return AutomationEventList;\n }(Symbol.iterator);\n\n var createCancelAndHoldAutomationEvent = function createCancelAndHoldAutomationEvent(cancelTime) {\n return {\n cancelTime: cancelTime,\n type: 'cancelAndHold'\n };\n };\n\n var createCancelScheduledValuesAutomationEvent = function createCancelScheduledValuesAutomationEvent(cancelTime) {\n return {\n cancelTime: cancelTime,\n type: 'cancelScheduledValues'\n };\n };\n\n var createExponentialRampToValueAutomationEvent = function createExponentialRampToValueAutomationEvent(value, endTime) {\n return {\n endTime: endTime,\n type: 'exponentialRampToValue',\n value: value\n };\n };\n\n var createLinearRampToValueAutomationEvent = function createLinearRampToValueAutomationEvent(value, endTime) {\n return {\n endTime: endTime,\n type: 'linearRampToValue',\n value: value\n };\n };\n\n var createSetTargetAutomationEvent = function createSetTargetAutomationEvent(target, startTime, timeConstant) {\n return {\n startTime: startTime,\n target: target,\n timeConstant: timeConstant,\n type: 'setTarget'\n };\n };\n\n exports.AutomationEventList = AutomationEventList;\n exports.createCancelAndHoldAutomationEvent = createCancelAndHoldAutomationEvent;\n exports.createCancelScheduledValuesAutomationEvent = createCancelScheduledValuesAutomationEvent;\n exports.createExponentialRampToValueAutomationEvent = createExponentialRampToValueAutomationEvent;\n exports.createLinearRampToValueAutomationEvent = createLinearRampToValueAutomationEvent;\n exports.createSetTargetAutomationEvent = createSetTargetAutomationEvent;\n exports.createSetValueAutomationEvent = createSetValueAutomationEvent;\n exports.createSetValueCurveAutomationEvent = createSetValueCurveAutomationEvent;\n\n}));\n", "const {\n hasOwnProperty,\n setPrototypeOf,\n isFrozen,\n getPrototypeOf,\n getOwnPropertyDescriptor,\n} = Object;\n\nlet { freeze, seal, create } = Object; // eslint-disable-line import/no-mutable-exports\nlet { apply, construct } = typeof Reflect !== 'undefined' && Reflect;\n\nif (!apply) {\n apply = function (fun, thisValue, args) {\n return fun.apply(thisValue, args);\n };\n}\n\nif (!freeze) {\n freeze = function (x) {\n return x;\n };\n}\n\nif (!seal) {\n seal = function (x) {\n return x;\n };\n}\n\nif (!construct) {\n construct = function (Func, args) {\n return new Func(...args);\n };\n}\n\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayIndexOf = unapply(Array.prototype.indexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySlice = unapply(Array.prototype.slice);\n\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\n\nconst regExpTest = unapply(RegExp.prototype.test);\n\nconst typeErrorCreate = unconstruct(TypeError);\n\nexport function numberIsNaN(x) {\n // eslint-disable-next-line unicorn/prefer-number-properties\n return typeof x === 'number' && isNaN(x);\n}\n\nexport function unapply(func) {\n return (thisArg, ...args) => apply(func, thisArg, args);\n}\n\nexport function unconstruct(func) {\n return (...args) => construct(func, args);\n}\n\n/* Add properties to a lookup table */\nexport function addToSet(set, array, transformCaseFunc) {\n transformCaseFunc = transformCaseFunc ?? stringToLowerCase;\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n\n let l = array.length;\n while (l--) {\n let element = array[l];\n if (typeof element === 'string') {\n const lcElement = transformCaseFunc(element);\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n\n element = lcElement;\n }\n }\n\n set[element] = true;\n }\n\n return set;\n}\n\n/* Shallow clone an object */\nexport function clone(object) {\n const newObject = create(null);\n\n let property;\n for (property in object) {\n if (apply(hasOwnProperty, object, [property]) === true) {\n newObject[property] = object[property];\n }\n }\n\n return newObject;\n}\n\n/* IE10 doesn't support __lookupGetter__ so lets'\n * simulate it. It also automatically checks\n * if the prop is function or getter and behaves\n * accordingly. */\nfunction lookupGetter(object, prop) {\n while (object !== null) {\n const desc = getOwnPropertyDescriptor(object, prop);\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n\n object = getPrototypeOf(object);\n }\n\n function fallbackValue(element) {\n console.warn('fallback value for', element);\n return null;\n }\n\n return fallbackValue;\n}\n\nexport {\n // Array\n arrayForEach,\n arrayIndexOf,\n arrayPop,\n arrayPush,\n arraySlice,\n // Object\n freeze,\n getPrototypeOf,\n getOwnPropertyDescriptor,\n hasOwnProperty,\n isFrozen,\n setPrototypeOf,\n seal,\n // RegExp\n regExpTest,\n // String\n stringIndexOf,\n stringMatch,\n stringReplace,\n stringToLowerCase,\n stringToString,\n stringTrim,\n // Errors\n typeErrorCreate,\n // Other\n lookupGetter,\n};\n", "import { freeze } from './utils.js';\n\nexport const html = freeze([\n 'a',\n 'abbr',\n 'acronym',\n 'address',\n 'area',\n 'article',\n 'aside',\n 'audio',\n 'b',\n 'bdi',\n 'bdo',\n 'big',\n 'blink',\n 'blockquote',\n 'body',\n 'br',\n 'button',\n 'canvas',\n 'caption',\n 'center',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'content',\n 'data',\n 'datalist',\n 'dd',\n 'decorator',\n 'del',\n 'details',\n 'dfn',\n 'dialog',\n 'dir',\n 'div',\n 'dl',\n 'dt',\n 'element',\n 'em',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'font',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'i',\n 'img',\n 'input',\n 'ins',\n 'kbd',\n 'label',\n 'legend',\n 'li',\n 'main',\n 'map',\n 'mark',\n 'marquee',\n 'menu',\n 'menuitem',\n 'meter',\n 'nav',\n 'nobr',\n 'ol',\n 'optgroup',\n 'option',\n 'output',\n 'p',\n 'picture',\n 'pre',\n 'progress',\n 'q',\n 'rp',\n 'rt',\n 'ruby',\n 's',\n 'samp',\n 'section',\n 'select',\n 'shadow',\n 'small',\n 'source',\n 'spacer',\n 'span',\n 'strike',\n 'strong',\n 'style',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'template',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'tr',\n 'track',\n 'tt',\n 'u',\n 'ul',\n 'var',\n 'video',\n 'wbr',\n]);\n\n// SVG\nexport const svg = freeze([\n 'svg',\n 'a',\n 'altglyph',\n 'altglyphdef',\n 'altglyphitem',\n 'animatecolor',\n 'animatemotion',\n 'animatetransform',\n 'circle',\n 'clippath',\n 'defs',\n 'desc',\n 'ellipse',\n 'filter',\n 'font',\n 'g',\n 'glyph',\n 'glyphref',\n 'hkern',\n 'image',\n 'line',\n 'lineargradient',\n 'marker',\n 'mask',\n 'metadata',\n 'mpath',\n 'path',\n 'pattern',\n 'polygon',\n 'polyline',\n 'radialgradient',\n 'rect',\n 'stop',\n 'style',\n 'switch',\n 'symbol',\n 'text',\n 'textpath',\n 'title',\n 'tref',\n 'tspan',\n 'view',\n 'vkern',\n]);\n\nexport const svgFilters = freeze([\n 'feBlend',\n 'feColorMatrix',\n 'feComponentTransfer',\n 'feComposite',\n 'feConvolveMatrix',\n 'feDiffuseLighting',\n 'feDisplacementMap',\n 'feDistantLight',\n 'feFlood',\n 'feFuncA',\n 'feFuncB',\n 'feFuncG',\n 'feFuncR',\n 'feGaussianBlur',\n 'feImage',\n 'feMerge',\n 'feMergeNode',\n 'feMorphology',\n 'feOffset',\n 'fePointLight',\n 'feSpecularLighting',\n 'feSpotLight',\n 'feTile',\n 'feTurbulence',\n]);\n\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nexport const svgDisallowed = freeze([\n 'animate',\n 'color-profile',\n 'cursor',\n 'discard',\n 'fedropshadow',\n 'font-face',\n 'font-face-format',\n 'font-face-name',\n 'font-face-src',\n 'font-face-uri',\n 'foreignobject',\n 'hatch',\n 'hatchpath',\n 'mesh',\n 'meshgradient',\n 'meshpatch',\n 'meshrow',\n 'missing-glyph',\n 'script',\n 'set',\n 'solidcolor',\n 'unknown',\n 'use',\n]);\n\nexport const mathMl = freeze([\n 'math',\n 'menclose',\n 'merror',\n 'mfenced',\n 'mfrac',\n 'mglyph',\n 'mi',\n 'mlabeledtr',\n 'mmultiscripts',\n 'mn',\n 'mo',\n 'mover',\n 'mpadded',\n 'mphantom',\n 'mroot',\n 'mrow',\n 'ms',\n 'mspace',\n 'msqrt',\n 'mstyle',\n 'msub',\n 'msup',\n 'msubsup',\n 'mtable',\n 'mtd',\n 'mtext',\n 'mtr',\n 'munder',\n 'munderover',\n]);\n\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nexport const mathMlDisallowed = freeze([\n 'maction',\n 'maligngroup',\n 'malignmark',\n 'mlongdiv',\n 'mscarries',\n 'mscarry',\n 'msgroup',\n 'mstack',\n 'msline',\n 'msrow',\n 'semantics',\n 'annotation',\n 'annotation-xml',\n 'mprescripts',\n 'none',\n]);\n\nexport const text = freeze(['#text']);\n", "import { freeze } from './utils.js';\n\nexport const html = freeze([\n 'accept',\n 'action',\n 'align',\n 'alt',\n 'autocapitalize',\n 'autocomplete',\n 'autopictureinpicture',\n 'autoplay',\n 'background',\n 'bgcolor',\n 'border',\n 'capture',\n 'cellpadding',\n 'cellspacing',\n 'checked',\n 'cite',\n 'class',\n 'clear',\n 'color',\n 'cols',\n 'colspan',\n 'controls',\n 'controlslist',\n 'coords',\n 'crossorigin',\n 'datetime',\n 'decoding',\n 'default',\n 'dir',\n 'disabled',\n 'disablepictureinpicture',\n 'disableremoteplayback',\n 'download',\n 'draggable',\n 'enctype',\n 'enterkeyhint',\n 'face',\n 'for',\n 'headers',\n 'height',\n 'hidden',\n 'high',\n 'href',\n 'hreflang',\n 'id',\n 'inputmode',\n 'integrity',\n 'ismap',\n 'kind',\n 'label',\n 'lang',\n 'list',\n 'loading',\n 'loop',\n 'low',\n 'max',\n 'maxlength',\n 'media',\n 'method',\n 'min',\n 'minlength',\n 'multiple',\n 'muted',\n 'name',\n 'nonce',\n 'noshade',\n 'novalidate',\n 'nowrap',\n 'open',\n 'optimum',\n 'pattern',\n 'placeholder',\n 'playsinline',\n 'poster',\n 'preload',\n 'pubdate',\n 'radiogroup',\n 'readonly',\n 'rel',\n 'required',\n 'rev',\n 'reversed',\n 'role',\n 'rows',\n 'rowspan',\n 'spellcheck',\n 'scope',\n 'selected',\n 'shape',\n 'size',\n 'sizes',\n 'span',\n 'srclang',\n 'start',\n 'src',\n 'srcset',\n 'step',\n 'style',\n 'summary',\n 'tabindex',\n 'title',\n 'translate',\n 'type',\n 'usemap',\n 'valign',\n 'value',\n 'width',\n 'xmlns',\n 'slot',\n]);\n\nexport const svg = freeze([\n 'accent-height',\n 'accumulate',\n 'additive',\n 'alignment-baseline',\n 'ascent',\n 'attributename',\n 'attributetype',\n 'azimuth',\n 'basefrequency',\n 'baseline-shift',\n 'begin',\n 'bias',\n 'by',\n 'class',\n 'clip',\n 'clippathunits',\n 'clip-path',\n 'clip-rule',\n 'color',\n 'color-interpolation',\n 'color-interpolation-filters',\n 'color-profile',\n 'color-rendering',\n 'cx',\n 'cy',\n 'd',\n 'dx',\n 'dy',\n 'diffuseconstant',\n 'direction',\n 'display',\n 'divisor',\n 'dur',\n 'edgemode',\n 'elevation',\n 'end',\n 'fill',\n 'fill-opacity',\n 'fill-rule',\n 'filter',\n 'filterunits',\n 'flood-color',\n 'flood-opacity',\n 'font-family',\n 'font-size',\n 'font-size-adjust',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'fx',\n 'fy',\n 'g1',\n 'g2',\n 'glyph-name',\n 'glyphref',\n 'gradientunits',\n 'gradienttransform',\n 'height',\n 'href',\n 'id',\n 'image-rendering',\n 'in',\n 'in2',\n 'k',\n 'k1',\n 'k2',\n 'k3',\n 'k4',\n 'kerning',\n 'keypoints',\n 'keysplines',\n 'keytimes',\n 'lang',\n 'lengthadjust',\n 'letter-spacing',\n 'kernelmatrix',\n 'kernelunitlength',\n 'lighting-color',\n 'local',\n 'marker-end',\n 'marker-mid',\n 'marker-start',\n 'markerheight',\n 'markerunits',\n 'markerwidth',\n 'maskcontentunits',\n 'maskunits',\n 'max',\n 'mask',\n 'media',\n 'method',\n 'mode',\n 'min',\n 'name',\n 'numoctaves',\n 'offset',\n 'operator',\n 'opacity',\n 'order',\n 'orient',\n 'orientation',\n 'origin',\n 'overflow',\n 'paint-order',\n 'path',\n 'pathlength',\n 'patterncontentunits',\n 'patterntransform',\n 'patternunits',\n 'points',\n 'preservealpha',\n 'preserveaspectratio',\n 'primitiveunits',\n 'r',\n 'rx',\n 'ry',\n 'radius',\n 'refx',\n 'refy',\n 'repeatcount',\n 'repeatdur',\n 'restart',\n 'result',\n 'rotate',\n 'scale',\n 'seed',\n 'shape-rendering',\n 'specularconstant',\n 'specularexponent',\n 'spreadmethod',\n 'startoffset',\n 'stddeviation',\n 'stitchtiles',\n 'stop-color',\n 'stop-opacity',\n 'stroke-dasharray',\n 'stroke-dashoffset',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke',\n 'stroke-width',\n 'style',\n 'surfacescale',\n 'systemlanguage',\n 'tabindex',\n 'targetx',\n 'targety',\n 'transform',\n 'transform-origin',\n 'text-anchor',\n 'text-decoration',\n 'text-rendering',\n 'textlength',\n 'type',\n 'u1',\n 'u2',\n 'unicode',\n 'values',\n 'viewbox',\n 'visibility',\n 'version',\n 'vert-adv-y',\n 'vert-origin-x',\n 'vert-origin-y',\n 'width',\n 'word-spacing',\n 'wrap',\n 'writing-mode',\n 'xchannelselector',\n 'ychannelselector',\n 'x',\n 'x1',\n 'x2',\n 'xmlns',\n 'y',\n 'y1',\n 'y2',\n 'z',\n 'zoomandpan',\n]);\n\nexport const mathMl = freeze([\n 'accent',\n 'accentunder',\n 'align',\n 'bevelled',\n 'close',\n 'columnsalign',\n 'columnlines',\n 'columnspan',\n 'denomalign',\n 'depth',\n 'dir',\n 'display',\n 'displaystyle',\n 'encoding',\n 'fence',\n 'frame',\n 'height',\n 'href',\n 'id',\n 'largeop',\n 'length',\n 'linethickness',\n 'lspace',\n 'lquote',\n 'mathbackground',\n 'mathcolor',\n 'mathsize',\n 'mathvariant',\n 'maxsize',\n 'minsize',\n 'movablelimits',\n 'notation',\n 'numalign',\n 'open',\n 'rowalign',\n 'rowlines',\n 'rowspacing',\n 'rowspan',\n 'rspace',\n 'rquote',\n 'scriptlevel',\n 'scriptminsize',\n 'scriptsizemultiplier',\n 'selection',\n 'separator',\n 'separators',\n 'stretchy',\n 'subscriptshift',\n 'supscriptshift',\n 'symmetric',\n 'voffset',\n 'width',\n 'xmlns',\n]);\n\nexport const xml = freeze([\n 'xlink:href',\n 'xml:id',\n 'xlink:title',\n 'xml:space',\n 'xmlns:xlink',\n]);\n", "import { seal } from './utils.js';\n\n// eslint-disable-next-line unicorn/better-regex\nexport const MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nexport const ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\nexport const TMPLIT_EXPR = seal(/\\${[\\w\\W]*}/gm);\nexport const DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]/); // eslint-disable-line no-useless-escape\nexport const ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nexport const IS_ALLOWED_URI = seal(\n /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nexport const IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nexport const ATTR_WHITESPACE = seal(\n /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nexport const DOCTYPE_NAME = seal(/^html$/i);\nexport const CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n", "import * as TAGS from './tags.js';\nimport * as ATTRS from './attrs.js';\nimport * as EXPRESSIONS from './regexp.js';\nimport {\n addToSet,\n clone,\n freeze,\n arrayForEach,\n arrayPop,\n arrayPush,\n stringMatch,\n stringReplace,\n stringToLowerCase,\n stringToString,\n stringIndexOf,\n stringTrim,\n numberIsNaN,\n regExpTest,\n typeErrorCreate,\n lookupGetter,\n} from './utils.js';\n\nconst getGlobal = () => (typeof window === 'undefined' ? null : window);\n\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param {?TrustedTypePolicyFactory} trustedTypes The policy factory.\n * @param {Document} document The document object (to determine policy name suffix)\n * @return {?TrustedTypePolicy} The policy created (or null, if Trusted Types\n * are not supported).\n */\nconst _createTrustedTypesPolicy = function (trustedTypes, document) {\n if (\n typeof trustedTypes !== 'object' ||\n typeof trustedTypes.createPolicy !== 'function'\n ) {\n return null;\n }\n\n // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n let suffix = null;\n const ATTR_NAME = 'data-tt-policy-suffix';\n if (\n document.currentScript &&\n document.currentScript.hasAttribute(ATTR_NAME)\n ) {\n suffix = document.currentScript.getAttribute(ATTR_NAME);\n }\n\n const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML(html) {\n return html;\n },\n createScriptURL(scriptUrl) {\n return scriptUrl;\n },\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn(\n 'TrustedTypes policy ' + policyName + ' could not be created.'\n );\n return null;\n }\n};\n\nfunction createDOMPurify(window = getGlobal()) {\n const DOMPurify = (root) => createDOMPurify(root);\n\n /**\n * Version label, exposed for easier checks\n * if DOMPurify is up to date or not\n */\n DOMPurify.version = VERSION;\n\n /**\n * Array of elements that DOMPurify removed during sanitation.\n * Empty if nothing was removed.\n */\n DOMPurify.removed = [];\n\n if (!window || !window.document || window.document.nodeType !== 9) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n\n return DOMPurify;\n }\n\n const originalDocument = window.document;\n\n let { document } = window;\n const {\n DocumentFragment,\n HTMLTemplateElement,\n Node,\n Element,\n NodeFilter,\n NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n HTMLFormElement,\n DOMParser,\n trustedTypes,\n } = window;\n\n const ElementPrototype = Element.prototype;\n\n const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n\n // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n if (typeof HTMLTemplateElement === 'function') {\n const template = document.createElement('template');\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n\n const trustedTypesPolicy = _createTrustedTypesPolicy(\n trustedTypes,\n originalDocument\n );\n const emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';\n\n const {\n implementation,\n createNodeIterator,\n createDocumentFragment,\n getElementsByTagName,\n } = document;\n const { importNode } = originalDocument;\n\n let documentMode = {};\n try {\n documentMode = clone(document).documentMode ? document.documentMode : {};\n } catch (_) {}\n\n let hooks = {};\n\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n DOMPurify.isSupported =\n typeof getParentNode === 'function' &&\n implementation &&\n implementation.createHTMLDocument !== undefined &&\n documentMode !== 9;\n\n const {\n MUSTACHE_EXPR,\n ERB_EXPR,\n TMPLIT_EXPR,\n DATA_ATTR,\n ARIA_ATTR,\n IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE,\n CUSTOM_ELEMENT,\n } = EXPRESSIONS;\n\n let { IS_ALLOWED_URI } = EXPRESSIONS;\n\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n\n /* allowed element names */\n let ALLOWED_TAGS = null;\n const DEFAULT_ALLOWED_TAGS = addToSet({}, [\n ...TAGS.html,\n ...TAGS.svg,\n ...TAGS.svgFilters,\n ...TAGS.mathMl,\n ...TAGS.text,\n ]);\n\n /* Allowed attribute names */\n let ALLOWED_ATTR = null;\n const DEFAULT_ALLOWED_ATTR = addToSet({}, [\n ...ATTRS.html,\n ...ATTRS.svg,\n ...ATTRS.mathMl,\n ...ATTRS.xml,\n ]);\n\n /*\n * Configure how DOMPUrify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n let CUSTOM_ELEMENT_HANDLING = Object.seal(\n Object.create(null, {\n tagNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null,\n },\n attributeNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null,\n },\n allowCustomizedBuiltInElements: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: false,\n },\n })\n );\n\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n let FORBID_TAGS = null;\n\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n let FORBID_ATTR = null;\n\n /* Decide if ARIA attributes are okay */\n let ALLOW_ARIA_ATTR = true;\n\n /* Decide if custom data attributes are okay */\n let ALLOW_DATA_ATTR = true;\n\n /* Decide if unknown protocols are okay */\n let ALLOW_UNKNOWN_PROTOCOLS = false;\n\n /* Decide if self-closing tags in attributes are allowed.\n * Usually removed due to a mXSS issue in jQuery 3.0 */\n let ALLOW_SELF_CLOSE_IN_ATTR = true;\n\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n let SAFE_FOR_TEMPLATES = false;\n\n /* Output should be safe even for XML used within HTML and alike.\n * This means, DOMPurify removes comments when containing risky content.\n */\n let SAFE_FOR_XML = true;\n\n /* Decide if document with ... should be returned */\n let WHOLE_DOCUMENT = false;\n\n /* Track whether config is already set on this instance of DOMPurify. */\n let SET_CONFIG = false;\n\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n let FORCE_BODY = false;\n\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n let RETURN_DOM = false;\n\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n let RETURN_DOM_FRAGMENT = false;\n\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n let RETURN_TRUSTED_TYPE = false;\n\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n let SANITIZE_DOM = true;\n\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (\u00A77.3.3)\n * - DOM Tree Accessors (\u00A73.1.5)\n * - Form Element Parent-Child Relations (\u00A74.10.3)\n * - Iframe srcdoc / Nested WindowProxies (\u00A74.8.5)\n * - HTMLCollection (\u00A74.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n let SANITIZE_NAMED_PROPS = false;\n const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n\n /* Keep element content when removing element? */\n let KEEP_CONTENT = true;\n\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n let IN_PLACE = false;\n\n /* Allow usage of profiles like html, svg and mathMl */\n let USE_PROFILES = {};\n\n /* Tags to ignore content of when KEEP_CONTENT is true */\n let FORBID_CONTENTS = null;\n const DEFAULT_FORBID_CONTENTS = addToSet({}, [\n 'annotation-xml',\n 'audio',\n 'colgroup',\n 'desc',\n 'foreignobject',\n 'head',\n 'iframe',\n 'math',\n 'mi',\n 'mn',\n 'mo',\n 'ms',\n 'mtext',\n 'noembed',\n 'noframes',\n 'noscript',\n 'plaintext',\n 'script',\n 'style',\n 'svg',\n 'template',\n 'thead',\n 'title',\n 'video',\n 'xmp',\n ]);\n\n /* Tags that are safe for data: URIs */\n let DATA_URI_TAGS = null;\n const DEFAULT_DATA_URI_TAGS = addToSet({}, [\n 'audio',\n 'video',\n 'img',\n 'source',\n 'image',\n 'track',\n ]);\n\n /* Attributes safe for values like \"javascript:\" */\n let URI_SAFE_ATTRIBUTES = null;\n const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, [\n 'alt',\n 'class',\n 'for',\n 'id',\n 'label',\n 'name',\n 'pattern',\n 'placeholder',\n 'role',\n 'summary',\n 'title',\n 'value',\n 'style',\n 'xmlns',\n ]);\n\n const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n /* Document namespace */\n let NAMESPACE = HTML_NAMESPACE;\n let IS_EMPTY_INPUT = false;\n\n /* Allowed XHTML+XML namespaces */\n let ALLOWED_NAMESPACES = null;\n const DEFAULT_ALLOWED_NAMESPACES = addToSet(\n {},\n [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE],\n stringToString\n );\n\n /* Parsing of strict XHTML documents */\n let PARSER_MEDIA_TYPE;\n const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n let transformCaseFunc;\n\n /* Keep a reference to config to pass to hooks */\n let CONFIG = null;\n\n /* Specify the maximum element nesting depth to prevent mXSS */\n const MAX_NESTING_DEPTH = 255;\n\n /* Ideally, do not touch anything below this line */\n /* ______________________________________________ */\n\n const formElement = document.createElement('form');\n\n const isRegexOrFunction = function (testValue) {\n return testValue instanceof RegExp || testValue instanceof Function;\n };\n\n /**\n * _parseConfig\n *\n * @param {Object} cfg optional config literal\n */\n // eslint-disable-next-line complexity\n const _parseConfig = function (cfg) {\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n\n /* Shield configuration object from tampering */\n if (!cfg || typeof cfg !== 'object') {\n cfg = {};\n }\n\n /* Shield configuration object from prototype pollution */\n cfg = clone(cfg);\n\n PARSER_MEDIA_TYPE =\n // eslint-disable-next-line unicorn/prefer-includes\n SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1\n ? (PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE)\n : (PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE);\n\n // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n transformCaseFunc =\n PARSER_MEDIA_TYPE === 'application/xhtml+xml'\n ? stringToString\n : stringToLowerCase;\n\n /* Set configuration parameters */\n ALLOWED_TAGS =\n 'ALLOWED_TAGS' in cfg\n ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc)\n : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR =\n 'ALLOWED_ATTR' in cfg\n ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc)\n : DEFAULT_ALLOWED_ATTR;\n ALLOWED_NAMESPACES =\n 'ALLOWED_NAMESPACES' in cfg\n ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString)\n : DEFAULT_ALLOWED_NAMESPACES;\n URI_SAFE_ATTRIBUTES =\n 'ADD_URI_SAFE_ATTR' in cfg\n ? addToSet(\n clone(DEFAULT_URI_SAFE_ATTRIBUTES), // eslint-disable-line indent\n cfg.ADD_URI_SAFE_ATTR, // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS =\n 'ADD_DATA_URI_TAGS' in cfg\n ? addToSet(\n clone(DEFAULT_DATA_URI_TAGS), // eslint-disable-line indent\n cfg.ADD_DATA_URI_TAGS, // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_DATA_URI_TAGS;\n FORBID_CONTENTS =\n 'FORBID_CONTENTS' in cfg\n ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc)\n : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS =\n 'FORBID_TAGS' in cfg\n ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc)\n : {};\n FORBID_ATTR =\n 'FORBID_ATTR' in cfg\n ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc)\n : {};\n USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n IN_PLACE = cfg.IN_PLACE || false; // Default false\n IS_ALLOWED_URI = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\n if (\n cfg.CUSTOM_ELEMENT_HANDLING &&\n isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)\n ) {\n CUSTOM_ELEMENT_HANDLING.tagNameCheck =\n cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n }\n\n if (\n cfg.CUSTOM_ELEMENT_HANDLING &&\n isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)\n ) {\n CUSTOM_ELEMENT_HANDLING.attributeNameCheck =\n cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n }\n\n if (\n cfg.CUSTOM_ELEMENT_HANDLING &&\n typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements ===\n 'boolean'\n ) {\n CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements =\n cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n }\n\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n\n /* Parse profile info */\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, [...TAGS.text]);\n ALLOWED_ATTR = [];\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, TAGS.html);\n addToSet(ALLOWED_ATTR, ATTRS.html);\n }\n\n if (USE_PROFILES.svg === true) {\n addToSet(ALLOWED_TAGS, TAGS.svg);\n addToSet(ALLOWED_ATTR, ATTRS.svg);\n addToSet(ALLOWED_ATTR, ATTRS.xml);\n }\n\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, TAGS.svgFilters);\n addToSet(ALLOWED_ATTR, ATTRS.svg);\n addToSet(ALLOWED_ATTR, ATTRS.xml);\n }\n\n if (USE_PROFILES.mathMl === true) {\n addToSet(ALLOWED_TAGS, TAGS.mathMl);\n addToSet(ALLOWED_ATTR, ATTRS.mathMl);\n addToSet(ALLOWED_ATTR, ATTRS.xml);\n }\n }\n\n /* Merge configuration parameters */\n if (cfg.ADD_TAGS) {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n }\n\n if (cfg.ADD_ATTR) {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n }\n\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n }\n\n if (cfg.FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n\n addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n }\n\n /* Add #text in case KEEP_CONTENT is set to true */\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\n\n /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n }\n\n /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, ['tbody']);\n delete FORBID_TAGS.tbody;\n }\n\n // Prevent further manipulation of configuration.\n // Not available in IE8, Safari 5, etc.\n if (freeze) {\n freeze(cfg);\n }\n\n CONFIG = cfg;\n };\n\n const MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, [\n 'mi',\n 'mo',\n 'mn',\n 'ms',\n 'mtext',\n ]);\n\n const HTML_INTEGRATION_POINTS = addToSet({}, [\n 'foreignobject',\n 'annotation-xml',\n ]);\n\n // Certain elements are allowed in both SVG and HTML\n // namespace. We need to specify them explicitly\n // so that they don't get erroneously deleted from\n // HTML namespace.\n const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, [\n 'title',\n 'style',\n 'font',\n 'a',\n 'script',\n ]);\n\n /* Keep track of all possible SVG and MathML tags\n * so that we can perform the namespace checks\n * correctly. */\n const ALL_SVG_TAGS = addToSet({}, TAGS.svg);\n addToSet(ALL_SVG_TAGS, TAGS.svgFilters);\n addToSet(ALL_SVG_TAGS, TAGS.svgDisallowed);\n\n const ALL_MATHML_TAGS = addToSet({}, TAGS.mathMl);\n addToSet(ALL_MATHML_TAGS, TAGS.mathMlDisallowed);\n\n /**\n *\n *\n * @param {Element} element a DOM element whose namespace is being checked\n * @returns {boolean} Return false if the element has a\n * namespace that a spec-compliant parser would never\n * return. Return true otherwise.\n */\n const _checkValidNamespace = function (element) {\n let parent = getParentNode(element);\n\n // In JSDOM, if we're inside shadow DOM, then parentNode\n // can be null. We just simulate parent in this case.\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: NAMESPACE,\n tagName: 'template',\n };\n }\n\n const tagName = stringToLowerCase(element.tagName);\n const parentTagName = stringToLowerCase(parent.tagName);\n\n if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n return false;\n }\n\n if (element.namespaceURI === SVG_NAMESPACE) {\n // The only way to switch from HTML namespace to SVG\n // is via . If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'svg';\n }\n\n // The only way to switch from MathML to SVG is via`\n // svg if parent is either or MathML\n // text integration points.\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return (\n tagName === 'svg' &&\n (parentTagName === 'annotation-xml' ||\n MATHML_TEXT_INTEGRATION_POINTS[parentTagName])\n );\n }\n\n // We only allow elements that are defined in SVG\n // spec. All others are disallowed in SVG namespace.\n return Boolean(ALL_SVG_TAGS[tagName]);\n }\n\n if (element.namespaceURI === MATHML_NAMESPACE) {\n // The only way to switch from HTML namespace to MathML\n // is via . If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'math';\n }\n\n // The only way to switch from SVG to MathML is via\n // and HTML integration points\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n }\n\n // We only allow elements that are defined in MathML\n // spec. All others are disallowed in MathML namespace.\n return Boolean(ALL_MATHML_TAGS[tagName]);\n }\n\n if (element.namespaceURI === HTML_NAMESPACE) {\n // The only way to switch from SVG to HTML is via\n // HTML integration points, and from MathML to HTML\n // is via MathML text integration points\n if (\n parent.namespaceURI === SVG_NAMESPACE &&\n !HTML_INTEGRATION_POINTS[parentTagName]\n ) {\n return false;\n }\n\n if (\n parent.namespaceURI === MATHML_NAMESPACE &&\n !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]\n ) {\n return false;\n }\n\n // We disallow tags that are specific for MathML\n // or SVG and should never appear in HTML namespace\n return (\n !ALL_MATHML_TAGS[tagName] &&\n (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName])\n );\n }\n\n // For XHTML and XML documents that support custom namespaces\n if (\n PARSER_MEDIA_TYPE === 'application/xhtml+xml' &&\n ALLOWED_NAMESPACES[element.namespaceURI]\n ) {\n return true;\n }\n\n // The code should never reach this place (this means\n // that the element somehow got namespace that is not\n // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n // Return false just in case.\n return false;\n };\n\n /**\n * _forceRemove\n *\n * @param {Node} node a DOM node\n */\n const _forceRemove = function (node) {\n arrayPush(DOMPurify.removed, { element: node });\n try {\n // eslint-disable-next-line unicorn/prefer-dom-node-remove\n node.parentNode.removeChild(node);\n } catch (_) {\n try {\n node.outerHTML = emptyHTML;\n } catch (_) {\n node.remove();\n }\n }\n };\n\n /**\n * _removeAttribute\n *\n * @param {String} name an Attribute name\n * @param {Node} node a DOM node\n */\n const _removeAttribute = function (name, node) {\n try {\n arrayPush(DOMPurify.removed, {\n attribute: node.getAttributeNode(name),\n from: node,\n });\n } catch (_) {\n arrayPush(DOMPurify.removed, {\n attribute: null,\n from: node,\n });\n }\n\n node.removeAttribute(name);\n\n // We void attribute values for unremovable \"is\"\" attributes\n if (name === 'is' && !ALLOWED_ATTR[name]) {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(node);\n } catch (_) {}\n } else {\n try {\n node.setAttribute(name, '');\n } catch (_) {}\n }\n }\n };\n\n /**\n * _initDocument\n *\n * @param {String} dirty a string of dirty markup\n * @return {Document} a DOM, filled with the dirty markup\n */\n const _initDocument = function (dirty) {\n /* Create a HTML document */\n let doc;\n let leadingWhitespace;\n\n if (FORCE_BODY) {\n dirty = '' + dirty;\n } else {\n /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches && matches[0];\n }\n\n if (\n PARSER_MEDIA_TYPE === 'application/xhtml+xml' &&\n NAMESPACE === HTML_NAMESPACE\n ) {\n // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n dirty =\n '' +\n dirty +\n '';\n }\n\n const dirtyPayload = trustedTypesPolicy\n ? trustedTypesPolicy.createHTML(dirty)\n : dirty;\n /*\n * Use the DOMParser API by default, fallback later if needs be\n * DOMParser not work for svg when has multiple root element.\n */\n if (NAMESPACE === HTML_NAMESPACE) {\n try {\n doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n } catch (_) {}\n }\n\n /* Use createHTMLDocument in case DOMParser is not available */\n if (!doc || !doc.documentElement) {\n doc = implementation.createDocument(NAMESPACE, 'template', null);\n try {\n doc.documentElement.innerHTML = IS_EMPTY_INPUT\n ? emptyHTML\n : dirtyPayload;\n } catch (_) {\n // Syntax error if dirtyPayload is invalid xml\n }\n }\n\n const body = doc.body || doc.documentElement;\n\n if (dirty && leadingWhitespace) {\n body.insertBefore(\n document.createTextNode(leadingWhitespace),\n body.childNodes[0] || null\n );\n }\n\n /* Work on whole document or just its body */\n if (NAMESPACE === HTML_NAMESPACE) {\n return getElementsByTagName.call(\n doc,\n WHOLE_DOCUMENT ? 'html' : 'body'\n )[0];\n }\n\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n\n /**\n * _createIterator\n *\n * @param {Document} root document/fragment to create iterator for\n * @return {Iterator} iterator instance\n */\n const _createIterator = function (root) {\n return createNodeIterator.call(\n root.ownerDocument || root,\n root,\n // eslint-disable-next-line no-bitwise\n NodeFilter.SHOW_ELEMENT |\n NodeFilter.SHOW_COMMENT |\n NodeFilter.SHOW_TEXT |\n NodeFilter.SHOW_PROCESSING_INSTRUCTION |\n NodeFilter.SHOW_CDATA_SECTION,\n null,\n false\n );\n };\n\n /**\n * _isClobbered\n *\n * @param {Node} elm element to check for clobbering attacks\n * @return {Boolean} true if clobbered, false if safe\n */\n const _isClobbered = function (elm) {\n return (\n elm instanceof HTMLFormElement &&\n ((typeof elm.__depth !== 'undefined' &&\n typeof elm.__depth !== 'number') ||\n (typeof elm.__removalCount !== 'undefined' &&\n typeof elm.__removalCount !== 'number') ||\n typeof elm.nodeName !== 'string' ||\n typeof elm.textContent !== 'string' ||\n typeof elm.removeChild !== 'function' ||\n !(elm.attributes instanceof NamedNodeMap) ||\n typeof elm.removeAttribute !== 'function' ||\n typeof elm.setAttribute !== 'function' ||\n typeof elm.namespaceURI !== 'string' ||\n typeof elm.insertBefore !== 'function' ||\n typeof elm.hasChildNodes !== 'function')\n );\n };\n\n /**\n * _isNode\n *\n * @param {Node} obj object to check whether it's a DOM node\n * @return {Boolean} true is object is a DOM node\n */\n const _isNode = function (object) {\n return typeof Node === 'object'\n ? object instanceof Node\n : object &&\n typeof object === 'object' &&\n typeof object.nodeType === 'number' &&\n typeof object.nodeName === 'string';\n };\n\n /**\n * _executeHook\n * Execute user configurable hooks\n *\n * @param {String} entryPoint Name of the hook's entry point\n * @param {Node} currentNode node to work on with the hook\n * @param {Object} data additional hook parameters\n */\n const _executeHook = function (entryPoint, currentNode, data) {\n if (!hooks[entryPoint]) {\n return;\n }\n\n arrayForEach(hooks[entryPoint], (hook) => {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n };\n\n /**\n * _sanitizeElements\n *\n * @protect nodeName\n * @protect textContent\n * @protect removeChild\n *\n * @param {Node} currentNode to check for permission to exist\n * @return {Boolean} true if node was killed, false if left alive\n */\n const _sanitizeElements = function (currentNode) {\n let content;\n\n /* Execute a hook if present */\n _executeHook('beforeSanitizeElements', currentNode, null);\n\n /* Check if element is clobbered or can clobber */\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Check if tagname contains Unicode */\n if (regExpTest(/[\\u0080-\\uFFFF]/, currentNode.nodeName)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Now let's check the element's type and name */\n const tagName = transformCaseFunc(currentNode.nodeName);\n\n /* Execute a hook if present */\n _executeHook('uponSanitizeElement', currentNode, {\n tagName,\n allowedTags: ALLOWED_TAGS,\n });\n\n /* Detect mXSS attempts abusing namespace confusion */\n if (\n currentNode.hasChildNodes() &&\n !_isNode(currentNode.firstElementChild) &&\n (!_isNode(currentNode.content) ||\n !_isNode(currentNode.content.firstElementChild)) &&\n regExpTest(/<[/\\w]/g, currentNode.innerHTML) &&\n regExpTest(/<[/\\w]/g, currentNode.textContent)\n ) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Mitigate a problem with templates inside select */\n if (\n tagName === 'select' &&\n regExpTest(/