diff --git a/content/adventures/da.yaml b/content/adventures/da.yaml index 273226e1075..f700f5f9dbd 100644 --- a/content/adventures/da.yaml +++ b/content/adventures/da.yaml @@ -162,7 +162,17 @@ adventures: ``` 9: story_text: | - In this level you can use nesting to put `{if}`, `{repeat}` or `{for}` commands inside other `{if}`, `{repeat}` or `{for}` commands. This gives you many options and really helps you to make your story interactive. + In this level you can use `{if}` and `{repeat}` commands inside other `{if}` and `{repeat}` commands. + This gives you many options and really helps you to make your story interactive. + + ### Exercise 1 + Finish the code so the `{if}` works correctly. + + ### Exercise 2 + Add an `{if}` and `{else}` for the part of the story where Robin goes home too. + + ### Exercise 3 + Go back to your level 8 story and use at least two `{if}`s inside another `{if}`. example_code: | ``` {print} 'Robin is walking downtown' @@ -180,7 +190,11 @@ adventures: ``` 10: story_text: | - In this level you can use the {for} command in your story. In this way you could easily program the children's book 'brown bear, brown bear, what do you see'. + In this level you can use the {for} command in your story. In this way you could easily program the children's book 'Brown bear, Brown bear, what do you see'. + + ### Exercise + + Look at the story if you do not know it, and make sure it is printed as in the book. example_code: | ``` animals = red bird, black sheep, green frog, yellow duck, little child @@ -195,7 +209,7 @@ adventures: {print} 'I see all the animals looking at me!' ``` 12: - story_text: In this level you can use the quotation marks to save multiple words in a variable. + story_text: "In this level quotation marks will be needed to save multiple words in a variable.\n\n### Exercise\n\nFind a story from a previous level, any level is ok. Now make sure quotation marks are added in the right places." example_code: | ``` name = 'The Queen of England' @@ -203,10 +217,13 @@ adventures: ``` 13: story_text: | - By using the `{and}` and `{or}` commands, you can shorten your stories. For example, check out the dragon story. + By using the `{and}` and `{or}` commands, you can make your stories more versatile. You can ask two questions and respond to the combination of answers. - ### Exercise - Can you make your own adventure minigame like this? + ### Exercise 1 + Look at the example code and finish it. Then add at least 2 more `{if}` codes with `{and}` or `{or}`. + + ### Exercise 2 + Find a story from a previous level, and add one `{and}` or `{or}`. example_code: | ``` sword = 'lost' @@ -283,7 +300,7 @@ adventures: 3: story_text: | ## Add to - You can add items to the list with the `{add} {to_list}` command. To add an item to a list you can simply type: `{add} penguin {to} animals` or you can use the `{ask}` command like in the example code. + You can add items to the list with the `{add} {to_list}` command. To add an item to a list you can simply type: `{add} penguin {to_list} animals` or you can use the `{ask}` command like in the example code. example_code: | ``` animals {is} dog, cat, kangaroo @@ -387,8 +404,8 @@ adventures: Copy your code from the previous tab and make the variables interactive by using `{ask}` commands. example_code_2: | ``` - favorite_animal {is} {ask} What is your favorite animal? - {print} I like favorite_animal + yndlingsdyr {is} {ask} Hvad er dit yndlingsdyr? + {print} Jeg elsker yndlingsdyr ``` 18: story_text: The final change we will need to make to get Python code is changing `{ask}` into `{input}`. @@ -451,7 +468,7 @@ adventures: blackjack_2: name: Blackjack 2 default_save_name: Blackjack_2 - description: Blackjack part 2 + description: Blackjack del 2 levels: 17: story_text: | @@ -508,7 +525,7 @@ adventures: blackjack_3: name: Blackjack 3 default_save_name: Blackjack_3 - description: Blackjack part 3 + description: Blackjack del 3 levels: 17: story_text: | @@ -553,7 +570,7 @@ adventures: blackjack_4: name: Blackjack 4 default_save_name: Blackjack_4 - description: Blackjack part 4 + description: Blackjack del 4 levels: 17: story_text: | @@ -626,13 +643,13 @@ adventures: {else} _ 9: story_text: | - In a previous level you've created a calculator, in this level you can expand that code so it asks multiple questions. + In a previous level, you've created a calculator. In this level, you can expand that code so it asks multiple questions. ### Exercise 1 Can you finish line 10 to get the code to work? ### Exercise 2 - Give the player feedback when the enter an answer, like `{print} 'Correct!'` or `{print} 'Wrong! The correct answer is ' correct_answer`. + Give the player feedback when they enter an answer, like `{print} 'Correct!'` or `{print} 'Wrong! The correct answer is ' correct_answer`. example_code: | ``` score = 0 @@ -737,17 +754,11 @@ adventures: {for} i {in} {range} 1 {to} 4 grade = {ask} _ total = total + _ - return _ / 4 + {return} _ / 4 mean_grade = {call} _ {print} 'Your mean grade is ' mean_grade ``` - - total = total + _ - return _ / 4 - - mean_grade = {call} _ - {print} 'Your mean grade is ' mean_grade 15: story_text: | You can add the `{while}` loop to the calculator game you've learned to make in a previous level. @@ -775,9 +786,9 @@ adventures: {print} 'You win!' ``` calculator_2: - name: Calculator 2 - default_save_name: Calculator 2 - description: Calculator 2 + name: Lommeregner 2 + default_save_name: Lommeregner 2 + description: Lommeregner 2 levels: 14: story_text: | @@ -956,7 +967,7 @@ adventures: story_text: |- ### Exercise Debug this code. Good luck! - example_code: | + example_code: |- **Warning! This code needs to be debugged!** ``` {print} 'Welcome to Manicures and Pedicures by Hedy' @@ -1265,18 +1276,18 @@ adventures: ``` animals = ['pig', 'dog', 'cow'] sounds = ['oink', 'woof', 'moo'] - for i in range 1 to 3 + {for} i {in} {range} 1 {to} 3 animal = animals[i] sound = sounds[i] - print 'Old MacDonald had a farm' - print 'E I E I O!' - print 'and on that farm he had a ' animal - print 'E I E I O!' - print 'with a ' sound sound ' here' - print 'and a ' sound sound ' there' - print 'here a ' sound - print 'there a ' sound - print 'everywhere a ' sound sound + {print} 'Old MacDonald had a farm' + {print} 'E I E I O!' + {print} 'and on that farm he had a ' animal + {print} 'E I E I O!' + {print} 'with a ' sound sound ' here' + {print} 'and a ' sound sound ' there' + {print} 'here a ' sound + {print} 'there a ' sound + {print} 'everywhere a ' sound sound ``` default: name: Introduktion @@ -1594,7 +1605,7 @@ adventures: dishes: name: Opvask? default_save_name: Opvask - description: Brug computeren til at se hvem der tager opvasken + description: Brug computeren til at bestemme hvem der tager opvasken levels: 3: story_text: | @@ -1738,6 +1749,7 @@ adventures: story_text: |- In this level, we add a new form of the `{for}`. In earlier levels, we used `{for}` with a list, but we can also use `{for}` with numbers. We do that by adding a variable name, followed by `{in}` `{range}`. We then write the number to start at, `{to}` and the number to end at. + Try the example to see what happens! In this level again, you will need to use indentations in lines below the `{for}` statements. example_code: | ``` @@ -1773,7 +1785,7 @@ adventures: Then you probably know that they can't really predict your future, but it's still fun to play! In the upcoming levels you can learn how to create your own fortune telling machine! - In level 1 you can start off easy by letting Hedy introduce herself as a fortune teller and let her {echo} the players' answers. + In level 1 you can start off easy by letting Hedy introduce herself as a fortune teller and let her `{echo}` the players' answers. Like this: example_code: | ``` @@ -1790,7 +1802,7 @@ adventures: Take a look in level 2 to improve your fortune teller. 3: story_text: | - In the previous levels you've created your first fortune telling machine, but Hedy couldn't really predict anything, only {echo}. + In the previous levels you've created your first fortune telling machine, but Hedy couldn't really predict anything, only `{echo}`. In this level you can use a variable and the `{at} {random}` command to really let Hedy choose an answer for you. Check out this code for instance: example_code: | ``` @@ -1915,8 +1927,11 @@ adventures: {sleep} ``` 12: - story_text: | - In this level you can make your fortunes multiple words. Can you add more different fortunes to the list? + story_text: |- + From level 12 on, you will also have to use quotation marks in lists, before and after each item. + + ### Exercise + Add two predictions to the list example_code: | ``` fortunes = 'you will slip on a banana peel', _ @@ -1926,9 +1941,9 @@ adventures: {print} fortunes {at} {random} ``` functions: - name: functions - default_save_name: functions - description: functions + name: funktioner + default_save_name: funktioner + description: funktioner levels: 12: story_text: | @@ -1970,17 +1985,19 @@ adventures: An **argument** is a variable that is used within a function. It is not used outside the function. For example in this code we've programmed the first verse of the song 'My Bonnie is over the ocean'. - In this example code the argument `place` is used. Place is a variable that is only used in the function, so an argument. - To use `place` we have programmed the line `define song with place`. - When the function is called, computer will replace the argument `place`, with the piece of text after `call song with`. + In this example code the argument 'place' is used. Place is a variable that is only used in the function, so an argument. + To use 'place' we have placed `{with} place` after `{define} song`. + When the function is called, the computer will replace the argument 'place', with the piece of text after `{call} song {with}`. ### Exercise The next verse of this song goes: + ```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 + ``` Can you program this verse in the same way as the example? example_code: | @@ -2256,7 +2273,9 @@ adventures: ``` story_text_2: | ### Exercise - Can you finish the scary story? Or make up your own haunted house story? + Copy the example code to your input screen by clicking the yellow button. + Now finish the story by adding at least 5 lines of code. + Remember to start each line of codes with a `{print}` command. 2: story_text: | In this haunted house you can choose your monsters with emojis. Of course you could also use words. @@ -2305,7 +2324,12 @@ adventures: 4: story_text: | In this level you learn how to use quotation marks in your games. + + ### Exercise Can you make your Haunted House level 4 proof? + + ### Exercise 2 + Go back to the previous level and copy your haunted house code. Make the code work in this level by adding quotation marks in the right spots. example_code: | ``` {print} _ Escape from the haunted house! _ @@ -2344,7 +2368,9 @@ adventures: ### Exercise Now it's very hard to win this game, can you make it easier to win? - For example by only having 1 wrong door and 2 correct doors instead of 1 correct door and 2 wrong ones? + Change your code so it only has one wrong door and two correct doors instead of one correct door and two wrong ones? + Tip: This means changing the variable correct_door into wrong_door, and switching the `{if}` and `{else}` code. + And of course you may also change the story and make it your own. Change the monsters or make it a happy game show where you get a gift! example_code: | ``` {print} 'Escape from the Haunted House!' @@ -2601,20 +2627,20 @@ adventures: story_text_2: | ### Exercise Time to make your own variables! - In the example code we made an example of the variable `favorite_animal`. In line 1 the variable is set, and in line 2 we haved used the variable in a print command. - Firstly, finish our example by filling in your favorite animal on the blank. Then make at least 3 of these codes yourself. Pick a variable, and set the variable with the {is} command. Then use it with a {print} command, just like we did. + In the example code we made an example of the variable `favorite_animal`. In line 1 the variable is set, and in line 2 we used the variable in a `{print}` command. + Firstly, finish our example by filling in your favorite animal on the blank. Then make at least 3 of these codes yourself. Pick a variable, and set the variable with the `{is}` command. Then use it with a `{print}` command, just like we did. example_code_2: | ``` - favorite_animal {is} _ - {print} I like favorite_animal + yndlingsdyr {is} _ + {print} Jeg kan godt lide yndlingsdyr ``` 6: story_text: | We also make a change in storing a word in a variable! You may now use `=` instead of `{is}` when we store a name or a number in a variable, like this: example_code: | ``` - name = Hedy - answer = 20 + 4 + navn = Hedy + svar = 20 + 4 ``` 14: story_text: | @@ -2661,7 +2687,8 @@ adventures: Make your own program to practice your vocabulary in a new language. ### Exercise - Can you make this program for a different language? Or can you add more words to the French one? + Make the code longer by adding at least 3 more words for the player to learn. + **Extra** Of course, you can choose to use a different language than French. You can change to code to any language you'd like to learn. example_code: | ``` {print} 'Learn French!' @@ -2847,7 +2874,7 @@ adventures: _ ``` 6: - story_text: "Instead of playing notes, you can also play numbers now. Simply type `{play} 1` for the lowest note, `{play} 70` for the highest note, or anything in between.\n\n### Exercise\n This calls for musical maths! Try out the example code a couple of times with different starting numbers. \nThen, see if you can compose a song using the numbers.\n" + story_text: "Instead of playing notes, you can also play numbers now. Simply type `{play} 1` for the lowest note, `{play} 70` for the highest note, or anything in between.\n\n### Exercise\nThis calls for musical maths! Try out the example code a couple of times with different starting numbers.\nThen, see if you can compose a song using the numbers.\n" example_code: | ``` number = {ask} 'Say a starting number between 1 and 67' @@ -3133,7 +3160,9 @@ adventures: ``` story_text_2: | ### Exercise - Can you make the parrot ask a different question? Fill in the blanks in the example! + Copy the example code to your input screen by clicking on the yellow button. + Make the parrot ask a different question. Fill in the blanks in the example! + **Extra** You can also let the parrot ask multiple questions. Type in some more lines of code beneath your own code. example_code_2: | ``` {print} Im Hedy the parrot @@ -3173,7 +3202,8 @@ adventures: 4: story_text: | In this level we have to use quotation marks with the commands `{ask}` and `{print}`. - Can you complete the code by adding quotation marks? + ### Exercise + Complete the code by filling in quotation marks on the blanks. example_code: | ``` words {is} squawk, Hedy @@ -3186,6 +3216,8 @@ adventures: 5: story_text: | Reward your parrot if it says the correct word! + + ### Exercise Finish the code by filling in the 4 missing commands. example_code: | ``` @@ -3226,7 +3258,7 @@ adventures: Finish this code by filling in the blanks! example_code: | ``` - _ calculate_budget with wish, money, allowance + _ calculate_budget {with} wish, money, allowance to_save = wish - money weeks = to_save / allowance {if} wish _ money @@ -3240,7 +3272,7 @@ adventures: wish = {ask} 'How much money do you need?' allowance = {ask} 'How much pocket money do you get each week?' - {call} calculate_budget with _, _, _ + {call} _ ``` pressit: name: Key presses @@ -3303,7 +3335,7 @@ adventures: ``` print_command: name: '{print}' - default_save_name: print + default_save_name: skriv description: Introduction print command levels: 1: @@ -3473,7 +3505,8 @@ adventures: 16: story_text: |- We are going to make lists the Python way, with square brackets around the lists! We also keep the quotation marks around each item like we have learned in previous levels. - We use square brackets to point out a place in a list. For example: `friends[1]` is the first name on the list of friends, as you can see in the first part of the example code. The second part of the example code shows you that we can also match 2 lists using the variable i. + We use square brackets to point out a place in a list. For example: `friends[1]` is the first name on the list of friends, as you can see in the first part of the example code. + The second part of the example code shows you that we can also match 2 lists using the variable i. example_code: | ``` friends = ['Ahmed', 'Ben', 'Cayden'] @@ -3588,18 +3621,22 @@ adventures: In level 1 you can make your own virtual restaurant and take your guests' orders. story_text_2: | ### Exercise - Can you think of more lines to add to your restaurant code? For example, can you {ask} the guests what they'd like to drink, tell them the price, or wish them a pleasant meal? + Copy the example code into your input screen by clicking the yellow button. + Firstly, fill in the correct command on the blanks to make to code work properly. + Then add at least 4 more lines of code to the restaurant program. + Ask the costumer what they would like to drink and ask if they want to pay with cash or card. + Lastly, think of a nice way to say goodbye to your costumer. example_code_2: | ``` {print} Welcome to Hedy's restaurant 🍟 - {ask} What would you like to order? + _ What would you like to order? {echo} So you would like to order - {print} Thanks you for your order! + {print} Thank you for your order! {print} It's on its way! ``` 2: story_text: | - In level 2 you could expand your restaurant by using variables. In level 1 Hedy could only {echo} the order once and only remember the last thing that was ordered. + In level 2 you could expand your restaurant by using variables. In level 1 Hedy could only `{echo}` the order once and only remember the last thing that was ordered. Now you can use variables and Hedy can remember both the food and the toppings! example_code: | ``` @@ -3612,14 +3649,20 @@ adventures: ``` story_text_2: | ### Exercise - Can you make this code more elaborate? For example by adding drinks to the order? Or...? + Copy your own restaurant code from to previous level to the input screen below. + Fix the code by replacing the `{ask}` and `{echo}` commands and using variables, like you've learned in this level. + + Now that your code is working again, it's time to add something more. + Look at the last line of the example code: `{print} food with topping is on its way!` + In this single line 2 variables have been used to create a summary of the order. + Now add your own summary of the food and drinks ordered by the customer. + + **Extra** Now that you've learned how to use variables, you can use as many variables in one line as you'd like. Can you add more variables to your code, like eat in or take-away, cash or card, with or without a straw etc.? 3: story_text: | Having trouble to decide what you wanna have for dinner? You can let Hedy choose for you! Simply add lists of your favorite (or least favorite) meals and Hedy can randomly choose your dinner. You can also have a bit of fun, by letting Hedy choose the price for your dinner as well! What will you get? - ### Exercise - Can you make your own version of the random restaurant? example_code: | ``` {print} Welcome to Hedy's Random Restaurant! @@ -3637,7 +3680,10 @@ adventures: {print} Thank you and enjoy your meal! ``` story_text_2: | - Does your costumer have any allergies or do they dislike certain dishes? Then you can use the `{remove}`command to remove it from your menu. + ### Exercise + Now make your own version of the random restaurant. + Make a list of starts, mains, desserts, drinks and prices yourself. + Then use `{print}` and `{at} {random}` commands to tell the costumer what will be on their menu tonight. example_code_2: | ``` {print} Mystery milkshake @@ -3653,7 +3699,7 @@ adventures: example_code: | ``` _ Add the quotation marks to this code _ - {print} Welcome to Hedys restaurant! + {print} Welcome to Restaurant Chez Hedy! {print} Today we are serving pizza or lasagna. food {is} {ask} What would you like to eat? {print} Great choice! The food is my favorite! @@ -3766,7 +3812,10 @@ adventures: ``` 10: story_text: | - In this level you'll learn how to easily {ask} your guests' orders in a short code. + In this level you'll learn how to easily ask orders for different courses. + + ### Exercise 1 + Finish the code with an `{ask}` on the blanks such that the customer is asked what they want to eat for each course. example_code: | ``` courses = appetizer, main course, dessert @@ -3778,7 +3827,7 @@ adventures: ### Exercise Of course, you could also order for multiple people! Can you add the correct amount of indentation before each line to make the code work properly? - TIP: some lines don't need any indentation at all. + Tip: some lines don't need any indentation at all. example_code_2: | ``` _ courses = appetizer, main course, dessert @@ -3833,8 +3882,15 @@ adventures: ``` 13: story_text: | - In this level we can use the new commands to upgrade our restaurant. - We use `{and}` to see {if} two things are both the case. + In this level you will learn new commands to extend your code even further. + + ### Exercise 1 + Place a `{and}` and a `{or}` in the logical place in the program. + + ### Exercise 2 + Expand your restaurant with at least one more `{and}` and one `{or}`. + For example, create a special discount coupon that only applies to pizza, or give your customer a free drink + with fries and pancakes. Or something completely different of course! example_code: | ``` price = 10 @@ -3890,6 +3946,9 @@ adventures: 2: story_text: | In this level you can practise using the variables, so that you can make the rock, paper, scissors game in the next level! + ### Exercise + Finish the code by filling in the **variable** on the blank. + This game is not very interactive, but no worries! In the next tab you'll learn how to use variables with the `{ask}` command to make your game interactive! example_code: | ``` _ {is} {ask} rock, paper, or scissors? @@ -3951,9 +4010,9 @@ adventures: example_code: | ``` choices = rock, paper, scissors - your_choice = {ask} 'What do you choose?' + your_choice {is} {ask} 'What do you choose?' {print} 'You choose ' your_choice - computer_choice = choices {at} {random} + computer_choice {is} choices {at} {random} {print} 'The computer chooses ' computer_choice {if} computer_choice {is} your_choice {print} 'Tie' @@ -3977,7 +4036,10 @@ adventures: ``` 13: story_text: | - With the `{and}` command you can shorten your rock, paper, scissors code! Check out the example code below and try to finish it. + With the `{and}` command you can shorten your rock, paper, scissors code! Check out the example code. + + ### Exercise + Finish the code such that a winner is always decided on. Run your code a few times to verify there is always a winner printed. example_code: | ``` options = 'rock', 'paper', 'scissors' @@ -4041,8 +4103,11 @@ adventures: In this adventure you can create your own super spy code. Encode a message that only the right agent can decipher. If the enemy tries to crack the code, they will get some false info to waste their time. - ### Exercise - Make your own secret code for your superspy. Can you make it consist of even more variables? + ### Exercise 1 + Make your own secret code for your superspy and return both parts only to the real spy. + + ### Exercise 2 + Add a third component to the code, like a piece of clothing or an object. example_code: | ``` name = {ask} 'What is your name?' @@ -4271,8 +4336,11 @@ adventures: ``` 8: story_text: | - In a previous level you've programmed the song 'Bottles of beer'. You made one verse and then had to copy the verses 99 times. In this level you can repeat the song 99 times, just by adding one simple line! - Do you know which line of code to add on the blanks? + In a previous level you've programmed the song 'Bottles of beer'. But without the `{repeat}` command, you had to copy the verses many times. + In this level you can repeat the song 99 times, just by adding one simple line! + + ### Exercise + Add the right command on the blanks and indent the code correctly. example_code: | ``` verse = 99 @@ -4285,54 +4353,15 @@ adventures: ``` 10: story_text: | - In this level you can easily make the childrens' song 'Five little monkeys'. Can you make the last chorus? - You can also make the whole baby shark song (including all the other sharks in the family) in only 6 lines, using `{for}`! - Or you can make Old MacDonald with all the different animals. - + With `{for}` you can print make the whole baby shark song (including all the other sharks in the family) in only 6 lines! - - ### Exercises - Can you add the last verse of the monkeys on the bed, when there is only one monkey left? - - Can you make the baby shark code even shorter by using a `{repeat}` command? - - Can you add new animals to Old MacDonald's farm? + ### Exercise 1 + Can you make the baby shark code even shorter by using a `{for}` command? Finish the example code. example_code: | ``` - monkeys = 5, 4, 3, 2 - {for} monkey {in} monkeys - {print} monkey ' little monkeys jumping on the bed' - {print} 'One fell off and bumped his head' - {print} 'Mama called the doctor and the doctor said' - {print} 'NO MORE MONKEYS JUMPING ON THE BED!' - ``` - - ``` - sharks = baby, mommy, daddy, grandma, grandpa - {for} shark {in} sharks - {print} shark ' shark tututututudu' - {print} shark ' shark tututututudu' - {print} shark ' shark tututututudu' - {print} shark ' shark' - ``` - ``` - animals = pig, dog, cow - {for} animal {in} animals - {if} animal {is} pig - sound = oink - {if} animal {is} dog - sound = woof - {if} animal {is} cow - sound = moo - {print} 'Old MacDonald had a farm' - {print} 'E I E I O!' - {print} 'and on that farm he had a ' animal - {print} 'E I E I O!' - {print} 'with a ' sound sound ' here' - {print} 'and a ' sound sound ' there' - {print} 'here a ' sound - {print} 'there a ' sound - {print} 'everywhere a ' sound sound + family = baby, mammy, daddy, grandma, grandpa + _ _ _ _ + {print} _ ``` story_text_2: | ### Exercise 2 @@ -4345,20 +4374,18 @@ adventures: ``` 11: story_text: | - In this level you can use the `{for} i {in} {range}` command to make songs that use counting, like the 5 little monkeys. + In this level you can use the `{for}` with `{range}` to make songs that use counting, like the 5 little monkeys. - ### Exercise - Fill in the blanks and make the code work! + ### Exercise 1 + Fill in the blanks and make the code work! If you don't remember the song text, look it up yourself. + + ### Exercise 2 + The final line of the song is different from the others. Print this line inside the `{for}`, and use an `{if}` to make it work correctly. example_code: | ``` - _ _ _ _ 5 _ 1 - {print} i ' little monkeys jumping on the bed' - {print} 'One fell off and bumped his head' - {print} 'Mama called the doctor and the doctor said' - {if} i {is} 1 - {print} 'PUT THOSE MONKEYS RIGHT TO BED!' - {else} - {print} 'NO MORE MONKEYS JUMPING ON THE BED!' + _ monkeys _ _ 5 _ 1 + {print} monkeys ' little monkeys jumping on the bed' + _ ``` 12: story_text: | @@ -4400,7 +4427,6 @@ adventures: The Drunken Sailor is also quickly made in this level. You only need 8 lines for the entire song, check it out! ### Exercise - Complete the Old MacDonald song by setting the variable `animal` to `animals[i]` and `sound` to `sounds[i]`. example_code: "```\nalle_dyr = ['gris', 'hund', 'ko']\nlyde = ['øh', 'vuf', 'muh']\n{for} i {in} {range} 1 {to} 3\n dyr = alle_dyr[i]\n lyd = lyde[i]\n {print} 'Jens Hansen havde en bondegård'\n {print} 'ih ah ih ah oh!'\n {print} 'og på den gård der var en ' dyr\n {print} 'ih ah ih ah oh!'\n {print} 'Der var ' lyd lyd' her'\n {print} 'og ' lyd lyd' der'\n {print} lyde ' her'\n {print} lyde ' der'\n {print} 'alle steder ' lyde lyde\n```\n\n```\nlinjer = ['Hvad skal vi gøre med den fulde sømand', 'Smid ham i brummen til han vågner', 'Han skal klynges op i masten']\n{for} linje {in} linjer\n {for} i {in} {range} 1 {to} 3\n {print} linje \n {print} 'Tidligt om morgnen.'\n {for} i {in} {range} 1 {to} 3\n {print} 'Hu hej, se hun sejler'\n {print} 'Tidligt om morgnen.'\n```\n" 18: @@ -4473,7 +4499,7 @@ adventures: movement = [ 'round and round', 'open and shut', _] ``` tic: - name: Tic-Tac-Toe + name: Kryds og Bolle default_save_name: Tic description: Play a game of Tic Tac Toe! levels: @@ -4544,8 +4570,8 @@ adventures: {return} _ ``` tic_2: - name: Tic-Tac-Toe 2 - default_save_name: Tic + name: Kryds og Bolle 2 + default_save_name: KrydsBolle description: Play a game of Tic Tac Toe! levels: 16: @@ -4586,8 +4612,8 @@ adventures: sign = _ ``` tic_3: - name: Tic-Tac-Toe 3 - default_save_name: Tic + name: Kryds og Bolle 3 + default_save_name: KrydsBolle description: Play a game of Tic Tac Toe! levels: 16: @@ -4808,7 +4834,7 @@ adventures: ### Exercise 1 Add a 90 degree turn in the loop, so that a spiral is drawn. Add at least 5 numbers to the list, so the spiral grows larger. - **(extra)** can you change the spiral into another shape? Experiment with numbers for the turn! + **(extra)** can you change the spiral into another shape? Experiment with numbers for the turn! ### Exercise 2 The spiral is drawn outwards, make it go inwards? example_code: | @@ -4972,13 +4998,13 @@ adventures: ``` colors = red, blue, orange, yellow, pink, purple, green, brown, black distance = 120 - repeat 5 times + {repeat} 5 {times} _ ``` Hint for the flags: ``` - country = ask 'which country would you like to see the flag of?' - if country is 'the Netherlands' + country = {ask} 'which country would you like to see the flag of?' + {if} country {is} 'the Netherlands' color_1 = red color_2 = white color_3 = blue @@ -5201,7 +5227,7 @@ adventures: levels: 11: story_text: | - In this level you can use the `{for} i {in} {range}` command to countdown to the New Year. + In this level you can use the `{for}` number `{in}` `{range}` command to countdown to the New Year. ### Exercise Fill in the blanks and make the code work! diff --git a/content/adventures/de.yaml b/content/adventures/de.yaml index c671384c2d9..ce896fdb277 100644 --- a/content/adventures/de.yaml +++ b/content/adventures/de.yaml @@ -1403,8 +1403,8 @@ adventures: ``` 11: story_text: | - You have reached level 11, you're doing great! In the higher levels, Hedy is focussing more and more on teaching you the programming language Python. - In Python there is no `{repeat}` command, but there is a command that works like {repeat}. Are you curious to find out how to say `{repeat}` in Python language? Quickly go on to find out! + Du hast Level 11 erreicht, du machst das großartig! In den höheren Level konzentiert sich Hedy mehr und mehr darauf, dir die Programmiersprache Python beizubringen. + In Python gibt es keinen `{repeat}` Befehl, aber es gibt einen Befehl, der wie {repeat} funktioniert. Bist du neugierig darauf, herauszufinden, wie du `{repeat}` in der Python sagen kannst? Gehe rasch weiter, und finde es heraus! 12: story_text: |- **Dezimalzahlen** @@ -2728,8 +2728,8 @@ adventures: ``` maths: name: Mathe - default_save_name: maths - description: Introducing maths + default_save_name: Mathe + description: Mathe einführen levels: 6: story_text: | @@ -2741,26 +2741,26 @@ adventures: Darum multiplizieren wir mit dem Sternchen über der 8: `5 * 5`. Lies das als "5 mal 5", so kannst du es dir am Besten merken. example_code: | ``` - {print} '5 plus 5 is ' 5 + 5 - {print} '5 minus 5 is ' 5 - 5 - {print} '5 times 5 is ' 5 * 5 + {print} '5 plus 5 ist ' 5 + 5 + {print} '5 minus 5 ist ' 5 - 5 + {print} '5 mal 5 ist ' 5 * 5 ``` 12: story_text: |- - **Decimal numbers** - So far, Hedy did not allow for decimal numbers like 1.5, but now we do allow that. Note that computers use the `.` for decimal numbers. + **Dezimalzahlen** + Bis jetzt hat Hedy Dezimalzahlen wie 1.5 nicht erlaubt, aber jetzt erlauben wir sie. Beachte, dass Computer `.` als Komma verwenden. example_code: | ``` - {print} 'Two and a half plus two and a half is...' + {print} 'Zweieinhalb plus Zweieinhalb ist...' {print} 2.5 + 2.5 ``` story_text_2: |- - **Maths with words** - In this level you can also do addition with words like this: + **Mathe mit Worten** + In diesem Level kannst du so Mathe mit Worten machen: example_code_2: | ``` - a = 'Hello ' - b = 'world!' + a = 'Hallo ' + b = 'welt!' {print} a + b ``` @@ -3720,7 +3720,16 @@ adventures: ``` 6: story_text: | - In diesem Level kannst du Mathe verwenden um den Gesamtpreis einer Bestellung auszurechnen. Da macht dein virtuelles Restaurant realistischer. + In diesem Level kannst du Mathe verwenden um den Gesamtpreis einer Bestellung auszurechnen. Das macht dein virtuelles Restaurant realistischer. + Aber du kannst deinem virtuellen Restaurant noch viele weitere Dinge hinzufügen, zum Beispiel mehr Gerichte. + + ### Übung + Du kann viele weitere Dinge zu deinem virtuellen Restaurant ergänzen. Zum Beispiel kannst du... + - frage, wie viele Personen kommen und den Preis mit der Anzahl multiplizieren? + - ein weiteres Gericht hinzufügen? + - Gästen einen Rabatt geben, wenn sie einen (geheimen) Couponcode eingeben? + - ein Kinderessen hinzufügen? + - dir noch weitere lustige Dinge ausdenken und ergänzen? example_code: | Du kannst einen einfachen Restaurant Code erstellen. Das geht so: ``` diff --git a/content/cheatsheets/ca.yaml b/content/cheatsheets/ca.yaml index 2ae00f76620..ba8448c5f11 100644 --- a/content/cheatsheets/ca.yaml +++ b/content/cheatsheets/ca.yaml @@ -74,37 +74,37 @@ name {is} Hedy {print} 'my name is ' name - name: '{ask}' - explanation: Ask something with `{ask}`. + explanation: Demana alguna cosa amb `{ask}`. demo_code: |- - color {is} {ask} 'What is your favorite color?' - {print} color ' is your favorite!' + color {is} {ask} 'Quin és el teu color preferit?' + {print} color ' és el teu preferit!' 5: - name: '{print}' - explanation: Print exactly using quotation marks. + explanation: Imprimeix un text literal usant cometes. demo_code: '{print} ''Hola benvingut a Hedy.''' - name: '{ask}' - explanation: Ask something with `{ask}`. + explanation: Demana alguna cosa amb `{ask}`. demo_code: |- - color {is} {ask} 'What is your favorite color?' - {print} color ' is your favorite!' + color {is} {ask} 'Quin és el teu color preferit?' + {print} color ' és el teu preferit!' - name: '{if}' - explanation: Make a choice with `{if}`. + explanation: Fes una elecció amb `{if}`. demo_code: |- - color {is} {ask} 'What is your favorite color?' - {if} color {is} green {print} 'pretty!' {else} {print} 'meh' -- name: '{if} with turtle' - explanation: Make a choice with `{if}`. + color {is} {ask} 'Quin és el teu color preferit?' + {if} color {is} verd {print} 'que bonic!' {else} {print} 'no és tan bonic' +- name: '{if} amb tortuga' + explanation: Fes una elecció amb `{if}`. demo_code: |- - answer {is} {ask} 'How far should I walk?' - {if} answer {is} far {forward} 100 {else} {forward} 5 + resposta {is} {ask} 'Com de lluny he de caminar?' + {if} resposta {is} lluny {forward} 100 {else} {forward} 5 - name: '{in}' - explanation: Check elements with `{in}`. + explanation: Comprova elements amb `{in}`. demo_code: |- - pretty_colors {is} green, yellow - color {is} {ask} 'What {is} your favorite color?' - {if} color {in} pretty_colors {print} 'pretty!' {else} {print} 'meh' + colors_bonics {is} verd, groc + color {is} {ask} 'Quin és el teu color preferit?' + {if} color {in} colors_bonics {print} 'bonic!' {else} {print} 'meh' - name: '{pressed}' - explanation: Check whether a given key on the keyboard is `{pressed}`. + explanation: Comprova si una tecla determinada del teclat està `{pressed}`. demo_code: '{if} a {is} {pressed} {print} ''You pressed A!'' {else} {print} ''You pressed another key!''' 6: - name: '{print}' diff --git a/content/cheatsheets/da.yaml b/content/cheatsheets/da.yaml index 9f4f9bddccc..061511f203c 100644 --- a/content/cheatsheets/da.yaml +++ b/content/cheatsheets/da.yaml @@ -1,7 +1,7 @@ 1: - name: '{print}' explanation: Print tekst med `{print}`. - demo_code: '{print} Hej, velkommen til Hedy!' + demo_code: '{print} Hej og velkommen til Hedy!' - name: '{ask}' explanation: Stil spørgsmål med `{ask}`. demo_code: '{ask} Hvad er din yndlingsfarve?' @@ -9,9 +9,9 @@ explanation: Gentag ting med `{echo}`. demo_code: |- {ask} Hvad er din yndlingsfarve? - {echo} Så din yndlingsfarve er -- name: '{print} emojis' - explanation: Print an emoji with `{print}`. + {echo} så din yndlingsfarve er +- name: '{print} emojier' + explanation: Udskriv en emoji med `{print}`. demo_code: '{print} 🙋 🌍 ❗' - name: '{forward}' explanation: Tegn en linje med `{forward}`. @@ -25,215 +25,215 @@ {turn} {right} 2: - name: '{is}' - explanation: Give a word a name to use in the program using `{is}`. You can choose the name yourself. + explanation: For at kunne bruge et ord i programmet kan du navngive det med `{is}`. Du kan vælge navnet selv. demo_code: |- - name {is} Hedy - {print} welcome name + navn {is} Hedy + {print} velkommen navn - name: '{ask}' - explanation: Ask something with `{ask}`. Beware! You need to give the answer a name with `{is}`. + explanation: Spørg om noget med `{ask}`. Vær opmærksom på at du skal navngive svaret med `{is}`. demo_code: |- - color {is} {ask} What is your favorite color? - {print} color is your favorite! + farve {is} {ask} Hvad er din yndlingsfarve? + {print} farve er din favorit! - name: '{sleep}' - explanation: '`{sleep}` let Hedy pause for a (couple of) second(s).' + explanation: 'Med `{sleep}` kan du lade Hedy pause i et (par) sekund(er).' demo_code: |- - {print} Let me think for one second... + {print} Lad mig tænke i et sekund {sleep} - {print} Hmm.. I need 3 more seconds... + {print} Hmm.. Jeg har brug for 3 sekunder til... {sleep} 3 - {print} Eureka! Ive got it! -- name: '{is} with turtle' - explanation: Give a number a name using `{is}`. You can choose the name yourself. + {print} Aha! Nu har jeg det! +- name: '{is} med skildpadde' + explanation: Navngiv et tal med `{is}`. Du kan vælge navnet selv. demo_code: |- - angle {is} 90 - {turn} angle + vinkel {is} 90 + {turn} vinkel {forward} 100 3: -- name: Choose random - explanation: Choose a random word from a group with `{at}` and `{random}`. +- name: Vælg tilfældigt + explanation: Vælg et tilfældigt ord fra en gruppe med `{at}` og `{random}`. demo_code: |- - animals {is} dog, cat, kangaroo - {print} animals {at} {random} + dyr {is} hund, kat, kænguru + {print} dyr {at} {random} - name: '{add}' - explanation: '`{add}` an item `{to_list}` a list.' + explanation: '`{add}` et element `{to_list}` en liste.' demo_code: |- - animals {is} cow, cat - {add} dog {to_list} animals + dyr {is} ko, kat + {add} hund {to_list} dyr - name: '{remove}' - explanation: '`{remove}` an item `{from}` a list.' + explanation: '`{remove}` et element `{from}` en liste.' demo_code: |- - animals {is} cat, dog, cow - {remove} dog {from} animals + dyr {is} kat, hund, ko + {remove} hund {from} dyr 4: - name: '{print}' - explanation: Print exactly using quotation marks. - demo_code: '{print} ''Hello welcome to Hedy.''' + explanation: Udskriv nøjagtigt ved hjælp af citationstegn. + demo_code: '{print} ''Hej og velkommen til Hedy.''' - name: '{is}' - explanation: Give a name to some text and `{print}` without quotation marks. + explanation: Navngiv et stykke tekst og `{print}` den uden citationstegn. demo_code: |- - name {is} Hedy - {print} 'my name is ' name + navn {is} Hedy + {print} 'mit navn er ' navn - name: '{ask}' - explanation: Ask something with `{ask}`. + explanation: Stil spørgsmål med `{ask}`. demo_code: |- - color {is} {ask} 'What is your favorite color?' - {print} color ' is your favorite!' + farve {is} {ask} 'Hvad er din yndlingsfarve?' + {print} farve ' er din favorit!' 5: - name: '{print}' - explanation: Print exactly using quotation marks. - demo_code: '{print} ''Hello welcome to Hedy.''' + explanation: Udskriv nøjagtigt ved hjælp af citationstegn. + demo_code: '{print} ''Hej og velkommen til Hedy.''' - name: '{ask}' - explanation: Ask something with `{ask}`. + explanation: Stil spørgsmål med `{ask}`. demo_code: |- - color {is} {ask} 'What is your favorite color?' - {print} color ' is your favorite!' + farve {is} {ask} 'Hvad er din yndlingsfarve?' + {print} farve ' er din favorit!' - name: '{if}' - explanation: Make a choice with `{if}`. + explanation: Træf et valg med `{if}`. demo_code: |- - color {is} {ask} 'What is your favorite color?' - {if} color {is} green {print} 'pretty!' {else} {print} 'meh' -- name: '{if} with turtle' - explanation: Make a choice with `{if}`. + farve {is} {ask} 'Hvad er din yndlingsfarve?' + {if} farve {is} grøn {print} 'pænt!' {else} {print} 'tja' +- name: '{if} med skildpadde' + explanation: Træf et valg med `{if}`. demo_code: |- - answer {is} {ask} 'How far should I walk?' - {if} answer {is} far {forward} 100 {else} {forward} 5 + svar {is} {ask} 'Hvor langt skal jeg gå?' + {if} svar {is} langt {forward} 100 {else} {forward} 5 - name: '{in}' - explanation: Check elements with `{in}`. + explanation: Tjek elementer med `{in}`. demo_code: |- - pretty_colors {is} green, yellow - color {is} {ask} 'What {is} your favorite color?' - {if} color {in} pretty_colors {print} 'pretty!' {else} {print} 'meh' + flotte_farver {is} grøn, gul + farve {is} {ask} 'Hvad er din yndlingsfarve?' + {if} farve {in} flotte_farver {print} 'flot!' {else} {print} 'kedeligt' - name: '{pressed}' - explanation: Check whether a given key on the keyboard is `{pressed}`. - demo_code: '{if} a {is} {pressed} {print} ''You pressed A!'' {else} {print} ''You pressed another key!''' + explanation: Kontroller om en given tast på tastaturet er `{pressed}`. + demo_code: '{if} a {is} {pressed} {print} ''Du trykkede på A!'' {else} {print} ''Du trykkede på en anden tast!''' 6: - name: '{print}' - explanation: Print exactly using quotation marks. - demo_code: '{print} ''5 times 5 is '' 5 * 5' + explanation: Udskriv nøjagtigt ved hjælp af citationstegn. + demo_code: '{print} ''5 gange 5 er '' 5 * 5' - name: '{ask}' - explanation: Ask for a calculation and check whether it is correct. + explanation: Bed om en udregning og kontroller om den er korrekt. demo_code: |- - answer = {ask} 'What is 10 plus 10?' - {if} answer {is} 20 {print} 'Yes!' {else} {print} 'Oops' -- name: '{ask} and {if} with turtle' - explanation: Ask the user how many angles they want. + svar = {ask} 'Hvad er 10 plus 10?' + {if} svar {is} 20 {print} 'Ja!' {else} {print} 'Ups' +- name: '`{ask}` og `{if}` med skildpadde' + explanation: Spørg brugeren hvor mange vinkler de ønsker. demo_code: |- - angles = {ask} 'How many angles?' - angle = 360 / angles + vinkler = {ask} 'Hvor mange vinkler?' + vinkel = 360 / vinkler {forward} 50 7: - name: '{print}' - explanation: Print exactly using quotation marks. - demo_code: '{print} ''Hello welcome to Hedy.''' + explanation: Udskriv nøjagtigt ved hjælp af citationstegn. + demo_code: '{print} ''Hej og velkommen til Hedy.''' - name: '{ask}' - explanation: Ask something with `{ask}`. + explanation: Stil spørgsmål med `{ask}`. demo_code: |- - color = {ask} 'What is your favorite color?' - {print} color ' is your favorite!' + farve = {ask} 'Hvad er din yndlingsfarve?' + {print} farve ' er din favorit!' - name: '{if}' - explanation: Make a choice with `{if}`. + explanation: Træf et valg med `{if}`. demo_code: |- - color = {ask} 'What is your favorite color?' - {if} color {is} green {print} 'pretty!' {else} {print} 'meh' -- name: '{repeat} with turtle' - explanation: Repeat a line of code with `{repeat}`. + farve = {ask} 'Hvad er din yndlingsfarve?' + {if} farve {is} grøn {print} 'pænt!' {else} {print} 'tja' +- name: '{repeat} med skildpadde' + explanation: Gentag en linje kode med `{repeat}`. demo_code: '{repeat} 3 {times} {forward} 10' 8: - name: '{print}' - explanation: Print something. Remember to use a quotation mark for literal printing. - demo_code: '{print} ''5 times 5 is '' 5 * 5' + explanation: Udskriv noget. Husk at bruge citationstegn til nøjagtig udskrivning. + demo_code: '{print} ''5 gange 5 er '' 5 * 5' - name: '{ask}' - explanation: Ask for the answer to a sum and check if it is correct. We can now print 2 lines. + explanation: Spørg om svaret på en addition og kontroller, om det er korrekt. Vi kan nu udskrive 2 linjer. demo_code: |- - answer = {ask} 'What is 5 plus 5?' - {if} answer {is} 10 - {print} 'Well done!' - {print} 'Indeed, the answer was ' answer + svar = {ask} 'Hvad er 5 plus 5?' + {if} svar {is} 10 + {print} 'Godt klaret!' + {print} 'Svaret er nemlig ' svar {else} - {print} 'Oops!' - {print} 'The answer is 10' -- name: '{repeat} with turtle' - explanation: Repeat multiple lines. + {print} 'Ups!' + {print} 'Svaret er 10' +- name: '{repeat} med skildpadde' + explanation: Gentag flere linjer. demo_code: |- {repeat} 4 {times} {turn} 90 {forward} 50 - name: '{pressed}' - explanation: Check whether a given key on the keyboard is `{pressed}`. + explanation: Kontroller om en given tast på tastaturet er `{pressed}`. demo_code: |- {if} a {is} {pressed} - {print} 'You pressed A!' + {print} 'Du trykkede på A!' {else} - {print} 'You pressed another key!' + {print} 'Du trykkede på en anden tast!' 9: -- name: '{if} with multiple lines' - explanation: The answer of a sum of questions with `{ask}` and see if it is correct. Now we print out two lines. +- name: '{if} med flere linjer' + explanation: Spørg om svaret på en addition med `{ask}` og se om det er korrekt. Nu udskriver vi to linjer. demo_code: |- - answer = {ask} 'What is 10 plus 10?' - {if} answer {is} 20 - {print} 'Well done!!' - {print} 'The answer is indeed' answer + svar = {ask} 'Hvad er 10 plus 10?' + {if} svar {is} 20 + {print} 'Godt klaret!!' + {print} 'Svaret er nemlig ' svar {else} - {print} 'Wrong' - {print} 'The answer is 20' -- name: '{repeat} with turtle' - explanation: Repeat multiple lines. + {print} 'Niks' + {print} 'Svaret er 20' +- name: '{repeat} med skildpadde' + explanation: Gentag flere linjer. demo_code: |- {repeat} 4 {times} {turn} 90 {forward} 50 10: - name: '{print}' - explanation: Print something. Remember to use a quotation mark for literal printing. - demo_code: '{print} ''5 times 5 is '' 5 * 5' -- name: '{for} with a list' - explanation: Print all things in a list. - demo_code: |- - animals {is} dog, cat, blobfish - {for} animal {in} animals - {print} 'I love ' animal + explanation: Udskriv noget. Husk at bruge citationstegn til nøjagtig udskrivning. + demo_code: '{print} ''5 gange 5 er '' 5 * 5' +- name: '{for} med en liste' + explanation: Udskriv alle elementerne i en liste. + demo_code: |- + alle_dyr {is} hunde, katte, fisk + {for} dyr {in} alle_dyr + {print} 'Jeg elsker ' dyr 11: -- name: '{for} loop' - explanation: We can use `{for}` with a `{range}`. +- name: '{for}-løkke (sløjfe)' + explanation: Vi kan bruge `{for}` med et `{range}`. demo_code: |- - {for} counter {in} {range} 1 {to} 5 - {print} counter + {for} tæller {in} {range} 1 {to} 5 + {print} tæller - name: '{ask}' - explanation: Ask for the answer to a sum and check if it is correct. We can now print 2 lines. + explanation: Spørg om svaret på en addition og kontroller, om det er korrekt. Vi kan nu udskrive 2 linjer. demo_code: |- - answer = {ask} 'What is 5 plus 5?' - {if} answer {is} 10 - {print} 'Well done!' - {print} 'Indeed, the answer was ' answer + svar = {ask} 'Hvad er 5 plus 5?' + {if} svar {is} 10 + {print} 'Godt klaret!' + {print} 'Svaret er nemlig ' svar {else} - {print} 'Oops!' - {print} 'The answer is 10' + {print} 'Ups!' + {print} 'Svaret er 10' 12: -- name: float directly - explanation: Decimal numbers. +- name: flyt direkte + explanation: Decimaltal. demo_code: |- - {print} 'Calculate away!' - {print} 'Two and a half plus two and a half is...' + {print} 'Regn løs!' + {print} 'To og en halv plus to og en halv er...' {print} 2.5 + 2.5 -- name: assign text - explanation: Text with quotation marks after `=` - demo_code: |- - name = 'Hedy the Robot' - {print} 'Hello ' name -- name: quotes after {if} comparison - explanation: Text with quotation marks after `{if}`. - demo_code: |- - name = {ask} 'Who are you?' - {if} name = 'Hedy' - {print} 'Hi there!' -- name: quotes in list - explanation: A list with quotation marks. - demo_code: |- - superheroes = 'Iron Man', 'Batman', 'Superman' - {print} superheroes {at} {random} +- name: tildel tekst + explanation: Tekst med citationstegn efter `=` + demo_code: |- + navn = 'Robotten Hedy' + {print} 'Hej ' navn +- name: citationstegn efter `{if}`-sammenligning + explanation: Tekst med citationstegn efter `{if}`. + demo_code: |- + navn = {ask} 'Hvem er du?' + {if} navn = 'Hedy' + {print} 'Hej du!' +- name: citationstegn i liste + explanation: En liste med citationstegn. + demo_code: |- + superhelte = 'Iron Man', 'Batman', 'Superman' + {print} superhelte {at} {random} 13: - name: '{and}' - explanation: Two parts both need to be correct. + explanation: To dele som begge skal være korrekte. demo_code: |- answer1 = {ask} 'What is 3+2?' answer2 = {ask} 'What is 2+2?' @@ -242,126 +242,126 @@ {else} {print} 'At least one answer is wrong!' - name: '{or}' - explanation: At least 1 of the two parts need to be correct. If both are correct, it is also fine. + explanation: Mindst en af de to dele skal være korrekte. Hvis begge er korrekte, er det også fint. demo_code: |- - answer1 = {ask} 'What is 3+2?' - answer2 = {ask} 'What is 2+2?' - {if} answer1 {is} 5 {or} answer2 {is} 4 - {print} 'At least one answer is correct!' + svar1 = {ask} 'Hvad er 3+2?' + svar2 = {ask} 'Hvad er 2+2?' + {if} svar1 {is} 5 {or} svar2 {is} 4 + {print} 'Mindst et svar er korrekt!' {else} - {print} 'Both answers are wrong!' + {print} 'Begge svar er forkerte!' 14: -- name: Smaller - explanation: We use the `<` to check if the first number is smaller than the second number. - demo_code: |- - age = {ask} 'How old are you?' - {if} age < 13 - {print} 'You are younger than me!' -- name: Bigger - explanation: We use the `>` to check if the first number is bigger than the second number. - demo_code: |- - age = {ask} 'How old are you?' - {if} age > 13 - {print} 'You are older than me!' -- name: Equal - explanation: We use the `==` to check if two things are the same. - demo_code: |- - answer = {ask} 'What is 5 * 5?' - {if} answer == 25 - {print} 'That is correct!' -- name: Not equal - explanation: We use the `!=` to check if two things are not the same. - demo_code: |- - answer = {ask} 'What is 5 * 5?' - {if} answer != 25 - {print} 'That is not correct!' -- name: Smaller or equal - explanation: We use the `<=` to check if the first number is smaller than or equal to the second number. - demo_code: |- - age = {ask} 'How old are you?' - {if} age <= 12 - {print} 'You are younger than me!' -- name: Bigger or equal - explanation: We use the `>=` to check if the first number is bigger than or equal to the second number. - demo_code: |- - age = {ask} 'How old are you?' - {if} age >= 14 - {print} 'You are older than me!' +- name: Mindre end + explanation: Vi bruger `<` til at kontrollere om det første tal er mindre end det andet. + demo_code: |- + alder = {ask} 'Hvor gammel er du?' + {if} alder < 13 + {print} 'Du er yngre end mig!' +- name: Større end + explanation: Vi bruger `>` til at kontrollere om det første tal er større end det andet. + demo_code: |- + alder = {ask} 'Hvor gammel er du?' + {if} alder > 13 + {print} 'Du er ældre end mig!' +- name: Lig med + explanation: Vi bruger `==` til at kontrollere om to ting er ens. + demo_code: |- + svar = {ask} 'Hvad er 5 * 5?' + {if} svar == 25 + {print} 'Det er korrekt!' +- name: Ikke lig med + explanation: Vi bruger `!=` til at kontrollere om to ting ikke er ens. + demo_code: |- + svar = {ask} 'Hvad er 5 * 5?' + {if} svar != 25 + {print} 'Det er ikke korrekt!' +- name: Mindre end eller lig med + explanation: Vi bruger `<=` til at kontrollere om det første tal er mindre end eller lig med det andet. + demo_code: |- + alder = {ask} 'Hvor gammel er du?' + {if} alder <= 12 + {print} 'Du er yngre end mig!' +- name: Større end eller lig med + explanation: Vi bruger `>=` til at kontrollere om det første tal er større end eller lig med det andet. + demo_code: |- + alder = {ask} 'Hvor gammel er du?' + {if} alder >= 14 + {print} 'Du er ældre end mig!' 15: - name: '{while}' - explanation: We can use the `{while}` loop with not equal. - demo_code: |- - answer = 0 - {while} answer != 25 - answer = {ask} 'What is 5 times 5?' - {print} 'A correct answer has been given' -- name: Smaller {while} - explanation: We can also use the `{while}` loop with `<` and `>`. - demo_code: |- - count = 1 - {while} count < 3 - {print} 'We do this ' 3 - count ' more times' - count = count + 1 - {print} 'We are done' + explanation: Vi kan bruge en `{while}`-løkke sammen med ikke lig med. + demo_code: |- + svar = 0 + {while} svar != 25 + svar = {ask} 'Hvad er 5 gange 5?' + {print} 'Det er rigtigt' +- name: '{while} mindre end' + explanation: Vi kan også bruge en `{while}`-løkke med `<` og `>`. + demo_code: |- + tælle = 1 + {while} tælle < 3 + {print} 'Vi gør dette ' 3 - tælle ' flere gange' + tælle = tælle + 1 + {print} 'Vi er færdige' 16: -- name: square brackets - explanation: Lists with square brackets. - demo_code: |- - fruit = ['apple', 'banana', 'cherry'] - {print} fruit -- name: Get an item from a list - explanation: To get an item from a list we use [number] so fruit[1] means, get the first fruit from the list! - demo_code: |- - fruit = ['banana', 'apple', 'cherry'] - firstfruit = fruit[1] - {print} firstfruit -- name: Get a random item from a list - explanation: To get a random item from a list we use [random] so fruit[random] means, get a random fruit from the list! - demo_code: |- - fruit = ['banana', 'apple', 'cherry'] - random_fruit = fruit[{random}] - {print} random_fruit +- name: firkantede parenteser + explanation: Lister med firkantede parenteser. + demo_code: |- + frugt = ['æble', 'banan', 'kirsebær'] + {print} frugt +- name: Tilgå et element i en liste + explanation: For at tilgå et element fra en liste bruger vi [tal], så frugt[1] betyder at få den første frugt i listen! + demo_code: |- + frugt = ['banan', 'æble', 'kirsebær'] + første_frugt = frugt[1] + {print} første_frugt +- name: Tilgå et tilfældigt element i en liste + explanation: For at tilgå et tilfældigt element i en liste bruger vi [{random}]], så frugt{random}] betyder at få en tilfældig frugt fra listen! + demo_code: |- + frugt = ['banan', 'æble', 'kirsebær'] + tilfældig_frugt = frugt[{random}] + {print} tilfældig_frugt 17: - name: '{elif}' explanation: '`{elif}`' demo_code: |- a = 2 {if} a == 1: - {print} 'a is 1' + {print} 'a er 1' {elif} a == 2: - {print} 'a is 2' + {print} 'a er 2' {else}: - {print} 'a is not 1 or 2' + {print} 'a er hverken 1 eller 2' - name: '{print}' - explanation: When we use a `{for}`, we need to put a `:` behind the `{for}` statement! + explanation: Når vi bruger en `{for}`-løkke, skal vi lægge en `:` bag `{for}`-sætningen! demo_code: |- {for} i {in} {range} 1 {to} 12: {print} i - {print} 'Ready or not, here I come!' + {print} 'Klar eller ej, her kommer jeg!' - name: '{if}' - explanation: We need to do the same with all of our `{if}` statements. + explanation: Vi skal gøre det samme med alle vores `{if}` sætninger. demo_code: |- - color = {ask} 'What is your favorite color?' - {if} color == 'green': - {print} 'Your favorite color is green' + farve = {ask} 'Hvad er din yndlingsfarve?' + {if} farve == 'grøn': + {print} 'Din yndlingsfarve er grøn' {else}: - {print} 'Your favorite color is not green' + {print} 'Din yndlingsfarve er ikke grøn' 18: - name: '{print}' - explanation: After `{print}` you need to use parentheses. - demo_code: '{print}(''hi!'')' + explanation: Efter `{print}` skal du bruge parenteser. + demo_code: '{print}(''hej!'')' - name: '{range}' - explanation: After `{range}` you need to use parentheses. + explanation: Efter `{range}` skal du bruge parenteser. demo_code: |- - {for} i {in} {range} (1,10): - {print}('Hello, times ', i) -- name: '{print} with var' - explanation: With `{print}` you need to use parentheses and commas if you print more items. + {for} i {in} {range}(1,10): + {print}('Hej nummer ', i) +- name: '{print} med variabel' + explanation: Med `{print}` skal du bruge parenteser og kommaer hvis du vil udskrive flere elementer. demo_code: |- - name = 'Hedy' - {print}('my name is ', name) -- name: ask something with {input} - explanation: Use `{input}` instead of `{ask}` to ask something. + navn = 'Hedy' + {print}('Jeg hedder ', navn) +- name: spørg om noget med {input} + explanation: Brug `{input}` i stedet for `{ask}` for at spørge om noget. demo_code: |- - name = {input}('What is your name?') - {print}('So your name is ', name) + navn = {input}('Hvad hedder du?') + {print}('Så du hedder ', navn) diff --git a/content/client-messages/da.yaml b/content/client-messages/da.yaml index 6acd7b0a47e..5ee2cb1f655 100644 --- a/content/client-messages/da.yaml +++ b/content/client-messages/da.yaml @@ -1,21 +1,21 @@ -CheckInternet: Check whether your Internet connection is working. -Connection_error: We couldn't reach the server. -Empty_output: This code works but does not print anything. Add a print command to your code or use the turtle to get output. -Errors_found: You made a mistake! Don't worry, Hedy is trying to find the mistakes -Execute_error: Something went wrong while running the program. -Other_error: Oops! Maybe we made a little mistake. -Program_repair: This could be the correct code, can you fix it? -Program_too_long: Your program takes too long to run. -ServerError: You wrote a program we weren't expecting. If you want to help, send us an email with the level and your program at hello@hedy.org. In the meantime, try something a little different and take another look at the examples. Thanks! -Transpile_error: We can't run your program. +CheckInternet: Tjek om du er forbundet til internettet. +Connection_error: Vi kunne ikke nå serveren. +Empty_output: Denne kode fungerer, men udskriver ikke noget. Tilføj en udskriftskommando til din kode eller brug skildpadden til at få et output. +Errors_found: Du lavede en fejl! Bare rolig, vi kørte stadig programmet +Execute_error: Noget gik galt da programmet kørte. +Other_error: Ups! Vi har måske lavet en lille fejl. +Program_repair: Dette kunne være den korrekte kode; kan du løse det? +Program_too_long: Dit program tager for lang tid at køre. +ServerError: Du skrev et program, vi ikke havde forventet. Hvis du ønsker at hjælpe, sende os en e-mail med niveauet og dit program på hello@hedy.org. I mellemtiden, prøv at test et lidt anderledes program og tage et ekstra kig på eksemplerne. Tak! +Transpile_error: Vi kan ikke køre dit program. Transpile_success: -- Good job! -- Amazing! -- Well done! -- Excellent! -- You did great! -Transpile_warning: Warning! -Unsaved_Changes: You have an unsaved program. Do you want to leave without saving it? +- Godt arbejde! +- Fantastisk! +- Godt klaret! +- Fremragende! +- Flot gjort! +Transpile_warning: Advarsel! +Unsaved_Changes: Dit program er ikke gemt. Vil du afslutte uden at gemme det? dice: 🎲 fortune: 🔮, ✨ haunted: 🦇, 👻, 🎃 diff --git a/content/keywords/da.yaml b/content/keywords/da.yaml index 85fd124cb64..535b367447d 100644 --- a/content/keywords/da.yaml +++ b/content/keywords/da.yaml @@ -5,7 +5,7 @@ at: ved black: sort blue: blå brown: brun -call: call +call: kald clear: rens color: farve comma: ',' @@ -22,46 +22,46 @@ d9: '9' def: def define: definer echo: ekko -elif: elif +elif: ellers hvis else: ellers -'false': 'false' -'False': 'False' +'false': 'falsk' +'False': 'Falsk' for: for forward: fremad -from: from +from: fra gray: grå green: grøn -if: if -in: in +if: hvis +in: i input: input -is: is -left: left -length: length -not_in: not in -or: or +is: er +left: venstre +length: længde +not_in: ikke i +or: eller orange: orange pink: lyserød -play: play -pressed: pressed -print: print +play: spil +pressed: trykket ned +print: skriv purple: lila quote: '''' -random: random -range: range -red: red -remove: remove -repeat: repeat -return: return -right: right -sleep: sleep -step: step -times: times -to: to -to_list: to -'true': 'true' -'True': 'True' +random: tilfældighed +range: interval +red: rød +remove: fjern +repeat: gentag +return: returner +right: højre +sleep: sov +step: skridt +times: gange +to: til +to_list: til +'true': 'sand' +'True': 'Sand' turn: drej -while: while -white: white -with: with -yellow: yellow +while: mens +white: hvid +with: med +yellow: gul diff --git a/content/pages/da.yaml b/content/pages/da.yaml index 23848f7a144..ed2ca87317f 100644 --- a/content/pages/da.yaml +++ b/content/pages/da.yaml @@ -1,76 +1,76 @@ -title: Hedy documentation +title: Dokumentation for Hedy home-sections: -- title: Textual programming made easy! +- title: Tekst-baseret programmering på en enkel måde! text: |- - Many schools and teachers around the world want to teach their students programming. Initially this is often done with playful tools, ranging from the Beebot robot to - Scratch Junior or Scratch. After using such tools, kids often want to move to more powerful, textual programming languages, like Python. + Mange skoler og lærere verden over ønsker at lære deres elever programmering. Dette er ofte gjort med legende værktøjer, lige fra Beebot robotten til + Scratch Junior eller Scratch. Efter brug af sådanne værktøjer ønsker børn ofte at flytte til mere kraftfulde, tekst-baserede programmeringssprog som Python. - Python however is hard, because it is only available in English, and requires learners to learn complex programming concepts and syntax at once. - Hedy is the easy way to get started with textual programming languages! Hedy is free to use, open source, and unlike any other textual programming language in three ways. + Python er dog svært, fordi det kun er tilgængeligt på engelsk, og kræver at eleverne lærer komplekse programmeringskoncepter og syntaks på én gang. + Hedy er den nemme måde at komme i gang med et tekst-baseret programmeringssprog! Hedy er gratis at bruge, har åben kildekode og adskiller sig fra andre tekstsprog på tre måder. - 1. Hedy is multi-lingual, you can use Hedy in your own language - 2. Hedy is gradual, so you can learn one concept and its syntax a time - 3. Hedy is built for the classroom, allowing teachers to fully customize their student's experience -- title: Multi-lingual programming - text: While almost all textual programming language have keywords in English, such as `for` or `repeat`, Hedy can be used in any language! We currently support 39 different languages, including Spanish, Arabic, Simplified Chinese and Hindi. If your language is not available you can always start a a new translation. -- title: Step by step learning - text: Learning a programming language can be overwhelming, since learners have to learn concepts (for example if-else or loops) and syntax (like quotation marks or round brackets) at the same time. In Hedy, concepts are first introduced with little syntax and then refined. A scientifically proven way to learn! -- title: Built for the classroom + 1. Hedy er flersproget, du kan bruge Hedy på dit eget sprog + 2. Hedy er gradvist, så du kan lære et begreb og dens syntaks en tid + 3. Hedy er bygget til klasseværelset, så lærere kan tilpasse deres elevers oplevelse +- title: Flersproget programmering + text: Mens næsten alle tekst-baserede programmeringssprog har nøgleord på engelsk, f.eks. `for` eller `repeat`, så kan Hedy bruges på ethvert sprog! Vi understøtter i øjeblikket 47 forskellige sprog, herunder hollandsk, spansk, arabisk, tyrkisk, kinesisk og hindi. Hvis dit sprog ikke er tilgængeligt, kan du altid starte en ny oversættelse. +- title: Trin for trin læring + text: At lære et programmeringssprog kan være overvældende, da elever skal lære begreber (f.eks. hvis-else eller sløjfer) og syntaks (f.eks. citatmærker eller parenteser) samtidig. I Hedy introduceres begreber først med lidt syntaks og raffineres først senere hen. En videnskabeligt bevist måde at lære! +- title: Bygget til klasseværelset text: |- - Hedy is suitable for kids aged 10 and up and designed for classroom use. - Teachers can use our free, built-in lesson plans, but can also author their own lessons and load these into the Hedy user interface. -- title: Programming in context - text: Hedy shows programming in the broadest way possible, and can be used in variety of exciting ways. Hedy allows for the creation of digital and interactive stories, colorful drawings that can be shown on the screen but also drawn with a pen plotter or embroidered on a shirt, and can be used to create games or apps with buttons and keyboard actions. -- title: Is Hedy free? + Hedy er velegnet til børn fra 10 år og opefter og er designet til brug i klasseværelset. + Undervisere kan bruge vores gratis, indbyggede lektionsplaner, men kan også skabe deres egne lektioner og ligge disse ind i Hedys brugergrænseflade. +- title: Programmering i kontekst + text: Hedy viser programmering på den bredest mulige måde og kan bruges på mange spændende måder. Hedy giver mulighed for oprettelse af digitale og interaktive historier, farverige tegninger, der kan vises på skærmen, men også tegnet med en pen plotter eller broderet på en skjorte, og kan bruges til at oprette spil eller apps med knapper og tastaturhandlinger. +- title: Er Hedy gratis? text: |- - Yes! Hedy is 'Open source', which means that everyone can help us make Hedy better. - You can find our code on [GitHub](https://github.com/hedyorg/hedy). - If you like Hedy and want to contribute, we accept (and are very grateful for) [donations](https://github.com/sponsors/hedyorg)! -- title: Do I need to install anything? - text: No. Hedy works in the browser, which is the program you are using to look at this page. Probably Chrome or Edge or Firefox. Hedy also works on phones and tablets. -- title: Do I need programming experience to teach with Hedy? + Ja! Hedy har 'åben kildekode', hvilket betyder at alle kan hjælpe os med at forbedre Hedy. + Du kan finde vores kode på GitHub. + Hvis du kan lide Hedy og gerne vil hjælpe til, så tager vi imod (og er meget taknemmelige for) donationer! +- title: Behøver jeg at installere noget? + text: Nej. Hedy fungerer i din browser, altså det program du bruger til at se den her side. Formodentlig Chrome, Edge eller Firefox. Hedy virker også på telefonen og tablets. +- title: Har jeg brug for programmeringserfaring for at undervise med Hedy? text: |- - No, that is not needed. All concepts are explained in the slides and in the interface for learners. - If you create a free teacher's account, you also get access to the teacher's manual with information on how to teach - and frequently made mistakes. + Nej, det er ikke nødvendigt. Alle begreber forklares i diaserne og i interfacet til elever. + Hvis du opretter en gratis lærerkonto, får du også adgang til lærermanualen med oplysninger om hvordan du lærer + og almindelige fejl. join-sections: -- title: Supporting Hedy - text: '# There are three ways in which you can support Hedy!' -- title: Improving the language +- title: At støtte Hedy + text: '# Der er tre måder at støtte Hedy på!' +- title: Forbedre sproget text: |- - The gradual and multi-lingual nature of Hedy create a lot of interesting technical challenges. - Find those issues on [Github](https://github.com/hedyorg/hedy/issues?q=is%3Aopen+is%3Aissue+label%3Alanguage). -- title: Translating Hedy + Hedys gradvise og flersprogede natur skaber en masse interessante tekniske udfordringer. + Find disse problemer på Github. +- title: Oversætte Hedy text: |- - Not a programmer? No problem! Another way to support Hedy is by [translating keywords, error messages, adventures are other content](https://github.com/hedyorg/hedy/wiki/Hedy-Translation-Tutorial) - - This is the current status, help us complete a language, or add a new one! + Ikke en programmør? Intet problem! En anden måde at støtte Hedy på er ved at oversætte nøgleord, fejlmeddelelser, eventyr og andet indhold. + Dette er den nuværende status; hjælp os med at fuldføre et sprog eller tilføje en ny! Translation status -- title: Help teachers get started +- title: Hjælp undervisere med at komme i gang text: |- - Hedy is designed to support teachers in providing programming lessons in class. We have specific teacher features like the option to create a class, customize it and see how your students are doing. - If you like Hedy, you can reach out to schools that you know to help teachers get started! We can help you find schools or teachers via [Discord](https://discord.gg/8yY7dEme9r). + Hedy er designet til at støtte undervisere i at give programmeringsundervisning i klasse. Vi har særlige lærerfunktioner, så som mulighed for at oprette en klasse, tilpasse den og se hvordan dine elever klarer sig. + Hvis du kan lide Hedy, kan du række ud til skoler som du kender og at hjælpe deres lærere/undervisere med at komme i gang! Vi kan hjælpe dig med at finde skoler eller lærere via Discord. learn-more-sections: -- title: The Hedy foundation +- title: Hedy-fonden text: |- - Hedy is maintained by the Hedy Foundation (Stichting Hedy), Sportmanstaat 8, 2341 JG Oegstgeest, Dutch Chamber of Commerce number 94013985. + Hedy styres og organiseres af Hedy-fonden (Stichting Hedy), Sportmanstaat 8, 2341 JG Oegstgeest, Dutch Chamber of Commerce number 94013985. + + Fondens bestyrelse består af: - 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! + * Felienne Hermans, præsident + * Eelko Huizing, finansiering + * Renée Merbis, sekretær + + Hedys bestyrelse får ikke nogen økonomisk kompensation for deres opgaver. +- title: Dyk dybere! text: |- - Want to know more about Hedy's philosophy and design? Check out this talk Felienne gave at the StrangeLoop Conference in 2022: + Vil du vide mere om Hedys filosofi og design? Se dette foredrag Felienne holdt på StrangeLoop-konferencen i 2022: -- title: Hedy in the news +- title: Hedy i nyhederne text: |- - Some websites and newspapers have written about Hedy since our release in early 2020. We keep a list here: + Nogle hjemmesider and nyhedsmedier har skrevet om Hedy siden vores udgivelse i starten af 2020. En ufuldstændig liste er: + * [Java Magazine 04.2023](images/Hedy_Javamagazine2023.pdf) * [Tech Optimism - A Solution to the IT Shortage (Dutch), August 2022](https://pom.show/2022/08/12/een-oplossing-voor-het-it-tekort/) * [Codeweek Podcast, July 2022](https://codeweek.eu/podcast/26) * [Heise.de (German), Januari 2022](https://www.heise.de/news/Hedy-die-mitwachsende-Programmiersprache-6336264.html) @@ -91,27 +91,43 @@ learn-more-sections: * [Mare (Dutch), April 2020](https://www.mareonline.nl/cultuur/computercode-voor-de-kids/) * [AG Connect (Dutch), April 2020](https://www.agconnect.nl/artikel/stapsgewijs-python-leren-programmeren-met-nieuwe-taal-hedy) start-sections: -- title: Getting started with Hedy - text: '*Something about teachers accounts, slides etc*' -- title: What other teachers say - text: "A while ago we ran a few short Hedy teachers surveys. \nThe questions span between suggestions of improvement and Hedy’s best features. \nBelow is a testimony of their thoughts:\n\nSimple interface and good examples. *Teacher: 3rd - 6th grades (elementary)*\n\nMultilingual programming and just the gradual programming concept itself. - *US: middle school, 6th-8th grade*\n\nThe gradual nature of introducing programming. *Australia: High school*\n\nThe construction is so good. *Netherlands: Lower secondary school HAVO-VWO*\n\nI can keep the pace of the class. *Netherlands: group 7 en 8* \n\nContinues automatically. *Netherlands: 2 HAVO-VWO*\n\nBoth that the explanation can be in Dutch (and the code in English), and that it builds up with more \nand more possibilities. *Netherlands: Plus class group 7*\n\nThe 'realness' of programming, it resembles how it is in reality. *Netherlands: Plus class group 4 to 8*\n\nStep-by-step activities. Fun activities. *Netherlands: 1e All levels, 2e VWO/HAVO 2e VWO +, 3e HAVO 3e VWO*\n\nBut Hedy and its gradual levels... what an idea, \nI wanted to personally thank you for creating this. I cannot thank you enough. Also, I have never seen the level of engagement and enthusiasm of my \nstudents, as I have seen with Hedy. We have covered till level 5, and plan to spend one more week on it in classes and labs, \nbefore starting Python. *Pakistan*\n\nI really like Hedy very much and it is also nicely set up, which makes it good to use in primary school. \nHedy's gradual approach works very well. \nThe short explanation at the beginning of each level and the short example programs help to give the children a quick insight into what is new in the chosen level. \nThe different assignments that the children can choose also work very well. \nYou see the children choose assignments that appeal to them and they then get to work with them, \nthrough the levels. Hedy is great fun for children who are good at programming and want to get a \ntaste of a real programming language. It is good preparation for secondary school as soon as more ICT \neducation is given there. *Netherlands: Oegstgeest Montessori school*\n\n" +- title: Kom i gang med Hedy + text: 'Velkommen til Hedy, vi er glade for at hjælpe dig med at komme i gang med Hedy. + + + Vores [Lærerhåndbog](https://www.hedy.org/for-teachers/manual) har en oversigt over alle funktioner i detaljer, men denne side har et kort overblik, så du ved, hvad du bevæger dig ind i før du dykker dybere. + + + Et par højdepunkter, der er vigtigt at vide: + + * Hedy er et værktøj designet til at hjælpe med at styre et klasseværelse af børn der skal lære at programmere! Du kan oprette dine egne klasser, lektionsplaner og følge, hvordan dine elever klarer sig. + + * Du behøver ikke at vide en masse om programmering når du begynder, Hedy arbejder trin for trin, også for dig! + + * Du kan bruge Hedy på dit modersmål, fordi det er blevet oversat til mange andre sprog! + + * Alle børn kan programmere!! Hedy er især nyttigt for børn, der har synsproblemer, fordi det kan læse materialet højt uden behov for en mus. + + * Vi er her for at hjælpe, du kan finde os for eksempel på [Discord](https://discord.gg/8yY7dEme9r) eller du kan [sende os en mail](hello@hedy.org).' +- title: Undervisere siger om Hedy + text: "Various teachers worldwide have expressed their passion for Hedy, as some have shared with us:\n\n*Incredibly inspiring! Super good way to make programming a lot more accessible for yourself, but also for students. Very fun to play with and a lot of potential to use with the students. I think it is a very nice tool! I believe this is a valuable way for children to start learning programming. Python and coding have always been very exciting, because the barrier to learning is very high. Now everything is a bit lower and it was explained that it can actually be very easy. I enjoyed seeing how Hedy tries to make programming as accessible as possible for users!*\nNetherlands: Mathematics teachers in training (secondary school)\n\n*Simple interface and good examples.* Teacher: 3rd - 6th grades (elementary)\n\n*Multilingual programming and just the gradual programming concept itself.* US: middle school, 6th-8th grade\n\n*The gradual nature of introducing programming.* Australia: High school\n\n*Continues automatically.* Netherlands: 2 HAVO-VWO\n\n*Both that the explanation can be in Dutch (and the code in English), and that it builds up with more and more possibilities.* Netherlands: Plus class group\n\n*But Hedy and its gradual levels...what an idea, I wanted to personally thank you for creating this. I cannot thank you enough. Also, I have never seen the level of engagement and enthusiasm of my students, as I have seen with Hedy. We have covered till level 5, and plan to spend one more week on it in classes and labs, before starting Python.* Pakistan\n\n*The 'realness' of programming, it resembles how it is in reality.* Netherlands: Plus class group 4 to 8\n\n*Step-by-step activities. Fun activities.* Netherlands: 1e All levels, 2e VWO/HAVO 2e VWO +, 3e HAVO 3e VWO\n\n*I really like Hedy very much and it is also nicely set up, which makes it good to use in primary school. Hedy's gradual approach works very well. The short explanation at the beginning of each level and the short example programs help to give the children a quick insight into what is new in the chosen level. The different assignments that the children can choose also work very well. You see the children choose assignments that appeal to them and they then get to work with them, through the levels. Hedy is great fun for children who are good at programming and want to get a taste of a real programming language. It is good preparation for secondary school as soon as more ICT education is given there.* Netherlands: Oegstgeest Montessori school\n\n*The construction is so good.* Netherlands: Lower secondary school HAVO-VWO\n\n*I can keep the pace of the class.* Netherlands: group 7 en 8\n\n![Felienne teaching kids](/images/teacherfeedback/Fkids1.JPG) *Felienne teaching kids*\n\n\n![Kids learning about Hedy](/images/teacherfeedback/Fkids2.JPG) *Kids learning about Hedy*" teacher-guide: -- title: Introduction +- title: Indledning key: intro subsections: - - title: What's Hedy? + - title: Hvad er Hedy? text: |- - Hedy is a textual programming language, specifically developed for (pre-)teens (10 to 15 years old). - In contrast to programming languages for kids, like Scratch, Hedy doesn't use code blocks but textual code. - So with Hedy you'll learn how to type code like the real programmers do, but in small steps with playful exercises. - This way Hedy can function as a stepping stone to real programming languages like Python in an accessible and mostly fun way! - If you want to know more, you can watch this video about the development of Hedy as a programming language. - - title: Target audience + Hedy er et tekst-baseret programmeringssprog, specielt udviklet for børn mellem 10 og 15 år. + I modsætning til programmeringssprog til børn så som Scratch, der bruger Hedy ikke kodeblokke, men i stedet tekstuel kode. + Så med Hedy lærer man, hvordan du skriver kode som de rigtige programmører gør, men i små trin med legende øvelser. + På denne måde kan Hedy fungere som et skridt på vejen til rigtige programmeringssprog som Python, på en tilgængelig og for det meste sjov måde! + Hvis du vil vide mere, kan du se denne video om udviklingen af Hedy som programmeringssprog. + - title: Målgruppe text: |- - Hedy is developed with middle school and junior high school students in mind (ages 10 - 15). - It's important for the students to be able to read well. We recommend not to start with Hedy before the students have achieved at least a 3rd grade reading level. - Students (and teachers!) don't need any programming experience before starting with Hedy. - - title: How does Hedy work? + Hedy er udviklet med mellemtrins- og udskolingselever i tankerne, altså børn i alderen 10 til 15 år. + Det er vigtigt at eleverne kan læse godt. Vi anbefaler ikke at starte med Hedy, før eleverne har opnået mindst tredjeklasses læseniveau. + Elever (og lærere!) behøver dog ikke nogen programmeringserfaring, før de starter med Hedy. + - title: Hvordan fungerer Hedy? text: |- Hedy is divided into levels, in which new commands are taught. Each level contains a variety of adventures to practice the newly learned commands. As a teacher, you get to decide which adventures are available for your students. Will they be making a restaurant, a calculator or a haunted house this level? Within each level, the adventures are arranged from easiest to hardest. @@ -122,14 +138,14 @@ teacher-guide: After programming all the adventures of a certain level, your students can test their knowledge in the quiz. You can track your students' work and their progress on the class page. - - title: Devices + - title: Enheder text: |- - Hedy is webbased, which means it works on any device with a browser (Google Chrome, Firefox, Edge etc), so laptops, chromebooks, tablets and even smartphones are suitable to use Hedy. + Hedy is web-based, which means it works on any device with a browser (Google Chrome, Firefox, Edge etc), so laptops, Chromebooks, tablets and even smartphones are suitable to use Hedy. There's no need to download anything before working with Hedy, just go to the website and you're all set! - title: The Hedy Community text: |- - All Hedy teachers, programmers and other fans are welcome to join our [Discord server](https://discord.gg/8yY7dEme9r). This is the ideal place to chat about Hedy: we have channels where you can show your cool projects and lessons, channels to report bugs, and channels to chat with other teachers and with the Hedy team. - [Here](https://www.youtube.com/watch?v=Lyz_Lnd-_aI) you can find a video on how to join the dicord community. + All Hedy teachers, programmers and other fans are welcome to join our Discord server. This is the ideal place to chat about Hedy: we have channels where you can show your cool projects and lessons, channels to report bugs, and channels to chat with other teachers and with the Hedy team. + Here you can find a video on how to join the Discord Community. - title: Hedy and the GDPR text: |- Organizations in the EU have to comply with the GDPR (General Data Protection Regulation) when processing personal data. @@ -144,7 +160,7 @@ teacher-guide: key: tutorial subsections: - title: Tutorial - text: Do you want to follow the tutorial (again)? Click [here](https://hedy.org/tutorial) + text: Do you want to follow the tutorial (again)? Click here. - title: Teaching preparations key: preparations subsections: @@ -206,7 +222,7 @@ teacher-guide: **You create accounts for your students** The easiest way to add students to your class is by creating an account for them. This can be done by clicking the 'create student accounts' button and filling in the usernames and passwords for them. The students can login with the username and password that you chose. Afterwards, they can change their username or password if they'd like and they'll still remain in your class. - This [video](https://www.youtube.com/watch?v=eEQvik-Ce5M) shows how to add students to your class in the quickest and easiest way. + This video shows how to add students to your class in the quickest and easiest way. **Students make their own accounts** Your students can also go to the Hedy website and create their own accounts, just like you did. To get them into your class, they simply have to click the invite link. @@ -217,7 +233,6 @@ teacher-guide: When students create profiles they are supposed to choose a 'preferred language'. Hedy will always be loaded in this selected language. Changing this language can always be done later on by navigating to 'My account' and 'My personal settings' again. - **For non-English speakers** Not only can you change the language of the adventures to your own language. You can also choose which language the keywords (for example 'print' or 'ask') should be in. This way you can teach your students to code with English keywords, but you can also let them program in their own language. For example, Dutch students can use the command 'vraag' instead of 'ask'. @@ -226,7 +241,7 @@ teacher-guide: **Video** - This [video](https://www.youtube.com/watch?v=QrVZETj4oLM) show you how to set a preferred language and change the keywords to you preferred language as well. + This video show you how to set a preferred language and change the keywords to you preferred language as well. - title: Storing programs text: |- When you are logged in, you'll see My programs next to your profile icon. @@ -247,7 +262,7 @@ teacher-guide: text: |- Hedy contains a lot of different levels that each teach a different new skill. We recommend to teach one level per lesson. This gives your students the time to fully grasp a new command or concept and practice with it, before moving on to the next level. - We use this structure in our lessons: Introduction, New concepts and commands, let's get to work, puzzels and quizzes. + We use this structure in our lessons: Introduction, New concepts and commands, let's get to work, puzzles and quizzes. - title: Slides text: |- When giving instructions you might want to use our slides. Our slides are available on the 'For teachers' page. There is a set of slides for each level. In the slides all the new commands for that level are explained. We have aimed to explain why these changes are nessecary or how the new commands come in handy. @@ -260,7 +275,7 @@ teacher-guide: text: |- The new concepts and commands can be very hard for some students to fully understand. That's why it's of importance to model the proper use of the new commands to your students. - Especially in the lower levels, where some students have no experience whith programming at all, it can be hard for them to understand the new abstract concepts. + Especially in the lower levels, where some students have no experience with programming at all, it can be hard for them to understand the new abstract concepts. Showing a lot of examples makes an abstract concept (for instance: 'What is a variable?') more recognizable and easier to understand ('Look, the variable pet changed into dog'). Our slides could help you with that. - title: Let's get to work text: |- @@ -271,19 +286,19 @@ teacher-guide: They don't always have to make every adventure. Every adventure contains an example code, that the students can try out with the green button. The example code gets copied to the workfield, where the students can try out the code and adjust it to make it their own. Stimulate your students to turn the example code into their own projects by adding their own ideas and making their own variation of the adventure. - - title: Quizzes and puzzels + - title: Quizzes and puzzles text: |- - To test whether your students have picked up all the new info in the level, you can let them make the quiz. + To test whether your students have picked up all the new info in the level, you can let them take the quiz. The quiz contains 10 multiple choice questions about the new concepts and command to that level. Not every level has a quiz yet, as we are still building the quizzes. - Some levels also contain puzzels. Puzzels show the students a couple of line of code that the students have to put in the right order. + Some levels also contain puzzles. Puzzles show the students a couple of line of code that the students have to put in the right order. - This [video](https://www.youtube.com/watch?v=lNh5EdZVUwc) shows the quizzes and puzzels. + This video shows the quizzes and puzzles. - title: Evaluation text: |- Round up your lesson by having a brief evaluation. What did the students learn? Which hardships did they come across? How did they learn from their mistakes? And of course: What did they create? - Students are often very proud of their own creations, so it's nice to save a little time and gove your students the opportunity to show their work to their classmates. + Students are often very proud of their own creations, so it's nice to save a little time and give your students the opportunity to show their work to their classmates. - title: Teacher Statistics key: teacher_statistics subsections: @@ -313,7 +328,7 @@ teacher-guide: It is important to notice that the blue dots means that a students 'attempted' the adventure. This means that they ran a code in this adventure and went on to the next adventure, so this does not automatically mean that they did a good job! If you want to see how an individual student is getting along, you can click their name in this overview. This is what you see if you click on marleen_h3a for example: - You see that Marleen is having some trouble programming. She tried to run a program that contains blanks multiple times, so she probably doesn't know that she has to change something in the example code before running it. + You see that Marleen is having some trouble programming. She tried to run a program that contains blanks multiple times, so she might not realize that she has to change the code examples before running them. In this way this overview can give you a better understanding of what a student is struggling with. - title: Common Errors text: |- @@ -331,26 +346,26 @@ teacher-guide: key: features subsections: - title: Make your own adventure - text: It is also possible for teachers to create your own adventure. [This video](https://www.youtube.com/watch?v=A0zbXpxX4q4) shows you how to create your own adventure as a teacher and add it to your class(es). + text: It is also possible for teachers to create your own adventure. This video shows you how to create your own adventure as a teacher and add it to your class(es). - title: Explore page text: |- - On the [explore](https://hedy.org/explore) page you can view the work of other Hedy users. You can try out their programs and use them as inspiration to create something cool yourself. + On the explore page you can view the work of other Hedy users. You can try out their programs and use them as inspiration to create something cool yourself. You can also add a program you've made to the explore page yourself by clicking 'Save and share code' in the coding screen or go to My Programs and click 'Share'. Don't want to share your work anymore? Simply go to 'My Programs' and click 'Unshare'. - If you want more information about the explore page, check out this [video](https://www.youtube.com/watch?v=26boFjqvS5Q). + If you want more information about the explore page, check out this video. - title: My achievements text: |- - If you click on your username in the topright corner of your screen, you can go to [My achievements](https://hedy.org/my-achievements). On this page you achievements are collected. Your students have such a page as well. + If you click on your username in the topright corner of your screen, you can go to My achievements. On this page you achievements are collected. Your students have such a page as well. When you hover over the badge with your mouse, you'll see how to earn the badge. There are hidden badges too, of which you'll have to find out yourself how to earn them. - If you want more information on the achievements, check out this [video](https://www.youtube.com/watch?v=-FjmKejukCs). + If you want more information on the achievements, check out this video. - title: High Scores text: |- - On [this page](https://hedy.org/highscores) you can see the high scores of all Hedy users. - In this [video](https://www.youtube.com/watch?v=IqTiUkBVTo8) you can learn some more about the high scores. + On this page you can see the high scores of all Hedy users. + In this videoyou can learn some more about the high scores. - title: Debugger text: |- Is your (student's) code not working? There must be a bug (coding mistake) in it! You can use the debugger to find the mistake. - The debugger is the ladybig button in your coding screen. If you press it, you can run your code line by line to find your mistake. + The debugger is the ladybug button in your coding screen. If you press it, you can run your code line by line to find your mistake. Have you found the mistake? Press the red stop button and the debugger will shut off. - title: Read aloud text: Do you want the output of your program to be read aloud? Then you can use the read aloud function that is found under the 'run code' button in your coding screen. @@ -362,14 +377,14 @@ teacher-guide: text: |- In every level there is a button with this emoji 🤔. You and your students can find the "cheat sheets" there. On this cheat sheet, you can find all the commands that are usable in this level in their correct form. So if you've forgotten how a command works, simply take a peek at the cheat sheet! - - title: Other useful features - text: This [video](https://www.youtube.com/watch?v=c4MntPPgl1Y) shows you even more features of Hedy, like the cheatsheets and the keyword switcher. + - title: Video + text: This video shows you even more features of Hedy, like the cheatsheets and the keyword switcher. - title: After Hedy key: after subsections: - title: What to do after Hedy? text: |- - Congratulations on reaching the end of Hedy! Your students have now learned how to create their own basic code in the Python programming language. + Congratulations on reaching the end of Hedy! Your students have now learned how to create their own basic programs in the Python programming language. Of course, you could keep programming in our Hedy compiler, but it might be more exciting for your students to transfer to a "real" Python interface. Would you like to continue teaching Python? Then please visit the Python website to learn how to get started in another compiler. @@ -383,9 +398,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 levels progress. 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: @@ -429,11 +442,11 @@ teacher-guide: error_code: |- {forward} 300 {turn} 90 - solution_text: In the example, students tend to think that the turn command doesn't work. Even though it does work, you can't see it happening off screen. Use smaller numbers to prevent this from happening. + solution_text: In the example, students tend to think that the turn command failed; even though it did what it what supossed to. What happened is the turtle walked past the screen limits. Use smaller numbers to prevent this from happening. solution_code: |- {forward} 100 {turn} 90 - - title: "Turtle: Students use the command backward, but that doesn't exist" + - title: "Skildpadde: Eleverne bruger kommandoen {backward}, men kommandoen findes ikke." example: error_text: Backward is not a command. error_code: backward 100 @@ -579,7 +592,7 @@ teacher-guide: your_name {is} {ask} Who are you? {add} your_name {to} names {print} names {at} {random} - - title: Students forget to use to/from in add/remove + - title: Elever glemmer at bruge `{to}`/`{from}` i `{add}`/`{remove}` example: error_text: Without to/from the add/remove command won't work. error_code: |- @@ -669,16 +682,16 @@ teacher-guide: solution_code: |- {if} name {is} Hedy {print} 'fun' {else} {print} 'meh! - - title: Students use long variable names containing two words + - title: Elever bruger lange variabelnavne der indeholder to eller flere ord example: - error_text: A variable should be named with one word. You could use an underscore to connect two words. That counts as one. + error_text: Variables in Hedy can't contain spaces, so, in order to use together several words, students need to connect them using underscores (_) error_code: chosen door is ask Which door do you pick? solution_text: Add an underscore. solution_code: chosen_door {is} {ask} 'which door do you pick?' - title: Students want multiple answers to be correct example: error_text: For example this student Hedy to tell all his friends that they are funny, but other classmates would be told that they are not. - error_code: "{if} name {is} Jesse, David, Souf print You are funny {else} {print} 'You are not funny'" + error_code: "{if} name {is} Jesse, David, Souf {print} 'You are funny' {else} {print} 'You are not funny'" solution_text: |- You could use the `in` command for that. It is explained in a higher level, but it does already work in level 5. Another solution is to use multiple if commands and no else command. The disadvantage is that it won't tell the other classmates that they are not funny. @@ -757,15 +770,15 @@ teacher-guide: {print} drink - title: Students make programs that take too long to run example: - error_text: In this level it's very easy to make long-running programs. The students aren't allowed to make programs that take to long to load (to save our servers). + error_text: In this level it's very easy to make programs that take a lot of time to complete. If the program takes too long, it'll be stopped, this with the intention to prevent straining the student's machine. error_code: "{repeat} 100 {times} {print} 'How many times can I repeat this?'" - solution_text: Make sure the programs aren't too long + solution_text: Make sure the code doesn't take too long to execute solution_code: "{repeat} 20 {times} {print} 'This is enough'" - level: '8' sections: - title: Students use the indentation wrong example: - error_text: Indentation is a new concept in this level, that is hard to use for some students. Make sure they practise some simple snippets before making a whole program with it. + error_text: Indentation is a new concept in this level, and for some students it might be hard to learn. Make sure they practise some simple examples before making a whole program with it. error_code: |- {repeat} 3 {times} {print} 'hello' @@ -806,18 +819,18 @@ teacher-guide: {print} 'Hip Hip Hooray!' - title: Students make programs that take too long to run example: - error_text: In this level it's very easy to make long-running programs. The students aren't allowed to make programs that take to long to load (to save our servers). + error_text: In this level it's very easy to make programs that take a lot of time to complete. If the program takes too long, it'll be stopped, this with the intention to prevent straining the student's machine. error_code: |- {repeat} 100 {times} {print} 'How many times can I repeat this?' - solution_text: Make sure the programs aren't too long + solution_text: Make sure the code doesn't take too long to execute solution_code: |- {repeat} 20 {times} {print} 'This is enough' - title: Students use the `{if}` command to check if the variable value is the same as the variable name example: error_text: |- - We have seen this mistake by some of our students. They make a password for their computer, but they make the password 'password'. + We've noticed a common error among our students: they try to create a program that checks for a password, but they make the password 'password'. In line 2 the computer is asked to check whether the variable password is the same as the variable password, so itself. Which means the answer is always yes. So with this code the answer will always be 'You can come in' no matter what the player fills in. error_code: |- @@ -867,7 +880,7 @@ teacher-guide: {print} 'Robin goes home' - level: '10' sections: - - title: Students do not use the for command correctly + - title: Students do not use the `{for}` command correctly example: error_text: We often see that students try to print the list (in the example animals) instead of the items of the list. error_code: |- @@ -957,7 +970,7 @@ teacher-guide: solution_code: '{print} 2.5 + 2.5' - level: '13' sections: - - title: Students confuse `and` with `or` + - title: Elever forveksler `{and}` med `{or}` example: error_text: Both commands might appear similar, but their functions are very different. error_code: |- diff --git a/content/parsons/da.yaml b/content/parsons/da.yaml index 91dab9aa0ee..53927b79ec6 100644 --- a/content/parsons/da.yaml +++ b/content/parsons/da.yaml @@ -3,6 +3,7 @@ levels: 1: story: |- Puzzels are exercises in which the lines of code are already written for you. You only have to place the lines in the correct order. Drag the lines of code into the input screen and run the code. Can you get the program to work? + You're a customer at bakery Hedy. You walk into the bakery and are welcomed by the baker. He asks what type of pie you want to order. @@ -40,7 +41,7 @@ levels: 3: 1: story: |- - The new school year at Hogwarts is starting! + The new school year at Hogwarts is starting! It is the job of the sorting hat to sort you into one of the houses. Which house will you be sorted into? Are you a Gryffindor, Hufflepuff, Ravenclaw or Slytherin. Before the sorting hat reveals your house, you can tell it to not pick one of the houses. diff --git a/content/quizzes/da.yaml b/content/quizzes/da.yaml index 3f831d1345d..9b1bf1ecf7a 100644 --- a/content/quizzes/da.yaml +++ b/content/quizzes/da.yaml @@ -16,27 +16,19 @@ levels: question_score: '10' 2: question_text: Which need to be filled in on the blanks to make the text Hello! appear? - code: ___ Hello! + code: _ Hej! mp_choice_options: - option: |- - ``` - {echo} - ``` + `{echo}` feedback: '`{echo}` repeats a given answer.' - option: |- - ``` - {print} - ``` + `{print}` feedback: Correct! - option: |- - ``` - hello - ``` + `hello` feedback: Hello isn't a command. - option: |- - ``` - {ask} - ``` + `{ask}` feedback: With `{ask}`, you can ask a question. hint: _?_ Hello world! correct_answer: B @@ -46,22 +38,22 @@ levels: mp_choice_options: - option: |- ``` - {print} What is your favorite color? + {print} Hvad er din yndlingsfarve? ``` feedback: '`{print}` prints text, but it doesn''t ask questions.' - option: |- ``` - {ask} {print} What is your favorite color? + {ask} {print} Hvad er din yndlingsfarve? ``` feedback: You only need one command, not two. - option: |- ``` - {ask} What is your favorite color? + {ask} Hvad er din yndlingsfarve? ``` feedback: Great! - option: |- ``` - {echo} What is your favorite color? + {echo} Hvad er din yndlingsfarve? ``` feedback: '`{echo}` repeats your answer back to you.' hint: You can ask something with the `{ask}` command @@ -92,24 +84,16 @@ levels: _?_ So your favorite pet is... mp_choice_options: - option: |- - ``` - {print} - ``` + `{print}` feedback: No, you would like the answer to be repeated back to you. - option: |- - ``` - Hedy - ``` + `Hedy` feedback: Hedy isn't a command. - option: |- - ``` - {ask} - ``` + `{ask}` feedback: With `{ask}` you can ask a question. - option: |- - ``` - {echo} - ``` + `{echo}` feedback: Right on! hint: You want to see the answer at the end of line 2... correct_answer: D @@ -191,17 +175,17 @@ levels: {echo} {echo} mp_choice_options: - - option: Are you ready to go to level 2? + - option: Er du klar til at gå videre til niveau 2? feedback: There are two echo commands - option: |- - Yes! - Yes! - feedback: Great job! - - option: Yes! + Ja! + Ja! + feedback: Godt klaret! + - option: Ja! feedback: There are two echo commands - option: |- - Are you ready to go to level 2? - Yes! + Er du klar til at gå videre til niveau 2? + Ja! feedback: There are two echo commands hint: Let's go! correct_answer: B @@ -226,22 +210,22 @@ levels: mp_choice_options: - option: |- ``` - name {is} {ask} What is your name? + navn {is} {ask} Hvad hedder du? ``` feedback: Super! - option: |- ``` - {ask} {is} name What is your name + {ask} {is} navn Hvad hedder du ``` feedback: The words are right, the order is not! - option: |- ``` - {ask} What is your name? + {ask} Hvad hedder du? ``` feedback: This worked in level 1, but in level 2 and up it works differently. - option: |- ``` - {ask} What is your name? {is} name + {ask} Hvad hedder du? {is} navn ``` feedback: The words are right, the order isn't! hint: '`{ask}` doesn''t work like in level 1' @@ -303,24 +287,16 @@ levels: {print} Hedy! mp_choice_options: - option: |- - ``` - {sleep} - ``` + `{sleep}` feedback: Perfect! - option: |- - ``` - {echo} - ``` + `{echo}` feedback: There is nothing to repeat back here - option: |- - ``` - {print} - ``` + `{print}` feedback: There is no text there to `{print}` there - option: |- - ``` - {ask} - ``` + `{ask}` feedback: There is no question there to be asked hint: Pause for dramatic effect... correct_answer: A @@ -363,22 +339,22 @@ levels: mp_choice_options: - option: |- ``` - age {ask} {is} How old are you? + alder {ask} {is} Hvor gammel er du? ``` feedback: That is the wrong order - option: |- ``` - {ask} {is} age How old are you? + {ask} {is} alder Hvor gammel er du? ``` feedback: That is the wrong order - option: |- ``` - age {is} {ask} How old are you? + alder {is} {ask} Hvor gammel er du? ``` feedback: You get it! - option: |- ``` - age {is} How old are you? + alder {is} Hvor gammel er du? ``` feedback: Where is the `{ask}` command? hint: The variable name should come first @@ -416,12 +392,12 @@ levels: feedback: You want to know the favorite flavor! - option: |- ``` - {print} strawberries + {print} jordbær ``` feedback: You do not want a `{print}` command at the middle of the line... - option: |- ``` - strawberries, chocolate, vanilla + jordbær, chokolade, vanilje ``` feedback: This way you are making a list. You don't want that now. - option: |- @@ -437,19 +413,13 @@ levels: question_text: What command do you use to let Hedy pick something arbitrarily? mp_choice_options: - option: |- - ``` - {print} - ``` + `{print}` feedback: '`{print}` is used to print text' - option: |- - ``` - {ask} - ``` + `{ask}` feedback: '`{ask}` is used to ask a question' - option: |- - ``` - {is} - ``` + `{is}` feedback: '`{is}` is used to make a list' - option: |- ``` @@ -489,7 +459,7 @@ levels: feedback: You're almost there. The order of the words isn't right yet. - option: |- ``` - {print} rock {at} {random} + {print} sten {at} {random} ``` feedback: you don't always want the Hedy to {print} rock, sometimes you want scissors or paper. - option: |- @@ -510,17 +480,17 @@ levels: mp_choice_options: - option: |- ``` - {print} price + {print} pris ``` feedback: You don't want to `{print}` the word price, but you want to `{print}` one price out of your list `{at} {random}` - option: |- ``` - {print} prices {at} {random} + {print} priser {at} {random} ``` feedback: Great! You've really paid attention. - option: |- ``` - {print} {at} {random} price + {print} {at} {random} pris ``` feedback: '`{at} {random}` is placed behind the variable.' - option: Nothing, this code is alright. @@ -880,24 +850,16 @@ levels: _?_ {print} 'My lucky number is 5!' mp_choice_options: - option: |- - ``` - {print} - ``` + `{print}` feedback: There already is a `{print}` command. - option: |- - ``` - {if} - ``` + `{if}` feedback: The `{if}` command is used in the line above. - option: |- - ``` - {sleep} - ``` + `{sleep}` feedback: That's not it! - option: |- - ``` - {else} - ``` + `{else}` feedback: That's right! hint: Which one goes together with the `{if}` command? correct_answer: D @@ -1014,24 +976,16 @@ levels: {else} _?_ 'Unfortunately... No big money for you.' mp_choice_options: - option: |- - ``` - {if} - ``` + `{if}` feedback: '`{if}` is in the line above.' - option: |- - ``` - {at} {random} - ``` + `{at}` `{random}` feedback: No, you don't need `{at} {random}`. - option: |- - ``` - {else} - ``` + `{else}` feedback: There already is an `{else}` command - option: |- - ``` - {print} - ``` + `{print}` feedback: Awesome! hint: After `{else}` a `{print}` command follows correct_answer: D @@ -1045,23 +999,19 @@ levels: mp_choice_options: - option: |- ``` - favorite animal + yndlingsdyr ``` feedback: That's not the variable name. - option: |- ``` - animal + dyr ``` feedback: Great job! - option: |- - ``` - {if} - ``` + `{if}` feedback: '`{if}` is already there' - option: |- - ``` - {print} - ``` + `{print}` feedback: No, that's not it. hint: What the variable name? correct_answer: B @@ -1314,22 +1264,22 @@ levels: mp_choice_options: - option: |- ``` - {print} 100 {times} 'hello' + {print} 100 {times} 'hej' ``` feedback: '`{repeat}` 100 `{times}` `{print}` ''hello''' - option: |- ``` - {print} {repeat} 100 {times} 'hello' + {print} {repeat} 100 {times} 'hej' ``` feedback: '{repeat} 100 {times} {print} ''hello''' - option: |- ``` - {repeat} 'hello' 100 {times} + {repeat} 'hej' 100 {times} ``` feedback: '{repeat} 100 {times} {print} ''hello''' - option: |- ``` - {repeat} 100 {times} {print} 'hello' + {repeat} 100 {times} {print} 'hej' ``` feedback: That's right! hint: First the repeat command, then the `{print}` command @@ -1362,19 +1312,13 @@ levels: ``` feedback: That's right! - option: |- - ``` - {print} - ``` + `{print}` feedback: '`{print}` is spelled correctly' - option: |- - ``` - {repeat} - ``` + `{repeat}` feedback: '`{repeat}` is spelled correctly' - option: |- - ``` - {times} - ``` + `{times}` feedback: '`{times}` is spelled correctly' hint: I'm is wrong, you can't use apostrophes correct_answer: A @@ -1507,7 +1451,7 @@ levels: - option: |- ``` {print} 'Batman was flying through Gotham. ' - {print} 'When suddenly he heard someone screaming...' + {print} 'When suddenly he heard someone screaming!' {print} 'Help!' {repeat} 3 {times} {print} 'Please help me!' ``` @@ -1515,7 +1459,7 @@ levels: - option: |- ``` {print} 'Batman was flying through Gotham.' - {print} 'When suddenly he heard someone screaming...' + {print} 'When suddenly he heard someone screaming!' {repeat} 3 {times} 'Help!' {print} 'Please help me!' ``` @@ -1523,7 +1467,7 @@ levels: - option: |- ``` {print} Batman was flying through Gotham. - {print} When suddenly he heard someone screaming... + {print} When suddenly he heard someone screaming! {repeat} 3 {times} {print} Help! {print} Please help me! ``` @@ -1531,7 +1475,7 @@ levels: - option: |- ``` {print} 'Batman was flying through Gotham.' - {print} 'When suddenly he heard someone screaming...' + {print} 'When suddenly he heard someone screaming!' {repeat} 3 {times} {print} 'Help!' {print} 'Please help me!' ``` @@ -1570,7 +1514,7 @@ levels: - option: |- ``` {repeat} 4 {times} 'if youre happy and you know it' - {repeat} 2 times 'clap your hands' + {repeat} 2 {times} 'clap your hands' {print} 'and you really want to show it' {print} 'clap your hands' ``` @@ -1587,25 +1531,25 @@ levels: {print} 'Im Hedy!' mp_choice_options: - option: |- - Hello - Im Hedy! + Hej + Jeg hedder Hedy! feedback: Everything is printed twice. - option: |- - Hello - Hello - Im Hedy + Hej + Hej + Jeg hedder Hedy feedback: The second line is repeated twice as well. - option: |- - Hello - Im Hedy! - Hello - Im Hedy! + Hej + Jeg hedder Hedy! + Hej + Jeg hedder Hedy! feedback: Super! - option: |- - Hello - Hello - Im Hedy! - Im Hedy! + Hej + Hej + Jeg hedder Hedy! + Jeg hedder Hedy! feedback: Everything is printed twice hint: Both lines are repeated twice. correct_answer: C @@ -1744,7 +1688,7 @@ levels: Welcome to restaurant Hedy Pancakes Pancakes - feedback: Well done! + feedback: Godt klaret! hint: The first sentence and question will not be repeated correct_answer: D question_score: '10' @@ -1983,24 +1927,24 @@ levels: mp_choice_options: - option: |- ``` - desert = {ask} 'What is your favorite type of desert?' - {if} desert {is} icecream + dessert = {ask} 'What is your favorite type of dessert?' + {if} dessert {is} icecream {repeat} 3 {times} {print} 'Icecream is the best!' ``` feedback: Don't forget the indentation after `{repeat}` commands. - option: |- ``` - desert = {ask} 'What is your favorite type of desert?' - {if} desert {is} icecream + dessert = {ask} 'What is your favorite type of dessert?' + {if} dessert {is} icecream {repeat} 3 {times} {print} 'Icecream is the best!' ``` feedback: Use indentation after an `{if}` command - option: |- ``` - desert = {ask} 'What is your favorite type of desert?' - {if} desert {is} icecream + dessert = {ask} 'What is your favorite type of dessert?' + {if} dessert {is} icecream {repeat} 3 {times} {print} 'Icecream is the best!' ``` @@ -2008,8 +1952,8 @@ levels: - option: |- ``` {repeat} 3 {times} - desert = {ask} 'What is your favorite type of desert?' - {if} desert {is} icecream + dessert = {ask} 'What is your favorite type of dessert?' + {if} dessert {is} icecream {repeat} 3 {times} {print} 'Icecream is the best!' ``` @@ -2044,7 +1988,7 @@ levels: {if} food {is} pizza {if} size {is} medium {if} drink {is} coke - price = price - 2 + price = price - 5 ``` feedback: Amazing! - option: |- @@ -2052,7 +1996,7 @@ levels: {if} food {is} pizza {if} size {is} medium {if} drink {is} coke - price = price - 2 + price = price - 5 ``` feedback: Try again! - option: |- @@ -2060,7 +2004,7 @@ levels: {if} food {is} pizza {if} size {is} medium {if} drink {is} coke - price = price - 2 + price = price - 5 ``` feedback: Try again - option: |- @@ -2068,7 +2012,7 @@ levels: {if} food {is} pizza {if} size {is} medium {if} drink {is} coke - price = price - 2 + price = price - 5 ``` feedback: Try again hint: After each `{if}` command, the line below should indent @@ -2317,7 +2261,7 @@ levels: feedback: You want each name printed. So the first word should not be names but... - option: |- ``` - 'people gets a colors shirt' + people ' gets a colors shirt' ``` feedback: There is no variable named people.. hint: Mind the quotation marks and the names of the variables @@ -2376,19 +2320,13 @@ levels: ``` feedback: 'No' - option: |- - ``` - {range} - ``` + `{range}` feedback: Correct - option: |- - ``` - {if} - ``` + `{if}` feedback: 'No' - option: |- - ``` - {for} - ``` + `{for}` feedback: 'No' hint: What did you learn in this level? correct_answer: B @@ -2654,7 +2592,7 @@ levels: - option: 3.5 + 1.5 feedback: This is not the one! - option: |- - thee and a half plus one and a half is... + three and a half plus one and a half is... five feedback: Take a close look at the second line... - option: |- @@ -2704,7 +2642,7 @@ levels: feedback: Correct! - option: The quotation marks aren't used correctly in line 2 feedback: That's not true - - option: You can't use the = sign when using an ask command + - option: You can't use the = sign when using an {ask} command feedback: That's not true - option: Nothing is wrong. feedback: That's not true @@ -2719,11 +2657,11 @@ levels: if category = high heels print High heels are 50% off now! mp_choice_options: - - option: Line 1 and 2 + - option: Linje 1 og 2 feedback: 'No' - - option: Line 1, 2 and 3 + - option: Linje 1, 2 og 3 feedback: 'No' - - option: Line 1, 2 and 4 + - option: Linje 1, 2 og 4 feedback: 'No' - option: All of the lines feedback: Perfect! @@ -2757,7 +2695,7 @@ levels: correct_answer: B question_score: '10' 6: - question_text: Which line should be filled in at the ??? + question_text: Which line should be filled in at the `_`? code: |- print 'Welcome to McHedy!' order = ask 'Would you like a hamburger or fries?' @@ -2861,10 +2799,10 @@ levels: correct_answer: B question_score: '10' 9: - question_text: Which code should be filled in in line 1 at the ??? + question_text: Which code should be filled in in line 1 at the `_`? code: |- - ??? - print 'You won ' prices at random '!' + _ + {print} 'You won ' prizes {at} {random} '!' mp_choice_options: - option: |- ``` @@ -2890,16 +2828,16 @@ levels: correct_answer: C question_score: '10' 10: - question_text: Which line of code should be filled in at the ??? to complete the song ? + question_text: Which line of code should be filled in at the `_` to complete the song ? code: |- actions = 'clap your hands', 'stomp your feet', 'shout Hurray!' - ??? - for i in range 0 to 1 - print 'if youre happy and you know it' - print action - print 'if youre happy and you know it and you really want to show it' - print 'if youre happy and you know it' - print action + _ + {for} i {in} {range} 0 {to} 1 + {print} 'if youre happy and you know it' + {print} action + {print} 'if youre happy and you know it and you really want to show it' + {print} 'if youre happy and you know it' + {print} action mp_choice_options: - option: for i in range 1 to 3 feedback: This is a hard one! All the actions on the list must be in the song. @@ -2960,7 +2898,7 @@ levels: feedback: You don't have to be vegan and muslim - option: or feedback: Great thinking! - - option: + + - option: '`+`' feedback: 'No' - option: print feedback: 'No' @@ -3006,8 +2944,8 @@ levels: 5: question_text: Which statement is true about this code? code: |- - if name = 'Cinderella' and shoe_size = 38 - print 'You are my one true love!' + {if} name = 'Cinderella' {and} shoe_size = 38 + {print} 'You are my one true love!' mp_choice_options: - option: Every person with shoe size 38 is this prince's one true love feedback: The prince is a little more picky than that! @@ -3133,13 +3071,13 @@ levels: ``` feedback: Correct! - option: |- - Line 3 should be: + Line 3 should be: ``` {if} chocolate = 'no' {and} sprinkles = 'no' ``` feedback: This is not what I ordered! - option: |- - Line 5 should be: + Line 5 should be: ``` {if} chocolate = 'yes' {and} sprinkles = 'yes' ``` @@ -3230,7 +3168,7 @@ levels: feedback: That's not it - option: '`<` and `>=`' feedback: You are right - - option: '`+` and `==`' + - option: '`+` og `==`' hint: There are 130 people allowed in the club correct_answer: C question_score: '10' @@ -3241,7 +3179,7 @@ levels: price = 10 money = {ask} How much money do you have? buy = {ask} 'Would you like to buy this teddy bear?' - {if} money >= price and buy == 'yes' + {if} money >= price {and} buy == 'yes' {print} 'You can buy the bear!' {else} {print} 'You cannot buy this bear!' @@ -3262,7 +3200,7 @@ levels: code: |- age = {ask} 'How old are you?' ticket = {ask} 'Do you have a ticket?' - {if} age _ and ticket == 'yes' + {if} age _ {and} ticket == 'yes' {print} 'You can enter the movie theater.' {else} {print} 'You are not allowed to come in!' @@ -3282,7 +3220,7 @@ levels: question_text: How many times do you have to say you are annoyed before this annoying game stops? code: |- lives = 2 - {repeat} 10 times + {repeat} 10 {times} {if} lives != 0 answer = {ask} 'Are you annoyed yet?' {if} answer == 'yes' @@ -3338,14 +3276,14 @@ levels: {print} 'Enjoy the ride' mp_choice_options: - option: You must be taller than 120 cm to go on the roller coaster - feedback: True! + feedback: Det er sandt! - option: You must be taller than 119 cm to go on the roller coaster feedback: If you are 120 cm you won't get in - option: You must be shorter than 120 cm to go on the roller coaster - feedback: '> means greater than' + feedback: '> betyder større end' - option: There are no length restrictions to go on the roller coaster feedback: There are. - hint: '> means greater than' + hint: '> betyder større end' correct_answer: A question_score: '10' 9: @@ -3354,7 +3292,7 @@ levels: chocolate = {ask} 'How many pieces of chocolate have you eaten?' {if} chocolate <= 2 {print} 'That is a healthy amount' - {if} chocolate > 2 and chocolate =< 8 + {if} chocolate > 2 {and} chocolate =< 8 {print} 'That is a bit much' {if} chocolate > 8 {print} 'You will get a stomach ache!' @@ -3393,9 +3331,9 @@ levels: question_text: 'Which symbol should be used on the blank? Tip: You must keep guessing until you get it right.' code: |- answer = 0 - while answer _ 'Amsterdam' - answer = ask 'What is the capital city of the Netherlands?' - print 'You have given the correct answer' + {while} answer _ 'Amsterdam' + answer = {ask} 'What is the capital city of the Netherlands?' + {print} 'You have given the correct answer' mp_choice_options: - option: '`=!`' feedback: That is not right. @@ -3437,8 +3375,8 @@ levels: 3: question_text: Which command should be filled in on the two blanks? code: |- - _ age >= 18 - print 'you are not allowed in this bar' + _ age < 18 + {print} 'you are not allowed in this bar' mp_choice_options: - option: '`{in}`' feedback: That's not it @@ -3455,14 +3393,14 @@ levels: question_text: What's wrong with this code? code: |- options = 1, 2, 3, 4, 5, 6 - print 'Throw 6 as fast as you can!' + {print} 'Throw 6 as fast as you can!' thrown = 0 tries = 0 - while thrown == 6 - thrown = options at random - print 'You threw ' thrown + {while} thrown == 6 + thrown = options {at} {random} + {print} 'You threw ' thrown tries = tries + 1 - print 'Yes! You have thrown 6 in ' tries ' tries.' + {print} 'Yes! You have thrown 6 in ' tries ' tries.' mp_choice_options: - option: In line 1 == should be used instead of = feedback: No that's not it @@ -3479,13 +3417,13 @@ levels: question_text: What should be placed on the blank to make this program work correctly? code: |- wetness = 10 - while wetness != 0 - print 'Your hair is still wet, hair dryer on!' - sleep 1 - clear + {while} wetness != 0 + {print} 'Your hair is still wet, hair dryer on!' + {sleep} 1 + {clear} wetness _ - print 'All dry!' + {print} 'All dry!' mp_choice_options: - option: = wetness feedback: That will not change anything @@ -3504,8 +3442,8 @@ levels: lives = 100 {while} lives != 0 answer = {ask} 'Are you annoyed yet?' - {if} answer == 'yes' - lives = lives - 1 + {if} answer == 'yes' + lives = lives - 1 mp_choice_options: - option: while should be if feedback: No that is not right @@ -3564,16 +3502,16 @@ levels: feedback: It only sprays when you're in there. - option: The lights will always stay on. feedback: That wouldn't be right. - hint: The block after the while command keeps happening while the toilet is occupied. + hint: The block after the {while} command keeps happening while the toilet is occupied. correct_answer: B question_score: '10' 9: question_text: What will the diet app say if you have eaten 1600 calories today? code: |- - chocolate = {ask} 'How many calories have you eaten today?' + calories = {ask} 'How many calories have you eaten today?' {while} calories <= 1000 {print} 'You could eat some more' - {while} calories > 1000 and calories =< 2000 + {while} calories > 1000 {and} calories =< 2000 {print} 'That is alright' {while} calories > 2000 {print} 'You have had enough for today' @@ -3978,7 +3916,7 @@ levels: 🦔 🦔 ``` - feedback: Well done! + feedback: Godt klaret! - option: |- ``` 🦔 @@ -4042,7 +3980,7 @@ levels: 79 97 ``` - feedback: Well done! + feedback: Godt klaret! - option: |- ``` another number @@ -4162,7 +4100,7 @@ levels: - option: In the `{for}` command `insect` should be `insects`. feedback: Not true. - option: Nothing! - feedback: Well done! + feedback: Godt klaret! - option: There is an indentation mistake in the last line. feedback: Nope. hint: Read the code carefully. @@ -4210,7 +4148,7 @@ levels: - option: The `{if}` command is not used correctly. feedback: Not true. - option: Line 3 should be `volume_room = number * number * number`. - feedback: Well done! + feedback: Godt klaret! - option: There is an indentation mistake in the last line. feedback: Nope. hint: Read the code carefully. diff --git a/content/slides/da.yaml b/content/slides/da.yaml index fa5f0ab8d6b..f3b12f4e62b 100644 --- a/content/slides/da.yaml +++ b/content/slides/da.yaml @@ -38,7 +38,7 @@ levels: code: '{print} Welcome to Hedy!' 8: header: Programming in Hedy - text: Output appears on the left-hand side. + text: Output appears on the right-hand side. code: '{print} Welcome to Hedy!' 9: header: Programming in Hedy @@ -63,22 +63,21 @@ levels: 3: header: 'Hedy level 1: {ask}' text: |- - The second code that you can use in level 1 is `{ask}`. + You can change the text after the print command to whatever you want. - `{ask}` is used to ask a question that can be answered. + Or you could print multiple lines by adding another line of code that also starts with `{print}`. code: |- - {print} Welcome to your own rock scissors paper! - {ask} What will you choose? + {print} Welcome to Hedy! + {print} Start programming now! 4: header: 'Hedy level 1: {echo}' text: |- - The final text code that you can use in level 1 is `{echo}`. + The second code that you can use in level 1 is `{ask}`. - `{echo}` is used to repeat the answer of an `{ask}`. + `{ask}` is used to ask a question that can be answered. code: |- - {print} Hello! - {ask} What is your name? - {echo} hello + {print} Welcome to your own rock scissors paper! + {ask} What will you choose? 5: header: Programming! text: |- @@ -90,19 +89,19 @@ levels: {echo} hello 6: header: Programming! - text: Adventures are shown in tabs. + text: "With `{print}`, `{ask}` and `{echo}` you can already create a little story.\nThis is a good time to try the Parrot, Story and Rock, Paper Scissors adventures." editor: /hedy/1 7: header: Programming! - text: The yellow arrow buttons can be used to copy examples. - editor: /hedy#print_command + text: Adventures are shown in tabs. + editor: /hedy/1 8: header: Drawing with the turtle text: Now that we have seen at text codes, we will now look at drawing codes next. editor: /hedy#print_command 9: header: 'Drawing with the turtle: {forward}' - text: '`{forward}` is used to move the turtle forward.' + text: 'Now that we have seen at text codes, we will now look at drawing codes next.' 10: header: 'Drawing with the turtle: {forward}' text: '`{forward}` is used to move the turtle forward.' @@ -311,7 +310,7 @@ levels: debug: 'True' 9: header: Ready, Set, Go! - text: Enjoy the adventures in level 4! + text: "In this level you'll also learn the {clear} command.\nWith this command you can wipe all the text from your output screen.\n\nBe careful that you always use a sleep command too. If you don't the computer will wipe all the text before you can read it!" code: |- {print} '3' {clear} diff --git a/grammars/keywords-da.lark b/grammars/keywords-da.lark index 86286357c5c..df0a0dae1ad 100644 --- a/grammars/keywords-da.lark +++ b/grammars/keywords-da.lark @@ -1,16 +1,16 @@ _DEFINE: ("definer" | "define") _SPACE? -_CALL: ("call" | "call") _SPACE? -_WITH: ("with" | "with") _SPACE? +_CALL: ("kald" | "call") _SPACE? +_WITH: ("med" | "with") _SPACE? _DEF: ("def" | "def") _SPACE? -_RETURN: ("return" | "return") _SPACE? -_PRINT: ("print" | "print") _SPACE? -_PLAY: ("play" | "play") _SPACE +_RETURN: ("returner" | "return") _SPACE? +_PRINT: ("skriv" | "print") _SPACE? +_PLAY: ("spil" | "play") _SPACE _ASK: ("spørg" | "ask") _ECHO: ("ekko" | "echo") _SPACE? _FORWARD: ("fremad" | "forward") _SPACE? _TURN: ("drej" | "turn") _SPACE? -left: ("left" | "left") _SPACE? -right: ("right" | "right") _SPACE? +left: ("venstre" | "left") _SPACE? +right: ("højre" | "right") _SPACE? black: ("sort" | "black") _SPACE? blue: ("blå" | "blue") _SPACE? brown: ("brun" | "brown") _SPACE? @@ -19,36 +19,36 @@ green: ("grøn" | "green") _SPACE? orange: ("orange" | "orange") _SPACE? pink: ("lyserød" | "pink") _SPACE? purple: ("lila" | "purple") _SPACE? -red: ("red" | "red") _SPACE? -white: ("white" | "white") _SPACE? -yellow: ("yellow" | "yellow") _SPACE? -_IS: _SPACE ("is" | "is") _SPACE -_STANDALONE_IS: ("is" | "is") -_SLEEP: ("sleep" | "sleep") _SPACE? +red: ("rød" | "red") _SPACE? +white: ("hvid" | "white") _SPACE? +yellow: ("gul" | "yellow") _SPACE? +_IS: _SPACE ("er" | "is") _SPACE +_STANDALONE_IS: ("er" | "is") +_SLEEP: ("sov" | "sleep") _SPACE? _ADD_LIST: ("tilføj" | "add") _SPACE -_TO_LIST: _SPACE? ("to" | "to") -_REMOVE: ("remove" | "remove") _SPACE -_FROM: _SPACE? ("from" | "from") +_TO_LIST: _SPACE? ("til" | "to") +_REMOVE: ("fjern" | "remove") _SPACE +_FROM: _SPACE? ("fra" | "from") _AT: _SPACE ("ved" | "at") _SPACE -random: ("random" | "random") _SPACE? -_IN: _SPACE ("in" | "in") _SPACE -_NOT_IN: _SPACE ("not in" | "not in") _SPACE -_IF: ("if" | "if") _SPACE +random: ("tilfældighed" | "random") _SPACE? +_IN: _SPACE ("i" | "in") _SPACE +_NOT_IN: _SPACE ("ikke i" | "not in") _SPACE +_IF: ("hvis" | "if") _SPACE _ELSE: "ellers" | "else" _AND: _SPACE? ("og" | "and") _SPACE -_REPEAT: ("repeat" | "repeat") _SPACE -_TIMES: _SPACE ("times" | "times") +_REPEAT: ("gentag" | "repeat") _SPACE +_TIMES: _SPACE ("gange" | "times") _FOR: ("for" | "for") _SPACE -_RANGE: ("range" | "range") _SPACE? -_TO: _SPACE ("to" | "to") _SPACE -_STEP: "step" | "step" -_ELIF: _SPACE? ("elif" | "elif") _SPACE +_RANGE: ("interval" | "range") _SPACE? +_TO: _SPACE ("til" | "to") _SPACE +_STEP: "skridt" | "step" +_ELIF: _SPACE? ("ellers hvis" | "elif") _SPACE _INPUT: ("input" | "input") -_OR: _SPACE? ("or" | "or") _SPACE -_WHILE: ("while" | "while") _SPACE -_LENGTH: "length" | "length" +_OR: _SPACE? ("eller" | "or") _SPACE +_WHILE: ("mens" | "while") _SPACE +_LENGTH: "længde" | "length" _COLOR : ("farve" | "color") _SPACE? -_PRESSED: ("pressed" | "pressed") _SPACE? +_PRESSED: ("trykket ned" | "pressed") _SPACE? clear: ("rens" | "clear") _SPACE? -TRUE: ("true" | "True" | "true" | "True") _SPACE? -FALSE: ("false" | "False" | "false" | "False") _SPACE? +TRUE: ("sand" | "Sand" | "true" | "True") _SPACE? +FALSE: ("falsk" | "Falsk" | "false" | "False") _SPACE? diff --git a/highlighting/highlighting-trad.json b/highlighting/highlighting-trad.json index 11b2de9a0b3..e55c358a510 100644 --- a/highlighting/highlighting-trad.json +++ b/highlighting/highlighting-trad.json @@ -354,8 +354,8 @@ "DIGIT": "0123456789" }, "da": { - "False": "False", - "True": "True", + "False": "Falsk|False", + "True": "Sand|True", "add": "tilføj|add", "and": "og|and", "ask": "spørg|ask", @@ -363,53 +363,53 @@ "black": "sort|black", "blue": "blå|blue", "brown": "brun|brown", - "call": "call", + "call": "kald|call", "clear": "rens|clear", "color": "farve|color", "comma": ",", "def": "def", "define": "definer|define", "echo": "ekko|echo", - "elif": "elif", + "elif": "ellers hvis|elif", "else": "ellers|else", - "false": "false", + "false": "falsk|false", "for": "for", "forward": "fremad|forward", - "from": "from", + "from": "fra|from", "gray": "grå|gray", "green": "grøn|green", - "if": "if", - "in": "in", + "if": "hvis|if", + "in": "i|in", "input": "input", - "is": "is", - "left": "left", - "length": "length", - "not_in": "not in", - "or": "or", + "is": "er|is", + "left": "venstre|left", + "length": "længde|length", + "not_in": "ikke i|not in", + "or": "eller|or", "orange": "orange", "pink": "lyserød|pink", - "play": "play", - "pressed": "pressed", - "print": "print", + "play": "spil|play", + "pressed": "trykket ned|pressed", + "print": "skriv|print", "purple": "lila|purple", - "random": "random", - "range": "range", - "red": "red", - "remove": "remove", - "repeat": "repeat", - "return": "return", - "right": "right", - "sleep": "sleep", - "step": "step", - "times": "times", - "to": "to", - "to_list": "to", - "true": "true", + "random": "tilfældighed|random", + "range": "interval|range", + "red": "rød|red", + "remove": "fjern|remove", + "repeat": "gentag|repeat", + "return": "returner|return", + "right": "højre|right", + "sleep": "sov|sleep", + "step": "skridt|step", + "times": "gange|times", + "to": "til|to", + "to_list": "til|to", + "true": "sand|true", "turn": "drej|turn", - "while": "while", - "white": "white", - "with": "with", - "yellow": "yellow", + "while": "mens|while", + "white": "hvid|white", + "with": "med|with", + "yellow": "gul|yellow", "DIGIT": "0123456789" }, "de": { diff --git a/static/js/appbundle.js b/static/js/appbundle.js index 2fd58b62ab2..38d0e4dc8a8 100644 --- a/static/js/appbundle.js +++ b/static/js/appbundle.js @@ -60931,19 +60931,19 @@ ${o3}` : i3; "unsaved_class_changes": "There are unsaved changes, are you sure you want to leave this page?" }, "da": { - "CheckInternet": "Check whether your Internet connection is working.", - "Connection_error": "We couldn't reach the server.", - "Empty_output": "This code works but does not print anything. Add a print command to your code or use the turtle to get output.", - "Errors_found": "You made a mistake! Don't worry, Hedy is trying to find the mistakes", - "Execute_error": "Something went wrong while running the program.", - "Other_error": "Oops! Maybe we made a little mistake.", - "Program_repair": "This could be the correct code, can you fix it?", - "Program_too_long": "Your program takes too long to run.", - "ServerError": "You wrote a program we weren't expecting. If you want to help, send us an email with the level and your program at hello@hedy.org. In the meantime, try something a little different and take another look at the examples. Thanks!", - "Transpile_error": "We can't run your program.", - "Transpile_success": "Good job!\nAmazing!\nWell done!\nExcellent!\nYou did great!", - "Transpile_warning": "Warning!", - "Unsaved_Changes": "You have an unsaved program. Do you want to leave without saving it?", + "CheckInternet": "Tjek om du er forbundet til internettet.", + "Connection_error": "Vi kunne ikke n\xE5 serveren.", + "Empty_output": "Denne kode fungerer, men udskriver ikke noget. Tilf\xF8j en udskriftskommando til din kode eller brug skildpadden til at f\xE5 et output.", + "Errors_found": "Du lavede en fejl! Bare rolig, vi k\xF8rte stadig programmet", + "Execute_error": "Noget gik galt da programmet k\xF8rte.", + "Other_error": "Ups! Vi har m\xE5ske lavet en lille fejl.", + "Program_repair": "Dette kunne v\xE6re den korrekte kode; kan du l\xF8se det?", + "Program_too_long": "Dit program tager for lang tid at k\xF8re.", + "ServerError": "Du skrev et program, vi ikke havde forventet. Hvis du \xF8nsker at hj\xE6lpe, sende os en e-mail med niveauet og dit program p\xE5 hello@hedy.org. I mellemtiden, pr\xF8v at test et lidt anderledes program og tage et ekstra kig p\xE5 eksemplerne. Tak!", + "Transpile_error": "Vi kan ikke k\xF8re dit program.", + "Transpile_success": "Godt arbejde!\nFantastisk!\nGodt klaret!\nFremragende!\nFlot gjort!", + "Transpile_warning": "Advarsel!", + "Unsaved_Changes": "Dit program er ikke gemt. Vil du afslutte uden at gemme det?", "adventures_completed": "Adventures completed: {number_of_adventures}", "adventures_restored": "The default adventures have been restored!", "adventures_tried": "Adventures tried", @@ -97135,8 +97135,8 @@ def note_with_error(value, err): DIGIT: "0123456789" }; var da = { - False: "False", - True: "True", + False: "Falsk|False", + True: "Sand|True", add: "tilf\xF8j|add", and: "og|and", ask: "sp\xF8rg|ask", @@ -97144,53 +97144,53 @@ def note_with_error(value, err): black: "sort|black", blue: "bl\xE5|blue", brown: "brun|brown", - call: "call", + call: "kald|call", clear: "rens|clear", color: "farve|color", comma: ",", def: "def", define: "definer|define", echo: "ekko|echo", - elif: "elif", + elif: "ellers hvis|elif", else: "ellers|else", - false: "false", + false: "falsk|false", for: "for", forward: "fremad|forward", - from: "from", + from: "fra|from", gray: "gr\xE5|gray", green: "gr\xF8n|green", - if: "if", - in: "in", + if: "hvis|if", + in: "i|in", input: "input", - is: "is", - left: "left", - length: "length", - not_in: "not in", - or: "or", + is: "er|is", + left: "venstre|left", + length: "l\xE6ngde|length", + not_in: "ikke i|not in", + or: "eller|or", orange: "orange", pink: "lyser\xF8d|pink", - play: "play", - pressed: "pressed", - print: "print", + play: "spil|play", + pressed: "trykket ned|pressed", + print: "skriv|print", purple: "lila|purple", - random: "random", - range: "range", - red: "red", - remove: "remove", - repeat: "repeat", - return: "return", - right: "right", - sleep: "sleep", - step: "step", - times: "times", - to: "to", - to_list: "to", - true: "true", + random: "tilf\xE6ldighed|random", + range: "interval|range", + red: "r\xF8d|red", + remove: "fjern|remove", + repeat: "gentag|repeat", + return: "returner|return", + right: "h\xF8jre|right", + sleep: "sov|sleep", + step: "skridt|step", + times: "gange|times", + to: "til|to", + to_list: "til|to", + true: "sand|true", turn: "drej|turn", - while: "while", - white: "white", - with: "with", - yellow: "yellow", + while: "mens|while", + white: "hvid|white", + with: "med|with", + yellow: "gul|yellow", DIGIT: "0123456789" }; var de = { diff --git a/static/js/appbundle.js.map b/static/js/appbundle.js.map index 939218568d5..35f97421d20 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", "utils.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", "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(/