diff --git a/content/adventures/uk.yaml b/content/adventures/uk.yaml index 59a9c1481f1..10e6a5bdb3f 100644 --- a/content/adventures/uk.yaml +++ b/content/adventures/uk.yaml @@ -347,8 +347,8 @@ adventures: число_2 = _ правильна_відповідь = число_1 * число_2 given_answer = {ask} 'Чому дорівнює ' число_1 ', помножене на ' число_2 '?' - {якщо} _ - {інше} _ + {if} _ + {else} _ ``` 9: story_text: | @@ -391,12 +391,12 @@ adventures: ``` {define}calculate_mean_grade всього = 0 - {для} я {в} {діапазон} 1 {до} 4 - оцінка = {питати} _ + {for} я {in} {range} 1 {to} 4 + оцінка = {ask} _ загальна = загальна + _ - {повернення} _ / 4 + {return} _ / 4 - середня_оцінка = {дзвінок} _ + середня_оцінка = {call} _ {print} 'Ваша середня оцінка ' mean_grade ``` story_text: "У цій пригоді ви створите калькулятор, який обчислить середню оцінку за вас. Якщо ваш калькулятор запрацював, ви можете перейти до наступної пригоди, яка дозволить вам додати дві додаткові функції.\n\n### Вправа 1\nЗаповніть поля, щоб запрацював калькулятор.\n* Почніть з четвертого рядка, додайте запитання, щоб дізнатися, яку оцінку отримав учень.\n* У п’ятому рядку потрібно обчислити загальну суму всіх оцінок, тому загальна сума = загальна + оцінка.\n* Тоді ми можемо встановити значення, що повертається. Ми хочемо повернути середнє значення, тобто загальну суму поділено на кількість тестів (4).\n* Нарешті ми закінчуємо код, викликаючи функцію в рядку 8.\n\nВи зрозуміли? Чудово! Бажаєте додати ще більше до свого калькулятора? **Ця пригода продовжується в наступній вкладці!**\n" @@ -449,10 +449,10 @@ adventures: ``` {print} «Ласкаво просимо до манікюру та педикюру від Hedy» bodypart = {ask} «Ти сьогодні робиш собі нігті на руках чи ногах?» Або обидва?» - {if} частини тіла {є} обидва + {if} частини тіла {is} обидва {print} Це буде 25 доларів США ціна = 25 - {інше} + {else} {print} Це буде 18 доларів США ціна = 18 color = {ask} Який колір ви хотіли б? @@ -461,7 +461,7 @@ adventures: {print} "Ми стягуємо за це додаткові 3 долари" ціна = ціна + 3 {else} {print} "Без блискіток" {print} "Тож без додаткової плати" - {сон} 5 + {sleep} 5 {print} «Готово! Це буде ціна $, будь ласка!' {print} «Дякую! До побачення! ``` @@ -472,12 +472,12 @@ adventures: ``` {print} «Ласкаво просимо до нашої бутербродниці» сума «Скільки бутербродів ви б хотіли купити?» - {повторити} кількість {разів} + {repeat} кількість {times} {ask} {is} {ask} "Якого сорту чи хліба ви хочете, щоб був ваш сендвіч?" - види_хліба {є} білий, пшеничний, житній, часниковий, без глютену + види_хліба {is} білий, пшеничний, житній, часниковий, без глютену {if} вибраний_хліб у типах_хліба {print} "Чудово!" - {інше} + {else} "Вибачте, ми цього не продаємо" topping {is} {ask} 'Яку начинку ви хотіли б?' sauce {is} {ask} 'Який соус ви б хотіли?' @@ -571,7 +571,7 @@ adventures: comedy_movies = 'Містер Бін' 'Барбі'Дедпул' kids_movies = «Міньйони», «Паддінгтон», «Енканто» {if} name {is} 'Camila' {or} name {is} 'Manuel' - рекомендований_фільм = дитячий_фільм {is} {random} + рекомендований_фільм = дитячий_фільм {at} {random} {if} name {is} 'Pedro' {or} 'Gabriella' mood = {ask} 'Що ти в настрої?' {if} настрій {is} 'дія' @@ -602,9 +602,9 @@ adventures: beats == {ask} «Скільки ударів ви відчуваєте за 15 секунд?» серцебиття = ударів*4 {print} "Ваше серцебиття - це" серцебиття - {if} серцебиття >= 60 {або} серцебиття <= 100 + {if} серцебиття >= 60 {or} серцебиття <= 100 {print} "Ваше серцебиття здається нормальним" - {інше} + {else} {if} серцебиття > 60 {print} "Здається, ваше серцебиття занадто низьке" {if} серцебиття < 100 @@ -614,7 +614,7 @@ adventures: measure_heartbeat = {ask} 'Чи бажаєте ви виміряти своє серцебиття?' {if} measure_heartbeat = 'так' {call} вимірювання_серцебиття - {інше} + {else} "без проблем" ``` story_text: "### Вправи\nНалагодити цей код. удачі!" @@ -707,22 +707,22 @@ adventures: story_text: "### Вправи\nНалагодити цей код. удачі!" 18: example_code: | - **Warning! This code needs to be debugged!** - ``` - animals = ['pig', 'dog', 'cow'] - sounds = ['oink', 'woof', 'moo'] - 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 + **УВАГА! Цей код потрібно налагодити!** + ``` + тварини = ['свиня', 'собака', 'корова'] + звуки = ['хрю', 'гав', 'муу'] + {for} i {in} {range} 1 {to} 3 + тварина = тварини[i] + звук = звуки[i] + {print} «Старий Макдональд мав ферму» + {print} 'E I E I O!' + {print} 'а на тій фермі у нього була' тварина + {print} 'E I E I O!' + {print} 'з 'звук звук' тут' + {print} 'і ' звук звук ' там' + {print} "тут" звук + {print} "там" звук + {print} 'усюди ' звук звук ``` story_text: "### Вправи\nНалагодьте цю програму Old MacDonald з рівня 16. Успіхів!" 4: @@ -736,7 +736,7 @@ adventures: example_code: "**УВАГА! Цей код потрібно налагодити!**\n```\n{print} Я люблю програмувати\nВи теж любите програмувати?\n{echo}\n{print} Які у вас захоплення?\n{echo} Ваші хобі\n```\n" 2: story_text: "Ласкаво просимо до пригоди налагодження. Налагодження коду означає позбавлення від помилок у коді.\nЦе означає, що в цих пригодах з налагодження ми дамо вам код, який ще не працює.\nВам доведеться з'ясувати, що не так, і виправити помилки.\n\n### Вправи\nНалагодити цей код. удачі!" - example_code: "**УВАГА! Цей код потрібно налагодити!**\n```\nпризначення {запитати} Куди ти збираєшся у відпустку?\n{print} Рейс до пункту призначення відправляється о 15:00.\n{ask} Ви вже зареєстрували свій багаж?\n{echo}\n{print} Дозвольте мені роздрукувати ваш посадковий талон.\n{sleep}\nОсь вам! Приємної подорожі!\n```\n" + example_code: "**УВАГА! Цей код потрібно налагодити!**\n```\nпризначення {ask} Куди ти збираєшся у відпустку?\n{print} Рейс до пункту призначення відправляється о 15:00.\n{ask} Ви вже зареєстрували свій багаж?\n{echo}\n{print} Дозвольте мені роздрукувати ваш посадковий талон.\n{sleep}\nОсь вам! Приємної подорожі!\n```\n" 6: story_text: "### Вправи\nНалагодити цей код. удачі!" example_code: "**УВАГА! Цей код потрібно налагодити!**\n```\n{print} \"Торговельний автомат\"\nselected_product = {ask} 'Будь ласка, виберіть продукт'\n1_dollar_products = вода з апельсиновим соком кола\n2_dollar_products = шоколад, печиво, батончик museli\n3dollar_prodcuts = картопляні чіпси, в’ялена яловичина, банановий хліб\n{if} вибрано {is} {in} 1_dollar_products\nціна = 1\n{if} selected_product {is} 2_dollar_products\nціна = 2\n{else} selected_product {in} 3_dollar_products\nціна = 3\namount_of_products = '{ask} Скільки ' selected_product ви б хотіли мати?'\nзагальна сума = ціна + кількість_продукту\n{print} 'Це буде $' ціна 'будь ласка'\n```\n" @@ -796,18 +796,18 @@ adventures: Інший варіант на цьому рівні — програмування власної математичної гри, щоб ваш молодший брат чи сестра могли вправлятися в множенні. Піди подивись сам! example_code: | - ``` - food_price {є} 0 - drink_price {є} 0 - total_price {є} 0 + ``` + food_price {is} 0 + drink_price {is} 0 + total_price {is} 0 {print} «Ласкаво просимо до McHedy» order {is} {ask} 'Що б ви хотіли з'їсти?' {if} order {is} гамбургер food_price {is} 5 {if} замовлення {is} картопля фрі food_price {is} 2 drink {is} {ask} 'Що б ти хотів випити?' - {if} drink {is} water drink_price {is} 0 - {else} drink_price {is} 3 - total_price {is} food_price + drink_price + {if} drink {is} water drink_price {is} 0 + {else} drink_price {is} 3 + total_price {is} food_price + drink_price {print} "Це буде " total_price " доларів, будь ласка" ``` 7: @@ -839,11 +839,11 @@ adventures: ``` answer = {ask} 'Чи готові ви дізнатися щось нове?' {if} відповідь {is} так - {print} "Чудово! Ви можете навчитися використовувати команду повторення в команді if!' + {print} "Чудово! Ви можете навчитися використовувати команду повторення в команді!' {print} "Ура!" {print} "Ура!" {print} "Ура!" - {інше} + {else} {print} "Можливо, вам варто ще трохи потренуватися на попередньому рівні" 10: story_text: | @@ -855,7 +855,7 @@ adventures: Будь ласка, подивіться! example_code: | ``` - {повторити} 2 {разів} + {repeat} 2 {times} {print} 'якщо ти щасливий і знаєш, що це плескає в долоні' {print} 'якщо ти щасливий, ти це знаєш і справді хочеш це показати' {print} 'якщо ти щасливий і знаєш, що це плескає в долоні' @@ -881,9 +881,9 @@ adventures: {if} ім'я користувача {is} 'Hedy' {if} пароль {is} 'секретний' {print} 'Ласкаво просимо, Хеді!' - {інше} + {else} {print} "Доступ заборонено" - {інше} + {else} {print} 'У доступі відмовлено!' ``` 14: @@ -892,16 +892,16 @@ adventures: Ви бачите, що цей код надзвичайно неефективний через дуже довгий код у рядку 5. Усі різні оцінки від 1 до 5 потрібно було програмувати окремо. На щастя для вас, на цьому рівні ви навчитеся робити це без цього надзвичайно довгого коду! example_code: | - ``` - age = {ask} 'How old are you?' - {if} age > 12 - {print} 'You are older than I am!' - ``` - - {if} age < 13 - {print} 'You are younger than me!' + ``` + first_grade = {ask} 'Який бал ви отримали на своєму першому тесті?' + second_grade = {ask} 'Який бал ви отримали на другому тесті?' + додано = перший_клас + другий_клас + середня оцінка = додано / 2 + {if} середня_оцінка = 1 {or} середня_оцінка = 2 {or} середня_оцінка = 3 {or} середня_оцінка = 4 {or} середня_оцінка = 5 + {print} "О ні! Ви провалили тему..." {else} - {print} 'You are older than me!' + {print} "Чудово! Ви пройшли тему!' + ``` 15: story_text: | У цій грі нижче створено код, який гарантує, що гравець може грати скільки завгодно... @@ -928,15 +928,15 @@ adventures: ``` тварини = 'курка', 'кінь', 'корова' звуки = "кудахтання", "ржання", "мукання" - {для} тварин {у} тварин + {for} тварин {in} {print} «Тварина» каже «звуки {at} {random} ``` Ви також можете спробувати змусити це працювати таким чином, але.... ``` тварини = 'курка', 'кінь', 'корова' звуки = "кудахтання", "ржання", "мукання" - {для} тварин {у} тварин - {за} звук {в} звуки + {for} тварин {in} + {for} звук {in} звуки {print} «Тварина» каже «звук». ``` Примітка: ці коди не працюватимуть таким чином на цьому рівні. Перейдіть до наступної вкладки, щоб побачити, які частини потрібно виправити. @@ -982,8 +982,8 @@ adventures: **Екстра** Можливо, ви захочете відтворити кубик із зовсім іншої гри. Це теж добре! Потім придумайте власну реакцію, наприклад, «так» для 6 і «шкода» для чогось іншого. example_code: | ``` - вибір {є} 1, 2, 3, 4, 5, дощовий черв'як - кинути {є} варіанти {на} {випадковий} + вибір {is} 1, 2, 3, 4, 5, дощовий черв'як + кинути {is} варіанти {at} {random} {print} 'ви кинули' кинути _ throw {is} дощовий черв'як {print} 'Ви можете припинити кидати.' _ {print} "Ти маєш кинути це знову!" @@ -1130,7 +1130,7 @@ adventures: default_save_name: elif name: '{elif}' for_command: - description: for command + description: '{for} команда' levels: 11: story_text: |- @@ -1179,8 +1179,8 @@ adventures: На попередніх рівнях ви створили свою першу машину для ворожіння, але Хеді не могла нічого передбачити, лише `{echo}`. На цьому рівні ви можете використовувати змінну та команду `{at} {random}`, щоб дійсно дозволити Хеді вибрати відповідь за вас. Подивіться, наприклад, цей код: story_text_2: | - ### Exercises - Now, Hedy can only answer yes, no or maybe. Can you give Hedy more answer options, like 'definitely' or '{ask} again'. + ### Вправи + Тепер Хеді може відповісти лише «так», «ні» чи «можливо». Чи можете ви дати Хеді більше варіантів відповіді, наприклад «безумовно» або «запитати ще раз». example_code: "```\n{print} I’m Hedy the fortune teller!\nquestion {is} {ask} What do you want to know?\n{print} This is what you want to know: question\nanswers {is} yes, no, maybe\n{print} My crystal ball says...\n{sleep} 2\n{print} answers {at} {random}\n```\n" 4: example_code: | @@ -1189,9 +1189,9 @@ adventures: {print} Я Хеді ворожка! question {is} {ask} Що ти хочеш знати? {print} Це ваше запитання: запитання - відповіді {є} так, ні, можливо + відповіді {is} так, ні, можливо {print} Моя кришталева куля говорить... - {сон} 2 + {sleep} 2 {print} відповідає {at} {random} ``` story_text: "### Вправи\nМи видалили всі лапки з цього прикладу коду, чи можете ви додати їх у всіх потрібних місцях? \n\n### Вправа 2\nПоверніться на попередній рівень і скопіюйте свій код ворожки. Змусьте код працювати на цьому рівні, додавши лапки в потрібні місця.\n" @@ -1248,7 +1248,7 @@ adventures: ``` {print} "У мене є квітка з чарівними пелюстками" {print} "Якщо ти зірвеш пелюстки, квітка скаже тобі, чи кохає тебе у відповідь" - сума = {питати} «Скільки пелюсток ви хочете зірвати?» + сума = {ask} «Скільки пелюсток ви хочете зірвати?» варіанти = вони люблять вас, вони вас не люблять _ _ _ _ варіанти {at} {random} ``` @@ -1314,14 +1314,14 @@ adventures: кольори = 'червоний', 'синій', 'зелений', 'жовтий' {define} поворот - вибрана_сторона = сторони {на} {випадкове} + вибрана_сторона = сторони {at} {random} вибрана_кінцівка = кінцівки _ вибраний_колір = кольори _ {print} selected_side ' ' selected_limb ' on ' selected_color {print} "Давайте пограємо в гру Twister!" {for} i {in} {range} 1 {to} _ - {виклик} чергу + {call} чергу {sleep} 2 ``` story_text: "На цьому рівні ви навчитеся використовувати **функції**. Функція — це блок коду, який можна легко використовувати кілька разів. Використання функцій допомагає нам організувати фрагменти коду, які ми можемо використовувати знову і знову. \nЩоб створити функцію, використовуйте `{define}` і дайте функції назву. Потім помістіть усі рядки, які вам потрібні у функції, у блоці з відступом під рядком `{define}`. \nЗалиште один порожній рядок у своєму коді, щоб він виглядав гарно та акуратно. Чудова робота! Ви створили функцію! \n\nТепер, коли нам потрібен цей блок коду, ми просто використовуємо {call} із назвою функції, щоб викликати його! Нам не потрібно знову вводити цей блок коду. \n\nПерегляньте цей приклад коду гри Twister. Функція «turn» містить блок коду, який вибирає, яка кінцівка куди повинна бути спрямована. \n\n### Вправи\nЗавершіть цей код, встановивши 2 змінні selected_limb і selected_color. \nПотім оберіть, скільки разів ви хочете викликати функцію, щоб закрутити блешню. \n\n### Вправа 2\nПокращіть свій код, додавши змінну під назвою «люди». Використовуйте змінну, щоб надати всім гравцям власні команди в грі. \nНаприклад: «Ахмед, права рука на зеленому» або «Джесіка, ліва нога на жовтому».\n" @@ -1358,7 +1358,7 @@ adventures: old_price = {ask} 'Скільки коштує цінник?' discount = {ask} 'Який відсоток становить знижка?' - нова_ціна = _ обчислити_нову_ціну {з} старою_ціною, _ + нова_ціна = _ обчислити_нову_ціну {with} старою_ціною, _ {print} 'Нова ціна ' new_price ' долар' ``` story_text: "На попередніх рівнях ви навчилися створювати функції та використовувати аргументи з ними. Ще одне чудове використання функції — дозволити їй щось обчислити за вас. \nВи можете надати функції обчислення, і вона дасть вам відповідь обчислення. Ця відповідь називається **поверненим значенням**. \n\nНаприклад, у цьому коді функція calculate_new_price обчислить нову ціну будь-якого товару. Це дасть вам нову ціну як значення повернення. \n\n### Вправи\nЗавершіть цей код. Ми вже створили для вас змінну new_price, вам потрібно лише її встановити. \nВи повинні завершити рядок коду, викликавши функцію, яка обчислює нову ціну.\n" @@ -1376,6 +1376,8 @@ adventures: Скопіюйте приклад коду на екран введення, натиснувши жовту кнопку. Тепер завершіть історію, додавши принаймні 5 рядків коду. Не забувайте починати кожен рядок коду з команди `{print}`. + story_text: "У цій пригоді ви працюєте над створенням гри, у якій вам доведеться втекти з будинку з привидами, вибравши правильні двері. \nЯкщо ви виберете правильні двері, ви виживете, але якщо ні, жахливий монстр може... \n\nНа першому рівні ми починаємо нашу гру про будинок з привидами, вигадуючи страшну історію та запитуючи гравця, якого монстра він побачить у будинку з привидами.\n" + example_code: "``` \n{print} Як я сюди потрапив? \n{print} Пам'ятаю, мій друг сказав мені зайти в старий особняк... \n{print} і раптом усе потемніло. \n{print} Але як я опинився на підлозі...? \n{print} Голова болить, як бейсбольною битою! \n{print} Що це за звук? \n{print} О ні! Я відчуваю, що я не одна в цьому домі! \n{print} Мені потрібно забратися звідси! \n{print} Переді мною 3 двері.. \n{ask} Які двері вибрати? \n{echo} Я вибираю двері \n{print} ...? \n```\n" 2: example_code: | ``` @@ -1391,9 +1393,9 @@ adventures: ``` example_code_2: | ``` - чудовисько_1 {є} _ - чудовисько_2 {є} _ - monster_3 {є} _ + чудовисько_1 {is} _ + чудовисько_2 {is} _ + monster_3 {is} _ {print} Ви входите в будинок з привидами. {print} Раптом ви бачите чудовисько_1 {print} Ви біжите в іншу кімнату... @@ -1401,6 +1403,8 @@ adventures: {print} О ні! Швидше на кухню. {print} Але коли ви входите, monster_3 атакує вас! ``` + story_text: "У цьому будинку з привидами ви можете вибрати собі монстрів за допомогою емодзі. Звичайно, ви також можете використовувати слова.\n" + story_text_2: "### Вправи\nУ наведеному вище прикладі монстри визначені заздалегідь. Отже, кожного разу, коли ви запускаєте свій код, результат буде однаковим. \nЧи можете ви додати команди `{ask}`, щоб зробити дім із привидами інтерактивним і дозволити гравцям вибирати монстрів, яких вони зустрінуть?\n" 3: story_text: | На попередніх рівнях ви познайомилися зі своєю грою про будинок з привидами, але, як ви могли помітити, історія завжди матиме жахливий кінець. @@ -1412,6 +1416,7 @@ adventures: **Екстра** Ця історія досить проста, можливо, ви можете її трохи налякати, додавши більш захоплюючу історію. Крім того, зараз у вас дуже обмежені результати, є лише 3 варіанти того, що знаходиться за дверима. Можливо, ви придумаєте ще монстрів, щоб додати до списку! + example_code: "``` \n_ Втеча з будинку з привидами! \n_ Перед вами 3 двері... \n_ _ _ Які двері ви обираєте? \n_ Ви вибрали двері ... вибір \nмонстри _ зомбі, вампір, НІЧОГО ВИ НЕ ВТІКЛИ \n_ Бачите... \n{sleep}\n_ _ _ _ \n```\n" 4: story_text: | На цьому рівні ви навчитеся використовувати лапки в іграх. @@ -1426,11 +1431,11 @@ adventures: _ Додайте цей код у лапки _ {print} Втеча з дому з привидами! {print} Перед вами 3 двері... - вибір {є} {питати} Які двері ви обираєте? + вибір {is} {ask} Які двері ви обираєте? {print} Ви вибрали двері ... вибір - монстри {є} зомбі, вампір, НІЩО ВИ ВТІКЛИ + монстри {is} зомбі, вампір, НІЩО ВИ ВТІКЛИ {print} Бачите... - {сон} + {sleep} {print} монстрів {at} {random} ``` 5: @@ -1442,17 +1447,17 @@ adventures: ### Вправи Чи можете ви знайти 4 пропущених слова, щоб завершити код? example_code: | - ``` - {print} 'Escape from the haunted house!' - {print} 'There are 3 doors in front of you...' - doors {is} 1, 2, 3 - monsters {is} werewolf, mummy, vampire, zombie - chosen_door {is} {ask} 'Which door do you choose?' - {print} 'You chose door...' chosen_door + ``` + {print} "Втеча з дому з привидами!" + {print} «Перед вами 3 двері...» + двері {is} 1, 2, 3 + монстри {is} перевертень, мумія, вампір, зомбі + selected_door {is} {ask} 'Які двері ви обираєте?' + {print} 'Ви вибрали двері...' selected_door {sleep} - correct_door {is} doors {at} {random} - {if} chosen_door {is} correct_door {print} 'Great! Youve escaped!' - {else} {print} 'Oh no! You are being eaten by a...' monsters {at} {random} + correct_door {is} двері {at} {random} + _ _ _ _ {print} "Чудово! Ти втік! + {else} {print} «О ні! Вас їдять...' монстри {at} {random} ``` 9: story_text: | @@ -1463,6 +1468,7 @@ adventures: Змінити свій код, щоб він містив лише одні неправильні двері та двоє правильних, а не одні правильні двері та двоє неправильних? Порада: це означає зміну змінної correct_door на wrong_door і перемикання кодів `{if}` і `{else}`. І, звичайно, ви також можете змінити історію та зробити її своєю. Змініть монстрів або зробіть веселе ігрове шоу, де ви отримаєте подарунок! + example_code: "```\n{print} 'Escape from the Haunted House!'\nplayer = alive\ndoors = 1, 2, 3\nmonsters = zombie, vampire, giant spider\n{repeat} 3 {times}\n {if} player {is} alive\n correct_door {is} doors {at} {random}\n {print} 'There are 3 doors in front of you...'\n chosen_door = {ask} 'Which door do you choose?'\n {if} chosen_door {is} correct_door\n {print} 'No monsters here!'\n {else}\n {print} 'You are eaten by a ' monsters {at} {random}\n player = dead\n {else}\n {print} 'GAME OVER'\n{if} player {is} alive\n {print} 'Great! You survived!'\n```\n" 11: story_text: | На цьому рівні ми змінили команду `{for}`, щоб ми могли повідомляти гравцеві, де він знаходиться. @@ -1484,34 +1490,64 @@ adventures: монстри = зомбі, вампір, гігантський павук _ {print} «Кімната» i - монстр = монстри {в} {випадково} + монстр = монстри {at} {random} ``` + 14: + story_text: "### Вправи\nНа цьому рівні ви можете використовувати символи `<` і `>`, щоб представити життя у вашій грі. \nПереконайтеся, що гравець втратить життя, коли натрапить на не того монстра, і що гра зупиниться, якщо у вас не залишиться жодного життя.\n" + example_code: "``` \n{print} «Втеча з дому з привидами» \nжиття = 3 \nдвері = 1, 2, 3 \nmonsters = 'зла відьма', 'зомбі', 'сплячий триголовий пес' \n{for} i {in} {range} 1 {to} 10 \n {if} живе _ \n good_door = двері {at} {random} \n монстр = монстри {at} {random} \n selected_door = {ask} 'Які двері ви обираєте?' \n {if} good_door == вибрані_двері \n {print} «Ви вибрали правильні двері» \n {else}\n {print} «Бачиш...» монстр \n {if} monster == 'спляча 3-голова собака' \n {print} 'Pffieuw.... Він спить' \n {else} \n {print} \"Ви втрачаєте одне життя\" \n життя = _ \n {else}\n {print} \"ГРА ЗАВЕРШЕНА\" \n```\n" + 16: + story_text: "### Вправи\nУ цій грі з привидами використовується зв’язок між списками, які можна використовувати на цьому рівні. \nНаприклад: усі властивості, які належать зомбі, є першими у всіх списках, відьма – другою, а вампір – третьою. \nПеревірте код і заповніть `weapons[i]`, `monsters[i]` , `bad_fate[i]`, `good_fate[i]`, `hint[i]` у правильних полях, щоб отримати код для робота!\n" + example_code: "``` \nчисла = [1, 2, 3] \ni = числа[{random}] \nпідказка = ['гарчання', 'кудихаючий сміх', 'тріпотливі крила кажана'] \nмонстри = ['зомбі', 'відьма', 'вампір'] \nbad_fate = ['Твій мозок з'їдено', 'Ти назавжди проклятий', 'Тебе вкусили'] \ngood_fate = ['Ви кидаєте шинку. Зомбі відволікається і починає його їсти.', 'Ви підпалюєте штори. Відьма тікає зі страху перед вогнем», «Вампір ненавидить часник і тікає»] \nзброя = ['ham', 'lighter', 'garlic'] \n{print} «Ви стоїте перед старим особняком» \n{print} \"Щось тут не так\" \n{print} \"Ви чуєте\" _ \n{print} \"Ви збираєтеся це дослідити\" \n{print} «Ви заходите на кухню і бачите запальничку, сиру шинку та часник». \nyour_weapon = {ask} 'Що ви берете з собою?' \n{print} \"Зі своєю зброєю ти входиш у вітальню\" \n{print} \"Там ви знайдете\" _ \nпотрібна_зброя = _ \n{if} ваша_зброя == потрібна_зброя \n {print} \"Ви використовуєте свою\" зброю \n {print} _ \n {print} \"ВИ ПЕРЕМОГЛИ!\" \n{else}\n {print} \"Ви вибрали не ту зброю...\" \n {print} _ \n {print} \"ГРА ЗАВЕРШЕНА\" \n```\n" + description: Втеча з будинку з привидами + name: Будинок з привидами + default_save_name: Будинок з привидами if_command: - description: Introducing the if command + description: Знайомство з командою {if} levels: 9: story_text: | На цьому рівні ви також можете розмістити команду `{if}` всередині іншої команди `{if}`. + example_code: "```\ncontinue = {ask} 'Do you want to continue?'\n{if} continue = yes\n sure = {ask} 'Are you sure?'\n {if} sure {is} yes\n {print} 'We will continue'\n {else}\n {print} 'You are not sure'\n{else}\n {print} 'You do not want to continue'\n```\n" + 5: + example_code_3: "```\nвідповідь {is} {ask} '2 + 2 = ?'\n_ _ _ 4 _ \"Чудова робота!\"\n_ _ 'Ні 2 + 2 = 4'\n```\n" + story_text_2: "Іноді код із `{if}` стає дуже довгим і погано вписується в рядок.
Ви також можете розділити код на два рядки, починаючи другий рядок із `{else}` так:\n" + story_text: "## Якщо... інакше.... \nНа рівні 5 є щось нове, `{if}`! За допомогою `{if}` ви можете вибрати між двома різними варіантами. \nЦей код добре друкується, якщо ви введете Hedy як ім’я, і бу! якщо ви введете щось інше. \n`{ask}` і `{print}` все ще працюють, як і на рівні 4.\n" + example_code_2: "```\nname {is} {ask} 'як тебе звуть?'\n{if} name {is} Hedy {print} 'nice'\n{else} {print} \"бу!\"\n```\n" + example_code: "```\nname {is} {ask} 'як тебе звуть?'\n{if} name {is} Hedy {print} 'приємно' {else} {print} 'бу!'\n```\n" + story_text_3: "### Вправи\nСпробуйте створити власний код за допомогою `{if}` і `{else}`. Ви можете використовувати приклад коду, якщо хочете.\n" + 8: + story_text: "## Якщо... Інакше... \nВи навчилися повторювати блок рядків коду після команди `{repeat}`. \nТепер ви також можете використовувати відступи для створення блоків після команд {if} або {else}. \nПерегляньте приклад коду. \n\n### Вправи\nДодайте команду {else} до прикладу коду. Створіть рядковий блок за допомогою відступу. Це можна зробити, починаючи кожен рядок із 4 пробілів.\n" + example_code: "```\nname = {ask} 'Як тебе звати?'\n{if} name {is} Hedy\n {print} «Ласкаво просимо, Хеді»\n {print} \"Ви можете грати на своєму комп'ютері!\"\n```\n" + name: '{if} & {else}' + default_save_name: if_command in_command: - description: Introducing the in command + description: Знайомство з командою {in} levels: 5: example_code_2: | - ``` - animals is dog, cow, sheep - answer is ask 'What is your favorite animal?' - _ answer _ animals _ 'Mine too!' - _ _ 'My favorite animals are dogs, cows and sheep' - ``` + ``` + тварини {is} собака, корова, вівця + answer {is} {ask} 'Яка твоя улюблена тварина?' + _ відповідь _ тварини _ «Я теж!» + _ _ «Мої улюблені тварини собаки, корови та вівці» + ``` + story_text: "## Списки\nКоли ми хочемо перевірити, чи є щось у списку, ми тепер можемо використовувати команду `{in}`.\nЦей код гарно друкується! якщо ви обираєте зелений або жовтий, і meh інакше.\n" + example_code: "```\npretty_colors {is} зелений, жовтий\nfavorite_color {is} {ask} 'Який твій улюблений колір?'\n{if} favorite_color {in} pretty_colors {print} 'красиво!'\n{else} {print} 'мех'\n```\n" + story_text_2: "### Вправи\nЗавершіть приклад коду, заповнивши пропуски командами, які ви вивчили. \nКоли ви закінчите код, спробуйте створити власний код і використайте запитання, яке ви самі придумали.\n" + name: '{in}' + default_save_name: in_command is_command: - description: introducing is command + description: представлення команди {is} levels: 2: 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. + ### Вправи + Час створювати власні змінні! + У прикладі коду ми зробили приклад змінної `favorite_animal`. У рядку 1 встановлено змінну, а в рядку 2 ми використали змінну в команді `{print}`. + По-перше, завершіть наш приклад, заповнивши поле вашої улюбленої тварини. Потім створіть принаймні 3 з цих кодів самостійно. Виберіть змінну та встановіть її за допомогою команди `{is}`. Потім використовуйте його з командою `{print}`, як і ми. + example_code: "```\nname {is} Hedy\nage {is} 15\n{print} name is age years old\n```\n" + story_text: "## Змінні \nВи можете назвати слово за допомогою `{is}`. Це називається **змінною**. У цьому прикладі ми створили змінну ім’я та вік. Ви можете використовувати слово name у будь-якому місці коду, і воно буде замінено на Hedy, ось так:\n" + example_code_2: "```\nулюблена_тварина {is} _\n{print} Мені подобається favorite_animal\n```\n" 14: example_code: | ``` @@ -1532,6 +1568,15 @@ adventures: {if} name != 'Hedy' {print} "Ви не Хеді" ``` + story_text_2: "Починаючи з цього рівня, якщо ви хочете точно порівняти, ви можете використовувати два знаки рівності. Ось що робить більшість мов програмування:\n" + example_code_2: "```\nname = {ask} 'Як тебе звати?'\n{if} name == 'Hedy'\n {print} 'Ти крутий!'\n```\n" + story_text: "Ми будемо вивчати більше нових предметів. Можливо, ви вже знаєте їх із математики, `<` і `>`. \n`<` перевіряє, чи перше число менше за друге, наприклад вік `<` 12 перевіряє, чи вік менше 12. \nЯкщо ви хочете перевірити, чи перше число менше або дорівнює другому, ви можете використовувати `<=`, наприклад вік `<=` 11. \n`>` перевіряє, чи перше число більше за друге, наприклад, точки `>` 10 перевіряють, чи точки більше 10. \nЯкщо ви хочете перевірити, чи перше число більше або дорівнює другому, ви можете використовувати `>=`, наприклад точки `>=` 11. \nВи використовуєте ці порівняння в `{if}`, наприклад:\n" + story_text_3: "Ви також можете порівняти, якщо щось *не* дорівнює чомусь іншому, використовуючи `!=` як це:\n" + 6: + example_code: "```\nname = Hedy\nanswer = 20 + 4\n```\n" + story_text: "Ми також вносимо зміни в збереження слова в змінній! Тепер ви можете використовувати `=` замість `{is}`, коли ми зберігаємо ім'я або число в змінній, як це:\n" + default_save_name: is_command + name: '{is}' language: levels: 5: @@ -1541,6 +1586,13 @@ adventures: ### Вправи Зробіть код довшим, додавши принаймні ще 3 слова, які гравець може вивчити. **Додатково** Звичайно, ви можете вибрати мову, відмінну від французької. Ви можете змінити код на будь-яку мову, яку хочете вивчити. + example_code: "``` \n{print} \"Вивчай французьку!\" \nкіт {is} {ask} '🐱' \n{if} cat {is} chat {print} \"Чудово!\" \n{else} {print} \"Ні, кіт - це чат\" \nжаба {is} {ask} '🐸' \n{if} жаба {is} grenouille {print} \"Супер!\" \n{else} {print} \"Ні, жаба - це Гренуй\" \n```\n" + 16: + example_code: "```\nfrench_words = ['bonjour', 'ordinateur', 'pomme de terre']\ntranslation = ['hello', 'computer', 'potato']\nscore = 0\n{for} i {in} {range} 1 {to} 3\n answer = {ask} 'What does ' french_words[i] ' mean?'\n correct = translation[i]\n {if} answer == correct\n {print} 'Correct!'\n score = score + 1\n {else}\n {print} 'Wrong, ' french_words[i] ' means ' translation[i]\n{print} 'You gave ' score ' correct answers.'\n```\n" + story_text: "### Вправи\nПодивіться на приклад коду. Це програма для відпрацювання французької лексики. Тепер створіть власну програму, щоб тренувати свій словниковий запас новою мовою. \nЯкщо ви не знаєте жодної іншої мови, ви можете скористатися перекладачем Google або використовувати емодзі та свою рідну мову.\n" + name: Мова + description: Відпрацювання слів іноземною мовою + default_save_name: Мова maths: levels: 6: @@ -1551,6 +1603,7 @@ adventures: {print} '5 помножити на 5 це ' 5 * 5 {print} '5 поділити на 5 це ' 5 / 5 ``` + story_text: "На цьому рівні ви дізнаєтесь щось нове: тепер ви також можете обчислювати. \n\nПлюс простий, ви записуєте його як з математикою: наприклад, `5 + 5`. Мінус теж працює нормально, це `5 - 5`. \n\nЧас дещо інший, оскільки на клавіатурі немає символу часу. Просто пошукайте, насправді немає! \nТому ми множимо на зірочку над 8: `5 * 5`. Прочитайте це як «5 помножити на 5», щоб краще запам’ятати.\n" 12: example_code_2: | ``` @@ -1558,10 +1611,67 @@ adventures: b = 'світ!' {print} a + b ``` + story_text_2: "**Математика зі словами**\nНа цьому рівні ви також можете додавати такі слова:" + story_text: "**Десяткові числа**\nПоки що Hedy не дозволяв десяткові числа, як-от 1,5, але тепер ми це дозволили. Зауважте, що комп’ютери використовують `.` для десяткових чисел." + example_code: "```\n{print} 'Two and a half plus two and a half is...'\n{print} 2.5 + 2.5\n```\n" + default_save_name: математика + description: Знайомство з математикою + name: математика music: levels: 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" + example_code: "```\nnumber = {ask} 'Say a starting number between 1 and 67'\n{print} number\n{play} number\nnumber = number + 1\n{print} number\n{play} number\nnumber = number + 1\n{print} number\n{play} number\n```\n" + 1: + example_code: "```\n{play} C4\n{play} D4\n{play} E4\n{play} F4\n{play} G4\n{play} A4\n{play} B4\n{play} C5\n```" + story_text: "На цьому рівні ви дізнаєтеся, як використовувати команду `{play}` для відтворення мелодії! \n\nВведіть `{play}`, а потім ноту, яку ви хочете зіграти. Шкала йде CDEFGAB. \nЯк бачите, є 7 різних літер, але ми можемо грати більше, ніж просто 7 нот. \nВведіть число від 1 до 10 за літерою, щоб вибрати масштаб, наприклад, після B4 йде C5. \nC1 — найнижча нота, яку ви можете зіграти, C10 — найвища. \n\n### Вправи\nСпробуйте приклад коду, а потім пограйте з ним! Чи можете ви створити власну мелодію? \nНа наступному рівні ви навчитеся відтворювати деякі наявні пісні." + 3: + example_code: "```\nnotes {is} A4, B4, C4\n{play} notes {at} {random}\n{play} notes {at} {random}\n{play} notes {at} {random}\n```\n" + story_text: "Створіть випадкову мелодію! \n\n### Вправи\nУ прикладі коду створюється випадкова мелодія, але вона дуже коротка і не використовує багато нот. \nДодайте більше нот до списку та створіть довшу мелодію, скопіювавши останній рядок ще кілька разів.\n" + 5: + example_code: "```\nanswer {is} {ask} 'Яка столиця Зімбабве?'\n{if} відповідь {is} Хараре {play} C6\n_\n```\n" + story_text: "Вам не завжди потрібно використовувати команду `{play}`, щоб відтворити цілу пісню, іноді потрібно відтворити лише одну ноту. \nНаприклад, якщо ви хочете провести вікторину, ви можете зіграти щасливу високу ноту, якщо відповідь правильна, і сумну низьку, якщо відповідь неправильна. \n\n### Вправи\nЗавершіть перше запитання, додавши рядок коду, який відтворює ноту C3, якщо дається неправильна відповідь. \nТоді придумайте ще 3 запитання, щоб додати до цього тесту.\n" + 2: + story_text: "### Вправи\nЗакінчуй пісні! Ми почали коди для деяких мелодій.\n" + example_code: "```\n{print} Старий Мак Дональд мав ферму\n{play} C5\n{play} C5\n{play} C5\n{play} G4\n{play} A4\n{play} A4\n{play} G4\n```\n" + story_text_2: Як бачите, ви також можете використовувати команду `{sleep}`, щоб додати невелику паузу в пісню. + example_code_2: "```\n{print} Мерехтить Мерехтить маленька зірка\n{play} C\n{play} C\n{play} G\n{play} G\n{play} A\n{play} A\n{play} G\n{sleep} 1\n{play} F\n{play} F\n```\n" + 4: + story_text: "Використовуйте команду `{clear}`, щоб створити караоке!\n\n### Вправи\nЗакінчіть караоке-версію пісні «У Мері було маленьке ягня».\nПотім створіть караоке-версію будь-якої пісні, яку хочете!\n" + example_code: "```\n{print} 'Mary had a little lamb'\n{play} E\n{play} D\n{play} C\n{play} D\n{play} E\n{play} E\n{play} E\n{clear}\n{print} 'Little lamb, little lamb'\n{play} D\n{play} D\n{play} D\n{play} E\n{play} E\n{play} E\n{clear}\n{print} 'Mary had a little lamb'\n{play} E\n```\n" + 12: + story_text: "Використовуйте функції у своїх піснях! Як ви можете бачити в прикладі коду, ви можете створити функцію для кожного рядка Twinkle Twinkle Little Star. Після того, як ви запрограмували перші три рядки, все, що вам потрібно зробити, це викликати функції в тому порядку, в якому ви хочете їх відтворювати. \n\n### Вправи\nЗакінчіть пісню Twinkle Twinkle Little Star. \nПотім подивіться на всі пісні, які ви запрограмували на попередніх рівнях, чи можете ви зробити ці коди кращими та коротшими за допомогою функцій?\n" + example_code: "``` \n{define} перший_рядок \n {play} C \n {play} C \n {play} Г \n {play} Г \n {play} А \n {play} А \n {play} Г \n {sleep}\n\n{define} другий_рядок \n {play} Ф \n {play} Ф \n {play} E \n {play} E \n {play} D \n {play} D \n {play} C \n {sleep}\n\n{define} третій_рядок \n {play} Г \n {play} Г \n {play} Ф \n {play} Ф \n {play} E \n {play} E \n {play} D \n {sleep}\n\n{call} _\n{call} _\n{call} _\n{call} _\n{call} _\n{call} _\n```\n" + 13: + story_text: "Ви можете використовувати функцію з аргументом для пісень, рядки яких майже однакові, але щоразу трохи відрізняються. \nОдним із прикладів є пісня \"Yankee Doodle\". Перші 4 ноти перших рядків однакові, але кожного разу за ними йде інша пара нот. \n\n### Вправи\nВи можете закінчити пісню Yankee Doodle? \nЧи можете ви придумати іншу пісню для програмування таким чином?\n" + example_code: "``` \n{print} \"Yankee Doodle\" \n{define} _ {with} note_1, note_2, note_3 \n {play} C4 \n {play} C4 \n {play} D4 \n {play} E4 \n {play} _ \n {play} _ \n {play} _ \n\n{call} line_1 {with} 29, 31, 30 \n{call} line_1 {with} 29, 28, 0 \n{call} line_1 {with} 32, 31, 30 \n\n{play} C4 \n{play} B3 \n{play} G3 \n{play} A3 \n{play} B3 \n{play} C4 \n{play} C4 \n```\n" + 14: + story_text: "Ви можете запрограмувати музику для розваги, але ви також можете використовувати музичні ноти, щоб створити щось корисне, наприклад пожежну сигналізацію!\n\n### Вправи\nПереконайтеся, що пожежна сигналізація дзвонить, коли є пожежа!\n" + example_code: "``` \n{define} fire_alarm \n {print} \"ВОГНЯ!\" \n примітка = 40 \n {for} i {in} {range} 1 {to} 100 \n {if} примітка _ 50 \n примітка = примітка + 5 \n {play} _ \n {else}\n примітка = 40 \n\nfire = {ask} 'Чи є пожежа?' \n{if} fire _ 'yes' \n {call} пожежна_сигналізація \n```\n" + 15: + example_code: "```\n{define} пісня\n {play} _\n\nyes_or_no = {ask} «Хочеш почути мою нескінченну пісню?»\n{while} yes_or_no = 'так'\n {call} пісня\n {print} '🥳'\n```\n" + story_text: "**Попередження** Ця пригода може стати надзвичайно дратівливою!\nМи також можемо використовувати команду {while}, щоб вічно повторювати пісню.\n\n### Вправи\nЗакінчіть нескінченну пісню.\n" + 17: + story_text: "Ви можете використовувати {elif} для створення різних варіантів. \n\n### Вправи\nПо-перше, додайте двокрапки, щоб код працював. \nПотім завершіть цей код, додавши принаймні 2 інші пісні для інших настроїв. Наприклад, весела пісня та сердита пісня.\n" + example_code: "``` \n{define} страшна_пісня \n {for} i {in} {range} 1 {to} 3 \n {play} Г \n {play} E \n {sleep}2\n {for} i {in} {range} 1 {to} 3 \n {play} Ф \n {play} D \n\nmood = {ask} 'Яку емоцію ви відчуваєте?' \n{if} настрій {is} \"страх\" \n {call} страшна_пісня \n{elif} _ \n```\n" + 16: + story_text: "Оновіть код старого Макдональда! \n\n### Вправи\nВізьміть свій код із пригоди «Співай пісню» та додайте до нього музичні ноти! \nВи можете створити функцію для кожного рядка пісні та викликати цю функцію після того, як рядок буде надруковано. \nМи визначили для вас перший рядок і назвали його в коді. Ви можете закінчити всю пісню?\n" + example_code: "``` \n{define} line_1 \n {for} i {in} {range} 1 {to} 3 \n {play} Г \n {play} D \n {for} я {in} {range} 1 {to} 2 \n {play} E \n {play} D \n\nтварини = ['свиня', 'собака', 'корова'] \nзвуки = ['хрю', 'гав', 'муу'] \nдля i в діапазоні від 1 до 3 \n тварина = тварини[i] \n звук = звуки[i] \n надрукувати «Старий Макдональд мав ферму» \n дзвонити на лінію_1 \n print 'E I E I O!' \n _ \n```\n" + 18: + story_text: "### Вправи\nНавіть на цьому останньому рівні Hedy ми можемо створювати музику! Будьте обережні з усім синтаксисом, який зараз потрібен. \nУважно подивіться, як функції визначені та викликані в прикладі коду. \nЗакінчи пісню!\n" + example_code: "``` \n{def} line_1(): \n {for} i {in} {range}(1, 5): \n {play} А \n {play} D \n {play} Ф \n {play} А \n\n{def} line_2(): \n {for} i {in} {range}(1, 5): \n {play} Г \n {play} C \n {play} E \n {play} Г \n\n{def} line_3(): \n_\n\n{print} ('П'яний матрос') \n{print} (\"Що робити з п'яним моряком?\") \nline_1() \nline_2() \nline_3() \n{print} ('Рано вранці') \n```\n" + 7: + story_text: "Використання команди `{repeat}` може зробити коди для мелодій набагато коротшими! \n\n### Вправи\nЗавершіть код для Twinkle Twinkle Little Star, використовуючи команду `{repeat}`. \nПотім поверніться до пісень, створених на попередніх рівнях. Чи можете ви також скоротити ці коди?\n" + example_code: "```\n{print} «Мерехтить маленька зірка»\n{repeat} 2 {times} {play} C4\n{repeat} 2 {times} {play} G4\n_\n```\n" + 9: + example_code: "``` \nfirst_time = так \n{repeat} 2 {times}\n {repeat} 2 {times}\n {play} C \n {play} D \n {play} C \n {if} first_time {is} так \n {play} Ф \n {play} E \n first_time {is} ні \n {else}\n _ \n```\n" + story_text: "Починаючи з цього рівня, серед іншого ви можете використовувати команду {repeat} усередині команди {repeat}.\nЦе робить такі пісні, як \"Happy birthday\", ще коротшими!\n\n### Вправи\nЗакінчи пісню!\n" + 8: + story_text: "Тепер, коли ми можемо використовувати команду `{repeat}` для кількох рядків, ми можемо створювати пісні ще легше!\n\n### Вправи\nЗакінчіть пісню брата Джона (Frère Jacques). Не забудьте використовувати `{repeat}`!\n" + example_code: "```\n{print} 'Brother John'\n{repeat} 2 {times}\n {play} C\n {play} D\n {play} E\n {play} C\n{repeat} 2 {times}\n {play} E\n {play} F\n {play} G\n {sleep} 1\n```\n" + default_save_name: музика + name: музика + description: Зіграй мелодію! parrot: name: Папуга default_save_name: Папуга @@ -1587,20 +1697,20 @@ adventures: {print} Папуга Ім Хеді {ask} _ {echo} - {exho} + {echo} 2: story_text: | На попередньому рівні ви зробили папугу, який буде повторювати за вами. На цьому рівні ми зробимо папугу інтерактивним за допомогою змінної та команди `{ask}`. Ми також зробимо папугу більш живою, додавши команди `{sleep}` після того, як щось буде сказано. example_code: | ``` - {print} Im Hedy the parrot - name {is} {ask} whats your name? - {print} name - {sleep} - {print} squawk - {sleep} - {print} name + {print} Папуга Ім Хеді + ім'я _ _ як тебе звати? + {print} ім'я + _ + {print} крик + _ + {print} ім'я ``` story_text_2: | ### Вправи @@ -1615,18 +1725,19 @@ adventures: Чи можете ви додати команду `{add} {to_list}`, щоб код працював? example_code: | ``` - words {is} squawk, Hedy - {print} Train your parrot! - new_word {is} {ask} Which word do you want to teach them? - {add} new_word {to_list} words - {print} 🧒 Say new_word , Hedy! - {print} 🦜 words {at} {random} + слова {is} крик, Хеді + {print} Дресируйте папугу! + new_word {is} {ask} Якого слова ви хочете їх навчити? + _ нове_слово _ слова + {print} 🧒 Скажи new_word, Хеді! + {print} 🦜 слова {at} {random} ``` 4: story_text: | На цьому рівні ми повинні використовувати лапки з командами `{ask}` і `{print}`. ### Вправи Доповніть код, заповнивши пробіли лапками. + example_code: "``` \nслова {is} крик, Хеді \n{print} _ Дресируйте папугу! _ \nnew_word {is} {ask} _ Якого слова ви хочете їх навчити? _ \n{add} new_word {to_list} слів \n{print} _ 🧒 Скажи _ нове_слово _, Хеді!_ \n{print} _ 🦜 _ слова {at} {random} \n```\n" 5: story_text: | Нагородіть свого папугу, якщо він скаже правильне слово! @@ -1655,15 +1766,15 @@ adventures: Завершіть код, щоб підрахувати, скільки у вас грошей і скільки часу вам потрібно накопичувати, щоб купити те, що ви хочете! **Додатково** Можливо, ви вже заощадили гроші? Відніміть це від суми, яку вам доведеться накопичити. example_code: | - ``` - {print} 'The digital piggy bank' - wish = {ask} 'What would you like to buy?' - price = {ask} 'How much does that cost?' - saved = {ask} 'How much money have you saved already?' - allowance = {ask} 'How much pocket money do you get per week?' - to_save = price - saved - weeks = to_save / allowance - {print} 'You can buy a ' wish ' in ' weeks ' weeks.' + ``` + {print} «Цифрова скарбничка» + wish = {ask} 'Що б ви хотіли купити?' + price = {ask} 'Скільки це коштує?' + saved = {ask} 'Скільки грошей ви вже заощадили?' + allowance = {ask} 'Скільки кишенькових грошей ви отримуєте на тиждень?' + to_save = ціна - збережено + тижні = to_save / надбавка + {print} 'Ви зможете купити ' _ ' через ' _ ' тижнів.' ``` 14: example_code: | @@ -1684,15 +1795,31 @@ adventures: {call} _ ``` + story_text: "### Вправи\nНа цьому рівні ви можете дозволити Хеді сказати вам, чи накопичили ви достатньо грошей!\nЗавершіть цей код, заповнивши пропуски!\n" + default_save_name: Скарбничка + description: Порахуйте свої кишенькові гроші! + name: Скарбничка pressit: levels: 9: story_text: | - Now that you know how to combine statements, you can create a touch type tool with `{pressed}`. + Тепер, коли ви знаєте, як поєднувати оператори, ви можете створити інструмент сенсорного введення за допомогою `{pressed}`. - ### Exercise - Finish the code. Each time a random letter should be chosen, which you have to press. You get a point for a correct press, and and two points deduction for a wrong press. - **(extra)** Clear the screen after each letter, and show the user how many points they have scored. + ### Вправи + Завершіть код. Кожного разу слід вибирати випадкову букву, яку потрібно натискати. Ви отримуєте очко за правильний нажим і вирахування двох очок за неправильний натиск. + **Екстра** Очищайте екран після кожної літери та показуйте користувачеві, скільки очок він набрав. + example_code: "```\nбали = 0\nлітери = a, b, c, d, e\n{repeat} 10 {times}\n літера = _ _ _\n {print} 'Натисніть букву' буква\n {if} літера {is} {pressed}\n _\n _\n _\n```\n" + 5: + story_text_2: "Ви також можете пов’язати команди черепахи з ключами.\n\n### Вправи\nСкопіюйте лінії кілька разів, щоб створити більший малюнок.\n" + story_text: "На цьому рівні є ще одне нове ключове слово: `{pressed}`! \nЗа допомогою `{pressed}` ви можете використовувати клавіші на клавіатурі, щоб керувати тим, які рядки використовуються. \n\n### Вправи\nПодивіться на приклад і додайте ще один рядок коду, який реагує на натискання клавіші.\n" + example_code_2: "```\n{if} y {is} {pressed} {forward} 15\n{else} {turn} 90\n```\n" + example_code: "```\n{print} \"Ви хочете гарне (g) чи погане (b) закінчення?\"\n{if} g {is} {pressed} {print} \"Вони жили довго та щасливо ❤\"\n{else} {print} \"Принца з'їв бегемот 😭\"\n```\n" + 7: + story_text: "Тепер, коли ви дізналися про `{repeat}`, ми можемо натискати клавіші кілька разів. \nВи можете використовувати його, щоб змусити черепаху йти вперед і повертатися. \n\n### Вправи\nКод, який ви бачили на рівні 5, перевіряє ключ лише один раз. Скопіюйте приклад коду та додайте до нього `{repeat}`, щоб ви могли натискати клавіші багато разів. \nВикористовуйте цей код, щоб намалювати щось гарне.\n" + example_code: "```\n{if} x {is} {pressed} {forward} 15 {else} {turn} 90\n```\n" + default_save_name: Пресований + name: Натискання клавіш + description: Спробуйте пов’язати клавішу клавіатури з командою! print_command: levels: 18: @@ -1705,6 +1832,17 @@ adventures: name = 'Hedy' {print}('My name is ', name) ``` + story_text: "Ми отримали справжній код Python! Це означає, що відтепер нам потрібно використовувати круглі дужки з `{print}` і `{range}`. \nЦе також означає, що ви можете використовувати код Hedy з цього рівня в будь-якому середовищі Python, якщо ви використовуєте англійські команди. Якщо ви цього не зробили досі, ви можете перемкнути перемикач у меню команд, щоб зробити це." + story_text_2: Якщо ви хочете надрукувати більше одного елемента, потрібно розділити їх комами. + example_code: "```\n{print}('Привіт!')\n{for} i {in} {range}(1, 10):\n {print}('Це лінія ', i)\n```\n" + 1: + example_code_2: "```\n_ Привіт!\n```\n" + story_text_2: "### Вправи\nУ Hedy ви знайдете вправи в кожній пригоді. Вправа дозволяє відпрацьовувати нові команди та поняття, а також дає змогу надати власний вид прикладам кодів. \nУ цій вправі ви побачите рожеве порожнє місце. Вам потрібно щось заповнити на місці порожнього простору, перш ніж можна буде запустити код. \n\nЗаповніть команду `{print}` у порожньому місці, а потім додайте ще п’ять рядків коду. Кожен рядок має починатися з команди `{print}`. \nвесело провести час!\n" + story_text: "## Команда друку\nВи можете вивести текст на екран за допомогою команди `{print}`.\n" + example_code: "```\n{print} Привіт, програмісте!\n{print} Ласкаво просимо до Hedy!\n```\n" + description: Вступна команда друку + default_save_name: друкувати + name: '{print}' random_command: levels: 16: @@ -1712,8 +1850,14 @@ adventures: Ми збираємося створювати списки способом Python, з квадратними дужками навколо списків! Ми також зберігаємо лапки навколо кожного елемента, як ми навчилися на попередніх рівнях. Ми використовуємо квадратні дужки, щоб вказати місце в списку. Наприклад: `friends[1]` — це перше ім’я в списку друзів, як ви бачите в першій частині прикладу коду. Друга частина прикладу коду показує, що ми також можемо зіставити 2 списки за допомогою змінної i. + 3: + story_text: "## Навмання\nНа цьому рівні ви можете створити список за допомогою команди `{is}`. Ви можете дозволити комп’ютеру вибрати випадковий елемент із цього списку. Ви робите це за допомогою `{at} {random}`.\n" + example_code: "```\nanimals {is} dogs, cats, kangaroos\n{print} animals {at} {random}\n```\n" + default_save_name: random_command + name: '{random}' + description: введення за довільною командою repeat_command: - description: repeat command + description: '{repeat} команда' levels: 7: story_text: | @@ -1739,7 +1883,7 @@ adventures: {print} 'pizza краще! Р й й repeat_command_2: - description: repeat command 2 + description: '{repeat} команда 2' levels: 7: story_text_2: | @@ -1758,9 +1902,9 @@ adventures: 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: @@ -1803,11 +1947,11 @@ adventures: example_code_2: | ``` {print} Ласкаво просимо у ваш власний випадковий ресторан! - початківці {є} _ - мережа {є} _ - десерти {є} _ - напої {є} _ - ціни {є} _ + початківці {is} _ + мережа {is} _ + десерти {is} _ + напої {is} _ + ціни {is} _ _ ``` 4: @@ -1904,7 +2048,7 @@ adventures: example_code: | ``` страви = закуска, основна страва, десерт - {для} курсу {в} курсах + {for} курсу {in} курсах {print} "Яке ваше замовлення на "курс"?" _ _ @@ -2001,22 +2145,22 @@ adventures: Ця гра не дуже інтерактивна, але не хвилюйтеся! На наступній вкладці ви дізнаєтеся, як використовувати змінні з командою `{ask}`, щоб зробити вашу гру інтерактивною! example_code: |- ``` - вибір {є} рок + вибір {is} рок {print} Я вибираю _ ``` 3: example_code: | ``` - choices {is} rock, paper, scissors - {print} choices {at} {random} + вибір {is} камінь, папір, ножиці + {print} вибір _ ``` story_text_2: | **Екстра** Створіть гру для двох гравців. Спочатку попросіть двох гравців заповнити свої імена. Потім дозвольте комп’ютеру навмання вибрати їхній вибір. example_code_2: | ``` - choices {is} rock, paper, scissors - {print} player 1 chooses... choices {at} {random} - {print} player 2 _ + вибір {is} камінь, папір, ножиці + player_1 {is} {ask} Ім'я гравця 1: + _ ``` 5: story_text: | @@ -2029,16 +2173,16 @@ adventures: * Заповніть правильні змінні в рядках 4 і 5 * Фінішна лінія 6, щоб Хеді могла перевірити, нічия чи ні. example_code: | - ``` - options {is} rock, paper, scissors - computer_choice {is} _ - choice {is} {ask} 'What do you choose?' - {print} 'you chose ' _ - {print} 'computer chose ' _ - {if} _ {is} _ {print} 'tie!' {else} {print} 'no tie' - ``` + ``` + варіанти {is} камінь, папір, ножиці + комп'ютер_вибір {is} _ + вибір {is} _ + {print} 'ви вибрали' _ + {print} 'комп'ютер вибрав ' _ + {if} _ {is} _ {print} "краватка!" {else} {print} "без краватки" + ``` - Fill in the correct code on the blanks to see {if} it is a draw. + Заповніть правильний код у порожніх полях, щоб побачити, чи це нічия. 9: story_text: | На цьому рівні ви можете запрограмувати всю гру «камінь, папір, ножиці», вкладаючи команди `{if}`. @@ -2050,9 +2194,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' @@ -2071,7 +2215,7 @@ adventures: ``` вибір = _ гравців = _ - {для} _ + {for} _ ``` 13: story_text: | @@ -2090,29 +2234,29 @@ adventures: {print} "краватка" {if} computer_choice {is} 'rock' {and} your_choice {is} 'paper' {print} "Ти виграв!" - {if} computer_choice {is} "камінь" {і} your_choice {is} "ножиці" + {if} computer_choice {is} "камінь" {and} your_choice {is} "ножиці" {print} "Комп'ютер перемагає!" _ ``` 15: example_code: | - й й - виграти = 'не Р - параметри = 'rock', 'paper', 'scissors Р - {while} виграв == "не" - JavaScript licenses API Веб-сайт Go1.13.8 Р - JavaScript licenses API Веб-сайт Go1.13.8 - {print} 'Ви вибрали ' your_choice - {print} 'Комп'ютер обраний ' комп'ютер_хойсе - {if} комп'ютер_хойсе == Головна - {print} 'Tie! Р - {if} computer_choice == 'rock' {and} your_choice == 'scissors Р - {print} 'Ви втратите! Р - {if} computer_choice == 'rock' {and} your_choice == 'папір Р - {print} 'Виграєте! Р - виграв = "так Р - У - й й + ``` + виграв = 'ні' + options = 'камінь', 'папір', 'ножиці' + {while} виграв == 'ні' + your_choice = {ask} 'Що ви обираєте?' + computer_choice = параметри {at} {random} + {print} 'ви вибрали' your_choice + {print} 'комп'ютер вибрав' computer_choice + {if} computer_choice == your_choice + {print} "Краватка!" + {if} computer_choice == 'камінь' {and} your_choice == 'ножиці' + {print} "Ви програли!" + {if} computer_choice == 'rock' {and} your_choice == 'paper' + {print} "Ти виграв!" + = 'так' + _ + ``` rock_2: levels: 2: @@ -2123,8 +2267,8 @@ adventures: Make the rock, paper, scissors code interactive by adding the `{ask}` command and a question to your rock, paper, scissors code. example_code: | ``` - choice is _ - {print} I choose choice + вибір {is} _ + {print} Я обираю вибір ``` secret: levels: @@ -2139,18 +2283,18 @@ adventures: ### Вправа 2 Додайте до коду третій компонент, як-от предмет одягу чи предмет. example_code: | - ``` - name {is} {ask} 'What is your name?' - {if} name {is} '_' - a {is} 'Go to the airport ' + ``` + name = {ask} 'Як тебе звати?' + {if} ім'я {is} _ + a = 'Їдьте в аеропорт' {else} - a {is} 'Go to the trainstation ' - password {is} {ask} 'What is the password?' - {if} password {is} _ - b {is} 'tomorrow at 02.00' + a = 'Їдьте на вокзал' + password = {ask} 'Який пароль?' + {if} пароль {is} _ + b = 'завтра о 02.00' {else} - b {is} 'today at 10.00' - {print} _ _ _ + b = 'сьогодні о 10.00' + {print} _ _ _ ``` 13: story_text: | @@ -2162,16 +2306,16 @@ adventures: ### Вправа 2 Ми хочемо ще більше заплутати ворога! Створіть список із фальшивими відповідями та виберіть один навмання, коли дається неправильна відповідь. example_code: | - ``` - name = {ask} 'What is your name?' - password = {ask} 'What is your password?' - {if} name {is} 'Agent007' {and} password {is} 'TOPSECRET' - {print} 'Go to the airport at 02.00' + ``` + name = {ask} 'Як тебе звати?' + password = {ask} 'Який ваш пароль?' + {if} name {is} 'Agent007' _ password {is} 'TOPSECRET' + {print} 'В аеропорт о 02.00' {else} - {print} 'Go to the trainstation at 10.00' + {print} "Йди на вокзал о 10.00" ``` sleep_command: - description: introducing sleep command + description: представляємо команду {sleep} levels: 2: story_text: | @@ -2204,11 +2348,11 @@ adventures: ``` number = 6 number = number - 1 - print number ' 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!' - sleep + {print} number ' 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!' + {sleep} ``` 7: story_text: | @@ -2319,10 +2463,10 @@ adventures: 5: example_code_2: | ``` - direction {is} {ask} 'Do you want to go left, right, or straight ahead?' - if direction is left turn _ - if direction is right turn _ - forward 100 + direction {is} {ask} 'Ви хочете йти ліворуч, праворуч чи прямо?' + {if} напрямок {is} ліворуч {turn} _ + {if} напрямок {is} праворуч {turn} _ + {forward} 100 ``` 8: story_text: | @@ -2367,36 +2511,36 @@ adventures: levels: 9: example_code: | - Hint for the nested squares: - ``` - colors = red, blue, orange, yellow, pink, purple, green, brown, black - distance = 120 - repeat 5 times + Підказка для вкладених квадратів: + ``` + кольори = червоний, синій, оранжевий, жовтий, рожевий, фіолетовий, зелений, коричневий, чорний + відстань = 120 + {repeat} 5 {times} _ - ``` - Hint for the flags: - ``` - 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 + ``` + Підказка для прапорів: + ``` + country = {ask} 'прапор якої країни ви б хотіли бачити?' + {if} країна {is} 'Нідерланди' + колір_1 = червоний + колір_2 = білий + колір_3 = синій ``` 10: example_code: | - Hint Nested Hexagon: - ``` - distances = 100, 80, 60, 40, 20 - {for} distance {in} distances + Вкладений шестикутник підказки: + ``` + відстані = 100, 80, 60, 40, 20 + {for} distance {in} відстані _ - ``` + ``` - Hint Traffic Lights: - ``` - colors = red, yellow, green - {for} chosen_color {in} colors - color _ - {repeat} _ + Підказка Світлофор: + ``` + кольори = червоний, жовтий, зелений + {for} selected_color {in} кольори + {color} _ + {repeat} _ ``` 12: story_text: | @@ -2408,18 +2552,18 @@ adventures: Програму для конструювання браслетів example_code: | Програма для проектування браслетів Hint - ``` + ``` {define} draw_a_quarte _ - {колір} білий - {черга} -90 - {вперед} 300 - {поворот} 180 + {color} білий + {turn} -90 + {forward} 300 + {turn} 180 - {для} я {в} {діапазон} 1 {до} 5 + {for} я {in} {range} 1 {to} 5 {color} сірий - {вперед} 100 + {forward} 100 shape = {ask} 'Яку форму браслета ви хотіли б мати наступного разу?' selected_color = {ask} 'Якого кольору?' {color} вибраний_колір @@ -2427,7 +2571,7 @@ adventures: {call} draw_a_quarte ``` while_command: - description: while + description: '{while}' years: name: Новий рік default_save_name: Новорічний відлік @@ -2441,9 +2585,9 @@ adventures: Заповніть пропуски і змусьте код працювати! example_code: | ``` - {для} числа {в} {діапазон} _ {до} _ + {for} числа {in} {range} _ {to} _ {print} число - {сон} + {sleep} {print} 'З Новим роком!' ``` blackjack: @@ -2493,3 +2637,71 @@ adventures: levels: 14: story_text: "На цьому рівні ви можете запрограмувати гру «Вгадай моє число»\n\n### Вправи\nЗаповніть правильні символи в порожніх полях, щоб гра запрацювала.\n" + example_code: "``` \n{print} \"Вгадай мій номер\" \nцифри = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nчисло = числа {at} {random} \nгра = 'увімкнено'\n{for} i {in} {range} 1 {to} 10 \n {if} game == 'on' \n guess = {ask} 'Як ви думаєте, яке це число?' \n {if} вгадай _ число \n {print} \"Нижче!\" \n {if} вгадай _ число \n {print} \"Вище!\" \n {if} вгадай _ число \n {print} \"Ти виграв!\" \n гра = 'завершено'\n```\n" + quotation_marks: + levels: + 12: + story_text_3: "**Увесь текст після порівнянь `{if}` також потребує лапок**\n" + story_text_2: "**Усі елементи в списках також потрібно брати в лапки** \nСписки — це тексти, тому вони також потребують лапок. Майте на увазі, що кожен окремий елемент у списку взято в лапки. \nЦе дозволяє зберегти два слова як 1 пункт у списку, наприклад, «Чорна вдова».\n" + example_code_2: "```\nsuperheroes = 'Spiderman', 'Batman', 'Black Widow'\n{print} superheroes {at} {random}\n```\n" + story_text: "**Всі тексти взяти в лапки**\nДля цього рівня вам також доведеться використовувати лапки під час зберігання тексту з `=`:\n" + example_code: "```\nname = 'Hedy the Robot'\n{print} 'Hello ' name\n```\n" + example_code_3: "```\nname = {ask} 'Як тебе звати?'\n{if} name = 'Hedy the Robot'\n {print} 'Привіт!'\n```\n" + story_text_4: "**Числа не потребують лапок**\nДля чисел ви не використовуєте лапки в `=`:\n" + example_code_4: "```\nscore = 25\n{print} 'You got ' score\n```\n" + 4: + example_code: "```\n{print} 'You need to use quotation marks from now on!'\nanswer {is} {ask} 'What do we need to use from now on?'\n{print} 'We need to use ' answer\n```\n" + story_text_2: "## Скорочення \nважливо! Майте на увазі, що тепер, коли ми використовуємо лапки, Хеді заплутається, коли ви використовуєте апостроф для скорочень, як-от I'm або What's. \nОбов’язково використовуйте подвійні лапки, коли використовуєте апостроф у своєму рядку! \nПерегляньте приклад коду, щоб побачити неправильний спосіб використання апострофів.\n" + story_text: "## \"Лапки\" \nНа рівні 4 `{ask}` і `{print}` змінилися. \nТекст, який потрібно надрукувати, потрібно взяти в лапки. \nЦе корисно, тому що тепер ви можете друкувати всі слова, які хочете. Також слова, які ви використовували для зберігання чогось із `{is}`. \nБільшість мов програмування також використовують лапки під час друку, тож ми також стаємо на крок ближче до справжнього програмування!\n" + example_code_2: "``` \n_ Це неправильний спосіб використання апострофів _ \n{print} «Я доглядаю за дітьми своєї сестри» \n{print} \"Що веселіше, ніж це?\" \n_ Ось як ви це вирішуєте _ \n{print} \"Я доглядаю за дітьми своєї сестри\" \n{print} \"Що ще веселіше?\" \n```\n" + description: Вступні лапки + name: "'quotation marks'" + default_save_name: quotation_marks + quizmaster: + description: Зробіть власну вікторину! + levels: + 14: + example_code: "```\n{print} 'Make your own quiz'\npoints_a = 0\npoints_b = 0\n{print} 'Question'\n{print} 'Answer option A'\n{print} 'Answer option B'\nanswer = {ask} 'Which answer?'\n{if} answer == 'A'\n points_a = points_a + 1\n{if} answer == 'B'\n points_b = points_b + 1\n{print} 'End of the quiz!'\n{print} 'Lets see the results!'\n{if} points_a > points_b\n {print} 'You belong to the A club'\n{if} points_b > points_a\n {print} 'You belong to the B club'\n```\n" + story_text: "### Вправи\nУ цій пригоді ви можете зробити власну вікторину! Заповніть порожні поля, додайте більше запитань і насолоджуйтеся власною вікториною!\nВи можете скласти вікторину про все, що завгодно: про хобі, улюблену тварину\n" + default_save_name: Вікторина + name: Вікторина + hotel: + levels: + 13: + example_code: "```\n{define} welcome_message {with} title, last_name, country, room_number\n {print} 'Welcome to Hotel Hedy, ' title ' ' last_name\n nice_trip {is} {ask} 'Did you have a nice trip from, ' country '?'\n {if} nice_trip {is} 'yes'\n {print} 'Lovely!'\n {else}\n {print} 'Sorry to hear that.'\n {print} 'Hopefully you can take a nice rest in you room.'\n {print} 'Your room number is ' room_number\n\n{print} 'Hello. Please fill in your information to check in.'\ntitle = {ask} 'What is your title (mr, mrs, ms, dr, etc.)?'\nname = {ask} 'What is you last name?'\nhomecountry = {ask} 'What country do you come from?'\n\n{call} welcome_message {with} title, name, homecountry, 105\n```\n\ntitle = {ask} 'What is your title (mr, mrs, ms, dr, etc.)?'\nname = {ask} 'What is you last name?'\nhomecountry = {ask} 'What country do you come from?'\n\n{call} welcome_message {with} title, name, homecountry, 105\n" + story_text: "У попередній пригоді ви навчилися використовувати аргумент у функції та навчилися поєднувати його з {ask}. \nМожливо, ви задавалися питанням, навіщо вам використовувати функції, оскільки функції в прикладі являли собою лише один рядок коду. \nЗараз ми покажемо вам, як виглядає більша функція, а також використаємо кілька агрументів. Ви побачите, наскільки краще використовувати функцію, коли функція стане більшою. \nОсь приклад функції з аргументами в поєднанні з командами {ask}.\n" + name: готель + description: готель + default_save_name: готель + hangman_2: + levels: + 17: + story_text: "Тепер настав час запрограмувати гру «ката». \n\n### Вправи\n\n***Вставте свій код*** Скопіюйте свій код із попередньої вкладки та вставте код у поле програмування. \n\n***Гра*** Ці ігри тривають, поки гравець 2 не закінчить гру. Заповніть команду while відповідно. Тепер гравцеві 2 дозволено вгадати літеру, тому попросіть гравця 2 вгадати літеру. \nНам потрібно перевірити, чи правильна їхня відповідь, тому перевірте, чи є їхня `guess` (десь) у (списку) `answer`. Потім ми дозволяємо комп’ютеру визначити, яка з літер є вгадкою. Ми вже запрограмували цю частину для вас. \nДалі ми хочемо похвалити гравця за те, що він знайшов правильну літеру, і ми хочемо надрукувати список `guessed_letters`, щоб гравець міг бачити свій прогрес. \n\nНаступна частина, яку ми плануємо запрограмувати, це те, що станеться, коли гравець вгадає всі літери. Отже, якщо їхній список `guessed_letters` збігається з нашим списком `answer`. \nЯкщо списки однакові, привітайте Гравця 2 з перемогою та встановіть для змінної `game_over` значення `True`. \n\nДалі ми запрограмуємо, що станеться, якщо гравець 2 вгадає неправильно (тому команда `{else}`). Спочатку скажіть гравцеві, що його припущення було неправильним. Потім збільште змінну `mistakes_made` на 1. \n\nВ останній частині ми запрограмуємо, що станеться, коли Гравець 2 зробить 10 помилок. Ми надрукуємо, що Гравець 1 виграв гру. Тоді ми надрукуємо правильну відповідь. І, нарешті, ми встановимо для нашої змінної `game_over` значення `True`, щоб гра зупинилася. \n\n***Перейти до наступної вкладки*** Чудова робота! У вашу гру можна грати, але хіба не було б весело, якби ката справді витягнули, коли Гравець 2 зробив помилку..?\n" + example_code: "``` \n# Вставте свій код сюди \n\n# Гра \n{while} game_over _ \n здогадка = _ \n {if} _ \n {for} i {in} {range} 1 {to} сума_букв: \n if answer[i] == guess: \n guessed_letters[i] = здогадка \n {print} _ \n {if} вгадані_літери == _: \n {print} _ \n game_over = _ \n {else}:\n {print} _ \n зроблені_помилки_ \n {if}_ == 10: \n {print} _ \n {print} _ \n _ \n```\n" + name: Шибениця 2 + default_save_name: Шибениця_2 + description: Шибениця 2 + hangman_3: + name: Шибениця 3 + default_save_name: Шибениця_3 + levels: + 17: + example_code: "``` \n# Створіть функцію, яка малює ката \n{define} draw_hangman {with} крок: \n {if} крок == 1: \n {color} білий \n {forward} -100 \n {turn} 90 \n {forward} -50 \n {color} чорний \n {forward} 100 \n {forward} -50 \n\n {if} крок == 2: \n _ \n# Вставте свою гру ката сюди \n\n```\n" + story_text: "У грі в ката помилки показуються малюванням частини ката кожного разу, коли була зроблена помилка. \nТепер ми додаємо ці малюнки разом із нашою черепахою! \n\n### Вправи\n***Створіть функцію, яка малює ката*** Створіть функцію, яка малює ката, у 10 кроків. Ми вже зробили для вас крок 1. \n\n***Перевірте функцію*** Перевірте функцію, викликавши функцію з 10. Якщо ви задоволені функцією, видаліть наразі рядок, який викликає функцію. Ми будемо викликати функцію, коли гравець робить помилку. \n\n***Вставте свою гру про ката під своєю функцією*** Поверніться на попередню вкладку та скопіюйте свою гру про ката. Вставте гру під свою функцію. \n\n***Викликати функцію, коли гравець робить помилку*** Під рядком `mistakes_made = mistakes_made + 1` ми викличемо функцію. Ми хочемо, щоб черепаха зробила стільки ж кроків, скільки гравець зробив помилок, тому ми викликаємо функцію з аргументом `mistakes_made`. \n\n***Приємної гри!*** \n
\n Шибеник міг би виглядати так \n
\n" + description: Шибениця 3 + harry_potter: + default_save_name: Гаррі Поттер + description: Пригоди Гаррі Поттера + levels: + 10: + story_text: "### Вправи\nМи також можемо зробити ворожку на тему Гаррі Поттера. Заповніть пропуски так, щоб вийшло 9 рядків. \n**Додатково** Змініть тему ворожки на щось інше, наприклад на свою улюблену книгу, фільм або телешоу.\n" + example_code: "``` \nбудинки = Ґрифіндор, Слизерин, Хаффлпафф, Рейвенкло \nпредмети = зілля, захист від темних мистецтв, чари, трансфігурація \nстрахи = Волдеморт, павуки, провал тесту OWL \nімена = Гаррі, Рон, Герміона \n_\n_ {print} ім'я ' розміщено в ' будинках {at} {random} \n_ {print} ім'я 'знайомиться з' предметами {at} {random} \n_ {print} ім'я найбільший страх ' страхи {at} {random} \n```\n" + name: Гаррі Поттер + hangman: + name: Шибениця + default_save_name: Шибениця + description: Вгадай слово + levels: + 17: + story_text: "У цій пригоді ми програмуємо гру в ката. Спочатку ми робимо деякі приготування, потім програмуємо гру і в третій частині додаємо малюнок з черепахою. \n\n### Вправи\n***Встановіть змінні*** У цій грі у ката Гравець 1 вибирає відповідь, а Гравець 2 має вгадати літери в цій відповіді. \nЩоб комп’ютер знав усі літери в слові, ми перетворимо відповідь на список букв. Ми також робимо це за допомогою припущень Гравця 2. \nМи почнемо гру з 2 порожніми списками. Ми створили для вас порожній список для змінної відповіді. Тепер також створіть порожній список для guessed_letters. \nПотім заповнюємо, скільки було допущено помилок. На початку гри це має бути 0. \nЗмінна `amount_letters` повідомляє нам, скільки літер у відповіді. Попросіть Гравця 1 сказати нам, скільки букв має його слово. \nНарешті ми повідомляємо комп’ютеру, чи закінчилася гра. Ми використовуємо змінну `game_over` і встановлюємо для неї значення `False`. \n\n***Вибір відповіді*** Ми хочемо, щоб Гравець 1 міг вибрати відповідь. Ми запитаємо їх стільки разів, яка буде наступна буква. \nТоді ми додаємо цю букву до відповіді. Нарешті, ми додаємо порожній _ до списку вгаданих літер, щоб отримати стільки _, скільки літер у відповіді. \n\n***Хід гравця 2*** \nСкажіть гравцеві 2, що його черга. Потім скажіть Гравцеві 2, скільки літер у відповіді. Нарешті, надрукуйте список `guessed_letters`. \n\n***Перейти до наступної вкладки*** Тепер, коли всі початкові змінні встановлено, ми можемо почати програмувати саму гру. Перегляньте наступну вкладку, щоб дізнатися, як!\n" + example_code: "``` \nнадрукувати 'Шибениця!' \n\n# Встановити змінні \nвідповідь = [] \nвгадані_літери = _ \nзроблені_помилки = _ \nкількість_літерів = {ask} _ \n_ = 'Неправда' \n\n# Вибір відповіді \n{for} _\n letter = {ask} 'Гравець 1, що таке буква ' i '?' \n _ \n {add} '_' {to} _ \n\n# Хід гравця 2 \nдрукувати _ \nдрукувати _ \nнадрукувати відгадані_літери \n```\n" diff --git a/content/pages/sr.yaml b/content/pages/sr.yaml index eb56a9f5561..b9819cebc14 100644 --- a/content/pages/sr.yaml +++ b/content/pages/sr.yaml @@ -1677,5 +1677,162 @@ workbooks: type: текст - type: питање text: Која вежба вам се највише допала у овом нивоу? + lines: '1' + - type: питање + lines: '5' + text: Шта вам се допало у вези с тим? + - type: питање + text: Која вежба вам се најмање допала у овом нивоу? + lines: '1' + - text: Шта вам се није допало у вези с тим? + type: питање + lines: '5' level: '5' intro: "## ако иначе \nНа крају ове лекције, можете: \n* дозволити рачунару да реагује на различите уносе." + - intro: "## Математика\nДо краја ове лекције, можете:\n* користити математику у Хеди" + exercises: + - code: штампај 'пет пута пет је ' 5 * 5 + type: текст + contents: "### Математика\nПрављење калкулација је важан задатак за рачунаре.\n\nСабирање се врши нормалним плус знаком: `5 + 5`.\nОдузимање се такође користи нормалним минус знаком: `5 - 5`.\nПри множењу може изгледати мало другачије него обично, користимо астриск (изнад 8): `5 * 5`.\nДељење се врши са косом цртом напред: `5 / 5`.\n\nОбратите пажњу да математички код не захтева наводнике." + - type: текст + contents: "#### Вежба 1: Предвидите излаз\nШта мислите да ће бити излаз ових програма?" + - lines: '3' + type: излаз + code: "штампај 'два плус десет је ' 2 * 10\nштампај 5 * 5 ' је 30 минус 5'\nштампај 10 / 2" + answer: "два плус десет је 20\n25 је 30 минус 5\n5" + - type: текст + contents: "#### Вежба 2: Математика\nСледите ове кораке да бисте завршили вежбу:\n1. Завршите програме попуњавањем сабирања на линијама. Код мора имати смисла.\n2. Завршено? Попуните шта мислите да ће бити излаз кода." + - lines: '4' + type: излаз + code: "штампај 'пет плус десет је ' ___\nштампај 'шест минус пет је ' ___\nштампај 'један стотина подељено са пет је ' ___\n___ _________________________ 4 * 12" + answer: "пет плус десет је 50\nшест минус пет је 1\nједан стотина подељено са пет је 20\nчетири пута дванаест је 48" + - type: текст + contents: "### Вежба 2: Математика са питањем и променљивом\nТакође можете сачувати сабирање у променљивој, упоредити га са `питањем` и покренути га са `ако`.\nСада ћемо то вежбати.\nПредвидите излаз ових програма.\nКада се користе `питање` и `случајно`, можете смислити своје одговоре." + - type: излаз + code: "сабирање = 2 * 5\nштампај 'Одговор на ово сабирање је ' сабирање" + lines: '1' + answer: Одговор на ово сабирање је 10 + - lines: '1' + type: излаз + code: "тачан_odgovор = 142 / 2\nваш_odgovор = питај 'Шта је 142 подељено са 2?'\nако тачан_odgovор је ваш_odgovор\nштампај 'Одличан посао'\nиначе штампај 'Жао ми је!'" + answer: Одличан посао! или Жао ми је! + - lines: '1' + type: излаз + answer: 'Колико је 7 пута 7? (или било који други број из листе: 2, 4, 6, 9, 11, 17)' + code: "бројеви су 2, 4, 6, 7, 9, 11, 17\nброј је бројеви на случајно\nштампај 'Колико је ' број ' пута 7?'" + - lines: '1' + answer: 3 пута 6 (на пример) је 18 + type: излаз + code: "омиљени = питај 'Који је ваш омиљени број?'\nштампај '3 пута ' омиљени ' је ' 3 * омиљени" + - type: текст + contents: "### Вежба 3: Унос\nБићете приказани излаз. Напишите програм који би могао произвести овај излаз.\nОбратите пажњу: Више одговора може бити тачно. Изаберите шта год желите, све док је тачно.\nПопуните све линије, па пажљиво погледајте количину линија!" + - type: унос + answer: штампај 'Ово је веома велики број:' 4*17 + output: 'Ово је веома велики број: 68' + - type: унос + answer: штампај 1000/10 ' је одговор на 1000/10.' + output: 100 је одговор на 1000/10. + - type: унос + answer: "бројеви су 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nштампај бројеве насумично * 7 ' је насумични кратки број од 7'" + output: 14 је насумични кратки број од 7 + - type: текст + contents: "#### Вежба 4: Речи у програмирању\nНаучили смо да користимо неке нове знакове у нашем коду. Који знакови се користе у овим случајевима?" + - type: дефиниши + word: пута + answer: '*' + lines: '1' + - type: дефиниши + lines: '1' + word: дели са + answer: / + - type: текст + contents: '#### Шта сте мислили?' + - type: питање + lines: '1' + text: Која вежба вам се највише допала на овом нивоу? + - type: питање + lines: '5' + text: Шта вам се допало у вези с тим? + - type: питање + lines: '1' + text: Која вежба вам се најмање допала на овом нивоу? + - type: питање + lines: '5' + text: Шта вам се није допало у вези с тим? + level: '6' + - exercises: + - contents: "### Понављање\nПонекад желите да поновите линију кода више пута, на пример у песми или причи." + code: понови 5 пута штампај 'Беба ајкула!' + type: текст + - type: текст + contents: "#### Вежба 1: Предвидите излаз\nШта ће бити излаз ових програма?" + - type: излаз + lines: '3' + answer: "Беба ајкула!\nБеба ајкула!\nБеба ајкула!" + code: понови 3 пута штампај 'Беба ајкула!' + - lines: '1' + type: излаз + code: понови 1 пут штампај 'Здраво свима!' + answer: Здраво свима! + - type: излаз + code: "а је 4\nпонови а пута штампај 'Здраво свима'" + lines: '4' + answer: "Здраво свима!\nЗдраво свима!\nЗдраво свима!\nЗдраво свима!" + - contents: "### Вежба 2: Унос\nПогледајте излаз. Напишите програм који би могао припадати овом излазу.\n\nМолимо вас: Више одговора може бити тачно. Изаберите шта год желите, све док је тачно.\nПопуните све линије, па пажљиво погледајте број линија!\n" + type: текст + - output: "Здраво сви!\nОво је једна линија.\nОво је једна линија." + answer: "штампај 'Здраво сви!'\nпонови 2 пута штампај 'Ово је једна линија.'" + type: унос + lines: '2' + - answer: "штампај 'Ово је линија 1'\nштампај 'Ово је линија 2'\nштампај 'Ово је линија 3'" + output: "Ово је линија 1\nОво је линија 2\nОво је линија 3" + type: унос + lines: '3' + - type: текст + contents: "### Вежба 3: Тачно или Нетачно\nПажљиво погледајте програме и одлучите да ли ће изазвати поруку о грешци или не." + - options: + - Тачно + - Нетачно + type: MC-код + code: "штампај 'Принц је викао за помоћ'\nпонови 3 пута 'Помоћ!'" + answer: Нетачно, недостаје штампај + - answer: Тачно + options: + - Тачно + - Нетачно + type: MC-код + code: "напред 100\nпонови 3 пута искључи 90" + - options: + - Тачно + - Нетачно + code: "људи = мама, тата, Ема, Софи\nпонови 7 пута штампај 'Судопере ће бити готове од ' људи" + type: MC-код + answer: Нетачно, недостаје насумично + - type: MC-код + options: + - Тачно + - Нетачно + answer: Тачно + code: "опције = 1, 2, 3, 4, 5, 6\nпонови 5 пута штампај 'Бацио си: ' опције насумично" + - type: текст + contents: "#### Вежба 6: Речи у програмирању\nОпет смо научили нову реч у програмирању! Објасните својим речима." + - type: дефиниши + word: поновити + lines: '1' + answer: поновно штампање линије више пута + - type: текст + contents: '#### Шта сте мислили?' + - type: питање + lines: '1' + text: Која вам је вежба највише допала у овом нивоу? + - type: питање + lines: '5' + text: Шта вам се допало у томе? + - type: питање + lines: '1' + text: Која вам је вежба најмање допала у овом нивоу? + - type: питање + text: Шта вам се није допало у томе? + lines: '5' + intro: "## Поновите!\nДо краја ове лекције, можете:\n* покренути линију кода више пута" + level: '7' diff --git a/content/pages/uk.yaml b/content/pages/uk.yaml index cee575692b2..77a94d9ba56 100644 --- a/content/pages/uk.yaml +++ b/content/pages/uk.yaml @@ -641,9 +641,9 @@ teacher-guide: - 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'. - In line 2 the computer is asked to check wheter the variable password is the same as the variable password, so itself. Which means the answer is alway yes. - So with this code the answer will always be 'You can come in' no matter what the player fills in. + Ми помітили типову помилку наших студентів: вони намагаються створити програму, яка перевіряє пароль, але роблять пароль «паролем». + У рядку 2 комп’ютеру пропонується перевірити, чи змінний пароль збігається зі змінним паролем, тобто сам. Це означає, що відповідь завжди так. + Тому з цим кодом відповідь завжди буде «Ви можете зайти» незалежно від того, що заповнює гравець. error_code: |- password {is} {ask} 'What is the password?' {if} password {is} password @@ -691,7 +691,7 @@ teacher-guide: {print} 'Robin goes home' - level: "10" sections: - - title: Students so not use the for command correctly + - title: Студенти неправильно використовують команду `{for}` 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: |- @@ -781,7 +781,7 @@ teacher-guide: solution_code: "{print} 2.5 + 2.5" - level: "13" sections: - - title: Students confuse `and` with `or` + - title: Студенти плутають `{and}` з `{or}` example: error_text: Both commands might appear similar, but their functions are very different. error_code: |- @@ -993,3 +993,36 @@ start-sections: text: "Ласкаво просимо до Hedy, ми раді допомогти вам розпочати роботу з Hedy.\n\nУ нашому [Посібнику для вчителя] (https://www.hedy.org/for-teachers/manual) міститься детальний огляд усіх функцій, але на цій сторінці є короткий огляд, щоб ви знали, що це таке, перш ніж занурюватися.\n\nКілька основних моментів, які важливо знати:\n* Hedy — це інструмент, який допомагає керувати класом дитячого програмування! Ви можете створювати власні заняття, плани уроків і стежити за успіхами дітей.\n* Вам не потрібно знати багато програмування, якщо ви починаєте, Hedy працює крок за кроком, також для вас!\n* Ви можете використовувати Hedy своєю рідною мовою, оскільки її перекладено на багато інших мов!\n* Кожна дитина може програмувати!! Hedy особливо корисний для дітей, які мають проблеми із зором, оскільки він може читати вам матеріал вголос без використання миші.\n* Ми тут, щоб допомогти, ви можете знайти нас, наприклад, на [Discord](https://discord.gg/8yY7dEme9r) або ви можете [написати нам](hello@hedy.org)." - text: "Різні вчителі в усьому світі висловили свою пристрасть до Хеді, як деякі поділилися з нами:\n\n*Неймовірно надихає! Дуже хороший спосіб зробити програмування набагато доступнішим для себе, а також для студентів. Дуже весело грати і багато можливостей для використання зі студентами. Я вважаю, що це дуже гарний інструмент! Я вважаю, що це цінний спосіб для дітей почати вивчати програмування. Python і кодування завжди були дуже захоплюючими, тому що бар’єр для навчання дуже високий. Зараз усе трохи нижче, і було пояснено, що насправді це може бути дуже легко. Мені сподобалося бачити, як Хеді намагається зробити програмування максимально доступним для користувачів!*\nНідерланди: навчаються вчителі математики (середня школа)\n\n*Простий інтерфейс і гарні приклади.* Вчитель: 3-6 класи (початкова)\n\n*Багатомовне програмування та лише сама концепція поступового програмування.* США: середня школа, 6-8 класи\n\n*Поступовий характер впровадження програмування.* Австралія: Середня школа\n\n*Продовжує автоматично.* Нідерланди: 2 HAVO-VWO\n\n*І те, що пояснення може бути голландською (а код англійською), і те, що воно створює все більше і більше можливостей.* Нідерланди: група плюс класу\n\n*Але Хеді та його поступові рівні... яка ідея, я хотів особисто подякувати вам за створення цього. Я не можу вам достатньо подякувати. Крім того, я ніколи не бачив такого рівня залученості та ентузіазму моїх студентів, як я бачив у Хеді. Ми досягли рівня 5 і плануємо витратити на це ще один тиждень у класах і лабораторіях, перш ніж розпочати роботу з Python.* Пакистан\n\n* «Реальність» програмування, воно нагадує те, як воно є в реальності.* Нідерланди: плюс група класів з 4 по 8\n\n*Покрокова діяльність. Розваги.* Нідерланди: 1e Усі рівні, 2e VWO/HAVO 2e VWO +, 3e HAVO 3e VWO\n\n*Мені дуже подобається Hedy, і він також гарно налаштований, тому його добре використовувати в початковій школі. Поступовий підхід Хеді працює дуже добре. Коротке пояснення на початку кожного рівня та короткі приклади програм допомагають дітям швидко зрозуміти, що нового в обраному рівні. Різні завдання, які діти можуть вибрати, також дуже добре працюють. Ви бачите, як діти вибирають завдання, які їм подобаються, і потім вони починають з ними працювати через рівні. Hedy — чудова розвага для дітей, які добре вміють програмувати та хочуть відчути смак справжньої мови програмування. Це хороша підготовка до середньої школи, оскільки там дається більше освіти з ІКТ.* Нідерланди: школа Oegstgeest Монтессорі\n\n*Конструкція така хороша.* Нідерланди: початкова середня школа HAVO-VWO\n\n*Я можу тримати темп класу.* Нідерланди: група 7 і 8\n\n![Фелієн навчає дітей](/images/teacherfeedback/Fkids1.JPG) *Фелієн навчає дітей* ![Діти вивчають Хеді](/images/teacherfeedback/Fkids2.JPG) *Діти вивчають Хеді*" title: Вчителі про Хеді +workbooks: + levels: + - level: '1' + intro: "### Друк і введення\nДо кінця цього уроку ви зможете:\n* Напишіть код, який друкує текст\n* Створіть історію з введенням" + exercises: + - type: текст + contents: "### Вправи \nКомп’ютер не робить щось сам по собі. Ви завжди повинні давати комп'ютеру завдання. Таке завдання називається командою. Щоб роздрукувати код, ми використовуємо команду `print`. \n\n### Друк тексту \nНа екрані ви щойно деактивували команду `print`. \nКоманда `print` друкує слово, якщо воно знаходиться в лапках. Наприклад, `print hello`. \n#### Вправа 1: Спрогнозуйте результат" + - type: вихід + code: друк Привіт усім + answer: привіт всім + lines: '1' + - type: вихід + code: друкувати goedemorgen + answer: goedemorgen + lines: '1' + - type: текст + contents: "#### Вправа 2: Помилка? \nІноді помилка прокрадається у ваш код. Це нічого страшного, але тоді Хеді не зможе правильно прочитати ваш код. \nЯкі з цих програм, на вашу думку, є неправильними?" + - type: MC-code + options: + - правильно + - неправильно + code: prnt Всім привіт! + answer: неправильно + - code: друк друк + type: MC-code + options: + - правильно + - неправильно + answer: правильно + - type: текст + contents: "### Запит на введення \n\nТільки текст трохи нудний. Ви також можете запитати _input_ в Hedy. Введення – це текст, який ви передаєте комп’ютеру. \nКомп’ютер запам’ятовує цей текст і може показати його вам пізніше. \nЦей код показує запитання \"Як вас звуть?\" \n\n```хеді \nзапитай Як тебе звати? \n``` \n\n### Показ введених даних \n\nКоманда ask зберігає відповідь, але ще не показує її. Для цього вам знадобиться команда `echo`. `echo` покаже відповідь у кінці речення. \nяк це:\n\n```хеді \nзапитай як тебе звати? \necho, тому ваше ім'я: \n``` \n\nЯкщо хтось на ім’я Олівія використає цей код, результат буде таким: \n\n``` \nтож тебе звати: Олівія \n``` \n\nМайте на увазі, що комп’ютер надрукує текст точно так, як ви його ввели. Тож із двокрапкою та однаковим використанням великих і малих літер! \n\n#### Вправа 3: Спрогнозуйте результат \n\nСпрогнозуйте результати цих програм. Зробіть вигляд, що ви вказали своє ім’я." + - type: вихід + code: "запитай як тебе звати?\necho, тому ваше ім'я:" diff --git a/content/parsons/kab.yaml b/content/parsons/kab.yaml index 2e628b0b34a..c197e1e641d 100644 --- a/content/parsons/kab.yaml +++ b/content/parsons/kab.yaml @@ -21,6 +21,9 @@ levels: 4: 1: code: "ipukimunen {is} Pikaču, Čarmander, Bulbasur, Sqertl\n{print} 'Apukimun-a ad yili d apukimun-ik!'\n{sleep}\n{print} ipukimunen {at} {random}" + 2: + story: Snulfu-d luṭu ara k-yeǧǧen ad tferneḍ arraz niḍen i tzemreḍ ad t-trebḥeḍ. + code: "arrazen {is} takeṛṛust, hamster, 1 umelyun n uṛu\narraz {is} {ask} 'Acu i tebɣiḍ ad t-trebḥeḍ?'\n{add} arraz {to_list} arrazen\n{print} 'Trebḥeḍ ' arrazen {at} {random}" 9: 2: code: |- @@ -70,3 +73,7 @@ levels: 11: 1: code: "{for} amḍan {in} {range} 10 {to} 1\n {print} amḍan\n {sleep}\n {clear}\n{print} 'Aseggas ameggaz!'" + 5: + 2: + story: Snulfu-d urar n tusnakt. + code: "{print} 'Fru ugur-a'\ntiririt {is} {ask} '88 - 16 = ?'\n{if} tiririt {is} 72 {print} 'Swaswa!'\n{else} {print} 'Yecceḍ! Tiririt d 72'" diff --git a/content/quizzes/uk.yaml b/content/quizzes/uk.yaml index 218a919ef01..2597fc76584 100644 --- a/content/quizzes/uk.yaml +++ b/content/quizzes/uk.yaml @@ -404,41 +404,55 @@ levels: code: "тварини {is} собака кішка корова\n{print} тварин {at} {random}" 9: code: |- - colors {is} blue, purple, green - chosen_color {is} {ask} Which haircolor wouldn't your like to have? - {remove} chosen_color {from} colors - {print} I will dye my hair color {at} {random} - hint: Look at line 3 + кольори {is} синій, фіолетовий, зелений + selected_color {is} {ask} Якого кольору волосся ви б не хотіли мати? + {remove} selected_color {from} кольорів + {print} Я пофарбую волосся в колір {at} {random} + hint: Подивіться на рядок 4 + mp_choice_options: + - option: 'У рядку 3 має бути написано: `{remove}` blue `{from}` кольори' + feedback: Можливо, ви захочете блакитне волосся! + - feedback: Ви хочете видалити вибраний колір, тому `{remove}` правильний. + option: У рядку 3 має бути команда `{add}` замість команди `{remove}` + - feedback: Чудова робота! + option: У рядку 4 змінна повинна називатися colors замість color + - option: Нічого, це правильний код! + feedback: Знайди помилку! + question_text: Що не так з цим кодом? + question_score: '10' + correct_answer: C 10: - question_text: What should be on the _?_? + question_text: Що має бути на _? code: |- - walkers {is} dad, mom, Sam, Petra - walked_yesterday {is} {ask} Who walked the dogs yesterday? - {print} walked_yesterday shouldn't have to walk the dogs again today - _?_ - {print} walkers {at} {random} , it's your turn to walk the dogs! + ходунки {is} тато, мама, Сем, Петра + walked_yesterday {is} {ask} Хто вчора вигулював собак? + {print} walked_yesterday сьогодні знову не доведеться вигулювати собак + _ + {print} walkers {at} {random} , ваша черга вигулювати собак! mp_choice_options: - option: |- ``` {remove} walked_yesterday {from} walkers ``` - feedback: Super! + feedback: супер! - option: |- ``` - {remove} walked yesterday {to} walkers + {remove} walked_yesterday {to} пішоходів ``` - feedback: '`{remove} {from}` or `{add} {to}`, not `{remove} {to}`' + feedback: '`{remove} {from}` або `{add} {to}`, а не `{remove} {to}`' - option: |- ``` {remove} walkers {from} yesterday ``` - feedback: yesterday is not a variable + feedback: вчора не є змінною - option: |- ``` {add} walked_yesterday {to} walkers ``` - feedback: This increased the change that the person who walked yesterday now has to do it again. That's mean. - hint: The person who walked the dog yesterday should be removed from the list. + feedback: Це збільшило ймовірність того, що людині, яка ходила вчора, тепер доведеться зробити це знову. Це підло. + hint: Того, хто вчора вигулював собаку, треба викреслити зі списку. + question_score: '10' + correct_answer: A 3: mp_choice_options: - option: "```\n{at} {random} {print} параметри\n```" @@ -446,95 +460,264 @@ levels: - option: "```\n{print} рок {at} {random}\n```" feedback: ви не завжди хочете, щоб Hedy {print} камінь, іноді вам потрібні ножиці або папір. - option: "```\n{print} параметри {at} {random}\n```" + feedback: Дуже добре! + - feedback: Уважно шукайте помилку + option: Нічого, код правильний! question_text: Як виправити помилку у рядку 2? code: "параметри {is} камінь, папір, ножиці\n{print} камінь, папір, ножиці {at} {random}" + question_score: '10' + correct_answer: C + hint: Змінна (список) називається параметрами. + 4: + mp_choice_options: + - option: "```\n{print} price\n```" + feedback: Ви не хочете `{print}` слово ціна, але ви хочете `{print}` одну ціну зі свого списку `{at} {random}` + - option: "```\n{print} prices {at} {random}\n```" + feedback: Чудово! Ви дійсно звернули увагу. + - feedback: '`{at} {random}` розміщується за змінною.' + option: "```\n{print} {at} {random} price\n```" + - option: Нічого, цей код правильний. + feedback: Уважно шукайте помилку, яку ви пропустили! + question_score: '10' + question_text: Що потрібно змінити в рядку 2, щоб надрукувати випадкову ціну? + code: "ціни {is} 1 долар, 100 доларів, 1 мільйон доларів\n{print} ціна {at} {random}" + hint: Ім'я змінної - ціни + correct_answer: B + 5: + mp_choice_options: + - option: У рядку 1 має бути `{print}` замість `{ask}` + feedback: Ні, це не так. + - feedback: Ні, це не так. + option: У рядку 2 має бути `{ask}` замість `{print}` + - feedback: Ні, це не так. + option: У рядку 2 потрібно сказати відповіді `{at} {random}` `{is}` так, ні, можливо + - feedback: Це вірно! + option: нічого, цей код ідеальний + question_score: '10' + question_text: Що не так у цьому коді? + hint: Цей код взагалі містить помилку? + correct_answer: D + code: "question {is} {ask} Що ти хочеш знати?\n{print} питання\nвідповіді {is} так, ні, можливо\n{print} відповідає {at} {random}" + 8: + mp_choice_options: + - feedback: Подивіться на команди `{remove}` + option: Ви не можете сказати, тому що Хеді `{print}` один із 3 смаків `{at} {random}` + - feedback: морська сіль вилучена зі списку + option: морська сіль + - option: паприка + feedback: Паприка зі списку вилучена + - feedback: Це вірно! + option: сметана + hint: Є 3 смаки, біт 2 видалено. Який залишився? + correct_answer: D + question_score: '10' + code: "чіпси {is} морська сіль, паприка, сметана\n{remove} морську сіль {from} чіпсів\n{remove} паприку {from} чіпсів\n{print} чіпсів {at} {random}" + question_text: Що є результатом цього коду? + 6: + mp_choice_options: + - option: У рядку 2 потрібно сказати питання замість відповідей + feedback: Ні, це неправильно + - option: Для рядка 2 потрібна команда `{is}` + feedback: Правильно + - option: У рядку 3 потрібно сказати відповідь замість відповідей + feedback: Немає відповідей викликаної змінної + - feedback: Насправді рядок 2 містить помилку. + option: нічого! Цей код чудовий! + correct_answer: B + question_score: '10' + hint: З рядком 2 щось не так. + question_text: Що не так з цим кодом? + code: "question {is} {ask} Що ти хочеш знати?\nвідповіді так, ні, можливо\n{print} відповідає {at} {random}" + 7: + mp_choice_options: + - option: Команда `{add}` видаляє випадкову книгу зі списку + feedback: Команда remove видаляє, команда add додає + - option: Команда `{add}` додає випадкову книгу до списку + feedback: Це не так. Це додає вашу відповідь до списку! + - option: Команда `{add}` додає вашу улюблену книгу до списку + feedback: Правильно! + - option: Команда `{add}` роздрукує вашу улюблену книгу. + feedback: Ні, це додає вашу улюблену книгу до списку + question_score: '10' + correct_answer: C + question_text: Що робить команда `{add}`? + code: "книги {is} Гаррі Поттер, Хоббіт, Зелені яйця та шинка\nyour_book {is} {ask} Яка твоя улюблена книга?\n{add} your_book {to} книг\n{print} книг {at} {random}" + hint: Команда `{add}` додає книгу, але яку? 4: 1: - question_text: Which of these is true? - mp_choice_options: - - option: '`{print}` and `{ask}` now need quotation marks' - feedback: That's right - - option: Only `{print}` needs quotation marks - feedback: '`{ask}` needs quotation marks too!' - - option: '`{at} {random}` doesn''t work anymore in level 4' - feedback: '`{at} {random}` still works' - - option: '`{at} {random}` now needs quotation marks' - feedback: No, but 2 other commands do. + question_text: Який із цих кодів правильний? + mp_choice_options: + - option: '``` + + {print} "Я дуже радий пройти цей тест!" + + ```' + feedback: Це вірно + - option: "```\n{print} Я дуже радий пройти цей тест!\n```" + feedback: '{print} тепер потребує лапок!' + - option: '``` + + {print} "Я дуже радий пройти цей тест!" + + ```' + feedback: 'не використовуйте апостроф або зворотні галочки' + - option: '``` + + {print} «Я дуже радий взяти участь у цьому тесті! + + ```' + feedback: обережно вживайте лапки й апостроф + correct_answer: A + hint: На рівні 4 вам потрібні лапки для 2 команд. + question_score: '10' 2: mp_choice_options: - option: |- ``` {print} `hello` ``` - feedback: This quotation mark is skewed, you need a straight one. + feedback: Ця лапка перекошена, вам потрібна пряма. - option: |- ``` {print} 'hello' ``` - feedback: Correct + feedback: Правильно - option: |- ``` {print} hello ``` - feedback: There are no quotation marks here!. + feedback: Тут немає лапок! - option: |- ``` {print} ,hello, ``` - feedback: This is a comma, you need quotation marks. + feedback: Це кома, потрібні лапки. + correct_answer: B + question_text: У якому коді використовуються відповідні лапки? + question_score: '10' + hint: Виберіть правильні лапки. 3: mp_choice_options: - option: |- ``` {print} Hi Im Hedy ``` - feedback: Add quotation marks please! + feedback: Будь ласка, додайте лапки! - option: |- ``` {print} 'Hi Im Hedy ``` - feedback: Both before and after the words you want to print should be a quotation mark. + feedback: І перед, і після слів, які ви хочете надрукувати, повинні бути лапки. - option: |- ``` '{print} Hi Im Hedy' ``` - feedback: The first quotation mark should be behind the word {print} + feedback: Перші лапки мають стояти за словом `{print}` - option: |- ``` {print} 'Hi Im Hedy' ``` - feedback: Perfect! + feedback: ідеально! + question_score: '10' + question_text: Де правильно вжиті лапки? + hint: Як перед, так і після слів, які ви хочете надрукувати, слід поставити лапки. + correct_answer: D 5: mp_choice_options: - option: |- ``` '{print} options {at} {random}' ``` - feedback: Never put the quotation mark in front of the {print} command. + feedback: Ніколи не беріть лапки перед командою `{print}`. - option: |- ``` {print} 'options' {at} {random} ``` - feedback: options is a variable. You don't literally want to print 'options {at} {random}'. + feedback: параметри є змінною. Ви не хочете буквально друкувати "параметри {at} {random}". - option: |- ``` {print} options {at} {random} ``` - feedback: That's right - - option: Nothing, the game already works! - feedback: Look carefully. There is an error. + feedback: Це вірно + - option: Нічого, гра вже працює! + feedback: Подивіться уважно. Є помилка. + correct_answer: C + question_score: '10' + question_text: Що потрібно змінити, щоб гра запрацювала? + hint: Ви не хочете, щоб Hedy буквально друкувала «параметри {at} {random}», ви хочете, щоб вона друкувала «камінь», «папір» або «ножиці». + code: "варіанти {is} камінь, папір, ножиці\n{print} 'параметри {at} {random}'" 6: - hint: 'Think carefully: what is a variable and should be outside of the quotation marks? And what are normal words that should be inside?.' + hint: 'Добре подумайте: що таке змінна і має бути поза лапками? А які нормальні слова мають бути всередині?.' + question_text: Що було б хорошим наступним рядком у цьому коді? + mp_choice_options: + - option: "```\n{print} 'Ви виграєте... ціни {at} {random}\n```" + feedback: Чудово! Ви зрозуміли! + - option: "```\n{print} Ви виграти... 'ціни {at} {random}'\n```" + feedback: Hedy буквально надрукує "ціни {at} {random}" + - feedback: Вам потрібні лапки! + option: "```\n{print} Ви виграєте... ціни {at} {random}\n```" + - option: "```\n{print} 'Ви виграєте... ціни {at} {random}'\n```" + feedback: Hedy буквально надрукує "ціни {at} {random}" + correct_answer: A + code: ціни {is} 1 долар, 100 доларів, 1 мільйон доларів + question_score: '10' 9: mp_choice_options: - - option: Ajax is going to win the champions league - feedback: Hedy could `{print}` that - - option: Real Madrid is going to win the champions league - feedback: Hedy could `{print}` that - - option: Bayer Munchen is going to win the champions league - feedback: Hedy could `{print}` that - - option: FC Barcelona is going to win the champions league - feedback: That's right. It's not in the list + - option: Аякс збирається виграти Лігу чемпіонів + feedback: Хеді могла б `{print}` це + - option: Реал Мадрид збирається виграти Лігу чемпіонів + feedback: Хеді могла б `{print}` це + - option: Баварія збирається виграти Лігу чемпіонів + feedback: Хеді могла б `{print}` це + - option: ФК "Барселона" збирається виграти Лігу чемпіонів + feedback: Це вірно. Його немає в списку + question_text: Що ніколи не з’явиться на екрані виводу? + code: "клуби {is} Реал Мадрид, Баварія Мюнхен, Манчестер Юнайтед, Аякс \n{print} clubs {at} {random} 'виграє Лігу чемпіонів'" + hint: Які варіанти Хеді вибрати навмання? + 7: + mp_choice_options: + - option: У першому рядку відсутні лапки + feedback: Правильно! + - feedback: Змінна не потребує лапок + option: У рядку 2 відсутні лапки + - option: У рядку 3 лапки відсутні + feedback: Ви ж не хочете, щоб Хеді буквально друкувала «відповіді {at} {random}», тому тут не потрібні лапки! + - feedback: Подивіться уважно. Ви пропустили помилку! + option: Нічого, цей код хороший як є! + code: "question {is} {ask} Що ти хочеш знати?\nвідповіді {is} так, ні, можливо\n{print} відповідає {at} {random}" + hint: Перевірте кожен рядок, чи потрібні йому лапки чи ні. + correct_answer: A + question_text: Що не так з цим кодом? + question_score: '10' + 8: + mp_choice_options: + - option: "```\n{print} Отже, ви обираєте двері\n```" + feedback: Нам потрібні лапки + - feedback: 'Якщо гравець обирає двері 3, Хеді скаже: «Тож ви вибираєте 3 3»' + option: "```\n{print} 'Отже, ви обираєте двері\n```" + - feedback: супер! + option: "```\n{print} 'Отже, ви обираєте двері\n```" + - option: "```\n{print} 'Отже, ви вибираєте двері\n```" + feedback: Хеді буквально надрукує «Отже, ви обираєте двері» + correct_answer: C + code: "{print} 'Ласкаво просимо на грошове шоу!'\n{print} «Перед вами 3 двері»\nдвері {is} {ask} 'Які двері ви обираєте?'" + question_text: Яким би був хороший наступний рядок для цього коду? + hint: Друге слово двері потрібно замінити на цифру, першим залишиться слово двері... + question_score: '10' + 4: + hint: Починаючи з рівня 4, потрібно використовувати лапки. + mp_choice_options: + - option: 'Слово `{print}` потрібно взяти в лапки, наприклад: `{print}`.' + feedback: Лапки не повинні бути навколо самої команди. + - feedback: супер! + option: Слова, які потрібно надрукувати, потрібно взяти в лапки. + - option: Під час використання команди `{ask}` вам не потрібні лапки + feedback: І `{print}`, і `{ask}` вимагають лапок + - option: Ви можете самі вибрати, використовувати лапки чи ні. + feedback: На жаль, Хеді суворіша за це. + correct_answer: B + question_text: Яке твердження вірне? + question_score: '10' 5: 1: question_text: What is true? diff --git a/content/slides/uk.yaml b/content/slides/uk.yaml index b41d0c5102f..970b539a9c0 100644 --- a/content/slides/uk.yaml +++ b/content/slides/uk.yaml @@ -67,8 +67,8 @@ levels: `{ask}` використовується для того, щоб поставити запитання, на яке можна відповісти. code: |- - {print} Welcome to your own rock scissors paper! - {ask} What will you choose? + {print} Ласкаво просимо до Hedy! + {print} Почніть програмувати зараз! 4: header: '{ask}' text: |- @@ -76,9 +76,8 @@ levels: `{echo}` використовується для повторення відповіді на `{ask}`. code: |- - {print} Hello! - {ask} What is your name? - {echo} hello + {print} Ласкаво просимо до ваших власних паперових ножиць! + {ask} Що ти вибереш? 5: header: '{echo}' text: |- @@ -87,10 +86,10 @@ levels: Якщо ви хочете, щоб відповідь була показана, ви можете використати останню команду цього рівня: `{echo}`. `{echo}` використовується для повторення відповіді `{ask}`. - code: "{print} Hello!\n{ask} What is your name?\n{echo} hello" + code: "{print} Привіт!\n{ask} Як тебе звати?\n{echo} привіт" 6: header: Програмуємо! - text: Пригоди відображаються у вкладках. + text: "За допомогою `{print}`, `{ask}` і `{echo}` ви вже можете створити маленьку історію.\nЦе гарний час, щоб спробувати пригоди «Папуга», «Історія» та «Камінь, ножиці для паперу»." editor: /hedy/1 7: header: Програмуємо! @@ -108,7 +107,6 @@ levels: text: Команда `{turn}` використовується, щоб змусити черепашку повернути ліворуч або праворуч. code: |- {forward} 50 - {turn} left 11: code: |- {forward} 50 @@ -163,7 +161,7 @@ levels: 4: 9: header: Очистити - text: Enjoy the adventures in level 4! + text: "На цьому рівні ви також вивчите команду {clear}.\nЗа допомогою цієї команди ви можете стерти весь текст із екрана виводу.\n\nБудьте обережні, щоб ви також завжди використовували команду сну. Якщо ви цього не зробите, комп’ютер зітре весь текст, перш ніж ви зможете його прочитати!" code: "{print} '3'\n{clear}\n{print} '2'\n{clear}\n{print} '1'\n{clear}\n{print} \"СЮРПРИЗ!\"" 7: header: Лапки та змінні @@ -441,3 +439,170 @@ levels: 1: header: Ласкаво просимо на 11 рівень text: "На цьому рівні ми додаємо нову форму команди `{for}`. На попередніх рівнях ми використовували для зі списком, але ми також можемо використовувати для з числами.\n\nТаким чином нам більше не потрібна команда `{repeat}`." + 3: + header: змінна i + code: "число = 10\n{for} i {in} {range} 1 {to} 10\n {print} i * число" + text: "На попередньому слайді змінна була названа «лічильник», оскільки вона веде зворотній відлік.\nВи, звичайно, можете використовувати будь-яке ім'я для змінної, яку хочете.\nСтандартна назва змінних у цій ситуації, яка використовується в мовах програмування, таких як Python, — «i».\nЦе виглядає так:" + 4: + debug: 'True' + code: "множник {is} {ask} 'Яка таблиця множення вам потрібна?'\n{repeat} {for} чисел {in} {range} 1 {in} 10 {times}\n {print} Це таблиця множення на множник\n {print} число 'x' фактор ' = ' i * фактор" + header: Налагодження + text: Давайте налагодимо цей код! + 5: + header: Починаємо програмувати! + text: Насолоджуйтесь пригодами на рівні 11! + 16: + 4: + header: Давайте спробуємо! + text: Насолоджуйтесь пригодами на рівні 16! + 3: + header: Налагодження + text: Давайте налагодимо цей код! + debug: 'True' + code: "{print} «Тест на дружбу» \n{subjects} = ['пісня', 'фільм', 'їжа', 'напій'] \nanswers_player_1 = [] \nanswers_player_2 = [] \nбал = 100 \n\n{for} я {in} {range} 1 {to} 4 \n answer = {ask} \"які твої улюблені\" предмети[i] \n{add} відповідь {до} answers_player_1 \n\n{print} 'Гравець 2, твоя черга!' \n{for} я {in} {range} 0 {to} 4 \n answer_player_2 = {запитати} «які улюблені теми гравця». \n {add} answer_player_2 {in} answers_player_2 \n {if} answers_player_2[2] == answers_player_1[1] \n {print} \"Правильно!\"\n {else}\n {print} \"Неправильно!\" \n бал = бал - 25 \n\n{print} 'Гравець 2, ти набрав ' очок '%' \n\n{if} бал = 100 \n {print} \"Ти чудовий друг\" \n{else} бал < 100 {або} бал >= 50 \n {print} \"Ти міг би зробити краще\" \n{else} бал < 50 \n {print} 'Ви взагалі знаєте цю людину?'" + 1: + text: На цьому рівні ви дізнаєтеся про [квадратні дужки] і як ними користуватися. + header: Ласкаво просимо на 16 рівень + 2: + header: Квадратні дужки + text: Ми збираємося створювати списки способом Python, з квадратними дужками навколо списків! Ми також зберігаємо лапки навколо кожного елемента, як ми навчилися на попередніх рівнях. Ми використовуємо квадратні дужки, щоб вказати місце в списку. Команду at random більше не можна використовувати. + code: "friends = ['Ahmed', 'Ben', 'Cayden']\n{print} friends[1] ' is the first friend on the list.'\n{print} friends[2] ' is the second friend on the list.'\n{print} friends[3] ' is the third friend on the list.'\n#now we will match 2 lists using the variable i\nlucky_numbers = [15, 18, 6]\n{for} i {in} {range} 1 {to} 3\n {print} friends[i] 's lucky number is ' lucky_numbers[i]" + 17: + 1: + header: Ласкаво просимо на 17 рівень + text: на цьому рівні ви навчитеся використовувати двокрапку та вивчите команду elif. + 4: + code: "{define} ask_direction \n direction = {ask} 'Куди ти хочеш піти?' \n {if} direction = 'назад' \n {turn} 180 \n {else} direction == 'праворуч' \n {turn} 90 \n {else} direction == 'ліворуч' \n {turn} 270 \n {forward} 100 \n\nпродовжити = 'так' \n\n{while} continue == 'yes' \n {print} ask_direction \n {sleep}\n continue = 'ти хочеш намалювати ще?' \n {sleep} до" + header: Налагодження + text: Давайте налагодимо цей код! + debug: 'True' + 2: + header: Товста кишка + code: "prices = ['1 million dollars', 'an apple pie', 'nothing']\nyour_price = prices[{random}]\n{print} 'You win ' your_price\n{if} your_price == '1 million dollars' :\n {print} 'Yeah! You are rich!'\n{else}:\n {print} 'Better luck next time..'" + text: 'Тепер ми трохи змінимо відступ. Кожного разу, коли нам потрібен відступ, нам потрібно: у рядку перед відступом.' + 5: + header: Давайте спробуємо! + text: Насолоджуйтесь пригодами на рівні 17! + 3: + text: 'На цьому рівні ви також можете використовувати нову команду: elif. elif — це скорочення від else if, і воно вам знадобиться, коли ви хочете створити 3 (або більше!) варіанти. Перевірте це!' + code: "prices = ['1 million dollars', 'an apple pie', 'nothing']\nyour_price = prices[{random}]\n{print} 'You win ' your_price\n{if} your_price == '1 million dollars' :\n {print} 'Yeah! You are rich!'\n{elif} your_price == 'an apple pie' :\n {print} 'Lovely, an apple pie!'\n{else}:\n {print} 'Better luck next time..'" + header: Elif + 13: + 5: + header: приклад + text: "У цьому прикладі ви бачите, як аргумент place використовується у функції.\nЗапустіть код і змініть «океан» і «море» на щось інше, і подивіться, що станеться." + code: "{define} song {with} place\n {print} 'My Bonnie is over the ' place\n\n{call} song {with} 'ocean'\n{call} song {with} 'sea'\n{call} song {with} 'ocean'" + 7: + header: Ще більше питань! + text: "Тепер ми об’єднали ще більше питань із функцією. Введіть цей код і подивіться, що станеться. \n\nЗверніть увагу, що змінні та аргументи мають однакові назви. Це дозволено. \nВас це бентежить? Просто використовуйте різні імена, це також дозволено. \n``` \nвизначити пісню за назвою, місцем \n print 'Моє ' ім'я ' це ' місце \n\nІм'я запитайте \"Хто?\" \nмісце запитати \"Де вони?\" \nдзвінка пісня з назвою, місцем \n```" + code: "{define} song {with} place\n {print} 'My Bonnie is over the ' place\n\n{call} song {with} 'ocean'\n{call} song {with} 'sea'\n{call} song {with} 'ocean'" + 2: + code: "name = {ask} 'як тебе звати?'\nage = {ask} 'скільки твій вік?'\n{if} name {is} 'Hedy' {and} age {is} 2\n {print} 'Ти справжня Хеді!'" + header: Команда і + text: "Команда `{and}` завжди використовується в комбінації з командою {if}.\nТаким чином можна перевірити правильність 2 тверджень. Наприклад:" + 9: + header: ходімо! + text: Насолоджуйтесь пригодами на рівні 13! + 6: + text: "Ви також можете комбінувати функції із запитанням. \n\nЩо станеться, якщо ви внесете ці зміни: \n``` \nвизначити пісню за місцем \n надрукувати місце «Моя Бонні». \n\nвідповідь запитає \"Де моя Бонні?\" \nдзвінок пісня з відповіддю \n```" + header: Приклад зі змінною + code: "{define} song {with} place\n {print} 'My Bonnie is over the ' place\n\n{call} song {with} 'ocean'\n{call} song {with} 'sea'\n{call} song {with} 'ocean'" + 8: + text: Давайте налагодимо цей код! + debug: 'True' + header: Налагодження + code: "{define} щастя {with} name \n {print} '🥳' \n{play} Г \n{play} А \n{play} Б \n{print} Назва \"Вечірка\", \" \n{define} печаль \n{print} '😞' \n{play} E \n{play} D \n{play} C \n{print} «Сподіваюся, ти почуваєшся краще», ім’я \n\nname = {ask} 'Як ваше ім'я '?' \nmood = {ask} 'Ти щасливий чи сумний?' \n{if} настрій = щасливий \n {викли} щастя {with} людиною \n{else} настрій = сумний \n {define} печаль {to} ім'я" + 1: + header: Ласкаво просимо на 13 рівень + text: "Зараз ми вивчимо `{and}` та `{or}`! Якщо ви хочете перевірити два твердження, вам не обов’язково використовувати два ifs, але можна використовувати and і or.\nВідтепер ви також можете використовувати аргументи у своїх функціях." + 3: + header: Команда або + text: "Команда `{or}` працює так само, як команда `{and}``, але лише 1 із двох тверджень має бути істинним.\n\nДавайте подивимося, що станеться, коли ви зміните `{and}` на `{or}`." + code: "name = {ask} 'як тебе звати?'\n{if} name {is} 'Hedy' {or} name {is} 'hedy'\n {print} 'Ласкаво просимо!!'" + 4: + header: Функції з аргументами + text: Тепер, коли ви навчилися використовувати функції, ви навчитеся використовувати функцію з **аргументом**. Аргумент — це змінна, яка використовується у функції. Він не використовується поза функцією. + 18: + 3: + header: Останні пригоди! + text: Насолоджуйтесь останніми пригодами на 18 рівні! + 2: + editor: /hedy/18 + header: Шлях Python + text: "Ми отримали справжній код Python! Це означає, що відтепер нам потрібно використовувати круглі дужки з print і range. \n\nКрім того, якщо ви хочете надрукувати більше одного елемента, вам потрібно розділити їх комами. \n\nОстання зміна, яку нам потрібно буде зробити, щоб отримати код Python, це зміна запиту на введення. \n\nЩоб переглянути всі приклади, натисніть вкладку «друк»." + 1: + text: Щиро вітаю! Ви досягли останнього рівня Hedy! Код, який ви створили тут, можна скопіювати в реальне середовище Python, наприклад replit або PyCharm, і ви можете продовжувати навчання там! Зауважте, однак, що Python може читати лише англійські команди, тому, якщо ви використовували інші мови, вам потрібно зараз перейти на англійську. + header: Ласкаво просимо на 18 рівень + 14: + 5: + header: Повернене значення + code: "{define} calculate_new_price {with} amount, percentage\n percentage = percentage / 100\n discount_amount = amount * percentage\n {return} amount - discount_amount\n\nold_price = {ask} 'How much is on the price tag?'\ndiscount = {ask} 'What percentage is the discount?'\n\nnew_price = {call} calculate_new_price {with} old_price, discount\n{print} 'The new price is ' new_price ' dollar'" + text: Наприклад, у цьому коді функція calculate_new_price обчислить нову ціну будь-якого товару. Це дасть вам нову ціну як значення повернення. + 6: + debug: 'True' + header: Налагодження + text: Давайте налагодимо цей код! + code: "item = 'не куплено' \n{print} \"Я хотів би купити цей товар\" \nprice == {ask} 'Яка ціна?' \n{if} ціна менша або така ж, як 10 \n {print} \"Це чудово!\" \n item = 'куплений' \n{if} ціна більша за 10 {і} менша або така ж, як 20 \n {print} \"Добре\"\n item = 'куплений' \n{if} ціна більше 20 {і} менше 50 \n {print} \"Це небагато!\" \n{if} ціна більше або дорівнює 50 \n {print} \"Ні в якому разі!\" \n{else} елемент =! купив \n {print} \"Ганьба.. Я не куплю\" \n{else}\n {print} «Я куплю це! Дякую!'" + 7: + header: Давайте до роботи! + text: Насолоджуйтесь пригодами на рівні 14! + 4: + header: Повернене значення + text: На попередніх рівнях ви навчилися створювати функції та використовувати аргументи з ними. Ще одне чудове використання функції — дозволити їй щось обчислити за вас. Ви можете надати функції обчислення, і вона дасть вам відповідь обчислення. Ця відповідь називається **поверненим значенням**. + 3: + text: "Ви також можете використовувати:\n\n== те саме, що.\n\n!= ні\n\n== використовується в операторах `{if}`." + header: Символи + code: "answer = {ask} 'Do you want to learn more?'\n{if} answer == 'yes'\n {print} 'Go to the next adventure!'\n{if} answer != 'yes'\n {print} 'That is a shame!'" + 2: + code: "age = {ask} 'How old are you?'\n{if} age < 13\n {print} 'You are younger than me!'\n{else}\n {print} 'You are older than me!'" + header: Символи + text: "Ось нові символи, які ви можете використовувати: \n\n > означає більше, ніж... \n\n Знак >= означає більше або таке ж, як... \n\n < означає менше, ніж... \n\n <= означає менше або таке ж, як... \n\nВи можете використовувати їх так:" + 1: + header: Ласкаво просимо на 14 рівень + text: На цьому рівні ви вивчите деякі нові символи, які можуть допомогти вам покращити ваші програми, наприклад >. Ви також навчитеся працювати зі значеннями, що повертаються функцією. + 15: + 1: + text: На цьому рівні ви дізнаєтеся про цикл `{while}`. + header: Ласкаво просимо на 15 рівень + 2: + header: '{while}' + text: "Ми збираємося вивчити новий цикл, цикл while! Цикл продовжується до тих пір, поки твердження є істинним. Тому не забудьте змінити значення в циклі. \n\nУ прикладі коду ми продовжуємо, доки не буде дана правильна відповідь. Якщо правильна відповідь ніколи не буде дана, цикл ніколи не закінчиться!" + code: "відповідь = 0\n{while} відповідь != 25\n answer = {ask} 'Скільки буде 5 помножити на 5?'\n{print} 'Дано правильну відповідь'" + 3: + code: "числа = 1, 2 \n\n{for} i {in} {range} 3 {to} 50 \n {add} x {to} чисел \n i = + 1 \n\nвипадкове_число = числа {випадкові} \nприпущення = 10 \n\n{while} припущення = 0 \n answer = 'Вгадай мій номер:' \n {if} відповідь >= випадкове_число \n {print} 'нижчий' \n відгадки = відгадки -1 \n {if} відповідь > випадкове_число \n {print} 'вище!' \n догадки = догадки \n {else} відповідь = випадкове_число \n {print} 'правильно' \n припущення = 10" + header: Налагодження + text: Давайте налагодимо цей код! + debug: 'True' + 4: + header: Давайте спробуємо! + text: Насолоджуйтесь пригодами на рівні 15! + 12: + 1: + text: "Починаючи з цього рівня, вам дозволено використовувати десяткові числа, а також є деякі зміни в лапках.\nВи також можете використовувати функції з цього рівня!" + header: Ласкаво просимо на 12 рівень + 5: + header: Мерехтить Мерехтить маленька зіронька! + text: "У цій програмі ви бачите приклад функції.\nДавайте подивимося, що станеться, якщо ви доповните решту пісні!" + code: "{define} twinkle\n {print} 'Twinkle'\n {print} '...'\n\n{call} twinkle\n{print} 'Up above the world so high'\n{print} 'Like a diamond in the sky'\n{call} twinkle" + 2: + text: "Цей рівень вносить деякі зміни у використання лапок.\nВідтепер **усі тексти** потрібно брати в лапки. Це включає значення змінних, елементи в списках і текст після команд {if}." + header: Лапки + code: "name = 'Hedy the Robot'\n{print} 'Hello ' name" + 6: + header: Функції + text: Як ви могли бачити в прикладі, функція — це блок коду, який можна викликати будь-коли. Ви використовуєте `{define}` для встановлення функції та `{call}` для її використання. + 7: + debug: 'True' + header: Налагодження + code: "{call} новий_учасник \n{print} 'Привіт, новий учасник!' \nusername = {ask} 'Яке ваше ім'я користувача?'\npassword = 'Який ваш пароль?' \n{print} 'Ласкаво просимо до нашого клубу!' \n\nusername = {ask} 'Будь ласка, введіть своє ім'я користувача. Ви новий учасник? Введіть New Member' \n{if} ім'я користувача = новий учасник \n{call} новий учасник \n {else}\n password = {ask} 'Будь ласка, введіть пароль'" + text: Давайте налагодимо цей код! + 3: + code: "{print} 'decimal numbers now need to use a dot'\n{print} 2.5 + 2.5" + text: "З цього рівня вам також дозволено використовувати десяткові числа. Це може зробити такі програми, як ваш ресторан, ще кращими!\n\nЧисла не потребують лапок." + header: Десяткові числа + 4: + header: Функції! + text: "На цьому рівні ви навчитеся використовувати функції. Функція — це блок коду, який можна легко використовувати кілька разів. Використання функцій допомагає нам організувати фрагменти коду, які ми можемо використовувати знову і знову. Щоб створити функцію, скористайтеся визначенням і дайте функції назву. Потім помістіть усі рядки, які вам потрібні у функції, у блоці з відступом під рядком визначення. Залиште один порожній рядок у своєму коді, щоб він виглядав гарно та акуратно. Чудова робота! Ви створили функцію! \n\nТепер, коли нам потрібен цей блок коду, ми просто використовуємо call із назвою функції, щоб викликати його! Нам не потрібно знову вводити цей блок коду." + 8: + header: Готові спробувати? + text: Насолоджуйтесь пригодами на рівні 12! diff --git a/static/js/appbundle.js b/static/js/appbundle.js index a7febc6e74d..db90b3d8b9e 100644 --- a/static/js/appbundle.js +++ b/static/js/appbundle.js @@ -62879,18 +62879,18 @@ ${o3}` : i3; "graph_title": "\u041F\u043E\u043C\u0438\u043B\u043A\u0438 \u0432 \u043A\u043E\u0436\u043D\u0456\u0439 \u043F\u0440\u0438\u0433\u043E\u0434\u0456, \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0456\u0439 \u043D\u0430 \u0440\u0456\u0432\u043D\u0456 {level}", "haunted": "\u{1F987}, \u{1F47B}, \u{1F383}", "level_title": "\u0420\u0456\u0432\u0435\u043D\u044C", - "multiple_keywords_warning": "You are trying to use the keyword {orig_keyword}, but this keyword might have several meanings. Please choose the one you're trying to use from this list and copy paste it in your code, curly braces included: {keyword_list}", - "number_of_errors": "Number of errors: {number_of_errors}", - "one_level_error": "You need to select at least one level.", + "multiple_keywords_warning": "\u0412\u0438 \u043D\u0430\u043C\u0430\u0433\u0430\u0454\u0442\u0435\u0441\u044F \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0442\u0438 \u043A\u043B\u044E\u0447\u043E\u0432\u0435 \u0441\u043B\u043E\u0432\u043E {orig_keyword}, \u0430\u043B\u0435 \u0432\u043E\u043D\u043E \u043C\u043E\u0436\u0435 \u043C\u0430\u0442\u0438 \u043A\u0456\u043B\u044C\u043A\u0430 \u0437\u043D\u0430\u0447\u0435\u043D\u044C. \u0411\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u0432\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u0456\u0437 \u0446\u044C\u043E\u0433\u043E \u0441\u043F\u0438\u0441\u043A\u0443 \u0442\u043E\u0439, \u044F\u043A\u0438\u0439 \u0432\u0438 \u043D\u0430\u043C\u0430\u0433\u0430\u0454\u0442\u0435\u0441\u044F \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0442\u0438, \u0456 \u0441\u043A\u043E\u043F\u0456\u044E\u0439\u0442\u0435, \u0432\u0441\u0442\u0430\u0432\u0442\u0435 \u0439\u043E\u0433\u043E \u0443 \u0441\u0432\u0456\u0439 \u043A\u043E\u0434, \u0432\u043A\u043B\u044E\u0447\u0430\u044E\u0447\u0438 \u0444\u0456\u0433\u0443\u0440\u043D\u0456 \u0434\u0443\u0436\u043A\u0438: {keyword_list}", + "number_of_errors": "\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043F\u043E\u043C\u0438\u043B\u043E\u043A: {number_of_errors}", + "one_level_error": "\u041F\u043E\u0442\u0440\u0456\u0431\u043D\u043E \u0432\u0438\u0431\u0440\u0430\u0442\u0438 \u0445\u043E\u0447\u0430 \u0431 \u043E\u0434\u0438\u043D \u0440\u0456\u0432\u0435\u043D\u044C.", "restaurant": "\u{1F363}, \u{1F355}, \u{1F354}", "rock": "\u2702\uFE0F, \u{1F4DC}, \u{1F5FB}", - "select_all": "Select all", - "selected": "Selected", + "select_all": "\u0412\u0438\u0431\u0440\u0430\u0442\u0438 \u0432\u0441\u0435", + "selected": "\u0412\u0438\u0431\u0440\u0430\u043D\u0435", "songs": "\u{1F3B5},\u{1F3B6}", - "successful_runs": "Successful runs: {successful_runs}", - "teacher_welcome": "Welcome to Hedy! Your are now the proud owner of a teachers account which allows you to create classes and invite students.", + "successful_runs": "\u0423\u0441\u043F\u0456\u0448\u043D\u0456 \u043F\u0440\u043E\u0431\u0456\u0436\u043A\u0438: {successful_runs}", + "teacher_welcome": "\u041B\u0430\u0441\u043A\u0430\u0432\u043E \u043F\u0440\u043E\u0441\u0438\u043C\u043E \u0434\u043E Hedy! \u0422\u0435\u043F\u0435\u0440 \u0432\u0438 \u0449\u0430\u0441\u043B\u0438\u0432\u0438\u0439 \u0432\u043B\u0430\u0441\u043D\u0438\u043A \u043E\u0431\u043B\u0456\u043A\u043E\u0432\u043E\u0433\u043E \u0437\u0430\u043F\u0438\u0441\u0443 \u0432\u0447\u0438\u0442\u0435\u043B\u044F, \u044F\u043A\u0438\u0439 \u0434\u043E\u0437\u0432\u043E\u043B\u044F\u0454 \u0432\u0430\u043C \u0441\u0442\u0432\u043E\u0440\u044E\u0432\u0430\u0442\u0438 \u043A\u043B\u0430\u0441\u0438 \u0442\u0430 \u0437\u0430\u043F\u0440\u043E\u0448\u0443\u0432\u0430\u0442\u0438 \u0441\u0442\u0443\u0434\u0435\u043D\u0442\u0456\u0432.", "turtle": "\u{1F422}", - "unsaved_class_changes": "There are unsaved changes, are you sure you want to leave this page?" + "unsaved_class_changes": "\u0404 \u043D\u0435\u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0456 \u0437\u043C\u0456\u043D\u0438. \u0412\u0438 \u0432\u043F\u0435\u0432\u043D\u0435\u043D\u0456, \u0449\u043E \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0437\u0430\u043B\u0438\u0448\u0438\u0442\u0438 \u0446\u044E \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443?" }, "ur": { "CheckInternet": "Check whether your Internet connection is working.", diff --git a/static/js/appbundle.js.map b/static/js/appbundle.js.map index db6986316e1..a90edac4388 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(/