diff --git a/docs/about.md b/docs/about.md index 831fe2af3..e46d45ba9 100644 --- a/docs/about.md +++ b/docs/about.md @@ -76,7 +76,7 @@ input.onButtonEvent(Button.B, input.buttonEventValue(ButtonEvent.Down), () => { ## Learn! -We have tons of [projects](/projects), [examples](/examples) and [courses](/courses) to get your started! +We have tons of [projects](/projects) and [examples](/examples) to get your started! ## C++ Runtime diff --git a/docs/calliope/arbeitsheft/23-4_fitness.md b/docs/calliope/arbeitsheft/23-4_fitness.md index 0eee18ac8..edebe51c8 100644 --- a/docs/calliope/arbeitsheft/23-4_fitness.md +++ b/docs/calliope/arbeitsheft/23-4_fitness.md @@ -1,7 +1,7 @@ # 23 4_Fitness ```ghost -let Tempo = 1000 +let tempo = 1000 basic.setLedColor(0xff0000) basic.pause(tempo) for (let index = 0; index < 2; index++) { @@ -37,8 +37,8 @@ Complete your program. ## Use variables @showdialog Use a variable to define the speed of your animation and adjust it easily. -## Create variable Tempo -Create a ``||variables.variable||`` and name it "Tempo". +## Create variable tempo +Create a ``||variables.variable||`` and name it "tempo". ``` ``` diff --git a/docs/calliope/arbeitsheft/33-4_licht.md b/docs/calliope/arbeitsheft/33-4_licht.md index 5421d55be..b6ee01de2 100644 --- a/docs/calliope/arbeitsheft/33-4_licht.md +++ b/docs/calliope/arbeitsheft/33-4_licht.md @@ -1,8 +1,9 @@ # 33 4 Light ```ghost +let brightness = input.lightLevel(); input.onButtonEvent(Button.B, input.buttonEventClick(), function () { -basic.showNumber(Licht) +basic.showNumber(brightness) }) ``` @@ -10,14 +11,14 @@ basic.showNumber(Licht) Write a program that saves the measured light value in a variable when the LED matrix is switched off and then display the saved value on the LED matrix. ## Create variable -Create a ``||variables.variable||`` and name it "Light". +Create a ``||variables.variable||`` and name it "brightness". ``` ``` ![](https://calliope.cc/tutorials/variable_licht.png) ## Save light intensity @showdialog -If button A is clicked, save the measured light intensity in the variable "Light". +If button A is clicked, save the measured light intensity in the variable "brightness". ## Define input Select the block ``||input.on button A is clicked|||`` as input. @@ -28,7 +29,7 @@ Use the ``||variables.set light to||`` block to set the value of the variable to ## Show light intensity @showdialog -When button B is clicked, show the value of the variable "Light". +When button B is clicked, show the value of the variable "brightness". ## Define input Place another block ``|| input.on button A ||`` clicked and change it to ``|| input.on button B ||`` clicked. @@ -36,7 +37,7 @@ Place another block ``|| input.on button A ||`` clicked and change it to ``|| in ![Button B](https://calliope.cc/tutorials/kopf_a_b.png) ## Define output -Use the ``|| basic.show number||`` block and display the value of the variable``||variables.light||``. +Use the ``|| basic.show number||`` block and display the value of the variable``||variables.brightness||``. ## Done! 👏 diff --git a/docs/calliope/arbeitsheft/42-2_orakel.md b/docs/calliope/arbeitsheft/42-2_orakel.md index 8e872de1a..75010ced7 100644 --- a/docs/calliope/arbeitsheft/42-2_orakel.md +++ b/docs/calliope/arbeitsheft/42-2_orakel.md @@ -1,17 +1,18 @@ # 42 2 Oracle ```ghost -let Zufall = 0 +let zufall = 0 input.onGesture(Gesture.Shake, function () { -Zufall = randint(0, 2) -if (Zufall == 1) { - basic.showString("Ja") -} -if (Zufall == 2) { - basic.showString("Nein") -} -if (Zufall == 3) { - basic.showString("Vielleicht") + zufall = randint(0, 2) + if (zufall == 1) { + basic.showString("Ja") + } + if (zufall == 2) { + basic.showString("Nein") + } + if (zufall == 3) { + basic.showString("Vielleicht") + } } ``` diff --git a/docs/calliope/arbeitsheft/49-1_schaetzspiel.md b/docs/calliope/arbeitsheft/49-1_schaetzspiel.md index 56cafb612..25b66139d 100644 --- a/docs/calliope/arbeitsheft/49-1_schaetzspiel.md +++ b/docs/calliope/arbeitsheft/49-1_schaetzspiel.md @@ -1,12 +1,12 @@ # 49 1 Estimation game ```ghost -let Entfernung = 0 +let distance = 0 input.onButtonEvent(Button.A, input.buttonEventValue(ButtonEvent.Click), function () { - Entfernung = Math.round(grove.measureInCentimeters(DigitalPin.C16)) + distance = Math.round(grove.measureInCentimeters(DigitalPin.C16)) }) input.onButtonEvent(Button.B, input.buttonEventValue(ButtonEvent.Click), function () { - basic.showNumber(Entfernung) + basic.showNumber(distance) }) basic.forever(function () { basic.showLeds(` @@ -32,7 +32,7 @@ Press button A to measure the distance and save it in a variable. Press button B Insert the block ``||input.on button A is clicked||`` twice and change the button to ``B`` for one block. Tip: You can duplicate the block by right-clicking. ## Define variable -To save the distance when the button is pressed and retrieve it later, create a ``||variable.variable||`` and name it *Distance*. +To save the distance when the button is pressed and retrieve it later, create a ``||variable.variable||`` and name it *distance*. ``` diff --git a/docs/calliope/arbeitsheft/50-2_personenzaehler.md b/docs/calliope/arbeitsheft/50-2_personenzaehler.md index 8551c8aa6..2a5d0fcff 100644 --- a/docs/calliope/arbeitsheft/50-2_personenzaehler.md +++ b/docs/calliope/arbeitsheft/50-2_personenzaehler.md @@ -69,4 +69,4 @@ Click on ``|Download|`` to transfer your program to your Calliope mini and test ```package grove=github:calliope-edu/pxt-grove - +``` diff --git a/docs/calliope/examples.md b/docs/calliope/examples.md deleted file mode 100644 index c5bb910ee..000000000 --- a/docs/calliope/examples.md +++ /dev/null @@ -1,17 +0,0 @@ -# Projects - -Here are some cool tutorials to get you started with your @boardname@! - -## Basic - -```codecard -[ -{ - "name": "Radio Bridge", - "description": "Send radio messages to editor", - "url": "/projects/radio-bridge", - "imageUrl": "/static/mb/projects/radio-bridge.png", - "cardType": "example" -} -] -``` \ No newline at end of file diff --git a/docs/calliope/videos.md b/docs/calliope/videos.md deleted file mode 100644 index 2b4cf48d5..000000000 --- a/docs/calliope/videos.md +++ /dev/null @@ -1,60 +0,0 @@ -## Basic - -```codecard -[ { - "name": "LEDs", - "description": "See how these amazing little devices create light in this fun and illuminating video.", - "youTubeId": "qqBmvHD5bCw", - "embedYouTube": "true", - "imageUrl": "/static/mb/behindhardware/leds.jpg" - }, - { - "name": "Buttons", - "description": "Buttons let your fingers talk to the hardware, see how they work in this video.", - "youTubeId": "t_Qujjd_38o", - "imageUrl": "/static/mb/behindhardware/buttons.jpg" - }, - { - "name": "Accelerometer", - "description": "Find out how the accelerometer detects motion in this fun video.", - "youTubeId": "byngcwjO51U", - "imageUrl": "/static/mb/behindhardware/accelerometer.jpg" - }, - { - "name": "Light Sensor", - "description": "Your Calliope mini can see the light, how does it do that?", - "youTubeId": "TKhCr-dQMBY", - "imageUrl": "/static/mb/behindhardware/light-sensor.jpg" - }, - { - "name": "Temperature Sensor", - "description": "One of the cool features on your board is the temperature sensor, how does it feel the heat?", - "youTubeId": "_T4N8O9xsMA", - "imageUrl": "/static/mb/behindhardware/temperature-sensor.jpg" - }, - { - "name": "Pin Pressed", - "description": "Touching the pins works like a button, is that magic or what?", - "youTubeId": "GEpZrvbsO7o", - "imageUrl": "/static/mb/behindhardware/pin-pressed.jpg" - }, - { - "name": "Radio", - "description": "Your board can communticate by radio, how does it do that?", - "youTubeId": "Re3H2ISfQE8", - "imageUrl": "/static/mb/behindhardware/radio.jpg" - }, - { - "name": "Servo Motor", - "description": "See how motors work and how you can use the @boardname@ to run servos.", - "youTubeId": "okxooamdAP4", - "imageUrl": "/static/mb/behindhardware/servo.jpg" - }, - { - "name": "Speakers", - "description": "Find out how speakers make sound and how you can connect them to your board.", - "youTubeId": "cxfPNc4Wefo", - "imageUrl": "/static/mb/behindhardware/speakers.jpg" - } -] -``` \ No newline at end of file diff --git a/docs/coding-cards.md b/docs/coding-cards.md deleted file mode 100644 index 7846e4f61..000000000 --- a/docs/coding-cards.md +++ /dev/null @@ -1,74 +0,0 @@ -# Coding Cards - -## Math - -```codecard -[ -{ - "name": "Make a Digital Balance", - "description": "Use the accelerometer to find the balance point", - "url": "https://drive.google.com/open?id=1Tl80unLA5_Zwkymh1flSbwuZbCIqSOxQ", - "imageUrl": "/static/coding-cards/balance-card.jpg" -}, -{ - "name": "Make a Digital Dice", - "description": "Create a shakeable dice that uses the accelerometer", - "url": "https://drive.google.com/open?id=1iW75z-7maJ3qixwv9Yuj6rA5U387qVpg", - "imageUrl": "/static/coding-cards/dice-card.jpg" -}, -{ - "name": "Make a Trundle Wheel", - "description": "Build trundle wheel that measures a distance travelled", - "url": "https://drive.google.com/open?id=1hzpBN5aqzYMvm7s_W6RQr9u4eFx1f6LK", - "imageUrl": "/static/coding-cards/trundlewheel-card.jpg" -} -] -``` - -## Games - -```codecard -[ -{ - "name": "Nervous", - "description": "Carefully move the ring but don't touch the wire!", - "url": "https://drive.google.com/open?id=1BJCkrdMoojU-ojQcOluawecw5W6kcdnZ", - "imageUrl": "/static/coding-cards/games-nervous.jpg" -}, -{ - "name": "Reaction", - "description": "Which player has the fastest reaction time?", - "url": "https://drive.google.com/open?id=1kfZKLflUrPoeveboo1LpubgaJSsFkDgY", - "imageUrl": "/static/coding-cards/games-reaction.jpg" -}, -{ - "name": "Shake the Bottle", - "description": "Shake the bottle until the fizz inside pops the lid", - "url": "https://drive.google.com/open?id=1lTZbrVP5UDG7IZeY1Kod8gw4VNcldzzZ", - "imageUrl": "/static/coding-cards/games-shake.jpg" -}, -{ - "name": "Sprite Based Games", - "description": "Try this game to see how to make sprite based games", - "url": "https://drive.google.com/open?id=1p1fm9SlFVr8NQ9ctQvhZ7H-okfxXhabW", - "imageUrl": "/static/coding-cards/games-sprite.jpg" -}, -{ - "name": "Zen", - "description": "Strike a pose but keep very still, wiggle too much and your out!", - "url": "https://drive.google.com/open?id=14JBWsx-K489GjSgvMX4kslxaHKYfdBtj", - "imageUrl": "/static/coding-cards/games-zen.jpg" -} -] -``` - -## See Also - -[Make a Digital Balance](https://drive.google.com/open?id=1Tl80unLA5_Zwkymh1flSbwuZbCIqSOxQ), -[Make a Digital Dice](https://drive.google.com/open?id=1iW75z-7maJ3qixwv9Yuj6rA5U387qVpg), -[Make a Trundle Wheel](https://drive.google.com/open?id=1hzpBN5aqzYMvm7s_W6RQr9u4eFx1f6LK), -[Nervous](https://drive.google.com/open?id=1BJCkrdMoojU-ojQcOluawecw5W6kcdnZ), -[Reaction](https://drive.google.com/open?id=1kfZKLflUrPoeveboo1LpubgaJSsFkDgY), -[Shake the Bottle](https://drive.google.com/open?id=1lTZbrVP5UDG7IZeY1Kod8gw4VNcldzzZ), -[Sprite Based Games](https://drive.google.com/open?id=1p1fm9SlFVr8NQ9ctQvhZ7H-okfxXhabW), -[Zen](https://drive.google.com/open?id=14JBWsx-K489GjSgvMX4kslxaHKYfdBtj) diff --git a/docs/courses.md b/docs/courses.md deleted file mode 100644 index f256a6b8b..000000000 --- a/docs/courses.md +++ /dev/null @@ -1,129 +0,0 @@ -# Courses - -A collection of courses and tutorials built for the @boardname@. - -## Intro to Computer Science - -MakeCode's course for learning Computer Science with the Calliope mini. This is a 14 week computer science course for middle school grades 6-8. - -```codecard -[{ - "name": "Intro to CS Online", - "description": "Online edition of the Intro to Computer Science course", - "url":"/courses/csintro", - "imageUrl": "/static/courses/csintro.jpg" -}, { - "name": "Intro to CS Classroom", - "description": "Educator edition of the Intro to Computer Science course for the classroom, including complete downloadable materials", - "url":"/courses/csintro-educator", - "imageUrl": "/static/courses/csintro-educator.jpg" -}] -``` - -## Classroom - -Courses contributed by educators to teach computing, science, and technology in the classroom. - -```codecard -[{ - "name": "Science Experiments", - "description": "Science experiment lessons with measurements and data analysis activities", - "url":"/courses/ucp-science", - "imageUrl": "/static/courses/ucp-science.jpg" -}, { - "name": "Cyber Arcade: Programming and Making with Calliope mini", - "description": "A fun and creative introduction to computer science and hands-on making for makers in elementary (ages 9–12) and middle (ages 12–14) grade levels with little to no experience in programming and 3D design.", - "url":"https://makered.org/resources/cyber-arcade-programming-and-making-with-microbit/", - "imageUrl": "/static/courses/maker-ed-cyber-arcade.png" -}, { - "name": "Learn All About Calliope mini", - "description": "Projects and integration notes for a student-led workshop from the Beacon Hill School", - "url": "https://goo.gl/XTPYpP", - "imageUrl": "/static/courses/beaconhill.jpg" -}, { - "name": "Coding and Innovation", - "description": "An 8 week \"Coding and Innovation using Calliope mini\" computer science course.", - "url": "https://sites.google.com/view/utahcodingproject/microbits/coding-innovation", - "imageUrl": "/static/courses/coding-innovation.jpg" -}] -``` - -## Computers and programming - -Tutorials, lessons, and mini-courses about programming and computing. - -```codecard -[{ - "name": "First Steps", - "description": "Learn how to get the Calliope mini working, program its features and create your first projects.", - "url": "https://microbit.org/get-started/first-steps/introduction/", - "imageUrl": "/static/courses/first-steps.png" -}, { - "name": "Make it: code it", - "description": "Quick projects to suit all ages, searchable by computing topic, level, coding language and Calliope mini feature.", - "url": "https://microbit.org/projects/make-it-code-it/", - "imageUrl": "/static/courses/make-it-code-it.png" -}, { - "name": "Networking with the Calliope mini", - "description": "A series of activities to teach the basics of computer networks.", - "url": "https://microbit.nominetresearch.uk/", - "imageUrl": "/static/courses/networking-book.png" -}, { - "name": "SparkFun Videos", - "description": "YouTube video tutorials produced by the SparkFun team!", - "url": "https://youtu.be/kaNtg1HGXbY?list=PLBcrWxTa5CS0mWJrytvii8aG5KUqMXvSk", - "imageUrl": "https://i.ytimg.com/vi/kaNtg1HGXbY/hqdefault.jpg" -}, { - "name": "Logic Lab", - "description": "Learn the basics of logic and conditional expressions.", - "url":"/courses/logic-lab", - "imageUrl":"/static/courses/logic-lab.png" -}, { - "name": "CodeJoy Remote Robotics", - "description": "Interactive remote robotics and& coding classes for students and educators", - "url": "https://www.codejoyeducation.com", - "imageUrl": "/static/courses/codejoy.png" -}] -``` - -## Experimenting - -Fun project courses - make and experiment while learning about science and programming. - -```codecard -[{ - "name": "Blocks to JavaScript", - "description": "Learn to code using JavaScript", - "url": "/courses/blocks-to-javascript", - "imageUrl": "/static/courses/blocks-to-javascript.png" -}, { - "name": "SparkFun Inventor's Kit", - "description": "Your map for navigating the waters of beginning embedded electronics, robotics and citizen science using the Calliope mini.", - "url": "https://learn.sparkfun.com/tutorials/sparkfun-inventors-kit-for-microbit-experiment-guide/introduction-to-the-sparkfun-inventors-kit-for-microbit", - "imageUrl": "/static/courses/sparkfun-inventors-kit.png" -}, { - "name": "Kitronik Inventor Kit", - "description": "11 experiments based on the Kitronik Inventor Kit", - "url": "https://www.kitronik.co.uk/blog/inventors-kit-experiment-1-help", - "imageUrl": "/static/courses/kitronik-inventor-kit.png" -}, { - "name": "Calliope mini of Things", - "description": "A hands-on course about the Calliope mini and what you can do with it.", - "url":"https://sites.google.com/view/microbitofthings", - "imageUrl": "/static/courses/microbit-of-things.jpg" -}, { - "name": "ARM University - micro:course", - "description": "Introduce learners to the world of making and programming through a series of real-world challenges that feature the Calliope mini.", - "url": "https://github.com/arm-university/micro-course", - "imageUrl": "/static/courses/armu-micro-course.png" -}, { - "name": "A-Z Robotics", - "description": "Absolute beginner's guide to learning coding, electronics and robotics on the Calliope mini", - "url":"https://tinkerspark.teachable.com/", - "imageUrl": "/static/courses/tinkerspark.jpg" -}] -``` - -## See Also - -[Intro to CS](/courses/csintro) diff --git a/docs/courses/blocks-to-javascript/command-responder.png b/docs/courses/blocks-to-javascript/command-responder.png deleted file mode 100644 index 1d7759882..000000000 Binary files a/docs/courses/blocks-to-javascript/command-responder.png and /dev/null differ diff --git a/docs/courses/blocks-to-javascript/conditional-loops.png b/docs/courses/blocks-to-javascript/conditional-loops.png deleted file mode 100644 index df286eec4..000000000 Binary files a/docs/courses/blocks-to-javascript/conditional-loops.png and /dev/null differ diff --git a/docs/courses/blocks-to-javascript/conditionals.png b/docs/courses/blocks-to-javascript/conditionals.png deleted file mode 100644 index 8565f9969..000000000 Binary files a/docs/courses/blocks-to-javascript/conditionals.png and /dev/null differ diff --git a/docs/courses/blocks-to-javascript/hello-javascript.png b/docs/courses/blocks-to-javascript/hello-javascript.png deleted file mode 100644 index 71f6dbe0e..000000000 Binary files a/docs/courses/blocks-to-javascript/hello-javascript.png and /dev/null differ diff --git a/docs/courses/blocks-to-javascript/jsautocompletion.gif b/docs/courses/blocks-to-javascript/jsautocompletion.gif deleted file mode 100644 index a5695658a..000000000 Binary files a/docs/courses/blocks-to-javascript/jsautocompletion.gif and /dev/null differ diff --git a/docs/courses/blocks-to-javascript/jsbracketmatch.gif b/docs/courses/blocks-to-javascript/jsbracketmatch.gif deleted file mode 100644 index 7c5a6fdc9..000000000 Binary files a/docs/courses/blocks-to-javascript/jsbracketmatch.gif and /dev/null differ diff --git a/docs/courses/blocks-to-javascript/jsreformat.gif b/docs/courses/blocks-to-javascript/jsreformat.gif deleted file mode 100644 index 883ef5422..000000000 Binary files a/docs/courses/blocks-to-javascript/jsreformat.gif and /dev/null differ diff --git a/docs/courses/blocks-to-javascript/jsscope.png b/docs/courses/blocks-to-javascript/jsscope.png deleted file mode 100644 index 859a9b688..000000000 Binary files a/docs/courses/blocks-to-javascript/jsscope.png and /dev/null differ diff --git a/docs/courses/blocks-to-javascript/jssquiggles.gif b/docs/courses/blocks-to-javascript/jssquiggles.gif deleted file mode 100644 index 728242101..000000000 Binary files a/docs/courses/blocks-to-javascript/jssquiggles.gif and /dev/null differ diff --git a/docs/courses/blocks-to-javascript/jstoolbox.gif b/docs/courses/blocks-to-javascript/jstoolbox.gif deleted file mode 100644 index a72b70464..000000000 Binary files a/docs/courses/blocks-to-javascript/jstoolbox.gif and /dev/null differ diff --git a/docs/courses/blocks-to-javascript/starter-blocks.png b/docs/courses/blocks-to-javascript/starter-blocks.png deleted file mode 100644 index dd72f0cb8..000000000 Binary files a/docs/courses/blocks-to-javascript/starter-blocks.png and /dev/null differ diff --git a/docs/courses/blocks-to-javascript/writing-code.png b/docs/courses/blocks-to-javascript/writing-code.png deleted file mode 100644 index ec23dcee9..000000000 Binary files a/docs/courses/blocks-to-javascript/writing-code.png and /dev/null differ diff --git a/docs/courses/logic-lab.md b/docs/courses/logic-lab.md deleted file mode 100644 index 8e288a8f6..000000000 --- a/docs/courses/logic-lab.md +++ /dev/null @@ -1,21 +0,0 @@ -# Logic Lab - -![Logic lab header image](/static/courses/logic-lab/logic-lab-header.jpg) - -A basic aspect of knowledge and understanding is whether something is true or not. Considering conditions around you and making a conclusion about something being true or false means that you are using logic. Computers and, in fact, all of digital electronics rely on this idea of logic to process information and give results in terms of conditions being either true or false. Logic is used almost everywhere in the programs you write in the places where you want decide to do one task or another. - -## Logic topics - -These topic sections teach you about applying logic to conditions and using Boolean algebra to express them. Also, you will see how logical operators work and how they combine to form more complex logic structures. - -* [Logic and Expressions](/courses/logic-lab/expressions) -* [Boolean Elements](/courses/logic-lab/elements) -* [Logic Explorer](/courses/logic-lab/explorer) -* [Logic Gates](/courses/logic-lab/logic-gates) -* [Programmable Logic](/courses/logic-lab/programmable) - -## ~button /courses/logic-lab/expressions - -Let's get started! - -## ~ \ No newline at end of file diff --git a/docs/courses/logic-lab/SUMMARY.md b/docs/courses/logic-lab/SUMMARY.md deleted file mode 100644 index 95b9eb45c..000000000 --- a/docs/courses/logic-lab/SUMMARY.md +++ /dev/null @@ -1,8 +0,0 @@ -# [Logic Lab](/courses/logic-lab) - -* [Logic Lab](/courses/logic-lab) - * [Logic and Expressions](/courses/logic-lab/expressions) - * [Boolean Elements](/courses/logic-lab/elements) - * [Logic Explorer](/courses/logic-lab/explorer) - * [Logic Gates](/courses/logic-lab/logic-gates) - * [Programmable Logic](/courses/logic-lab/programmable) diff --git a/docs/courses/logic-lab/elements.md b/docs/courses/logic-lab/elements.md deleted file mode 100644 index 746d6d306..000000000 --- a/docs/courses/logic-lab/elements.md +++ /dev/null @@ -1,214 +0,0 @@ -# Boolean elements - -Whether creating equations in Boolean algebra or using them in your programs, you'll form both simple and complex logical expressions that use basic operations to combine the logical conditions. - -## Notation - -Boolean (logical) equations are expressed in a way similar to mathmatical equations. Variables in Boolean expressions though, have only two possible values, ``true`` or ``false``. For an equation using a logical expression, the equivalant sides of the equal sign ,``=``, will be only ``true`` or ``false`` too. - -The following list shows the basic notation elements for variables and operators in Boolean expressions: - -* ``~A``: the inverse (**NOT**) of ``A``, when ``A`` is ``true``, ``~A`` is ``false`` -* ``A + B``: the value of ``A`` **OR** ``B`` -* ``A · B``: the value of ``A`` **AND** ``B`` -* ``A ⊕ B``: the value of the exclusive OR (**XOR**) of ``A`` with ``B`` -* ``Q``: equivalent result (OUTPUT) value of a logical expression - -A resulting value, ``Q``, from a logical expression in is shown like: - -``Q`` = ``A + B`` - -An equation to show logically equivalent expressions (where both sides have the same resulting value) can look like this: - -``~(A + B)`` = ``~A · ~B`` - -## Logical operators - -All Boolean expressions result from a combination of conditions and operators. These operators join individual conditons together and evaluate into a single ``true`` or ``false`` condition. The following are the basic logical operators. Their use in both Boolean algebra and in code is shown along with their truth table. - -### Identity - -Identity means that a result value is the same as the condition itself. - -``Q = A`` - -```block -let A = false -let Q = A -``` - -#### Example - Blink LEDs on press - -```blocks -let A = false -basic.forever(function () { - A = input.buttonIsPressed(Button.A) - if (A) { - basic.showIcon(IconNames.Chessboard) - } else { - basic.clearScreen() - } - basic.pause(100) -}) -``` - -#### Truth table - -A | A --|- -F | F -T | T - -### NOT (Negation) - -The NOT operator is called negation or the inverse. It takes a single logical value and makes it have the opposite value, ``true`` goes to ``false`` and ``false`` goes to ``true``. - -``Q = ~A`` - -```block -let A = false -let Q = !(A) -``` - -#### Example - Blink LEDs on not pressed - -```blocks -let A = false -basic.forever(function () { - A = input.buttonIsPressed(Button.A) - if (!(A)) { - basic.showIcon(IconNames.Chessboard) - } else { - basic.clearScreen() - } - basic.pause(100) -}) -``` - -#### Truth table - -A | ~A --|- -F | T -T | F - -### OR (Disjunction) - -The OR operator results in ``true`` when one or more conditions are ``true``. - -``Q = A + B`` - -```block -let A = false -let B = false -let Q = A || B -``` - -#### Example - Blink on any press - -```blocks -let A = false -let B = false -basic.forever(function () { - A = input.buttonIsPressed(Button.A) - B = input.buttonIsPressed(Button.B) - if (A || B) { - basic.showIcon(IconNames.Chessboard) - } else { - basic.clearScreen() - } - basic.pause(100) -}) -``` - -#### Truth table - -A | B | A + B --|-|- -F | F | F -T | F | T -F | T | T -T | T | T - -### AND (Conjunction) - -The AND operator requires that all conditions are ``true`` for the result to be ``true``. - -``Q = A · B`` - -```block -let A = false -let B = false -let Q = A && B -``` - -#### Example - Blink on double press only - -```blocks -let A = false -let B = false -basic.forever(function () { - A = input.buttonIsPressed(Button.A) - B = input.buttonIsPressed(Button.B) - if (A && B) { - basic.showIcon(IconNames.Chessboard) - } else { - basic.clearScreen() - } - basic.pause(100) -}) -``` - -#### Truth table - -A | B | A · B --|-|- -F | F | F -T | F | F -F | T | F -T | T | T - -### XOR (Exclusive OR) #xor - -Exclusive OR (XOR) means that only one or the other condition is true. Both conditions can't be true at the same time. XOR is common in Boolean algebra but it has no operator in JavaScript. Its operation can be made from combining a few simple expressions. - -``Q = A ⊕ B`` - -```block -let A = false -let B = false -let Q = (A || B) && !(A && B) -``` - -#### Example - Blink on one press or the other - -```blocks -let A = false -let B = false -basic.forever(function () { - A = input.buttonIsPressed(Button.A) - B = input.buttonIsPressed(Button.B) - if ((A || B) && !(A && B)) { - basic.showIcon(IconNames.Chessboard) - } else { - basic.clearScreen() - } - basic.pause(100) -}) -``` - -#### Truth table - -A | B | A ⊕ B --|-|- -F | F | F -T | F | T -F | T | T -T | T | F -
- -## ~button /courses/logic-lab/explorer - -NEXT: Logic Explorer - -## ~ diff --git a/docs/courses/logic-lab/explorer.md b/docs/courses/logic-lab/explorer.md deleted file mode 100644 index 6c59d792b..000000000 --- a/docs/courses/logic-lab/explorer.md +++ /dev/null @@ -1,169 +0,0 @@ -# Logic explorer - -As a way to see how the basic logical operators work, we'll make a program to test them with all their possible input values. - -## Inputs and output - -Make an ``||arrays:array||`` called ``||variables:inputs||`` with two values, ``false`` and ``true``, as logical inputs. Add another variable ``||variables:Q||`` to receive the resulting value of a logical expression as output. - -```blocks -let inputs = [false, true] -let Q = false -``` - -## Single input loop - -To start with, we'll make a single input test for the variable ``||variables:A||``. The output, in variable ``||variables:Q||``, for the logical operator test will display an icon on the LEDs. A ``true`` value shows a ``t-shirt`` and ``false`` will show a ``small diamond``. - -1. Get a ``||loops:for element||`` loop and put it in the ``||loops:on start||``. Rename the ``||variables:index||`` variable to ``||variables:A||`` and switch the ``||variables:list||`` variable to ``||variables:inputs||``. -2. Pull a ``||variables:set Q to||`` block into the ``||loops:for element||`` loop and set the value to ``||logic:false||``. -3. Go find the ``||logic:if then else||`` and put in below the ``||variables:set Q to||``. Pick up a ``||variables:Q||`` from the ``||variables:VARIABLES||`` Toolbox drawer and drop it onto the ``||logic:false||`` to replace it. -4. Move a ``||basic:show icon||`` inside the ``||logic:if then||`` section and change the image to a ``t-shirt``. This is our image for a ``true`` output. -5. Move a ``||basic:show icon||`` inside the ``||logic:else||`` section and change the image to a ``small diamond``. This is our image for a ``false`` output. -6. Just below the ``||logic:if then else||``, put in a ``||loops:pause||``, a ``||basic:clear screen||``, and another ``||basic:pause||`` block. Set the time for each ``||basic:pause||`` to ``500``. - -```blocks -let inputs = [false, true] -let Q = false -for (let A of inputs) { - Q = false - if (Q) { - basic.showIcon(IconNames.TShirt) - } else { - basic.showIcon(IconNames.SmallDiamond) - } - basic.pause(500) - basic.clearScreen() - basic.pause(500) -} -``` - -## Identity test - -The identity test is simple. It just makes the output have the same logical value as the input. Set the ``||variables:Q||`` output variable to the ``||variables:A||`` variable. - -```block -let A = false -let Q = A -``` - -### Identity truth table - -For the Identity test, these output values will show for the inputs: - -A | Q = A --|- -**false** | ``[basic.showIcon(IconNames.SmallDiamond)]`` -**true** | ``[basic.showIcon(IconNames.TShirt)]`` - -## NOT test - -Negation, or inversion, makes the output have the opposite value of the input. So, the output value is NOT the same as the input. Since there are only two possible values, the output is the other value that is NOT the input. - -Replace the ``||logic:false||`` in the ``||variables:Q||`` equation with a ``||logic:not||`` operator. Pull the ``||variables:A||`` variable down from the ``||loops:for element||`` loop and drop it inside the ``||logic:not||`` operator. - -```block -let A = false -let Q = !A -``` - -### NOT truth table - -For the NOT test, these output values will show for the inputs: - -A | ~A --|- -**false** | ``[basic.showIcon(IconNames.TShirt)]`` -**true** | ``[basic.showIcon(IconNames.SmallDiamond)]`` - -## Two input loop - -For the rest of the operator tests, we need to have another input variable. This variable comes from a second ``||loops:for element||`` loop. With one input variable there was just two possible input values. Adding a second input variable increases the number of possible input combinations by two times. Now there will be 4 different input possibilities. This will result in the truth tables having 4 rows for the operator tests. - -Go get another ``||loops:for element||`` loop and put it in so that it surrounds all the inside the first loop. Rename the ``||variables:index||`` variable to ``||variables:B||`` and switch the ``||variables:list||`` variable to ``||variables:inputs||``. - -```blocks -let inputs = [false, true] -let Q = false -for (let A of inputs) { - for (let B of inputs) { - Q = !A - if (Q) { - basic.showIcon(IconNames.TShirt) - } else { - basic.showIcon(IconNames.SmallDiamond) - } - basic.pause(500) - basic.clearScreen() - basic.pause(500) - } -} -``` - -## OR test - -Now, grab an ``||logic:or||`` operator and replace the ``||logic:not||`` in the ``||variables:Q||`` equation with it. Pull the ``||variables:A||`` variable down from the outside ``||loops:for element||`` loop and drop it in on the left side the ``||logic:or||`` operator. Drag down the ``||variables:B||`` variable down from the inside ``||loops:for element||`` loop and drop it in on the right side the ``||logic:or||`` operator. - -```block -let A = false -let B = false -let Q = A || B -``` -### OR truth table - -For the OR test, these output values will show for the inputs: - -A | B | A + B --|-|- -**false** | **false** | ``[basic.showIcon(IconNames.SmallDiamond)]`` -**false** | **true** | ``[basic.showIcon(IconNames.TShirt)]`` -**true** | **false** | ``[basic.showIcon(IconNames.TShirt)]`` -**true** | **true** | ``[basic.showIcon(IconNames.TShirt)]`` - -## AND test - -Now, switch the ``||logic:or||`` operator type in the ``||variables:Q||`` equation to the ``||logic:and||`` operator type: - -```block -let A = false -let B = false -let Q = A && B -``` - -### AND truth table - -For the AND test, these output values will show for the inputs: - -A | B | A · B --|-|- -**false** | **false** | ``[basic.showIcon(IconNames.SmallDiamond)]`` -**false** | **true** | ``[basic.showIcon(IconNames.SmallDiamond)]`` -**true** | **false** | ``[basic.showIcon(IconNames.SmallDiamond)]`` -**true** | **true** | ``[basic.showIcon(IconNames.TShirt)]`` - -## XOR test - -To test XOR, we'll use the XOR expression from [Boolean elements](/courses/logic-lab/elements#xor). Drag and place the ``||logic:LOGIC||`` blocks in to make the ``||variables:Q||`` equation to look like this: - -```block -let A = false -let B = false -let Q = (A || B) && !(A && B) -``` -### XOR truth table - -For the XOR test, these output values will show for the inputs: - -A | B | A ⊕ B --|-|- -**false** | **false** | ``[basic.showIcon(IconNames.SmallDiamond)]`` -**false** | **true** | ``[basic.showIcon(IconNames.TShirt)]`` -**true** | **false** | ``[basic.showIcon(IconNames.TShirt)]`` -**true** | **true** | ``[basic.showIcon(IconNames.SmallDiamond)]`` -
- -## ~button /courses/logic-lab/logic-gates - -NEXT: Logic Gates - -## ~ \ No newline at end of file diff --git a/docs/courses/logic-lab/expressions.md b/docs/courses/logic-lab/expressions.md deleted file mode 100644 index 9f025d855..000000000 --- a/docs/courses/logic-lab/expressions.md +++ /dev/null @@ -1,148 +0,0 @@ -# Logic and expressions - -The use and study of _logic_ involves finding a new fact by analyzing whether some other facts, when brought together, can prove that fact to be true. Some facts, or conditions, when looked at together may prove another fact to be true, or maybe false. - -If the temperature outside is below freezing and you don't have a coat, you will feel cold. If you're not sick, then you will feel well. If you can swim or ride in a boat on water, you will stay afloat. These are statements of fact that result from some condition being true. - -## Truth statements - -By taking some facts and putting them into a logical form, we can make an arithmetic that helps us analyze them and make a conclusion. Using the examples just mentioned, let's turn them into some logical word equations: - -* ``Outside temperature is freezing`` **AND** ``I have no coat`` **=** ``I feel cold`` -* **NOT** ``sick`` **=** ``I feel well`` -* ``I can swim`` **OR** ``I'm in a boat`` **=** ``I'm floating`` - -You see the AND, NOT, and OR in the example word equations? These are our logical _operators_. Every day we make decisions when we think about one or more facts together using these operators. Sometimes, it's necessary for all facts to be true in order for the conclusion to be true. This is the case when the AND operator is used. When analyzing facts with the OR operator, only one fact needs to be true for the conclusion to be true also. - -Making a decision may require more than just one or two facts. When this happens, another operator is needed to combine the facts together to make a conclusion. In the last example word equation, you actually might not be floating if just those two condtions are true. To correctly prove that you're actually floating, you need to state that you're in water too. - -* **(**``I can swim`` **OR** ``I'm in a boat``**) AND** ``I'm in water`` **=** ``I'm floating`` - -To prove that you're floating, the two facts that you can swim or you are in a boat must be made into a single fact that is combined with the other fact that you are also in water. Otherwise, if you're able to swim but still on land, or in a boat that is on the beach, you're not not floating. - -## Boolean algebra - -As a way to reduce the conditions, or facts as we've called them, into a form that is more compact, an algebra was invented. George Boole made a type of arithmetic (Boolean algebra) that uses symbols for the conditions, the operators, and the result. The conditions are considered as variables that have the value of either ``true`` or ``false``. the operators like AND, OR, and NOT are single character symbols. If we want to change the statement "I'm happy when it's sunny or when I'm eating a donut" into a Boolean equation, we could start by making the conditions into variables. - -* Variable ``A`` = ``"It's sunny"`` -* Variable ``B`` = ``"I've eaten a donut"`` - -The result then, is a variable called ``Q`` that is true when you're happy and is a value of an operation of ``A`` with ``B``. This operation is OR which is represented by the ``+`` symbol. - -``Q`` = ``A + B`` - -The result of ``Q`` is ``true`` when either it's sunny or you've had a donut. If other things make you happy, like being on vacation, you could add that to the equation. - -* Variable ``C`` = ``"I'm on vacation"`` - -``Q`` = ``A + B + C`` - -It could be that you're easy to please and you just have to feel well to be happy. So, you're happy when your NOT sick. We'll use the ``~`` to mean NOT in our equation. - -* Variable ``A`` = ``"I'm sick"`` - -``Q`` = ``~A`` - -In the situation where all conditions must be true for the result to be true, the conditions use the AND operation. For the sun to shine on you, the sky must be clear and it has to be daytime. We put these two facts together with the AND symbol ``·``. - -* Variable ``A`` = ``"The sky is clear"`` -* Variable ``B`` = ``"It's daytime"`` -* Result ``Q`` = ``"The sun is shining"`` - -``Q`` = ``A · B`` - -## Expressions - -Sometimes different operations on the same conditions can make equivalent results. If we take the opposite case of the last example where the sun is not shining, the variables for that are: - -* Variable ``A`` = ``"The sky is clear"`` -* Variable ``B`` = ``"It's daytime"`` -* Result ``Q`` = ``"The sun is shining"`` -* Result ``~Q`` = ``"The sun is NOT shining"`` - -To make the opposite of ``"the sun is shining"`` we negate, use the NOT symbol, on both sides of the equation. - -``~Q`` = ``~(A · B)`` - -Now, let's think of the sun NOT shining due to negative conditions. If the sky isn't clear OR it's not daytime, then the sun isn't shining. So, the NOT symbol is put in before the variables for each condition so that ``"the sun is NOT shining"`` has another equation like this: - -``~Q`` = ``~A + ~B`` - -We see that the side with the ``A`` and ``B`` variables in both equations are equivalent to each other since they both equate to ``~Q``: - -``~(A · B)`` = ``~A + ~B`` - -The logic equation now doesn't include the result variable ``Q`` but instead there are two _expressions_ that are logically equivalent on each side. - -### ~ hint - -#### De Morgan's Thereom - -That last equation, ``~(A · B)`` = ``~A + ~B``, demonstrates an inportant property in Boolean algebra. It's called De Morgan's Thereom which says that the inverse (NOT) of a conjunction (AND) is logically equivalent to the disjunction (OR) of two inverses (NOT). Also, the inverse (NOT) of a disjunction (OR) is logically equivalent to the conjunction (AND) of two inverses (NOT). - -This easier understood by seeing the Boolean equations for both cases: - -``~(A · B)`` = ``~A + ~B`` - ->-- AND -- - -``~(A + B)`` = ``~A · ~B`` - -### ~ - -## Truth tables - -A truth table is a way to see all possible condtions for the variables in a logical expression and to chart the results. Using the truth statement about when it's freezing outside and you have no coat, here's the truth table showing the possible conditions and their results: - -It's freezing | I have no coat | I feel cold --|-|- -false | false | false -false | true | false -true | false | false -true | true | true -
- -Because you feel cold only when both conditions are true, the statement becomes an AND expression in Boolean algebra. - -* Variable ``A`` = ``"it's freezing"`` -* Variable ``B`` = ``"I don't have a coat"`` - -``A · B`` = ``Q`` - -A truth table for the Boolean variables in the expression have the same values as the table for the truth statement (``true`` and ``false`` are abbreviated to just ``T`` and ``F``). - -A | B | Q --|-|- -F | F | F -F | T | F -T | F | F -T | F | T -
- -What would happen if we changed the condition of ``"I have no coat"`` to ``"I have a coat"``? How does that affect truth table about how cold you feel? - -It's freezing | I have a coat | I feel cold --|-|- -false | false | false -false | true | false -true | false | true -true | true | false -
- -A | B | Q --|-|- -F | F | F -F | T | F -T | F | T -T | F | F -
- -To write a Boolean equation for when you feel cold, we find the condtions in the table where ``Q`` is ``true``. Here we see that you will feel cold only in one row, when condition ``A`` is ``true`` and condtion ``B`` is ``false``. The Boolean equation for these conditions is this: - -``A · ~B`` = ``Q`` - -## ~button /courses/logic-lab/elements - -NEXT: Boolean Elements - -## ~ \ No newline at end of file diff --git a/docs/courses/logic-lab/logic-gates.md b/docs/courses/logic-lab/logic-gates.md deleted file mode 100644 index f045bb614..000000000 --- a/docs/courses/logic-lab/logic-gates.md +++ /dev/null @@ -1,93 +0,0 @@ -# Logic Gates - -![OR gate symbol](/static/courses/logic-lab/logic-gates/full-adder.png) - -In the real world digital devices aren't the abstract logical expressions of Boolean algebra, but they are implementations of these expressions in hardware. The logical expressions are translated into device structures called _logic gates_. A logic gate is both a symbolic representation of a logical operation and, when used in digital electronics, it is an actual circuit in hardware. A single logic gate is usually made of several transistors an shares space with many others in an integrated circuit. - -Each of the basic operators we learned about in the [expressions](/courses/logic-lab/expressions) section have a gate symbol. The symbol takes the place of the operator and the variables are the inputs to the gate. The resulting value from the expression equation is the output of the gate. The output of a gate can be a final result or it can be connected as an input to yet another gate. - -## Gate symbols - -Logic gates are symbols that can directly replace an expression in Boolean arithmetic. Each one has a different shape to show its particular function. The inputs (Boolean variables) enter at the left of the symbol and the output leaves from the right. When combined together, several gates can make a complex logical evaluation system that has many inputs and outputs. Digital computers are designed by connecting thousands, or millions, of these gates to together. - -### NOT gate - -The NOT gate is a forward arrow with a small circle at the output. The circle part of the symbol is what says that the output is negating the input. - -![NOT gate symbol](/static/courses/logic-lab/logic-gates/not-gate.png) - -### OR gate - -Th OR gate has a curved input side and a sharp pointed output. - -![OR gate symbol](/static/courses/logic-lab/logic-gates/or-gate.png) - -### AND gate - -The AND gate has a flat input side and round output side. - -![AND gate symbol](/static/courses/logic-lab/logic-gates/and-gate.png) - -### Exclusive OR (XOR) gate - -The exclusive or gate symbol is just like the OR gate but it has an additonal curved line crossing the inputs. - -![XOR gate symbol](/static/courses/logic-lab/logic-gates/xor-gate.png) - -## Combined logic - -When you connect multiple gates together you have a combined logic system or _combinatorial logic_. To design a combined logic system we can use a truth tables to match logical outputs for out various input conditions. Boolean expressions are written from the conditions in the table. Then, we can directly convert the expression into a diagram of logic gates. - -You might remember that back in [Boolean elements](/courses/logic-lab/elements#xor) we saw that there was no operator to use in code for XOR. It was was made up using a combination of AND, OR, and NOT operators: - -```block -let A = false -let B = false -let Q = (A || B) && !(A && B) -``` - -Let's map the input and output conditions in a truth table for a combined logic system for XOR. We'll find all the conditions that cause a ``true`` result and create a Boolean expression for them. - -A | B | A ⊕ B --|-|- -F | F | F -F| T | T -T| F | T -T | T | F -
- -There are two conditions where the result column has ``true`` values. The first conditon is when ``A`` is ``false`` and ``B`` is ``true`` which is expressed as ``~A · B``. The second conditon is when ``A`` is ``true`` and ``B`` is ``false`` which is expressed as ``A · ~B``. Our XOR expression is ``true`` when one of these conditions are ``true`` which is written like: - -``A ⊕ B`` = ``(~A · B) + (A · ~B)`` - -In code this expression is formed with these logic blocks: - -```block -let A = false -let B = false -let Q = (!A && B) || (A && !B) -``` - -Coverting the equation to logic gates makes the following diagram. Notice how each gate "connects" the variables together just like the logic blocks in the code above. - -![Combinatorial XOR first version](/static/courses/logic-lab/logic-gates/combinatorial1-xor.png) - -However, if we take the other two unused conditions from the truth table that make the XOR operation ``false``, can make the negative equation for XOR, called a NXOR: - -``~(A ⊕ B)`` = ``(~A · ~B) + (A · B)`` - -To get back to ``A ⊕ B`` we have to negate this negative equation. Then, with the help of [De Morgan's Thereom](/courses/logic-lab/expressions#de-morgan-s-thereom), we get a different equation for XOR but it's still logically equivalent to the original one. - -``A ⊕ B`` = ``(A + B) · ~(A · B)`` - -When this equation is converted to logic gates, there's one fewer gate than in the first diagram. - -![Combinatorial XOR second version](/static/courses/logic-lab/logic-gates/combinatorial2-xor.png) - -This diagram has less complexity than the first one. Reduction in the number of gates to accomplish the same logical result is one of the primary goals for digital logic design. For electronic devices, this allows more gates to use the limited amount of space on an integrated circuit. - -## ~button /courses/logic-lab/programmable - -NEXT: Programmable Logic - -## ~ \ No newline at end of file diff --git a/docs/courses/logic-lab/programmable.md b/docs/courses/logic-lab/programmable.md deleted file mode 100644 index a48e0b35a..000000000 --- a/docs/courses/logic-lab/programmable.md +++ /dev/null @@ -1,231 +0,0 @@ -# Programmable logic - -Logic gates are formed by connecting transistors together on a semiconductor material to make an integrated circuit. The wafers, or chips, of semiconductor contain lots of logic gates that make up different types of devices which work together to read, store, calculate, and transmit digital information. - -Most integrated circuits contain a specific arrangement logic gates at the time they are manufactured. Because of their physical and chemical properties, some semiconductors can let you change connections between the gates after the device is manufactured. By applying special voltages at programming pins, a custom arrangement of gates can be "programmed" into the integrated circuit. These types of semiconductors are part of a category of electronics called _Programmable Logic Devices (PLD)_. There are many different kinds. Some of them you program only once and others you can erase the original gate arrangement and program in new ones multiple times. - -We can use the @boardname@ to create our own PLD. The digital pins are the inputs for the logic circuits. The logic gates we program are logical expressions in code that combine the digital inputs we read from the pins. The result of the expression is written to a digital output pin. - -## Board PLD - -The physical idea of using your board as a PLD looks like this: - -![Board with to logic inputs and one output](/static/courses/logic-lab/pld/mbit-pld.png) - -The logic inputs for `A` and `B` are connected to digital input pins. The resulting output `Q` is connected to a digital output pin. We can make a general representation of your board as a PLD by selecting some digital pins to use as inputs and outputs for our programmable logic. - -![Generic PLD representation](/static/courses/logic-lab/pld/generic-pld.png) - -By "connecting" the pins together with code, we can program virtual logic gates and make the board act like a PLD. With multiple pins and some more code, we can even create a combined logic circuit. - -![Gates inside the PLD diagram](/static/courses/logic-lab/pld/not-and-or.png) - - - -## Programmable NOT gate - -The **NOT** gate takes the logic value of the input and inverts it at the output. This is a single input gate using just the **P0** pin for input. - -![NOT gate with pin assignments](/static/courses/logic-lab/pld/not-gate-pins.png) - -The **NOT** gate is wired using alligator test clips as shown in the following diagram. The output clip is connected to pin **P2**. - -![NOT gate wiring diagram](/static/courses/logic-lab/pld/not-gate-pld.png) - -The script to program the **NOT** gate is simply a logical inverse of ``||pins:digital read pin||`` written to an output pin with ``||pins:digital write pin||``. - -```block -if (pins.digitalReadPin(DigitalPin.P0) > 0) { - pins.digitalWritePin(DigitalPin.P2, 0) -} else { - pins.digitalWritePin(DigitalPin.P2, 1) -} -``` - -## Programmable OR gate - -The **OR** gate takes two inputs and makes the output ``true`` if any input is ``true``. The **P0** and **P1** pins are the inputs. - -![OR gate with pin assignments](/static/courses/logic-lab/pld/or-gate-pins.png) - -The **OR** gate is wired using alligator test clips as shown in this diagram. The output clip is connected to pin **P2**. - -![OR gate wiring diagram](/static/courses/logic-lab/pld/or-gate-pld.png) - -The script to program an **OR** gate is two ``||pins:digital read pin||`` blocks, evaluated with an ``||logic:or||``, and the result is written to an output pin with ``||pins:digital write pin||``. - -```block -if ((pins.digitalReadPin(DigitalPin.P0) > 0) || pins.digitalReadPin(DigitalPin.P1) > 0) { - pins.digitalWritePin(DigitalPin.P2, 1) -} else { - pins.digitalWritePin(DigitalPin.P2, 0) -} -``` - -## Programmable AND gate - -The **AND** gate takes two inputs and makes the output ``true`` if both inputs are ``true``. The **P0** and **P1** pins are the inputs. - -![AND gate with pin assignments](/static/courses/logic-lab/pld/and-gate-pins.png) - -The **AND** gate is wired using alligator test clips as shown in the next diagram. The output pin is connected to pin **A2**. - -![AND gate wiring diagram](/static/courses/logic-lab/pld/and-gate-pld.png) - -The script for an **AND** gate is two ``||pins:digital read pin||`` blocks, evaluated with an ``||logic:and||``, and the result is written to an output pin with ``||pins:digital write pin||``. - -```block -if ((pins.digitalReadPin(DigitalPin.P0) > 0) && pins.digitalReadPin(DigitalPin.P1) > 0) { - pins.digitalWritePin(DigitalPin.P2, 1) -} else { - pins.digitalWritePin(DigitalPin.P2, 0) -} -``` - -## Combined logic - -You can program your board to have multiple logic gates that operate on the two inputs. Just combine the three logic gate scripts from above into one ``||loops:forever||`` loop. If you have an expansion connector for your @boardname@, you could program multiple outputs for your logic system. You could also use one extra input pin as an observer pin to test the outputs of your combined logic. The different outputs feedback to the observer pin so it will see what their logic levels are. Here's a schematic for a multiple gate system. - -![Calliope mini NOT, AND, OR gate PLD](/static/courses/logic-lab/pld/not-and-or-pld.png) - -The combined logic for our multiple gate PLD is programmed like this: - -```blocks -let A = false -let B = false -basic.forever(function () { - A = pins.digitalReadPin(DigitalPin.P0) > 0 - B = pins.digitalReadPin(DigitalPin.P1) > 0 - - if (A) { - pins.digitalWritePin(DigitalPin.P2, 0) - } else { - pins.digitalWritePin(DigitalPin.P2, 1) - } - if (A || B) { - pins.digitalWritePin(DigitalPin.P3, 1) - } else { - pins.digitalWritePin(DigitalPin.P3, 0) - } - if (A && B) { - pins.digitalWritePin(DigitalPin.C4, 1) - } else { - pins.digitalWritePin(DigitalPin.C4, 0) - } - basic.pause(100) -}) -``` - -### Logic observer - -As easy way to see what the outputs of our PLD are, you can use the **P6** pin as a logic observer input and display the letter ``T`` for a ``true`` output value and the letter ``F`` for ``false``. - -```blocks -basic.forever(function () { -if (pins.digitalReadPin(DigitalPin.C6) > 0) { - basic.showString("T") - } else { - basic.showString("F") - } - basic.pause(100) -}) -``` - -### Input tests - -You can test different input combinations by connecting the other ends of alligator clip leads on pins **P0** and **P1** to either **GND** or **3V**. The **GND** pin will make a ``false`` input value and **3V** will make a ``true`` input value. - -If you have an expansion connector for your @boardname@, you can use the combined logic script and the logic observer code to check each ouptput. Move the other end of the alligator clip lead connected to the observer pin **P6** to each of the outputs **P2**, **P3**, and **P4** to see the result of the logic operation programmed for those pins. - -If you just have the @boardname@ by itself, you can test each logic function using only the scripts for each logic gate. Just put the script inside a ``||loops:forever||`` loop and place a ``||basic:show string||`` block with the logic letter after each ``||pins:digital write pin||``. - -This is the code for the **NOT** gate: - -```blocks -basic.forever(function() { - if (pins.digitalReadPin(DigitalPin.P0) > 0) { - pins.digitalWritePin(DigitalPin.P2, 0) - basic.showString("F") - } else { - pins.digitalWritePin(DigitalPin.P2, 1) - basic.showString("T") - } - basic.pause(100) -}) -``` - -#### NOT truth table - -As an example, here's the truth table with pin voltages for the **NOT** operation: - -P0 | P2 | Display --|-|- -GND | 3V | ``[basic.showString("T")]`` -3V | GND | ``[basic.showString("F")]`` -
- -Do test connections for the inputs, then check and record the results for the **OR** and **AND** outputs. - -#### OR truth table - -P0 | P1 | P3 | Display --|-|-|- -GND | GND | ? | ? -GND | 3V | ? | ? -3V | GND | ? | ? -3V | 3V | ? | ? - -#### AND truth table - -P0 | P1 | P4 | Display --|-|-|- -GND | GND | ? | ? -GND | 3V | ? | ? -3V | GND | ? | ? -3V | 3V | ? | ? - -### XOR device - -As we learned earlier, the **XOR** gate operation is made up from several other gates. The result `Q` was made from this expression in code: - -```block -let A = false -let B = false -let Q = (!A && B) || (A && !B) -``` - -We'll make an **XOR** gate by programming a combined logic device for it. This time let's say that the whole @boardname@ is a programmed **XOR** gate. - -![XOR symbol with board image](/static/courses/logic-lab/pld/xor-mbit.png) - -Let's use the same wiring diagram as we did for the **OR** gate using **P0** and **P1** as input pins with **P2** as the output pin. - -![XOR gate wiring diagram](/static/courses/logic-lab/pld/xor-gate-pld.png) - -Our logic gate script is a bit different this time. To simplify forming the expression for **XOR**, we'll assign variables to the input and output values. - -```blocks -let A = false -let B = false -basic.forever(function () { - A = pins.digitalReadPin(DigitalPin.P0) > 0 - B = pins.digitalReadPin(DigitalPin.P1) > 0 - if (!(A) && B || A && !(B)) { - pins.digitalWritePin(DigitalPin.P2, 1) - basic.showString("T") - } else { - pins.digitalWritePin(DigitalPin.P2, 0) - basic.showString("F") - } - basic.pause(100) -}) -``` - -Connect the inputs for **P0** and **P1** according to the **XOR** truth table and see if the outputs in the table match your results. - -P0 | P1 | P2 | Display --|-|-|- -GND | GND | GND | ``[basic.showString("F")]`` -GND | 3V | 3V | ``[basic.showString("T")]`` -3V | GND | 3V | ``[basic.showString("T")]`` -3V | 3V | GND | ``[basic.showString("F")]`` diff --git a/docs/device/reactive.md b/docs/device/reactive.md index b67e9241f..7dd18e135 100644 --- a/docs/device/reactive.md +++ b/docs/device/reactive.md @@ -4,21 +4,23 @@ What sort of a *computing system* is the Calliope mini? -## ~hint +### ~hint + +#### Types of computing systems There are different types of computing systems, to address different kinds of problems that arise in practice: *transaction processing systems* are used by banks to handle huge numbers of financial transactions by their customers; *distributed systems* make a set of networked computers appear as one big computer (like Google’s search engine); there are also *parallel systems*, such as graphic cards, which perform a huge number of primitive operations simultaneously, using a great number of small processing cores. -## ~ +### ~ The Calliope mini is a *reactive system* – it reacts continuously to external events, such as a person pressing the **A** button of the Calliope mini or shaking the device. The reaction to an event may be to perform a computation, update variables, and change the display. After the device reacts to an event, it is ready to react to the next one. If this sounds like a computer game, that’s because most computer games are reactive systems too! ## Responsiveness -We want reactive systems to be responsive, which means to react in a timely manner to events. For example, when you play a computer game, it’s frustrating if you press a button to make a character jump, but it doesn’t immediately jump. A delay in reacting, or lack of responsiveness, can be the difference between life and death, both in the real and virtual worlds. +We want reactive systems to be responsive, which means to react in a timely manner to events. For example, when you play a computer game, it’s frustrating if you press a button to make a character jump, but it doesn’t immediately jump. A delay in reacting, or lack of responsiveness, can be the difference between life and death, both in the real and virtual worlds. Let’s consider a simple example: you want to program your Calliope mini to accurately count the number of times the **A** button has been pressed and continuously display the current count on the 5x5 [LED screen](/device/screen). Because the LED screen is small, we can only display one digit of a number at a time on it. The [show number](/reference/basic/show-number) function will scroll the digits of a number across the screen so you can read it. -Let’s say that the current count is 42 and the number 42 is scrolling across the LED screen. This means there is some code executing to perform the scroll. So, what should happen if you press the **A** button during the scroll? It would be a bad idea to ignore the button press, so some code should record the occurrence of the button press. But we just said there already is code running in order to scroll the number 42! If we wait until the code scrolling the 42 has finished to look for a button press, we will miss the button press. We want to avoid this sort of unresponsiveness. +Let’s say that the current count is 42 and the number 42 is scrolling across the LED screen. This means there is some code executing to perform the scroll. So, what should happen if you press the **A** button during the scroll? It would be a bad idea to ignore the button press, so some code should record the occurrence of the button press. But we just said there already is code running in order to scroll the number 42! If we wait until the code scrolling the 42 has finished to look for a button press, we will miss the button press. We want to avoid this sort of unresponsiveness. ## Concurrency @@ -36,7 +38,7 @@ In order to be responsive, we would like to *interrupt* the execution of sequenc ![Execution sequence diagram: S1 and S2](/static/mb/device/reactive-0.png) -The result is that it takes sequence **S1** a little longer to complete, due to the interruptions to execute sequence **S2**, but we are checking often enough to detect a press of button **A** . When **S2** detects a press of button **A**, then the sequence **S3** can be executed before **S1** resumes: +The result is that it takes sequence **S1** a little longer to complete, due to the interruptions to execute sequence **S2**, but we are checking often enough to detect a press of button **A** . When **S2** detects a press of button **A**, then the sequence **S3** can be executed before **S1** resumes: ![Execution sequence diagram: S1 and S2 with interrupt and one S3 slice](/static/mb/device/reactive-1.png) @@ -48,7 +50,7 @@ The Calliope mini’s *scheduler* provides the capability to concurrently execut The first job of the scheduler is to allow multiple *subprograms* to be queued up for later execution. For our purposes, a subprogram is just a statement or sequence of statements in the context of a larger program. Consider the program below for counting button presses. -```typescript +```typescript-ignore let count = 0 input.onButtonEvent(Button.A, input.buttonEventValue(ButtonEvent.Down), () => { @@ -63,14 +65,14 @@ basic.forever(() => { The program above contains three statements that execute in order from top to bottom. The first statement initializes the global variable `count` to zero. -```typescript +```typescript-ignore // statement 1 let count = 0 ``` -The second statement informs the scheduler that on each and every event of the **A** button being pressed, a subprogram (called the event handler) should be queued for execution. The event handler code is contained within the braces `{...}`; it increments the global variable `count` by one. +The second statement informs the scheduler that on each and every event of the **A** button being pressed, a subprogram (called the event handler) should be queued for execution. The event handler code is contained within the braces `{...}`; it increments the global variable `count` by one. -```typescript +```typescript-ignore // statement 1 let count = 0 // statement 2 @@ -81,7 +83,7 @@ input.onButtonEvent(Button.A, input.buttonEventValue(ButtonEvent.Down), () => { The third statement queues a `forever` loop for later execution by the scheduler; the body of this loop (also inside the braces `{...}`) displays the current value of global variable `count` on the LED screen. -```typescript +```typescript-ignore // statement 1 let count = 0 // statement 2 @@ -94,7 +96,7 @@ basic.forever(() => { }) ``` -There are no more statements after the execution of these three statements, but this is not the end of program execution! That’s because the program queued the `forever` loop for execution by the scheduler (and registered an event handler for presses of button A). +There are no more statements after the execution of these three statements, but this is not the end of program execution! That’s because the program queued the `forever` loop for execution by the scheduler (and registered an event handler for presses of button A). The second job of the scheduler is to periodically interrupt execution to read (poll) the various inputs to the Calliope mini (the buttons, pins, etc.) and fire off events (such as “button A pressed”). Recall that the firing of an event causes the event handler subprogram associated with that event to be queued for later execution. The scheduler uses a timer built into the Calliope mini hardware to interrupt execution every 6 milliseconds and poll the inputs, which is more than fast enough to catch the quickest press of a button. @@ -102,7 +104,7 @@ The second job of the scheduler is to periodically interrupt execution to read ( How does the `forever` loop get to start execution? Furthermore, once the `forever` loop is running, how does any other subprogram (like the event handler that increments the count) ever get a chance to execute? -The answer is “cooperation” and “passing”. Think of a football team doing a drill – there is one ball and each footballer gets to dribble the ball for a certain number of touches, after which they pass to another footballer. A footballer who never passes prevents all other footballers from dribbling. A cooperative footballer always passes to some other footballer after taking a few touches. +The answer is "cooperation" and "passing". Think of a football team doing a drill – there is one ball and each footballer gets to dribble the ball for a certain number of touches, after which they pass to another footballer. A footballer who never passes prevents all other footballers from dribbling. A cooperative footballer always passes to some other footballer after taking a few touches. If you hadn’t guessed already, a footballer represents subprogram and dribbling the ball corresponds to that subprogram executing. Only one subprogram gets to execute at a time, as there is only one ball (processor). Footballer Alice passing the ball to footballer Bob corresponds to stopping execution of Alice’s subprogram (and remembering where it stopped) and starting/resuming execution of Bob’s subprogram. @@ -110,7 +112,7 @@ We will call this “passing control of execution” rather than “passing the Let’s take a look at the implementation of the `basic.forever` function to see an example of cooperative scheduling: -```typescript +```typescript-ignore function forever_(body: () => void) { control.inBackground(() => { while(true) { @@ -123,7 +125,15 @@ function forever_(body: () => void) { The `forever` loop actually is a function that takes a subprogram (another function) as a parameter. The function uses the `control.inBackground` function of the Calliope mini runtime to queue a `while true` loop for execution by the scheduler. The while loop has two statements. The first statement runs the subprogram represented by the `body` parameter. The second statement passes control to the scheduler (requesting to “sleep” for 20 milliseconds). -Though the `while true` loop will repeatedly execute the body subprogram, between each execution of the body it will permit the scheduler to execute other subprograms. If the while loop did not contain the call to `pause`, then once control passed into the while loop, it would never pass back to the scheduler and no other subprogram would be able to execute (unless the body subprogram contained a call to `pause` itself). +Though the `while true` loop will repeatedly execute the body subprogram, between each execution of the body it will permit the scheduler to execute other subprograms. If the while loop did not contain the call to `pause`, then once control passed into the while loop, it would never pass back to the scheduler and no other subprogram would be able to execute (unless the body subprogram contained a call to `pause` itself). + +### ~hint + +#### Pauses within blocks + +Certain blocks may contain a `pause` within their code to allow execution control to return to the scheduler. As an example, when a device is interacting with the code in a block, control can return to the scheduler to allow other subprograms run while that device is taking time to respond. + +### ~ ## Round-robin scheduling @@ -141,20 +151,20 @@ Let’s go back to the `count button presses` program and revisit its execution 2. Set up the event handler for each press of button **A** 3. Queue the forever loop to the run queue -The program then ends execution and control passes back to the scheduler. Let’s assume the user has not pressed any buttons . The scheduler finds the `forever` loop in the run queue and passes control to it. The loop first calls `basic.showNumber(0)`. In the diagram below, we use “Show 0” to refer to the execution of this function: +The program then ends execution and control passes back to the scheduler. Let’s assume the user has not pressed any buttons . The scheduler finds the `forever` loop in the run queue and passes control to it. The loop first calls `basic.showNumber(0)`. In the diagram below, we use "Show 0" to refer to the execution of this function: ![Execution sequence diagram: display loop with increment and interrupt](/static/mb/device/reactive-3.png) -While "Show 0" (the blue sequence) is running, periodic interrupts by the scheduler (every 6 milliseconds) poll for button presses and queue an event handler for each press of button **A**. Let’s say that one button press takes place during this time, as shown above. This will cause an event handler (labelled “inc”) to be queued for later execution by the scheduler. Once the "Show 0" has completed, the loop then calls `basic.pause(20)` to put the forever loop to sleep for 20 milliseconds and give the scheduler an opportunity to run any newly queued event handler. Control passes to the “inc” event handler which will increment the global variable `count` from 0 to 1 and then complete, returning control to the scheduler. At some point, the `forever` loop moves from the sleep queue to the run queue; the `forever` loop then will resume and call `basic.showNumber(1)`. +While "Show 0" (the blue sequence) is running, periodic interrupts by the scheduler (every 6 milliseconds) poll for button presses and queue an event handler for each press of button **A**. Let’s say that one button press takes place during this time, as shown above. This will cause an event handler (labelled "inc") to be queued for later execution by the scheduler. Once the "Show 0" has completed, the loop then calls `basic.pause(20)` to put the forever loop to sleep for 20 milliseconds and give the scheduler an opportunity to run any newly queued event handler. Control passes to the "inc" event handler which will increment the global variable `count` from 0 to 1 and then complete, returning control to the scheduler. At some point, the `forever` loop moves from the sleep queue to the run queue; the `forever` loop then will resume and call `basic.showNumber(1)`. -## Final thoughts +## Final comments Through this example, we have seen that the Calliope mini scheduler enables you to create a program that is composed of concurrent subprograms. In essence, the programmer needs to only think about the concurrent subprograms cooperatively passing control back to the scheduler, making sure no subprogram hogs control (or “dribbles the ball without passing”) for too long. While a subprogram runs, the scheduler polls the buttons and other IO peripherals at a high frequency in order to fire off events and queue event handlers for later execution, but this is invisible to the programmer. As a result, you can easily add a new capability to the Calliope mini by just adding a new subprogram. For example, if you want to add a reset feature to the counter program, all you need to do is add a new event handler for a press of button **B** that sets the global variable "count" to zero, as shown below: -```typescript +```typescript-ignore let count = 0 input.onButtonEvent(Button.A, input.buttonEventValue(ButtonEvent.Down), () => { @@ -169,4 +179,3 @@ input.onButtonEvent(Button.B, input.buttonEventValue(ButtonEvent.Down), () => { count = 0 }) ``` - diff --git a/docs/docs.md b/docs/docs.md index a07b85304..0836b5c7e 100644 --- a/docs/docs.md +++ b/docs/docs.md @@ -6,8 +6,6 @@ * [Projects](/projects) * [Examples](/examples) -* [Courses](/courses) -* [Lessons](/lessons) ## @boardname@ reference diff --git a/docs/extensions.md b/docs/extensions.md index feec08491..18976755e 100644 --- a/docs/extensions.md +++ b/docs/extensions.md @@ -1,4 +1,70 @@ -# @extends +# Extensions +Extensions are functional code modules that are installed from outside the MakeCode editor and plug new blocks into the **Toolbox**. These blocks are created by other authors or organizations to do things from simplifying coding tasks to working with hardware devices. +### ~ reminder +#### Extensions were known as "Packages" + +**Extensions** were previously called **Packages** in MakeCode. + +### ~ + +## Adding an extension to a project + +You can add an extension by going to **Toolbox** and clicking on the **Extensions** category. + +![Extensions Toolbox category](/static/extensions/toolbox-category.png) + +This will open a window giving you a place to search for extensions. Also, a selection of recommended extensions is shown for you to choose from. + +![Extensions Window](/static/extensions/extensions-window.gif) + +When you select an extension, you should see the new extension category appear in the Toolbox of your project. + +![New added extension in Toolbox](/static/extensions/new-extension.png) + +The Toolbox category will contain the extension's blocks, ready for you to use in your project's code. + +![Blocks in the added extension](/static/extensions/extension-blocks.png) + +### ~ hint + +#### Extension gallery + +For a list of extensions within categories, browse the [Extension Gallery](/extensions/extension-gallery). + +### ~ + +## Removing an extension from a project + +To remove an extension from a project, click on the Language toggle to move the project into **JavaScript** or **Python** view. Then expand the **Explorer** view under the Calliope mini simulator. Click on the **Delete** button next to the extension you would like to remove. + +![File Explorer](/static/extensions/file-explorer.png) + +## What extensions are loaded in my project? + +To determine which extensions your project is currently using, you can simply open the project in MakeCode and look at the Toolbox to see the custom categories that are displayed. If you need more information, such as the repository path or version of the extension, open the project in MakeCode and select **Project Settings** from the **Settings** menu in the top right corner of the screen. + +![Settings menu](/static/extensions/settings-menu.png) + +**Select Edit Settings As text** button. + +![Edit settings button](/static/extensions/edit-settings-button.png) + +The project settings will appear as text and you can see the extensions used in your project. They are listed under `"dependencies"`: + +``` +"dependencies": { + "core": "*", + "radio": "*", + "microphone": "*", + "maqueen": "github.com:dfrobot/pxt-maqueen#v1.7.2" +}, +``` + +The extensions with just a path of `"*"` are those included by default with the editor. Others are external and have a repository path, possibly with a version specified. + +## Custom extensions + +The [Build Your Own Extension](https://makecode.com/extensions/getting-started) manual is available for advanced users who want to publish their own extension. diff --git a/docs/live-coding.md b/docs/live-coding.md deleted file mode 100644 index 74cf92584..000000000 --- a/docs/live-coding.md +++ /dev/null @@ -1,63 +0,0 @@ -# Live coding sessions - -Here are some videos of live tutorial sessions with the @boardname@! - -## Fun stuff - -```codecard -[ -{ - "name": "Daily Coding Lessons!", - "description": "Subscribe to our mixer.com stream. Live coding Monday through Friday at 9AM PST / Noon EST / 4PM GMT", - "url": "https://mixer.com/MakeCode", - "imageUrl": "/static/live-coding/live.png" -}, -{ - "name": "Flashing Heart", - "description": "Demonstrating the Flashing Heart tutorial, live.", - "youTubeId": "NvEOKZ8wh9s", - "imageUrl": "/static/live-coding/showleds.jpg" -}, -{ - "name": "Name Tag", - "description": "A live illustration of the Name tag tutorial", - "youTubeId": "xpRI5jjQ31E", - "imageUrl": "/static/live-coding/showstring.jpg" -}, -{ - "name": "Smiley Button", - "description": "Step by step live coding of the Smiley Button tutorial.", - "youTubeId": "BgDxz3M7JIM" -}, -{ - "name": "Dice", - "description": "Step by step live coding of the Dice tutorial.", - "youTubeId": "OmrmjtOm_sQ" -}, -{ - "name": "Love Meter", - "description": "Steps by step live coding of the Love Meter tutorial", - "youTubeId": "1IYsy0_9n8g" -}, -{ - "name": "Micro Chat", - "description": "Steps by step live coding of the Micro Chat tutorial", - "youTubeId": "5XqsGROG2fI" -}, -{ - "name": "Rock Paper Scissor", - "description": "Steps by step live coding of the Rock Paper Scissor tutorial", - "youTubeId": "94lLBB3b1kU" -}, -{ - "name": "Playlist", - "description": "See all the previous live stream sessions", - "url": "https://www.youtube.com/watch?v=NvEOKZ8wh9s&list=PLMMBk9hE-SepocOwueEtTDyOPI_TBE9yC", - "imageUrl": "/static/live-coding/playlist.png" -} -] -``` - -## See Also - -[YouTube Playlist](https://www.youtube.com/watch?v=NvEOKZ8wh9s&list=PLMMBk9hE-SepocOwueEtTDyOPI_TBE9yC) diff --git a/docs/projects/7-seconds.md b/docs/projects/7-seconds.md deleted file mode 100644 index a2968318f..000000000 --- a/docs/projects/7-seconds.md +++ /dev/null @@ -1,103 +0,0 @@ -# 7 seconds game - -## Introduction @unplugged - -The goal of this game is press a button after **exactly** 7 seconds! - -![A Calliope mini looking at a 7 second stopwatch](/static/mb/projects/7-seconds.png) - -This game is inspired from the [flipping panckakes game](https://www.elecfreaks.com/blog/post/flipping-pancakes-microbit-game.html). - -## Step 1 - -The player starts the timer by pressing button **A**. We'll run the code run code when ``||input:button A is pressed||``. - -```blocks -input.onButtonPressed(Button.A, function () { - -}) -``` - -## Step 2 - -We need to remember the time when the button was pressed so that we can compute the elapsed time later on. -Add code to store the ``||input:running time||`` in a ``||variables:start||`` variable. - -```blocks -let start = 0 -input.onButtonPressed(Button.A, function () { - // @highlight - start = input.runningTime() -}) -``` - -## Step 3 - -Show something on the screen so that the user knows that the timer has started... - -```blocks -let start = 0 -input.onButtonPressed(Button.A, function () { - start = input.runningTime() - // @highlight - basic.showIcon(IconNames.Chessboard) -}) -``` - -## Step 4 - -The player stops the timer by pressing button **B**. Add the code to run code when ``||input:button B is pressed||``. - -```blocks -input.onButtonPressed(Button.B, function () { - -}) -``` - -## Step 5 - -Compute the elapsed time as ``||input:running time||`` ``||math:minus||`` ``||variables:start||`` and store it into a new variable ``||variables:elapsed||``. - -```blocks -let start = 0 -let elapsed = 0 -input.onButtonPressed(Button.B, function () { - // @highlight - elapsed = input.runningTime() - start -}) -``` - -## Step 6 - -Compute the ``||variables:score||`` of the game as the ``||math:absolute value||`` of the ``||math:difference||`` of ``||variables:elapsed||`` time from 7 seconds, which is 7000 milliseconds. - -```blocks -let start = 0 -let elapsed = 0 -let score = 0 -input.onButtonPressed(Button.B, function () { - elapsed = input.runningTime() - start - // @highlight - score = Math.abs(elapsed - 7000) -}) -``` - -## Step 7 - -Display the score on the screen and your game is ready! - -```blocks -let start = 0 -let elapsed = 0 -let score = 0 -input.onButtonPressed(Button.B, function () { - elapsed = input.runningTime() - start - score = Math.abs(elapsed - 7000) - // @highlight - basic.showNumber(score) -}) -``` - -```template -input.onButtonPressed(Button.A, function () {}) -``` diff --git a/docs/projects/coin-flipper.md b/docs/projects/coin-flipper.md index 821daa83e..3fc97ef9c 100644 --- a/docs/projects/coin-flipper.md +++ b/docs/projects/coin-flipper.md @@ -74,5 +74,5 @@ If you have a @boardname@, connect it to USB and click ``|Download|`` to transfe Press button **A** for a flip. Test your luck and guess ``heads`` or ``tails`` before the toss is over! ```template -input.onButtonPressed(Button.A, function() {}) +input.onButtonEvent(Button.A, input.buttonEventClick(), function() {}) ``` diff --git a/docs/projects/compass.md b/docs/projects/compass.md deleted file mode 100644 index c0a6c9b09..000000000 --- a/docs/projects/compass.md +++ /dev/null @@ -1,126 +0,0 @@ -# Compass - -## Introduction @unplugged - -This tutorial will show you how to program a script that displays which direction the @boardname@ is pointing. Let's get started! - -![A cartoon of a compass](/static/mb/projects/a5-compass.png) - -## Step 1 - -Store the ``||input:compass heading||`` of the @boardname@ in a variable called ``||variables:degrees||`` in the ``||basic:forever||`` loop. - -```blocks -basic.forever(function() { - let degrees = input.compassHeading() -}) -``` - -## Step 2 - -``||logic:If||`` ``||variables:degrees||`` is ``||logic:less than||`` `45`, -then the compass heading is mostly pointing toward **North**. ``||basic:Show||`` `N` on the @boardname@. - -```blocks -basic.forever(function() { - let degrees = input.compassHeading() - if (degrees < 45) { - basic.showString("N") - } -}) -``` - -## Step 3 - -``||logic:If||`` ``||variables:degrees||`` is less than `135`, the @boardname@ is mostly pointing **East**. ``||basic:Show||`` `E` on the @boardname@. - -```blocks -basic.forever(function() { - let degrees = input.compassHeading() - if (degrees < 45) { - basic.showString("N") - } - else if (degrees < 135) { - basic.showString("E") - } -}) -``` - -## Step 4 - -Go to the simulator and rotate the @boardname@ logo to simulate changes in the compass heading. - -## Step 5 - -``||logic:If||`` ``||variables:degrees||`` is less than `225`, the @boardname@ is mostly pointing **South**. ``||basic:Show||`` `S` on the @boardname@. - -```blocks -basic.forever(function() { - let degrees = input.compassHeading() - if (degrees < 45) { - basic.showString("N") - } - else if (degrees < 135) { - basic.showString("E") - } - else if (degrees < 225) { - basic.showString("S") - } -}) -``` - -## Step 6 - -``||logic:If||`` ``||variables:degrees||`` is less than `315`, the @boardname@ is mostly pointing **West**. ``||basic:Show||`` `W` on the @boardname@. - -```blocks -basic.forever(function() { - let degrees = input.compassHeading() - if (degrees < 45) { - basic.showString("N"); - } - else if (degrees < 135) { - basic.showString("E") - } else if (degrees < 225) { - basic.showString("S") - } else if (degrees < 315) { - basic.showString("W") - } -}) -``` - -## Step 7 - -``||logic:If||`` none of these conditions returned true, then the @boardname@ must be pointing **North** again. Display `N` on the @boardname@. - -```blocks -basic.forever(function() { - let degrees = input.compassHeading() - if (degrees < 45) { - basic.showString("N"); - } - else if (degrees < 135) { - basic.showString("E"); - } - else if (degrees < 225) { - basic.showString("S"); - } - else if (degrees < 315) { - basic.showString("W") - } - else { - basic.showString("N") - } -}) -``` - -## Step 8 @unplugged - -If you have a @boardname@, click `|Download|` and follow the screen instructions. -You will have to follow the screen instructions to calibrate your compass. - -https://youtu.be/IL5grHtz_MU - -```template -basic.forever(function() {}) -``` \ No newline at end of file diff --git a/docs/projects/escape-room.md b/docs/projects/escape-room.md deleted file mode 100644 index f3109ef2a..000000000 --- a/docs/projects/escape-room.md +++ /dev/null @@ -1,18 +0,0 @@ -# Escape Room - -Projects used to create escape room experiences. - -## Radio - -```codecard -[{ - "name": "Rotary Dial Radio", - "url":"/projects/rotary-dial-radio", - "description": "Turn an antique rotary dial phone into a radio transmitter", - "imageUrl":"/static/mb/projects/rotary-dial-radio.png" -}] -``` - -## Acknowledgments - -Escape room ideas are gathered from a great discussion with [Pauline Maas](https://twitter.com/4pip) and [Peter Heldens](https://twitter.com/PeterHeldens) at https://microbit101.nl/. diff --git a/docs/projects/hot-potato.md b/docs/projects/hot-potato.md deleted file mode 100644 index c795eb2b9..000000000 --- a/docs/projects/hot-potato.md +++ /dev/null @@ -1,103 +0,0 @@ -# Hot Potato - -## Introduction @unplugged - -In this game, you will start a timer with a random countdown of a number of seconds. When the timer is off, the game is over and whoever is holding the potato has lost! -Watch the tutorial on the [MakeCode YouTube channel](https://youtu.be/xLEy1B_gWKY). - -## Step 1 - -Add an event to run code when ``||input:button A is pressed||``. - -```blocks -input.onButtonPressed(Button.A, function () { -}) -``` - -## Step 2 - -Make a ``||variables:timer||`` variable and ``||variables:set||`` it to -a ``||math:random value||`` between ``5`` and ``15``. - -The value of ``||variables:timer||`` represents the number of seconds left before someone is caught holding the potato. - -```blocks -let timer = 0 -input.onButtonPressed(Button.A, function () { - // @highlight - timer = randint(5, 15) -}) -``` - -## Step 3 - -Add code to ``||basic:show||`` that the game started. - -```blocks -let timer = 0 -input.onButtonPressed(Button.A, function () { - timer = randint(5, 15) - // @highlight - basic.showIcon(IconNames.Chessboard) -}) -``` - -## Step 4 - -Put in a loop to repeat code ``||loops:while||`` ``||variables:timer||`` ``||logic:is positive||``. When `timer` is negative, the game is over. - - -```blocks -let timer = 0 -input.onButtonPressed(Button.A, function () { - timer = randint(5, 15) - basic.showIcon(IconNames.Chessboard) - // @highlight - while (timer > 0) { - } -}) -``` - -## Step 5 - -Inside the ``||loops:while||`` loop, add code to ``||variables:decrease||`` the timer ``||loops:every second||``. - -```blocks -let timer = 0 -input.onButtonPressed(Button.A, function () { - timer = randint(5, 15) - basic.showIcon(IconNames.Chessboard) - while (timer > 0) { - // @highlight - timer += -1 - // @highlight - basic.pause(1000) - } -}) -``` - -## Step 6 - -**After** the ``||loops:while||`` loop is done, add code to ``||basic:show||`` that the game is over. - -```blocks -let timer = 0 -input.onButtonPressed(Button.A, function () { - timer = randint(5, 15) - basic.showIcon(IconNames.Chessboard) - while (timer > 0) { - timer += -1 - basic.pause(1000) - } - // @highlight - basic.showIcon(IconNames.Skull) -}) -``` - -## Step 7 - -`|Download|` your code to your @boardname@, tape it to a potato and play the game with your friends! - -```template -// -``` \ No newline at end of file diff --git a/docs/projects/level.md b/docs/projects/level.md deleted file mode 100644 index 0fe377125..000000000 --- a/docs/projects/level.md +++ /dev/null @@ -1,98 +0,0 @@ -# Level - -## Introduction @unplugged - -Is your table flat? Use the @boardname@ as a level! - -![A level drawing](/static/mb/projects/level.png) - - -## Step 1 - -Make a variable ``||variables:x||`` and store the ``||input:acceleration x||`` value -in the ``||basic:forever||`` loop. - -```blocks -basic.forever(function() { - // @highlight - let x = input.acceleration(Dimension.X); -}) -``` - -## Step 2 - -Make another variable ``||variables:y||`` and store the ``||input:acceleration y||`` value. - -```blocks -basic.forever(function() { - let x = input.acceleration(Dimension.X); - // @highlight - let y = input.acceleration(Dimension.Y); -}) -``` - -## Step 3 - -Add a code to test ``||logic:if||`` the ``||Math:absolute value||`` of ``||variables:x||`` is ``||logic:greater than||`` ``32``. -If it is true, ``||basic:show an icon||`` to tell you that the @boardname@ is not flat, ``||logic:else||`` show nothing, for now. - -```blocks -basic.forever(function() { - let x = input.acceleration(Dimension.X); - let y = input.acceleration(Dimension.Y); - if (Math.abs(x) > 32) { - // @highlight - basic.showIcon(IconNames.Sad) - } else { - - } -}) -``` - -## Step 4 - -Add an ``||logic:else if||`` to check that the ``||Math:absolute value||`` of ``||variables:y||`` is ``||logic:greater than||`` ``32``. -If it is true, ``||basic:show an icon||`` that tells you the @boardname@ is not flat. - -```blocks -basic.forever(function() { - let x = input.acceleration(Dimension.X); - let y = input.acceleration(Dimension.Y); - if (Math.abs(x) > 32) { - basic.showIcon(IconNames.Sad) - } else if (Math.abs(y) > 32) { - // @highlight - basic.showIcon(IconNames.Angry) - } else { - - } -}) -``` - -## Step 5 - -The code under the ``||logic:else||`` will run if both acceleration ``x`` and ``y`` are small, which happens when the @boardname@ is laying flat. Add code to ``||basic:show a happy image||``. - -```blocks -basic.forever(function() { - let x = input.acceleration(Dimension.X); - let y = input.acceleration(Dimension.Y); - if (Math.abs(x) > 32) { - basic.showIcon(IconNames.Sad) - } else if (Math.abs(y) > 32) { - basic.showIcon(IconNames.Angry) - } else { - // @highlight - basic.showIcon(IconNames.Happy) - } -}) -``` - -## Step 6 - -If you have a @boardname@ connected, click ``|Download|`` to transfer your code! -Try it out on a table, counter, or window sill in your house! - -```template -basic.forever(function() {}) -``` \ No newline at end of file diff --git a/docs/projects/micro-chat.md b/docs/projects/micro-chat.md deleted file mode 100644 index fe88e4ea1..000000000 --- a/docs/projects/micro-chat.md +++ /dev/null @@ -1,91 +0,0 @@ -# Micro Chat - -## {Introduction @unplugged} - -![Two @boardname@ connected via radio](/static/mb/projects/a9-radio.png) - -Use the micro:bit 📻 radio to send and receive 💬 messages between micro:bits! - -## {Step 1} - -From the ``||radio:Radio||`` Toolbox category, drag a ``||radio:radio set group||`` block into the ``||basic:on start||`` block. This will act as the channel over which we'll send messages. Only micro:bits who are in the same group will be able to send and receive messages between them. - -```blocks -radio.setGroup(1) -``` - -## {Step 2} - -From the ``||input:Input||`` Toolbox category, drag an ``||input:on button A pressed||`` block onto the Workspace. - -```blocks -input.onButtonPressed(Button.A, function() {}) -``` - -## {Step 3} - -From the ``||radio:Radio||`` category, drag a ``||radio:radio send string||`` block into the ``||input:on button A pressed||`` block and type a message. When we press button A on our micro:bit, we'll send this message to every micro:bit nearby in group 1. - -```blocks -input.onButtonPressed(Button.A, function() { - radio.sendString("Micro Chat!") -}) -``` - -## {Step 4} - -From the ``||radio:Radio||`` category, drag an ``||radio:on radio received string||`` block onto the Workspace. - -```blocks -radio.onReceivedString(function (receivedString) { -}) -``` - -## {Step 5} - -From the ``||basic:Basic||`` category, get a ``||basic:show string||`` block and drop it in the ``||radio:on radio received string||`` block. - -```blocks -radio.onReceivedString(function (receivedString) { - basic.showString("Hello!"); -}) -``` - -## {Step 6} - -Pull the ``||variables:receivedString||`` variable block out of the ``||radio:on received string||`` block and put it into the ``||basic:show string||`` block replacing "Hello!" - -```blocks -radio.onReceivedString(function (receivedString) { - basic.showString(receivedString); -}) -``` - -## {Step 7} - -Let's test our code! In the micro:bit on-screen simulator, press button **A**. You should see a second @boardname@ appear. Now try pressing **A** again. Do you see your message appear on the second micro:bit? ⭐ Great job! ⭐ - -```blocks -input.onButtonPressed(Button.A, function() { - radio.sendString("Micro Chat!"); -}) -radio.onReceivedString(function (receivedString) { - basic.showString(receivedString); -}) -``` - -## {Step 8} - -If you have a @boardname@ device, connect it to your computer and click the ``|Download|`` button. Follow the instructions to transfer your code onto the @boardname@. If you have two micro:bits, download the program to each one. Press button **A** on one and see if the other gets the message! - -## {Step 9} - -Go further - try using different buttons to send a mix of messages 📝, or send secret 🔒 messages to different radio groups! - -```template -// -``` - -```package -funk -``` diff --git a/docs/projects/mini-chat.md b/docs/projects/mini-chat.md deleted file mode 100644 index deae3568f..000000000 --- a/docs/projects/mini-chat.md +++ /dev/null @@ -1,91 +0,0 @@ -# Micro Chat - -## {Introduction @unplugged} - -![Two @boardname@ connected via radio](/static/calliope/tutorials/06_mini_chat_animation.gif) - -Use the Calliope mini 📻 radio to send and receive 💬 messages between Calliope minis! - -## {Step 1} - -From the ``||radio:Radio||`` Toolbox category, drag a ``||radio:radio set group||`` block into the ``||basic:on start||`` block. This will act as the channel over which we'll send messages. Only Calliope minis who are in the same group will be able to send and receive messages between them. - -```blocks -radio.setGroup(1) -``` - -## {Step 2} - -From the ``||input:Input||`` Toolbox category, drag an ``||input:on button A pressed||`` block onto the Workspace. - -```blocks -input.onButtonPressed(Button.A, function() {}) -``` - -## {Step 3} - -From the ``||radio:Radio||`` category, drag a ``||radio:radio send string||`` block into the ``||input:on button A pressed||`` block and type a message. When we press button A on our Calliope mini, we'll send this message to every Calliope mini nearby in group 1. - -```blocks -input.onButtonPressed(Button.A, function() { - radio.sendString("Micro Chat!") -}) -``` - -## {Step 4} - -From the ``||radio:Radio||`` category, drag an ``||radio:on radio received string||`` block onto the Workspace. - -```blocks -radio.onReceivedString(function (receivedString) { -}) -``` - -## {Step 5} - -From the ``||basic:Basic||`` category, get a ``||basic:show string||`` block and drop it in the ``||radio:on radio received string||`` block. - -```blocks -radio.onReceivedString(function (receivedString) { - basic.showString("Hello!"); -}) -``` - -## {Step 6} - -Pull the ``||variables:receivedString||`` variable block out of the ``||radio:on received string||`` block and put it into the ``||basic:show string||`` block replacing "Hello!" - -```blocks -radio.onReceivedString(function (receivedString) { - basic.showString(receivedString); -}) -``` - -## {Step 7} - -Let's test our code! In the Calliope mini on-screen simulator, press button **A**. You should see a second @boardname@ appear. Now try pressing **A** again. Do you see your message appear on the second Calliope mini? ⭐ Great job! ⭐ - -```blocks -input.onButtonPressed(Button.A, function() { - radio.sendString("Micro Chat!"); -}) -radio.onReceivedString(function (receivedString) { - basic.showString(receivedString); -}) -``` - -## {Step 8} - -If you have a @boardname@ device, connect it to your computer and click the ``|Download|`` button. Follow the instructions to transfer your code onto the @boardname@. If you have two Calliope minis, download the program to each one. Press button **A** on one and see if the other gets the message! - -## {Step 9} - -Go further - try using different buttons to send a mix of messages 📝, or send secret 🔒 messages to different radio groups! - -```template -// -``` - -```package -radio -``` diff --git a/docs/projects/multi-dice.md b/docs/projects/multi-dice.md deleted file mode 100644 index 8373b2236..000000000 --- a/docs/projects/multi-dice.md +++ /dev/null @@ -1,97 +0,0 @@ -# Multi Dice - -## {Introduction @unplugged} - -![Multiple @boardname@ throwing a dice](/static/calliope/tutorials/10_multi_dice_animation.gif) - -Build a multi-player dice game using the **radio**. The **radio** blocks let you send wireless messages between a @boardname@ and another @boardname@. - -In this game, you shake to "throw the dice" and send the result to the other @boardname@. If you receive a result of a dice throw equal or greater than yours, you lose. - -## {Dice game} - -Let's start by rebuilding the **dice** game. If you are unsure about the details, try the **dice** tutorial again. - -```blocks -input.onGesture(Gesture.Shake, function () { - basic.showNumber(randint(1, 6)) -}) -``` - -## {Dice variable} - -We need to store the result of the dice cast in a variable. A **variable** is like a place in the memory of the @boardname@ where you save information, like numbers. - -* Go to the **Variables** toolbox and click ``Make a Variable`` to create a new variable. We will call it **dice**. -* Add a ``||variables:set dice to||`` block and drag the ``||math:pick random||`` into it. -* Drag a ``||variables:dice||`` variable from the **Variables** toolbox into the ``||basic:show number||`` block. - -```blocks -let dice = 0 -input.onGesture(Gesture.Shake, function () { - dice = randint(1, 6) - basic.showNumber(dice) -}) -``` - -## {Send the dice} - -Put in a ``||radio:send number||`` and a ``||variables:dice||`` to send the value stored in the ``||variables:dice||`` variable via radio. Make sure to add a ``||radio:set group||`` to ``||basic:on start||`` with the group number set to the group you want to use. - -```blocks -radio.setGroup(1) -let dice = 0 -input.onGesture(Gesture.Shake, function () { - dice = randint(1, 6) - basic.showNumber(dice) - radio.sendNumber(dice) -}) -``` - -## {Receive the dice} - -Go get an ``||radio:on received number||`` event block. This event runs when a radio message from another @boardname@ arrives. The ``||variables:receivedNumber||`` value is the value of the dice in this game. - -```blocks -radio.onReceivedNumber(function (receivedNumber) { -}) -``` - -## {Check your cast} - -Add a ``||logic:if||`` block to test if ``||variables:receivedNumber||`` is greater or equal to ``||variables:dice||``. -If is, you lost so display a sad face on the screen. - -```blocks -let dice = 0; -radio.onReceivedNumber(function (receivedNumber) { - if (receivedNumber >= dice) { - basic.showIcon(IconNames.Sad) - } -}) -``` - -## {Test it!} - -Try pressing **SHAKE** in the simulator and see that a second @boardname@ appears. You can play the game on both virtual boards. - -If you have more than one @boardname@, download your code onto each one and try playing the game with your friends! - -```blocks -let dice = 0 -radio.setGroup(1) -input.onGesture(Gesture.Shake, function () { - dice = randint(1, 6) - basic.showNumber(dice) - radio.sendNumber(dice) -}) -radio.onReceivedNumber(function (receivedNumber) { - if (receivedNumber >= dice) { - basic.showIcon(IconNames.Sad) - } -}) -``` - -```package -funk -``` diff --git a/docs/projects/name-badge.md b/docs/projects/name-badge.md deleted file mode 100644 index 04ce1a9db..000000000 --- a/docs/projects/name-badge.md +++ /dev/null @@ -1,98 +0,0 @@ -# Name Badge - -![Name badge project](/static/mb/projects/name-badge/header.png) - -Make yourself known with a fancy name badge powered by your @boardname@! - -## Code - -First, let's get your name to display on the screen. - -### Button press - -From the ``||input:Input||`` Toolbox drawer, drag an ``||input:on button A pressed||`` block onto the Workspace. - -```blocks -input.onButtonEvent(Button.A, input.buttonEventValue(ButtonEvent.Click), function () { - -}) -``` - -### Show a string - -From the ``||basic:Basic||`` Toolbox drawer drag a ``||basic:show string||`` block into the ``||input:on button A pressed||`` block. - -```blocks -input.onButtonEvent(Button.A, input.buttonEventValue(ButtonEvent.Click), function () { - basic.showString("Hello!") -}) -``` - -### Show my name - -In the ``||basic:show string||`` block, type your name. - -```blocks -input.onButtonEvent(Button.A, input.buttonEventValue(ButtonEvent.Click), function () { - basic.showString("My Name") -}) -``` - -### Test the badge - -Go to the simulator and test your name badge by pressing button **A**. - -```sim -input.onButtonEvent(Button.A, input.buttonEventValue(ButtonEvent.Click), function () { - basic.showString("My Name") -}) -``` - -### Download - -Download the program to your @boardname@: - -1. Make sure your @boardname@ is plugged into the computer. -2. Click the `|Download|` button. - -## Make - -Now that you have your name showing on the @boardname@, let's make a proper badge to wear and display it on. - -Cut out a badge shape from a piece of colored construction paper. - -![Construction paper and scisssors](/static/mb/projects/name-badge/picture1.png) - -Loop a piece of duct tape and stick it on the back of your @boardname@. - -![Roll of tape with the other materials](/static/mb/projects/name-badge/picture2.png) - -Stick your @boardname@ onto the front of your badge. - -![Board attached to the paper](/static/mb/projects/name-badge/picture3.png) - -Using a hole-punch, punch out 2 holes in the top of your badge. - -![Holes punched in the paper](/static/mb/projects/name-badge/picture4.png) - -Attach the battery pack to the @boardname@. - -![Battery pack connected to the board](/static/mb/projects/name-badge/picture5.png) - -Tape battery pack onto the back of the badge. - -![Battery pack taped on](/static/mb/projects/name-badge/picture6.png) - -Thread a shoelace through the top 2 holes of your badge. - -![Shoelace threaded through a hole](/static/mb/projects/name-badge/picture7.png) - -Tie a knot at the end of your shoelace - -![Ends of shoelace tied together](/static/mb/projects/name-badge/picture8.png) - -Decorate your badge with colored paper, markers, stickers, glitter. - -![Completed name badge](/static/mb/projects/name-badge/picture9.png) - -It's now finished! your badge is ready let others know who you are. \ No newline at end of file diff --git a/docs/projects/plot-acceleration.md b/docs/projects/plot-acceleration.md deleted file mode 100644 index 036c7772a..000000000 --- a/docs/projects/plot-acceleration.md +++ /dev/null @@ -1,57 +0,0 @@ -# Plot Acceleration - -## Introduction @unplugged - -The ``||led:plot bar graph||`` uses the screen to display the _magnitude_ (how big a number is whether it's positive or negative) of a value. This is a great tool to understand the data returned by sensors... like the accelerometer. - -## Acceleration - -In a ``||basic:forever||`` loop, ``||led:plot||`` ``||input:acceleration||`` in the ``x`` dimension on the LEDs. - -```blocks -basic.forever(function() { - led.plotBarGraph( - input.acceleration(Dimension.X), - 0 - ) -}) -``` - -## Console - -Click on the **Show Console** button by the simulator to see a chart of the values plotted by the block over a period of time. Hover over the board in the simulator to make a force in the ``x`` dimension. - -## Maximum value - -If you specify the maximum value, the block can do a better job at displaying the data. -For example, we can tell the block that we don't expect values beyond ``1000`` mg. - -```blocks -basic.forever(function() { - led.plotBarGraph( - input.acceleration(Dimension.X), - 1000 - ) -}) -``` - -## Other sensors - -You can use this block for pretty much any kind of data. Try it out! Plot the ``||input:light level||`` inside the ``||loops:forever||`` instead. Play with the light sensor in the simulator. - -```blocks -basic.forever(function() { - led.plotBarGraph( - input.lightLevel(), - 0 - ) -}) -``` - -## Download and try - -Download the code to your @boardname@ and test the sensors. - -```template -basic.forever(function() {}) -``` \ No newline at end of file diff --git a/docs/projects/robot-unicorn.md b/docs/projects/robot-unicorn.md deleted file mode 100644 index 509332a3f..000000000 --- a/docs/projects/robot-unicorn.md +++ /dev/null @@ -1,200 +0,0 @@ -# Robot Unicorn - -## by [Helen Leigh](https://twitter.com/helenleigh) - -Hey, I made a herd of very silly gesture controlled robot unicorns I did this because I was bored with those personality-free robots that only move in a straight line. This is a cheap, unreliable, hilarious robot unicorn project suitable for total beginners. You'll learn about LEDs, gesture control, radio, and servo control. - -On this project page, I've written up what you'll need to make your own Robot Unicorn, with all the steps you'll need to follow and the code you'll need to write. I've even have videos for each of the steps to help guide you through this project. Happy making and have fun! - -![Robot Unicorn](/static/mb/projects/robot-unicorn/robotunicorn.jpg) - -## Ingredients - -Here's what you'll need. The links telling where to get parts are just examples - with a bit of searching you will be able to find any of these parts cheaper in whatever shop you normally use to get parts like this: eBay, Amazon, Rapid, Digikey, Kitronik, etc. - -- Two @boardname@s plus a AAA battery pack for each of them. -- Two 360 continuous rotation servos with wheels (I used FS90R servos with wheels [like this](https://www.kitronik.co.uk/2574-wheel-for-fs90r-60mmx8mm.html)). 360 servos are super cheap, super unreliable and super easy to hook up, which is exactly why I chose them. Remember, the unicorn not going exactly where you expect it to go is kind of the point. -- One small swivelling castor wheel plus the nuts and bolts to fix it to the base (something [like this](https://www.amazon.co.uk/dp/B074WP1QJN/)). You can use a marble like castor wheel designed for robots but if you use the cheaper ones designed for furniture you can figure out a special way to get your robot unicorn to rear up like She Ra's flying unicorn Swift Wind. Or sometimes it will just fall over. Either way, it's funny. -- One 3XAA battery pack with on off switch and leads (something [like this](https://www.amazon.com/x1-5V-Battery-Holder-Switch-Wires/dp/B01C5J4K3Q/)). -- Three crocodile clips, or alligator clips as Americans apparently call them. Cute. -- One unicorn horn. Obviously. I modified an old ``stl`` from Adafruit at [Thingverse](https://www.thingiverse.com/thing:956359) to make it smaller and give it a solid base so it stuck securely onto my unicorn's head. I've included my revised ``stl`` file in the project files at the bottom of this project page if you want to 3D print your own, or you can make a horn from whatever kind of material you like! -- Something shiny for the tail. I used tinsel for some and tiny disco balls for some others. -- Three sheets of A4 card, the sparklier the better. I've made pdf templates for the shape of the body and head which you can either use as a printed template or as a lasercutting file. You'll find the pdfs in the project files at the bottom of this project page. If you want to experiment with using other materials for your Robot Unicorn, go for it! I've used a card base and a furry body, my friend made a leather version and I've also lasercut semi transparent polypropylene for the head, putting LEDs, jelly beans, copper tape and glitter inside. (The glitter was a total pain. 0/10 do not recommend.) -- Some wire strippers and some electrical tape. -- Some double sided sticky tape, some sellotape and/or some decent glue. Those double sided sticky pads work really well for fixing the servos to the cardboard chassis. - -![Calliope mini and Unicorn Horn](/static/mb/projects/robot-unicorn/microbitsunicorn.jpg) - -### Instructions - -**1. Make the unicorn body!** I've made the video below to show how to put your unicorn together using the templates in the project files at the bottom of this project page. Not feeling crafty? That's okay! You can experiment with cutting wheel holes in a small box instead. - -https://www.youtube.com/watch?v=CKqrMxuZ6gQ -
- -**2. Add in the electronics!** Put on the wheels, then wire up the servos and the battery and the first @boardname@. Just watch my video to see how. - -https://youtu.be/CKqrMxuZ6gQ?t=178 -
- -**3. Code it!** I've supplied my code below, but I'd recommend that you watch the videos I've made so that you understand what is going on. The first video gets you started with one @boardname@, and the second helps you take the next step: gesture controlling your robot unicorn with two @boardname@s. **Pro tip**: there are lots of ways to get the same results using different code, so it's totaslly fine if your code works but doesn't match mine. - -**Getting started with @boardname@** - -https://www.youtube.com/watch?v=OBcVMPdAIoE -
- -**Using gesture control and radio to control your Robot Unicorn with @boardname@** - -https://www.youtube.com/watch?v=qAakgfNouOI -
- -**4. Play!** Make an obstacle course! Make another one and have a race or a dance off with a friend! Once you've mastered the basics of making your unicorn move around you might want to think about how to make improvements. - -**5. Tell me about it!** It brings me joy to know other people make my silly inventions. You can say hi [on Twitter](https://twitter.com/helenleigh), follow me [on Insta](https://www.instagram.com/helenleigh_makes/) or [subscribe to my channel on YouTube](https://youtube.com/c/HelenLeigh). - -## Code - -**MakeCode blocks for the body of the Robot Unicorn** - -```blocks -radio.onReceivedNumberDeprecated(function (receivedNumber) { - received = receivedNumber -}) -let received = 0 -radio.setGroup(1) -received = 4 -basic.forever(function () { - if (received == 0) { - basic.showLeds(` - . . # . . - . # # # . - # . # . # - . . # . . - . . # . . - `) - pins.analogWritePin(AnalogPin.P0, 100) - pins.analogWritePin(AnalogPin.P1, 10) - } else if (received == 1) { - basic.showLeds(` - . . # . . - . . # . . - # . # . # - . # # # . - . . # . . - `) - pins.analogWritePin(AnalogPin.P0, 10) - pins.analogWritePin(AnalogPin.P1, 100) - } else if (received == 2) { - pins.analogWritePin(AnalogPin.P0, 20) - pins.analogWritePin(AnalogPin.P1, 20) - basic.showLeds(` - . . # . . - . # . . . - # # # # # - . # . . . - . . # . . - `) - } else if (received == 3) { - pins.analogWritePin(AnalogPin.P0, 80) - pins.analogWritePin(AnalogPin.P1, 80) - basic.showLeds(` - . . # . . - . . . # . - # # # # # - . . . # . - . . # . . - `) - } else if (received == 4) { - pins.analogWritePin(AnalogPin.P0, 0) - pins.analogWritePin(AnalogPin.P1, 0) - basic.showLeds(` - # . . . # - . # . # . - . . # . . - . # . # . - # . . . # - `) - } -}) - -``` - -**MakeCode blocks for the Robot Unicorn controller** - -```blocks -input.onButtonEvent(Button.AB, input.buttonEventValue(ButtonEvent.Down), function () { - radio.sendNumber(4) - basic.showLeds(` - # . . . # - . # . # . - . . # . . - . # . # . - # . . . # - `) -}) -input.onGesture(Gesture.Shake, function () { - radio.sendNumber(1) - basic.showLeds(` - . . # . . - . . # . . - # . # . # - . # # # . - . . # . . - `) -}) -input.onGesture(Gesture.LogoDown, function () { - radio.sendNumber(0) - basic.showLeds(` - . . # . . - . # # # . - # . # . # - . . # . . - . . # . . - `) -}) -input.onGesture(Gesture.TiltRight, function () { - radio.sendNumber(2) - basic.showLeds(` - . . # . . - . . . # . - # # # # # - . . . # . - . . # . . - `) -}) -input.onGesture(Gesture.TiltLeft, function () { - radio.sendNumber(3) - basic.showLeds(` - . . # . . - . # . . . - # # # # # - . # . . . - . . # . . - `) -}) -radio.setGroup(1) -radio.setTransmitPower(7) -basic.showLeds(` - . . # . . - . # # # . - # # # # # - # # # # # - . # . # . - `) -``` - -## Everythin Else - -Here's where you can find all the templates you need to make the Robot Unicorn. - -- Template for the main part of the body: [pdf file here](https://github.com/helenleigh/robot-unicorn/blob/master/unicorn%20chassis%20A4.pdf) and [ai file here](https://github.com/helenleigh/robot-unicorn/blob/master/unicorn%20chassis%20A4.ai). -- Template for the top part of the body: [pdf file here](https://github.com/helenleigh/robot-unicorn/blob/master/unicorn%20lid%20a4.pdf) and [ai file here](https://github.com/helenleigh/robot-unicorn/blob/master/unicorn%20lid%20a4.ai). -- Template for the head: [pdf file here](https://github.com/helenleigh/robot-unicorn/blob/master/unicorn%20head%20A4.pdf) and [ai file here](https://github.com/helenleigh/robot-unicorn/blob/master/unicorn%20head%20A4.ai). -- STL file for 3D printing your Robot Unicorn horn [is here](https://github.com/helenleigh/robot-unicorn/blob/master/unicorn%20horn%20solid%20base.stl). - -![Robot Unicorn Tail](/static/mb/projects/robot-unicorn/robotunicorntail.jpg) - -```package -funk -``` \ No newline at end of file diff --git a/docs/projects/rock-paper-scissors-v2.md b/docs/projects/rock-paper-scissors-v2.md deleted file mode 100644 index a7825d516..000000000 --- a/docs/projects/rock-paper-scissors-v2.md +++ /dev/null @@ -1,205 +0,0 @@ -# Rock Paper Scissors V2 - -## Introduction @unplugged - -![Cartoon of the Rock Paper Scissors game](/static/mb/projects/a4-motion-v2.png) - -Build a "Rock Paper Scissors" game with ADDED BONUS SOUNDS using the **Calliope mini** buzzer! - -## Step 1 @fullscreen - -Use the ``||input:on shake||`` block in the Workspace to run code when you shake the @boardname@. - -```blocks -input.onGesture(Gesture.Shake, function () { - -}) -``` - -## Step 2 @fullscreen - -Make a new variable called ``hand`` and place the ``||variables:set hand to||`` block in the shake event. - -![A animation that shows how to create a variable](/static/mb/projects/rock-paper-scissors/newvar.gif) - -## Step 3 @fullscreen - -Add a ``||math:pick random||`` block to pick a random number from `1` to `3` and store it in the variable named ``hand``. - -```blocks -let hand = 0; -input.onGesture(Gesture.Shake, function () { - hand = randint(1, 3) -}) -``` - -In a later step, each of the possible numbers (`1`, `2`, or `3`) is matched to its own picture. The picture is shown on the LEDs when its matching number is picked. - -## Step 4 @fullscreen - -Place an ``||logic:if||`` block under the ``||math:pick random||`` and check whether ``hand`` is equal to ``1``. Add a ``||basic:show leds||`` block that shows a picture of a piece of paper. The number `1` is the value for paper. - -![How to drag an if statement](/static/mb/projects/rock-paper-scissors/if.gif) - -```blocks -let hand = 0; -input.onGesture(Gesture.Shake, function () { - hand = randint(1, 3) - if (hand == 1) { - basic.showLeds(` - # # # # # - # . . . # - # . . . # - # . . . # - # # # # # - `) - } -}) -``` - -## Step 5 @fullscreen - -Place a ``||music:play sound||`` block under ``||basic:show leds||`` and edit it to make it sound like paper. - -```blocks -let hand = 0; -input.onGesture(Gesture.Shake, function () { - hand = randint(1, 3) - if (hand == 1) { - basic.showLeds(` - # # # # # - # . . . # - # . . . # - # . . . # - # # # # # - `) - music.playSoundEffect(music.createSoundEffect(WaveShape.Noise, 4120, 1266, 255, 148, 500, SoundExpressionEffect.Warble, InterpolationCurve.Curve), SoundExpressionPlayMode.UntilDone) - } -}) -``` - -## Step 6 @fullscreen - -Click on the **SHAKE** button in the simulator. If you try enough times, you should see a picture of paper on the screen. - -![Shaking a @boardname@ simulator](/static/mb/projects/rock-paper-scissors/rpsshake.gif) - - -## Step 7 @fullscreen - -Click the **(+)** button to add an ``||logic:else||`` section. - -![Adding an else clause](/static/mb/projects/rock-paper-scissors/ifelse.gif) - -```blocks -let hand = 0; -input.onGesture(Gesture.Shake, function () { - hand = randint(1, 3) - if (hand == 1) { - basic.showLeds(` - # # # # # - # . . . # - # . . . # - # . . . # - # # # # # - `) - music.playSoundEffect(music.createSoundEffect(WaveShape.Noise, 4120, 1266, 255, 148, 500, SoundExpressionEffect.Warble, InterpolationCurve.Curve), SoundExpressionPlayMode.UntilDone) - } else { - - } -}) -``` - -## Step 8 @fullscreen - -Add both a ``||basic:show leds||`` block and a ``||music:play sound||`` block inside the ``||logic:else||``. Make a picture for **scissors** using LEDs and create a scissors sound. - -```blocks -let hand = 0; -input.onGesture(Gesture.Shake, function () { - hand = randint(1, 3) - if (hand == 1) { - basic.showLeds(` - # # # # # - # . . . # - # . . . # - # . . . # - # # # # # - `) - music.playSoundEffect(music.createSoundEffect(WaveShape.Noise, 4120, 1266, 255, 148, 500, SoundExpressionEffect.Warble, InterpolationCurve.Curve), SoundExpressionPlayMode.UntilDone) - } else { - basic.showLeds(` - # # . . # - # # . # . - . . # . . - # # . # . - # # . . # - `) - music.playSoundEffect(music.createSoundEffect(WaveShape.Sine, 4417, 1, 0, 255, 266, SoundExpressionEffect.Vibrato, InterpolationCurve.Linear), SoundExpressionPlayMode.UntilDone) - } -}) -``` - -## Step 9 @fullscreen - -Click the **(+)** button again to add an ``||logic:else if||`` section. Now, add a conditional block for ``||logic:hand = 2||`` to the empty slot in the ``||logic:else if||``. Since ``hand`` can only be `1`, `2`, or `3`, your code is now covering all possible cases! - -![Adding an else if clause](/static/mb/projects/rock-paper-scissors/ifelseif.gif) - -## Step 10 @fullscreen - -Get one more ``||basic:show leds||`` block and ``||music:play sound||`` block and put them inside the ``||logic:else if||``. Make a picture of a rock in the LEDs and create a rock-like sound. - -```blocks -let hand = 0 -input.onGesture(Gesture.Shake, function () { - hand = randint(1, 3) - if (hand == 1) { - basic.showLeds(` - # # # # # - # . . . # - # . . . # - # . . . # - # # # # # - `) - music.playSoundEffect(music.createSoundEffect(WaveShape.Noise, 4120, 1266, 255, 148, 500, SoundExpressionEffect.Warble, InterpolationCurve.Curve), SoundExpressionPlayMode.UntilDone) - } else if (hand == 2) { - basic.showLeds(` - . . . . . - . # # # . - . # # # . - . # # # . - . . . . . - `) - music.playSoundEffect(music.createSoundEffect(WaveShape.Sine, 4417, 1, 0, 255, 266, SoundExpressionEffect.Vibrato, InterpolationCurve.Linear), SoundExpressionPlayMode.UntilDone) - } else { - basic.showLeds(` - # # . . # - # # . # . - . . # . . - # # . # . - # # . . # - `) - music.playSoundEffect(music.createSoundEffect(WaveShape.Triangle, 1177, 4967, 0, 206, 266, SoundExpressionEffect.Tremolo, InterpolationCurve.Linear), SoundExpressionPlayMode.UntilDone) - } -}) -``` - -## Step 11 @fullscreen - -Click on the **SHAKE** button in the simulator and check to see that each image is showing up. - -![Shaking a @boardname@ simulator](/static/mb/projects/rock-paper-scissors/rpssim3.gif) - -## Step 12 @fullscreen - -If you have a @boardname@, click on ``|Download|`` and follow the instructions to get the code -onto your @boardname@. - -Your game is ready! Gather your friends and play Rock Paper Scissors! - -![A @boardname@ in a hand](/static/mb/projects/rock-paper-scissors/hand.jpg) - -```template -input.onGesture(Gesture.Shake, function() {}) -``` diff --git a/docs/projects/rock-paper-scissors.md b/docs/projects/rock-paper-scissors.md index d92a79de1..eba7cdc31 100644 --- a/docs/projects/rock-paper-scissors.md +++ b/docs/projects/rock-paper-scissors.md @@ -191,7 +191,6 @@ input.onGesture(Gesture.Shake, function() { Let's test your code! Press the white **SHAKE** button on the Calliope mini on-screen simulator, or move your cursor quickly back and forth over the simulator. Do you see the icons for rock, paper and scissors randomly appear? ⭐ Great job! ⭐ -![Shaking a @boardname@ simulator](/static/mb/projects/rock-paper-scissors/rpssim3.gif) ## {Step 14} @@ -209,13 +208,13 @@ input.onGesture(Gesture.Shake, function () { hand = randint(1, 3) if (hand == 1) { basic.showIcon(IconNames.SmallSquare) - music.play(music.builtinPlayableSoundEffect(soundExpression.giggle), music.PlaybackMode.UntilDone) + music.playTone(131, music.beat(BeatFraction.Whole)) } else if (hand == 2) { basic.showIcon(IconNames.Square) - music.play(music.tonePlayable(262, music.beat(BeatFraction.Whole)), music.PlaybackMode.UntilDone) + music.playTone(392, music.beat(BeatFraction.Double)) } else { basic.showIcon(IconNames.Scissors) - music.play(music.createSoundExpression(WaveShape.Square, 1600, 1, 255, 0, 300, SoundExpressionEffect.None, InterpolationCurve.Curve), music.PlaybackMode.UntilDone) + music.playTone(784, music.beat(BeatFraction.Whole)) } }) @@ -228,3 +227,8 @@ randint(1, 3) ```template input.onGesture(Gesture.Shake, function() {}) ``` + + +```package +v3 +``` \ No newline at end of file diff --git a/docs/projects/rotary-dial-radio.md b/docs/projects/rotary-dial-radio.md deleted file mode 100644 index 5c2c127e6..000000000 --- a/docs/projects/rotary-dial-radio.md +++ /dev/null @@ -1,232 +0,0 @@ -# Rotary Dial Radio - -Rotary dial phones may not be one of the latest tech fashions but they've still got some wings if you pair them with a @boardname@. If you are lucky enough to still own one of these antiques, follow this guide and you can bring it into the 21st century. - -![A rotary dial phone connected to a @boardname@](/static/mb/projects/rotary-dial-radio/final.jpg) - -This guide is mainly a journal of notes and techniques used to convert a 1945 rotary dial into a @boardname@ radio encoder. This is an example of **reverse engineering**, a treasure hunt for engineers if you wish. - -### ~ hint - -### Stay safe - -Opening and handling any electrical device can be very dangerous. Make sure to unplug all sources of power. Unless you know what you are doing, stay away from wall power outlets (AC). - -### ~ - -## What is Pulse dialing? - - -The phone below is a Belgium rotary dial phone from 1945. It's really heavy and the dial makes a wonderful clicking noise when it turns. - -![Antique rotary dial phone](/static/mb/projects/rotary-dial-radio/oldphone.jpg) - -If you skim through the WikiPedia on "rotary dial phones", you'll quickly learn that they operated by using something called **pulse dialing** (https://en.wikipedia.org/wiki/Pulse_dialing). In a nutshell, the dialing mechanism opens and closes a circuit while it rotates which sends a series of electrical pulses on the phone line. One pulse for number 1, two pulses for number 2, and so on. (Hey, what about 0?) - -## Digging into the phone - -Fortunately for us, the bottom of the phone is easily removed by pressing lever. It reveals the internals of the phone. One can see the two massive bells to ring the phone and some other capacitors and circuitery. - -![Inside of a rotary phone](/static/mb/projects/rotary-dial-radio/guts.jpg) - -Most interestingly, there are 8 terminals near the 2 holes in the case for wires. - -* The 2 terminals on each side are connected by a black wire. This is most likely the ground wire. -* The phone line was missing but there is still a hole for it. Since phone lines carry a bit of electrical current, we'll inject electricity on those terminals. -* Three (3) terminals seem to be used by the handset so they must be carrying some kind of microphone/speaker signal. We'll try each of them. - -At this point, we have enough information to start "scoping" the lines and hopefully get lucky and see the pulses. (Did I mention treasure hunting?) - -## Scoping the lines - -Electrical engineers use tools called "scopes" to "see" the eletrical signals on the line. In our case, we'd like to see the pulses generated when the phone is dialing. We don't have a scope so we'll use the @boardname@ instead. - -We connect the @boardname@ to the phone using 3 croc clips: - -* **GND** pin goes to the ground terminal -* **3v** pin connects at the positive terminal on the phone line -* **P0** is attacned to one of the headset lines (not **GND**) - -![Wiring](/static/mb/projects/rotary-dial-radio/wired.jpg) - -In the MakeCode, we upload a program that reads the analog input on **P0** and plots it on the screen. If you pair your @boardname@, you can also see the data in the console view. - -```blocks -basic.forever(function () { - led.plotBarGraph( - pins.analogReadPin(AnalogPin.P0), - 1023 - ) -}) -``` - -Try moving the dial slowly...click, click and you should see the pulses, e.g. the signal going high and low. If you don't see anything, keep trying other cables. Be patient, don't give up. - -https://youtu.be/po9o77IEDaI - -## Detecting the pulses - -The @boardname@ can raise an event when an electrical signal on **P0** goes low or high. This is the most important step as it allows us to precisely detect and count pulses. Try the following program with the phone. When you move the dial, you see the first LED turn on and off as the line goes high and low. - -```blocks -pins.onPulsed(DigitalPin.P0, PulseValue.High, function () { - led.plot(0, 0) -}) -pins.onPulsed(DigitalPin.P0, PulseValue.Low, function () { - led.unplot(0, 0) -}) -``` - -## Counting the pulses - -Now that we are detecting pulses, we can use a variable to count them too. In this test program, we increment the **pulseCount** variable by one on each high pulse and we display the number when pressing the **A** button. Try dialing a number; then press A. - -```blocks -let pulseCount = 0 -input.onButtonEvent(Button.A, input.buttonEventValue(ButtonEvent.Down), function () { - basic.showNumber(pulseCount) - pulseCount = 0 -}) -pins.onPulsed(DigitalPin.P0, PulseValue.High, function () { - led.plot(0, 0) -}) -pins.onPulsed(DigitalPin.P0, PulseValue.Low, function () { - led.unplot(0, 0) - pulseCount += 1 -}) -``` - -## Digits and Numbers - -Our next task is to detect that the pulses for a digit have finished and we should then record the final number. The phone generates a train of pulses (typically 10 per second) per digit; the user might then move the dial back to start the next digit. This leaves a window of time when nothing happens on the line. If our decoder detects that nothing happens on the line for a long time, say 200ms, we assume that the train is done and save the digit. - -Instead of using button **A**, we add a **forever** loop that monitors the elapsed time since the last pulse. -If we have had a pulse (``pulseCount > 0``) **and** the last pulse was more than 200ms ago, we have a digit and we can send it. - -```blocks -let pulseCount = 0 -let lastPulseMs = 0 -pins.onPulsed(DigitalPin.P0, PulseValue.High, function () { - led.plot(0, 0) -}) -pins.onPulsed(DigitalPin.P0, PulseValue.Low, function () { - led.unplot(0, 0) - pulseCount += 1 - lastPulseMs = input.runningTime() -}) -basic.forever(function () { - if (pulseCount > 0 && lastPulseMs - input.runningTime() > 200) { - radio.sendNumber(pulseCount) - basic.showNumber(pulseCount) - pulseCount = 0 - } -}) -``` - -## What about 0? - -Great question! ``0`` is a special case and is represented by 10 pulses, so we need to update our decoder to take this into account. - -```blocks -let pulseCount = 0 -let lastPulseMs = 0 -pins.onPulsed(DigitalPin.P0, PulseValue.High, function () { - led.plot(0, 0) -}) -pins.onPulsed(DigitalPin.P0, PulseValue.Low, function () { - led.unplot(0, 0) - pulseCount += 1 - lastPulseMs = input.runningTime() -}) -basic.forever(function () { - if (pulseCount > 0 && lastPulseMs - input.runningTime() > 200) { - if(pulseCount == 10) { - pulseCount = 0 - } - radio.sendNumber(pulseCount) - basic.showNumber(pulseCount) - pulseCount = 0 - } -}) -``` - -## Numbers and more - -Improving the program is left as a challenge for you (treasure hunt). The following program was the result of the initial investigation; it waits 3 seconds between digits to send the entire number over radio and uses the screen to display how many digits were entered. This is just an example, you can come up with your own twist on this too! - -https://youtu.be/gW6rLH7qH5Q - -```blocks -pins.onPulsed(DigitalPin.P0, PulseValue.High, function () { - led.plot(0, 0) -}) -function plotIndex (i: number, on: boolean) { - row = Math.idiv(i, 5) - col = i % 5 - if (on) { - led.plot(col, row) - } else { - led.unplot(col, row) - } -} -function codeDots () { - for (let index = 0; index <= 4; index++) { - led.plot(index, 2) - } - for (let index2 = 0; index2 <= 9; index2++) { - plotIndex(15 + index2, index2 < code.length) - } -} -pins.onPulsed(DigitalPin.P0, PulseValue.Low, function () { - led.unplot(0, 0) - if (lastPulseMs == 0) { - pulseCount = 0 - lastPulseMs = input.runningTime() - } else if (input.runningTime() - lastPulseMs > 85) { - pulseCount += 1 - lastPulseMs = input.runningTime() - } -}) -let codeNumber = 0 -let lastDigitMs = 0 -let col = 0 -let row = 0 -let pulseCount = 0 -let code = "" -let lastPulseMs = 0 -radio.setGroup(1) -lastPulseMs = 0 -code = "" -pulseCount = 0 -basic.forever(function () { - if (lastPulseMs > 0 && input.runningTime() - lastPulseMs >= 250) { - led.plot(1, 0) - if (pulseCount == 10) { - pulseCount = 0 - } - code = "" + code + convertToText(pulseCount) - lastPulseMs = 0 - lastDigitMs = input.runningTime() - } else if (lastPulseMs == 0 && (code.length > 0 && (code.length == 10 || input.runningTime() - lastDigitMs >= 3000))) { - led.plot(2, 0) - codeNumber = parseFloat(code) - for (let index = 0; index < 1; index++) { - radio.sendNumber(codeNumber) - basic.pause(10) - } - basic.clearScreen() - basic.showNumber(codeNumber) - basic.clearScreen() - code = "" - lastPulseMs = 0 - } else { - led.unplot(1, 0) - led.unplot(2, 0) - } - codeDots() -}) -``` - -```package -funk -``` \ No newline at end of file diff --git a/docs/projects/snap-the-dot.md b/docs/projects/snap-the-dot.md deleted file mode 100644 index 8cb575604..000000000 --- a/docs/projects/snap-the-dot.md +++ /dev/null @@ -1,96 +0,0 @@ -# Snap the Dot - -## Introduction @unplugged - -![Animation of the snap the dot game](/static/calliope/tutorials/09_snap_the_dot_animation.gif) - -Snap the dot is a game of skill where the player has to press **A** exactly when the dot reaches the center of the screen. - -This tutorial shows how to use the game engine. - -## Make a sprite variable @fullscreen - -Create a new variable called `sprite`. Drag a ``||variables:set sprite to||`` into the ``||basic:on start||`` on the workspace. - -```blocks -let sprite = 0 -``` -## Create a sprite @fullscreen - -Pull out a ``||game:create sprite||`` block and put it in ``||variables:set sprite to||`` replacing the `0`. A sprite is a single pixel that can move on the screen. It has an ``x`` and ``y`` position along with a direction of motion. - -```blocks -let sprite = game.createSprite(2, 2) -``` - -## Move the dot @fullscreen - -The sprite starts in the center facing right. Put a ``||game:move||`` block into the ``||basic:forever||`` to make it move. Notice how it moves to the right but does not bounce back. - -```blocks -let sprite = game.createSprite(2, 2) -basic.forever(function () { - sprite.move(1) -}) -``` - -## Bounce @fullscreen - -Grab a ``||game:if on edge, bounce||`` block to make the sprite bounce on the side of the screen. Also, add a ``||basic:pause||`` block to slow down the sprite. - -```blocks -let sprite = game.createSprite(2, 2) -basic.forever(function () { - sprite.move(1) - sprite.ifOnEdgeBounce() - basic.pause(100) -}) -``` - -## Test and download - -Use the simulator to find the best speed. If you have a @boardname@, press ``|Download|`` to try it out on the device. - -## Button handling @fullscreen - -When **A** is pressed, we test if the sprite is in the center or not. - -Use a ``||input:on button pressed||`` block to handle the **A** button. Put in a ``||logic:if||`` block and test if ``||game:x||`` is equal to `2`. - -```blocks -let sprite = game.createSprite(2, 2) -input.onButtonEvent(Button.A, input.buttonEventValue(ButtonEvent.Click), function () { - if (sprite.get(LedSpriteProperty.X) == 2) { - } else { - } -}) -basic.forever(function () { - sprite.move(1) - basic.pause(100) - sprite.ifOnEdgeBounce() -}) -``` - -## Score and game over - -Finally, pull out an ``||game:add score||`` and a ``||game:game over||`` block to handle both success (sprite in the center) and failure (sprite not in the center). - -```blocks -let sprite = game.createSprite(2, 2) -input.onButtonEvent(Button.A, input.buttonEventValue(ButtonEvent.Click), function () { - if (sprite.get(LedSpriteProperty.X) == 2) { - game.addScore(1) - } else { - game.gameOver() - } -}) -basic.forever(function () { - sprite.move(1) - basic.pause(100) - sprite.ifOnEdgeBounce() -}) -``` - -## Test and download - -Your game is ready! If you have a @boardname@, press ``|Download|`` to try it out on the device. diff --git a/docs/projects/stopwatch.md b/docs/projects/stopwatch.md deleted file mode 100644 index fc69cc893..000000000 --- a/docs/projects/stopwatch.md +++ /dev/null @@ -1,74 +0,0 @@ -# Stopwatch - -## Introduction @unplugged - -![A @boardname@ stopwatch toon image](/static/mb/projects/stopwatch.png) - -This project turns the @boardname@ into a simple stopwatch. Pressing **A** starts the timer. Pressing **B** displays the elapsed seconds. - -## Step 1 - -Use an event to run code when ``||input:button A is pressed||``. - -```blocks -input.onButtonPressed(Button.A, function () { -}) -``` - -## Step 2 - -Add code to store the current ``||input:running time||`` -in a variable ``||variables:start||``. This is the start time. - -```blocks -let start = 0 -input.onButtonPressed(Button.A, function () { - start = input.runningTime() -}) -``` - -## Step 3 - -Add an event to run code when ``||input:button B is pressed||``. - -```blocks -input.onButtonPressed(Button.B, function () { -}) -``` - -## Step 4 - -Add code to compute the difference between the ``||input:running time||`` -and ``||variables:value||`` time. This is the elapsed millisecond since pressing button A. - -```blocks -let start = 0; -input.onButtonPressed(Button.B, function () { - let elapsed = input.runningTime() - start; -}) -``` - -## Step 5 - -Add code to ``||basic:show||`` the number of milliseconds ``||variables:elapsed||``. -Use ``||Math:integer division||`` to divide ``||variables:elapsed||`` by ``1000`` and get seconds. - -```blocks -let start = 0; -input.onButtonPressed(Button.B, function () { - let elapsed = input.runningTime() - start; - basic.showNumber(Math.idiv(elapsed, 1000)) -}) -``` - -## Step 6 - -Try your program in the simulator. Press **A** to start the stopwatch and press **B** to get the current elapsed time. You can press **B** multiple times. - -## Step 7 - -If you have a @boardname@ connected, click ``|Download|`` to transfer your code! - -```template -input.onButtonPressed(Button.A, function () {}) -``` diff --git a/docs/projects/v2-blow-away.md b/docs/projects/v2-blow-away.md deleted file mode 100644 index 822377e7f..000000000 --- a/docs/projects/v2-blow-away.md +++ /dev/null @@ -1,257 +0,0 @@ -# Blow Away - -## Introduction pt. 1 @unplugged - -👻 Oh, no! Your @boardname@ is being haunted by a ghost named Haven 👻 - -For this tutorial, we'll learn how to blow Haven away 🌬️ - -![Blow away banner message](/static/mb/projects/blow-away.png) - -## Haunted ghost setup - -A wild Haven has appeared! - -► From the ``||basic:Basic||`` category, find ``||basic:show icon [ ]||`` and add it to your ``||basic:on start||`` container. -► Click the heart icon and set it to show a ghost. -💡 In the ``show icon`` dropdown menu options, you can hover to see what each design is called. - -```blocks -// @highlight -basic.showIcon(IconNames.Ghost) -``` - ---- - -## Loop setup - -► From the ``||loops:Loops||`` category, find the ``||loops:repeat [4] times||`` loop and snap it into your empty ``||basic:forever||`` container. -💡 Why do we need a [__*repeat loop*__](#repeatLoop "repeat code for a given number of times") when we already have a ``forever`` container? Because ``forever`` has an embedded delay that we want to avoid! - -```blocks -basic.forever(function () { - // @highlight - for (let index = 0; index < 4; index++) { - - } -}) -``` - -## Conditional setup - -Haven hates noise and will blow away if things get too loud. Let's use an [__*if statement*__](#ifstatement "if this condition is met, do something") to check for sounds. - -► From ``||logic:Logic||``, grab an ``||logic:if then||`` statement and snap it into your empty ``||loops:repeat [4] times do||`` loop. -► Go back to ``||logic:Logic||`` to get a ``||logic:<[0] [=] [0]>||`` comparison. -► Snap ``||logic:<[0] [=] [0]>||`` in to **replace** the ``||logic:||`` condition for your ``||logic:if then||`` statement. - -```blocks -basic.forever(function () { - // @highlight - for (let index = 0; index < 4; index++) { - // @highlight - if (0 == 0) { - - } - } -}) -``` - -## Blow sound - -We'll be using a [__*sound threshold*__](#soundThreshold "a number for how loud a sound needs to be to trigger an event. 0 = silence to 255 = maximum noise") to act as Haven's ears. - -► From the ``||input:Input||`` category, drag ``||input:sound level||`` in to **replace** the **_left_ ``0``** of your ``||logic:<[0] [=] [0]>||`` comparison. -► Using the dropdown in the **middle** of ``||logic:[sound level] [=] [0]||``, change the comparison to be **``>``** (greater than). -► Finally, have the **right side** of the comparison say ``128`` so your full comparison reads: **``sound level > 128``**. -💡 This means Haven will hear any sound above ``128``. - -```blocks -basic.forever(function () { - for (let index = 0; index < 4; index++) { - // @highlight - if (input.soundLevel() > 128) { - - } - } -}) -``` - -## Making variables - -Let's create some [__*variables*__](#variable "a holder for information that may change") to keep track of Haven's movement. - -► In the ``||variables:Variables||`` category, click on ``Make a Variable...`` and make a variable named ``col``. -💡 ``col`` is short for "column". -► Make **another** variable and name it ``row``. - -## Displacing LEDs part 1 - -To show Haven is blowing away, we want to move a random set of lights sideways. - -► Your ``||variables:Variables||`` category should now have the option to ``||variables:set [row] to [0]||``. Drag that block into your empty ``||logic:if then||`` statement. -► From the ``||math:Math||`` category, find ``||math:pick random [0] to [10]||`` and snap that in to **replace** the ``[0]`` in your ``||variables:set [row] to [0]||`` block. -► Change the maximum number from ``10`` to **``4``**. -💡 We are setting the maximum random value to 4 because the lights on the @boardname@ are numbered 0, 1, 2, 3, and 4 for columns and rows. - -```blocks -let row = 0 -basic.forever(function () { - for (let index = 0; index < 4; index++) { - if (input.soundLevel() > 128) { - // @highlight - row = randint(0, 4) - } - } -}) -``` - -## Displacing LEDs part 2 - -► Go back into ``||variables:Variables||`` and drag out another ``||variables:set [row] to [0]||``. Place this one below the last one (at **the end**) of your `if then` statement. -► Using the **dropdown menu**, set the new block to read ``||variables:set [col] to [0]||``. -► From the ``||math:Math||`` category, grab another ``||math:pick random [0] to [10]||`` and snap that in to **replace** the ``[0]`` in your ``||variables:set [col] to [0]||`` block. -► Change the maximum number from ``10`` to **``4``**. - -```blocks -let col = 0 -let row = 0 -basic.forever(function () { - for (let index = 0; index < 4; index++) { - if (input.soundLevel() > 128) { - row = randint(0, 4) - // @highlight - col = randint(0, 4) - } - } -}) -``` - -## Conditioning on one point - -Time to move some lights around! - -► From ``||logic:Logic||``, grab another ``||logic:if then||`` and snap it at the **inside and at the bottom of** your ``||loops:repeat [4] times do||`` loop, right below your ``||logic:if [sound level] [>] [128]||`` statement. -► From the ``||led:Led||`` category, find ``||led:point x [0] y [0]||`` and drag it in to **replace** the ``||logic:||`` condition in the **new** ``||logic:if then||`` statement. -💡 This block will test if the light is on at the the given ``x`` and ``y`` coordinate points. - -```blocks -let col = 0 -let row = 0 -basic.forever(function () { - for (let index = 0; index < 4; index++) { - if (input.soundLevel() > 128) { - row = randint(0, 4) - col = randint(0, 4) - } - // @highlight - if (led.point(0, 0)) { } - } -}) -``` - -## Unplotting and replotting LEDs - -To create the animation effect of Haven blowing away, we will turn off (or ``unplot``) a light that is on and then turn it on again (``plot`` it) in a different spot. - -► From ``||led:Led||``, grab ``||led:unplot x [0] y [0]||`` and snap it inside the **empty** ``||logic:if then||`` statement. -► Go back to ``||led:Led||`` and get ``||led:plot x [0] y [0]||``. Snap that in **beneath** the ``||led:unplot x [0] y [0]||`` block that you just added. - -```blocks -let col = 0 -let row = 0 -basic.forever(function () { - for (let index = 0; index < 4; index++) { - if (input.soundLevel() > 128) { - row = randint(0, 4) - col = randint(0, 4) - } - // @highlight - if (led.point(0, 0)) { - led.unplot(0, 0) - led.plot(0, 0) - } - } -}) -``` - -## 11. Setting variables - -Notice how you have **three** blocks from the ``||led:Led||`` category. All three have ``||led:x||`` ``[0]`` and ``||led:y||`` ``[0]`` coordinates. In these **two** steps, we will set it so that every ``||led:x||`` is followed by the ``||variables:col||`` variable and every ``||led:y||`` is followed by the ``||variables:row||`` variable. -► From ``||variables:Variables||``, get three copies of ``||variables:col||``, and use them to **replace the ``x`` values** in the following three blocks: -**1.** ``||led:point x [0] y [0]||`` -**2.** ``||led:unplot x [0] y [0]||`` -**3.** ``||led:plot x [0] y [0]||`` -► Go into ``||variables:Variables||``, get three copies of ``||variables:row||``, and use them to **replace the ``y`` values** in the same three blocks. - -```blocks -let col = 0 -let row = 0 -basic.forever(function () { - for (let index = 0; index < 4; index++) { - if (input.soundLevel() > 128) { - row = randint(0, 4) - col = randint(0, 4) - } - // @highlight - if (led.point(col, row)) { - led.unplot(col, row) - led.plot(col, row) - } - } -}) -``` - -## 12. Moving LEDs - -Right now, we are unplotting and replotting in the same spot. What we want to do is move the lights we're turning back on just a smidge to the right every time until there's nothing left on the grid. - -► From ``||math:Math||``, find the ``||math:[0] [+] [0]||`` operation and use it to **replace** ``||variables:col||`` in your ``||led:plot x [col] y [row]||`` block. -💡 If you move your entire ``||basic:forever||`` container, you should find a greyed out ``col`` variable in your workspace. -► Take the greyed out ``||variables:col||`` variable (or get a new one) and use it to **replace** the **_first_ ``[0]``** so the operation reads ``||math:[col] [+] [0]||``. -► Replace the **_second_ ``[0]``** with **``[1]``** so the operation reads ``||math:[col] [+] [1]||``. - -```blocks -let col = 0 -let row = 0 -basic.forever(function () { - for (let index = 0; index < 4; index++) { - if (input.soundLevel() > 128) { - row = randint(0, 4) - col = randint(0, 4) - } - // @highlight - if (led.point(col, row)) { - led.unplot(col, row) - led.plot(col + 1, row) - } - } -}) -``` - -## 13. Testing in the simulator - -Check out the simulator! - -► Click on the pink bar underneath the microphone icon. Drag it above the sound number you chose (we used ``128``!) to blow Haven away. -► If you have a new @boardname@ (the one with the **shiny gold** logo at the top), download this code and try it out! -💡 Blow close to the @boardname@ and watch Haven swoosh away 💨 -💡 Use your @boardname@'s reset button (it's on the back!) to bring Haven back 👻 - -```blocks -let col = 0 -let row = 0 -basic.showIcon(IconNames.Ghost) -basic.forever(function () { - for (let index = 0; index < 4; index++) { - if (input.soundLevel() > 128) { - row = randint(0, 4) - col = randint(0, 4) - } - if (led.point(col, row)) { - led.unplot(col, row) - led.plot(col + 1, row) - } - } -}) -``` diff --git a/docs/projects/v2-cat-napping.md b/docs/projects/v2-cat-napping.md deleted file mode 100644 index 79df0f696..000000000 --- a/docs/projects/v2-cat-napping.md +++ /dev/null @@ -1,198 +0,0 @@ -# Cat Napping - -## Introduction @unplugged - -Lychee the cat loves the sun and wants to know if your home has a good sunbathing spot. Are you up for the challenge? - -![Cat Tanning banner message, an image of a cat](/static/mb/projects/cat-napping/1_lychee.png) - -## Setting logging to false on start - -First, we want to make sure we know when our Calliope mini is collecting data. To do this, let's create a [__*boolean*__](#boolean "something that is only true or false") [__*variable*__](#variable "a holder for information that may change") and use it to track when the @boardname@ is logging data. We'll start with the logging variable set to false. - -► In the ``||variables:Variables||`` category, click on ``Make a Variable...`` and make a variable named ``logging``. -► From the ``||variables:Variables||`` category, grab the ``||variables:set [logging] to [0]||`` block and snap it into the empty ``||basic:on start||`` container. -► From the ``||logic:Logic||`` category, grab a ``||logic:||`` argument and snap it in to **replace** the ``||variables:[0]||`` value in your ``||variables:set [logging] to [0]||`` statement. - -```blocks -let logging = false -logging = false -``` - -## Toggle logging on A press - -Let's give Lychee some control over when she wants to start and stop logging data on the @boardname@. - -► From the ``||input:Input||`` category, grab a ``||input:on button [A] pressed||`` container and drag it into your workspace. Then, grab a ``||variables:set [logging] to [0]||`` block from ``||variables:Varables||`` and snap it inside of your ``||input:on button [A] pressed||`` container. -► From the ``||logic:Logic||`` category, grab a ``||logic:||`` argument and snap it in to **replace** the ``0`` argument. Go back to the ``||variables:Variables||`` category, grab a ``||variables:logging||`` variable and snap it in to **replace** the empty ``||logic:<>||`` in the ``||logic:not <>||`` statement. - -✋🛑 Take a moment to help Lychee answer the following question: _What is happening every time she presses the A button?_ - -```blocks -let logging = false -input.onButtonPressed(Button.A, function () { - logging = !(logging) -}) -``` - -## Visual logging indicators - -It would help to know when the @boardname@ is logging data and when it isn't. For this step, we will be building out a visual indicator using an [__*if then / else*__](#ifthenelse "runs some code if a boolean condition is true and different code if the condition is false") statement. - -► From the ``||logic:Logic||`` category, grab an ``||logic:if then / else||`` statement and snap it in at the **bottom** of your ``||input:on button [A] pressed||`` container. -► From ``||variables:Variables||``, grab a ``||variables:logging||`` variable and snap it in to **replace** the ``||logic:||`` condition in your ``||logic:if then / else||`` statement. - -```blocks -let logging = false -input.onButtonPressed(Button.A, function () { - logging = !(logging) - if (logging) { - } else { - } -}) -``` - -## Set the indicator icon - -► Let's display an image when the @boardname@ is logging data. From the ``||basic:Basic||`` category, grab a ``||basic:show icon []||`` block and snap it into the empty **top container** of your ``||logic:if then / else||`` statement. -► Set it to show the "target" icon (it looks like an empty sun - scroll down to find it!). This will show whenever your @boardname@ is collecting data. -💡 In the ``show icon`` dropdown menu options, you can hover to see what each design is called. - -```blocks -let logging = false -input.onButtonPressed(Button.A, function () { - logging = !(logging) - if (logging) { - basic.showIcon(IconNames.Target) - } else { - } -}) -``` - -## Auditory logging indicators - -Let's now add an auditory indicator that your @boardname@ is logging data! - -► From the ``||music:Music||`` category, grab a ``||music:play sound [giggle] [until done]||`` block and snap it into the **bottom** of the **top container** of your ``||logic:if then / else||`` statement. -► Click on the ``giggle`` dropdown and select ``hello``. Your block should now say ``||music:play sound [hello] [until done]||``. - -```blocks -let logging = false -input.onButtonPressed(Button.A, function () { - logging = !(logging) - if (logging) { - basic.showIcon(IconNames.Target) - music.playSoundEffect(music.builtinSoundEffect(soundExpression.hello), SoundExpressionPlayMode.UntilDone) - } else { - } -}) -``` - -## Logging off indicator - -► Let's clear the board when the @boardname@ is not logging data. From the ``||basic:Basic||`` category, grab a ``||basic:clear screen||`` block and snap it into the empty **bottom container** of your ``||logic:if then / else||`` statement. - -```blocks -let logging = false -input.onButtonPressed(Button.A, function () { - logging = !(logging) - if (logging) { - basic.showIcon(IconNames.Target) - music.playSoundEffect(music.builtinSoundEffect(soundExpression.hello), SoundExpressionPlayMode.UntilDone) - } else { - basic.clearScreen() - } -}) -``` - -## Time interval for data logging - -Let's set up the data logging for Lychee! In order to get Lychee a good amount of data without running out of memory, we should collect one data point for her every minute. - -► From the ``||loops:Loops||`` category, grab a ``||loops:every [500] ms||`` container and add it to your workspace. -► Click on the the ``500`` dropdown and select ``1 minute``.
-💡 1 minute is equivalent to 60000ms, which is what the number will automatically change to. - -```blocks -loops.everyInterval(60000, function () { -}) -``` - -## Setting up a logging variable - -Now, let's use an [__*if then*__](#ifthen "runs some code if a boolean condition is true") statement to track when the @boardname@ is logging data. - -► From the ``||logic:Logic||`` category, grab a ``||logic:if then||`` statement and snap it into your ``||loops:every [600000] ms||`` container. -► From the ``||variables:Variables||`` category, drag out a ``||variables:logging||`` variable and snap it in to **replace** the ``||logic:||`` argument in the ``||logic:if then||`` statement. - -```blocks -let logging = false -loops.everyInterval(60000, function () { - if (logging) { - } -}) -``` - -## Setting up logging - Part 1 - -Lychee loves her sun spots because they provide a nice, sunny and warm place to nap. So, we'll need to measure the **temperature** and **light** in different places around the house. - -► From the ``||datalogger:Data Logger||`` category, grab a ``||datalogger:log data [column [""] value [0]] +||`` block and snap it **inside** the ``||logic:if [logging] then||`` statement. -► Click on the ``""`` after the word ``column`` and type in "``temp``". -► From the ``||input:Input||`` category, select the ``||input:temperature (°C)||`` parameter and drag it in to **replace** the ``0`` after the word ``value``. - -```blocks -let logging = false -loops.everyInterval(60000, function () { - if (logging) { - //@highlight - datalogger.log( - datalogger.createCV("temp", input.temperature()) - ) - } -}) -``` - -## Setting up logging - Part 2 - -► On the right of the ``||input:temperature (°C)||`` input that you just snapped in, there is a ➕ button. Click on it. You should now see a new row that says ``||datalogger:column [""] value [0]||``. -► Click on the empty ``""`` after the word ``column`` and type in "``light``". -► From the ``||input:Input||`` category, select the ``||input:light level||`` parameter and drag it in to **replace** the ``0`` parameter after the word ``value``. - -```blocks -let logging = false -loops.everyInterval(60000, function () { - if (logging) { - //@highlight - datalogger.log( - datalogger.createCV("temp", input.temperature()), - datalogger.createCV("light", input.lightLevel()) - ) - } -}) -``` - -## Time to log data! @unplugged - -You did it! If you have a @boardname@ (the one with the **shiny gold** logo at the top), download this code and try it out! - -► Find a sun spot in your house and press the ``A`` button to start logging data - your display should show an icon and play a sound to indicate that you are logging data. -► After some time (we recommend at least an hour), press the ``A`` button again to stop logging data - your display should clear to indicate that you are not logging data. - -## Reviewing your data @unplugged - -Now that you have logged some data, plug your @boardname@ into a laptop or desktop computer. The @boardname@ will appear like a USB drive called MINI. Look in there and you'll see a file called MY_DATA: - -![MY_DATA file highlighted in file folder](/static/mb/projects/cat-napping/11_mydata.png) - -Double-click on MY_DATA to open it in a web browser and you'll see a table with your data: - -![Image of sample data file](/static/mb/projects/cat-napping/11_datafile.png) - -## Lychee's preferences @unplugged - -Does your home have a good sunbathing spot for Lychee? Compare the light and temperature levels you record for different areas around your house! The sunniest and warmest spots will likely be her favorite ☀️😻 - -```package -datalogger -``` diff --git a/docs/projects/v2-clap-lights.md b/docs/projects/v2-clap-lights.md deleted file mode 100644 index 19e67143f..000000000 --- a/docs/projects/v2-clap-lights.md +++ /dev/null @@ -1,161 +0,0 @@ -# Clap Lights - -## Introduction @unplugged - -The new @boardname@s have a microphone to help them detect sound 🎤 - -Let's learn how to use a clap 👏 to switch your @boardname@'s lights on and off! - -![Clap lights banner message](/static/mb/projects/clap-lights.png) - -## Setting up the sound input - -► From the ``||input:Input||`` category, find the ``||input:on [loud] sound||`` container and add it to your workspace. - -```blocks -input.onSound(DetectedSound.Loud, function () { - -}) -``` - -## Creating a lightsOn variable - -Let's begin by creating a [__*variable*__](#variable "a holder for information that may change") to keep track of whether the @boardname@'s lights are on or off. - -► In the ``||variables:Variables||`` category, click on ``Make a Variable...`` and make a variable named ``lightsOn``. - -## Displaying LEDs part 1 - -In this step, we'll be using an [__*if then / else*__](#ifthenelse "runs some code if a Boolean condition is true and different code if the condition is false") statement. - -► From the ``||logic:Logic||`` category, grab an ``||logic:if then / else||`` block and snap it into your ``||input:on [loud] sound||`` container. -► Look in the ``||variables:Variables||`` category. Find the new ``||variables:lightsOn||`` variable and snap it in to **replace** the ``||logic:||`` value in your ``||logic:if then / else||`` statement. - -```blocks -let lightsOn = 0 -input.onSound(DetectedSound.Loud, function () { - // @highlight - if (lightsOn) { - - } else { - - } -}) -``` - -## Displaying LEDs part 2 - -► From ``||basic:Basic||``, grab ``||basic:show leds||`` and snap it into the **top container** of your ``||logic:if then / else||`` statement. -► Set the lights to a pattern you like! -💡 In the hint, we chose to turn on all of the outside lights. Feel free to make your own design 🎨 - -```blocks -let lightsOn = 0 -input.onSound(DetectedSound.Loud, function () { - if (lightsOn) { - // @highlight - basic.showLeds(` - # # # # # - # . . . # - # . . . # - # . . . # - # # # # # - `) - } else { - } -}) -``` - -## Clearing the screen - -► From ``||basic:Basic||``, find ``||basic:clear screen||`` and snap it into the **bottom container** of your ``||logic:if then / else||`` section. -💡 This will turn the display off if ``lightsOn`` is **not** ``true``. - -```blocks -let lightsOn = 0 -input.onSound(DetectedSound.Loud, function () { - if (lightsOn) { - basic.showLeds(` - # # # # # - # . . . # - # . . . # - # . . . # - # # # # # - `) - } else { - // @highlight - basic.clearScreen() - } -}) -``` - -## Setting the lightsOn variable - -Just like we'd toggle a light switch, each time we clap, we want to **flip** the variable ``lightsOn`` to the **opposite** of what it was before. - -► From ``||variables:Variables||``, locate ``||variables:set [lightsOn] to [0]||`` and snap it in at the **very top** of your ``||input:on [loud] sound||`` container. -► From the ``||logic:Logic||`` category, find the ``||logic:not <>||`` operator and use it to **replace the ``[0]``** in ``||variables:set [lightsOn] to [0]||``. -► From ``||variables:Variables||``, grab ``||variables:lightsOn||`` and snap it into the **empty part** of the ``||logic:not <>||`` operator. - -```blocks -let lightsOn = false -input.onSound(DetectedSound.Loud, function () { - // @highlight - lightsOn = !(lightsOn) - if (lightsOn) { - basic.showLeds(` - # # # # # - # . . . # - # . . . # - # . . . # - # # # # # - `) - } else { - basic.clearScreen() - } -}) -``` - -## Testing in the simulator - -► Check out the simulator! -► Click on the pink slider bar beneath the microphone icon and drag it up and down. -💡 Right now, your @boardname@ thinks that anything above 128 is loud. Every time the sound goes > 128, your lights should switch on/off. - -## Set loud sound threshold - -Your @boardname@ might detect sounds when you don't want it to. Setting a [__*sound threshold*__](#soundThreshold "a number for how loud a sound needs to be to trigger an event. 0 = silence to 255 = maximum noise") could help 🔉🔊 - -► Click on the ``||input:Input||`` category. A new category should show up beneath it called ``||input:...more||``. -► From ``||input:...more||``, grab ``||input:set [loud] sound threshold to [128]||`` and snap it into your **empty** ``||basic: on start||`` container. -💡 Try to change the value of your sound threshold so that every time you clap, your lights will turn on if they are off and vice versa. - -```blocks -// @highlight -input.setSoundThreshold(SoundThreshold.Loud, 150) -``` - -## Testing, round 2 - -Don't forget to test your code in the simulator! - -If you have a new @boardname@ (the one with the **shiny gold** logo at the top), download this code and try it out! - -```blocks -let lightsOn = false -input.onSound(DetectedSound.Loud, function () { - lightsOn = !(lightsOn) - if (lightsOn) { - basic.showLeds(` - # # # # # - # . . . # - # . . . # - # . . . # - # # # # # - `) - } else { - basic.clearScreen() - } -}) -input.setSoundThreshold(SoundThreshold.Loud, 150) -``` \ No newline at end of file diff --git a/docs/projects/v2-countdown.md b/docs/projects/v2-countdown.md deleted file mode 100644 index 4b02ff326..000000000 --- a/docs/projects/v2-countdown.md +++ /dev/null @@ -1,119 +0,0 @@ -# Countdown - -## Introduction @unplugged - -🎇3...🎇2...🎇1... -🎆GO!🎆 - -Let's create a musical countdown using the new @boardname@ with sound! - -![Countdown banner message](/static/mb/projects/countdown.png) - -## Setting up the loop - -We'll begin by using a [__*for loop*__](#forLoop "repeat code for a given number of times using an index") to recreate the same sound 3 times. - -► From the ``||loops:Loops||`` category in your toolbox, find the ``||loops:for [index] from 0 to [4]||`` loop and add it to your ``||basic:on start||`` container. -► Change your loop to count from ``0`` to **``2``**. -💡 This means the loop will count 0-1-2 instead of what we want, which is 3-2-1. We will worry about this later! - -```blocks -// @highlight -for (let index = 0; index <= 2; index++) { - -} -``` - -## Play music - -► From ``||music:Music||``, grab ``||music:play tone [Middle C] for [1 beat]||`` and snap it into your empty ``for`` loop. -💡 Your simulator might start playing music. You can mute it if distracting. -► 1 beat is a little long. Use the **dropdown** to set the tone to play for ``||music:1/4 beat||``. - -```blocks -for (let index = 0; index <= 2; index++) { - // @highlight - music.playTone(262, music.beat(BeatFraction.Quarter)) -} -``` - -## Showing a number - -With every tone, we also want to **display** our countdown. - -► From ``||basic:Basic||``, find ``||basic:show number [0]||`` and snap it in at the **bottom** of your ``for`` loop. -► From your ``||loops:for [index] from 0 to [2]||`` loop condition, click and drag out the **red** ``||variables:index||`` variable. -► Use the ``||variables:index||`` that you dragged out to **replace** the ``0`` in ``||basic:show number [0]||``. - -```blocks -for (let index = 0; index <= 2; index++) { - music.playTone(262, music.beat(BeatFraction.Quarter)) - // @highlight - basic.showNumber(index) -} -``` - -## Inverting the number - -If you take a look at your simulator, you'll notice the @boardname@ flashing 0-1-2. We want it to say 3-2-1! Let's learn a trick to change that. - -► From the ``||math:Math||`` category, snap ``||math:[0] - [0]||`` in to **replace** ``||variables:index||`` in your ``||basic:show number [index]||`` block. -💡 You should now have a greyed out ``index`` variable in your workspace. We'll use that in the next step. -► Pick up the greyed out ``||variables:index||`` variable and snap it in to the **right side** of your ``||math:[0] - [0]||`` operator. -💡 Can't find ``||variables:index||``? Try moving your ``||basic:on start||`` container to see if ``||variables: index||`` is hiding behind it! -► Set the **left side** of your ``||math:[0]-[index]||`` operator to **``3``**. -💡 Why does this work? Every time we loop, our ``index`` variable will grow by 1 and our @boardname@ will output: 3-0 = **3** ➡️ 3-1 = **2** ➡️ 3-2 = **1**! - -```blocks -for (let index = 0; index <= 2; index++) { - music.playTone(262, music.beat(BeatFraction.Quarter)) - // @highlight - basic.showNumber(3 - index) -} -``` - -## Printing "GO!" - -► From ``||basic:Basic||``, grab ``||basic:show string ["Hello!"]||`` and snap it into the **very bottom** of your ``||basic:on start||`` container. -► Replace ``Hello!`` with the word ``GO!`` - -```blocks -for (let index = 0; index <= 2; index++) { - music.playTone(262, music.beat(BeatFraction.Quarter)) - basic.showNumber(3 - index) -} -// @highlight -basic.showString("GO!") -``` - -## Adding a "GO!" noise - -► From the ``||music:Music||`` category, grab ``||music:play tone [Middle C] for [1 beat]||`` and place it **above** your ``||basic:show string ["GO!"]||`` block and **below** your ``||loops:for||`` loop. -💡 This will let your @boardname@ play the sound and show ``GO!`` at the same time. -► Set the ``||music:tone||`` to be ``Middle G``. -💡 ``Middle G`` is also tone ``392``. - -```blocks -for (let index = 0; index <= 2; index++) { - music.playTone(262, music.beat(BeatFraction.Quarter)) - basic.showNumber(3 - index) -} -// @highlight -music.playTone(392, music.beat(BeatFraction.Whole)) -basic.showString("GO!") -``` - -## 8. Testing in the simulator - -Make sure your speakers are on and check out the simulator! - -If you have a @boardname@ with sound (the one with the **shiny gold** logo at the top), no need to plug in an external speaker - just download this code and try it out! - -```blocks -for (let index = 0; index <= 2; index++) { - music.playTone(262, music.beat(BeatFraction.Quarter)) - basic.showNumber(3 - index) -} -music.playTone(392, music.beat(BeatFraction.Whole)) -basic.showString("GO!") -``` \ No newline at end of file diff --git a/docs/projects/v2-morse-chat.md b/docs/projects/v2-morse-chat.md deleted file mode 100644 index 96ce790a9..000000000 --- a/docs/projects/v2-morse-chat.md +++ /dev/null @@ -1,292 +0,0 @@ -# Morse Chat - -## Introducing Sky @unplugged - -🐷 Meet Sky, the pig! Sky can only communicate using [__*morse code*__](#morsecode "an alphabet composed of dots (short signals) and dashes (long signals)"). - -Luckily, you can use your @boardname@ with sound to talk to Sky 👋 - -![Morse chat banner message](/static/mb/projects/morse-chat.png) - -## Setup - -► From the ``||input:Input||`` category in the toolbox, drag an ``||input:on logo [pressed]||`` container into to your workspace. -► From the ``||radio:Radio||`` category, get ``||radio:radio send number [0]||`` and snap it into your empty ``||input:on logo [pressed]||`` container. - -```blocks -input.onLogoEvent(TouchButtonEvent.Pressed, function () { - radio.sendNumber(0) -}) -``` - -## Sending different messages pt. 1 - -► From ``||input:Input||``, grab **another** ``||input:on logo [pressed]||`` container and add it to your workspace. -💡 This container is greyed out because it matches another. Let's change that! -► On the greyed-out ``||input:on logo [pressed]||`` container, click on the **``pressed``** dropdown and set it to ``||input:long pressed||``. - -```blocks -// @highlight -input.onLogoEvent(TouchButtonEvent.LongPressed, function () { -}) -input.onLogoEvent(TouchButtonEvent.Pressed, function () { - radio.sendNumber(0) -}) -``` - -## Sending different messages pt. 2 - -► From the ``||radio:Radio||`` category, get a ``||radio:radio send number [0]||`` block and snap it into your **empty** ``||input:on logo [long pressed]||`` container. -► Set the number to be ``1``. - -```blocks -input.onLogoEvent(TouchButtonEvent.LongPressed, function () { - // @highlight - radio.sendNumber(1) -}) -input.onLogoEvent(TouchButtonEvent.Pressed, function () { - radio.sendNumber(0) -}) -``` - -## Receiving different messages - -To ensure Sky gets the right message, we will use an [__*if then / else*__](#ifthenelse "runs some code if a boolean condition is true and different code if the condition is false") conditional statement. - -► From ``||radio:Radio||``, find the ``||radio:on radio received [receivedNumber]||`` container and add it to your workspace. -► From ``||logic:Logic||``, grab an ``||logic:if then / else||`` statement and snap it into your **new** ``||radio:on radio received [receivedNumber]||`` container. -► Go back to the ``||logic:Logic||`` category, grab ``||logic:<[0] [=] [0]>||``, and click it in to **replace** the ``||logic:||`` argument in your ``||logic:if then / else||`` statement. - -```blocks -radio.onReceivedNumber(function (receivedNumber) { - // @highlight - if (0 == 0) { - - } else { - - } -}) -``` - -## Conditioning on the input - -► From your ``||radio:on radio received [receivedNumber]||`` container, grab the **``receivedNumber``** input and drag out a copy. -► Use your copy of **``receivedNumber``** to replace the ``[0]`` on the **left side** of ``||logic:<[0] [=] [0]>||``. - -```blocks -radio.onReceivedNumber(function (receivedNumber) { - // @highlight - if (receivedNumber == 0) { - - } else { - - } -}) -``` - -## Displaying a message pt. 1 - -► We want to display a dash if the logo is long pressed. From ``||basic:Basic||``, grab ``||basic:show leds||`` and snap it into the empty **bottom container** of your ``||logic:if then / else||`` statement. -► Turn on 3 LEDs in a row to be a dash: - - -```blocks -radio.onReceivedNumber(function (receivedNumber) { - if (receivedNumber == 0) { - } else { - // @highlight - basic.showLeds(` - . . . . . - . . . . . - . # # # . - . . . . . - . . . . . - `) - } -}) -``` - -## Playing a sound pt. 1 - -► From the ``||music:Music||`` category, grab a ``||music:play tone [Middle C] for [1 beat]||`` block and snap it at the **end** of the **bottom container** in your ``||logic:if then / else||`` statement. - -```blocks -radio.onReceivedNumber(function (receivedNumber) { - if (receivedNumber == 0) { - } else { - basic.showLeds(` - . . . . . - . . . . . - . # # # . - . . . . . - . . . . . - `) - // @highlight - music.playTone(262, music.beat(BeatFraction.Whole)) - } -}) -``` - -## Displaying a message pt. 2 - -► We want to display a dot if the logo is pressed. From ``||basic:Basic||``, grab another ``||basic:show leds||`` and snap it into the **top container** of your ``||logic:if then / else||`` statement. -► Turn on a single LED to make a dot: . - -```blocks -radio.onReceivedNumber(function (receivedNumber) { - if (receivedNumber == 0) { - // @highlight - basic.showLeds(` - . . . . . - . . . . . - . . # . . - . . . . . - . . . . . - `) - } else { - basic.showLeds(` - . . . . . - . . . . . - . # # # . - . . . . . - . . . . . - `) - music.playTone(262, music.beat(BeatFraction.Whole)) - } -}) -``` - -## Playing a sound pt. 2 - -► From the ``||music:Music||`` category, grab ``||music:play tone [Middle C] for [1 beat]||`` and snap it in at the **end** of the **top container** in your ``||logic:if then / else||`` statement. -► Dots are shorter than dashes! Set the tone to play for ``1/4 beat``. - -```blocks -radio.onReceivedNumber(function (receivedNumber) { - if (receivedNumber == 0) { - basic.showLeds(` - . . . . . - . . . . . - . . # . . - . . . . . - . . . . . - `) - // @highlight - music.playTone(262, music.beat(BeatFraction.Quarter)) - } else { - basic.showLeds(` - . . . . . - . . . . . - . # # # . - . . . . . - . . . . . - `) - music.playTone(262, music.beat(BeatFraction.Whole)) - } -}) -``` - -## Clearing the screens - -► From ``||basic:Basic||``, find ``||basic:clear screen||`` and snap it in at the **very bottom** of your ``||radio:on radio received [receivedNumber]||`` container. - -```blocks -radio.onReceivedNumber(function (receivedNumber) { - if (receivedNumber == 0) { - basic.showLeds(` - . . . . . - . . . . . - . . # . . - . . . . . - . . . . . - `) - music.playTone(262, music.beat(BeatFraction.Quarter)) - } else { - basic.showLeds(` - . . . . . - . . . . . - . # # # . - . . . . . - . . . . . - `) - music.playTone(262, music.beat(BeatFraction.Whole)) - } - // @highlight - basic.clearScreen() -}) -``` - -## Testing in the simulator - Connect! - -Test what you've created. Remember to turn your sound on! - -► Touch the gold **Calliope mini logo** at the top of your @boardname@ on the simulator. You'll notice that a second @boardname@ appears. This is the @boardname@ for Sky 🐖 -💡 If your screen is too small, you might not be able to see it. - -```blocks -radio.onReceivedNumber(function (receivedNumber) { - if (receivedNumber == 0) { - basic.showLeds(` - . . . . . - . . . . . - . . # . . - . . . . . - . . . . . - `) - music.playTone(262, music.beat(BeatFraction.Quarter)) - } else { - basic.showLeds(` - . . . . . - . . . . . - . # # # . - . . . . . - . . . . . - `) - music.playTone(262, music.beat(BeatFraction.Whole)) - } - basic.clearScreen() -}) -input.onLogoEvent(TouchButtonEvent.LongPressed, function () { - radio.sendNumber(1) -}) -input.onLogoEvent(TouchButtonEvent.Pressed, function () { - radio.sendNumber(0) -}) -``` - -## Testing in the simulator - Send message - -► Touch the logo again to send messages to Sky 🐖 -**Press** to send a dot. -**Long press** (count to 3!) to send a dash. -► If you have multiple @boardname@s with sound (they have **shiny gold** logos at the top), download this code and try it out! - -```blocks -radio.onReceivedNumber(function (receivedNumber) { - if (receivedNumber == 0) { - basic.showLeds(` - . . . . . - . . . . . - . . # . . - . . . . . - . . . . . - `) - music.playTone(262, music.beat(BeatFraction.Quarter)) - } else { - basic.showLeds(` - . . . . . - . . . . . - . # # # . - . . . . . - . . . . . - `) - music.playTone(262, music.beat(BeatFraction.Whole)) - } - basic.clearScreen() -}) -input.onLogoEvent(TouchButtonEvent.LongPressed, function () { - radio.sendNumber(1) -}) -input.onLogoEvent(TouchButtonEvent.Pressed, function () { - radio.sendNumber(0) -}) -``` \ No newline at end of file diff --git a/docs/projects/v2-pet-hamster.md b/docs/projects/v2-pet-hamster.md deleted file mode 100644 index c6420e1df..000000000 --- a/docs/projects/v2-pet-hamster.md +++ /dev/null @@ -1,131 +0,0 @@ -# Pet Hamster - -## Introduction @unplugged - -![Pet hamster banner message](/static/mb/projects/pet-hamster.png) - -## Cyrus's asleep face - -Cyrus is a very sleepy hamster. In fact, Cyrus is almost always sleeping. - -► From the ``||basic:Basic||`` category, find ``||basic:show icon [ ]||`` and snap it into your ``||basic:on start||`` container. Set it to show the asleep ``-_-`` face. -💡 In the ``show icon`` dropdown menu options, you can hover to see what each design is called! - -```blocks -basic.showIcon(IconNames.Asleep) -``` - -## Giggly Cyrus - -Pressing Cyrus's logo tickles them! - -► From ``||input:Input||``, find the ``||input:on logo [pressed]||`` container and drag it into your workspace. -► Go to ``||basic:Basic||`` and grab **another** ``||basic:show icon [ ]||``. Snap it into your **empty** ``||input:on logo [pressed]||`` container. Set the icon (Cyrus's face) to happy ``:)``. - -```blocks -input.onLogoEvent(TouchButtonEvent.Pressed, function () { - basic.showIcon(IconNames.Happy) -}) -``` - -## Tickle sound - -► From the ``||music:Music||`` category, get a ``||music:play sound [giggle] until done||`` and add it to the **bottom** of your ``||input:on logo [pressed]||`` container. - -```blocks -input.onLogoEvent(TouchButtonEvent.Pressed, function () { - basic.showIcon(IconNames.Happy) - // @highlight - soundExpression.giggle.playUntilDone() -}) -``` - -## Dizzy Cyrus - -Whenever Cyrus is shaken, they get sad 🙁 - -► From ``||input:Input||``, find ``||input:on [shake]||`` and drag it into your workspace. -► From the ``||basic:Basic||`` category, grab ``||basic:show icon [ ]||`` and snap it into your **new** ``||input:on [shake]||`` container. Set the icon (Cyrus's face) to sad ``:(``. - -```blocks -input.onGesture(Gesture.Shake, function () { - basic.showIcon(IconNames.Sad) -}) -``` - -## Dizzy sound - -► From the ``||music:Music||`` category, find the ``||music:play sound [giggle] until done||`` block and add it to the **bottom** of your ``||input:on [shake]||`` container. -► Click on the **dropdown** and set it so Cyrus plays a ``||music:sad||`` sound until done. - -```blocks -input.onGesture(Gesture.Shake, function () { - basic.showIcon(IconNames.Sad) - // @highlight - soundExpression.sad.playUntilDone() -}) -``` - -## Cyrus's default face pt. 1 - -Let's ensure that Cyrus will always go back to sleep after being shaken or tickled. - -► Right click the ``||basic:show icon[-_-]||`` block in your workspace (inside the ``||basic:on start||`` container) and choose **Duplicate**. -► Snap your copied block in at the **very bottom** of your ``||input:on [shake]||`` container. - -```blocks -input.onGesture(Gesture.Shake, function () { - basic.showIcon(IconNames.Sad) - soundExpression.sad.playUntilDone() - // @highlight - basic.showIcon(IconNames.Asleep) -}) -input.onLogoEvent(TouchButtonEvent.Pressed, function () { - basic.showIcon(IconNames.Happy) - soundExpression.giggle.playUntilDone() -}) -basic.showIcon(IconNames.Asleep) -``` - -## Cyrus's default face pt. 2 - -► Duplicate the ``||basic:show icon[-_-]||`` block again and this time snap it in at the **very bottom** of your ``||input:on logo [pressed]||`` container. - -```blocks -input.onGesture(Gesture.Shake, function () { - basic.showIcon(IconNames.Sad) - soundExpression.sad.playUntilDone() - basic.showIcon(IconNames.Asleep) -}) -input.onLogoEvent(TouchButtonEvent.Pressed, function () { - basic.showIcon(IconNames.Happy) - soundExpression.giggle.playUntilDone() - // @highlight - basic.showIcon(IconNames.Asleep) -}) -basic.showIcon(IconNames.Asleep) -``` - -## Testing in the simulator - -Check out the simulator and make sure your speakers are on 🔊 - -Play with Cyrus to see how they react 🐹 -**Click on the SHAKE button** to shake Cyrus. -**Touch the gold logo at the top** to tickle Cyrus. - -If you have a new @boardname@ (the one with the **shiny gold** logo at the top), download this code and try it out! - -```blocks -input.onGesture(Gesture.Shake, function () { - basic.showIcon(IconNames.Sad) - soundExpression.sad.playUntilDone() - basic.showIcon(IconNames.Asleep) -}) -input.onLogoEvent(TouchButtonEvent.Pressed, function () { - basic.showIcon(IconNames.Happy) - soundExpression.giggle.playUntilDone() - basic.showIcon(IconNames.Asleep) -}) -basic.showIcon(IconNames.Asleep) -``` \ No newline at end of file diff --git a/docs/reference/basic/show-leds.md b/docs/reference/basic/show-leds.md index 7125078bd..55dd021fa 100644 --- a/docs/reference/basic/show-leds.md +++ b/docs/reference/basic/show-leds.md @@ -49,5 +49,4 @@ on and `.` means an LED that is turned off. ## See also -[plot leds](/reference/basic/plot-leds), [show animation](/reference/basic/show-animation) - +[show icon](/reference/basic/show-icon) diff --git a/docs/reference/basic/show-number.md b/docs/reference/basic/show-number.md index 51806f037..5bfea4cf5 100644 --- a/docs/reference/basic/show-number.md +++ b/docs/reference/basic/show-number.md @@ -43,10 +43,9 @@ If `value` is `NaN` (not a number), `?` is displayed. ## Other show functions -* Use [show string](/reference/basic/show-string) to show a [String](/types/string) with letters on the screen. -* Use [show animation](/reference/basic/show-animation) to show a group of pictures on the screen, one after another. +Use [show string](/reference/basic/show-string) to show a [String](/types/string) with letters on the screen. ## See also -[show string](/reference/basic/show-string), [show animation](/reference/basic/show-animation), [Number](/types/number), [math](/blocks/math) +[show string](/reference/basic/show-string), [Number](/types/number), [math](/blocks/math) diff --git a/docs/reference/basic/show-string.md b/docs/reference/basic/show-string.md index 781363120..6674cd95f 100644 --- a/docs/reference/basic/show-string.md +++ b/docs/reference/basic/show-string.md @@ -28,10 +28,8 @@ basic.showString(s) ## Other show functions -* Use [show number](/reference/basic/show-number) to show a number on the [LED screen](/device/screen). -* Use [show animation](/reference/basic/show-animation) to show a group of pictures on the screen, one after another. +Use [show number](/reference/basic/show-number) to show a number on the [LED screen](/device/screen). ## See also -[String](/types/string), [show number](/reference/basic/show-number), [show animation](/reference/basic/show-animation) - +[String](/types/string), [show number](/reference/basic/show-number) diff --git a/docs/reference/game/clear.md b/docs/reference/game/clear.md index 8a14561ad..ff286f146 100644 --- a/docs/reference/game/clear.md +++ b/docs/reference/game/clear.md @@ -35,5 +35,5 @@ input.onButtonEvent(Button.A, input.buttonEventValue(ButtonEvent.Down), () => { ## See also -[Image](/reference/images/image), [show animation](/reference/basic/show-animation), [show image](/reference/images/show-image), [scroll image](/reference/images/scroll-image), [create image](/reference/images/create-image) +[Image](/reference/images/image), [show image](/reference/images/show-image), [scroll image](/reference/images/scroll-image), [create image](/reference/images/create-image) diff --git a/docs/reference/images/create-big-image.md b/docs/reference/images/create-big-image.md index 8a6a791d9..a64f91107 100644 --- a/docs/reference/images/create-big-image.md +++ b/docs/reference/images/create-big-image.md @@ -49,4 +49,4 @@ input.onButtonEvent(Button.B, input.buttonEventClick(), () => { [image](/reference/images/image), [create image](/reference/images/create-image), [show image](/reference/images/show-image), -[scroll image](/reference/images/scroll-image), [show animation](/reference/basic/show-animation) +[scroll image](/reference/images/scroll-image) \ No newline at end of file diff --git a/docs/reference/images/create-image.md b/docs/reference/images/create-image.md index 5fe8cb130..ce693600b 100644 --- a/docs/reference/images/create-image.md +++ b/docs/reference/images/create-image.md @@ -32,7 +32,7 @@ input.onButtonEvent(Button.A, input.buttonEventClick(), () => { # . # . # . . # . . . . # . . - `).showImage(0); + `).showImage(0) }); input.onButtonEvent(Button.B, input.buttonEventClick(), () => { images.createImage(` @@ -41,8 +41,8 @@ input.onButtonEvent(Button.B, input.buttonEventClick(), () => { # . # . # . # # # . . . # . . - `).showImage(0); -}); + `).showImage(0) +}) ``` ## See also @@ -50,5 +50,4 @@ input.onButtonEvent(Button.B, input.buttonEventClick(), () => { [image](/reference/images/image), [create big image](/reference/images/create-big-image), [show image](/reference/images/show-image), -[scroll image](/reference/images/scroll-image), [show animation](/reference/basic/show-animation) - +[scroll image](/reference/images/scroll-image) diff --git a/docs/reference/images/image.md b/docs/reference/images/image.md index d62818697..dd9bd8e03 100644 --- a/docs/reference/images/image.md +++ b/docs/reference/images/image.md @@ -34,9 +34,6 @@ To create an image that you can later modify, see the [create image](/reference/ 4. Make an image on the **create image** block by clicking on the squares. -You should see code similar to this: - -![](/static/mb/blocks/image-0.png) ## Image functions diff --git a/docs/reference/images/plot-frame.md b/docs/reference/images/plot-frame.md index 0db48dcb1..9ea14c085 100644 --- a/docs/reference/images/plot-frame.md +++ b/docs/reference/images/plot-frame.md @@ -33,5 +33,5 @@ img.plotFrame(1) ## See also -[create image](/reference/images/create-image), [show animation](/reference/basic/show-animation), [image](/reference/images/image), [show image](/reference/images/show-image), [scroll image](/reference/images/scroll-image) +[create image](/reference/images/create-image), [image](/reference/images/image), [show image](/reference/images/show-image), [scroll image](/reference/images/scroll-image) diff --git a/docs/reference/images/plot-image.md b/docs/reference/images/plot-image.md index df87bc650..ef13335f6 100644 --- a/docs/reference/images/plot-image.md +++ b/docs/reference/images/plot-image.md @@ -33,5 +33,5 @@ img.plotImage(0) ## See also -[create image](/reference/images/create-image), [show animation](/reference/basic/show-animation), [image](/reference/images/image), [show image](/reference/images/show-image), [scroll image](/reference/images/scroll-image) +[create image](/reference/images/create-image), [image](/reference/images/image), [show image](/reference/images/show-image), [scroll image](/reference/images/scroll-image) diff --git a/docs/reference/images/scroll-image.md b/docs/reference/images/scroll-image.md index 7821ec2e6..0480727b5 100644 --- a/docs/reference/images/scroll-image.md +++ b/docs/reference/images/scroll-image.md @@ -46,5 +46,4 @@ basic.forever(() => { ## See also -[show image](/reference/images/show-image), [image](/reference/images/image), [create image](/reference/images/create-image), [show animation](/reference/basic/show-animation) - +[show image](/reference/images/show-image), [image](/reference/images/image), [create image](/reference/images/create-image) diff --git a/docs/reference/images/show-frame.md b/docs/reference/images/show-frame.md index d0e72154f..d394dae5b 100644 --- a/docs/reference/images/show-frame.md +++ b/docs/reference/images/show-frame.md @@ -33,5 +33,5 @@ img.showFrame(1) ## See also -[create image](/reference/images/create-image), [show animation](/reference/basic/show-animation), [image](/reference/images/image), [show image](/reference/images/show-image), [scroll image](/reference/images/scroll-image) +[create image](/reference/images/create-image), [image](/reference/images/image), [show image](/reference/images/show-image), [scroll image](/reference/images/scroll-image) diff --git a/docs/reference/images/show-image.md b/docs/reference/images/show-image.md index a44ba0dc7..87cb2595f 100644 --- a/docs/reference/images/show-image.md +++ b/docs/reference/images/show-image.md @@ -44,4 +44,4 @@ input.onButtonEvent(Button.B, input.buttonEventClick(), () => { [image](/reference/images/image), [create image](/reference/images/create-image), [create big image](/reference/images/create-big-image), -[scroll image](/reference/images/scroll-image), [show animation](/reference/basic/show-animation) +[scroll image](/reference/images/scroll-image) diff --git a/docs/reference/images/width.md b/docs/reference/images/width.md index e81f2e1ea..38d88a3cc 100644 --- a/docs/reference/images/width.md +++ b/docs/reference/images/width.md @@ -52,5 +52,4 @@ for (let i = 0; i < img2.width() / 5; i++) { ## See also -[show image](/reference/images/show-image), [image](/reference/images/image), [create image](/reference/images/create-image), [scroll image](/reference/images/scroll-image), [show animation](/reference/basic/show-animation) - +[show image](/reference/images/show-image), [image](/reference/images/image), [create image](/reference/images/create-image), [scroll image](/reference/images/scroll-image) diff --git a/docs/reference/input.md b/docs/reference/input.md index a412e8742..ea8adb875 100644 --- a/docs/reference/input.md +++ b/docs/reference/input.md @@ -5,7 +5,7 @@ Events and data from sensors ```cards input.onButtonEvent(Button.A, input.buttonEventClick(), function () {}) input.onGesture(Gesture.Shake, function () {}) -input.onPinEvent(TouchPin.P0, input.buttonEventDown(), function() {}) +input.onPinTouchEvent(TouchPin.P0, input.buttonEventDown(), function() {}) input.buttonIsPressed(Button.A) input.pinIsPressed(TouchPin.P0) input.isGesture(Gesture.Shake) @@ -23,7 +23,7 @@ input.setAccelerometerRange(AcceleratorRange.OneG) ## See also [On Button Event](/reference/input/on-button-event), [onGesture](/reference/input/on-gesture), -[On Pin Event](/reference/input/on-pin-event), +[On Pin Touch Event](/reference/input/on-pin-event), [buttonIsPressed](/reference/input/button-is-pressed), [pinIsPressed](/reference/input/pin-is-pressed), [is gesture](/reference/input/is-gesture), [compassHeading](/reference/input/compass-heading), [temperature](/reference/input/temperature), diff --git a/docs/reference/music.md b/docs/reference/music.md index 4a223b7e8..0982e9423 100644 --- a/docs/reference/music.md +++ b/docs/reference/music.md @@ -29,3 +29,6 @@ music.volume() [create sound effect](/reference/music/create-sound-effect), [built-in sound effect](/reference/music/builtin-sound-effect) +```package +v3 +``` \ No newline at end of file diff --git a/docs/reference/music/string-playable.md b/docs/reference/music/string-playable.md new file mode 100644 index 000000000..558dfeab1 --- /dev/null +++ b/docs/reference/music/string-playable.md @@ -0,0 +1,40 @@ +# string Playable + +Created a short melody of notes composed in a string. + +```sig +music.stringPlayable("D F E A E A C B ", 120) +``` + +The **melody** is short series of notes composed in a string. The melody is played at a rate set by the **tempo** value you give. The melody string contains a sequence of notes formatted like this: + +``"E B C5 A B G A F "`` + +The melody is shown in the ``||music:melody||`` block as note symbols which also appear in the Melody Editor. + +```block +music.stringPlayable("E F G F E G B C5 ", 120) +``` + +The melodies are most often created in the Melody Editor from the block so that valid notes are chosen and the correct melody length is set. + +## Parameters + +* **melody**: a [string](/types/string) which contains the notes of the melody. +* **tempo**: a [number](/types/number) which is the rate to play the melody at in beats per minute. + +## Returns + +* a [playable](/types/playable) object that contains the **melody** and **tempo**. + +## Example + +Play the ``Mystery`` melody continuously. + +```blocks +music.play(music.stringPlayable("E F G F E G B C5 ", 120), music.PlaybackMode.LoopingInBackground) +``` + +## See also + +[tone playable](/reference/music/tone-playable) \ No newline at end of file diff --git a/docs/reference/music/tone-playable.md b/docs/reference/music/tone-playable.md new file mode 100644 index 000000000..cf3742abc --- /dev/null +++ b/docs/reference/music/tone-playable.md @@ -0,0 +1,29 @@ +# tone Playable + +Create a musical tone that will play for some amount of time. + +```sig +music.tonePlayable(262, music.beat(BeatFraction.Whole)) +``` + +## Parameters + +* **note**: is the note frequency as a [number](/types/number) of [Hertz](https://wikipedia.org/wiki/Hertz) (how high or low the tone is, also known as _pitch_). If **note** is less or equal to zero, no sound is played. +* **duration**: is the [number](/types/number) of milliseconds (one-thousandth of a second) that the tone lasts for. If **duration** is negative or zero, the sound will play continuously. + +## Returns + +* a [playable](/types/playable) object that contains the tone. + +## Example + +Store the musical note 'C' in the variable `note` and play that note for 1000 milliseconds (one second). + +```blocks +let note = music.noteFrequency(Note.C); +music.play(music.tonePlayable(note, music.beat(BeatFraction.Whole)), music.PlaybackMode.UntilDone) +``` + +## See also + +[string playable](/reference/music/string-playable) \ No newline at end of file diff --git a/docs/reference/pins/analog-pitch.md b/docs/reference/pins/analog-pitch.md index 7c201714e..0155debdd 100644 --- a/docs/reference/pins/analog-pitch.md +++ b/docs/reference/pins/analog-pitch.md @@ -1,24 +1,27 @@ # Analog Pitch -Emits a Pulse With Modulation (PWM) signal to the pin ``P0``. -Use [analog set pitch pin](/reference/pins/analog-set-pitch-pin) to set the current pitch pin. +Sends a pulse-width modulation (PWM) signal to the pin ``P0``. ```sig pins.analogPitch(440, 300) ``` +The PWM signal is sent to the current pitch pin. Use [analog set pitch pin](/reference/pins/analog-set-pitch-pin) to first set the current pitch pin. + ## Parameters -* `frequency` : [Number](/types/number) -* `ms`: [Number](/types/number) +* **frequency**: a [number](/types/number) which is the frequency of the PWM signal at the pitch pin. +* **ms**: a [number](/types/number) in milliseconds that is the duration of the signal at the pitch pin. ## Example +Set the pitch pin to `P1` and send a 440 Hz tone for 1 second. + ```blocks -pins.analogSetPitchPin(AnalogPin.P0); +pins.analogSetPitchPin(AnalogPin.P0) let frequency1 = 440 let duration = 1000 -pins.analogSetPitchPin(AnalogPin.P1); +pins.analogSetPitchPin(AnalogPin.P1) pins.analogPitch(frequency1, duration) ``` diff --git a/docs/reference/pins/analog-read-pin.md b/docs/reference/pins/analog-read-pin.md index 21278feee..f9911e47a 100644 --- a/docs/reference/pins/analog-read-pin.md +++ b/docs/reference/pins/analog-read-pin.md @@ -9,21 +9,23 @@ pins.analogReadPin(AnalogPin.P0) ## Parameters -* ``name`` is a [string](/types/string) with the name of the pin - you say (`P0` through `P4`, or `P10`) +* **name**: is a [string](/types/string) with the name of the pin +you say (`P0` through `P4`, or `P10`). ## Returns * a [number](/types/number) from `0` through `1023` +## Example + This program reads pin `P1` and shows the number on the LED screen. ```blocks -basic.forever(() => { +basic.forever(function() { let value = pins.analogReadPin(AnalogPin.P1) basic.showNumber(value) -}); +}) ``` ### ~hint diff --git a/docs/reference/pins/analog-set-period.md b/docs/reference/pins/analog-set-period.md index e7bb4e84f..c2a3e1596 100644 --- a/docs/reference/pins/analog-set-period.md +++ b/docs/reference/pins/analog-set-period.md @@ -1,6 +1,6 @@ # Analog Set Period -Configure the period of Pulse Width Modulation (PWM) on the specified +Configure the period of pulse-width modulation (PWM) on the specified analog [pin](/device/pins). Before you call this function, you should set the specified pin as analog. @@ -10,8 +10,10 @@ pins.analogSetPeriod(AnalogPin.P0, 20000) ## Parameters -* ``name``: a [string](/types/string) that specifies the pin to configure (`P0` through `P4`, or `P10`) -* ``micros``: a [number](/types/number) that specifies the analog period in microseconds. +* **name**: a [string](/types/string) that specifies the pin to configure (`P0` through `P4`, or `P10`) +* **micros**: a [number](/types/number) that specifies the analog period in microseconds. + +## Example The following code first sets `P0` to analog with **analog write pin**, and then sets the PWM period of `P0` to 20,000 microseconds. diff --git a/docs/reference/pins/analog-set-pitch-pin.md b/docs/reference/pins/analog-set-pitch-pin.md index 8bc6cd4fc..356421430 100644 --- a/docs/reference/pins/analog-set-pitch-pin.md +++ b/docs/reference/pins/analog-set-pitch-pin.md @@ -12,6 +12,8 @@ pins.analogSetPitchPin(AnalogPin.P0) ## Example +Set the pitch pin to `P0` and send a 440 Hz tone for 1 second. + ```blocks pins.analogSetPitchPin(AnalogPin.P0) let frequency = 440 @@ -26,5 +28,8 @@ pins.analogPitch(frequency, duration) ## See also -[@boardname@ pins](/device/pins), [analog set period](/reference/pins/analog-set-period), [analog pitch](/reference/pins/analog-pitch) +[@boardname@ pins](/device/pins), +[analog set period](/reference/pins/analog-set-period), +[analog pitch](/reference/pins/analog-pitch), +[set audio pin](/reference/pins/set-audio-pin) diff --git a/docs/reference/pins/i2c-read-buffer.md b/docs/reference/pins/i2c-read-buffer.md index ccbddfcb0..d061b2ab3 100644 --- a/docs/reference/pins/i2c-read-buffer.md +++ b/docs/reference/pins/i2c-read-buffer.md @@ -10,7 +10,9 @@ A device connected to the I2C pins on the @boardname@ at the address is selected ### ~ hint -**Simulator**: This function needs real hardware to work with. It's not supported in the simulator. +#### Simulator + +This function needs real hardware to work with. It's not supported in the simulator. ### ~ diff --git a/docs/reference/pins/i2c-read-number.md b/docs/reference/pins/i2c-read-number.md index d27e5d2b7..9211ec738 100644 --- a/docs/reference/pins/i2c-read-number.md +++ b/docs/reference/pins/i2c-read-number.md @@ -8,7 +8,9 @@ pins.i2cReadNumber(0, NumberFormat.Int8LE, false); ### ~ hint -**Simulator**: This function needs real hardware to work with. It's not supported in the simulator. +#### Simulator + +This function needs real hardware to work with. It's not supported in the simulator. ### ~ diff --git a/docs/reference/pins/i2c-write-buffer.md b/docs/reference/pins/i2c-write-buffer.md index 58e66d7ed..aea732ab9 100644 --- a/docs/reference/pins/i2c-write-buffer.md +++ b/docs/reference/pins/i2c-write-buffer.md @@ -10,7 +10,9 @@ A device connected to the I2C pins on the @boardname@ at the address is selected ### ~ hint -**Simulator**: This function needs real hardware to work with. It's not supported in the simulator. +#### Simulator + +This function needs real hardware to work with. It's not supported in the simulator. ### ~ diff --git a/docs/reference/pins/i2c-write-number.md b/docs/reference/pins/i2c-write-number.md index b630d9ee7..879ad59f9 100644 --- a/docs/reference/pins/i2c-write-number.md +++ b/docs/reference/pins/i2c-write-number.md @@ -8,7 +8,9 @@ pins.i2cWriteNumber(0, 0, NumberFormat.Int8LE, true); ### ~ hint -**Simulator**: This function needs real hardware to work with. It's not supported in the simulator. +#### Simulator + +This function needs real hardware to work with. It's not supported in the simulator. ### ~ diff --git a/docs/reference/pins/on-pulsed.md b/docs/reference/pins/on-pulsed.md index 4ec62f90b..ed652f917 100644 --- a/docs/reference/pins/on-pulsed.md +++ b/docs/reference/pins/on-pulsed.md @@ -8,7 +8,9 @@ pins.onPulsed(DigitalPin.P0, PulseValue.High, () => { }); ### ~ hint -**Simulator**: This function needs real hardware to work with. It's not supported in the simulator. +#### Simulator + +This function needs real hardware to work with. It's not supported in the simulator. ### ~ diff --git a/docs/reference/pins/pulse-duration.md b/docs/reference/pins/pulse-duration.md index a03e64cdf..d9d3e2f09 100644 --- a/docs/reference/pins/pulse-duration.md +++ b/docs/reference/pins/pulse-duration.md @@ -10,7 +10,9 @@ A pin pulse is detected in the [onPulsed](/reference/pins/on-pulsed) event. You ### ~ hint -**Simulator**: This function needs real hardware to work with. It's not supported in the simulator. +#### Simulator + +This function needs real hardware to work with. It's not supported in the simulator. ### ~ diff --git a/docs/reference/pins/pulse-in.md b/docs/reference/pins/pulse-in.md index 4b580870e..00b5c7516 100644 --- a/docs/reference/pins/pulse-in.md +++ b/docs/reference/pins/pulse-in.md @@ -15,7 +15,9 @@ Please read the [page about pins](/device/pins) carefully. ### ~ hint -**Simulator**: This function needs real hardware to work with. It's not supported in the simulator. +#### Simulator + +This function needs real hardware to work with. It's not supported in the simulator. ### ~ diff --git a/docs/reference/pins/set-audio-pin-enabled.md b/docs/reference/pins/set-audio-pin-enabled.md new file mode 100644 index 000000000..8d403c902 --- /dev/null +++ b/docs/reference/pins/set-audio-pin-enabled.md @@ -0,0 +1,38 @@ +# set Audio Pin Enabled + +Enable a pin on the edge connector to output audio. + +```sig +pins.setAudioPinEnabled(false) +``` + +You can enable the @boardname@ to output audio to a pin on the edge connector. + +### ~ hint + +#### Calliope mini speaker + +With the [Calliope mini](/device/v2) hardware, the built-in speaker will play (mirror) the same tones and music sent to the audio pin. + +### ~ + +## Parameters + +* **enabled**: audio is output to a pin is enabled if `true`, disabled if `false`. + +## Example + +Enable audio output to a pin on the edge connector and play a tone for the "A4" note at pin **P0** for 1 second. + +```blocks +pins.setAudioPinEnabled(false) +pins.setAudioPin(AnalogPin.P0) +let frequency = 440 +let duration = 1000 +pins.analogPitch(frequency, duration) +``` + +## See also + +[@boardname@ pins](/device/pins), [set audio pin](/reference/pins/set-audio-pin), +[analog set pitch pin](/reference/pins/analog-set-pitch-pin) diff --git a/docs/reference/pins/set-audio-pin.md b/docs/reference/pins/set-audio-pin.md index 543681abc..f815f3597 100644 --- a/docs/reference/pins/set-audio-pin.md +++ b/docs/reference/pins/set-audio-pin.md @@ -31,4 +31,5 @@ pins.analogPitch(frequency, duration) ## See also -[@boardname@ pins](/device/pins), [analog set pitch pin](/reference/pins/analog-set-pitch-pin) +[@boardname@ pins](/device/pins), [set audio pin enabled](/reference/pins/set-audio-pin-enabled), +[analog set pitch pin](/reference/pins/analog-set-pitch-pin) diff --git a/docs/reference/pins/set-events.md b/docs/reference/pins/set-events.md index 3eac8aba8..5396f6401 100644 --- a/docs/reference/pins/set-events.md +++ b/docs/reference/pins/set-events.md @@ -8,7 +8,9 @@ pins.setEvents(DigitalPin.P0, PinEventType.Edge); ### ~ hint -**Simulator**: This function needs real hardware to work with. It's not supported in the simulator. +#### Simulator + +This function needs real hardware to work with. It's not supported in the simulator. ### ~ diff --git a/docs/reference/pins/spi-format.md b/docs/reference/pins/spi-format.md index 9a4e8f76b..9104b81ef 100644 --- a/docs/reference/pins/spi-format.md +++ b/docs/reference/pins/spi-format.md @@ -10,7 +10,9 @@ The data sent over a SPI connection has a number of _bits_ to represent each val ### ~ hint -**Simulator**: This function needs real hardware to work with. It's not supported in the simulator. +#### Simulator + +This function needs real hardware to work with. It's not supported in the simulator. ### ~ diff --git a/docs/reference/pins/spi-frequency.md b/docs/reference/pins/spi-frequency.md index c65f7584a..26664f7f6 100644 --- a/docs/reference/pins/spi-frequency.md +++ b/docs/reference/pins/spi-frequency.md @@ -10,7 +10,9 @@ The @boardname@ sets the rate of data transfer and control timing for a SPI conn ### ~ hint -**Simulator**: This function needs real hardware to work with. It's not supported in the simulator. +#### Simulator + +This function needs real hardware to work with. It's not supported in the simulator. ### ~ diff --git a/docs/reference/pins/spi-pins.md b/docs/reference/pins/spi-pins.md index 1d1fe1119..1e68ec363 100644 --- a/docs/reference/pins/spi-pins.md +++ b/docs/reference/pins/spi-pins.md @@ -10,7 +10,9 @@ To configure the @boardname@ to write to an external device using a SPI connecti ### ~ hint -**Simulator**: This function needs real hardware to work with. It's not supported in the simulator. +#### Simulator + +This function needs real hardware to work with. It's not supported in the simulator. ### ~ diff --git a/docs/reference/pins/spi-write.md b/docs/reference/pins/spi-write.md index 0d4c7cd19..958e6240a 100644 --- a/docs/reference/pins/spi-write.md +++ b/docs/reference/pins/spi-write.md @@ -10,7 +10,9 @@ Data values are written to a SPI slave device connected to the @boardname@ by th ### ~ hint -**Simulator**: This function needs real hardware to work with. It's not supported in the simulator. +#### Simulator + +This function needs real hardware to work with. It's not supported in the simulator. ### ~ diff --git a/docs/science-experiments.md b/docs/science-experiments.md deleted file mode 100644 index 3cfdd2060..000000000 --- a/docs/science-experiments.md +++ /dev/null @@ -1,58 +0,0 @@ -# Science Experiments - -* [Watch Playlist on Youtube](https://www.youtube.com/playlist?list=PLMMBk9hE-SepXDy_290SeRmEpGA2u1pwW) - -## Videos - -```codecard -[ - { - "name": "Data Collection", - "description": "Collect, view, and analyze the data from your experiments.", - "youTubeId": "tZy9Ev21B4c", - "imageUrl": "/static/mb/science-experiments/data-collection.jpg" - }, - { - "name": "Population Trait Counter", - "description": "Observe population traits by collecting survey data from people, analyze and track the genetic traits.", - "youTubeId": "NNZEMiJHY2o", - "imageUrl": "/static/mb/science-experiments/population-trait.jpg" - }, - { - "name": "Temperature Sensor", - "description": "Chart temperature data in and out of direct sunlight using a sun shield, see if using a windshield sun shade in your car really makes it cooler.", - "youTubeId": "pHDYsy6xyE4", - "imageUrl": "/static/mb/science-experiments/temperature-sensor.jpg" - }, - { - "name": "Soil Moisture Sensor", - "description": "Watch this video to find out how you can create a soil moisture sensor to measure the health of your plants!", - "youTubeId": "n0WRQf11Pzo", - "imageUrl": "/static/mb/science-experiments/soil-moisture.jpg" - }, - { - "name": "EMG Muscle Sensor", - "description": "Monitor the movement of your muscles and measure the signals to them", - "youTubeId": "vxlPQZIwYRc", - "imageUrl": "/static/mb/science-experiments/emg-muscle-sensor.jpg" - }, - { - "name": "Egg Drop", - "description": "Can the egg survive a drop, test the drop force on an egg to find out when it might crack", - "youTubeId": "tnDJFdC3Nd4", - "imageUrl": "/static/mb/science-experiments/egg-drop.jpg" - }, - { - "name": "Battery Tester", - "description": "See if your batteries still have their voltage with this battery tester", - "youTubeId": "gdlc34nhjK4", - "imageUrl": "/static/mb/science-experiments/battery-tester.jpg" - }, - { - "name": "Rocket Acceleration", - "description": "Have a blast building, launching, and tracking your own rocket!", - "youTubeId": "m9ntqxh8FvQ", - "imageUrl": "/static/mb/science-experiments/rocket-acceleration.jpg" - } -] -``` \ No newline at end of file diff --git a/docs/static/coding-cards/balance-card.jpg b/docs/static/coding-cards/balance-card.jpg deleted file mode 100644 index 6b23939cb..000000000 Binary files a/docs/static/coding-cards/balance-card.jpg and /dev/null differ diff --git a/docs/static/coding-cards/dice-card.jpg b/docs/static/coding-cards/dice-card.jpg deleted file mode 100644 index 94fac1a09..000000000 Binary files a/docs/static/coding-cards/dice-card.jpg and /dev/null differ diff --git a/docs/static/coding-cards/games-nervous.jpg b/docs/static/coding-cards/games-nervous.jpg deleted file mode 100644 index 772ddd245..000000000 Binary files a/docs/static/coding-cards/games-nervous.jpg and /dev/null differ diff --git a/docs/static/coding-cards/games-reaction.jpg b/docs/static/coding-cards/games-reaction.jpg deleted file mode 100644 index a2e50f689..000000000 Binary files a/docs/static/coding-cards/games-reaction.jpg and /dev/null differ diff --git a/docs/static/coding-cards/games-shake.jpg b/docs/static/coding-cards/games-shake.jpg deleted file mode 100644 index 2f4a51bf5..000000000 Binary files a/docs/static/coding-cards/games-shake.jpg and /dev/null differ diff --git a/docs/static/coding-cards/games-sprite.jpg b/docs/static/coding-cards/games-sprite.jpg deleted file mode 100644 index caa6533ed..000000000 Binary files a/docs/static/coding-cards/games-sprite.jpg and /dev/null differ diff --git a/docs/static/coding-cards/games-zen.jpg b/docs/static/coding-cards/games-zen.jpg deleted file mode 100644 index 9677eb375..000000000 Binary files a/docs/static/coding-cards/games-zen.jpg and /dev/null differ diff --git a/docs/static/coding-cards/trundlewheel-card.jpg b/docs/static/coding-cards/trundlewheel-card.jpg deleted file mode 100644 index c3ae03f55..000000000 Binary files a/docs/static/coding-cards/trundlewheel-card.jpg and /dev/null differ diff --git a/docs/static/configurations/chrome-version.png b/docs/static/configurations/chrome-version.png deleted file mode 100644 index b7a4db678..000000000 Binary files a/docs/static/configurations/chrome-version.png and /dev/null differ diff --git a/docs/static/configurations/edge-version.png b/docs/static/configurations/edge-version.png deleted file mode 100644 index f9c9095ad..000000000 Binary files a/docs/static/configurations/edge-version.png and /dev/null differ diff --git a/docs/static/configurations/firefox-version.png b/docs/static/configurations/firefox-version.png deleted file mode 100644 index d9b5684c9..000000000 Binary files a/docs/static/configurations/firefox-version.png and /dev/null differ diff --git a/docs/static/configurations/ie-version.png b/docs/static/configurations/ie-version.png deleted file mode 100644 index 3fbc6e7c3..000000000 Binary files a/docs/static/configurations/ie-version.png and /dev/null differ diff --git a/docs/static/configurations/osx-version.png b/docs/static/configurations/osx-version.png deleted file mode 100644 index 9457d7e48..000000000 Binary files a/docs/static/configurations/osx-version.png and /dev/null differ diff --git a/docs/static/configurations/safari-version.png b/docs/static/configurations/safari-version.png deleted file mode 100644 index 70d1d8715..000000000 Binary files a/docs/static/configurations/safari-version.png and /dev/null differ diff --git a/docs/static/configurations/windows-version.png b/docs/static/configurations/windows-version.png deleted file mode 100644 index 06847ede7..000000000 Binary files a/docs/static/configurations/windows-version.png and /dev/null differ diff --git a/docs/static/courses/armu-micro-course.png b/docs/static/courses/armu-micro-course.png deleted file mode 100644 index 7056be8e2..000000000 Binary files a/docs/static/courses/armu-micro-course.png and /dev/null differ diff --git a/docs/static/courses/logic-lab.png b/docs/static/courses/logic-lab.png deleted file mode 100644 index 913547b64..000000000 Binary files a/docs/static/courses/logic-lab.png and /dev/null differ diff --git a/docs/static/courses/logic-lab/logic-gates/and-gate.png b/docs/static/courses/logic-lab/logic-gates/and-gate.png deleted file mode 100644 index 21beeee46..000000000 Binary files a/docs/static/courses/logic-lab/logic-gates/and-gate.png and /dev/null differ diff --git a/docs/static/courses/logic-lab/logic-gates/combinatorial1-xor.png b/docs/static/courses/logic-lab/logic-gates/combinatorial1-xor.png deleted file mode 100644 index addd335c5..000000000 Binary files a/docs/static/courses/logic-lab/logic-gates/combinatorial1-xor.png and /dev/null differ diff --git a/docs/static/courses/logic-lab/logic-gates/combinatorial2-xor.png b/docs/static/courses/logic-lab/logic-gates/combinatorial2-xor.png deleted file mode 100644 index 88085c488..000000000 Binary files a/docs/static/courses/logic-lab/logic-gates/combinatorial2-xor.png and /dev/null differ diff --git a/docs/static/courses/logic-lab/logic-gates/full-adder.png b/docs/static/courses/logic-lab/logic-gates/full-adder.png deleted file mode 100644 index c4db02c79..000000000 Binary files a/docs/static/courses/logic-lab/logic-gates/full-adder.png and /dev/null differ diff --git a/docs/static/courses/logic-lab/logic-gates/logic-lab-header.jpg b/docs/static/courses/logic-lab/logic-gates/logic-lab-header.jpg deleted file mode 100644 index bcaafb8c4..000000000 Binary files a/docs/static/courses/logic-lab/logic-gates/logic-lab-header.jpg and /dev/null differ diff --git a/docs/static/courses/logic-lab/logic-gates/not-gate.png b/docs/static/courses/logic-lab/logic-gates/not-gate.png deleted file mode 100644 index f543c51cd..000000000 Binary files a/docs/static/courses/logic-lab/logic-gates/not-gate.png and /dev/null differ diff --git a/docs/static/courses/logic-lab/logic-gates/or-gate.png b/docs/static/courses/logic-lab/logic-gates/or-gate.png deleted file mode 100644 index a19b61032..000000000 Binary files a/docs/static/courses/logic-lab/logic-gates/or-gate.png and /dev/null differ diff --git a/docs/static/courses/logic-lab/logic-gates/xor-gate.png b/docs/static/courses/logic-lab/logic-gates/xor-gate.png deleted file mode 100644 index 3c3cfeb02..000000000 Binary files a/docs/static/courses/logic-lab/logic-gates/xor-gate.png and /dev/null differ diff --git a/docs/static/courses/logic-lab/logic-lab-header.jpg b/docs/static/courses/logic-lab/logic-lab-header.jpg deleted file mode 100644 index f27892b13..000000000 Binary files a/docs/static/courses/logic-lab/logic-lab-header.jpg and /dev/null differ diff --git a/docs/static/courses/logic-lab/pld/and-gate-pins.png b/docs/static/courses/logic-lab/pld/and-gate-pins.png deleted file mode 100644 index a61bc826d..000000000 Binary files a/docs/static/courses/logic-lab/pld/and-gate-pins.png and /dev/null differ diff --git a/docs/static/courses/logic-lab/pld/and-gate-pld.png b/docs/static/courses/logic-lab/pld/and-gate-pld.png deleted file mode 100644 index 0848e799c..000000000 Binary files a/docs/static/courses/logic-lab/pld/and-gate-pld.png and /dev/null differ diff --git a/docs/static/courses/logic-lab/pld/generic-pld.png b/docs/static/courses/logic-lab/pld/generic-pld.png deleted file mode 100644 index 67b1ad0db..000000000 Binary files a/docs/static/courses/logic-lab/pld/generic-pld.png and /dev/null differ diff --git a/docs/static/courses/logic-lab/pld/mbit-pld.png b/docs/static/courses/logic-lab/pld/mbit-pld.png deleted file mode 100644 index 3ecc14b5d..000000000 Binary files a/docs/static/courses/logic-lab/pld/mbit-pld.png and /dev/null differ diff --git a/docs/static/courses/logic-lab/pld/not-and-or-pld.png b/docs/static/courses/logic-lab/pld/not-and-or-pld.png deleted file mode 100644 index d28eb9bad..000000000 Binary files a/docs/static/courses/logic-lab/pld/not-and-or-pld.png and /dev/null differ diff --git a/docs/static/courses/logic-lab/pld/not-and-or.png b/docs/static/courses/logic-lab/pld/not-and-or.png deleted file mode 100644 index abdebb51f..000000000 Binary files a/docs/static/courses/logic-lab/pld/not-and-or.png and /dev/null differ diff --git a/docs/static/courses/logic-lab/pld/not-gate-pins.png b/docs/static/courses/logic-lab/pld/not-gate-pins.png deleted file mode 100644 index 4024124af..000000000 Binary files a/docs/static/courses/logic-lab/pld/not-gate-pins.png and /dev/null differ diff --git a/docs/static/courses/logic-lab/pld/not-gate-pld.png b/docs/static/courses/logic-lab/pld/not-gate-pld.png deleted file mode 100644 index f8c0e9165..000000000 Binary files a/docs/static/courses/logic-lab/pld/not-gate-pld.png and /dev/null differ diff --git a/docs/static/courses/logic-lab/pld/or-gate-pins.png b/docs/static/courses/logic-lab/pld/or-gate-pins.png deleted file mode 100644 index e69cb6035..000000000 Binary files a/docs/static/courses/logic-lab/pld/or-gate-pins.png and /dev/null differ diff --git a/docs/static/courses/logic-lab/pld/or-gate-pld.png b/docs/static/courses/logic-lab/pld/or-gate-pld.png deleted file mode 100644 index 43a182c31..000000000 Binary files a/docs/static/courses/logic-lab/pld/or-gate-pld.png and /dev/null differ diff --git a/docs/static/courses/logic-lab/pld/xor-gate-pld.png b/docs/static/courses/logic-lab/pld/xor-gate-pld.png deleted file mode 100644 index adc5bc1fd..000000000 Binary files a/docs/static/courses/logic-lab/pld/xor-gate-pld.png and /dev/null differ diff --git a/docs/static/courses/logic-lab/pld/xor-mbit.png b/docs/static/courses/logic-lab/pld/xor-mbit.png deleted file mode 100644 index 34b441787..000000000 Binary files a/docs/static/courses/logic-lab/pld/xor-mbit.png and /dev/null differ diff --git a/docs/static/download/selecting-microbit.gif b/docs/static/download/selecting-microbit.gif deleted file mode 100644 index 8b42ea066..000000000 Binary files a/docs/static/download/selecting-microbit.gif and /dev/null differ diff --git a/docs/static/extensions/edit-settings-button.png b/docs/static/extensions/edit-settings-button.png new file mode 100644 index 000000000..fe59f3d86 Binary files /dev/null and b/docs/static/extensions/edit-settings-button.png differ diff --git a/docs/static/extensions/extension-blocks.png b/docs/static/extensions/extension-blocks.png new file mode 100644 index 000000000..c7fedaaf7 Binary files /dev/null and b/docs/static/extensions/extension-blocks.png differ diff --git a/docs/static/extensions/extensions-window.gif b/docs/static/extensions/extensions-window.gif new file mode 100644 index 000000000..e625fb46e Binary files /dev/null and b/docs/static/extensions/extensions-window.gif differ diff --git a/docs/static/extensions/file-explorer.png b/docs/static/extensions/file-explorer.png new file mode 100644 index 000000000..3b3923220 Binary files /dev/null and b/docs/static/extensions/file-explorer.png differ diff --git a/docs/static/extensions/new-extension.png b/docs/static/extensions/new-extension.png new file mode 100644 index 000000000..e4b54d14b Binary files /dev/null and b/docs/static/extensions/new-extension.png differ diff --git a/docs/static/extensions/settings-menu.png b/docs/static/extensions/settings-menu.png new file mode 100644 index 000000000..1d9cdbaae Binary files /dev/null and b/docs/static/extensions/settings-menu.png differ diff --git a/docs/static/extensions/toolbox-category.png b/docs/static/extensions/toolbox-category.png new file mode 100644 index 000000000..b9141393e Binary files /dev/null and b/docs/static/extensions/toolbox-category.png differ diff --git a/docs/static/hero.jpg b/docs/static/hero.jpg deleted file mode 100644 index 5cb727aa8..000000000 Binary files a/docs/static/hero.jpg and /dev/null differ diff --git a/docs/static/hero.png b/docs/static/hero.png deleted file mode 100644 index 84f556ef2..000000000 Binary files a/docs/static/hero.png and /dev/null differ diff --git a/docs/static/libs/audio-recording.png b/docs/static/libs/audio-recording.png deleted file mode 100644 index 6206d7e79..000000000 Binary files a/docs/static/libs/audio-recording.png and /dev/null differ diff --git a/docs/static/libs/radio-broadcast.png b/docs/static/libs/radio-broadcast.png deleted file mode 100644 index d89092d6f..000000000 Binary files a/docs/static/libs/radio-broadcast.png and /dev/null differ diff --git a/docs/static/libs/radio.png b/docs/static/libs/radio.png deleted file mode 100644 index e211d6ebe..000000000 Binary files a/docs/static/libs/radio.png and /dev/null differ diff --git a/docs/static/libs/servo.png b/docs/static/libs/servo.png deleted file mode 100644 index 7ae30013e..000000000 Binary files a/docs/static/libs/servo.png and /dev/null differ diff --git a/docs/static/live-coding/live.jpg b/docs/static/live-coding/live.jpg deleted file mode 100644 index 0e07f77ab..000000000 Binary files a/docs/static/live-coding/live.jpg and /dev/null differ diff --git a/docs/static/live-coding/live.png b/docs/static/live-coding/live.png deleted file mode 100644 index 77c27a79c..000000000 Binary files a/docs/static/live-coding/live.png and /dev/null differ diff --git a/docs/static/live-coding/playlist.png b/docs/static/live-coding/playlist.png deleted file mode 100644 index a0fcafcb0..000000000 Binary files a/docs/static/live-coding/playlist.png and /dev/null differ diff --git a/docs/static/live-coding/showleds.jpg b/docs/static/live-coding/showleds.jpg deleted file mode 100644 index 56e5465e9..000000000 Binary files a/docs/static/live-coding/showleds.jpg and /dev/null differ diff --git a/docs/static/live-coding/showstring.jpg b/docs/static/live-coding/showstring.jpg deleted file mode 100644 index 93845e2f1..000000000 Binary files a/docs/static/live-coding/showstring.jpg and /dev/null differ diff --git a/docs/static/mb/acc.png b/docs/static/mb/acc.png deleted file mode 100644 index 7e4310e5a..000000000 Binary files a/docs/static/mb/acc.png and /dev/null differ diff --git a/docs/static/mb/acc2.png b/docs/static/mb/acc2.png deleted file mode 100644 index 07c687135..000000000 Binary files a/docs/static/mb/acc2.png and /dev/null differ diff --git a/docs/static/mb/analyze1.png b/docs/static/mb/analyze1.png deleted file mode 100644 index 4c5b6ba33..000000000 Binary files a/docs/static/mb/analyze1.png and /dev/null differ diff --git a/docs/static/mb/analyze3.png b/docs/static/mb/analyze3.png deleted file mode 100644 index fac50a401..000000000 Binary files a/docs/static/mb/analyze3.png and /dev/null differ diff --git a/docs/static/mb/behindhardware/accelerometer.jpg b/docs/static/mb/behindhardware/accelerometer.jpg deleted file mode 100644 index ebad68898..000000000 Binary files a/docs/static/mb/behindhardware/accelerometer.jpg and /dev/null differ diff --git a/docs/static/mb/behindhardware/buttons.jpg b/docs/static/mb/behindhardware/buttons.jpg deleted file mode 100644 index 43a5bd7c6..000000000 Binary files a/docs/static/mb/behindhardware/buttons.jpg and /dev/null differ diff --git a/docs/static/mb/behindhardware/leds.jpg b/docs/static/mb/behindhardware/leds.jpg deleted file mode 100644 index e72927e48..000000000 Binary files a/docs/static/mb/behindhardware/leds.jpg and /dev/null differ diff --git a/docs/static/mb/behindhardware/light-sensor.jpg b/docs/static/mb/behindhardware/light-sensor.jpg deleted file mode 100644 index cbe1c11c7..000000000 Binary files a/docs/static/mb/behindhardware/light-sensor.jpg and /dev/null differ diff --git a/docs/static/mb/behindhardware/pin-pressed.jpg b/docs/static/mb/behindhardware/pin-pressed.jpg deleted file mode 100644 index 430c37282..000000000 Binary files a/docs/static/mb/behindhardware/pin-pressed.jpg and /dev/null differ diff --git a/docs/static/mb/behindhardware/radio.jpg b/docs/static/mb/behindhardware/radio.jpg deleted file mode 100644 index 02b076638..000000000 Binary files a/docs/static/mb/behindhardware/radio.jpg and /dev/null differ diff --git a/docs/static/mb/behindhardware/servo.jpg b/docs/static/mb/behindhardware/servo.jpg deleted file mode 100644 index 4610cf170..000000000 Binary files a/docs/static/mb/behindhardware/servo.jpg and /dev/null differ diff --git a/docs/static/mb/behindhardware/speakers.jpg b/docs/static/mb/behindhardware/speakers.jpg deleted file mode 100644 index 90ea3c47d..000000000 Binary files a/docs/static/mb/behindhardware/speakers.jpg and /dev/null differ diff --git a/docs/static/mb/behindhardware/temperature-sensor.jpg b/docs/static/mb/behindhardware/temperature-sensor.jpg deleted file mode 100644 index ad111bae4..000000000 Binary files a/docs/static/mb/behindhardware/temperature-sensor.jpg and /dev/null differ diff --git a/docs/static/mb/blocks/contents-0.png b/docs/static/mb/blocks/contents-0.png deleted file mode 100644 index 5dd3fe48c..000000000 Binary files a/docs/static/mb/blocks/contents-0.png and /dev/null differ diff --git a/docs/static/mb/blocks/image-0.png b/docs/static/mb/blocks/image-0.png deleted file mode 100644 index 53fc0fbb9..000000000 Binary files a/docs/static/mb/blocks/image-0.png and /dev/null differ diff --git a/docs/static/mb/blocks/lessons/graphics-0.png b/docs/static/mb/blocks/lessons/graphics-0.png deleted file mode 100644 index 577c6478b..000000000 Binary files a/docs/static/mb/blocks/lessons/graphics-0.png and /dev/null differ diff --git a/docs/static/mb/blocks/lessons/graphics-4.png b/docs/static/mb/blocks/lessons/graphics-4.png deleted file mode 100644 index 89175a072..000000000 Binary files a/docs/static/mb/blocks/lessons/graphics-4.png and /dev/null differ diff --git a/docs/static/mb/blocks/lessons/loops-0.png b/docs/static/mb/blocks/lessons/loops-0.png deleted file mode 100644 index f2f02da15..000000000 Binary files a/docs/static/mb/blocks/lessons/loops-0.png and /dev/null differ diff --git a/docs/static/mb/blocks/lessons/loops-1.png b/docs/static/mb/blocks/lessons/loops-1.png deleted file mode 100644 index bd4554053..000000000 Binary files a/docs/static/mb/blocks/lessons/loops-1.png and /dev/null differ diff --git a/docs/static/mb/blocks/lessons/loops-2.png b/docs/static/mb/blocks/lessons/loops-2.png deleted file mode 100644 index 8a9fe3ab5..000000000 Binary files a/docs/static/mb/blocks/lessons/loops-2.png and /dev/null differ diff --git a/docs/static/mb/blocks/lessons/loops-3.png b/docs/static/mb/blocks/lessons/loops-3.png deleted file mode 100644 index 0fe89bc07..000000000 Binary files a/docs/static/mb/blocks/lessons/loops-3.png and /dev/null differ diff --git a/docs/static/mb/blocks/lessons/screen-wipe-4.png b/docs/static/mb/blocks/lessons/screen-wipe-4.png deleted file mode 100644 index d46027380..000000000 Binary files a/docs/static/mb/blocks/lessons/screen-wipe-4.png and /dev/null differ diff --git a/docs/static/mb/blocks/lessons/smiley-4.png b/docs/static/mb/blocks/lessons/smiley-4.png deleted file mode 100644 index 81644a430..000000000 Binary files a/docs/static/mb/blocks/lessons/smiley-4.png and /dev/null differ diff --git a/docs/static/mb/blocks/lessons/smiley-6.png b/docs/static/mb/blocks/lessons/smiley-6.png deleted file mode 100644 index c773cc865..000000000 Binary files a/docs/static/mb/blocks/lessons/smiley-6.png and /dev/null differ diff --git a/docs/static/mb/blocks/lessons/variables-0.png b/docs/static/mb/blocks/lessons/variables-0.png deleted file mode 100644 index d6c398bf9..000000000 Binary files a/docs/static/mb/blocks/lessons/variables-0.png and /dev/null differ diff --git a/docs/static/mb/blocks/lessons/variables-1.png b/docs/static/mb/blocks/lessons/variables-1.png deleted file mode 100644 index 2be74cb7e..000000000 Binary files a/docs/static/mb/blocks/lessons/variables-1.png and /dev/null differ diff --git a/docs/static/mb/blocks2js/dragblock.gif b/docs/static/mb/blocks2js/dragblock.gif deleted file mode 100644 index f90f4cc12..000000000 Binary files a/docs/static/mb/blocks2js/dragblock.gif and /dev/null differ diff --git a/docs/static/mb/blocks2js/squiggles.png b/docs/static/mb/blocks2js/squiggles.png deleted file mode 100644 index eeabd3e00..000000000 Binary files a/docs/static/mb/blocks2js/squiggles.png and /dev/null differ diff --git a/docs/static/mb/blocks2js/squigglesmessage.png b/docs/static/mb/blocks2js/squigglesmessage.png deleted file mode 100644 index fd2d3d91a..000000000 Binary files a/docs/static/mb/blocks2js/squigglesmessage.png and /dev/null differ diff --git a/docs/static/mb/blocks2js/toggle.gif b/docs/static/mb/blocks2js/toggle.gif deleted file mode 100644 index 3b5b28416..000000000 Binary files a/docs/static/mb/blocks2js/toggle.gif and /dev/null differ diff --git a/docs/static/mb/chart_title.png b/docs/static/mb/chart_title.png deleted file mode 100644 index 25dba72b1..000000000 Binary files a/docs/static/mb/chart_title.png and /dev/null differ diff --git a/docs/static/mb/crocodile-clips-2.jpg b/docs/static/mb/crocodile-clips-2.jpg deleted file mode 100644 index 633738dd7..000000000 Binary files a/docs/static/mb/crocodile-clips-2.jpg and /dev/null differ diff --git a/docs/static/mb/csv.png b/docs/static/mb/csv.png deleted file mode 100644 index b54464e4b..000000000 Binary files a/docs/static/mb/csv.png and /dev/null differ diff --git a/docs/static/mb/data-0.png b/docs/static/mb/data-0.png deleted file mode 100644 index b47e728cb..000000000 Binary files a/docs/static/mb/data-0.png and /dev/null differ diff --git a/docs/static/mb/data2.png b/docs/static/mb/data2.png deleted file mode 100644 index 32ef1ca56..000000000 Binary files a/docs/static/mb/data2.png and /dev/null differ diff --git a/docs/static/mb/data3.png b/docs/static/mb/data3.png deleted file mode 100644 index c312cf1c2..000000000 Binary files a/docs/static/mb/data3.png and /dev/null differ diff --git a/docs/static/mb/data4.png b/docs/static/mb/data4.png deleted file mode 100644 index e99230034..000000000 Binary files a/docs/static/mb/data4.png and /dev/null differ diff --git a/docs/static/mb/data7.png b/docs/static/mb/data7.png deleted file mode 100644 index c13f8474d..000000000 Binary files a/docs/static/mb/data7.png and /dev/null differ diff --git a/docs/static/mb/device-0.png b/docs/static/mb/device-0.png deleted file mode 100644 index b7c7358bc..000000000 Binary files a/docs/static/mb/device-0.png and /dev/null differ diff --git a/docs/static/mb/device-1.jpg b/docs/static/mb/device-1.jpg deleted file mode 100644 index ae9f8ec6d..000000000 Binary files a/docs/static/mb/device-1.jpg and /dev/null differ diff --git a/docs/static/mb/device-v2.jpg b/docs/static/mb/device-v2.jpg deleted file mode 100644 index 31339c4db..000000000 Binary files a/docs/static/mb/device-v2.jpg and /dev/null differ diff --git a/docs/static/mb/device/details-243.png b/docs/static/mb/device/details-243.png deleted file mode 100644 index 61ed5f035..000000000 Binary files a/docs/static/mb/device/details-243.png and /dev/null differ diff --git a/docs/static/mb/device/pano.jpg b/docs/static/mb/device/pano.jpg deleted file mode 100644 index df4c95a13..000000000 Binary files a/docs/static/mb/device/pano.jpg and /dev/null differ diff --git a/docs/static/mb/device/pins-v1-v2.png b/docs/static/mb/device/pins-v1-v2.png deleted file mode 100644 index aa0ba7aee..000000000 Binary files a/docs/static/mb/device/pins-v1-v2.png and /dev/null differ diff --git a/docs/static/mb/device/usb-thin.jpg b/docs/static/mb/device/usb-thin.jpg deleted file mode 100644 index 0f50774b7..000000000 Binary files a/docs/static/mb/device/usb-thin.jpg and /dev/null differ diff --git a/docs/static/mb/device/usb-windows-edge-2.png b/docs/static/mb/device/usb-windows-edge-2.png deleted file mode 100644 index aad1cae96..000000000 Binary files a/docs/static/mb/device/usb-windows-edge-2.png and /dev/null differ diff --git a/docs/static/mb/device/usb-windows-firefox-2.jpg b/docs/static/mb/device/usb-windows-firefox-2.jpg deleted file mode 100644 index 416e42ed0..000000000 Binary files a/docs/static/mb/device/usb-windows-firefox-2.jpg and /dev/null differ diff --git a/docs/static/mb/device/usb-windows-ie11-2.png b/docs/static/mb/device/usb-windows-ie11-2.png deleted file mode 100644 index d18c8dbe5..000000000 Binary files a/docs/static/mb/device/usb-windows-ie11-2.png and /dev/null differ diff --git a/docs/static/mb/device/usb/connect-usb.jpg b/docs/static/mb/device/usb/connect-usb.jpg deleted file mode 100644 index c29263f4a..000000000 Binary files a/docs/static/mb/device/usb/connect-usb.jpg and /dev/null differ diff --git a/docs/static/mb/device/usb/download-button-menu.jpg b/docs/static/mb/device/usb/download-button-menu.jpg deleted file mode 100644 index 3e83f9d07..000000000 Binary files a/docs/static/mb/device/usb/download-button-menu.jpg and /dev/null differ diff --git a/docs/static/mb/device/usb/download-complete.jpg b/docs/static/mb/device/usb/download-complete.jpg deleted file mode 100644 index c18848154..000000000 Binary files a/docs/static/mb/device/usb/download-complete.jpg and /dev/null differ diff --git a/docs/static/mb/device/usb/pair-dap.jpg b/docs/static/mb/device/usb/pair-dap.jpg deleted file mode 100644 index ba50f8d2d..000000000 Binary files a/docs/static/mb/device/usb/pair-dap.jpg and /dev/null differ diff --git a/docs/static/mb/device/usb/pair-device.jpg b/docs/static/mb/device/usb/pair-device.jpg deleted file mode 100644 index 0676ffe14..000000000 Binary files a/docs/static/mb/device/usb/pair-device.jpg and /dev/null differ diff --git a/docs/static/mb/elements_styles_filters.png b/docs/static/mb/elements_styles_filters.png deleted file mode 100644 index f1ea55d54..000000000 Binary files a/docs/static/mb/elements_styles_filters.png and /dev/null differ diff --git a/docs/static/mb/empty-microbit.png b/docs/static/mb/empty-microbit.png deleted file mode 100644 index 182999032..000000000 Binary files a/docs/static/mb/empty-microbit.png and /dev/null differ diff --git a/docs/static/mb/image-0.png b/docs/static/mb/image-0.png deleted file mode 100644 index 07759140f..000000000 Binary files a/docs/static/mb/image-0.png and /dev/null differ diff --git a/docs/static/mb/js/basicFuns.png b/docs/static/mb/js/basicFuns.png deleted file mode 100644 index c5bc257c8..000000000 Binary files a/docs/static/mb/js/basicFuns.png and /dev/null differ diff --git a/docs/static/mb/js/basicIntell.png b/docs/static/mb/js/basicIntell.png deleted file mode 100644 index 67d095d1a..000000000 Binary files a/docs/static/mb/js/basicIntell.png and /dev/null differ diff --git a/docs/static/mb/js/forIntell.png b/docs/static/mb/js/forIntell.png deleted file mode 100644 index 687e55e36..000000000 Binary files a/docs/static/mb/js/forIntell.png and /dev/null differ diff --git a/docs/static/mb/lessons/analyze.png b/docs/static/mb/lessons/analyze.png deleted file mode 100644 index 0d97742a1..000000000 Binary files a/docs/static/mb/lessons/analyze.png and /dev/null differ diff --git a/docs/static/mb/lessons/analyze1.png b/docs/static/mb/lessons/analyze1.png deleted file mode 100644 index 4c5b6ba33..000000000 Binary files a/docs/static/mb/lessons/analyze1.png and /dev/null differ diff --git a/docs/static/mb/lessons/analyze16.png b/docs/static/mb/lessons/analyze16.png deleted file mode 100644 index 831255636..000000000 Binary files a/docs/static/mb/lessons/analyze16.png and /dev/null differ diff --git a/docs/static/mb/lessons/analyze19.png b/docs/static/mb/lessons/analyze19.png deleted file mode 100644 index ddfc06be5..000000000 Binary files a/docs/static/mb/lessons/analyze19.png and /dev/null differ diff --git a/docs/static/mb/lessons/analyze2.png b/docs/static/mb/lessons/analyze2.png deleted file mode 100644 index 4634507eb..000000000 Binary files a/docs/static/mb/lessons/analyze2.png and /dev/null differ diff --git a/docs/static/mb/lessons/analyze20.png b/docs/static/mb/lessons/analyze20.png deleted file mode 100644 index e51f66d65..000000000 Binary files a/docs/static/mb/lessons/analyze20.png and /dev/null differ diff --git a/docs/static/mb/lessons/analyze3.png b/docs/static/mb/lessons/analyze3.png deleted file mode 100644 index fac50a401..000000000 Binary files a/docs/static/mb/lessons/analyze3.png and /dev/null differ diff --git a/docs/static/mb/lessons/analyze5.png b/docs/static/mb/lessons/analyze5.png deleted file mode 100644 index dc11a8afe..000000000 Binary files a/docs/static/mb/lessons/analyze5.png and /dev/null differ diff --git a/docs/static/mb/lessons/analyze6.png b/docs/static/mb/lessons/analyze6.png deleted file mode 100644 index 831255636..000000000 Binary files a/docs/static/mb/lessons/analyze6.png and /dev/null differ diff --git a/docs/static/mb/lessons/analyze7.png b/docs/static/mb/lessons/analyze7.png deleted file mode 100644 index 1b612c4dd..000000000 Binary files a/docs/static/mb/lessons/analyze7.png and /dev/null differ diff --git a/docs/static/mb/lessons/analyze8.png b/docs/static/mb/lessons/analyze8.png deleted file mode 100644 index 446b68c89..000000000 Binary files a/docs/static/mb/lessons/analyze8.png and /dev/null differ diff --git a/docs/static/mb/lessons/analyze9.png b/docs/static/mb/lessons/analyze9.png deleted file mode 100644 index 7aba0082a..000000000 Binary files a/docs/static/mb/lessons/analyze9.png and /dev/null differ diff --git a/docs/static/mb/lessons/answering-machine-0.png b/docs/static/mb/lessons/answering-machine-0.png deleted file mode 100644 index d29260a08..000000000 Binary files a/docs/static/mb/lessons/answering-machine-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/answering-machine-1.png b/docs/static/mb/lessons/answering-machine-1.png deleted file mode 100644 index 10c8f6320..000000000 Binary files a/docs/static/mb/lessons/answering-machine-1.png and /dev/null differ diff --git a/docs/static/mb/lessons/answering-machine-2.png b/docs/static/mb/lessons/answering-machine-2.png deleted file mode 100644 index 30a82735a..000000000 Binary files a/docs/static/mb/lessons/answering-machine-2.png and /dev/null differ diff --git a/docs/static/mb/lessons/answering-machine-4.png b/docs/static/mb/lessons/answering-machine-4.png deleted file mode 100644 index 15fa4c343..000000000 Binary files a/docs/static/mb/lessons/answering-machine-4.png and /dev/null differ diff --git a/docs/static/mb/lessons/banana-keyboard-0.png b/docs/static/mb/lessons/banana-keyboard-0.png deleted file mode 100644 index a9b218ee4..000000000 Binary files a/docs/static/mb/lessons/banana-keyboard-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/banana-keyboard-1.png b/docs/static/mb/lessons/banana-keyboard-1.png deleted file mode 100644 index 9ddb88322..000000000 Binary files a/docs/static/mb/lessons/banana-keyboard-1.png and /dev/null differ diff --git a/docs/static/mb/lessons/banana-keyboard-10.png b/docs/static/mb/lessons/banana-keyboard-10.png deleted file mode 100644 index 9e9829144..000000000 Binary files a/docs/static/mb/lessons/banana-keyboard-10.png and /dev/null differ diff --git a/docs/static/mb/lessons/banana-keyboard-11.png b/docs/static/mb/lessons/banana-keyboard-11.png deleted file mode 100644 index bb6ae2cd5..000000000 Binary files a/docs/static/mb/lessons/banana-keyboard-11.png and /dev/null differ diff --git a/docs/static/mb/lessons/banana-keyboard-12.png b/docs/static/mb/lessons/banana-keyboard-12.png deleted file mode 100644 index 020a11bd8..000000000 Binary files a/docs/static/mb/lessons/banana-keyboard-12.png and /dev/null differ diff --git a/docs/static/mb/lessons/banana-keyboard-2.png b/docs/static/mb/lessons/banana-keyboard-2.png deleted file mode 100644 index e3983d0b3..000000000 Binary files a/docs/static/mb/lessons/banana-keyboard-2.png and /dev/null differ diff --git a/docs/static/mb/lessons/banana-keyboard-3.png b/docs/static/mb/lessons/banana-keyboard-3.png deleted file mode 100644 index 4c261f3b9..000000000 Binary files a/docs/static/mb/lessons/banana-keyboard-3.png and /dev/null differ diff --git a/docs/static/mb/lessons/banana-keyboard-4.png b/docs/static/mb/lessons/banana-keyboard-4.png deleted file mode 100644 index c1be86317..000000000 Binary files a/docs/static/mb/lessons/banana-keyboard-4.png and /dev/null differ diff --git a/docs/static/mb/lessons/banana-keyboard-5.png b/docs/static/mb/lessons/banana-keyboard-5.png deleted file mode 100644 index c20ea3b39..000000000 Binary files a/docs/static/mb/lessons/banana-keyboard-5.png and /dev/null differ diff --git a/docs/static/mb/lessons/banana-keyboard-6.png b/docs/static/mb/lessons/banana-keyboard-6.png deleted file mode 100644 index f5edaeed1..000000000 Binary files a/docs/static/mb/lessons/banana-keyboard-6.png and /dev/null differ diff --git a/docs/static/mb/lessons/banana-keyboard-7.png b/docs/static/mb/lessons/banana-keyboard-7.png deleted file mode 100644 index 547930448..000000000 Binary files a/docs/static/mb/lessons/banana-keyboard-7.png and /dev/null differ diff --git a/docs/static/mb/lessons/banana-keyboard-8.png b/docs/static/mb/lessons/banana-keyboard-8.png deleted file mode 100644 index 14739ed6d..000000000 Binary files a/docs/static/mb/lessons/banana-keyboard-8.png and /dev/null differ diff --git a/docs/static/mb/lessons/banana-keyboard-9.png b/docs/static/mb/lessons/banana-keyboard-9.png deleted file mode 100644 index ba760b3e2..000000000 Binary files a/docs/static/mb/lessons/banana-keyboard-9.png and /dev/null differ diff --git a/docs/static/mb/lessons/blink-0.png b/docs/static/mb/lessons/blink-0.png deleted file mode 100644 index 4e1c4aeb9..000000000 Binary files a/docs/static/mb/lessons/blink-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/blink-1.png b/docs/static/mb/lessons/blink-1.png deleted file mode 100644 index 1639a3fd4..000000000 Binary files a/docs/static/mb/lessons/blink-1.png and /dev/null differ diff --git a/docs/static/mb/lessons/blink-2.png b/docs/static/mb/lessons/blink-2.png deleted file mode 100644 index b02229612..000000000 Binary files a/docs/static/mb/lessons/blink-2.png and /dev/null differ diff --git a/docs/static/mb/lessons/cascade-0.png b/docs/static/mb/lessons/cascade-0.png deleted file mode 100644 index bd8fe973f..000000000 Binary files a/docs/static/mb/lessons/cascade-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/cascade-1.png b/docs/static/mb/lessons/cascade-1.png deleted file mode 100644 index eecf6536f..000000000 Binary files a/docs/static/mb/lessons/cascade-1.png and /dev/null differ diff --git a/docs/static/mb/lessons/cascade-2.png b/docs/static/mb/lessons/cascade-2.png deleted file mode 100644 index 37ba14c70..000000000 Binary files a/docs/static/mb/lessons/cascade-2.png and /dev/null differ diff --git a/docs/static/mb/lessons/catch-the-egg-game-0.png b/docs/static/mb/lessons/catch-the-egg-game-0.png deleted file mode 100644 index 54129445a..000000000 Binary files a/docs/static/mb/lessons/catch-the-egg-game-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/chart1.png b/docs/static/mb/lessons/chart1.png deleted file mode 100644 index 26f43c4e3..000000000 Binary files a/docs/static/mb/lessons/chart1.png and /dev/null differ diff --git a/docs/static/mb/lessons/column-0.png b/docs/static/mb/lessons/column-0.png deleted file mode 100644 index 67ff1a072..000000000 Binary files a/docs/static/mb/lessons/column-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/column-1.png b/docs/static/mb/lessons/column-1.png deleted file mode 100644 index 6323a67ea..000000000 Binary files a/docs/static/mb/lessons/column-1.png and /dev/null differ diff --git a/docs/static/mb/lessons/counter-0.png b/docs/static/mb/lessons/counter-0.png deleted file mode 100644 index c2abb0f61..000000000 Binary files a/docs/static/mb/lessons/counter-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/counter-1.png b/docs/static/mb/lessons/counter-1.png deleted file mode 100644 index 294489589..000000000 Binary files a/docs/static/mb/lessons/counter-1.png and /dev/null differ diff --git a/docs/static/mb/lessons/counter-2.png b/docs/static/mb/lessons/counter-2.png deleted file mode 100644 index b924b9fda..000000000 Binary files a/docs/static/mb/lessons/counter-2.png and /dev/null differ diff --git a/docs/static/mb/lessons/data3.png b/docs/static/mb/lessons/data3.png deleted file mode 100644 index c312cf1c2..000000000 Binary files a/docs/static/mb/lessons/data3.png and /dev/null differ diff --git a/docs/static/mb/lessons/die-roll-0.png b/docs/static/mb/lessons/die-roll-0.png deleted file mode 100644 index 472d18bbf..000000000 Binary files a/docs/static/mb/lessons/die-roll-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/die-roll-1.png b/docs/static/mb/lessons/die-roll-1.png deleted file mode 100644 index 532bd4526..000000000 Binary files a/docs/static/mb/lessons/die-roll-1.png and /dev/null differ diff --git a/docs/static/mb/lessons/die-roll-2.png b/docs/static/mb/lessons/die-roll-2.png deleted file mode 100644 index f65949522..000000000 Binary files a/docs/static/mb/lessons/die-roll-2.png and /dev/null differ diff --git a/docs/static/mb/lessons/die-roll-3.png b/docs/static/mb/lessons/die-roll-3.png deleted file mode 100644 index 1e582cac4..000000000 Binary files a/docs/static/mb/lessons/die-roll-3.png and /dev/null differ diff --git a/docs/static/mb/lessons/digi-yoyo-0.png b/docs/static/mb/lessons/digi-yoyo-0.png deleted file mode 100644 index 917ce0e73..000000000 Binary files a/docs/static/mb/lessons/digi-yoyo-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/flashing-heart-0.png b/docs/static/mb/lessons/flashing-heart-0.png deleted file mode 100644 index a8e04a878..000000000 Binary files a/docs/static/mb/lessons/flashing-heart-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/flipping-bird-0.png b/docs/static/mb/lessons/flipping-bird-0.png deleted file mode 100644 index a28b2ea6f..000000000 Binary files a/docs/static/mb/lessons/flipping-bird-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/flipping-bird-1.png b/docs/static/mb/lessons/flipping-bird-1.png deleted file mode 100644 index 44abf050f..000000000 Binary files a/docs/static/mb/lessons/flipping-bird-1.png and /dev/null differ diff --git a/docs/static/mb/lessons/glowing-pendulum-0.jpg b/docs/static/mb/lessons/glowing-pendulum-0.jpg deleted file mode 100644 index b5ad4ee45..000000000 Binary files a/docs/static/mb/lessons/glowing-pendulum-0.jpg and /dev/null differ diff --git a/docs/static/mb/lessons/glowing-pendulum-1.png b/docs/static/mb/lessons/glowing-pendulum-1.png deleted file mode 100644 index fc30a4df9..000000000 Binary files a/docs/static/mb/lessons/glowing-pendulum-1.png and /dev/null differ diff --git a/docs/static/mb/lessons/guess-the-number-0.png b/docs/static/mb/lessons/guess-the-number-0.png deleted file mode 100644 index 979f06f62..000000000 Binary files a/docs/static/mb/lessons/guess-the-number-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/hack-your-headphones-0.png b/docs/static/mb/lessons/hack-your-headphones-0.png deleted file mode 100644 index ba58df5ad..000000000 Binary files a/docs/static/mb/lessons/hack-your-headphones-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/hack-your-headphones-1.png b/docs/static/mb/lessons/hack-your-headphones-1.png deleted file mode 100644 index 42a684492..000000000 Binary files a/docs/static/mb/lessons/hack-your-headphones-1.png and /dev/null differ diff --git a/docs/static/mb/lessons/looper-0.png b/docs/static/mb/lessons/looper-0.png deleted file mode 100644 index eaf37d0d5..000000000 Binary files a/docs/static/mb/lessons/looper-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/looper-1.png b/docs/static/mb/lessons/looper-1.png deleted file mode 100644 index 4c832c213..000000000 Binary files a/docs/static/mb/lessons/looper-1.png and /dev/null differ diff --git a/docs/static/mb/lessons/looper-2.png b/docs/static/mb/lessons/looper-2.png deleted file mode 100644 index 3ae90577f..000000000 Binary files a/docs/static/mb/lessons/looper-2.png and /dev/null differ diff --git a/docs/static/mb/lessons/looper-3.png b/docs/static/mb/lessons/looper-3.png deleted file mode 100644 index 701c0d3e6..000000000 Binary files a/docs/static/mb/lessons/looper-3.png and /dev/null differ diff --git a/docs/static/mb/lessons/lucky-7-0.png b/docs/static/mb/lessons/lucky-7-0.png deleted file mode 100644 index e9c20c686..000000000 Binary files a/docs/static/mb/lessons/lucky-7-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/lucky-7-1.png b/docs/static/mb/lessons/lucky-7-1.png deleted file mode 100644 index 05ed459f7..000000000 Binary files a/docs/static/mb/lessons/lucky-7-1.png and /dev/null differ diff --git a/docs/static/mb/lessons/lucky-7-2.png b/docs/static/mb/lessons/lucky-7-2.png deleted file mode 100644 index 51bd9d800..000000000 Binary files a/docs/static/mb/lessons/lucky-7-2.png and /dev/null differ diff --git a/docs/static/mb/lessons/lucky-7-3.png b/docs/static/mb/lessons/lucky-7-3.png deleted file mode 100644 index 609e18954..000000000 Binary files a/docs/static/mb/lessons/lucky-7-3.png and /dev/null differ diff --git a/docs/static/mb/lessons/magic-logo-0.png b/docs/static/mb/lessons/magic-logo-0.png deleted file mode 100644 index 67bb4841e..000000000 Binary files a/docs/static/mb/lessons/magic-logo-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/night-light-0.png b/docs/static/mb/lessons/night-light-0.png deleted file mode 100644 index 8803fb656..000000000 Binary files a/docs/static/mb/lessons/night-light-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/night-light-1.png b/docs/static/mb/lessons/night-light-1.png deleted file mode 100644 index 348e0382b..000000000 Binary files a/docs/static/mb/lessons/night-light-1.png and /dev/null differ diff --git a/docs/static/mb/lessons/night-light-2.png b/docs/static/mb/lessons/night-light-2.png deleted file mode 100644 index 182999032..000000000 Binary files a/docs/static/mb/lessons/night-light-2.png and /dev/null differ diff --git a/docs/static/mb/lessons/offset-image-0.png b/docs/static/mb/lessons/offset-image-0.png deleted file mode 100644 index ba2a9afef..000000000 Binary files a/docs/static/mb/lessons/offset-image-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/offset-image-1.png b/docs/static/mb/lessons/offset-image-1.png deleted file mode 100644 index 9c1827b8f..000000000 Binary files a/docs/static/mb/lessons/offset-image-1.png and /dev/null differ diff --git a/docs/static/mb/lessons/ornament-chain-0.jpg b/docs/static/mb/lessons/ornament-chain-0.jpg deleted file mode 100644 index 45b7a1d50..000000000 Binary files a/docs/static/mb/lessons/ornament-chain-0.jpg and /dev/null differ diff --git a/docs/static/mb/lessons/ornament-chain-1.jpg b/docs/static/mb/lessons/ornament-chain-1.jpg deleted file mode 100644 index dd9242cf5..000000000 Binary files a/docs/static/mb/lessons/ornament-chain-1.jpg and /dev/null differ diff --git a/docs/static/mb/lessons/ornament-chain-2.png b/docs/static/mb/lessons/ornament-chain-2.png deleted file mode 100644 index 07ce9637c..000000000 Binary files a/docs/static/mb/lessons/ornament-chain-2.png and /dev/null differ diff --git a/docs/static/mb/lessons/ornament-chain-3.png b/docs/static/mb/lessons/ornament-chain-3.png deleted file mode 100644 index fe2ed0674..000000000 Binary files a/docs/static/mb/lessons/ornament-chain-3.png and /dev/null differ diff --git a/docs/static/mb/lessons/ornament-chain-4.png b/docs/static/mb/lessons/ornament-chain-4.png deleted file mode 100644 index fb4d9882b..000000000 Binary files a/docs/static/mb/lessons/ornament-chain-4.png and /dev/null differ diff --git a/docs/static/mb/lessons/ornament-chain-5.png b/docs/static/mb/lessons/ornament-chain-5.png deleted file mode 100644 index c97392024..000000000 Binary files a/docs/static/mb/lessons/ornament-chain-5.png and /dev/null differ diff --git a/docs/static/mb/lessons/ornament-chain-6.png b/docs/static/mb/lessons/ornament-chain-6.png deleted file mode 100644 index 24d1442c4..000000000 Binary files a/docs/static/mb/lessons/ornament-chain-6.png and /dev/null differ diff --git a/docs/static/mb/lessons/ornament-chain-7.png b/docs/static/mb/lessons/ornament-chain-7.png deleted file mode 100644 index 707cb2087..000000000 Binary files a/docs/static/mb/lessons/ornament-chain-7.png and /dev/null differ diff --git a/docs/static/mb/lessons/ornament-chain-8.png b/docs/static/mb/lessons/ornament-chain-8.png deleted file mode 100644 index b8537355d..000000000 Binary files a/docs/static/mb/lessons/ornament-chain-8.png and /dev/null differ diff --git a/docs/static/mb/lessons/prank-wifi-0.png b/docs/static/mb/lessons/prank-wifi-0.png deleted file mode 100644 index dbdbe2447..000000000 Binary files a/docs/static/mb/lessons/prank-wifi-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/rotation-animation-0.png b/docs/static/mb/lessons/rotation-animation-0.png deleted file mode 100644 index 96352e442..000000000 Binary files a/docs/static/mb/lessons/rotation-animation-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/rotation-animation-1.png b/docs/static/mb/lessons/rotation-animation-1.png deleted file mode 100644 index ba98236a2..000000000 Binary files a/docs/static/mb/lessons/rotation-animation-1.png and /dev/null differ diff --git a/docs/static/mb/lessons/rotation-animation-2.png b/docs/static/mb/lessons/rotation-animation-2.png deleted file mode 100644 index 3953500c8..000000000 Binary files a/docs/static/mb/lessons/rotation-animation-2.png and /dev/null differ diff --git a/docs/static/mb/lessons/rotation-animation-3.png b/docs/static/mb/lessons/rotation-animation-3.png deleted file mode 100644 index 488b3b02b..000000000 Binary files a/docs/static/mb/lessons/rotation-animation-3.png and /dev/null differ diff --git a/docs/static/mb/lessons/screen-wipe-0.png b/docs/static/mb/lessons/screen-wipe-0.png deleted file mode 100644 index a1f7855c7..000000000 Binary files a/docs/static/mb/lessons/screen-wipe-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/seis_challenge01.png b/docs/static/mb/lessons/seis_challenge01.png deleted file mode 100644 index 0168a79fd..000000000 Binary files a/docs/static/mb/lessons/seis_challenge01.png and /dev/null differ diff --git a/docs/static/mb/lessons/seis_challenge02.png b/docs/static/mb/lessons/seis_challenge02.png deleted file mode 100644 index a06111be5..000000000 Binary files a/docs/static/mb/lessons/seis_challenge02.png and /dev/null differ diff --git a/docs/static/mb/lessons/seis_challenge04.png b/docs/static/mb/lessons/seis_challenge04.png deleted file mode 100644 index 3373604cd..000000000 Binary files a/docs/static/mb/lessons/seis_challenge04.png and /dev/null differ diff --git a/docs/static/mb/lessons/seis_challenge05.png b/docs/static/mb/lessons/seis_challenge05.png deleted file mode 100644 index 47e2c79d7..000000000 Binary files a/docs/static/mb/lessons/seis_challenge05.png and /dev/null differ diff --git a/docs/static/mb/lessons/seis_challenge06.png b/docs/static/mb/lessons/seis_challenge06.png deleted file mode 100644 index c0f69793e..000000000 Binary files a/docs/static/mb/lessons/seis_challenge06.png and /dev/null differ diff --git a/docs/static/mb/lessons/seis_challenge07.png b/docs/static/mb/lessons/seis_challenge07.png deleted file mode 100644 index c9b233ad5..000000000 Binary files a/docs/static/mb/lessons/seis_challenge07.png and /dev/null differ diff --git a/docs/static/mb/lessons/seismograph0.png b/docs/static/mb/lessons/seismograph0.png deleted file mode 100644 index 35b8ce7d3..000000000 Binary files a/docs/static/mb/lessons/seismograph0.png and /dev/null differ diff --git a/docs/static/mb/lessons/seismograph1.png b/docs/static/mb/lessons/seismograph1.png deleted file mode 100644 index 45dba3424..000000000 Binary files a/docs/static/mb/lessons/seismograph1.png and /dev/null differ diff --git a/docs/static/mb/lessons/seismograph10.png b/docs/static/mb/lessons/seismograph10.png deleted file mode 100644 index 322fd6a46..000000000 Binary files a/docs/static/mb/lessons/seismograph10.png and /dev/null differ diff --git a/docs/static/mb/lessons/seismograph11.png b/docs/static/mb/lessons/seismograph11.png deleted file mode 100644 index 5eafa75df..000000000 Binary files a/docs/static/mb/lessons/seismograph11.png and /dev/null differ diff --git a/docs/static/mb/lessons/seismograph22.png b/docs/static/mb/lessons/seismograph22.png deleted file mode 100644 index 6730eedf7..000000000 Binary files a/docs/static/mb/lessons/seismograph22.png and /dev/null differ diff --git a/docs/static/mb/lessons/seismograph3.png b/docs/static/mb/lessons/seismograph3.png deleted file mode 100644 index 1208a67ac..000000000 Binary files a/docs/static/mb/lessons/seismograph3.png and /dev/null differ diff --git a/docs/static/mb/lessons/seismograph32.png b/docs/static/mb/lessons/seismograph32.png deleted file mode 100644 index 6730eedf7..000000000 Binary files a/docs/static/mb/lessons/seismograph32.png and /dev/null differ diff --git a/docs/static/mb/lessons/seismograph33.png b/docs/static/mb/lessons/seismograph33.png deleted file mode 100644 index 1208a67ac..000000000 Binary files a/docs/static/mb/lessons/seismograph33.png and /dev/null differ diff --git a/docs/static/mb/lessons/seismograph5.png b/docs/static/mb/lessons/seismograph5.png deleted file mode 100644 index f5b0b98d4..000000000 Binary files a/docs/static/mb/lessons/seismograph5.png and /dev/null differ diff --git a/docs/static/mb/lessons/seismograph6.png b/docs/static/mb/lessons/seismograph6.png deleted file mode 100644 index b26b8e229..000000000 Binary files a/docs/static/mb/lessons/seismograph6.png and /dev/null differ diff --git a/docs/static/mb/lessons/seismograph7.png b/docs/static/mb/lessons/seismograph7.png deleted file mode 100644 index 884c0c2d5..000000000 Binary files a/docs/static/mb/lessons/seismograph7.png and /dev/null differ diff --git a/docs/static/mb/lessons/seismograph8.png b/docs/static/mb/lessons/seismograph8.png deleted file mode 100644 index efdb7d788..000000000 Binary files a/docs/static/mb/lessons/seismograph8.png and /dev/null differ diff --git a/docs/static/mb/lessons/seismograph9.png b/docs/static/mb/lessons/seismograph9.png deleted file mode 100644 index 322fd6a46..000000000 Binary files a/docs/static/mb/lessons/seismograph9.png and /dev/null differ diff --git a/docs/static/mb/lessons/smiley-0.png b/docs/static/mb/lessons/smiley-0.png deleted file mode 100644 index b2c5452f6..000000000 Binary files a/docs/static/mb/lessons/smiley-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/snowflake-fall-0.png b/docs/static/mb/lessons/snowflake-fall-0.png deleted file mode 100644 index 9c295deeb..000000000 Binary files a/docs/static/mb/lessons/snowflake-fall-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/snowflake-fall-1.png b/docs/static/mb/lessons/snowflake-fall-1.png deleted file mode 100644 index 924673023..000000000 Binary files a/docs/static/mb/lessons/snowflake-fall-1.png and /dev/null differ diff --git a/docs/static/mb/lessons/snowflake-fall-2.png b/docs/static/mb/lessons/snowflake-fall-2.png deleted file mode 100644 index 005c2da52..000000000 Binary files a/docs/static/mb/lessons/snowflake-fall-2.png and /dev/null differ diff --git a/docs/static/mb/lessons/speed-button-0.png b/docs/static/mb/lessons/speed-button-0.png deleted file mode 100644 index b98310bad..000000000 Binary files a/docs/static/mb/lessons/speed-button-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/speed-button-1.png b/docs/static/mb/lessons/speed-button-1.png deleted file mode 100644 index 44abf050f..000000000 Binary files a/docs/static/mb/lessons/speed-button-1.png and /dev/null differ diff --git a/docs/static/mb/lessons/speed-button-2.png b/docs/static/mb/lessons/speed-button-2.png deleted file mode 100644 index b00ec1eb6..000000000 Binary files a/docs/static/mb/lessons/speed-button-2.png and /dev/null differ diff --git a/docs/static/mb/lessons/spinner-0.png b/docs/static/mb/lessons/spinner-0.png deleted file mode 100644 index 9c0b93902..000000000 Binary files a/docs/static/mb/lessons/spinner-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/spinner-1.png b/docs/static/mb/lessons/spinner-1.png deleted file mode 100644 index 17c121d3e..000000000 Binary files a/docs/static/mb/lessons/spinner-1.png and /dev/null differ diff --git a/docs/static/mb/lessons/telegraph-0.png b/docs/static/mb/lessons/telegraph-0.png deleted file mode 100644 index d5ebfdc5d..000000000 Binary files a/docs/static/mb/lessons/telegraph-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-0.png b/docs/static/mb/lessons/the-watch-0.png deleted file mode 100644 index 177037e1f..000000000 Binary files a/docs/static/mb/lessons/the-watch-0.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-1.png b/docs/static/mb/lessons/the-watch-1.png deleted file mode 100644 index d017662f1..000000000 Binary files a/docs/static/mb/lessons/the-watch-1.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-10.png b/docs/static/mb/lessons/the-watch-10.png deleted file mode 100644 index c61ca460a..000000000 Binary files a/docs/static/mb/lessons/the-watch-10.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-11.png b/docs/static/mb/lessons/the-watch-11.png deleted file mode 100644 index c8481af48..000000000 Binary files a/docs/static/mb/lessons/the-watch-11.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-12.png b/docs/static/mb/lessons/the-watch-12.png deleted file mode 100644 index 3d6a1f6bc..000000000 Binary files a/docs/static/mb/lessons/the-watch-12.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-13.png b/docs/static/mb/lessons/the-watch-13.png deleted file mode 100644 index 1203b54f0..000000000 Binary files a/docs/static/mb/lessons/the-watch-13.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-14.png b/docs/static/mb/lessons/the-watch-14.png deleted file mode 100644 index 6e810b197..000000000 Binary files a/docs/static/mb/lessons/the-watch-14.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-15.png b/docs/static/mb/lessons/the-watch-15.png deleted file mode 100644 index 96d036ecc..000000000 Binary files a/docs/static/mb/lessons/the-watch-15.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-16.png b/docs/static/mb/lessons/the-watch-16.png deleted file mode 100644 index 9f7cbbdee..000000000 Binary files a/docs/static/mb/lessons/the-watch-16.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-17.png b/docs/static/mb/lessons/the-watch-17.png deleted file mode 100644 index e0832e26d..000000000 Binary files a/docs/static/mb/lessons/the-watch-17.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-18.png b/docs/static/mb/lessons/the-watch-18.png deleted file mode 100644 index 5af575207..000000000 Binary files a/docs/static/mb/lessons/the-watch-18.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-19.png b/docs/static/mb/lessons/the-watch-19.png deleted file mode 100644 index ad5e73bc3..000000000 Binary files a/docs/static/mb/lessons/the-watch-19.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-2.png b/docs/static/mb/lessons/the-watch-2.png deleted file mode 100644 index 4cf5127c7..000000000 Binary files a/docs/static/mb/lessons/the-watch-2.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-20.png b/docs/static/mb/lessons/the-watch-20.png deleted file mode 100644 index 8be6874ff..000000000 Binary files a/docs/static/mb/lessons/the-watch-20.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-21.png b/docs/static/mb/lessons/the-watch-21.png deleted file mode 100644 index e241b25fb..000000000 Binary files a/docs/static/mb/lessons/the-watch-21.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-22.png b/docs/static/mb/lessons/the-watch-22.png deleted file mode 100644 index a9e28360c..000000000 Binary files a/docs/static/mb/lessons/the-watch-22.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-23.png b/docs/static/mb/lessons/the-watch-23.png deleted file mode 100644 index b2705794c..000000000 Binary files a/docs/static/mb/lessons/the-watch-23.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-3.png b/docs/static/mb/lessons/the-watch-3.png deleted file mode 100644 index f8072ef29..000000000 Binary files a/docs/static/mb/lessons/the-watch-3.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-4.png b/docs/static/mb/lessons/the-watch-4.png deleted file mode 100644 index 86c539e13..000000000 Binary files a/docs/static/mb/lessons/the-watch-4.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-5.png b/docs/static/mb/lessons/the-watch-5.png deleted file mode 100644 index 0681a2dbd..000000000 Binary files a/docs/static/mb/lessons/the-watch-5.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-6.png b/docs/static/mb/lessons/the-watch-6.png deleted file mode 100644 index 1fd6c191c..000000000 Binary files a/docs/static/mb/lessons/the-watch-6.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-7.png b/docs/static/mb/lessons/the-watch-7.png deleted file mode 100644 index 3ef7ec9ad..000000000 Binary files a/docs/static/mb/lessons/the-watch-7.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-8.png b/docs/static/mb/lessons/the-watch-8.png deleted file mode 100644 index 6614bf5bf..000000000 Binary files a/docs/static/mb/lessons/the-watch-8.png and /dev/null differ diff --git a/docs/static/mb/lessons/the-watch-9.png b/docs/static/mb/lessons/the-watch-9.png deleted file mode 100644 index 44aa930ed..000000000 Binary files a/docs/static/mb/lessons/the-watch-9.png and /dev/null differ diff --git a/docs/static/mb/lessons/truth-or-dare-0.png b/docs/static/mb/lessons/truth-or-dare-0.png deleted file mode 100644 index 7a01002a1..000000000 Binary files a/docs/static/mb/lessons/truth-or-dare-0.png and /dev/null differ diff --git a/docs/static/mb/line_chart.png b/docs/static/mb/line_chart.png deleted file mode 100644 index 05c14ef21..000000000 Binary files a/docs/static/mb/line_chart.png and /dev/null differ diff --git a/docs/static/mb/offline-2.png b/docs/static/mb/offline-2.png deleted file mode 100644 index e5a18bdaa..000000000 Binary files a/docs/static/mb/offline-2.png and /dev/null differ diff --git a/docs/static/mb/projects/7-seconds.png b/docs/static/mb/projects/7-seconds.png deleted file mode 100644 index fbcb39e7e..000000000 Binary files a/docs/static/mb/projects/7-seconds.png and /dev/null differ diff --git a/docs/static/mb/projects/a1-display.png b/docs/static/mb/projects/a1-display.png deleted file mode 100644 index bd3236c80..000000000 Binary files a/docs/static/mb/projects/a1-display.png and /dev/null differ diff --git a/docs/static/mb/projects/a10-watch.png b/docs/static/mb/projects/a10-watch.png deleted file mode 100644 index 9781b7592..000000000 Binary files a/docs/static/mb/projects/a10-watch.png and /dev/null differ diff --git a/docs/static/mb/projects/a2-buttons.png b/docs/static/mb/projects/a2-buttons.png deleted file mode 100644 index 668a5a469..000000000 Binary files a/docs/static/mb/projects/a2-buttons.png and /dev/null differ diff --git a/docs/static/mb/projects/a3-pins.png b/docs/static/mb/projects/a3-pins.png deleted file mode 100644 index 5e8115412..000000000 Binary files a/docs/static/mb/projects/a3-pins.png and /dev/null differ diff --git a/docs/static/mb/projects/a4-motion-v2.png b/docs/static/mb/projects/a4-motion-v2.png deleted file mode 100644 index ed15d5041..000000000 Binary files a/docs/static/mb/projects/a4-motion-v2.png and /dev/null differ diff --git a/docs/static/mb/projects/a4-motion.png b/docs/static/mb/projects/a4-motion.png deleted file mode 100644 index 49b5a6cb2..000000000 Binary files a/docs/static/mb/projects/a4-motion.png and /dev/null differ diff --git a/docs/static/mb/projects/a5-compass.png b/docs/static/mb/projects/a5-compass.png deleted file mode 100644 index d3e34ce80..000000000 Binary files a/docs/static/mb/projects/a5-compass.png and /dev/null differ diff --git a/docs/static/mb/projects/a6-music.png b/docs/static/mb/projects/a6-music.png deleted file mode 100644 index 6a1e39f15..000000000 Binary files a/docs/static/mb/projects/a6-music.png and /dev/null differ diff --git a/docs/static/mb/projects/a7-conductive.png b/docs/static/mb/projects/a7-conductive.png deleted file mode 100644 index 1c3ab640d..000000000 Binary files a/docs/static/mb/projects/a7-conductive.png and /dev/null differ diff --git a/docs/static/mb/projects/a8-network.png b/docs/static/mb/projects/a8-network.png deleted file mode 100644 index de76df325..000000000 Binary files a/docs/static/mb/projects/a8-network.png and /dev/null differ diff --git a/docs/static/mb/projects/a9-radio.png b/docs/static/mb/projects/a9-radio.png deleted file mode 100644 index d8cf0f404..000000000 Binary files a/docs/static/mb/projects/a9-radio.png and /dev/null differ diff --git a/docs/static/mb/projects/accel-console.png b/docs/static/mb/projects/accel-console.png deleted file mode 100644 index e9b2703ad..000000000 Binary files a/docs/static/mb/projects/accel-console.png and /dev/null differ diff --git a/docs/static/mb/projects/all10.png b/docs/static/mb/projects/all10.png deleted file mode 100644 index e2aa6663d..000000000 Binary files a/docs/static/mb/projects/all10.png and /dev/null differ diff --git a/docs/static/mb/projects/analog-pin-tester.png b/docs/static/mb/projects/analog-pin-tester.png deleted file mode 100644 index 9490edfea..000000000 Binary files a/docs/static/mb/projects/analog-pin-tester.png and /dev/null differ diff --git a/docs/static/mb/projects/best-friends.png b/docs/static/mb/projects/best-friends.png deleted file mode 100644 index d37d4ed14..000000000 Binary files a/docs/static/mb/projects/best-friends.png and /dev/null differ diff --git a/docs/static/mb/projects/blow-away.png b/docs/static/mb/projects/blow-away.png deleted file mode 100644 index 8e8fe5e02..000000000 Binary files a/docs/static/mb/projects/blow-away.png and /dev/null differ diff --git a/docs/static/mb/projects/cat-napping/11_datafile.png b/docs/static/mb/projects/cat-napping/11_datafile.png deleted file mode 100644 index 18bf917fe..000000000 Binary files a/docs/static/mb/projects/cat-napping/11_datafile.png and /dev/null differ diff --git a/docs/static/mb/projects/cat-napping/11_mydata.png b/docs/static/mb/projects/cat-napping/11_mydata.png deleted file mode 100644 index f028a9e25..000000000 Binary files a/docs/static/mb/projects/cat-napping/11_mydata.png and /dev/null differ diff --git a/docs/static/mb/projects/cat-napping/1_lychee.png b/docs/static/mb/projects/cat-napping/1_lychee.png deleted file mode 100644 index 865267c76..000000000 Binary files a/docs/static/mb/projects/cat-napping/1_lychee.png and /dev/null differ diff --git a/docs/static/mb/projects/clap-lights.png b/docs/static/mb/projects/clap-lights.png deleted file mode 100644 index 7d692df59..000000000 Binary files a/docs/static/mb/projects/clap-lights.png and /dev/null differ diff --git a/docs/static/mb/projects/coin-flipper.png b/docs/static/mb/projects/coin-flipper.png deleted file mode 100644 index 53bf6ef82..000000000 Binary files a/docs/static/mb/projects/coin-flipper.png and /dev/null differ diff --git a/docs/static/mb/projects/coin-flipper/coin-flipper.gif b/docs/static/mb/projects/coin-flipper/coin-flipper.gif deleted file mode 100644 index b83a10b10..000000000 Binary files a/docs/static/mb/projects/coin-flipper/coin-flipper.gif and /dev/null differ diff --git a/docs/static/mb/projects/countdown.png b/docs/static/mb/projects/countdown.png deleted file mode 100644 index 7749fc15f..000000000 Binary files a/docs/static/mb/projects/countdown.png and /dev/null differ diff --git a/docs/static/mb/projects/crashy-bird.png b/docs/static/mb/projects/crashy-bird.png deleted file mode 100644 index b8ee6a813..000000000 Binary files a/docs/static/mb/projects/crashy-bird.png and /dev/null differ diff --git a/docs/static/mb/projects/dance-beat.png b/docs/static/mb/projects/dance-beat.png deleted file mode 100644 index 7d692df59..000000000 Binary files a/docs/static/mb/projects/dance-beat.png and /dev/null differ diff --git a/docs/static/mb/projects/dance-card.png b/docs/static/mb/projects/dance-card.png deleted file mode 100644 index 18a5e7164..000000000 Binary files a/docs/static/mb/projects/dance-card.png and /dev/null differ diff --git a/docs/static/mb/projects/dice.png b/docs/static/mb/projects/dice.png deleted file mode 100644 index cb81642a2..000000000 Binary files a/docs/static/mb/projects/dice.png and /dev/null differ diff --git a/docs/static/mb/projects/duct-tape-watch.jpg b/docs/static/mb/projects/duct-tape-watch.jpg deleted file mode 100644 index 5ac0567b6..000000000 Binary files a/docs/static/mb/projects/duct-tape-watch.jpg and /dev/null differ diff --git a/docs/static/mb/projects/duct-tape-watch.png b/docs/static/mb/projects/duct-tape-watch.png deleted file mode 100644 index 160ebb4fd..000000000 Binary files a/docs/static/mb/projects/duct-tape-watch.png and /dev/null differ diff --git a/docs/static/mb/projects/duct-tape-watch/attach-mb.jpg b/docs/static/mb/projects/duct-tape-watch/attach-mb.jpg deleted file mode 100644 index e64bc6b4b..000000000 Binary files a/docs/static/mb/projects/duct-tape-watch/attach-mb.jpg and /dev/null differ diff --git a/docs/static/mb/projects/duct-tape-watch/cut-roll-tape.jpg b/docs/static/mb/projects/duct-tape-watch/cut-roll-tape.jpg deleted file mode 100644 index 7fe6a9c7f..000000000 Binary files a/docs/static/mb/projects/duct-tape-watch/cut-roll-tape.jpg and /dev/null differ diff --git a/docs/static/mb/projects/duct-tape-watch/rpsshake.gif b/docs/static/mb/projects/duct-tape-watch/rpsshake.gif deleted file mode 100644 index d7328ac4c..000000000 Binary files a/docs/static/mb/projects/duct-tape-watch/rpsshake.gif and /dev/null differ diff --git a/docs/static/mb/projects/duct-tape-watch/wrist-fastener.jpg b/docs/static/mb/projects/duct-tape-watch/wrist-fastener.jpg deleted file mode 100644 index ab3bbe144..000000000 Binary files a/docs/static/mb/projects/duct-tape-watch/wrist-fastener.jpg and /dev/null differ diff --git a/docs/static/mb/projects/electric-guitar.png b/docs/static/mb/projects/electric-guitar.png deleted file mode 100644 index ac3b47b70..000000000 Binary files a/docs/static/mb/projects/electric-guitar.png and /dev/null differ diff --git a/docs/static/mb/projects/electric-guitar/connections.jpg b/docs/static/mb/projects/electric-guitar/connections.jpg deleted file mode 100644 index 4d58cc9d8..000000000 Binary files a/docs/static/mb/projects/electric-guitar/connections.jpg and /dev/null differ diff --git a/docs/static/mb/projects/electric-guitar/electric-guitar.png b/docs/static/mb/projects/electric-guitar/electric-guitar.png deleted file mode 100644 index ac3b47b70..000000000 Binary files a/docs/static/mb/projects/electric-guitar/electric-guitar.png and /dev/null differ diff --git a/docs/static/mb/projects/electric-guitar/guitar-board1.jpg b/docs/static/mb/projects/electric-guitar/guitar-board1.jpg deleted file mode 100644 index b395a5bae..000000000 Binary files a/docs/static/mb/projects/electric-guitar/guitar-board1.jpg and /dev/null differ diff --git a/docs/static/mb/projects/electric-guitar/guitar-board2.jpg b/docs/static/mb/projects/electric-guitar/guitar-board2.jpg deleted file mode 100644 index 973f02548..000000000 Binary files a/docs/static/mb/projects/electric-guitar/guitar-board2.jpg and /dev/null differ diff --git a/docs/static/mb/projects/fireflies.png b/docs/static/mb/projects/fireflies.png deleted file mode 100644 index 86c57f904..000000000 Binary files a/docs/static/mb/projects/fireflies.png and /dev/null differ diff --git a/docs/static/mb/projects/flashing-heart/show-leds.gif b/docs/static/mb/projects/flashing-heart/show-leds.gif deleted file mode 100644 index 7c747185f..000000000 Binary files a/docs/static/mb/projects/flashing-heart/show-leds.gif and /dev/null differ diff --git a/docs/static/mb/projects/flashing-heart/showleds.gif b/docs/static/mb/projects/flashing-heart/showleds.gif deleted file mode 100644 index 29f08908a..000000000 Binary files a/docs/static/mb/projects/flashing-heart/showleds.gif and /dev/null differ diff --git a/docs/static/mb/projects/flashing-heart/sim.gif b/docs/static/mb/projects/flashing-heart/sim.gif deleted file mode 100644 index 7c747185f..000000000 Binary files a/docs/static/mb/projects/flashing-heart/sim.gif and /dev/null differ diff --git a/docs/static/mb/projects/guitar.png b/docs/static/mb/projects/guitar.png deleted file mode 100644 index 6866549bb..000000000 Binary files a/docs/static/mb/projects/guitar.png and /dev/null differ diff --git a/docs/static/mb/projects/guitar/accelleration_axis.png b/docs/static/mb/projects/guitar/accelleration_axis.png deleted file mode 100644 index 9e620d6bb..000000000 Binary files a/docs/static/mb/projects/guitar/accelleration_axis.png and /dev/null differ diff --git a/docs/static/mb/projects/guitar/connectmicrobit.jpg b/docs/static/mb/projects/guitar/connectmicrobit.jpg deleted file mode 100644 index 8f22e8e5d..000000000 Binary files a/docs/static/mb/projects/guitar/connectmicrobit.jpg and /dev/null differ diff --git a/docs/static/mb/projects/guitar/crocclipintoboard.jpg b/docs/static/mb/projects/guitar/crocclipintoboard.jpg deleted file mode 100644 index 23f46b69b..000000000 Binary files a/docs/static/mb/projects/guitar/crocclipintoboard.jpg and /dev/null differ diff --git a/docs/static/mb/projects/guitar/crocclips.jpg b/docs/static/mb/projects/guitar/crocclips.jpg deleted file mode 100644 index 7acdd6569..000000000 Binary files a/docs/static/mb/projects/guitar/crocclips.jpg and /dev/null differ diff --git a/docs/static/mb/projects/guitar/headphones.jpg b/docs/static/mb/projects/guitar/headphones.jpg deleted file mode 100644 index 9b05f0b43..000000000 Binary files a/docs/static/mb/projects/guitar/headphones.jpg and /dev/null differ diff --git a/docs/static/mb/projects/guitar/jacktocrocs.jpg b/docs/static/mb/projects/guitar/jacktocrocs.jpg deleted file mode 100644 index 4f6520f1d..000000000 Binary files a/docs/static/mb/projects/guitar/jacktocrocs.jpg and /dev/null differ diff --git a/docs/static/mb/projects/guitar/map_analogy.png b/docs/static/mb/projects/guitar/map_analogy.png deleted file mode 100644 index 1235e6798..000000000 Binary files a/docs/static/mb/projects/guitar/map_analogy.png and /dev/null differ diff --git a/docs/static/mb/projects/guitar/mapanalogy.JPG b/docs/static/mb/projects/guitar/mapanalogy.JPG deleted file mode 100644 index 53b2c65ee..000000000 Binary files a/docs/static/mb/projects/guitar/mapanalogy.JPG and /dev/null differ diff --git a/docs/static/mb/projects/guitar/materials.jpg b/docs/static/mb/projects/guitar/materials.jpg deleted file mode 100644 index 9df09e044..000000000 Binary files a/docs/static/mb/projects/guitar/materials.jpg and /dev/null differ diff --git a/docs/static/mb/projects/guitar/microbit.jpg b/docs/static/mb/projects/guitar/microbit.jpg deleted file mode 100644 index 4d4b04957..000000000 Binary files a/docs/static/mb/projects/guitar/microbit.jpg and /dev/null differ diff --git a/docs/static/mb/projects/guitar/otherdesigns.jpg b/docs/static/mb/projects/guitar/otherdesigns.jpg deleted file mode 100644 index 7bc0d3a1a..000000000 Binary files a/docs/static/mb/projects/guitar/otherdesigns.jpg and /dev/null differ diff --git a/docs/static/mb/projects/guitar/usbcable.jpg b/docs/static/mb/projects/guitar/usbcable.jpg deleted file mode 100644 index 4ec68d1a0..000000000 Binary files a/docs/static/mb/projects/guitar/usbcable.jpg and /dev/null differ diff --git a/docs/static/mb/projects/heads-guess.png b/docs/static/mb/projects/heads-guess.png deleted file mode 100644 index e1cd97f5e..000000000 Binary files a/docs/static/mb/projects/heads-guess.png and /dev/null differ diff --git a/docs/static/mb/projects/hot-or-cold.jpg b/docs/static/mb/projects/hot-or-cold.jpg deleted file mode 100644 index 3c4006f1f..000000000 Binary files a/docs/static/mb/projects/hot-or-cold.jpg and /dev/null differ diff --git a/docs/static/mb/projects/hot-potato.png b/docs/static/mb/projects/hot-potato.png deleted file mode 100644 index 7943cd652..000000000 Binary files a/docs/static/mb/projects/hot-potato.png and /dev/null differ diff --git a/docs/static/mb/projects/inchworm.jpg b/docs/static/mb/projects/inchworm.jpg deleted file mode 100644 index d984848ed..000000000 Binary files a/docs/static/mb/projects/inchworm.jpg and /dev/null differ diff --git a/docs/static/mb/projects/infection.png b/docs/static/mb/projects/infection.png deleted file mode 100644 index 05587ddaa..000000000 Binary files a/docs/static/mb/projects/infection.png and /dev/null differ diff --git a/docs/static/mb/projects/jonnys-bird.png b/docs/static/mb/projects/jonnys-bird.png deleted file mode 100644 index 149eb94a9..000000000 Binary files a/docs/static/mb/projects/jonnys-bird.png and /dev/null differ diff --git a/docs/static/mb/projects/karel.png b/docs/static/mb/projects/karel.png deleted file mode 100644 index b6ba95f51..000000000 Binary files a/docs/static/mb/projects/karel.png and /dev/null differ diff --git a/docs/static/mb/projects/karel/blank.png b/docs/static/mb/projects/karel/blank.png deleted file mode 100644 index b62bf6871..000000000 Binary files a/docs/static/mb/projects/karel/blank.png and /dev/null differ diff --git a/docs/static/mb/projects/karel/check.png b/docs/static/mb/projects/karel/check.png deleted file mode 100644 index bbd88e7f9..000000000 Binary files a/docs/static/mb/projects/karel/check.png and /dev/null differ diff --git a/docs/static/mb/projects/karel/eyes.png b/docs/static/mb/projects/karel/eyes.png deleted file mode 100644 index c370a6097..000000000 Binary files a/docs/static/mb/projects/karel/eyes.png and /dev/null differ diff --git a/docs/static/mb/projects/karel/hi.png b/docs/static/mb/projects/karel/hi.png deleted file mode 100644 index ec50768b7..000000000 Binary files a/docs/static/mb/projects/karel/hi.png and /dev/null differ diff --git a/docs/static/mb/projects/karel/right-turn.png b/docs/static/mb/projects/karel/right-turn.png deleted file mode 100644 index 4c6c9eac4..000000000 Binary files a/docs/static/mb/projects/karel/right-turn.png and /dev/null differ diff --git a/docs/static/mb/projects/karel/smile.png b/docs/static/mb/projects/karel/smile.png deleted file mode 100644 index 18148d68e..000000000 Binary files a/docs/static/mb/projects/karel/smile.png and /dev/null differ diff --git a/docs/static/mb/projects/karel/spiral.png b/docs/static/mb/projects/karel/spiral.png deleted file mode 100644 index b171b894c..000000000 Binary files a/docs/static/mb/projects/karel/spiral.png and /dev/null differ diff --git a/docs/static/mb/projects/level.png b/docs/static/mb/projects/level.png deleted file mode 100644 index 19adbfcbd..000000000 Binary files a/docs/static/mb/projects/level.png and /dev/null differ diff --git a/docs/static/mb/projects/light-level-meter.png b/docs/static/mb/projects/light-level-meter.png deleted file mode 100644 index 26a8515fe..000000000 Binary files a/docs/static/mb/projects/light-level-meter.png and /dev/null differ diff --git a/docs/static/mb/projects/love-meter/love-meter.gif b/docs/static/mb/projects/love-meter/love-meter.gif deleted file mode 100644 index c50634963..000000000 Binary files a/docs/static/mb/projects/love-meter/love-meter.gif and /dev/null differ diff --git a/docs/static/mb/projects/magic-button-trick.png b/docs/static/mb/projects/magic-button-trick.png deleted file mode 100644 index 6e19d321a..000000000 Binary files a/docs/static/mb/projects/magic-button-trick.png and /dev/null differ diff --git a/docs/static/mb/projects/magic-button-trick/magnets.jpg b/docs/static/mb/projects/magic-button-trick/magnets.jpg deleted file mode 100644 index 4b146befc..000000000 Binary files a/docs/static/mb/projects/magic-button-trick/magnets.jpg and /dev/null differ diff --git a/docs/static/mb/projects/micro-coin.png b/docs/static/mb/projects/micro-coin.png deleted file mode 100644 index 2219ef13d..000000000 Binary files a/docs/static/mb/projects/micro-coin.png and /dev/null differ diff --git a/docs/static/mb/projects/micro-coin/coinbank.png b/docs/static/mb/projects/micro-coin/coinbank.png deleted file mode 100644 index 2ff10f054..000000000 Binary files a/docs/static/mb/projects/micro-coin/coinbank.png and /dev/null differ diff --git a/docs/static/mb/projects/milk-carton-robot.jpg b/docs/static/mb/projects/milk-carton-robot.jpg deleted file mode 100644 index b2e3dfcb9..000000000 Binary files a/docs/static/mb/projects/milk-carton-robot.jpg and /dev/null differ diff --git a/docs/static/mb/projects/milk-carton-robot/make.jpg b/docs/static/mb/projects/milk-carton-robot/make.jpg deleted file mode 100644 index 0a4fc6d98..000000000 Binary files a/docs/static/mb/projects/milk-carton-robot/make.jpg and /dev/null differ diff --git a/docs/static/mb/projects/milk-carton-robot/materials.jpg b/docs/static/mb/projects/milk-carton-robot/materials.jpg deleted file mode 100644 index 139d8961f..000000000 Binary files a/docs/static/mb/projects/milk-carton-robot/materials.jpg and /dev/null differ diff --git a/docs/static/mb/projects/milky-monster.jpg b/docs/static/mb/projects/milky-monster.jpg deleted file mode 100644 index 42026d8cb..000000000 Binary files a/docs/static/mb/projects/milky-monster.jpg and /dev/null differ diff --git a/docs/static/mb/projects/milky-monster/cliptoservo.jpg b/docs/static/mb/projects/milky-monster/cliptoservo.jpg deleted file mode 100644 index f3fd27985..000000000 Binary files a/docs/static/mb/projects/milky-monster/cliptoservo.jpg and /dev/null differ diff --git a/docs/static/mb/projects/milky-monster/connectcord.jpg b/docs/static/mb/projects/milky-monster/connectcord.jpg deleted file mode 100644 index b3f7380e4..000000000 Binary files a/docs/static/mb/projects/milky-monster/connectcord.jpg and /dev/null differ diff --git a/docs/static/mb/projects/milky-monster/connectmouth.jpg b/docs/static/mb/projects/milky-monster/connectmouth.jpg deleted file mode 100644 index 830e36f8c..000000000 Binary files a/docs/static/mb/projects/milky-monster/connectmouth.jpg and /dev/null differ diff --git a/docs/static/mb/projects/milky-monster/createspaceformicrobit.jpg b/docs/static/mb/projects/milky-monster/createspaceformicrobit.jpg deleted file mode 100644 index 0b02f7247..000000000 Binary files a/docs/static/mb/projects/milky-monster/createspaceformicrobit.jpg and /dev/null differ diff --git a/docs/static/mb/projects/milky-monster/cuttemplate.jpg b/docs/static/mb/projects/milky-monster/cuttemplate.jpg deleted file mode 100644 index 92d9736c4..000000000 Binary files a/docs/static/mb/projects/milky-monster/cuttemplate.jpg and /dev/null differ diff --git a/docs/static/mb/projects/milky-monster/glueservo.jpg b/docs/static/mb/projects/milky-monster/glueservo.jpg deleted file mode 100644 index 98c45e93b..000000000 Binary files a/docs/static/mb/projects/milky-monster/glueservo.jpg and /dev/null differ diff --git a/docs/static/mb/projects/milky-monster/gluetemplate.jpg b/docs/static/mb/projects/milky-monster/gluetemplate.jpg deleted file mode 100644 index 56b49b7d2..000000000 Binary files a/docs/static/mb/projects/milky-monster/gluetemplate.jpg and /dev/null differ diff --git a/docs/static/mb/projects/milky-monster/materials.jpg b/docs/static/mb/projects/milky-monster/materials.jpg deleted file mode 100644 index 69248bac5..000000000 Binary files a/docs/static/mb/projects/milky-monster/materials.jpg and /dev/null differ diff --git a/docs/static/mb/projects/milky-monster/monsters.jpg b/docs/static/mb/projects/milky-monster/monsters.jpg deleted file mode 100644 index 704f2b5b6..000000000 Binary files a/docs/static/mb/projects/milky-monster/monsters.jpg and /dev/null differ diff --git a/docs/static/mb/projects/milky-monster/ready.jpg b/docs/static/mb/projects/milky-monster/ready.jpg deleted file mode 100644 index 2adc104e0..000000000 Binary files a/docs/static/mb/projects/milky-monster/ready.jpg and /dev/null differ diff --git a/docs/static/mb/projects/milky-monster/template.pdf b/docs/static/mb/projects/milky-monster/template.pdf deleted file mode 100644 index 79ae8fdb5..000000000 Binary files a/docs/static/mb/projects/milky-monster/template.pdf and /dev/null differ diff --git a/docs/static/mb/projects/mood-radio.png b/docs/static/mb/projects/mood-radio.png deleted file mode 100644 index d64ef7926..000000000 Binary files a/docs/static/mb/projects/mood-radio.png and /dev/null differ diff --git a/docs/static/mb/projects/morse-chat.png b/docs/static/mb/projects/morse-chat.png deleted file mode 100644 index c769d402c..000000000 Binary files a/docs/static/mb/projects/morse-chat.png and /dev/null differ diff --git a/docs/static/mb/projects/multi-dice.png b/docs/static/mb/projects/multi-dice.png deleted file mode 100644 index ec5f11b53..000000000 Binary files a/docs/static/mb/projects/multi-dice.png and /dev/null differ diff --git a/docs/static/mb/projects/name-badge.png b/docs/static/mb/projects/name-badge.png deleted file mode 100644 index 97fb93691..000000000 Binary files a/docs/static/mb/projects/name-badge.png and /dev/null differ diff --git a/docs/static/mb/projects/name-badge/header.png b/docs/static/mb/projects/name-badge/header.png deleted file mode 100644 index 3d8dede22..000000000 Binary files a/docs/static/mb/projects/name-badge/header.png and /dev/null differ diff --git a/docs/static/mb/projects/name-badge/picture1.png b/docs/static/mb/projects/name-badge/picture1.png deleted file mode 100644 index 120dd908a..000000000 Binary files a/docs/static/mb/projects/name-badge/picture1.png and /dev/null differ diff --git a/docs/static/mb/projects/name-badge/picture2.png b/docs/static/mb/projects/name-badge/picture2.png deleted file mode 100644 index 9256ecd6f..000000000 Binary files a/docs/static/mb/projects/name-badge/picture2.png and /dev/null differ diff --git a/docs/static/mb/projects/name-badge/picture3.png b/docs/static/mb/projects/name-badge/picture3.png deleted file mode 100644 index c4138451e..000000000 Binary files a/docs/static/mb/projects/name-badge/picture3.png and /dev/null differ diff --git a/docs/static/mb/projects/name-badge/picture4.png b/docs/static/mb/projects/name-badge/picture4.png deleted file mode 100644 index 241dc0875..000000000 Binary files a/docs/static/mb/projects/name-badge/picture4.png and /dev/null differ diff --git a/docs/static/mb/projects/name-badge/picture5.png b/docs/static/mb/projects/name-badge/picture5.png deleted file mode 100644 index 0baa51543..000000000 Binary files a/docs/static/mb/projects/name-badge/picture5.png and /dev/null differ diff --git a/docs/static/mb/projects/name-badge/picture6.png b/docs/static/mb/projects/name-badge/picture6.png deleted file mode 100644 index ae16d6c7d..000000000 Binary files a/docs/static/mb/projects/name-badge/picture6.png and /dev/null differ diff --git a/docs/static/mb/projects/name-badge/picture7.png b/docs/static/mb/projects/name-badge/picture7.png deleted file mode 100644 index 6e759577f..000000000 Binary files a/docs/static/mb/projects/name-badge/picture7.png and /dev/null differ diff --git a/docs/static/mb/projects/name-badge/picture8.png b/docs/static/mb/projects/name-badge/picture8.png deleted file mode 100644 index 47648d8a3..000000000 Binary files a/docs/static/mb/projects/name-badge/picture8.png and /dev/null differ diff --git a/docs/static/mb/projects/name-badge/picture9.png b/docs/static/mb/projects/name-badge/picture9.png deleted file mode 100644 index 9b77ff9a4..000000000 Binary files a/docs/static/mb/projects/name-badge/picture9.png and /dev/null differ diff --git a/docs/static/mb/projects/name-tag.png b/docs/static/mb/projects/name-tag.png deleted file mode 100644 index e03f64a98..000000000 Binary files a/docs/static/mb/projects/name-tag.png and /dev/null differ diff --git a/docs/static/mb/projects/name-tag/name-tag.gif b/docs/static/mb/projects/name-tag/name-tag.gif deleted file mode 100644 index 6034b9be2..000000000 Binary files a/docs/static/mb/projects/name-tag/name-tag.gif and /dev/null differ diff --git a/docs/static/mb/projects/octobot.jpg b/docs/static/mb/projects/octobot.jpg deleted file mode 100644 index 8d360b0ea..000000000 Binary files a/docs/static/mb/projects/octobot.jpg and /dev/null differ diff --git a/docs/static/mb/projects/pet-hamster.png b/docs/static/mb/projects/pet-hamster.png deleted file mode 100644 index 4afc8f359..000000000 Binary files a/docs/static/mb/projects/pet-hamster.png and /dev/null differ diff --git a/docs/static/mb/projects/plant-watering/make.jpg b/docs/static/mb/projects/plant-watering/make.jpg deleted file mode 100644 index e6d8e433b..000000000 Binary files a/docs/static/mb/projects/plant-watering/make.jpg and /dev/null differ diff --git a/docs/static/mb/projects/plantwatering.jpg b/docs/static/mb/projects/plantwatering.jpg deleted file mode 100644 index a4db332fa..000000000 Binary files a/docs/static/mb/projects/plantwatering.jpg and /dev/null differ diff --git a/docs/static/mb/projects/plot-acceleration.png b/docs/static/mb/projects/plot-acceleration.png deleted file mode 100644 index 6c5df7122..000000000 Binary files a/docs/static/mb/projects/plot-acceleration.png and /dev/null differ diff --git a/docs/static/mb/projects/puma-rs-computer-shoe/calibrate-sheet.gif b/docs/static/mb/projects/puma-rs-computer-shoe/calibrate-sheet.gif deleted file mode 100644 index 9e91c2ec0..000000000 Binary files a/docs/static/mb/projects/puma-rs-computer-shoe/calibrate-sheet.gif and /dev/null differ diff --git a/docs/static/mb/projects/puma-rs-computer-shoe/packaging.gif b/docs/static/mb/projects/puma-rs-computer-shoe/packaging.gif deleted file mode 100644 index 7d8045826..000000000 Binary files a/docs/static/mb/projects/puma-rs-computer-shoe/packaging.gif and /dev/null differ diff --git a/docs/static/mb/projects/puma-rs-computer-shoe/packaging.mp4 b/docs/static/mb/projects/puma-rs-computer-shoe/packaging.mp4 deleted file mode 100644 index 021cd5b61..000000000 Binary files a/docs/static/mb/projects/puma-rs-computer-shoe/packaging.mp4 and /dev/null differ diff --git a/docs/static/mb/projects/puma-rs-computer-shoe/patent.pdf b/docs/static/mb/projects/puma-rs-computer-shoe/patent.pdf deleted file mode 100644 index 71fcda7be..000000000 Binary files a/docs/static/mb/projects/puma-rs-computer-shoe/patent.pdf and /dev/null differ diff --git a/docs/static/mb/projects/puma-rs-computer-shoe/physics.png b/docs/static/mb/projects/puma-rs-computer-shoe/physics.png deleted file mode 100644 index 720b53794..000000000 Binary files a/docs/static/mb/projects/puma-rs-computer-shoe/physics.png and /dev/null differ diff --git a/docs/static/mb/projects/puma-rs-computer-shoe/puma.png b/docs/static/mb/projects/puma-rs-computer-shoe/puma.png deleted file mode 100644 index 4a72eb53d..000000000 Binary files a/docs/static/mb/projects/puma-rs-computer-shoe/puma.png and /dev/null differ diff --git a/docs/static/mb/projects/puma-rs-computer-shoe/uspatent.png b/docs/static/mb/projects/puma-rs-computer-shoe/uspatent.png deleted file mode 100644 index 2cc3108f8..000000000 Binary files a/docs/static/mb/projects/puma-rs-computer-shoe/uspatent.png and /dev/null differ diff --git a/docs/static/mb/projects/radio-bridge.png b/docs/static/mb/projects/radio-bridge.png deleted file mode 100644 index 8d6f9428c..000000000 Binary files a/docs/static/mb/projects/radio-bridge.png and /dev/null differ diff --git a/docs/static/mb/projects/railway-crossing.png b/docs/static/mb/projects/railway-crossing.png deleted file mode 100644 index f5621352f..000000000 Binary files a/docs/static/mb/projects/railway-crossing.png and /dev/null differ diff --git a/docs/static/mb/projects/railway-crossing/railway-crossing-action.png b/docs/static/mb/projects/railway-crossing/railway-crossing-action.png deleted file mode 100644 index d4b445710..000000000 Binary files a/docs/static/mb/projects/railway-crossing/railway-crossing-action.png and /dev/null differ diff --git a/docs/static/mb/projects/railway-crossing/railway-crossing-with-servo.jpg b/docs/static/mb/projects/railway-crossing/railway-crossing-with-servo.jpg deleted file mode 100644 index 2c5aeccda..000000000 Binary files a/docs/static/mb/projects/railway-crossing/railway-crossing-with-servo.jpg and /dev/null differ diff --git a/docs/static/mb/projects/railway-crossing/railway-crossing.png b/docs/static/mb/projects/railway-crossing/railway-crossing.png deleted file mode 100644 index 88973e5a6..000000000 Binary files a/docs/static/mb/projects/railway-crossing/railway-crossing.png and /dev/null differ diff --git a/docs/static/mb/projects/rc-car.jpg b/docs/static/mb/projects/rc-car.jpg deleted file mode 100644 index 22b044e10..000000000 Binary files a/docs/static/mb/projects/rc-car.jpg and /dev/null differ diff --git a/docs/static/mb/projects/rc-car/backdrivetrain.jpg b/docs/static/mb/projects/rc-car/backdrivetrain.jpg deleted file mode 100644 index 1e08c4247..000000000 Binary files a/docs/static/mb/projects/rc-car/backdrivetrain.jpg and /dev/null differ diff --git a/docs/static/mb/projects/rc-car/cables.jpg b/docs/static/mb/projects/rc-car/cables.jpg deleted file mode 100644 index 13f9a40cd..000000000 Binary files a/docs/static/mb/projects/rc-car/cables.jpg and /dev/null differ diff --git a/docs/static/mb/projects/rc-car/cutout.jpg b/docs/static/mb/projects/rc-car/cutout.jpg deleted file mode 100644 index 23730dc15..000000000 Binary files a/docs/static/mb/projects/rc-car/cutout.jpg and /dev/null differ diff --git a/docs/static/mb/projects/rc-car/elecremoved.jpg b/docs/static/mb/projects/rc-car/elecremoved.jpg deleted file mode 100644 index aa2f958cc..000000000 Binary files a/docs/static/mb/projects/rc-car/elecremoved.jpg and /dev/null differ diff --git a/docs/static/mb/projects/rc-car/frontdrivetrain.jpg b/docs/static/mb/projects/rc-car/frontdrivetrain.jpg deleted file mode 100644 index 9e218983e..000000000 Binary files a/docs/static/mb/projects/rc-car/frontdrivetrain.jpg and /dev/null differ diff --git a/docs/static/mb/projects/rc-car/painted.jpg b/docs/static/mb/projects/rc-car/painted.jpg deleted file mode 100644 index cfdf4d024..000000000 Binary files a/docs/static/mb/projects/rc-car/painted.jpg and /dev/null differ diff --git a/docs/static/mb/projects/rc-car/project.jpg b/docs/static/mb/projects/rc-car/project.jpg deleted file mode 100644 index cb84f67da..000000000 Binary files a/docs/static/mb/projects/rc-car/project.jpg and /dev/null differ diff --git a/docs/static/mb/projects/rc-car/rccar.jpg b/docs/static/mb/projects/rc-car/rccar.jpg deleted file mode 100644 index 14d51455a..000000000 Binary files a/docs/static/mb/projects/rc-car/rccar.jpg and /dev/null differ diff --git a/docs/static/mb/projects/rc-car/stripped.jpg b/docs/static/mb/projects/rc-car/stripped.jpg deleted file mode 100644 index dd5023804..000000000 Binary files a/docs/static/mb/projects/rc-car/stripped.jpg and /dev/null differ diff --git a/docs/static/mb/projects/rc-car/wiring.jpg b/docs/static/mb/projects/rc-car/wiring.jpg deleted file mode 100644 index 8bfd195d9..000000000 Binary files a/docs/static/mb/projects/rc-car/wiring.jpg and /dev/null differ diff --git a/docs/static/mb/projects/reaction.jpg b/docs/static/mb/projects/reaction.jpg deleted file mode 100644 index 5c476ece3..000000000 Binary files a/docs/static/mb/projects/reaction.jpg and /dev/null differ diff --git a/docs/static/mb/projects/red-light-green-light.png b/docs/static/mb/projects/red-light-green-light.png deleted file mode 100644 index 38953c4a2..000000000 Binary files a/docs/static/mb/projects/red-light-green-light.png and /dev/null differ diff --git a/docs/static/mb/projects/robot-unicorn/microbitsunicorn.jpg b/docs/static/mb/projects/robot-unicorn/microbitsunicorn.jpg deleted file mode 100644 index 01814d15e..000000000 Binary files a/docs/static/mb/projects/robot-unicorn/microbitsunicorn.jpg and /dev/null differ diff --git a/docs/static/mb/projects/robot-unicorn/robotunicorn.jpg b/docs/static/mb/projects/robot-unicorn/robotunicorn.jpg deleted file mode 100644 index 0299b8510..000000000 Binary files a/docs/static/mb/projects/robot-unicorn/robotunicorn.jpg and /dev/null differ diff --git a/docs/static/mb/projects/robot-unicorn/robotunicorntail.jpg b/docs/static/mb/projects/robot-unicorn/robotunicorntail.jpg deleted file mode 100644 index bbaa8d62e..000000000 Binary files a/docs/static/mb/projects/robot-unicorn/robotunicorntail.jpg and /dev/null differ diff --git a/docs/static/mb/projects/rock-paper-scissors/hand.jpg b/docs/static/mb/projects/rock-paper-scissors/hand.jpg deleted file mode 100644 index 094573705..000000000 Binary files a/docs/static/mb/projects/rock-paper-scissors/hand.jpg and /dev/null differ diff --git a/docs/static/mb/projects/rock-paper-scissors/if.gif b/docs/static/mb/projects/rock-paper-scissors/if.gif deleted file mode 100644 index 81806d913..000000000 Binary files a/docs/static/mb/projects/rock-paper-scissors/if.gif and /dev/null differ diff --git a/docs/static/mb/projects/rock-paper-scissors/ifelse.gif b/docs/static/mb/projects/rock-paper-scissors/ifelse.gif deleted file mode 100644 index 45e0bf8d4..000000000 Binary files a/docs/static/mb/projects/rock-paper-scissors/ifelse.gif and /dev/null differ diff --git a/docs/static/mb/projects/rock-paper-scissors/ifelseif.gif b/docs/static/mb/projects/rock-paper-scissors/ifelseif.gif deleted file mode 100644 index ec4b0123b..000000000 Binary files a/docs/static/mb/projects/rock-paper-scissors/ifelseif.gif and /dev/null differ diff --git a/docs/static/mb/projects/rock-paper-scissors/newvar.gif b/docs/static/mb/projects/rock-paper-scissors/newvar.gif deleted file mode 100644 index 10fe02f33..000000000 Binary files a/docs/static/mb/projects/rock-paper-scissors/newvar.gif and /dev/null differ diff --git a/docs/static/mb/projects/rock-paper-scissors/rpsshake.gif b/docs/static/mb/projects/rock-paper-scissors/rpsshake.gif deleted file mode 100644 index d7328ac4c..000000000 Binary files a/docs/static/mb/projects/rock-paper-scissors/rpsshake.gif and /dev/null differ diff --git a/docs/static/mb/projects/rock-paper-scissors/rpssim3.gif b/docs/static/mb/projects/rock-paper-scissors/rpssim3.gif deleted file mode 100644 index 8c83c5c12..000000000 Binary files a/docs/static/mb/projects/rock-paper-scissors/rpssim3.gif and /dev/null differ diff --git a/docs/static/mb/projects/rotary-dial-radio.png b/docs/static/mb/projects/rotary-dial-radio.png deleted file mode 100644 index 9e1df0020..000000000 Binary files a/docs/static/mb/projects/rotary-dial-radio.png and /dev/null differ diff --git a/docs/static/mb/projects/rotary-dial-radio/final.jpg b/docs/static/mb/projects/rotary-dial-radio/final.jpg deleted file mode 100644 index 2a2ab2dbd..000000000 Binary files a/docs/static/mb/projects/rotary-dial-radio/final.jpg and /dev/null differ diff --git a/docs/static/mb/projects/rotary-dial-radio/guts.jpg b/docs/static/mb/projects/rotary-dial-radio/guts.jpg deleted file mode 100644 index 463f818a9..000000000 Binary files a/docs/static/mb/projects/rotary-dial-radio/guts.jpg and /dev/null differ diff --git a/docs/static/mb/projects/rotary-dial-radio/oldphone.jpg b/docs/static/mb/projects/rotary-dial-radio/oldphone.jpg deleted file mode 100644 index be98a9788..000000000 Binary files a/docs/static/mb/projects/rotary-dial-radio/oldphone.jpg and /dev/null differ diff --git a/docs/static/mb/projects/rotary-dial-radio/wired.jpg b/docs/static/mb/projects/rotary-dial-radio/wired.jpg deleted file mode 100644 index 19a5d2524..000000000 Binary files a/docs/static/mb/projects/rotary-dial-radio/wired.jpg and /dev/null differ diff --git a/docs/static/mb/projects/rpsteams.png b/docs/static/mb/projects/rpsteams.png deleted file mode 100644 index 2218a1e22..000000000 Binary files a/docs/static/mb/projects/rpsteams.png and /dev/null differ diff --git a/docs/static/mb/projects/salute.png b/docs/static/mb/projects/salute.png deleted file mode 100644 index 8dbe4892a..000000000 Binary files a/docs/static/mb/projects/salute.png and /dev/null differ diff --git a/docs/static/mb/projects/servo-calibrator.png b/docs/static/mb/projects/servo-calibrator.png deleted file mode 100644 index bf3adc67d..000000000 Binary files a/docs/static/mb/projects/servo-calibrator.png and /dev/null differ diff --git a/docs/static/mb/projects/smiley-buttons/sim.gif b/docs/static/mb/projects/smiley-buttons/sim.gif deleted file mode 100644 index ba19dc53d..000000000 Binary files a/docs/static/mb/projects/smiley-buttons/sim.gif and /dev/null differ diff --git a/docs/static/mb/projects/smiley-buttons/smiley-buttons.gif b/docs/static/mb/projects/smiley-buttons/smiley-buttons.gif deleted file mode 100644 index ba19dc53d..000000000 Binary files a/docs/static/mb/projects/smiley-buttons/smiley-buttons.gif and /dev/null differ diff --git a/docs/static/mb/projects/snap-the-dot.png b/docs/static/mb/projects/snap-the-dot.png deleted file mode 100644 index acf9073a1..000000000 Binary files a/docs/static/mb/projects/snap-the-dot.png and /dev/null differ diff --git a/docs/static/mb/projects/soil-moisture/nailsp1.jpg b/docs/static/mb/projects/soil-moisture/nailsp1.jpg deleted file mode 100644 index bb0ece9bd..000000000 Binary files a/docs/static/mb/projects/soil-moisture/nailsp1.jpg and /dev/null differ diff --git a/docs/static/mb/projects/soil-moisture/nailsv3.jpg b/docs/static/mb/projects/soil-moisture/nailsv3.jpg deleted file mode 100644 index 3a0e3634d..000000000 Binary files a/docs/static/mb/projects/soil-moisture/nailsv3.jpg and /dev/null differ diff --git a/docs/static/mb/projects/soil-moisture/soil-moisture.jpg b/docs/static/mb/projects/soil-moisture/soil-moisture.jpg deleted file mode 100644 index 3fbfadd20..000000000 Binary files a/docs/static/mb/projects/soil-moisture/soil-moisture.jpg and /dev/null differ diff --git a/docs/static/mb/projects/soilmoisture.jpg b/docs/static/mb/projects/soilmoisture.jpg deleted file mode 100644 index b92498c1c..000000000 Binary files a/docs/static/mb/projects/soilmoisture.jpg and /dev/null differ diff --git a/docs/static/mb/projects/som.jpg b/docs/static/mb/projects/som.jpg deleted file mode 100644 index 927b5b978..000000000 Binary files a/docs/static/mb/projects/som.jpg and /dev/null differ diff --git a/docs/static/mb/projects/step-counter.png b/docs/static/mb/projects/step-counter.png deleted file mode 100644 index 9454f9aab..000000000 Binary files a/docs/static/mb/projects/step-counter.png and /dev/null differ diff --git a/docs/static/mb/projects/stopwatch.png b/docs/static/mb/projects/stopwatch.png deleted file mode 100644 index 08f4dfd75..000000000 Binary files a/docs/static/mb/projects/stopwatch.png and /dev/null differ diff --git a/docs/static/mb/projects/tele-potato.png b/docs/static/mb/projects/tele-potato.png deleted file mode 100644 index bc064d391..000000000 Binary files a/docs/static/mb/projects/tele-potato.png and /dev/null differ diff --git a/docs/static/mb/projects/tele-potato/model.jpg b/docs/static/mb/projects/tele-potato/model.jpg deleted file mode 100644 index f5f63932d..000000000 Binary files a/docs/static/mb/projects/tele-potato/model.jpg and /dev/null differ diff --git a/docs/static/mb/projects/tele-potato/radio-potato.jpg b/docs/static/mb/projects/tele-potato/radio-potato.jpg deleted file mode 100644 index 99a3e216c..000000000 Binary files a/docs/static/mb/projects/tele-potato/radio-potato.jpg and /dev/null differ diff --git a/docs/static/mb/projects/ticklebot.jpg b/docs/static/mb/projects/ticklebot.jpg deleted file mode 100644 index 8079e12ec..000000000 Binary files a/docs/static/mb/projects/ticklebot.jpg and /dev/null differ diff --git a/docs/static/mb/projects/timegate.jpg b/docs/static/mb/projects/timegate.jpg deleted file mode 100644 index ca012263c..000000000 Binary files a/docs/static/mb/projects/timegate.jpg and /dev/null differ diff --git a/docs/static/mb/projects/timing-gates/carfoil.jpg b/docs/static/mb/projects/timing-gates/carfoil.jpg deleted file mode 100644 index 6365abfd6..000000000 Binary files a/docs/static/mb/projects/timing-gates/carfoil.jpg and /dev/null differ diff --git a/docs/static/mb/projects/timing-gates/connectcrocs.jpg b/docs/static/mb/projects/timing-gates/connectcrocs.jpg deleted file mode 100644 index 69eec45d8..000000000 Binary files a/docs/static/mb/projects/timing-gates/connectcrocs.jpg and /dev/null differ diff --git a/docs/static/mb/projects/timing-gates/connectsensor.jpg b/docs/static/mb/projects/timing-gates/connectsensor.jpg deleted file mode 100644 index 637a0b0be..000000000 Binary files a/docs/static/mb/projects/timing-gates/connectsensor.jpg and /dev/null differ diff --git a/docs/static/mb/projects/timing-gates/materials.jpg b/docs/static/mb/projects/timing-gates/materials.jpg deleted file mode 100644 index b2c22a274..000000000 Binary files a/docs/static/mb/projects/timing-gates/materials.jpg and /dev/null differ diff --git a/docs/static/mb/projects/timing-gates/sensor2.jpg b/docs/static/mb/projects/timing-gates/sensor2.jpg deleted file mode 100644 index 2a27a5ef4..000000000 Binary files a/docs/static/mb/projects/timing-gates/sensor2.jpg and /dev/null differ diff --git a/docs/static/mb/projects/timing-gates/sensordone.jpg b/docs/static/mb/projects/timing-gates/sensordone.jpg deleted file mode 100644 index 519dc0b24..000000000 Binary files a/docs/static/mb/projects/timing-gates/sensordone.jpg and /dev/null differ diff --git a/docs/static/mb/projects/timing-gates/sensormicrobit2.jpg b/docs/static/mb/projects/timing-gates/sensormicrobit2.jpg deleted file mode 100644 index d95c33fc2..000000000 Binary files a/docs/static/mb/projects/timing-gates/sensormicrobit2.jpg and /dev/null differ diff --git a/docs/static/mb/projects/timing-gates/sketchgate1.jpg b/docs/static/mb/projects/timing-gates/sketchgate1.jpg deleted file mode 100644 index 9c8415772..000000000 Binary files a/docs/static/mb/projects/timing-gates/sketchgate1.jpg and /dev/null differ diff --git a/docs/static/mb/projects/timing-gates/sketchgate2.jpg b/docs/static/mb/projects/timing-gates/sketchgate2.jpg deleted file mode 100644 index 5b9878f9f..000000000 Binary files a/docs/static/mb/projects/timing-gates/sketchgate2.jpg and /dev/null differ diff --git a/docs/static/mb/projects/timing-gates/sketchgates.jpg b/docs/static/mb/projects/timing-gates/sketchgates.jpg deleted file mode 100644 index 7e8383e6f..000000000 Binary files a/docs/static/mb/projects/timing-gates/sketchgates.jpg and /dev/null differ diff --git a/docs/static/mb/projects/timing-gates/sketchmath.jpg b/docs/static/mb/projects/timing-gates/sketchmath.jpg deleted file mode 100644 index 947d12360..000000000 Binary files a/docs/static/mb/projects/timing-gates/sketchmath.jpg and /dev/null differ diff --git a/docs/static/mb/projects/timing-gates/spreadfoil.jpg b/docs/static/mb/projects/timing-gates/spreadfoil.jpg deleted file mode 100644 index 2e4042c30..000000000 Binary files a/docs/static/mb/projects/timing-gates/spreadfoil.jpg and /dev/null differ diff --git a/docs/static/mb/projects/timing-gates/stickfoil.jpg b/docs/static/mb/projects/timing-gates/stickfoil.jpg deleted file mode 100644 index 001eb38e0..000000000 Binary files a/docs/static/mb/projects/timing-gates/stickfoil.jpg and /dev/null differ diff --git a/docs/static/mb/projects/timing-gates/tape.jpg b/docs/static/mb/projects/timing-gates/tape.jpg deleted file mode 100644 index ea5449afb..000000000 Binary files a/docs/static/mb/projects/timing-gates/tape.jpg and /dev/null differ diff --git a/docs/static/mb/projects/tug-of-led.png b/docs/static/mb/projects/tug-of-led.png deleted file mode 100644 index 58e84193e..000000000 Binary files a/docs/static/mb/projects/tug-of-led.png and /dev/null differ diff --git a/docs/static/mb/projects/turtle-scanner.png b/docs/static/mb/projects/turtle-scanner.png deleted file mode 100644 index 7c2c72e89..000000000 Binary files a/docs/static/mb/projects/turtle-scanner.png and /dev/null differ diff --git a/docs/static/mb/projects/turtle-spiral.png b/docs/static/mb/projects/turtle-spiral.png deleted file mode 100644 index 8cacf4464..000000000 Binary files a/docs/static/mb/projects/turtle-spiral.png and /dev/null differ diff --git a/docs/static/mb/projects/turtle-square.png b/docs/static/mb/projects/turtle-square.png deleted file mode 100644 index c2d0656df..000000000 Binary files a/docs/static/mb/projects/turtle-square.png and /dev/null differ diff --git a/docs/static/mb/projects/twoplayermaze.jpg b/docs/static/mb/projects/twoplayermaze.jpg deleted file mode 100644 index 356a0f116..000000000 Binary files a/docs/static/mb/projects/twoplayermaze.jpg and /dev/null differ diff --git a/docs/static/mb/projects/voting-machine.png b/docs/static/mb/projects/voting-machine.png deleted file mode 100644 index c35aa054c..000000000 Binary files a/docs/static/mb/projects/voting-machine.png and /dev/null differ diff --git a/docs/static/mb/projects/wallet.png b/docs/static/mb/projects/wallet.png deleted file mode 100644 index 02f34ed79..000000000 Binary files a/docs/static/mb/projects/wallet.png and /dev/null differ diff --git a/docs/static/mb/projects/wallet/fold1.jpg b/docs/static/mb/projects/wallet/fold1.jpg deleted file mode 100644 index ac54a1c3a..000000000 Binary files a/docs/static/mb/projects/wallet/fold1.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/fold2.jpg b/docs/static/mb/projects/wallet/fold2.jpg deleted file mode 100644 index caeab3aaf..000000000 Binary files a/docs/static/mb/projects/wallet/fold2.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/fold3.jpg b/docs/static/mb/projects/wallet/fold3.jpg deleted file mode 100644 index 75bbe52f4..000000000 Binary files a/docs/static/mb/projects/wallet/fold3.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/fold4.jpg b/docs/static/mb/projects/wallet/fold4.jpg deleted file mode 100644 index 69db16eb9..000000000 Binary files a/docs/static/mb/projects/wallet/fold4.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/fold5.jpg b/docs/static/mb/projects/wallet/fold5.jpg deleted file mode 100644 index d85aa2ec0..000000000 Binary files a/docs/static/mb/projects/wallet/fold5.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/fold6.jpg b/docs/static/mb/projects/wallet/fold6.jpg deleted file mode 100644 index 0bc5e64ae..000000000 Binary files a/docs/static/mb/projects/wallet/fold6.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/fold7.jpg b/docs/static/mb/projects/wallet/fold7.jpg deleted file mode 100644 index 8472a7f8f..000000000 Binary files a/docs/static/mb/projects/wallet/fold7.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/hole1.jpg b/docs/static/mb/projects/wallet/hole1.jpg deleted file mode 100644 index 261848b33..000000000 Binary files a/docs/static/mb/projects/wallet/hole1.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/hole2.jpg b/docs/static/mb/projects/wallet/hole2.jpg deleted file mode 100644 index 1bfd33c21..000000000 Binary files a/docs/static/mb/projects/wallet/hole2.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/hole3.jpg b/docs/static/mb/projects/wallet/hole3.jpg deleted file mode 100644 index 863efdf10..000000000 Binary files a/docs/static/mb/projects/wallet/hole3.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/hole4.jpg b/docs/static/mb/projects/wallet/hole4.jpg deleted file mode 100644 index 15523a21b..000000000 Binary files a/docs/static/mb/projects/wallet/hole4.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/hole5.jpg b/docs/static/mb/projects/wallet/hole5.jpg deleted file mode 100644 index e3ec9aa44..000000000 Binary files a/docs/static/mb/projects/wallet/hole5.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/hole6.jpg b/docs/static/mb/projects/wallet/hole6.jpg deleted file mode 100644 index 322f09ab5..000000000 Binary files a/docs/static/mb/projects/wallet/hole6.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/materials.jpg b/docs/static/mb/projects/wallet/materials.jpg deleted file mode 100644 index 66d6702f7..000000000 Binary files a/docs/static/mb/projects/wallet/materials.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/mbhole1.jpg b/docs/static/mb/projects/wallet/mbhole1.jpg deleted file mode 100644 index 735715bb2..000000000 Binary files a/docs/static/mb/projects/wallet/mbhole1.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/mbhole10.jpg b/docs/static/mb/projects/wallet/mbhole10.jpg deleted file mode 100644 index e50e449bc..000000000 Binary files a/docs/static/mb/projects/wallet/mbhole10.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/mbhole11.jpg b/docs/static/mb/projects/wallet/mbhole11.jpg deleted file mode 100644 index 1b7db863e..000000000 Binary files a/docs/static/mb/projects/wallet/mbhole11.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/mbhole12.jpg b/docs/static/mb/projects/wallet/mbhole12.jpg deleted file mode 100644 index 4e1b1aabb..000000000 Binary files a/docs/static/mb/projects/wallet/mbhole12.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/mbhole13.jpg b/docs/static/mb/projects/wallet/mbhole13.jpg deleted file mode 100644 index e85a2c421..000000000 Binary files a/docs/static/mb/projects/wallet/mbhole13.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/mbhole14.jpg b/docs/static/mb/projects/wallet/mbhole14.jpg deleted file mode 100644 index 9118ad4ea..000000000 Binary files a/docs/static/mb/projects/wallet/mbhole14.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/mbhole2.jpg b/docs/static/mb/projects/wallet/mbhole2.jpg deleted file mode 100644 index 7f969653b..000000000 Binary files a/docs/static/mb/projects/wallet/mbhole2.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/mbhole3.jpg b/docs/static/mb/projects/wallet/mbhole3.jpg deleted file mode 100644 index f99cdf3b7..000000000 Binary files a/docs/static/mb/projects/wallet/mbhole3.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/mbhole4.jpg b/docs/static/mb/projects/wallet/mbhole4.jpg deleted file mode 100644 index 9fe28a8dc..000000000 Binary files a/docs/static/mb/projects/wallet/mbhole4.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/mbhole5.jpg b/docs/static/mb/projects/wallet/mbhole5.jpg deleted file mode 100644 index 69dd71597..000000000 Binary files a/docs/static/mb/projects/wallet/mbhole5.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/mbhole6.jpg b/docs/static/mb/projects/wallet/mbhole6.jpg deleted file mode 100644 index 35f03fbba..000000000 Binary files a/docs/static/mb/projects/wallet/mbhole6.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/mbhole7.jpg b/docs/static/mb/projects/wallet/mbhole7.jpg deleted file mode 100644 index 5da858742..000000000 Binary files a/docs/static/mb/projects/wallet/mbhole7.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/mbhole8.jpg b/docs/static/mb/projects/wallet/mbhole8.jpg deleted file mode 100644 index 2aeca562c..000000000 Binary files a/docs/static/mb/projects/wallet/mbhole8.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/mbhole9.jpg b/docs/static/mb/projects/wallet/mbhole9.jpg deleted file mode 100644 index 0befb9e3e..000000000 Binary files a/docs/static/mb/projects/wallet/mbhole9.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/rug1.jpg b/docs/static/mb/projects/wallet/rug1.jpg deleted file mode 100644 index ff0083f5e..000000000 Binary files a/docs/static/mb/projects/wallet/rug1.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/rug2.jpg b/docs/static/mb/projects/wallet/rug2.jpg deleted file mode 100644 index 930530627..000000000 Binary files a/docs/static/mb/projects/wallet/rug2.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/sheet1.jpg b/docs/static/mb/projects/wallet/sheet1.jpg deleted file mode 100644 index 805e995a0..000000000 Binary files a/docs/static/mb/projects/wallet/sheet1.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/sheet2.jpg b/docs/static/mb/projects/wallet/sheet2.jpg deleted file mode 100644 index 575527db8..000000000 Binary files a/docs/static/mb/projects/wallet/sheet2.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/sheet3.jpg b/docs/static/mb/projects/wallet/sheet3.jpg deleted file mode 100644 index c1759197b..000000000 Binary files a/docs/static/mb/projects/wallet/sheet3.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/sheet4.jpg b/docs/static/mb/projects/wallet/sheet4.jpg deleted file mode 100644 index 8092bb3a3..000000000 Binary files a/docs/static/mb/projects/wallet/sheet4.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/sheet5.jpg b/docs/static/mb/projects/wallet/sheet5.jpg deleted file mode 100644 index c373b61bf..000000000 Binary files a/docs/static/mb/projects/wallet/sheet5.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/sheet6.jpg b/docs/static/mb/projects/wallet/sheet6.jpg deleted file mode 100644 index bb6b45a0f..000000000 Binary files a/docs/static/mb/projects/wallet/sheet6.jpg and /dev/null differ diff --git a/docs/static/mb/projects/wallet/wallet.jpg b/docs/static/mb/projects/wallet/wallet.jpg deleted file mode 100644 index 714618d6f..000000000 Binary files a/docs/static/mb/projects/wallet/wallet.jpg and /dev/null differ diff --git a/docs/static/mb/quick-start-0.png b/docs/static/mb/quick-start-0.png deleted file mode 100644 index 223a9cecc..000000000 Binary files a/docs/static/mb/quick-start-0.png and /dev/null differ diff --git a/docs/static/mb/science-experiments/battery-tester.jpg b/docs/static/mb/science-experiments/battery-tester.jpg deleted file mode 100644 index bc44f3368..000000000 Binary files a/docs/static/mb/science-experiments/battery-tester.jpg and /dev/null differ diff --git a/docs/static/mb/science-experiments/data-collection.jpg b/docs/static/mb/science-experiments/data-collection.jpg deleted file mode 100644 index 73c4fc32f..000000000 Binary files a/docs/static/mb/science-experiments/data-collection.jpg and /dev/null differ diff --git a/docs/static/mb/science-experiments/egg-drop.jpg b/docs/static/mb/science-experiments/egg-drop.jpg deleted file mode 100644 index 70af283e8..000000000 Binary files a/docs/static/mb/science-experiments/egg-drop.jpg and /dev/null differ diff --git a/docs/static/mb/science-experiments/emg-muscle-sensor.jpg b/docs/static/mb/science-experiments/emg-muscle-sensor.jpg deleted file mode 100644 index bc90db9f7..000000000 Binary files a/docs/static/mb/science-experiments/emg-muscle-sensor.jpg and /dev/null differ diff --git a/docs/static/mb/science-experiments/population-trait.jpg b/docs/static/mb/science-experiments/population-trait.jpg deleted file mode 100644 index 672132fec..000000000 Binary files a/docs/static/mb/science-experiments/population-trait.jpg and /dev/null differ diff --git a/docs/static/mb/science-experiments/rocket-acceleration.jpg b/docs/static/mb/science-experiments/rocket-acceleration.jpg deleted file mode 100644 index b8f11bd2b..000000000 Binary files a/docs/static/mb/science-experiments/rocket-acceleration.jpg and /dev/null differ diff --git a/docs/static/mb/science-experiments/soil-moisture.jpg b/docs/static/mb/science-experiments/soil-moisture.jpg deleted file mode 100644 index 276ed772c..000000000 Binary files a/docs/static/mb/science-experiments/soil-moisture.jpg and /dev/null differ diff --git a/docs/static/mb/science-experiments/temperature-sensor.jpg b/docs/static/mb/science-experiments/temperature-sensor.jpg deleted file mode 100644 index dd8866cd4..000000000 Binary files a/docs/static/mb/science-experiments/temperature-sensor.jpg and /dev/null differ diff --git a/docs/static/mb/seismograph9.png b/docs/static/mb/seismograph9.png deleted file mode 100644 index 322fd6a46..000000000 Binary files a/docs/static/mb/seismograph9.png and /dev/null differ diff --git a/docs/static/mb/show-leds-1.png b/docs/static/mb/show-leds-1.png deleted file mode 100644 index f8ba3c121..000000000 Binary files a/docs/static/mb/show-leds-1.png and /dev/null differ diff --git a/docs/static/mb/translate/block-text.jpg b/docs/static/mb/translate/block-text.jpg deleted file mode 100644 index 548292480..000000000 Binary files a/docs/static/mb/translate/block-text.jpg and /dev/null differ diff --git a/docs/static/mb/translate/crowdin-folder.png b/docs/static/mb/translate/crowdin-folder.png deleted file mode 100644 index cd11d69a2..000000000 Binary files a/docs/static/mb/translate/crowdin-folder.png and /dev/null differ diff --git a/docs/static/mb/translate/doc-page.jpg b/docs/static/mb/translate/doc-page.jpg deleted file mode 100644 index f95f83cb2..000000000 Binary files a/docs/static/mb/translate/doc-page.jpg and /dev/null differ diff --git a/docs/static/mb/translate/libsfiles.png b/docs/static/mb/translate/libsfiles.png deleted file mode 100644 index 3005c6f58..000000000 Binary files a/docs/static/mb/translate/libsfiles.png and /dev/null differ diff --git a/docs/static/mb/translate/stringsfile.png b/docs/static/mb/translate/stringsfile.png deleted file mode 100644 index 45f03b23f..000000000 Binary files a/docs/static/mb/translate/stringsfile.png and /dev/null differ diff --git a/docs/static/mb/translate/target-strings.jpg b/docs/static/mb/translate/target-strings.jpg deleted file mode 100644 index 555b00b49..000000000 Binary files a/docs/static/mb/translate/target-strings.jpg and /dev/null differ diff --git a/docs/static/mb/translate/targetstringsfile.png b/docs/static/mb/translate/targetstringsfile.png deleted file mode 100644 index 9a3b58485..000000000 Binary files a/docs/static/mb/translate/targetstringsfile.png and /dev/null differ diff --git a/docs/static/mb/vscode.png b/docs/static/mb/vscode.png deleted file mode 100644 index 035686f8d..000000000 Binary files a/docs/static/mb/vscode.png and /dev/null differ diff --git a/docs/static/orglogowide.png b/docs/static/orglogowide.png new file mode 100644 index 000000000..9e1e13034 Binary files /dev/null and b/docs/static/orglogowide.png differ diff --git a/docs/static/packages/packageicon.svg b/docs/static/packages/packageicon.svg index db6374224..c65c2b367 100644 --- a/docs/static/packages/packageicon.svg +++ b/docs/static/packages/packageicon.svg @@ -17,7 +17,7 @@ height="176" viewBox="0 0 286 176" sodipodi:docname="packageicon.svg" - inkscape:export-filename="/Users/sammysam/Work/pxt-microbit/docs/static/hero.jpg" + inkscape:export-filename="/Users/sammysam/Work/pxt-microbit/docs/static/calliope/hero/hero.jpg" inkscape:export-xdpi="100.04" inkscape:export-ydpi="100.04"> -/// /// /// -/// +/// /// // import * as dialogs from "./dialogs"; import * as flash from "./flash"; diff --git a/editor/flash.ts b/editor/flash.ts index 65230fd76..b1c37aaa6 100644 --- a/editor/flash.ts +++ b/editor/flash.ts @@ -254,7 +254,7 @@ class DAPWrapper implements pxt.packetio.PacketIOWrapper { if (this.usesCODAL === undefined) console.warn('try to access codal information before it is computed') if (!this.usesCODAL) { - return ["logotouch", "builtinspeaker", "microphone", "flashlog"] + return ["logotouch", "flashlog"] } return []; } @@ -313,15 +313,15 @@ class DAPWrapper implements pxt.packetio.PacketIOWrapper { await this.io.reconnectAsync() + await this.clearCommandsAsync() + // halt before reading from dap // to avoid interference from data logger await this.cortexM.halt() - // before calling into dapjs, we use our dapCmdNums() a few times, which which will make sure the responses - // to commends from previous sessions (if any) are flushed - const info = await this.dapCmdNums(0x00, 0x04) // info - const daplinkVersion = stringResponse(info) - log(`daplink version: ${daplinkVersion}`) + const info = await this.getDaplinkVersionAsync(); // info + const daplinkVersion = stringResponse(info); + log(`daplink version: ${daplinkVersion}`); const r = await this.dapCmdNums(0x80) this.usesCODAL = r[2] == 57 && r[3] == 57 && r[5] >= 51; @@ -350,6 +350,20 @@ class DAPWrapper implements pxt.packetio.PacketIOWrapper { this.startReadSerial(connectionId) } + private async clearCommandsAsync() { + // before calling into dapjs, push through a few commands to make sure the responses + // to commands from previous sessions (if any) are flushed. Count of 5 is arbitrary. + for (let i = 0; i < 5; i++) { + try { + await this.getDaplinkVersionAsync(); + } catch (e) {} + } + } + + private async getDaplinkVersionAsync() { + return await this.dapCmdNums(0x00, 0x04); + } + private async checkStateAsync(resume?: boolean): Promise { const states = ["reset", "lockup", "sleeping", "halted", "running"] try { @@ -393,6 +407,7 @@ class DAPWrapper implements pxt.packetio.PacketIOWrapper { await this.io.reconnectAsync(); } + await this.clearCommandsAsync() await this.stopReadersAsync(); await this.cortexM.init(); await this.cortexM.reset(true); @@ -826,7 +841,7 @@ class DAPWrapper implements pxt.packetio.PacketIOWrapper { if (connectionId != this.connectionId) return; const info = await this.readBytes(xchg, 16) if (info[12 + 2] != 0xff) { - log("jacdac: invalid memory; try power-cycling the micro:bit") + log("jacdac: invalid memory; try power-cycling the Calliope mini") pxt.tickEvent("hid.flash.jacdac.error.invalidmemory"); console.debug({ info, xchg }) return diff --git a/editor/patch.ts b/editor/patch.ts index f00a645c9..0edb9133f 100644 --- a/editor/patch.ts +++ b/editor/patch.ts @@ -1,7 +1,98 @@ export function patchBlocks(pkgTargetVersion: string, dom: Element) { - // is this a old script? + if (pxt.semver.majorCmp(pkgTargetVersion || "0.0.0", "7.0.0") <= 0) { + // Variable pin param + /* + + DigitalPin.P0 + + + converts to + + + + + DigitalPin.P0 + + + + */ + pxt.U.toArray(dom.querySelectorAll("block[type=device_get_digital_pin]")) + .concat(pxt.U.toArray(dom.querySelectorAll("shadow[type=device_get_digital_pin]"))) + .concat(pxt.U.toArray(dom.querySelectorAll("block[type=device_set_digital_pin]"))) + .concat(pxt.U.toArray(dom.querySelectorAll("block[type=device_get_analog_pin]"))) + .concat(pxt.U.toArray(dom.querySelectorAll("shadow[type=device_get_analog_pin]"))) + .concat(pxt.U.toArray(dom.querySelectorAll("block[type=device_set_analog_pin]"))) + .concat(pxt.U.toArray(dom.querySelectorAll("block[type=device_set_analog_period]"))) + .concat(pxt.U.toArray(dom.querySelectorAll("block[type=pins_on_pulsed]"))) + .concat(pxt.U.toArray(dom.querySelectorAll("block[type=pins_pulse_in]"))) + .concat(pxt.U.toArray(dom.querySelectorAll("shadow[type=pins_pulse_in]"))) + .concat(pxt.U.toArray(dom.querySelectorAll("block[type=device_set_servo_pin]"))) + .concat(pxt.U.toArray(dom.querySelectorAll("block[type=device_set_servo_pulse]"))) + .concat(pxt.U.toArray(dom.querySelectorAll("block[type=device_analog_set_pitch_pin]"))) + .concat(pxt.U.toArray(dom.querySelectorAll("block[type=device_set_pull]"))) + .concat(pxt.U.toArray(dom.querySelectorAll("block[type=device_set_pin_events]"))) + .concat(pxt.U.toArray(dom.querySelectorAll("block[type=pin_neopixel_matrix_width]"))) + .concat(pxt.U.toArray(dom.querySelectorAll("block[type=spi_pins]"))) + .concat(pxt.U.toArray(dom.querySelectorAll("block[type=pin_set_audio_pin]"))) + .forEach(node => { + const blockType = node.getAttribute("type"); + pxt.U.toArray(node.children) + .filter(oldPinNode => { + if (oldPinNode.tagName != "field") return false; + switch (blockType) { + case "device_get_digital_pin": + case "device_set_digital_pin": + case "device_get_analog_pin": + case "device_set_analog_pin": + case "pins_pulse_in": + case "device_set_servo_pin": + case "device_analog_set_pitch_pin": + case "pin_set_audio_pin": + return oldPinNode.getAttribute("name") === "name"; + case "device_set_analog_period": + case "pins_on_pulsed": + case "device_set_pull": + case "device_set_pin_events": + case "pin_neopixel_matrix_width": + return oldPinNode.getAttribute("name") === "pin"; + case "device_set_servo_pulse": + return oldPinNode.getAttribute("name") === "value"; + case "spi_pins": + return ["mosi", "miso", "sck"].includes(oldPinNode.getAttribute("name")); + } + return false; + }) + .forEach(oldPinNode => { + const valueNode = node.ownerDocument.createElement("value"); + valueNode.setAttribute("name", oldPinNode.getAttribute("name")); + + const pinShadowNode = node.ownerDocument.createElement("shadow"); + let pinBlockType; + switch (oldPinNode.textContent.split(".")[0]) { + case "DigitalPin": + pinBlockType = "digital_pin_shadow"; + break; + case "AnalogPin": + pinBlockType = "analog_pin_shadow"; + break; + } + if (!pinBlockType) return; + pinShadowNode.setAttribute("type", pinBlockType); + + const fieldNode = node.ownerDocument.createElement("field"); + fieldNode.setAttribute("name", "pin"); + fieldNode.textContent = oldPinNode.textContent; + + pinShadowNode.appendChild(fieldNode); + valueNode.appendChild(pinShadowNode); + node.replaceChild(valueNode, oldPinNode); + }); + }); + + } + if (pxt.semver.majorCmp(pkgTargetVersion || "0.0.0", "5.0.0") >= 0) return; // Motor Names mapping @@ -28,42 +119,39 @@ export function patchBlocks(pkgTargetVersion: string, dom: Element) { node.setAttribute('type', 'soundLevel'); }); - - - // is this a old script? if (pxt.semver.majorCmp(pkgTargetVersion || "0.0.0", "4.0.20") >= 0) return; - // button and pin pressed/released blocks -/* - - Button.A - - - TouchPin.P0 - - - TouchPin.P1 - + // button and pin pressed/released blocks + /* + + Button.A + + + TouchPin.P0 + + + TouchPin.P1 + - converts to + converts to - - Button.B - - - ButtonEvent.Click - - - - - TouchPin.P2 - - - ButtonEvent.Up - - - -*/ -const inputNodes = pxt.U.toArray(dom.querySelectorAll("block[type=device_button_event]")) + + Button.B + + + ButtonEvent.Click + + + + + TouchPin.P2 + + + ButtonEvent.Up + + + + */ + const inputNodes = pxt.U.toArray(dom.querySelectorAll("block[type=device_button_event]")) .concat(pxt.U.toArray(dom.querySelectorAll("block[type=device_pin_event]"))) .concat(pxt.U.toArray(dom.querySelectorAll("block[type=device_pin_released]"))) inputNodes.forEach(node => { @@ -102,125 +190,81 @@ const inputNodes = pxt.U.toArray(dom.querySelectorAll("block[type=device_button_ -// loudness - /* - + // loudness + /* + - converts to + converts to - - */ - const loudnessNodes = pxt.U.toArray(dom.querySelectorAll("block[type=loudness]")) - loudnessNodes.forEach(node => { - node.setAttribute("type", "soundLevel"); - }); + + */ + const loudnessNodes = pxt.U.toArray(dom.querySelectorAll("block[type=loudness]")) + loudnessNodes.forEach(node => { + node.setAttribute("type", "soundLevel"); + }); - // rgbw to rgb block - const rgbwNodes = pxt.U.toArray(dom.querySelectorAll("block[type=core_rgbw]")) - rgbwNodes.forEach(node => { - node.setAttribute("type", "core_rgb"); - node.querySelectorAll("value[name=white]")[0].remove(); - }); + // rgbw to rgb block + const rgbwNodes = pxt.U.toArray(dom.querySelectorAll("block[type=core_rgbw]")) + rgbwNodes.forEach(node => { + node.setAttribute("type", "core_rgb"); + node.querySelectorAll("value[name=white]")[0].remove(); + }); - // arrow blocks - /* - - - - ArrowNames.North - - - + // arrow blocks + /* + + + + ArrowNames.North + + + - converts to + converts to - - - IconNames.ArrowNorth - - */ -const arrowNodes = pxt.U.toArray(dom.querySelectorAll("block[type=basic_show_arrow]")) -arrowNodes.forEach(node => { - node.setAttribute("type", "basic_show_icon"); - const arrowNode = node.querySelectorAll("value[name=i]")[0] - const iconName = "IconNames.Arrow" + arrowNode.querySelectorAll("field[name=arrow]")[0].textContent.split('.')[1]; - - const iconNode = node.ownerDocument.createElement("field"); - iconNode.setAttribute("name", "i") - iconNode.textContent = iconName; - - const mutationNode = node.ownerDocument.createElement("mutation"); - // mutationNode.setAttribute("xmlns", "http://www.w3.org/1999/xhtml") - mutationNode.setAttribute("_expanded", "0") - mutationNode.setAttribute("_input_init", "false") - - node.prepend(iconNode) - node.prepend(mutationNode) - node.removeChild(arrowNode); -}); - - // arrow icons - /* - - ArrowNames.East - + + + IconNames.ArrowNorth + + */ + const arrowNodes = pxt.U.toArray(dom.querySelectorAll("block[type=basic_show_arrow]")) + arrowNodes.forEach(node => { + node.setAttribute("type", "basic_show_icon"); + const arrowNode = node.querySelectorAll("value[name=i]")[0] + const iconName = "IconNames.Arrow" + arrowNode.querySelectorAll("field[name=arrow]")[0].textContent.split('.')[1]; + + const iconNode = node.ownerDocument.createElement("field"); + iconNode.setAttribute("name", "i") + iconNode.textContent = iconName; + + const mutationNode = node.ownerDocument.createElement("mutation"); + // mutationNode.setAttribute("xmlns", "http://www.w3.org/1999/xhtml") + mutationNode.setAttribute("_expanded", "0") + mutationNode.setAttribute("_input_init", "false") + + node.prepend(iconNode) + node.prepend(mutationNode) + node.removeChild(arrowNode); + }); - converts to + // arrow icons + /* + + ArrowNames.East + - - IconNames.ArrowEast - - */ -const arrowImageNodes = pxt.U.toArray(dom.querySelectorAll("block[type=builtin_arrow_image]")) -arrowImageNodes.forEach(node => { - node.setAttribute("type", "builtin_image"); - const arrowNode = node.querySelectorAll("field[name=i]")[0]; - arrowNode.textContent = "IconNames.Arrow" + arrowNode.textContent.split('.')[1]; -}); - - // LEDs -/** - * - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - TRUE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - TRUE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - - - to - - ` - # # # # # - . . . . # - . . . . . - . . . . # - . . . . # - ` - - - */ + converts to + + IconNames.ArrowEast + + */ + const arrowImageNodes = pxt.U.toArray(dom.querySelectorAll("block[type=builtin_arrow_image]")) + arrowImageNodes.forEach(node => { + node.setAttribute("type", "builtin_image"); + const arrowNode = node.querySelectorAll("field[name=i]")[0]; + arrowNode.textContent = "IconNames.Arrow" + arrowNode.textContent.split('.')[1]; + }); if (pxt.semver.majorCmp(pkgTargetVersion || "0.0.0", "5.0.12") <= 0) { @@ -260,6 +304,48 @@ arrowImageNodes.forEach(node => { if (pxt.semver.majorCmp(pkgTargetVersion || "0.0.0", "1.0.0") >= 0) return; // showleds + /** + + FALSE + FALSE + FALSE + FALSE + FALSE + FALSE + FALSE + FALSE + TRUE + FALSE + FALSE + FALSE + FALSE + FALSE + FALSE + FALSE + TRUE + FALSE + FALSE + FALSE + FALSE + FALSE + FALSE + FALSE + FALSE + + + converts to + + + ` + . . . . . + . . . # . + . . . . . + . # . . . + . . . . . + ` + + + */ const nodes = pxt.U.toArray(dom.querySelectorAll("block[type=device_show_leds]")) .concat(pxt.U.toArray(dom.querySelectorAll("block[type=device_build_image]"))) .concat(pxt.U.toArray(dom.querySelectorAll("shadow[type=device_build_image]"))) @@ -293,33 +379,33 @@ arrowImageNodes.forEach(node => { // radio /* - - -receivedNumber - - - -name -value - - - -receivedString - - -converts to - - -receivedNumber - - -name -value - - -receivedString - -*/ + + + receivedNumber + + + + name + value + + + + receivedString + + + converts to + + + receivedNumber + + + name + value + + + receivedString + + */ const varids: pxt.Map = {}; function addField(node: Element, renameMap: pxt.Map, name: string) { diff --git a/electron/product.json b/electron/product.json index 7424cd56c..6300672a9 100644 --- a/electron/product.json +++ b/electron/product.json @@ -2,8 +2,8 @@ "applicationName": "pxt-microbit-oss", "dataFolderName": ".pxt-microbit-oss", "darwinBundleIdentifier": "com.microsoft.pxtmicrobitoss", - "nameShort": "PXT microbit - OSS", - "nameLong": "PXT micro:bit - OSS", + "nameShort": "PXT Calliope - OSS", + "nameLong": "PXT Calliope mini - OSS", "targetId": "pxt-microbit", "win32AppId": "{{92db071a-6f58-4938-8c97-13c873f4da13}", "win32AppUserModelId": "Microsoft.PXTmicrobitOss", diff --git a/fieldeditors/extensions.ts b/fieldeditors/extensions.ts index 94c4bf5be..c7e4aae1b 100644 --- a/fieldeditors/extensions.ts +++ b/fieldeditors/extensions.ts @@ -1,15 +1,22 @@ -/// +/// /// import { FieldGestures } from "./field_gestures"; +import { FieldPinPicker } from "./field_pinPicker"; pxt.editor.initFieldExtensionsAsync = function (opts: pxt.editor.FieldExtensionOptions): Promise { pxt.debug('loading pxt-microbit field editors...') const res: pxt.editor.FieldExtensionResult = { - fieldEditors: [{ - selector: "gestures", - editor: FieldGestures - }] + fieldEditors: [ + { + selector: "gestures", + editor: FieldGestures + }, + { + selector: "pinpicker", + editor: FieldPinPicker + } + ] }; return Promise.resolve(res); } \ No newline at end of file diff --git a/fieldeditors/field_gestures.ts b/fieldeditors/field_gestures.ts index 0a4dbf12b..004063d8d 100644 --- a/fieldeditors/field_gestures.ts +++ b/fieldeditors/field_gestures.ts @@ -1,32 +1,107 @@ -/// -/// -/// +/// -export interface FieldGesturesOptions extends pxtblockly.FieldImagesOptions { +const pxtblockly = pxt.blocks.requirePxtBlockly() +const Blockly = pxt.blocks.requireBlockly(); + +export interface FieldGesturesOptions { columns?: string; width?: string; } -export class FieldGestures extends pxtblockly.FieldImages implements Blockly.FieldCustom { +export class FieldGestures extends pxtblockly.FieldImages { public isFieldCustom_ = true; constructor(text: string, options: FieldGesturesOptions, validator?: Function) { - super(text, options, validator); - + super(text, options as any, validator); this.columns_ = parseInt(options.columns) || 4; this.width_ = parseInt(options.width) || 350; + this.addLabel_ = true; + } - this.renderSelectedImage_ = Blockly.FieldDropdown.prototype.renderSelectedText_; - this.updateSize_ = (Blockly.Field as any).prototype.updateSize_; + protected render_(): void { + if (this.addLabel_) { + this.renderSelectedText_() + this.positionBorderRect_(); + } + else { + super.render_(); + } } - trimOptions_() { + /** Renders the selected option, which must be text. */ + protected renderSelectedText_() { + // Retrieves the selected option to display through getText_. + this.getTextContent().nodeValue = this.getDisplayText_(); + const textElement = this.getTextElement(); + Blockly.utils.dom.addClass(textElement, 'blocklyDropdownText'); + textElement.setAttribute('text-anchor', 'start'); + + // Height and width include the border rect. + const hasBorder = !!this.borderRect_; + const height = Math.max( + hasBorder ? this.getConstants()!.FIELD_DROPDOWN_BORDER_RECT_HEIGHT : 0, + this.getConstants()!.FIELD_TEXT_HEIGHT, + ); + const textWidth = Blockly.utils.dom.getFastTextWidth( + this.getTextElement(), + this.getConstants()!.FIELD_TEXT_FONTSIZE, + this.getConstants()!.FIELD_TEXT_FONTWEIGHT, + this.getConstants()!.FIELD_TEXT_FONTFAMILY, + ); + const xPadding = hasBorder + ? this.getConstants()!.FIELD_BORDER_RECT_X_PADDING + : 0; + let arrowWidth = 0; + if (this.getSvgArrow()) { + arrowWidth = this.positionSVGArrow_( + textWidth + xPadding, + height / 2 - this.getConstants()!.FIELD_DROPDOWN_SVG_ARROW_SIZE / 2, + ); + } + this.size_.width = textWidth + arrowWidth + xPadding * 2; + this.size_.height = height; + + this.positionTextElement_(xPadding, textWidth); } - protected buttonClick_ = function (e: any) { - let value = e.target.getAttribute('data-value'); - this.setValue(value); - Blockly.DropDownDiv.hide(); - }; + positionSVGArrow_(x: number, y: number): number { + const svgArrow = this.getSvgArrow(); + if (!svgArrow) { + return 0; + } + const block = this.getSourceBlock(); + const hasBorder = !!this.borderRect_; + const xPadding = hasBorder + ? this.getConstants()!.FIELD_BORDER_RECT_X_PADDING + : 0; + const textPadding = this.getConstants()!.FIELD_DROPDOWN_SVG_ARROW_PADDING; + const svgArrowSize = this.getConstants()!.FIELD_DROPDOWN_SVG_ARROW_SIZE; + const arrowX = block.RTL ? xPadding : x + textPadding; + svgArrow.setAttribute( + 'transform', + 'translate(' + arrowX + ',' + y + ')', + ); + return svgArrowSize + textPadding; + } + + // This hack exists because svgArrow is private in Blockly's field dropdown. + // It should always be the last image element in the field group + protected getSvgArrow() { + if (this.fieldGroup_) { + const children = this.fieldGroup_.children; + + let lastImage: SVGImageElement; + + for (let i = 0; i < children.length; i++) { + if (children.item(i).tagName.toLowerCase() === "image") { + lastImage = children.item(i) as SVGImageElement; + } + } + + return lastImage; + } + + return undefined; + } } \ No newline at end of file diff --git a/fieldeditors/field_pinPicker.ts b/fieldeditors/field_pinPicker.ts new file mode 100644 index 000000000..965200a23 --- /dev/null +++ b/fieldeditors/field_pinPicker.ts @@ -0,0 +1,93 @@ +/// + +const pxtblockly = pxt.blocks.requirePxtBlockly() +const Blockly = pxt.blocks.requireBlockly(); + +const WARNING_ID = "pinpicker_warning"; + +export class FieldPinPicker extends pxtblockly.FieldGridPicker { + protected warningVisible: boolean; + + override init() { + super.init(); + + const sourceBlock = this.sourceBlock_; + if (sourceBlock.isShadow() || sourceBlock.isInFlyout) { + return; + } + + sourceBlock.workspace.addChangeListener(this.changeListener); + } + + private changeListener = (e: any) => { + if (e.type === Blockly.Events.BLOCK_MOVE && e.blockId === this.sourceBlock_.id) { + this.updateWarning(); + } + } + + protected override doValueUpdate_(newValue: string): void { + super.doValueUpdate_(newValue); + this.updateWarning(); + } + + protected updateWarning() { + this.hideWarning(); + const sourceBlock = this.sourceBlock_; + + if (!sourceBlock || !this.value_ || sourceBlock.isShadow() || sourceBlock.isInFlyout) { + return; + } + + const pin = this.value_.split(".")[1]; + + if (!isAnalogWriteOnlyPin(pin)) { + return; + } + + const parent = sourceBlock.outputConnection.targetBlock(); + + if (!parent || parent.type !== "device_get_analog_pin") { + return; + } + + this.showWarning(pin); + } + + protected showWarning(pin: string) { + if (!this.sourceBlock_) { + return; + } + this.sourceBlock_.setWarningText(pxt.U.lf("{0} is a write only analog pin", pin), WARNING_ID); + } + + protected hideWarning() { + if (!this.sourceBlock_) { + return; + } + this.sourceBlock_.setWarningText(null, WARNING_ID) + } + + override dispose(): void { + super.dispose(); + this.sourceBlock_?.workspace?.removeChangeListener(this.changeListener); + } +} + +function isAnalogWriteOnlyPin(pin: string) { + switch (pin) { + case "P5": + case "P6": + case "P7": + case "P8": + case "P9": + case "P11": + case "P12": + case "P13": + case "P14": + case "P15": + case "P16": + return true; + default: + return false; + } +} \ No newline at end of file diff --git a/libs/audio-recording/docs/reference/record/audio-status.md b/libs/audio-recording/docs/reference/record/audio-status.md index ad72b9112..1e05637fa 100644 --- a/libs/audio-recording/docs/reference/record/audio-status.md +++ b/libs/audio-recording/docs/reference/record/audio-status.md @@ -25,10 +25,10 @@ The audio buffer has several status conditions that you can check. It will retur Use buttons `A` and `B` to record and play audio. If no audio is recorded, skip the playback when button `B` is pressed. ```blocks -input.onButtonPressed(Button.A, function () { +input.onButtonEvent(Button.A, input.buttonEventClick(), function () { record.startRecording(record.BlockingState.Blocking) }) -input.onButtonPressed(Button.B, function () { +input.onButtonEvent(Button.B, input.buttonEventClick(), function () { if (!(record.audioStatus(record.AudioStatus.BufferEmpty))) { record.playAudio(record.BlockingState.Blocking) } diff --git a/libs/audio-recording/docs/reference/record/play-audio.md b/libs/audio-recording/docs/reference/record/play-audio.md index 5e15c95da..c82bca69a 100644 --- a/libs/audio-recording/docs/reference/record/play-audio.md +++ b/libs/audio-recording/docs/reference/record/play-audio.md @@ -19,10 +19,10 @@ Any audio recorded in the audio buffer is played on the speaker or at the sound Use the Calliope mini as a sound recorder. Record sound when button `A` is pressed and play sound when button `B` is pressed. ```blocks -input.onButtonPressed(Button.A, function () { +input.onButtonEvent(Button.A, input.buttonEventClick(), function () { record.startRecording(record.BlockingState.Blocking) }) -input.onButtonPressed(Button.B, function () { +input.onButtonEvent(Button.B, input.buttonEventClick(), function () { record.playAudio(record.BlockingState.Blocking) }) ``` diff --git a/libs/audio-recording/docs/reference/record/set-mic-gain.md b/libs/audio-recording/docs/reference/record/set-mic-gain.md index aa7035fa6..dbffeae29 100644 --- a/libs/audio-recording/docs/reference/record/set-mic-gain.md +++ b/libs/audio-recording/docs/reference/record/set-mic-gain.md @@ -23,10 +23,10 @@ Use buttons `A` and `B` to record and play audio. Set the microphone gain to `lo ```blocks record.setMicGain(record.AudioLevels.Low) -input.onButtonPressed(Button.A, function () { +input.onButtonEvent(Button.A, input.buttonEventClick(), function () { record.startRecording(record.BlockingState.Blocking) }) -input.onButtonPressed(Button.B, function () { +input.onButtonEvent(Button.B, input.buttonEventClick(), function () { record.playAudio(record.BlockingState.Blocking) }) ``` diff --git a/libs/audio-recording/docs/reference/record/set-sample-rate.md b/libs/audio-recording/docs/reference/record/set-sample-rate.md index 0379114ba..c54bf9611 100644 --- a/libs/audio-recording/docs/reference/record/set-sample-rate.md +++ b/libs/audio-recording/docs/reference/record/set-sample-rate.md @@ -25,10 +25,10 @@ Record audio at `22000` samples per second but play it back at `11000` samples p ```blocks record.setSampleRate(22000, record.AudioSampleRateScope.Recording) record.setSampleRate(11000, record.AudioSampleRateScope.Playback) -input.onButtonPressed(Button.A, function () { +input.onButtonEvent(Button.A, input.buttonEventClick(), function () { record.startRecording(record.BlockingState.Blocking) }) -input.onButtonPressed(Button.B, function () { +input.onButtonEvent(Button.B, input.buttonEventClick(), function () { record.playAudio(record.BlockingState.Blocking) }) ``` diff --git a/libs/audio-recording/docs/reference/record/start-recording.md b/libs/audio-recording/docs/reference/record/start-recording.md index f27e9dfe2..f10366b37 100644 --- a/libs/audio-recording/docs/reference/record/start-recording.md +++ b/libs/audio-recording/docs/reference/record/start-recording.md @@ -21,10 +21,10 @@ When audio is recorded, the audio buffer will contain enough samples that, when Use the Calliope mini as a sound recorder. Record sound when button `A` is pressed and play sound when button `B` is pressed. ```blocks -input.onButtonPressed(Button.A, function () { +input.onButtonEvent(Button.A, input.buttonEventClick(), function () { record.startRecording(record.BlockingState.Blocking) }) -input.onButtonPressed(Button.B, function () { +input.onButtonEvent(Button.B, input.buttonEventClick(), function () { record.playAudio(record.BlockingState.Blocking) }) ``` diff --git a/libs/audio-recording/recording.cpp b/libs/audio-recording/recording.cpp index c4c50c9ef..487135ff6 100644 --- a/libs/audio-recording/recording.cpp +++ b/libs/audio-recording/recording.cpp @@ -38,18 +38,18 @@ static MixerChannel *channel = NULL; #endif -void checkEnv(int sampleRate = -1) { +void checkEnv() { #if MICROBIT_CODAL if (recording == NULL) { - if (sampleRate == -1) - sampleRate = 11000; + int defaultSampleRate = 11000; MicroBitAudio::requestActivation(); splitterChannel = uBit.audio.splitter->createChannel(); + splitterChannel->requestSampleRate( defaultSampleRate ); recording = new StreamRecording(*splitterChannel); - channel = uBit.audio.mixer.addChannel(*recording, sampleRate); + channel = uBit.audio.mixer.addChannel(*recording, defaultSampleRate); channel->setVolume(75.0); uBit.audio.mixer.setVolume(1000); @@ -187,11 +187,8 @@ void setInputSampleRate(int sampleRate) { //% void setOutputSampleRate(int sampleRate) { #if MICROBIT_CODAL - if (recording == NULL) { - checkEnv(sampleRate); - } else { - channel->setSampleRate(sampleRate); - } + checkEnv(); + channel->setSampleRate(sampleRate); #else target_panic(PANIC_VARIANT_NOT_SUPPORTED); #endif diff --git a/libs/core-mini-codal/logo.cpp b/libs/core-mini-codal/logo.cpp index 2f99e1437..7ee5f8685 100644 --- a/libs/core-mini-codal/logo.cpp +++ b/libs/core-mini-codal/logo.cpp @@ -26,7 +26,7 @@ namespace input { //% help="input/on-logo-event" void onLogoEvent(TouchButtonEvent action, Action body) { #if MICROBIT_CODAL - registerWithDal(uBit.logo.id, action, body); + registerWithDal(uBit.io.logo.id, action, body); #else target_panic(PANIC_VARIANT_NOT_SUPPORTED); #endif @@ -43,7 +43,7 @@ namespace input { //% help="input/logo-is-pressed" bool logoIsPressed() { #if MICROBIT_CODAL - return uBit.logo.isPressed(); + return uBit.io.logo.isTouched(); #else target_panic(PANIC_VARIANT_NOT_SUPPORTED); return false; diff --git a/libs/core-mini-codal/playable.ts b/libs/core-mini-codal/playable.ts index a918977c3..e58ce6a7d 100644 --- a/libs/core-mini-codal/playable.ts +++ b/libs/core-mini-codal/playable.ts @@ -76,6 +76,12 @@ namespace music { } } + /** + * Play a song, melody, or other sound. The music plays until finished or can play as a + * background task. + * @param toPlay the song or melody to play + * @param playbackMode play the song or melody until it's finished or as background task + */ //% blockId="music_playable_play" //% block="play $toPlay $playbackMode" //% toPlay.shadow=music_string_playable @@ -97,10 +103,15 @@ namespace music { return play(toPlay, playbackMode); } + /** + * Play a melody from the melody editor + * @param melody string of up to eight notes [C D E F G A B C5] or rests [-] separated by spaces, which will be played one at a time, ex: "E D G F B A C5 B " + * @param bpm number in beats per minute dictating how long each note will play + */ //% blockId="music_string_playable" //% block="melody $melody at tempo $bpm|(bpm)" //% weight=85 blockGap=8 - //% help=music/melody-editor + //% help=music/string-playable //% group="Melody" //% toolboxParent=music_playable_play //% toolboxParentArgument=toPlay diff --git a/libs/core-mini-codal/soundexpressions.ts b/libs/core-mini-codal/soundexpressions.ts index de9a36913..c4ca4346c 100644 --- a/libs/core-mini-codal/soundexpressions.ts +++ b/libs/core-mini-codal/soundexpressions.ts @@ -408,16 +408,16 @@ namespace music { switch (effect) { case SoundExpressionEffect.Vibrato: - src = setValue(src, 36, 2, 4); - src = setValue(src, 40, 512, 4); + src = setValue(src, 36, DAL.SFX_DEFAULT_VIBRATO_PARAM, 4); + src = setValue(src, 40, DAL.SFX_DEFAULT_VIBRATO_STEPS, 4); break; case SoundExpressionEffect.Tremolo: - src = setValue(src, 36, 3, 4); - src = setValue(src, 40, 900, 4); + src = setValue(src, 36, DAL.SFX_DEFAULT_TREMOLO_PARAM, 4); + src = setValue(src, 40, DAL.SFX_DEFAULT_TREMOLO_STEPS, 4); break; case SoundExpressionEffect.Warble: - src = setValue(src, 36, 2, 4); - src = setValue(src, 40, 700, 4); + src = setValue(src, 36, DAL.SFX_DEFAULT_WARBLE_PARAM, 4); + src = setValue(src, 40, DAL.SFX_DEFAULT_WARBLE_STEPS, 4); break; } diff --git a/libs/core/_locales/fr/core-jsdoc-strings.json b/libs/core/_locales/fr/core-jsdoc-strings.json index 27e273e85..2f9de0292 100644 --- a/libs/core/_locales/fr/core-jsdoc-strings.json +++ b/libs/core/_locales/fr/core-jsdoc-strings.json @@ -1,7 +1,7 @@ { "Math.randomBoolean": "Génère une valeur « true » ou « false » au hasard, comme si vous lanciez une pièce de monnaie.", "String.fromCharCode": "Construit une chaîne à partir du code ASCII d'un caractère donné.", - "basic": "Permet d’accéder aux fonctionnalités de base de la micro:bit.", + "basic": "Permet d’accéder aux fonctionnalités de base de la Calliope mini.", "basic.clearScreen": "Éteindre toutes les LEDs", "basic.forever": "Répète le code indéfiniment en tâche de fond. A chaque itération, permet aux autres codes de s’exécuter.", "basic.pause": "Pause pendant la durée indiquée en millisecondes", @@ -20,7 +20,7 @@ "basic.showString|param|interval": "à quelle vitesse se déplacent les caractères ; par ex. : 150, 100, 200, -100", "basic.showString|param|text": "le texte à faire défiler sur l’écran, par exemple : « Bonjour ! »", "control.inBackground": "Planifie le code qui s’exécute en arrière-plan.", - "control.reset": "Réinitialise le micro:bit de BBC.", + "control.reset": "Réinitialise le Calliope mini.", "control.waitMicros|param|micros": "nombre de microsecondes à attendre. par ex. : 4", "game": "Un moteur de jeu avec une unique LED", "game.addLife|param|lives": "TODO", diff --git a/libs/core/blocks-test/control.blocks b/libs/core/blocks-test/control.blocks index 5f6f43631..584d47339 100644 --- a/libs/core/blocks-test/control.blocks +++ b/libs/core/blocks-test/control.blocks @@ -1,66 +1,67 @@ - - - item - - - - - - - - - 4 - - - - - - - - EventBusSource.MICROBIT_ID_BUTTON_A - - - - - - EventBusValue.MICROBIT_EVT_ANY - - - - - - - - - - - - - - EventBusSource.MICROBIT_ID_BUTTON_A - - - EventBusValue.MES_DPAD_BUTTON_C_UP - - - - - EventBusValue.MICROBIT_EVT_ANY - - - EventBusValue.MES_REMOTE_CONTROL_EVT_PLAY - - - - - item - - - 0 - - + + + + item + + + + + + + + + 4 + + + + + + + + EventBusSource.MICROBIT_ID_BUTTON_A + + + + + + EventBusValue.MICROBIT_EVT_ANY + + + + + + + + + + + + + + EventBusSource.MICROBIT_ID_BUTTON_A + + + EventBusValue.MES_DPAD_BUTTON_C_UP + - - - + + + EventBusValue.MICROBIT_EVT_ANY + + + EventBusValue.MES_REMOTE_CONTROL_EVT_PLAY + + + + + item + + + 0 + + + + + + \ No newline at end of file diff --git a/libs/core/blocks-test/game.blocks b/libs/core/blocks-test/game.blocks index 9b8ede847..d3726e0f7 100644 --- a/libs/core/blocks-test/game.blocks +++ b/libs/core/blocks-test/game.blocks @@ -1,183 +1,184 @@ - - - item - gdfgsdfg - - - - - - - - - 2 - - - - - 2 - - - - - - - - - item - - - - - 1 - - - - - Direction.Right - - - item - - - - - 45 - + + + + item + gdfgsdfg + + + + + + + + + 2 + + + + + 2 + + + - - LedSpriteProperty.X - - - item - - - - - 1 - - - - - LedSpriteProperty.X + - - item - + + item + - - - 0 - - - LedSpriteProperty.X - - - item - - - + + + 1 + - - gdfgsdfg - - - 0 - - + + Direction.Right - - item - + + item + - - - item - - - - - - - gdfgsdfg - - - 0 - - - - - item - - - + + + 45 + - - - - item - - - - - - - 1 - - + + LedSpriteProperty.X + + + item + + + + + 1 + - - - - 0 - - - - - - - 10000 - + + LedSpriteProperty.X + + + item + + + + + 0 + + + LedSpriteProperty.X + + + item + + + - + + gdfgsdfg + + + 0 + + + + + item + + + + + item + + + + + + + gdfgsdfg + + + 0 + + + + + item + + + + + + + + + item + + + + + + + 1 + + + + + + + + 0 + + + + + + + 10000 + + + + + + + + + + + + + + + + - - - + - - - + - - - + - - - + - - - - - - - - - item - - - 0 - - - - - item - + + + + + item + + + 0 + + + + + item + \ No newline at end of file diff --git a/libs/core/blocks-test/input.blocks b/libs/core/blocks-test/input.blocks index 50f59d1d2..27862f456 100644 --- a/libs/core/blocks-test/input.blocks +++ b/libs/core/blocks-test/input.blocks @@ -1,12 +1,13 @@ + item sdfsadf - + Button.AB - + @@ -48,7 +49,7 @@ 0 - + @@ -57,7 +58,7 @@ 0 - + @@ -66,7 +67,7 @@ 0 - + @@ -97,7 +98,7 @@ 0 - + @@ -126,16 +127,19 @@ Gesture.SixG - + TouchPin.P0 - + + + ButtonEvent.Click + - + TouchPin.P0 - + \ No newline at end of file diff --git a/libs/core/blocks-test/music.blocks b/libs/core/blocks-test/music.blocks index 78d455ad2..48c9ff55f 100644 --- a/libs/core/blocks-test/music.blocks +++ b/libs/core/blocks-test/music.blocks @@ -1,8 +1,9 @@ + item - + @@ -58,7 +59,7 @@ 0 - + diff --git a/libs/core/blocks-test/pins.blocks b/libs/core/blocks-test/pins.blocks old mode 100644 new mode 100755 index 9e01d01cd..f2024a3ac --- a/libs/core/blocks-test/pins.blocks +++ b/libs/core/blocks-test/pins.blocks @@ -1,209 +1,127 @@ - - - DigitalPin.P5 - PulseValue.Low - - - AnalogPin.P9 - - - 5 - - - - - AnalogPin.P10 - - - 20000 - - - - - DigitalPin.P6 - - - 5 - - - - - AnalogPin.P13 - - - 5 - - - - - AnalogPin.P8 - - - 1500 - - - - - 0 - - - NumberFormat.Int8BE - - - 0 - - - - - FALSE - - - - - - - 0 - - - DigitalPin.P9 - PulseValue.Low - - - - - 1023 - - - - - - 0 - - - - - 0 - - - - - - - 4 - - - - - - - NumberFormat.Int16BE - - - 0 - - - DigitalPin.P9 - - - - - 0 - - - AnalogPin.P9 - - - - - FALSE - - - - - DigitalPin.P11 - DigitalPin.P9 - DigitalPin.P10 - - - DigitalPin.P9 - PinPullMode.PullDown - - - - - 0 - - - - - 0 - - - - - DigitalPin.P8 - PinEventType.Touch - - - AnalogPin.P9 - - - - - 8 - - - - - 3 - - - - - - - 8 - - - - - 3 - - - - - - - 1000000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +PulseValue.LowDigitalPin.P5AnalogPin.P95AnalogPin.P1020000DigitalPin.P65AnalogPin.P135AnalogPin.P815000NumberFormat.Int8BE0FALSE0PulseValue.LowDigitalPin.P91023004DigitalPin.P9 diff --git a/libs/core/blocks-test/serial.blocks b/libs/core/blocks-test/serial.blocks index 827a64d2e..2ffb869cc 100644 --- a/libs/core/blocks-test/serial.blocks +++ b/libs/core/blocks-test/serial.blocks @@ -1,94 +1,112 @@ - - - item - - - - - Delimiters.Colon - - - - - - - - - - + + + + item + + + + + Delimiters.NewLine + + - - - - - 0 - - - - - - - x - - - - - Delimiters.Colon - - - - - - - 0 - + + + item + + + 0 + + + + + + 0 + + + + + 1 + + + - - - - - - - - - - - item - + + + - - SerialPin.C16 - SerialPin.C17 - BaudRate.BaudRate28800 - - - - - - - 64 - - - + + + + 0 + - + + + + + + Delimiters.Colon + + + + + + + 0 + + + + + + + + + + + + + + item + + + + + SerialPin.C16 + SerialPin.C17 + BaudRate.BaudRate28800 + + + + + + + 64 + + + + + + + + + + + + + + + + - - - + - - - + - - - - - - - + + + \ No newline at end of file diff --git a/libs/core/blocks-test/test.blocks b/libs/core/blocks-test/test.blocks index 2a619f873..4b5c3de46 100644 --- a/libs/core/blocks-test/test.blocks +++ b/libs/core/blocks-test/test.blocks @@ -1,620 +1,127 @@ - - - booltest - myImage - strtest - - - - - - - 123 - - - - - - ` - # . . # . - # . . # . - . # . . . - . # # . . - . . . . . - ` - - - IconNames.Heart - - - - - 500 - - - - - - - IconNames.Heart - - - myImage - - - 0 - - - ` - . . . . . - . . . . . - . . . . . - . . . . . - . . . . . - ` - - - - - - - myImage - - - - - 0 - - - - - - - myImage - - - - - 1 - - - - - - 3 - - - - - strtest - - - 0 - - - - - Delimiters.Hash - - - - - - - strtest - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - 2 - - - - - - - 5 - - - - - 45 - - - - - DisplayMode.Greyscale - - - AnalogPin.P2 - - - - 1023 - - - AnalogPin.P2 - - - - - DigitalPin.P1 - - - - 0 - - - DigitalPin.P1 - - - - - AnalogPin.P2 - - - 1234 - - - - - 0 - - - - - - 0 - - - - - - 1023 - - - Rotation.Roll - - - - - 0 - - - Dimension.Y - - - - - 4 - - - - - - - - AnalogPin.P2 - - - - 180 - - - Dimension.Z - - - - - AnalogPin.P2 - - - 1500 - - - - - - - - 220 - - - - - BeatFraction.Sixteenth - - - - - - - 659 - - - - - - - BeatFraction.Double - - - - - - - - - - - - - - - - - - - - - - - - - - - Gesture.TiltLeft - - - - - - 1 - - - EventBusValue.MICROBIT_PIN_EVT_PULSE_HI - - - - - - 2 - - - - - - - - - 64 - - - - - - - - - - - - - - - 4 - - - - - - - - EventBusSource.MICROBIT_ID_IO_P0 - - - - - EventBusValue.MES_ALERT_EVT_ALARM1 - - - - - - - - - - - booltest - - - 0 - - - Button.B - - - - - booltest - - - 0 - - - TouchPin.P2 - - - - - booltest - - - 0 - - - - - - 3 - - - - - - 4 - - - - - - - - - - - - - - - Delimiters.Colon - - - - - SerialPin.P0 - SerialPin.P1 - BaudRate.BaudRate19200 - - - - - - - - Button.AB - - - - - - - - - 1 - - - BeatFraction.Sixteenth - - - - - - 2 - - - - - - - - 3 - - - - - - - 5 - - - - - - 255 - - - - - - - - - 255 - - - 440 - - - - - - - - - TRUE - - - - - - - - - - - - - - - - - - - - - - - - DigitalPin.P1 - PulseValue.Low - - - NumberFormat.UInt8BE - - - 0 - - - - - 0 - - - - - FALSE - - - - - - - 0 - - - - - 0 - - - - - DigitalPin.P0 - PinEventType.Touch - - - - - 1000000 - - - - - AnalogPin.P2 - - - DigitalPin.P2 - PinPullMode.PullDown - - - - - 8 - - - - - 3 - - - - - DigitalPin.P1 - DigitalPin.P1 - DigitalPin.P1 - - - - - - - - - - - - - - - - - - - - - - - - - EventBusSource.MICROBIT_ID_IO_P1 - - - - - EventBusValue.MES_ALERT_EVT_ALARM2 - - - - \ No newline at end of file +PulseValue.LowDigitalPin.P5AnalogPin.P95AnalogPin.P1020000DigitalPin.P65AnalogPin.P135AnalogPin.P815000NumberFormat.Int8BE0FALSE0PulseValue.LowDigitalPin.P91023004DigitalPin.P9 diff --git a/libs/core/codal.cpp b/libs/core/codal.cpp index c5ea59b67..2c1a851db 100644 --- a/libs/core/codal.cpp +++ b/libs/core/codal.cpp @@ -98,7 +98,7 @@ static void initCodal() { void registerWithDal(int id, int event, Action a, int flags) { uBit.messageBus.ignore(id, event, dispatchForeground); - uBit.messageBus.listen(id, event, dispatchForeground, a); + uBit.messageBus.listen(id, event, dispatchForeground, a, (uint16_t) flags); incr(a); registerGCPtr(a); } diff --git a/libs/core/dal.d.ts b/libs/core/dal.d.ts index bac1d4fff..25b81ad96 100644 --- a/libs/core/dal.d.ts +++ b/libs/core/dal.d.ts @@ -72,6 +72,8 @@ declare const enum DAL { DEVICE_SCHEDULER_EVT_TICK = 1, DEVICE_SCHEDULER_EVT_IDLE = 2, DEVICE_GET_FIBER_LIST_AVAILABLE = 1, + MUTEX = 0, + SEMAPHORE = 1, // /libraries/codal-core/inc/core/CodalListener.h MESSAGE_BUS_LISTENER_PARAMETERISED = 1, MESSAGE_BUS_LISTENER_METHOD = 2, @@ -370,6 +372,7 @@ declare const enum DAL { TOUCH_BUTTON_SENSITIVITY = 10, TOUCH_BUTTON_CALIBRATION_PERIOD = 10, TOUCH_BUTTON_CALIBRATING = 16, + TOUCH_BUTTON_RUNNING = 32, // /libraries/codal-core/inc/drivers/TouchSensor.h TOUCH_SENSOR_MAX_BUTTONS = 10, TOUCH_SENSOR_SAMPLE_PERIOD = 50, @@ -585,6 +588,7 @@ declare const enum DAL { LEVEL_DETECTOR_SPL_CLAP = 8, LEVEL_DETECTOR_SPL_DEFAULT_WINDOW_SIZE = 128, LEVEL_DETECTOR_SPL_NORMALIZE = 1, + LEVEL_DETECTOR_SPL_MIN_BUFFERS = 2, LEVEL_DETECTOR_SPL_DB = 1, LEVEL_DETECTOR_SPL_8BIT = 2, LEVEL_DETECTOR_SPL_BEGIN_POSS_CLAP_RMS = 200, @@ -599,16 +603,18 @@ declare const enum DAL { TRIGGER_PULL = 1, TRIGGER_REQUEST = 2, // /libraries/codal-core/inc/streams/StreamRecording.h - REC_MAX_BUFFERS = 200, + CODAL_DEFAULT_STREAM_RECORDING_MAX_LENGTH = 50000, REC_STATE_STOPPED = 0, REC_STATE_PLAYING = 1, REC_STATE_RECORDING = 2, // /libraries/codal-core/inc/streams/StreamSplitter.h CONFIG_MAX_CHANNELS = 10, + CONFIG_SPLITTER_OVERSAMPLE_STEP = 16, SPLITTER_CHANNEL_CONNECT = 1, SPLITTER_CHANNEL_DISCONNECT = 2, SPLITTER_ACTIVATE = 3, SPLITTER_DEACTIVATE = 4, + SPLITTER_TICK = 10, // /libraries/codal-core/inc/streams/Synthesizer.h SYNTHESIZER_SAMPLE_RATE = 44100, TONE_WIDTH = 1024, @@ -742,12 +748,11 @@ declare const enum DAL { MICROBIT_RADIO_STATUS_DEEPSLEEP_INIT = 4, MICROBIT_RADIO_BASE_ADDRESS = 1969383796, MICROBIT_RADIO_DEFAULT_GROUP = 0, - MICROBIT_RADIO_DEFAULT_TX_POWER = 7, + MICROBIT_RADIO_DEFAULT_TX_POWER = 6, MICROBIT_RADIO_DEFAULT_FREQUENCY = 7, - MICROBIT_RADIO_MAX_PACKET_SIZE = 32, MICROBIT_RADIO_HEADER_SIZE = 4, MICROBIT_RADIO_MAXIMUM_RX_BUFFERS = 4, - MICROBIT_RADIO_POWER_LEVELS = 10, + MICROBIT_RADIO_POWER_LEVELS = 8, MICROBIT_RADIO_PROTOCOL_DATAGRAM = 1, MICROBIT_RADIO_PROTOCOL_EVENTBUS = 2, MICROBIT_RADIO_EVT_DATAGRAM = 1, @@ -788,6 +793,7 @@ declare const enum DAL { CONFIG_MIXER_BUFFER_SIZE = 512, CONFIG_MIXER_INTERNAL_RANGE = 1023, CONFIG_MIXER_DEFAULT_SAMPLERATE = 44100, + CONFIG_MIXER_DEFAULT_CHANNEL_SAMPLERATE = 44100, DEVICE_ID_MIXER = 3030, DEVICE_MIXER_EVT_SILENCE = 1, DEVICE_MIXER_EVT_SOUND = 2, @@ -822,6 +828,12 @@ declare const enum DAL { DEVICE_ID_SOUND_EMOJI_SYNTHESIZER_9 = 3019, DEVICE_SOUND_EMOJI_SYNTHESIZER_EVT_DONE = 1, DEVICE_SOUND_EMOJI_SYNTHESIZER_EVT_PLAYBACK_COMPLETE = 2, + SFX_DEFAULT_VIBRATO_STEPS = 512, + SFX_DEFAULT_VIBRATO_PARAM = 2, + SFX_DEFAULT_TREMOLO_STEPS = 900, + SFX_DEFAULT_TREMOLO_PARAM = 3, + SFX_DEFAULT_WARBLE_STEPS = 700, + SFX_DEFAULT_WARBLE_PARAM = 2, // /libraries/codal-microbit-v2/inc/SoundOutputPin.h CONFIG_SOUND_OUTPUT_PIN_PERIOD = 5, CONFIG_SOUND_OUTPUT_PIN_SILENCE_GATE = 100, @@ -908,7 +920,6 @@ declare const enum DAL { MICROBIT_BLE_PAIR_SUCCESSFUL = 8, MICROBIT_BLE_PAIRING_TIMEOUT = 90, MICROBIT_BLE_POWER_LEVELS = 8, - MICROBIT_BLE_MAXIMUM_BONDS = 4, MICROBIT_BLE_EDDYSTONE_ADV_INTERVAL = 400, MICROBIT_BLE_EDDYSTONE_DEFAULT_POWER = 240, MICROBIT_BLE_STATUS_DISCONNECT = 4, @@ -1086,6 +1097,7 @@ declare const enum DAL { MICROBIT_ID_USB_FLASH_MANAGER = 42, MICROBIT_ID_VIRTUAL_SPEAKER_PIN = 43, MICROBIT_ID_LOG = 44, + MICROBIT_ID_UTILITY = 45, MICROBIT_NESTED_HEAP_SIZE = 0, MICROBIT_SCHEDULER_RUNNING = 1, MICROBIT_SERIAL_DEFAULT_BAUD_RATE = 115200, @@ -1094,10 +1106,7 @@ declare const enum DAL { MICROBIT_COMPASS_STATUS_ADDED_TO_IDLE = 8, // /libraries/codal-microbit-v2/model/MicroBit.h DEVICE_INITIALIZED = 1, - MICROBIT_UBIT_FACE_TOUCH_BUTTON = 1, KL27_POWER_ON_DELAY = 1000, - CONFIG_MICROBIT_ERASE_USER_DATA_ON_REFLASH = 1, - DEVICE_TRIPLE_RESET_TO_PAIR = 1, DEVICE_ID_MICROPHONE = 3001, // /libraries/codal-microbit-v2/model/MicroBitIO.h MICROBIT_PIN_BUTTON_RESET = -1, @@ -1259,6 +1268,7 @@ declare const enum DAL { CFG_PIN_WIFI_AT_TX = 91, CFG_PIN_WIFI_AT_RX = 92, CFG_PIN_USB_POWER = 93, + CFG_DISPLAY_DELAY = 94, ACCELEROMETER_TYPE_LIS3DH = 50, ACCELEROMETER_TYPE_LIS3DH_ALT = 48, ACCELEROMETER_TYPE_MMA8453 = 56, @@ -1666,7 +1676,6 @@ declare const enum DAL { PERF_NOW_SCALE = 1, PXT_STRING_SKIP_INCR = 16, // /pxtapp/pxtcore.h - GC_MAX_ALLOC_SIZE = 9000, NON_GC_HEAP_RESERVATION = 1024, GC_BLOCK_SIZE = 256, } diff --git a/libs/core/enums.d.ts b/libs/core/enums.d.ts index 519f3311f..5c8ad093c 100644 --- a/libs/core/enums.d.ts +++ b/libs/core/enums.d.ts @@ -440,208 +440,298 @@ declare namespace input { declare const enum DigitalPin { + //% blockIdentity="pins._digitalPin" P0 = 100, // MICROBIT_ID_IO_P0 + //% blockIdentity="pins._digitalPin" P1 = 101, // MICROBIT_ID_IO_P1 + //% blockIdentity="pins._digitalPin" P2 = 102, // MICROBIT_ID_IO_P2 + //% blockIdentity="pins._digitalPin" P3 = 103, // MICROBIT_ID_IO_P3 - + //% blockIdentity="pins._digitalPin" C4 = 104, // MICROBIT_ID_IO_P4 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P4 = 104, // MICROBIT_ID_IO_P4 - + //% blockIdentity="pins._digitalPin" C5 = 105, // MICROBIT_ID_IO_P5 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P5 = 105, // MICROBIT_ID_IO_P5 - + //% blockIdentity="pins._digitalPin" C6 = 106, // MICROBIT_ID_IO_P6 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P6 = 106, // MICROBIT_ID_IO_P6 - + //% blockIdentity="pins._digitalPin" C7 = 107, // MICROBIT_ID_IO_P7 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P7 = 107, // MICROBIT_ID_IO_P7 - + //% blockIdentity="pins._digitalPin" C8 = 108, // MICROBIT_ID_IO_P8 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P8 = 108, // MICROBIT_ID_IO_P8 - + //% blockIdentity="pins._digitalPin" C9 = 109, // MICROBIT_ID_IO_P9 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P9 = 109, // MICROBIT_ID_IO_P9 - + //% blockIdentity="pins._digitalPin" C10 = 110, // MICROBIT_ID_IO_P10 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P10 = 110, // MICROBIT_ID_IO_P10 - + //% blockIdentity="pins._digitalPin" C11 = 111, // MICROBIT_ID_IO_P11 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P11 = 111, // MICROBIT_ID_IO_P11 - + //% blockIdentity="pins._digitalPin" C12 = 112, // MICROBIT_ID_IO_P12 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P12 = 112, // MICROBIT_ID_IO_P12 - + //% blockIdentity="pins._digitalPin" C13 = 113, // MICROBIT_ID_IO_P13 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P13 = 113, // MICROBIT_ID_IO_P13 - + //% blockIdentity="pins._digitalPin" C14 = 114, // MICROBIT_ID_IO_P14 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P14 = 114, // MICROBIT_ID_IO_P14 - + //% blockIdentity="pins._digitalPin" C15 = 115, // MICROBIT_ID_IO_P15 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P15 = 115, // MICROBIT_ID_IO_P15 - + //% blockIdentity="pins._digitalPin" //% block="C16 (A1 RX)" C16 = 116, // MICROBIT_ID_IO_A1_RX + //% blockIdentity="pins._digitalPin" //% blockHidden=true P16 = 116, // MICROBIT_ID_IO_A1_RX + //% blockIdentity="pins._digitalPin" //% block="A1 RX" blockHidden=true A1_RX = 116, // MICROBIT_ID_IO_A1_RX - + //% blockIdentity="pins._digitalPin" //% block="C17 (A1 TX)" C17 = 117, // MICROBIT_ID_IO_A1_TX + //% blockIdentity="pins._digitalPin" //% blockHidden=true P17 = 117, // MICROBIT_ID_IO_A1_TX + //% blockIdentity="pins._digitalPin" //% block="A1 TX" blockHidden=true A1_TX = 117, // MICROBIT_ID_IO_A1_TX - + //% blockIdentity="pins._digitalPin" C18 = 118, // MICROBIT_ID_IO_P18 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P18 = 118, // MICROBIT_ID_IO_P18 - + //% blockIdentity="pins._digitalPin" //% block="C19 (A0 SCL)" blockHidden=true A0_SCL = 119, // MICROBIT_ID_IO_A0_SCL + //% blockIdentity="pins._digitalPin" //% block="C20 (A0 SDA)" blockHidden=true A0_SDA = 120, // MICROBIT_ID_IO_A0_SDA - + //% blockIdentity="pins._digitalPin" //% blockHidden=true M_MODE = 156, // MICROBIT_ID_IO_M_MODE - + //% blockIdentity="pins._digitalPin" //% blockHidden=true M0_DIR = 152, // MICROBIT_ID_IO_M_A_IN1 - + //% blockIdentity="pins._digitalPin" //% blockHidden=true M1_DIR = 154, // MICROBIT_ID_IO_M_B_IN1 - + //% blockIdentity="pins._digitalPin" //% blockHidden=true M0_SPEED = 153, // MICROBIT_ID_IO_M_A_IN2 - + //% blockIdentity="pins._digitalPin" //% blockHidden=true M1_SPEED = 155, // MICROBIT_ID_IO_M_B_IN2 - + //% blockIdentity="pins._digitalPin" RGB = 151, // MICROBIT_ID_IO_RGB } declare const enum AnalogPin { + + //% blockIdentity="pins._analogPin" P0 = 100, // MICROBIT_ID_IO_P0 + + //% blockIdentity="pins._analogPin" P1 = 101, // MICROBIT_ID_IO_P1 + + //% blockIdentity="pins._analogPin" P2 = 102, // MICROBIT_ID_IO_P2 - //% block="P3 (write only)" + + //% blockIdentity="pins._analogPin" + //% block="P3" + // (write only) P3 = 103, // MICROBIT_ID_IO_P3 + //% blockIdentity="pins._analogPin" C4 = 104, // MICROBIT_ID_IO_P4 + //% blockIdentity="pins._analogPin" //% blockHidden=true P4 = 104, // MICROBIT_ID_IO_P4 - //% block="C5 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C5" + // (write only) C5 = 105, // MICROBIT_ID_IO_P5 + //% blockIdentity="pins._analogPin" //% blockHidden=true P5 = 105, // MICROBIT_ID_IO_P5 - //% block="C6 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C6" + // (write only) C6 = 106, // MICROBIT_ID_IO_P6 + //% blockIdentity="pins._analogPin" //% blockHidden=true P6 = 106, // MICROBIT_ID_IO_P6 - //% block="C7 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C7" + // (write only) C7 = 107, // MICROBIT_ID_IO_P7 + //% blockIdentity="pins._analogPin" //% blockHidden=true P7 = 107, // MICROBIT_ID_IO_P7 - //% block="C8 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C8" + // (write only) C8 = 108, // MICROBIT_ID_IO_P8 + //% blockIdentity="pins._analogPin" //% blockHidden=true P8 = 108, // MICROBIT_ID_IO_P8 - //% block="C9 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C9" + // (write only) C9 = 109, // MICROBIT_ID_IO_P9 + //% blockIdentity="pins._analogPin" //% blockHidden=true P9 = 109, // MICROBIT_ID_IO_P9 + //% blockIdentity="pins._analogPin" C10 = 110, // MICROBIT_ID_IO_P10 + //% blockIdentity="pins._analogPin" //% blockHidden=true P10 = 110, // MICROBIT_ID_IO_P10 - //% block="C11 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C11" + // (write only) C11 = 111, // MICROBIT_ID_IO_P11 + //% blockIdentity="pins._analogPin" //% blockHidden=true P11 = 111, // MICROBIT_ID_IO_P11 - //% block="C12 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C12" + // (write only) C12 = 112, // MICROBIT_ID_IO_P12 + //% blockIdentity="pins._analogPin" //% blockHidden=true P12 = 112, // MICROBIT_ID_IO_P12 - //% block="C13 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C13" + // (write only) C13 = 113, // MICROBIT_ID_IO_P13 + //% blockIdentity="pins._analogPin" //% blockHidden=true P13 = 113, // MICROBIT_ID_IO_P13 - //% block="C14 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C14" + // (write only) C14 = 114, // MICROBIT_ID_IO_P14 + //% blockIdentity="pins._analogPin" //% blockHidden=true P14 = 114, // MICROBIT_ID_IO_P14 - //% block="C15 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C15" + // (write only) C15 = 115, // MICROBIT_ID_IO_P15 + //% blockIdentity="pins._analogPin" //% blockHidden=true P15 = 115, // MICROBIT_ID_IO_P15 + //% blockIdentity="pins._analogPin" //% block="C16 (A1 RX)" C16 = 116, // MICROBIT_ID_IO_A1_RX + //% blockIdentity="pins._analogPin" //% blockHidden=true P16 = 116, // MICROBIT_ID_IO_A1_RX + //% blockIdentity="pins._analogPin" //% block="A1 RX" blockHidden=true A1_RX = 116, // MICROBIT_ID_IO_A1_RX - //% block="C17 (A1 TX, write only)" + //% blockIdentity="pins._analogPin" + //% block="C17 (A1 TX)" + // (write only) C17 = 117, // MICROBIT_ID_IO_A1_TX + //% blockIdentity="pins._analogPin" //% blockHidden=true P17 = 117, // MICROBIT_ID_IO_A1_TX + //% blockIdentity="pins._analogPin" //% block="A1 TX" blockHidden=true A1_TX = 117, // MICROBIT_ID_IO_A1_TX + //% blockIdentity="pins._analogPin" C18 = 118, // MICROBIT_ID_IO_P18 + //% blockIdentity="pins._analogPin" //% blockHidden=true P18 = 118, // MICROBIT_ID_IO_P18 + //% blockIdentity="pins._analogPin" //% block="C19 (A0 SCL)" blockHidden=true A0_SCL = 119, // MICROBIT_ID_IO_A0_SCL + + //% blockIdentity="pins._analogPin" //% block="C20 (A0 SDA)" blockHidden=true A0_SDA = 120, // MICROBIT_ID_IO_A0_SDA - //% //% block="Motor Mode (write only)" blockHidden=true + //% blockIdentity="pins._analogPin" + //% //% block="Motor Mode" blockHidden=true + // (write only) M_MODE = 156, // MICROBIT_ID_IO_M_MODE - //% //% block="M0 Direction (write only)"blockHidden=true + //% blockIdentity="pins._analogPin" + //% //% block="M0 Direction"blockHidden=true + // (write only) M0_DIR = 152, // MICROBIT_ID_IO_M_A_IN1 - //% //% block="M1 Direction (write only)" blockHidden=true + //% blockIdentity="pins._analogPin" + //% //% block="M1 Direction" blockHidden=true + // (write only) M1_DIR = 154, // MICROBIT_ID_IO_M_B_IN1 - //% //% block="M0 Speed (write only)" blockHidden=true + //% blockIdentity="pins._analogPin" + //% //% block="M0 Speed" blockHidden=true + // (write only) M0_SPEED = 153, // MICROBIT_ID_IO_M_A_IN2 - //% //% block="M1 Speed (write only)" blockHidden=true + //% blockIdentity="pins._analogPin" + //% //% block="M1 Speed" blockHidden=true + // (write only) M1_SPEED = 155, // MICROBIT_ID_IO_M_B_IN2 - //% //% block="RGB (write only)" blockHidden=true + //% blockIdentity="pins._analogPin" + //% //% block="RGB" blockHidden=true + // (write only) RGB = 151, // MICROBIT_ID_IO_RGB + //% blockIdentity="pins._analogPin" //% blockHidden=true MIC = 121, // MICROBIT_ID_LOGO } diff --git a/libs/core/game.ts b/libs/core/game.ts index d0258ef43..c70648ac3 100644 --- a/libs/core/game.ts +++ b/libs/core/game.ts @@ -305,7 +305,7 @@ namespace game { * Resumes the game rendering engine */ //% blockId=game_resume block="resume" - //% advanced=true blockGap=8 help=game/resumeP + //% advanced=true blockGap=8 help=game/resume export function resume(): void { _paused = false; plot(); diff --git a/libs/core/pins.cpp b/libs/core/pins.cpp index ed7472f00..85b88c6b4 100644 --- a/libs/core/pins.cpp +++ b/libs/core/pins.cpp @@ -3,212 +3,304 @@ #if MICROBIT_CODAL #include "Pin.h" #define PinCompat codal::Pin +#undef Button // need to get codal Button back in scope here +#include "MicroBitButton.h" // this include is missing in MicroBit.h from codal-microbit-v2 when DEVICE_BLE=0 #else #define PinCompat MicroBitPin #endif enum class DigitalPin { + //% blockIdentity="pins._digitalPin" P0 = MICROBIT_ID_IO_P0, // edge connector 0 + //% blockIdentity="pins._digitalPin" P1 = MICROBIT_ID_IO_P1, // edge connector 1 + //% blockIdentity="pins._digitalPin" P2 = MICROBIT_ID_IO_P2, // edge connector 2 + //% blockIdentity="pins._digitalPin" P3 = MICROBIT_ID_IO_P3, // edge connector 3 - + //% blockIdentity="pins._digitalPin" C4 = MICROBIT_ID_IO_P4, // -> P4 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P4 = MICROBIT_ID_IO_P4, // LED matrix COLUMN 1 - + //% blockIdentity="pins._digitalPin" C5 = MICROBIT_ID_IO_P5, // -> P5 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P5 = MICROBIT_ID_IO_P5, // LED matrix COLUMN 2 - + //% blockIdentity="pins._digitalPin" C6 = MICROBIT_ID_IO_P6, // -> P6 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P6 = MICROBIT_ID_IO_P6, // LED matrix COLUMN 3 - + //% blockIdentity="pins._digitalPin" C7 = MICROBIT_ID_IO_P7, // -> P7 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P7 = MICROBIT_ID_IO_P7, // LED matrix COLUMN 4 - + //% blockIdentity="pins._digitalPin" C8 = MICROBIT_ID_IO_P8, // -> P8 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P8 = MICROBIT_ID_IO_P8, // LED matrix COLUMN 5 - + //% blockIdentity="pins._digitalPin" C9 = MICROBIT_ID_IO_P9, // -> P9 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P9 = MICROBIT_ID_IO_P9, // LED matrix COLUMN 6 - + //% blockIdentity="pins._digitalPin" C10 = MICROBIT_ID_IO_P10, // -> P10 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P10 = MICROBIT_ID_IO_P10, // LED matrix COLUMN 7 - + //% blockIdentity="pins._digitalPin" C11 = MICROBIT_ID_IO_P11, // -> P11 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P11 = MICROBIT_ID_IO_P11, // LED matrix COLUMN 8 - + //% blockIdentity="pins._digitalPin" C12 = MICROBIT_ID_IO_P12, // -> P12 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P12 = MICROBIT_ID_IO_P12, // LED matrix COLUMN 9 - + //% blockIdentity="pins._digitalPin" C13 = MICROBIT_ID_IO_P13, // LED matrix ROW 1 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P13 = MICROBIT_ID_IO_P13, // LED matrix ROW 1 - + //% blockIdentity="pins._digitalPin" C14 = MICROBIT_ID_IO_P14, // LED matrix ROW 2 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P14 = MICROBIT_ID_IO_P14, // LED matrix ROW 2 - + //% blockIdentity="pins._digitalPin" C15 = MICROBIT_ID_IO_P15, // LED matrix ROW 3 + //% blockIdentity="pins._digitalPin" //% blockHidden=true P15 = MICROBIT_ID_IO_P15, // LED matrix ROW 3 - + //% blockIdentity="pins._digitalPin" //% block="C16 (A1 RX)" C16 = MICROBIT_ID_IO_A1_RX, // -> A1_RX + //% blockIdentity="pins._digitalPin" //% blockHidden=true P16 = MICROBIT_ID_IO_A1_RX, // -> A1_RX + //% blockIdentity="pins._digitalPin" //% block="A1 RX" blockHidden=true A1_RX = MICROBIT_ID_IO_A1_RX, // SCL - + //% blockIdentity="pins._digitalPin" //% block="C17 (A1 TX)" C17 = MICROBIT_ID_IO_A1_TX, // -> A1_TX + //% blockIdentity="pins._digitalPin" //% blockHidden=true P17 = MICROBIT_ID_IO_A1_TX, // -> A1_TX + //% blockIdentity="pins._digitalPin" //% block="A1 TX" blockHidden=true A1_TX = MICROBIT_ID_IO_A1_TX, // SDA - + //% blockIdentity="pins._digitalPin" C18 = MICROBIT_ID_IO_P18, + //% blockIdentity="pins._digitalPin" //% blockHidden=true P18 = MICROBIT_ID_IO_P18, - + //% blockIdentity="pins._digitalPin" //% block="C19 (A0 SCL)" blockHidden=true A0_SCL = MICROBIT_ID_IO_A0_SCL, // SCL + //% blockIdentity="pins._digitalPin" //% block="C20 (A0 SDA)" blockHidden=true A0_SDA = MICROBIT_ID_IO_A0_SDA, // SDA - + //% blockIdentity="pins._digitalPin" //% blockHidden=true M_MODE = MICROBIT_ID_IO_M_MODE, - + //% blockIdentity="pins._digitalPin" //% blockHidden=true M0_DIR = MICROBIT_ID_IO_M_A_IN1, - + //% blockIdentity="pins._digitalPin" //% blockHidden=true M1_DIR = MICROBIT_ID_IO_M_B_IN1, - + //% blockIdentity="pins._digitalPin" //% blockHidden=true M0_SPEED = MICROBIT_ID_IO_M_A_IN2, - + //% blockIdentity="pins._digitalPin" //% blockHidden=true M1_SPEED = MICROBIT_ID_IO_M_B_IN2, - + //% blockIdentity="pins._digitalPin" RGB = MICROBIT_ID_IO_RGB }; enum class AnalogPin { + + //% blockIdentity="pins._analogPin" P0 = MICROBIT_ID_IO_P0, // edge connector 0 + + //% blockIdentity="pins._analogPin" P1 = MICROBIT_ID_IO_P1, // edge connector 1 + + //% blockIdentity="pins._analogPin" P2 = MICROBIT_ID_IO_P2, // edge connector 2 - //% block="P3 (write only)" + + //% blockIdentity="pins._analogPin" + //% block="P3" + // (write only) P3 = MICROBIT_ID_IO_P3, // edge connector 3 + //% blockIdentity="pins._analogPin" C4 = MICROBIT_ID_IO_P4, // -> P4 + //% blockIdentity="pins._analogPin" //% blockHidden=true P4 = MICROBIT_ID_IO_P4, // LED matrix COLUMN 1 - //% block="C5 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C5" + // (write only) C5 = MICROBIT_ID_IO_P5, // -> P5 + //% blockIdentity="pins._analogPin" //% blockHidden=true P5 = MICROBIT_ID_IO_P5, // BUTTON A - //% block="C6 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C6" + // (write only) C6 = MICROBIT_ID_IO_P6, // -> P6 + //% blockIdentity="pins._analogPin" //% blockHidden=true P6 = MICROBIT_ID_IO_P6, // LED matrix COLUMN 4 - //% block="C7 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C7" + // (write only) C7 = MICROBIT_ID_IO_P7, // -> P7 + //% blockIdentity="pins._analogPin" //% blockHidden=true P7 = MICROBIT_ID_IO_P7, // LED matrix COLUMN 2 - //% block="C8 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C8" + // (write only) C8 = MICROBIT_ID_IO_P8, // -> P8 + //% blockIdentity="pins._analogPin" //% blockHidden=true P8 = MICROBIT_ID_IO_P8, - //% block="C9 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C9" + // (write only) C9 = MICROBIT_ID_IO_P9, // -> P9 + //% blockIdentity="pins._analogPin" //% blockHidden=true P9 = MICROBIT_ID_IO_P9, + //% blockIdentity="pins._analogPin" C10 = MICROBIT_ID_IO_P10, // -> P10 + //% blockIdentity="pins._analogPin" //% blockHidden=true P10 = MICROBIT_ID_IO_P10, // LED matrix COLUMN 5 - //% block="C11 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C11" + // (write only) C11 = MICROBIT_ID_IO_P11, // -> P11 + //% blockIdentity="pins._analogPin" //% blockHidden=true P11 = MICROBIT_ID_IO_P11, // BUTTON B - //% block="C12 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C12" + // (write only) C12 = MICROBIT_ID_IO_P12, // -> P12 + //% blockIdentity="pins._analogPin" //% blockHidden=true P12 = MICROBIT_ID_IO_P12, // JACDAC - //% block="C13 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C13" + // (write only) C13 = MICROBIT_ID_IO_P13, // -> P13 + //% blockIdentity="pins._analogPin" //% blockHidden=true P13 = MICROBIT_ID_IO_P13, // SPI CLCK - //% block="C14 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C14" + // (write only) C14 = MICROBIT_ID_IO_P14, // -> P14 + //% blockIdentity="pins._analogPin" //% blockHidden=true P14 = MICROBIT_ID_IO_P14, // SPI MISO - //% block="C15 (write only)" + //% blockIdentity="pins._analogPin" + //% block="C15" + // (write only) C15 = MICROBIT_ID_IO_P15, // -> P15 + //% blockIdentity="pins._analogPin" //% blockHidden=true P15 = MICROBIT_ID_IO_P15, // SPI MOSI + //% blockIdentity="pins._analogPin" //% block="C16 (A1 RX)" C16 = MICROBIT_ID_IO_A1_RX, // -> A1_RX + //% blockIdentity="pins._analogPin" //% blockHidden=true P16 = MICROBIT_ID_IO_A1_RX, // -> A1_RX + //% blockIdentity="pins._analogPin" //% block="A1 RX" blockHidden=true A1_RX = MICROBIT_ID_IO_A1_RX, // SCL - //% block="C17 (A1 TX, write only)" + //% blockIdentity="pins._analogPin" + //% block="C17 (A1 TX)" + // (write only) C17 = MICROBIT_ID_IO_A1_TX, // -> A1_TX + //% blockIdentity="pins._analogPin" //% blockHidden=true P17 = MICROBIT_ID_IO_A1_TX, // -> A1_TX + //% blockIdentity="pins._analogPin" //% block="A1 TX" blockHidden=true A1_TX = MICROBIT_ID_IO_A1_TX, // SDA + //% blockIdentity="pins._analogPin" C18 = MICROBIT_ID_IO_P18, // -> P18 + //% blockIdentity="pins._analogPin" //% blockHidden=true P18 = MICROBIT_ID_IO_P18, // LED matrix COL 3 + //% blockIdentity="pins._analogPin" //% block="C19 (A0 SCL)" blockHidden=true A0_SCL = MICROBIT_ID_IO_A0_SCL, // SCL + + //% blockIdentity="pins._analogPin" //% block="C20 (A0 SDA)" blockHidden=true A0_SDA = MICROBIT_ID_IO_A0_SDA, // SDA - //% //% block="Motor Mode (write only)" blockHidden=true + //% blockIdentity="pins._analogPin" + //% //% block="Motor Mode" blockHidden=true + // (write only) M_MODE = MICROBIT_ID_IO_M_MODE, - //% //% block="M0 Direction (write only)"blockHidden=true + //% blockIdentity="pins._analogPin" + //% //% block="M0 Direction"blockHidden=true + // (write only) M0_DIR = MICROBIT_ID_IO_M_A_IN1, - //% //% block="M1 Direction (write only)" blockHidden=true + //% blockIdentity="pins._analogPin" + //% //% block="M1 Direction" blockHidden=true + // (write only) M1_DIR = MICROBIT_ID_IO_M_B_IN1, - //% //% block="M0 Speed (write only)" blockHidden=true + //% blockIdentity="pins._analogPin" + //% //% block="M0 Speed" blockHidden=true + // (write only) M0_SPEED = MICROBIT_ID_IO_M_A_IN2, - //% //% block="M1 Speed (write only)" blockHidden=true + //% blockIdentity="pins._analogPin" + //% //% block="M1 Speed" blockHidden=true + // (write only) M1_SPEED = MICROBIT_ID_IO_M_B_IN2, - //% //% block="RGB (write only)" blockHidden=true + //% blockIdentity="pins._analogPin" + //% //% block="RGB" blockHidden=true + // (write only) RGB = MICROBIT_ID_IO_RGB, + //% blockIdentity="pins._analogPin" //% blockHidden=true MIC = MICROBIT_ID_LOGO // microphone }; @@ -310,10 +402,8 @@ namespace pins { */ //% help=pins/digital-read-pin weight=30 //% blockId=device_get_digital_pin block="digital read|pin %name" blockGap=8 - //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 - //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" - //% group="Digital" - int digitalReadPin(DigitalPin name) { + //% name.shadow=digital_pin_shadow + int digitalReadPin(int name) { PINREAD(getDigitalValue()); } @@ -325,10 +415,8 @@ namespace pins { //% help=pins/digital-write-pin weight=29 //% blockId=device_set_digital_pin block="digital write|pin %name|to %value" //% value.min=0 value.max=1 - //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 - //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" - //% group="Digital" - void digitalWritePin(DigitalPin name, int value) { + //% name.shadow=digital_pin_shadow + void digitalWritePin(int name, int value) { PINOP(setDigitalValue(value)); } @@ -338,10 +426,8 @@ namespace pins { */ //% help=pins/analog-read-pin weight=25 //% blockId=device_get_analog_pin block="analog read|pin %name" blockGap="8" - //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 - //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" - //% group="Analog" - int analogReadPin(AnalogPin name) { + //% name.shadow=analog_read_write_pin_shadow + int analogReadPin(int name) { PINREAD(getAnalogValue()); } @@ -353,10 +439,8 @@ namespace pins { //% help=pins/analog-write-pin weight=24 //% blockId=device_set_analog_pin block="analog write|pin %name|to %value" blockGap=8 //% value.min=0 value.max=1023 - //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 - //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" - //% group="Analog" - void analogWritePin(AnalogPin name, int value) { + //% name.shadow=analog_pin_shadow + void analogWritePin(int name, int value) { PINOP(setAnalogValue(value)); } @@ -364,14 +448,12 @@ namespace pins { * Configure the pulse-width modulation (PWM) period of the analog output in microseconds. * If this pin is not configured as an analog output (using `analog write pin`), the operation has no effect. * @param name analog pin to set period to, eg: AnalogPin.P0 - * @param micros period in micro seconds. eg:20000 + * @param micros period in microseconds. eg:20000 */ //% help=pins/analog-set-period weight=23 blockGap=8 //% blockId=device_set_analog_period block="analog set period|pin %pin|to (µs)%micros" - //% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4 - //% pin.fieldOptions.tooltips="false" - //% group="Analog" - void analogSetPeriod(AnalogPin name, int micros) { + //% pin.shadow=analog_pin_shadow + void analogSetPeriod(int name, int micros) { PINOP(setAnalogPeriodUs(micros)); } @@ -382,10 +464,11 @@ namespace pins { */ //% help=pins/on-pulsed weight=22 blockGap=16 advanced=true //% blockId=pins_on_pulsed block="on|pin %pin|pulsed %pulse" - //% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4 - //% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="250" + //% pin.shadow=digital_pin_shadow //% group="Pulse" - void onPulsed(DigitalPin name, PulseValue pulse, Action body) { + //% weight=25 + //% blockGap=8 + void onPulsed(int name, PulseValue pulse, Action body) { MicroBitPin* pin = getPin((int)name); if (!pin) return; @@ -413,10 +496,11 @@ namespace pins { //% blockId="pins_pulse_in" block="pulse in (µs)|pin %name|pulsed %value" //% weight=20 advanced=true //% help=pins/pulse-in - //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 - //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" + //% name.shadow=digital_pin_shadow //% group="Pulse" - int pulseIn(DigitalPin name, PulseValue value, int maxDuration = 2000000) { + //% weight=23 + //% blockGap=8 + int pulseIn(int name, PulseValue value, int maxDuration = 2000000) { MicroBitPin* pin = getPin((int)name); if (!pin) return 0; @@ -472,10 +556,9 @@ namespace pins { //% blockId=device_set_servo_pin block="servo write|pin %name|to %value" blockGap=8 //% parts=microservo trackArgs=0 //% value.min=0 value.max=180 - //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 - //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" + //% name.shadow=analog_pin_shadow //% group="Servo" - void servoWritePin(AnalogPin name, int value) { + void servoWritePin(int name, int value) { PINOP(setServoValue(value)); } @@ -483,23 +566,20 @@ namespace pins { * Specifies that a continuous servo is connected. */ //% - //% group="Servo" - void servoSetContinuous(AnalogPin name, bool value) { + void servoSetContinuous(int name, bool value) { // handled in simulator } /** * Configure the IO pin as an analog/pwm output and set a pulse width. The period is 20 ms period and the pulse width is set based on the value given in **microseconds** or `1/1000` milliseconds. * @param name pin name - * @param micros pulse duration in micro seconds, eg:1500 + * @param micros pulse duration in microseconds, eg:1500 */ //% help=pins/servo-set-pulse weight=19 //% blockId=device_set_servo_pulse block="servo set pulse|pin %value|to (µs) %micros" - //% value.fieldEditor="gridpicker" value.fieldOptions.columns=4 - //% value.fieldOptions.tooltips="false" value.fieldOptions.width="250" + //% value.shadow=analog_pin_shadow //% group="Servo" - void servoSetPulse(AnalogPin name, int micros) { - fixMotorIssue(name); + void servoSetPulse(int name, int micros) { PINOP(setServoPulseUs(micros)); } @@ -515,12 +595,12 @@ namespace pins { * @param name pin to modulate pitch from */ //% blockId=device_analog_set_pitch_pin block="analog set pitch pin %name" - //% help=pins/analog-set-pitch-pin weight=3 advanced=true - //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 - //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" - //% blockHidden=true - //% group="Pitch" - void analogSetPitchPin(AnalogPin name) { + //% help=pins/analog-set-pitch-pin advanced=true + //% name.shadow=analog_pin_shadow + //% group="Pins" + //% weight=12 + //% blockGap=8 + void analogSetPitchPin(int name) { pitchPin = getPin((int)name); pitchPin2 = NULL; } @@ -566,9 +646,9 @@ namespace pins { } /** - * Emit a plse-width modulation (PWM) signal to the current pitch pin. Use `analog set pitch pin` to define the pitch pin. + * Send a pulse-width modulation (PWM) signal to the current pitch pin. Use `analog set pitch pin` to define the pitch pin. * @param frequency frequency to modulate in Hz. - * @param ms duration of the pitch in milli seconds. + * @param ms duration of the pitch in milliseconds. */ //% blockId=device_analog_pitch block="analog pitch %frequency|for (ms) %ms" //% help=pins/analog-pitch async advanced=true @@ -623,10 +703,11 @@ namespace pins { */ //% help=pins/set-pull weight=3 advanced=true //% blockId=device_set_pull block="set pull|pin %pin|to %pull" - //% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4 - //% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="250" - //% group="Digital" - void setPull(DigitalPin name, PinPullMode pull) { + //% pin.shadow=digital_pin_shadow + //% group="Pins" + //% weight=15 + //% blockGap=8 + void setPull(int name, PinPullMode pull) { #if MICROBIT_CODAL codal::PullMode m = pull == PinPullMode::PullDown ? codal::PullMode::Down @@ -650,10 +731,11 @@ namespace pins { */ //% help=pins/set-events weight=4 advanced=true //% blockId=device_set_pin_events block="set pin %pin|to emit %type|events" - //% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4 - //% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="250" - //% group="Digital" - void setEvents(DigitalPin name, PinEventType type) { + //% pin.shadow=digital_pin_shadow + //% group="Pins" + //% weight=13 + //% blockGap=8 + void setEvents(int name, PinEventType type) { getPin((int)name)->eventOn((int)type); } @@ -674,13 +756,14 @@ namespace pins { * @param name pin of Neopixel strip, eg: DigitalPin.P0 * @param value width of matrix (at least ``2``) */ - //% help=pins/neopixel-matrix-width weight=3 advanced=true - //% blockId=pin_neopixel_matrix_width block="neopixel matrix width|pin %pin %width" blockGap=8 - //% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4 - //% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="250" + //% help=pins/neopixel-matrix-width advanced=true + //% blockId=pin_neopixel_matrix_width block="neopixel matrix width|pin %pin %width" + //% pin.shadow=digital_pin_shadow //% width.defl=5 width.min=2 - //% blockHidden=true - void setMatrixWidth(DigitalPin pin, int width) {} + //% group="Pins" + //% weight=11 + //% blockGap=8 + void setMatrixWidth(int pin, int width) {} #if MICROBIT_CODAL #define BUFFER_TYPE uint8_t* @@ -791,14 +874,13 @@ namespace pins { */ //% help=pins/spi-pins weight=2 advanced=true //% blockId=spi_pins block="spi set pins|MOSI %mosi|MISO %miso|SCK %sck" - //% mosi.fieldEditor="gridpicker" mosi.fieldOptions.columns=4 - //% mosi.fieldOptions.tooltips="false" mosi.fieldOptions.width="250" - //% miso.fieldEditor="gridpicker" miso.fieldOptions.columns=4 - //% miso.fieldOptions.tooltips="false" miso.fieldOptions.width="250" - //% sck.fieldEditor="gridpicker" sck.fieldOptions.columns=4 - //% sck.fieldOptions.tooltips="false" sck.fieldOptions.width="250" - //% group="spi" - void spiPins(DigitalPin mosi, DigitalPin miso, DigitalPin sck) { + //% mosi.shadow=digital_pin_shadow + //% miso.shadow=digital_pin_shadow + //% sck.shadow=digital_pin_shadow + //% group="SPI" + //% blockGap=8 + //% weight=51 + void spiPins(int mosi, int miso, int sck) { if (NULL != spi) { delete spi; spi = NULL; @@ -810,8 +892,7 @@ namespace pins { * Mounts a push button on the given pin */ //% help=pins/push-button advanced=true - //% group="Digital" - void pushButton(DigitalPin pin) { + void pushButton(int pin) { new MicroBitButton((PinName)getPin((int)(pin))->name, (int)pin, MICROBIT_BUTTON_ALL_EVENTS, PinMode::PullUp); } @@ -820,12 +901,11 @@ namespace pins { * @param name pin to modulate pitch from */ //% blockId=pin_set_audio_pin block="set audio pin $name" - //% help=pins/set-audio-pin weight=3 - //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 - //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" + //% help=pins/set-audio-pin + //% name.shadow=digital_pin_shadow //% weight=1 - //% group="Pitch" - void setAudioPin(AnalogPin name) { + //% blockGap=8 + void setAudioPin(int name) { #if MICROBIT_CODAL uBit.audio.setPin(*getPin((int)name)); uBit.audio.setPinEnabled(!edgeConnectorSoundDisabled); @@ -841,7 +921,7 @@ namespace pins { */ //% blockId=pin_set_audio_pin_enabled //% block="set audio pin enabled $enabled" - //% weight=0 + //% weight=0 help=pins/set-audio-pin-enabled void setAudioPinEnabled(bool enabled) { edgeConnectorSoundDisabled = !enabled; #if MICROBIT_CODAL diff --git a/libs/core/pins.ts b/libs/core/pins.ts index 052eab0db..b02490574 100644 --- a/libs/core/pins.ts +++ b/libs/core/pins.ts @@ -6,6 +6,85 @@ //% groups=['Analog', 'Digital', 'Servos', 'Pulse', 'Pitch', 'i2c', 'spi'] namespace pins { + /** + * Returns the value of a C++ runtime constant + */ + //% help=pins/digital-pin + //% shim=TD_ID + //% blockId=digital_pin + //% block="digital pin $pin" + //% pin.fieldEditor=pinpicker + //% pin.fieldOptions.columns=4 + //% pin.fieldOptions.tooltips="false" + //% group="Pins" + //% weight=17 + //% blockGap=8 + //% advanced=true + export function _digitalPin(pin: DigitalPin): number { + return pin; + } + + /** + * Returns the value of a C++ runtime constant + */ + //% help=pins/analog-pin + //% shim=TD_ID + //% blockId=analog_pin + //% block="analog pin $pin" + //% pin.fieldEditor=pinpicker + //% pin.fieldOptions.columns=4 + //% pin.fieldOptions.tooltips="false" + //% blockGap=8 + //% advanced=true + export function _analogPin(pin: AnalogPin): number { + return pin; + } + + /** + * Returns the value of a C++ runtime constant + */ + //% help=pins/digital-pin + //% shim=TD_ID + //% blockId=digital_pin_shadow + //% block="$pin" + //% pin.fieldEditor=pinpicker + //% pin.fieldOptions.columns=4 + //% pin.fieldOptions.tooltips="false" + //% blockHidden=1 + export function _digitalPinShadow(pin: DigitalPin): number { + return pin; + } + + /** + * Returns the value of a C++ runtime constant + */ + //% help=pins/analog-pin + //% shim=TD_ID + //% blockId=analog_pin_shadow + //% block="$pin" + //% pin.fieldEditor=pinpicker + //% pin.fieldOptions.columns=4 + //% pin.fieldOptions.tooltips="false" + //% blockHidden=1 + export function _analogPinShadow(pin: AnalogPin): number { + return pin; + } + + /** + * Returns the value of a C++ runtime constant + */ + //% help=pins/analog-pin + //% shim=TD_ID + //% blockId=analog_read_write_pin_shadow + //% block="$pin" + //% pin.fieldEditor=pinpicker + //% pin.fieldOptions.columns=4 + //% pin.fieldOptions.tooltips="false" + //% blockHidden=1 + export function _analogReadWritePinShadow(pin: AnalogReadWritePin): number { + return pin; + } + /** * Map a number from one range to another. That is, a value of ``from low`` would get mapped to ``to low``, a value of ``from high`` to ``to high``, values in-between to values in-between, etc. * @param value value to map in ranges diff --git a/libs/core/pinscompat.ts b/libs/core/pinscompat.ts index 3e50da8e8..ffe4323c3 100644 --- a/libs/core/pinscompat.ts +++ b/libs/core/pinscompat.ts @@ -9,6 +9,57 @@ enum PinEvent { Fall = DAL.MICROBIT_PIN_EVT_FALL, // DEVICE_PIN_EVT_FALL } +enum AnalogReadWritePin { + //% blockIdentity="pins._analogReadWritePinShadow" + P0 = AnalogPin.P0, + + //% blockIdentity="pins._analogReadWritePinShadow" + P1 = AnalogPin.P1, + + //% blockIdentity="pins._analogReadWritePinShadow" + P2 = AnalogPin.P2, + + //% blockIdentity="pins._analogReadWritePinShadow" + C4 = AnalogPin.C4, + //% blockIdentity="pins._analogReadWritePinShadow" + //% blockHidden=true + P4 = AnalogPin.C4, + + //% blockIdentity="pins._analogReadWritePinShadow" + C10 = AnalogPin.C10, + //% blockIdentity="pins._analogReadWritePinShadow" + //% blockHidden=true + P10 = AnalogPin.C10, + + //% blockIdentity="pins._analogReadWritePinShadow" + //% block="C16 (A1 RX)" + C16 = AnalogPin.C16, // -> A1_RX + //% blockIdentity="pins._analogReadWritePinShadow" + //% blockHidden=true + P16 = AnalogPin.C16, // -> A1_RX + //% blockIdentity="pins._analogReadWritePinShadow" + //% block="A1 RX" blockHidden=true + A1_RX = AnalogPin.C16, // SCL + + //% blockIdentity="pins._analogReadWritePinShadow" + C18 = AnalogPin.C18, // -> P18 + //% blockIdentity="pins._analogReadWritePinShadow" + //% blockHidden=true + P18 = AnalogPin.C18, // LED matrix COL 3 + + //% blockIdentity="pins._analogReadWritePinShadow" + //% block="C19 (A0 SCL)" blockHidden=true + A0_SCL = AnalogPin.A0_SCL, // SCL + + //% blockIdentity="pins._analogReadWritePinShadow" + //% block="C20 (A0 SDA)" blockHidden=true + A0_SDA = AnalogPin.A0_SDA, // SDA + + //% blockIdentity="pins._analogReadWritePinShadow" + //% blockHidden=true + MIC = AnalogPin.MIC // microphone +} + //% noRefCounting fixedInstances interface DigitalInOutPin { digitalRead(): boolean; @@ -121,6 +172,8 @@ class MicrobitPin implements AnalogInPin, AnalogOutPin, AnalogInOutPin, PwmOnlyP } } + + namespace pins { /** * Pin P0 @@ -132,91 +185,111 @@ namespace pins { * Pin P1 */ //% fixedInstance whenUsed - export const P1: AnalogInPin = new MicrobitPin(DigitalPin.P1); + export const P1: PwmPin = new MicrobitPin(DigitalPin.P1); /** * Pin P2 */ //% fixedInstance whenUsed - export const P2: AnalogInPin = new MicrobitPin(DigitalPin.P2); + export const P2: PwmPin = new MicrobitPin(DigitalPin.P2); /** * Pin P3 */ //% fixedInstance whenUsed - export const P3: PwmPin = new MicrobitPin(DigitalPin.P3); + export const P3: PwmOnlyPin = new MicrobitPin(DigitalPin.P3); /** * Pin C4 */ //% fixedInstance whenUsed - export const C4: AnalogInPin = new MicrobitPin(DigitalPin.C4); + export const C4: PwmPin = new MicrobitPin(DigitalPin.C4); /** * Pin C5 */ //% fixedInstance whenUsed - export const C5: AnalogInPin = new MicrobitPin(DigitalPin.C5); + export const C5: PwmOnlyPin = new MicrobitPin(DigitalPin.C5); /** * Pin C6 */ //% fixedInstance whenUsed - export const C6: AnalogInPin = new MicrobitPin(DigitalPin.C6); + export const C6: PwmOnlyPin = new MicrobitPin(DigitalPin.C6); /** * Pin C7 */ //% fixedInstance whenUsed - export const C7: DigitalInOutPin = new MicrobitPin(DigitalPin.C7); + export const C7: PwmOnlyPin = new MicrobitPin(DigitalPin.C7); /** * Pin C8 */ //% fixedInstance whenUsed - export const C8: DigitalInOutPin = new MicrobitPin(DigitalPin.C8); + export const C8: PwmOnlyPin = new MicrobitPin(DigitalPin.C8); /** * Pin C9 */ //% fixedInstance whenUsed - export const C9: DigitalInOutPin = new MicrobitPin(DigitalPin.C9); + export const C9: PwmOnlyPin = new MicrobitPin(DigitalPin.C9); /** * Pin C10 */ //% fixedInstance whenUsed - export const C10: DigitalInOutPin = new MicrobitPin(DigitalPin.C10); + export const C10: PwmPin = new MicrobitPin(DigitalPin.C10); /** * Pin C11 */ //% fixedInstance whenUsed - export const C11: DigitalInOutPin = new MicrobitPin(DigitalPin.C11); + export const C11: PwmOnlyPin = new MicrobitPin(DigitalPin.C11); /** * Pin C12 */ //% fixedInstance whenUsed - export const C12: DigitalInOutPin = new MicrobitPin(DigitalPin.C12); + export const C12: PwmOnlyPin = new MicrobitPin(DigitalPin.C12); + + + /** + * Pin C13 + */ + //% fixedInstance whenUsed + export const C13: PwmOnlyPin = new MicrobitPin(DigitalPin.C13); + + /** + * Pin C14 + */ + //% fixedInstance whenUsed + export const C14: PwmOnlyPin = new MicrobitPin(DigitalPin.C14); + + + /** + * Pin C15 + */ + //% fixedInstance whenUsed + export const C15: PwmOnlyPin = new MicrobitPin(DigitalPin.C15); /** * Pin C16 */ //% fixedInstance whenUsed - export const C16: AnalogInPin = new MicrobitPin(DigitalPin.C16); + export const C16: PwmPin = new MicrobitPin(DigitalPin.C16); /** * Pin C17 */ //% fixedInstance whenUsed - export const C17: AnalogInPin = new MicrobitPin(DigitalPin.C17); + export const C17: PwmOnlyPin = new MicrobitPin(DigitalPin.C17); /** * Pin C18 */ //% fixedInstance whenUsed - export const C18: DigitalInOutPin = new MicrobitPin(DigitalPin.C18); + export const C18: PwmPin = new MicrobitPin(DigitalPin.C18); } \ No newline at end of file diff --git a/libs/core/pxt.json b/libs/core/pxt.json index 7022e0108..41f232e0e 100644 --- a/libs/core/pxt.json +++ b/libs/core/pxt.json @@ -78,6 +78,7 @@ "testFiles": [], "dependencies": {}, "dalDTS": { + "corePackage": ".", "compileServiceVariant": "minicodal", "includeDirs": [ "libraries/codal-core/inc", diff --git a/libs/core/pxtcore.h b/libs/core/pxtcore.h index 14af8637f..f986ab240 100644 --- a/libs/core/pxtcore.h +++ b/libs/core/pxtcore.h @@ -14,14 +14,14 @@ void debuglog(const char *format, ...); #define xmalloc malloc #define xfree free -#define GC_MAX_ALLOC_SIZE 9000 - #define NON_GC_HEAP_RESERVATION 1024 #ifdef CODAL_CONFIG_H #define MICROBIT_CODAL 1 +#define GC_MAX_ALLOC_SIZE 11000 #else #define MICROBIT_CODAL 0 +#define GC_MAX_ALLOC_SIZE 9000 #define GC_BLOCK_SIZE 256 #endif diff --git a/libs/core/shims.d.ts b/libs/core/shims.d.ts index c58f78446..f748c4167 100644 --- a/libs/core/shims.d.ts +++ b/libs/core/shims.d.ts @@ -736,10 +736,8 @@ declare namespace pins { */ //% help=pins/digital-read-pin weight=30 //% blockId=device_get_digital_pin block="digital read|pin %name" blockGap=8 - //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 - //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" - //% group="Digital" shim=pins::digitalReadPin - function digitalReadPin(name: DigitalPin): int32; + //% name.shadow=digital_pin_shadow shim=pins::digitalReadPin + function digitalReadPin(name: int32): int32; /** * Set a pin or connector value to either 0 or 1. @@ -749,10 +747,8 @@ declare namespace pins { //% help=pins/digital-write-pin weight=29 //% blockId=device_set_digital_pin block="digital write|pin %name|to %value" //% value.min=0 value.max=1 - //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 - //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" - //% group="Digital" shim=pins::digitalWritePin - function digitalWritePin(name: DigitalPin, value: int32): void; + //% name.shadow=digital_pin_shadow shim=pins::digitalWritePin + function digitalWritePin(name: int32, value: int32): void; /** * Read the connector value as analog, that is, as a value comprised between 0 and 1023. @@ -760,10 +756,8 @@ declare namespace pins { */ //% help=pins/analog-read-pin weight=25 //% blockId=device_get_analog_pin block="analog read|pin %name" blockGap="8" - //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 - //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" - //% group="Analog" shim=pins::analogReadPin - function analogReadPin(name: AnalogPin): int32; + //% name.shadow=analog_read_write_pin_shadow shim=pins::analogReadPin + function analogReadPin(name: int32): int32; /** * Set the connector value as analog. Value must be comprised between 0 and 1023. @@ -773,23 +767,19 @@ declare namespace pins { //% help=pins/analog-write-pin weight=24 //% blockId=device_set_analog_pin block="analog write|pin %name|to %value" blockGap=8 //% value.min=0 value.max=1023 - //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 - //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" - //% group="Analog" shim=pins::analogWritePin - function analogWritePin(name: AnalogPin, value: int32): void; + //% name.shadow=analog_pin_shadow shim=pins::analogWritePin + function analogWritePin(name: int32, value: int32): void; /** * Configure the pulse-width modulation (PWM) period of the analog output in microseconds. * If this pin is not configured as an analog output (using `analog write pin`), the operation has no effect. * @param name analog pin to set period to, eg: AnalogPin.P0 - * @param micros period in micro seconds. eg:20000 + * @param micros period in microseconds. eg:20000 */ //% help=pins/analog-set-period weight=23 blockGap=8 //% blockId=device_set_analog_period block="analog set period|pin %pin|to (µs)%micros" - //% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4 - //% pin.fieldOptions.tooltips="false" - //% group="Analog" shim=pins::analogSetPeriod - function analogSetPeriod(name: AnalogPin, micros: int32): void; + //% pin.shadow=analog_pin_shadow shim=pins::analogSetPeriod + function analogSetPeriod(name: int32, micros: int32): void; /** * Configure the pin as a digital input and generate an event when the pin is pulsed either high or low. @@ -798,10 +788,11 @@ declare namespace pins { */ //% help=pins/on-pulsed weight=22 blockGap=16 advanced=true //% blockId=pins_on_pulsed block="on|pin %pin|pulsed %pulse" - //% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4 - //% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="250" - //% group="Pulse" shim=pins::onPulsed - function onPulsed(name: DigitalPin, pulse: PulseValue, body: () => void): void; + //% pin.shadow=digital_pin_shadow + //% group="Pulse" + //% weight=25 + //% blockGap=8 shim=pins::onPulsed + function onPulsed(name: int32, pulse: PulseValue, body: () => void): void; /** * Get the duration of the last pulse in microseconds. This function should be called from a ``onPulsed`` handler. @@ -821,10 +812,11 @@ declare namespace pins { //% blockId="pins_pulse_in" block="pulse in (µs)|pin %name|pulsed %value" //% weight=20 advanced=true //% help=pins/pulse-in - //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 - //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" - //% group="Pulse" maxDuration.defl=2000000 shim=pins::pulseIn - function pulseIn(name: DigitalPin, value: PulseValue, maxDuration?: int32): int32; + //% name.shadow=digital_pin_shadow + //% group="Pulse" + //% weight=23 + //% blockGap=8 maxDuration.defl=2000000 shim=pins::pulseIn + function pulseIn(name: int32, value: PulseValue, maxDuration?: int32): int32; /** * Write a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement). @@ -835,41 +827,38 @@ declare namespace pins { //% blockId=device_set_servo_pin block="servo write|pin %name|to %value" blockGap=8 //% parts=microservo trackArgs=0 //% value.min=0 value.max=180 - //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 - //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" + //% name.shadow=analog_pin_shadow //% group="Servo" shim=pins::servoWritePin - function servoWritePin(name: AnalogPin, value: int32): void; + function servoWritePin(name: int32, value: int32): void; /** * Specifies that a continuous servo is connected. */ - //% - //% group="Servo" shim=pins::servoSetContinuous - function servoSetContinuous(name: AnalogPin, value: boolean): void; + //% shim=pins::servoSetContinuous + function servoSetContinuous(name: int32, value: boolean): void; /** * Configure the IO pin as an analog/pwm output and set a pulse width. The period is 20 ms period and the pulse width is set based on the value given in **microseconds** or `1/1000` milliseconds. * @param name pin name - * @param micros pulse duration in micro seconds, eg:1500 + * @param micros pulse duration in microseconds, eg:1500 */ //% help=pins/servo-set-pulse weight=19 //% blockId=device_set_servo_pulse block="servo set pulse|pin %value|to (µs) %micros" - //% value.fieldEditor="gridpicker" value.fieldOptions.columns=4 - //% value.fieldOptions.tooltips="false" value.fieldOptions.width="250" + //% value.shadow=analog_pin_shadow //% group="Servo" shim=pins::servoSetPulse - function servoSetPulse(name: AnalogPin, micros: int32): void; + function servoSetPulse(name: int32, micros: int32): void; /** * Set the pin used when using analog pitch or music. * @param name pin to modulate pitch from */ //% blockId=device_analog_set_pitch_pin block="analog set pitch pin %name" - //% help=pins/analog-set-pitch-pin weight=3 advanced=true - //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 - //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" - //% blockHidden=true - //% group="Pitch" shim=pins::analogSetPitchPin - function analogSetPitchPin(name: AnalogPin): void; + //% help=pins/analog-set-pitch-pin advanced=true + //% name.shadow=analog_pin_shadow + //% group="Pins" + //% weight=12 + //% blockGap=8 shim=pins::analogSetPitchPin + function analogSetPitchPin(name: int32): void; /** * Sets the volume on the pitch pin @@ -892,9 +881,9 @@ declare namespace pins { function analogPitchVolume(): int32; /** - * Emit a plse-width modulation (PWM) signal to the current pitch pin. Use `analog set pitch pin` to define the pitch pin. + * Send a pulse-width modulation (PWM) signal to the current pitch pin. Use `analog set pitch pin` to define the pitch pin. * @param frequency frequency to modulate in Hz. - * @param ms duration of the pitch in milli seconds. + * @param ms duration of the pitch in milliseconds. */ //% blockId=device_analog_pitch block="analog pitch %frequency|for (ms) %ms" //% help=pins/analog-pitch async advanced=true @@ -911,10 +900,11 @@ declare namespace pins { */ //% help=pins/set-pull weight=3 advanced=true //% blockId=device_set_pull block="set pull|pin %pin|to %pull" - //% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4 - //% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="250" - //% group="Digital" shim=pins::setPull - function setPull(name: DigitalPin, pull: PinPullMode): void; + //% pin.shadow=digital_pin_shadow + //% group="Pins" + //% weight=15 + //% blockGap=8 shim=pins::setPull + function setPull(name: int32, pull: PinPullMode): void; /** * Configure the events emitted by this pin. Events can be subscribed to @@ -924,10 +914,11 @@ declare namespace pins { */ //% help=pins/set-events weight=4 advanced=true //% blockId=device_set_pin_events block="set pin %pin|to emit %type|events" - //% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4 - //% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="250" - //% group="Digital" shim=pins::setEvents - function setEvents(name: DigitalPin, type: PinEventType): void; + //% pin.shadow=digital_pin_shadow + //% group="Pins" + //% weight=13 + //% blockGap=8 shim=pins::setEvents + function setEvents(name: int32, type: PinEventType): void; /** * Create a new zero-initialized buffer. @@ -942,13 +933,14 @@ declare namespace pins { * @param name pin of Neopixel strip, eg: DigitalPin.P0 * @param value width of matrix (at least ``2``) */ - //% help=pins/neopixel-matrix-width weight=3 advanced=true - //% blockId=pin_neopixel_matrix_width block="neopixel matrix width|pin %pin %width" blockGap=8 - //% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4 - //% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="250" + //% help=pins/neopixel-matrix-width advanced=true + //% blockId=pin_neopixel_matrix_width block="neopixel matrix width|pin %pin %width" + //% pin.shadow=digital_pin_shadow //% width.min=2 - //% blockHidden=true width.defl=5 shim=pins::setMatrixWidth - function setMatrixWidth(pin: DigitalPin, width?: int32): void; + //% group="Pins" + //% weight=11 + //% blockGap=8 width.defl=5 shim=pins::setMatrixWidth + function setMatrixWidth(pin: int32, width?: int32): void; /** * Read `size` bytes from a 7-bit I2C `address`. @@ -1007,33 +999,30 @@ declare namespace pins { */ //% help=pins/spi-pins weight=2 advanced=true //% blockId=spi_pins block="spi set pins|MOSI %mosi|MISO %miso|SCK %sck" - //% mosi.fieldEditor="gridpicker" mosi.fieldOptions.columns=4 - //% mosi.fieldOptions.tooltips="false" mosi.fieldOptions.width="250" - //% miso.fieldEditor="gridpicker" miso.fieldOptions.columns=4 - //% miso.fieldOptions.tooltips="false" miso.fieldOptions.width="250" - //% sck.fieldEditor="gridpicker" sck.fieldOptions.columns=4 - //% sck.fieldOptions.tooltips="false" sck.fieldOptions.width="250" - //% group="spi" shim=pins::spiPins - function spiPins(mosi: DigitalPin, miso: DigitalPin, sck: DigitalPin): void; + //% mosi.shadow=digital_pin_shadow + //% miso.shadow=digital_pin_shadow + //% sck.shadow=digital_pin_shadow + //% group="SPI" + //% blockGap=8 + //% weight=51 shim=pins::spiPins + function spiPins(mosi: int32, miso: int32, sck: int32): void; /** * Mounts a push button on the given pin */ - //% help=pins/push-button advanced=true - //% group="Digital" shim=pins::pushButton - function pushButton(pin: DigitalPin): void; + //% help=pins/push-button advanced=true shim=pins::pushButton + function pushButton(pin: int32): void; /** * Set the pin used when producing sounds and melodies. Default is P0. * @param name pin to modulate pitch from */ //% blockId=pin_set_audio_pin block="set audio pin $name" - //% help=pins/set-audio-pin weight=3 - //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 - //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" + //% help=pins/set-audio-pin + //% name.shadow=digital_pin_shadow //% weight=1 - //% group="Pitch" shim=pins::setAudioPin - function setAudioPin(name: AnalogPin): void; + //% blockGap=8 shim=pins::setAudioPin + function setAudioPin(name: int32): void; /** * Sets whether or not audio will be output using a pin on the edge @@ -1041,7 +1030,7 @@ declare namespace pins { */ //% blockId=pin_set_audio_pin_enabled //% block="set audio pin enabled $enabled" - //% weight=0 shim=pins::setAudioPinEnabled + //% weight=0 help=pins/set-audio-pin-enabled shim=pins::setAudioPinEnabled function setAudioPinEnabled(enabled: boolean): void; } diff --git a/libs/datalogger/datalogger.ts b/libs/datalogger/datalogger.ts index ab871b614..e1a419d70 100644 --- a/libs/datalogger/datalogger.ts +++ b/libs/datalogger/datalogger.ts @@ -277,4 +277,25 @@ namespace datalogger { init(); flashlog.setSerialMirroring(on); } + + /** + * Number of rows currently used by the datalogger, start counting at fromRowIndex + * Treats the header as the first row + * @param fromRowIndex 0-based index of start + * @returns header + rows + */ + export function getNumberOfRows(fromRowIndex: number = 0): number { + return flashlog.getNumberOfRows(fromRowIndex); + } + + /** + * Get all rows seperated by a newline & each column seperated by a comma. + * Starting at the 0-based index fromRowIndex & counting inclusively until nRows. + * @param fromRowIndex 0-based index of start + * @param nRows inclusive count from fromRowIndex + * @returns String where newlines denote rows & commas denote columns + */ + export function getRows(fromRowIndex: number, nRows: number): string { + return flashlog.getRows(fromRowIndex, nRows); + } } diff --git a/libs/datalogger/docs/reference/datalogger.md b/libs/datalogger/docs/reference/datalogger.md index 6b5edcf7e..928b8e794 100644 --- a/libs/datalogger/docs/reference/datalogger.md +++ b/libs/datalogger/docs/reference/datalogger.md @@ -23,7 +23,7 @@ A data log will represent a table of information like: | 19 | 4 | 98 |
-A data item consits of value name, which is it's assigned column too, and the item's value. They are called "column-value" items. Here's how a column-value item is created. +A data item consists of value name, which is it's assigned column too, and the item's value. They are called "column-value" items. Here's how a column-value item is created. ```blocks let item = datalogger.createCV("temperature", input.temperature()) @@ -67,4 +67,4 @@ datalogger.mirrorToSerial(false) ```package datalogger -``` \ No newline at end of file +``` diff --git a/libs/datalogger/docs/reference/datalogger/create-cv.md b/libs/datalogger/docs/reference/datalogger/create-cv.md index 21f660e45..d6a0b765c 100644 --- a/libs/datalogger/docs/reference/datalogger/create-cv.md +++ b/libs/datalogger/docs/reference/datalogger/create-cv.md @@ -12,8 +12,8 @@ A data log entry is written to the data log as an array of one or more "column-v ## Parameters -* **colunm**: a [string](types/string) name that idenifies the data value. -* **value**: a data value of _any_ type that is logged with the `colunm` name. +* **column**: a [string](types/string) name that identifies the data value. +* **value**: a data value of _any_ type that is logged with the `column` name. ## Example @@ -29,10 +29,10 @@ loops.everyInterval(500, function () { ### Mood experiment -Create an experiment to record a person's moods and relate them to current enviromental factors. Set 3 button options for moods of "happy", "sad", and "angry". When the user signals their mood by pressing a button, read the current temperature, light level, and sound level to establish a relationship between those factors and mood. +Create an experiment to record a person's moods and relate them to current environmental factors. Set 3 button options for moods of "happy", "sad", and "angry". When the user signals their mood by pressing a button, read the current temperature, light level, and sound level to establish a relationship between those factors and mood. ```blocks -input.onButtonPressed(Button.A, function () { +input.onButtonEvent(Button.A, input.buttonEventClick(), function () { logMood("happy") }) function logMood (mood: string) { @@ -42,10 +42,10 @@ function logMood (mood: string) { columns[3] = datalogger.createCV("temperature", input.temperature()) datalogger.logData(columns) } -input.onButtonPressed(Button.AB, function () { +input.onButtonEvent(Button.AB, input.buttonEventClick(), function () { logMood("angry") }) -input.onButtonPressed(Button.B, function () { +input.onButtonEvent(Button.B, input.buttonEventClick(), function () { logMood("sad") }) let columns: datalogger.ColumnValue[] = [] diff --git a/libs/flashlog/flashlog.cpp b/libs/flashlog/flashlog.cpp index 0e242b042..a94a19ef8 100644 --- a/libs/flashlog/flashlog.cpp +++ b/libs/flashlog/flashlog.cpp @@ -128,4 +128,35 @@ void setSerialMirroring(bool enable) { #endif } +/** +* Number of rows currently used by the datalogger, start counting at fromRowIndex +* Treats the header as the first row +* @param fromRowIndex 0-based index of start: Default value of 0 +* @returns header + rows +*/ +//% +int getNumberOfRows(int fromRowIndex = 0) { +#if MICROBIT_CODAL + return uBit.log.getNumberOfRows(fromRowIndex); +#else + return DEVICE_NOT_SUPPORTED; +#endif +} + +/** +* Get all rows separated by a newline & each column separated by a comma. +* Starting at the 0-based index fromRowIndex & counting inclusively until nRows. +* @param fromRowIndex 0-based index of start +* @param nRows inclusive count from fromRowIndex +* @returns String where newlines denote rows & commas denote columns +*/ +//% +String getRows(int fromRowIndex, int nRows) { +#if MICROBIT_CODAL + return PSTR(uBit.log.getRows(fromRowIndex, nRows)); +#else + return DEVICE_NOT_SUPPORTED; +#endif +} + } diff --git a/libs/flashlog/shims.d.ts b/libs/flashlog/shims.d.ts index 8fa9af5bf..a1e5d0829 100644 --- a/libs/flashlog/shims.d.ts +++ b/libs/flashlog/shims.d.ts @@ -68,6 +68,25 @@ declare namespace flashlog { //% parts="flashlog" //% blockGap=8 shim=flashlog::setSerialMirroring function setSerialMirroring(enable: boolean): void; + + /** + * Number of rows currently used by the datalogger, start counting at fromRowIndex + * Treats the header as the first row + * @param fromRowIndex 0-based index of start: Default value of 0 + * @returns header + rows + */ + //% fromRowIndex.defl=0 shim=flashlog::getNumberOfRows + function getNumberOfRows(fromRowIndex?: int32): int32; + + /** + * Get all rows separated by a newline & each column separated by a comma. + * Starting at the 0-based index fromRowIndex & counting inclusively until nRows. + * @param fromRowIndex 0-based index of start + * @param nRows inclusive count from fromRowIndex + * @returns String where newlines denote rows & commas denote columns + */ + //% shim=flashlog::getRows + function getRows(fromRowIndex: int32, nRows: int32): string; } // Auto-generated. Do not edit. Really. diff --git a/libs/flashlog/test.ts b/libs/flashlog/test.ts index 0ee38e6e4..7c1aec074 100644 --- a/libs/flashlog/test.ts +++ b/libs/flashlog/test.ts @@ -1,4 +1,4 @@ -input.onButtonPressed(Button.AB, function() { +input.onButtonEvent(Button.AB, input.buttonEventClick(), function() { flashlog.clear() }) flashlog.setTimeStamp(FlashLogTimeStampFormat.Milliseconds) diff --git a/libs/fonts/_locales/fonts-jsdoc-strings.json b/libs/fonts/_locales/fonts-jsdoc-strings.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/libs/fonts/_locales/fonts-jsdoc-strings.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/libs/fonts/_locales/fonts-strings.json b/libs/fonts/_locales/fonts-strings.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/libs/fonts/_locales/fonts-strings.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/libs/fonts/font12.jres b/libs/fonts/font12.jres new file mode 100644 index 000000000..939fc30fa --- /dev/null +++ b/libs/fonts/font12.jres @@ -0,0 +1,6 @@ +{ + "bitmap.font12": { + "mimeType": "font/x-mkcd-b26", + "data": "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9A9UANwHAAD4AQAI/AcAADhSIAGqCOoIrAS4Aq4BqAi4CKwG6gGqACABOVJQBFQDVAjIB0wAUgFSBgAA/AkACP4PAAA6UgAEdAYUAf4PFAH0AgAA/AEACAAI/gcAADtSAAAkCbQErwJkAhQDxAQAAPwJAAj+DwAAPVIgAJAMiAakBaYEiAawCAAA+AkACP4HAABCUkQIVARUAzYANACsDyQAAAD8CQAI/wcAAENSAAToBKoCrAH4D64AuAcAAPwJAAj+BwAAR1IACP4FKgUqASoB/g0AAPwBAAgACP4HAABKUgAA9g9QAV4JUAn2BwAA/AEACAAI/gcAAE1SAADoD6oCrAqoCugHCADoAw4I6AcIAAAATlIAAFIEUgNMAOQPSgJqBAAA/AkACP4HAABRUhAAWAiEBRIE0wQEB8gCAAL8CAAI/gcAAFRSAAG+BOoCqg2qA6oIvgcAAPwJAAj+BwAAVlIkAKwPrASmBKQEvASsBwAA/AkACP4PAABbUgAA/A8MA+QDFAn8BwAA+AEACPwHAAAAAF1SAADAANgKVgrUB3QAzAYAAPgJAAj+BwAAY1IQCPAEvAbyAbQC5AwAAPwBAAgACP4HAABkUgAAJAisB5YCrAKkDyQAAAD8AQAI/g8AAGVSoAIqCioJ6g8qAb4CoAYAAPwJAAj+BwAAZ1LABz4AqgeqBPoEqgSuBwAA/AAACP8HAABpUogIbARsAgwB/A8MAWoCKAQAAPwJAAj+B2pSAAV8BTwFPgW8A/wBBAF0BQYFdAUEAwAAb1ICAN4PVgXWB1YFVgXeDwAA/AkACP4HAABwUgAArAT8AqwB/A+qAvoGAAD4AQAI/gcAAHJSjAC8D7QFtAX2BbQHtAeMBwAA/AEACP4HdVIQABAO0AP4BfQF5AXoBwAA+AEACPwHAAB/UgAIdgVwBXQD+g94A3ADdgUAAPgJAAj+B4NSSAT8B/wH/gf8B/wH/Af8BwAE+AEACPwHh1IADvgBGATYBn4DbA9sAggE8AEACPwPAACIUoAAfAj0CbQJtAX4A1QBXAn2CVwJVAcAAIlSAACcCcoLyQmwB84FQgUOBPgBAAj+BwAAjVIICOgErALqAEsIogbkBAAA/AEACP4HAACRUjgASAz0A4wClgK8AswPIAD8AQAI/gcAAJtSAAAQCBAEEAKQAX4AEAAQCBAIEAzwAwAAnVIABBQCZAHkABwJAASIA34ACAgICPgHAACeUgAAiAloBAgCiAF+CAgICAz4AwAA4AEAAJ9SBAIEAvwBBAkECRAEEAP+CBAIEAzwAwAAoFIICAgG/gEICAgI+AcAAPwPBAQEBPwPAAChUkAIUAlICSwFNgOkASQJNAlMCUQHQAAAAKNSKAioCKQIogSgA54AkAiICIIIhAcIAAAAqFIAACQE5AMkAqQCJAMACBAH/gAQCPAHAACpUgAE/gOSBJIC/gsABBAD8AgfCBAI8AcAAKpSAAhECVwJZgUkA1wBRAE0CSQJXAdEAAAAq1IAAEgHyAR+AkgCQAcQABAP/gAQCPAHAACxUgAO/AEUDPQDVAjUBwQAEAf8ABAI8AcAALJSAACkCKQElAesBKQEMAAQDv4BEAjwBwAAs1IACLQIlASWBJQD1ACUCJQIlgiUBzQAAAC0UgAIuAiKBIoEiALrAYgIiAiMCIoHOAAAALlSKAioBKgCDAGoAggIUAQQA/4IEAjwBwAAv1IAABQIVAl+BRQFwAM0AR4JBAk8B0AAIADBUgAAtASEBLQHhAS0DAQEEAP+CBAI8AcAAMNSAAA0AhQJXgeUATQJAAQQA/4IEAjwBwAAx1IACAIK+gqqBqoC+gKqAq4Kqgr6BgAAAADJUhAI+ASWA/QAnAfwCBgKmAl+CAgK+AkABMtSAAjuCSoEqgMqCO4LAAAQB/4AEAjwBwAA0lIAAOQCvgL0D74C5AgEBBAD/ggQCPAHAADVUgAAfAl8CfwHeg0IBBgCkAF+CBAI8AcAANhSgACCB/8FqgSqBP8FggwIAv8BCAT4AwAA2VIAACoDqgjqBzYA4AlIBy4BNAk0CSwHRAHdUgAM/gOSCP4HgAFqCTgHrgE4CW4JqgcAAd5SEgiSCKgErgSgAqIBpAioCKYIKAdyAAAA31IAAkQB/AV+A3wDfAF8BX4F/AN8AUQCAADiUgAArAmsCe4FrAWAA/gBGAkOCXgGgABgAORSAAj0CdYF9AfWBfQFAAwQA/4IEAjwBwAA51IAACAB7A+4B+gHqAeoDgAG/AEQCPAHAADyUgAB/g3+Af4B/g3+AQgLmAh+AAgB+AwAAPNSBAh9BW0B/wTsAvwCAAaIAX8ECAT4AwAA9VIADPwDzA/8AewD/AvMDwAM/gMQCPAHAAD4UgAB+g+7B4AHuwe6BwAM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JAAAAK1T+AcEAPQD/AJ8B3QFhAckBPwDJAEUAgAErlMABv4BAgT6AVoD+gECDPoDSgDKD0oAAACyUwAO/gECAOoP6gHqBeIH6gXqBeoJCg8CALNTAA74AQ4E+Ae4BroG/A8IAOgMLAPqBSgIu1NAAEgMSAZIBcgEfgRIBEgFSAZICEAAAAC/UwAAgACABP4GqgWqBKoEqgSqBP4GgASAAMFTIAGoCKgK7Aq6CqgKqgruCqgKqAggAQAAwlMgASgBqAhsCroKqAooCWoErASgACABAADDUwAAAAGwAKQJdgulChQKJgl2BKAEMAFAAchTAAAACAQIHARkBIQCBAGEAmQEHAQECAAIyVMACAQIPAREBJQCFAGUAkQEPAQEBAAIAADKUwAEBAaEAXwIJATEBAQDHAOQAnAEEAQAAMtTAAQIBAgDyAh+BKgEKAMoA6gEaAQICAAEzFMUCDQERALkARwKAAh8BIQDxAI8BAAIAADNUwAAAAz8AyQI5AgkBSQCJAakBWQIBAgAAM5TAAL4AQABAAH+DwAAFAjkBAQDxAQ8BAQI0VMABBACHAuQCPAIXgVQBlAF1ghQCBAIAADUUwACoAEgCP4PJACgCwQIfAaEAeQCHAwACNZTBAT8B5QElASUAvwPAABoCIgFCAPoBBgI11MAAHQIHATcBFQFXAJcAlIF2gQaBDAIAADYUwAIpAiUCIQJvAaGBIYEvAaECZQIJAgACNlTUAZYAVQI8g9UAFQDBAh8BIQDxAI8DAAA21MAAKwIoAb+AaQAAA78AXIMkgOSAnIMAATgUwAA6Ah2CFYPVg9GD1YPXg9WD3gIyAgAAOFTAACoANgHvwfaB/oHkAAMDPQChAF8BgAE4lMIAKoE7Af4B/wH6A/oAPwH7AXqB4gJgAjjUwAAAAD8DwQEBAQEBAQEBAQEBPwPAAAAAORTAAAIAIgPiASIBP4EiASIBIgEiA8IAAAA5VMAAGAAEADMByoCKAIoAugLCAgIDPgDAADmUwAAgAi8BKQEpAPkAKQApAikCLwIgAcAAOhTAAD8AwQB/AkACAQGhAF8BAQIBAz8AwAA6VMAAPwDBAEEAfwBAAD8DwQABAIEAvwBAADqUwAAAAh8BEQCRAFEAEQARAFEAnwEAAgAAOtTAAD8AwQBBAH8AQAA/AMAAQAB/g8AAAAA7FOAAEQARA8kCRQJ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ggCyAIoAAAB9VAAAEADQB1gCWALUAxIA1A9YAEgC0AEQAIZUAAD8AwQB/AEwAPgDlgSUBPQFBAX8BAACi1QAAPwDBAH8ARAACAAOAPgPKAEoASgBAACMVAAClAFUAPwHUgAAAPwHBAIEAgQC/AcAAI9UAAD8AwQB/AQAAtQBFAj0D4QAQAEgBgAEkFQAAPwDBAH8AWAA/A8CANAAEAkQCP4HEACSVAAIHAgUBNQDXABAAFwAVADUBxwIAAgABpVUAAD8AwQB/AEAAJAPkASQBP4EkASQDxAAllQAAPwHBAH8DAAC/gkIDPAD/A8EBPwPAACZVAAA/AMEAfwJAASQA34IEATyB5YIVAgQBJpUAAD8AwQB/AFQAEgCLgK1BDQFTAlEAEAAplQAAPwDBAH8AQAI7ASsAv4BrAKsBLwJAAinVAAA/AMEAfwBQAi8BJQDYAD4CQAI/gcAAKhUIAARAIoPoASsBKMEkgSOBJIEog8uAAAAqlQAAPwHBAL8AwAIrAcgAP4PIACoAyQMAACsVAAA/AMEAfwBAAgoCKgECgPMBQgEaAhACK9UAAD8AwQB/AEQAYgPVgllCXQJXAmED4AAsVQAAPwBBAH8AQAA+AeoAqwCqgKoAvgHAACyVAAA/AMEAfwJAAhOBEwC+AFMAk4ESggAALNUAAD8AwQB/AEACCQFtARvAiQClAVECAAAuFQADPgDCACoB6gCqAoIC/4ICAfKCCwIAAa9VAAA/AMEAfgA/g8CBCIF+gSiBQIE/g8AAMBUAAIEAXQBVA/UBFUE1gRUAVQCdAUEBQAIwVQAAMAPQAReBNIHEgDSD1IEXgRABMAPAADEVAAA/AMEAfwBAAiIBP4CiACIAP4CiAyACMZUAAD8AwQB/AEACCgJpASWBFQCTAHEAAAAx1QAAPwDBAH8AQAIJAkkCb4PJAkkCSAJAADIVAAA/AMEAfwBYAAwD6gEpgSoBDAPYABAAMlUEADUB1QCXgJUAtQJEAz+AhADkgRUCAAHzVQAAPwDBAH8AQAA+A8IAOgDLgHoCQgI+AfOVAAA/AMEAfwBAAgkCM4EBAMEBc4EJAgECNFUAAD8AwQB/AVABAQE/AcEBPwHBATkBAAA11QAAPwDBAH8AQAAfAECAZAPPgFIAUQBJADfVAAA/AMEAfwBAAT8BYIEEALOCAgI+AcAAOFUAAAACP8LrQatBq0CrQKtBq0G/wsACAAA5VQAAEQAfAdsBWwFbAVsB3wARAj8D0QAAADmVAAA/AMEAfwBAAj8D5IAEAz+A5AFVggABuhUAAD8AwQB/AEAAPYPUAFeAVAJUAn2BwAA6VT8AwQB/AEAAHwJVAlUCfwPVAlUCXwJAADqVAAA/AMEAfgMAgL+CZII/gf8DwIA/gMAAO1UgAieCJIIkgSeA8AAnAOUBNQE3AiACAAA7lQAAP4BggD+AIABagEqCb8PagEuASoBCQHyVAAAEgCyD78EigSgBJ4EiQSJBLkHCQAIAPpU/AMEAfwBAADoD6gCqAL+D6gCqgrsBwAA/FQAAPwBhAD8AAAAvAisCK4OrAGsAbwABAABVQAA/AcEA/wDAACoDqgKqgqqCqgKqA4IAAZVAAD8AwQB/AlACCgJngaIBPwGzAVYCEAIB1UAAAAP/gAiDuoKqgpqCqoKqgoqDSIBAAAJVQAA/AMEAfwBAAgoCS4F6gMoBS4JKAkAABBVAAb8AQQAXAdcBVwF/gVcBVwFfAcUAAAAFFUAAPwDBAH8AQAAqge6BK4EqgS6BKIHIAAgVQAA/AMEAfwBAAiUBJYC1AmUCJYMNAMAACRV/AMEAfwBAAj4BJQClgH0AZwClAT0BIAIJ1UAAPwDBAH8AQAE/AdUAjwA+A8EAPwDAAAsVQAA/AMEAfwBAAz4AygIPgdsAGwHTAgABC5VCAAIAHwPXgVcBVwFfgVcBVwFXA9EAAAAL1UAAPwDBAH8AQAA/A+qBKgE/geoBKgEAAAxVQAA/AMEAfwBAAD+B2oFagVqBWoF/gcAADdVAAD8AwQB/AEACPQH7ADmAmUKZAr0ByQAOFUAAPwDBAH8CAAGKACkBLIJNAr0ACQGCAg+VQAA/AMEAfwBAAjUChQK/A8UCtIKUAoQCENVAAD+AYIA/gAIAO4PqAKvAqoKqgrqDwAARFUAAPwDBAH8ASAElAJUCiwJxAdkAJQDAARGVQAAAAD0DxQAfAcWBTQFVAVcBxQA9A8AAEpVAAD8AwQB+AD+DzIAzAHkAxQB5Aj8BwQAT1UAAP4PKgCqB74CgAK+AqoDKggqCP4HAABTVcIAOgCqB6oEqgS6BJAEzgS0BDQHTACEAF9VAAb8AaoHqgKqAroDIAR+AogB6AIYBAAAYVUAAPwDBAH8AQAAKAH+DwAA/g8oASgBAABkVfwDBAH8AQAAfALUAtQCfgJUD1QCfAIAAGVVAAD8AwQB/AEQAEgHRAXyBVQFRAVIB1AAZlUAAPwDBAH8AQAM/gMICGAIiQkKDugJAABqVQAA/AMEAfwBgAj+B0AA+A+MBIoE+A8AAHBVAAD8AwQB+AmOCVIIfgVSAl4B0gFeAAAAeFX8AwQB/AEADKwDLAYsAf4PLAEsArwPCAB8VQAA/AMEAfwBAABsB6QApg+0AKQEpAMAAIBVAAD8BwQC/AMAAKQPtAlWCVQJpA6MAAAAglX8AwQB/AEAAPwA1A/UCPwJ1ALUB/wJAACDVQAA/AMEAfwA4A8UALQCngfUAhQI9AcAAIRVAAFEAVQPVgtUC/wLVAtUC9YL1A9EAQAAh1UAAPwDBAH8DGQCng/0AZQCYAj4CP4HAACJVQAA/AMEAfwBYAD4DwYAUAlUBdQDXAVQCYpVAAD8AwQB/AzwAwgHqAIIDX4CiAVqCAAGlFUAAPwDBAH8DAAC/Ak0CPQKtA+0CrwKAACYVfwDBAH8AQAAvA+wALAP/gCwD7AAvA8AAJpVAAD8AYQAfAjwBVgFNgOUAzwFUAXwCQABnFUAAQQBfA/cC1wLXgtcC1wL3At8DwQBAAGdVQAA/AMEAfwBAAC+BqoEqgWqCKoIvgcAAKdVAAD8AwQB/AEICPQLtAq2CrQK1AscCAAAqlUAAIQIvAisD7wIhAj+CYQCvASsCrwKhAirVQAA/AMEAfwJAAg+BTQDwAM8BQQJfAkAAKxVKAAsAJwP/ADcB9wF3AXcBfwHmgioDyAArlUAAAAE/gVaBVoF/g9QBV4FWgX6BQ4EAACyVQAA/gMCAf4BGAznApAAUAaOAAgI+AcAALNVAAD8AwQB/AEACNQLrAquCqwK1AsUCAAAtVX+AYIA/gAAAPAPkgSXBPIHkASXBPIHAgC2VQAAGAAKB3wFWAXeBVgFWAV8BQoHGAAAALdV/AMEAfwBAAjUC1QIVAZWAVQEVAjUCwAIu1UAAPwDBAH8ARgA2A+0AvIPlAEYCMgHEADFVQAA/AMEAfwBAAh8BVwFXgNeA9wFfAUACc5VAAD8AwQB/AEADP4AqgaqAP4EqgGCDwAA01UAAPwDBAH8AQAIUgV2A4YPlgNSBTAFAAjaVQAA/AMEAfwJAAT8ANQO1gDUBdwIwAcAANxVAAD8AwQB/AFAADQHfgfUB9wH1AfUBwAA4VX8AwQB/AEABMgCVAqiBxAAUgJ0CuQHCADjVQAA3A/UB9QP3A+EAVQC1AsECPwHAAAAAORV/AEEAfwBAATgB2wGeAbuB2gGaAbsDyAI5lUAAPwDBAH8AQAMVAH0CV4HFAGUBTAIAADoVQAA/AMEAfwAAA5EAJADzAKoC6gK6AcAAu9VAAD8AwQB+AA+AWICagRaBVoEQgF+AwAC/VUAAPwDBAH8BCQC/g9UAXQJEAbOAQgGOAgAVgAA/AMEAfwBAAD0DxQC9gVUBVwHFAj0BwFWAAD+AYIA/g74AYQE9AcUAIcEfAOFBnQCBlb8AwQB/AEACPQK1ArWBvQD1AbWCvQKAAAJVgAAgg6+Au4KrgqvBq4M7gquCr4Kgg4AAA5WAAD4AwgB8AUEBXwF/AN8A3wF/AV8BwQDF1YAAAwARg/WC/QL9gv0C/QL9gvFD5wAAAAbVgAA/AMEAfwI+AcEAfQPJgKEAfQPpAAEAx9WAAD8AwQB/ACAD34FUAWID/wHBAD8AwAAMVYAAPwBhAB8CAAH/A60AdwF/AfUAdwPAAAyVgAA/AMEAfwDfAKuD3wC/geSAP4PAAAAADRWAAD8AwQB/AEQBNgD7gL0B/AC7gLUBxAANlYAAPwDBAH4AAQN/gFUAf4N/AMkAOIPIgA5VgAA/gOCAf4BAAz6AVYJUw9WAfoBMgwAADtWAAD8AwQB/AEAAHwP3AteC1wL3At8DwQBP1b8AYQA/AAACF4FVgFSBf4JWgFSBV4AAA5BVgAA/AMEAfwAIA1UAdwHBAvcC1QJdAEADWJWAAD8AwQB+Al8CAwFZAN2ASQDRAV8CQAAaFYAAEACXA9UCdQJfA9gAEwP9Al0CVwPQAJpVgQIxAv8CvwLRAj8D0QI/AvsCvwLBAgAAGpWAAD8AwQB/AnABbwF9AOUD/QPvAPgBQAIdFYAAPwBhAD8BBAE9Af0AvYC9ALUBvQHEAiHVgAA/AMECfwH5As/COQPJA3kA/8PJACgA45WAAD8AwQB/AFACDwGvAa+A7wPvAPkBAAAo1YAAIgH7gWuBW4HWABuB24FrgVuBYgHAAC0VgAO4AG8BPQH9AfsD7gB1Al0BvwFYAgAALdWAAD8AwQB/AUADPwP7An+AfQH7AX8CQAAvFYAAPwDBAH8AQAA9A/yBfoMMgG5CLUHgADCVgAACAL+B/4H/gf+BvgA/gb+B/4HCAUAAclWAAD+AYIAfAH3BqUCBwP9D1cF9QdXBQAAylYABbQD/Av8B/wFngX8AfwD/AXcB5QHAADaVgAA/g8CBAIFggRCBDoEwgQCBQIE/g8AANtWAAD8DwQExAU8BAQEBAR8BIQEBAT8DwAA3lYAAP4PAgTyBJIEkgSSBPIEAgQCBP4PAADgVgAA/g8CBCIFIgWiBHoEogQiBQIE/g8AAOJWAAD+BwIEkgRSBFIFMgX6BRIEAgT+BwAA41YAAP4HAgQKBGoECgUKBfoECgQCBP4HAADkVv4PAgRSBJIEkgT6BZIGkgZSBgIE/g8AAO1WAAD+BwIEKgXqBCoE6gUqBSoFAgT+BwAA8FYAAP4PAgSiBWIE+gViBKIEIgUCBP4PAADxVgAA/A8EBEQFJAVXBZQEdAUUBQQE/A8AAPJWAAD+DwIEkgT6BZIEkgT6BZIEAgT+DwAA81YAAP4PAgZaB0IFygTCBDIFCgUCBP4PAAD0VgAA/g8CBKoEqgT6BaoEqgSKBQIE/g8AAPpWAAD+DwIEEgTSBVIFegVSBdIFAgT+DwAA/VYAAP4PAgQqBSoF+gUqBWoFKgUCBP4PAAD+VgAA/w8BBCkFLQUVBZUFrQYlBgEE/w8AAANXAAD8BwQE9AX0BPwE/AX0BPQE9AUEBPwHBlf+BwIG3gZWBlYFVgVWBF4GwgYCBP4HAAAIVwAA/gcCBD4E/gU6BroGegY6BQIE/gcAAAtXAAD+BwIE6gWqBUoEegWKBW4GAgT+BwAADVcAAP4HAgT+BX4FfgX+BX4FegUCBP4HAAAPVwAA/gcCBGoE6gX6BuoG+gZqBAIE/gcAABJXAAD+DwIM6g1qC3oLagtqC+oLAgz+DwAAE1cAAP4PAgjCC/oL6gvqC+oL+gsCCP4PAAAWVwAA/gcCBP4H9gf2B/YHfgbiBwIE/gcAABhX/g8CBP4E/gX+BP4E/gb+B/4EAgT+DwAAH1cABCAEIAQgBCAE/gcgBCAEIAQgBAAEAAAjV0AIRAhMCSwJNAmkDzQJNAlMCUQIQAgAACdXAAAADPwDBAhECEQI9A9ECEQIRAgECAAAKFcIAYgAyA84AI4IiAiICOgPiAiICIgIAAAtVwAIJAkkCSQJJAm/DyQJJAkkCSQJIAgAADBXAAIQAv4BEAFAAPwHIAggCP4JEAgQCfgEM1cABBAC/gMQAQAM/gMAAAAA/AcAAAAA/g86VwACEAL+AxABAAEiCfIEKgLmCSIM4AMAAD5XAAQQAv4DEAoABIQDfAiEBCQHPAXgBAAIQFcQAhAC/gEQAQAI8A8ACAAI/g8gCCAIIAhCVwACEAL/AZAEAAb+ATIM0gISA5ICcgQCCEdXAAIQAv4BEAEwAAwCKgEoCagICAz4AwAASlcQAhAC/gEQCQAMCAL4AUoISAhICMgHCABOVwACEAL+ARABQAg0CAoG6AEIAkgEOAgAAE9XAAIQAv4BEAFEAUQAJAD8DwQAJADEAIAAUFcgCJAIjgiwCIAI/g+gCJAIjgiQCCAIAABRVwACEAL+ARABAAzoAyoAKgDoBwgICAYAAFdXAAIQAf4BkACACAgESAP+AMgBSAJ4BEAIWlcACD4IAAkACX4JRg8qCRIJKgkmCUAIAABbVwACEAL+ARABAAQkBqQFZAQkBKQFJA4ACF1XAAIQAv4BEAEACP4JAgQCAvoBAgQCBP4JXlcQAhAC/gMQAQAC/AKEAoYCpgqkCJwHAABfVwACEAL+ARABgAkIBHgEigOMAngECAgIBGBXAAR+BQIFPgUCBaAHMAUOBRAFIAVABAAAYVcAAhAC/gMQCQAM+APICX4GSAbICVgIAABkVxAC/gEQAQAA/AMkASQB/w8kASQB/AMAAGZXgAAQAf4AkAAABP4EkgSSBJIEkgT+BAAEalcAABAC/gMQAQIAugCCAP4PggCyAIoAAABvVwAEEAL+AxACQAlECCQI/AskCEQIhAgAAHdXAAIQAv4DEAEEAPQDFAH0CQQI/AcEAAAAglcAAEACVAr0C1QKVAr8D1QK8gtSCkAAAACDVwACEAL+ARABAAQoBMgFCgQIB+gECAQAAIRXiAiICmgKGApMCkgPeAqsCqwKiApICAAAi1cAAEAEygQ+BAoFfgUKBwAFHgVABX4EAASSV0AIaAlICWwJCgkID2gJTAlICSgJQAgAAJtXAAQQBP4DEAIACKAEngLCD4IBvgKgBKAIolcAAhAC/gEQAQAO/AGUD1QEVARSBNIPEACjVwACEAL+AxAJBAj0C1QKVApUClQK9AsECKZXAAAACP4KqgoqCioPagqqCqoK3gqACoAIq1ckBJQF/gUUBQAF1Ac0BR4FBAV8BIAEQACuVwAEEAL8AxACgACoArgDrAqoCpgKqAaoAMJXAAIQAv4DEAkACfwHrAasBfwIrAisCPwAw1cABBAC/gMQAUAIKAkuBegDLAUsCSAJAADLVwACEAL+ARABAAh8CVQJVAn8D1QJVAl8Cc5XAAAQAv4BAAz4AygAKArICX4EiAduCAgG1FcAAhAC/gEQAQAA6A+oAqgC/g+oAqoK6gffVwAAEAL+ARABQACoAugKCAR+AogFaggMBuBXAAIQAv4BEAEAAvwCtAK2D7QCtAL8AgAC91cAAJQC1AKeD/QCEAhIBv4BCAEIAPgHAAz5VwABEAL+AQABJACkB7QEpgSkBLwErAckAPpXAABIAUgF/AR4BXgHeAV4BfwESAVIAQAA/FcAAhAB/gEQAQAAtAe0Aq4LNgg0CPQPNAAAWAAACAH/AAAG/wEFDnUERQT1B0UEdwcAAAJYAAA4CAoK7AqoCq4PqAqoCuwKCgo4CAAABVgABH4FVgV2BVYFXgcABUoFMgU6BUYEQAAGWBACEAH+AYAAMAD8D6oEqAT+B6gEqAQAABVYAAj+CgoKdgoACnwPPgo8CrwK/AoECAAAIVgQABAEfgUABV4FOgcaBXoFOgVeBVAEAAAkWBAEEAT+AxAKgAi+BqoEqg+qCqoKvgqACCpYAAAQBP4DEAMED/4JVAtUC1QJ/g0ECQAAL1gAAJgJnAl8BVwDDgFcAVwHfAlcCVgFAAAwWAACEAH+ARAA/A8EBPwGfAd8BfwFfARAADFYAABUAXQB3gd0AQAA/g9iCLIEMgPuDAAENFgAAggC/gEIAEAJ/gVqA2oFagNqCX4HAAA1WAACEAH+ARAB1ABUAN4HdAVQBVgF1gcQADpYAAEIAf4AgAm+BKoE6gM+ACoA6g++AQABQVgACEAJfgtqCyoKPg8qCqoKagt+C0AJAABKWAAEEAL+AxABAAF8CFYH1QD8B1QIVAt8C0xYCAEIAf8BCAFAAN8BVQXVB5UBVQnfDwAAUVgAAGgIzAp4CkwKKA+ACnwKVApUCvwIAABUWAACEAL+ARABRAAkByYFVAVUBSYFJAdEAFdY2ggCCooKqAosCqwOqgr6CiwKrAqoCAgAWFgAAggB/wEIAQAG/AEcBl0F+gVcBXwHFABaWAACEAL+AZAFBgWqAnoKigk6BsoAJgcAAF5YAACECrQKtAn0CrQKtg70CrQJtAqECgAAaVgAARAB/gEQBTgE9gfUB9QE1Af0BIQHAARrWAAEEAL+AxABAAj8C7wKvgK8CvwLBAoAAHVYAAAADP4H6gT+BWoFawd+BeoF6gX6BAAAflhECHwJfAv+C3wKAA+ICmgKHgr4CAAJwAiDWAACCAL/AYgICAj6BV4DWwFeD/oJCAQAAIVYAAh+C2oL/gtqC34PEAqSCvoKFgpyCAAAilgAAKwIrAruC7wKiA/oCjwKSAr4CAAJwAiTWAABRAX8BH4FfAV8BXwHfAV+BPwERAUAAZdYAAIQAv4BAAF8ANcP1Ar8CtQK1wr8DwAAmVgAABAD/gGQAAQA7AfkB/4G5AZsBeQHAACcWAAAfgSKBnYGAAZWBzwFtAX0BRYFZASAAJ5YAAAQA/8BgAA8AOYPdAV8BWQF5w88AAAAqFgABCAEfgU6BXoFPgd6BT4FOgV+BSAEAACpWBAE/gMQA3AC2grcD/gDAAr+BIgDeAwAAK5YAAD+CAIKfgoACvYPOwp+Cn4K3gp+CAgIs1gAAhAC/gEQAQQI1AfcB94D1APUB9QLEAjBWEAAfgRqBWoFagVuBzQFPAV2BTQFPAUABMdYAAAQAf4BAAF8BMwH/Af+B/wHzAd8BAQEylgAABAC/gEAA/QK1A70Cd4F9ALUBvQIAAjTWAAM/gPKAf4G/ga+B8IHEgf6BvIGtAQAAdVYAAAQAv4BEABEBbwGvAO+C7wHvAHkBgAE2FgABHAFfgV+BX4FfgcuBX4FfgV+BXAEAADeWAAAEAL+AQAAXAKsDjwJbgk8AuwG/AgAAOJYAAAQBPwDAAj8BwQA9A5kCAQO9AqkCgAA5FgAABAC/gEABXwE7A3+C8YB/AfsBfwJBAHrWCAAIAQgBCAEIAT+ByAEIAQgBCAEIAAAAO5YAAIYAgAB/g8AACAIIAj+DyAIIAggCAAA71iACJ4HkAD+DwAAIAggCCAI/g8gCCAIIAjwWAAABAzUA1QBVAHeAVQBVAFUAdQDBAAAAPJYAAjECFQIVAZUAV4AVABUB1QIVAjEBAAA81gACMQIVAhUBNQD3gDUANQHVAhUCMQIAAT2WAAAxAhUClQIVA9UCF4IVA9UCFQKxAgAAPlYAAA0BLwFfAV8BX4FfAV8B/wF3AUUBAAA+lgAAGQINAu0CvQOPgj0DrQKtAo0C2QIAAD9WJQA3Ab8BvwG/Ab+APwE/AL8CtwP1AKAAARZgAhgCN4ECAPoAhgEAAj+CyAIQAiACAAAB1lAAFAASA+sCrYKpA+0CqwKzArED0AAQAAJWQQKRAo0CYQFpAaeBMQG/AaECZQIJAgAAA1ZAAAICAgKdgneB1wFXAVcBVwLfAkECAAID1kACAQKfAl8BfwHfAV8BXwHfAl8CQQIAAgVWQAAQAAgCBAISAROBIoCCAGIAGgAGAAAABZZQABgCFAEjgKIAWgAEAAgAP4PgAAAAQACGlkAAFAISAlECTQFpgSUBkwCRAHAAEAAAAAcWYQARAD0DwQARAhmBLQDFAOUBHQEFAgAAB9ZIADwAywJ6AkICPgHAACoCJYEVAJMAcAAIFkICagEdgVUAswBEADMAyoB6AkICPgHAAAiWcQAfApsCm4L/AtsBWwFdgNsAXwAxAAAACVZAAj8BNQC/A/UAvwAEAhICdYGtASMA4AAJ1kQCBAEEAIQAdAAPgBQAJABEAIQBBAIAAApWUAIRAhEBEQCRAP8AEQBRAJEBEQIQAgAACpZEAgQBBAEEAPQAj4EUAiQARACEAQQCAAAK1lACEgESARIAkgB/gBIAUgCSARIBEAIAAAtWQAAQAhECEQERAREA/wARANEBEIEQghACC5ZAACACPgIiASIA/4AiAGIBogE+AiACAAAL1mAAEgIyAioBJgDzgCICIgImAgoB0gAiAAxWWAIcAROBEgCyAF+AMgBSAJIBEgEQAgAADRZQARICFIEVAREAsABfgBAAkACQARACAAAN1kAAAQI7ASsBKwC/gGsA6wErAq8CoQJAAA4WQAAKACoAKgCuAOsAqgKqAq4CqgGqAAoADlZAACACIgIqAiIBIgD/gCIA4gEqASICIAIOlkAAKgAqACoAJgGjACKCJgImA+oAKgAqAA+WQgJiAhoBAgECAP8AAgDiARoCIgICAkAAERZSAAoAOgHuAKsAuoHqAqoCrgK6AtICAAAR1kAADQAtAe0ArQCrAKuAywINAj0BzQAIABIWSgEqAyoApgIrAiqB6gAmAKoAqgMKAAAAElZAACgAKwCbAIsArwCrg+sAiwCbAKsAqAAS1lAAEQA5A9UBUwFxgdMBVQFZAXkD0QAQABOWRQEVARMBVwFVgV1B1QFXAVMBVQFFAQAAE9ZkABUCFwFfAVcA94BXANcBXwFXAlcCJAAUVkAAFQJVAl+CVQFQANCAyIFHglCCT4JAABUWSABJAkUBawDJAEmAXUBJAGMDxQBJAEgAVVZJAlUCUQJJAUcBQYDBgF8BQQFFAUkCQAIVlkgCSQJEAl+CQAFSANEAyYFJAkcCQQJAABXWSAAJAEUBfwHdAV2BXQFdAV8BRQNJAkgAFpZAAmECawFZAW0A6oBYgNSA0IFSgUACQAAYFkAAAQF/AXuBe4F3APcA+4F7gX8BQQFAABiWSgBKgGqAK4P6gq7CqoKugqmCqYPKgAqAGVZAAAACXwJDAVkBXYDJANMBQQFfAkACQAAZ1kACXwJBAVsBWwFLAN+ASwDLAOEBfwFAAloWQAALgkgCX4FAAUkA5IBFgORBf0FFQkQCWpZAABUATQB/AP0B/YB9AX0BfQD/AGUARQBblkAABoAmg/+Cv4K+w/6CvoK/gr6D0oAAABzWQAAEAgQCdAIMAkeBRICEAKQBXAEEAgQCHRZiAj4BA4DyAE4CAAMNATEA8QCPAQACAAAdlkICPgMDgOIA3AIBAf8AAQEPAgkCOAHAAB4WQAA+AgOBYgDeAwAAEQARAD8D0QARABAAHlZAAj4DA4DiAF4BgAA/AcQCP4JCAj4CAAGfVkACOgMHgOIA3gEAABECEQI9A9MAEQAQACCWQAACAj4CA4F6AMQAPwPBAQEBAQE/A8AAINZAAj4CA4FiAN4BAAAxAdECEQIRAj8CAAGhFmACIQIvAqkC6QKpgSkBKQHpAikCIQIAACGWQAAGAOAAP4PAACQCHAJHgYQA/AEEAgQCIdZCAj4BA4DiAF4AAAERAREBEQERAT8DwAAiFkACPgMDgPoAhgEcAFEAUQJZAlcDMADAACSWQAI+AwOA+gDGAzwA0gASgBKAEgA+AAAAJNZCAj4BI4CyAE4AgAIaASoBT4CqAVoBAgIllkABPwEBwPEAjwAAAwiAqIBfgChASECIASZWQAA6AieBsgBOAIACDwEgAT+AgACjAEwAJ5ZEAjwBA4DiAN4AAgI4A9cCEQI/A9ACAAApVkAAEQIVAbEB2QGbAJEAmIF8gRKBEAIAACoWQgA+AkOBYgDcAQAAAgP+ABOCEgIyAcIAK5ZAAj4DA8D+AgADP4DEgDSB5IIkgheCAAGs1kAANAIPgUQA/gEAADUAwoI+A8IANgBCAK5WQAI+AgOBYgDeAAADEgCSAH+D0gBSAJIBLtZFAlcCVwLXAvcBX4FXAVcB1wFfAkUCQAAxlkACPgJDAb4BQAA/AdEBFQFVAxEDPwHQATJWQAA6AgfB8gBOAbAASQAJAD+DyQA5AMAAMpZCAj4CA4H6AEQBngARA/EAP4PRADEBwAAy1kAAOgNHgOIAXgCAACwD64EoASsBDAHQADQWQAA+AkOBugDEAj8DyQJJAkkCfwPAAgAANFZAAD4DA4DiAN4BAAAkA+QBP4EkASQDwAA01kAAOgIHgXIAzgAIAicCJAI/g+QCJAIAAjUWagIrAisC5wKzAb8BIwCmgWqBKoIqAgAANpZAAj4BA4D8AgMCYAE/gMAAP4HQAicCIQG3FmgCKwIrQquC6wGvASsBq4FrQSsCKQIAADlWRAI8AQeA5ADeAQAAagHfgkoCTgJKAUkAOhZAAj4DI4DcAQEAOwMrAL+AawCrAS8CQAI61kAAPQMjwLkARgA/g+SBJIEngeSBPIEAATsWQAI+AQPA+gBEAD+BwIE8gSeB5IE8gQCBPtZAAD4DA8D6AEQAv4PAgXiBLoFAgT+DwAA/1kAAKIIlArUC8AGpgSUBIwGlAWkCKwIAAABWgAO+AEIBNgFeALYAwgI/gQIA8oEKggABgNaAAj4CA4H+AQAACQJJAm+DyQJJAkgCQAABFrICMgIrgqYC9gG/gSYBpwFqgTqCMgIAAAHWgAI+AQOA8gBOAZQADQPHAAUADIPUgCAABhaAAj4BA4D+AYAAPwPVARWBNQBVAO8BIAEG1oAAPANHgP4AAQIcAlcB+QBZAN8BcAJAAkcWgAA+AyOA3gIAgb+AZII/gf8DwIA/gMAAB9aCAj4CA4F6AMYAMAPvAK0ArQKtAr8DwAAJVoACPgMDgP4AgAKlAj8DxIE/gKQBVYIAAYpWgAI+AgOBcgDOAj4CJQElgP0D5wI8AgABDFaCAj4CAwFiANwCAwJVAfUAVQDVAVcCQAJNFoAAPgMDgP4APIPBACgAfoHogACCP4HAAA2WoAIwgj+CtoL/gaiBsgGtAWUBKwIpAgAAEZaSAhqCQoLYAscBUwFXAUuBSwHXAlECQAASVoAAPgMDgP4AAAITAw0A0YA9AcUCPQJAARaWgAA6ASeAsgBMAC+B2oFagVOBZoHKQAoAGZaAADoCJwGyAEwBoQDvAD8D7wAvASgAwAAdFpAAF4JQgkyC44F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TAVEBQwJAAC/W4AATADkBxQABADWB1QFdAVUBVQF1AcAAMJbAABMA0QI9A9UAEYLFAh0BJQD1AQ0CAAIxFsAAIwAxAfUBbQFtgW0B9QA1AjED4wAAADFWwAIDAjkC7QGtAb2A7QCtAa0BuQLDAgAAMZbAAAMAaQHhATkBE4HpASUBEQEFA9kAAAAx1tACFQE1ANUANQHVggECHQLVAvUCFQIAATMWwAADACEB/wF3AXeB9wF3AX8BYQHDAAAANJbAACMBLwCvAH8BL4IvAr8CLwJvAKMBAAA01sAAIQP9AD0AvQC9gP0AvQC9Ab0BIQHAADbWwAIDAjEC9QL9AfWA9QD9AfUC8QLDAgAAN1bAAAsAQQB/APECX4IfAt8BXwFfAvMCQAI3lsAAAwK5Ar0CvQG9gP0AvQG9ArkCgwKAADfWwAATAlkBbQB9AmGD5QBpAPUAzQFnAgAAOFbAACMAIQF/AX8A/wD/gH8BfwH/AGMAoAA4lsACWwHRAH0DwQA9gn0C/QF9Af0CKwJAADlWwABXAlcCbwKnAt+B0QGvAR8BXwBDAEAAOZbAAAUCNQH/Af8A/4D/AP8B/wH3AcUCAAA51sAAAwBxANUA9QLagvsD2QDRAPUAwwDAADoW4AEtAK0CrQL9AK2DrQC9Aq0C7QKhAIAAOlbAAFMAWQP9AtUC3YPVAtUC/QLVA9EAQAB61sAAAQB9AT0AvQA5gLEAfQA9AX0BIQDAADsWwAIDAjEC9QH1AfWA8QD1AfUC8QPDAgAAO5bAACMCEQI1AP0CtYO1AL0AtQLRAiMCAAA9VsAAFQI9AfUAfQK1AcGAPQHdAt0C3QOAAT2WwAEFgjWB94H1gPHA+4D7gP+B+4HLggAAPhbAAAIACgAaACIAQgICAgICP8HCAAIAAgA+VsACCQMRAKEAXwCAALQABAJEAj/BxAAAAD6W6AAqACoAKgGqAS8AKgIqAjoB6gAqACgAPtbAAAAAUQBVANUA1QBVAlUCVQHfAEAAQAB/FsAAAABPAFUA1QFVAFUCVQJVAdcAUABAAH+WwAIKAxIAo4BaAYIBFAA0AEQCP4PEAAAAP9bQAREBVQDVAH0BV4BVAlUCdQHVAFEAQAAAVwAAKQEpAS/B6QEpAQAANAJEAj+BxAAAAACXAAAAgF+AVYFVgF/CVYJVgnWB34BAgEAAARcgAT+BKoC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/g8QAP4GkAVWDAAA6lwAAPgDAAL+AwAC+AfAAKYPkgiwCMYPiADtXPgDAAL+AwAC+AMAAO4PoAK+AqAK7AcAAPBcAAD4B/8HAAT8BwAAJAVXBdoPVgVSBRAE9lwAAAAO/ARcBVwHXgVcBVwFXAFcCUAHAAD7XAAA+AP+A/gDAAAoBYwFygKIAi4FaAQAAANdAADwA/4D8AMAAFQDxAD+B8QAVAFEAgAAB10ACXwFGAFYCVgJXA9YAVgBWAUYBXwJAAAOXfgHAAL+AwAC+AMAALQDrAKuCzQI9AcgABRdQAAsAOgPWAVYBV4F+AdYBVgFWAVcBQAEFl0ADP4DDAisCqwKrgrsDqwKrAqsCq4KCAgXXQAAAAD2DxQAVAZ2BtYHdAZ0BhQI9gcAACldAAAMDOwDqAnoDw4ACAjoB6gCqArsBwAALV0IAWsBWgHKB0oBSwECDPoDSgDGD0cAAABKXQAA8AP8A/ADDADsBgwB/A8MAWwCqgQABEtd/AMAAv4DAALwBf4Dyg+qCq4KqgruDwAATF0gAOwPKAUoBegPDgDIDCgCqAEoBqwIYABQXQAA5g8cANwJXAn+D1wNXA2MCPwHBggABmldEACWD/QA9AD0B/QF9gX0BfQH9AiWDxAAi10AAAAA8Af+A/AJ/ARcDV4DXAtcCUAHAAC6XSAAkwCqAqoEsgcHAP4FrgWuAa4F/wUACM1dIAl8C3gFeAV4Cw4A+ATYA/gD3AbQBvAC3V0ACAAM/AMAAAAAAAD4BwAAAAAAAPwPAADeXQAAcAgABv4BIAAAAP4HAABwAAAA/g8AAOFdAAhECMgHAAT4CAQLcAiMCSAK2AgECwAI4l0AAAAF+wWoA6oD/Q+oAaoDrgX9BQAFAADjXQAAAAn+BagFqgP8D6gBqAOsBfoFAAkAAOVdAAQEBAQEBAQEBPwHBAQEBAQEBAQABAAA5l0AAAgMCAPICHwISghICMgPSAhICEgICAjnXQQCBAL8AwQBAAEEAHwERAhECEQMxAMAAOhdAAAAAP4PkgSSBJIEkgSSBJIE8gUCBAAA6V0EAgQC/AEECQAE/AMEAHQABAD8DwAIAAbrXQAFhAR0BIQEBAT8BwQFhAR0BIQEBAUAAO5dgAioBKoDrgioCfgJqA+uCaoJqAmACAAA8V0AAAAA5AckCCQIJAgkCCQIJAh8CAAHAAHyXQAA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dAbUBQYIVAr0C1QKVAoAALVeAAz8AwQAVAD0B9YC1AfUCtQK9AtUCFQEtl4ADvwBBAQkByQA9A6mAKQO9AAkAiQMAAC3XgAG/gECBKoCqguqCPsHqgKqBvoFIgkAALheAA78AQQA9A/0A/QD9g/0A/QL9AukDwQAwV4ADPwDBAj8B6wGrAL+CwQA9AsECPQHAADDXgAM/AMECEwF/ANOAUQB3AdsCWQJFAUAAMleAAz8AwQIdAV0A/QPdgH0D3QD9AVUCAAAyl4ADPwDBAj0D7QItAb2DAQA/A8MAPwHAADTXgAM/AMEAPQLvAu8D/YDBAD8DwwE/AMAANZeAAT+A4IAlgiOBmYHvwZiBW4FRgKeAIIA314AB/wABAL0A7QDtAe2A/YHBAb8AawE/APgXgAM/AMMAOQPvAKmC+4PRAj0BSQD5AwAAOJeAAz8A0QALAusCn4ERANsBfQHtAkUAAAA414ABv4BAgjqBfoF+wX7AfoB+gPqA+oFIgTzXgAAgA98AAQLfA/+DyQEdA10CXQDdAUAAPZeBAi0BKwDZAQABfQJBAkECfwJJAkiCSAJ916ECDQHrAVECAAKJAokCvwLJAoiCiAKAAD6XgIIcgwuA+IECAWqCaoJ/wuqCaoJvgkICf9eAAAQABAA/g8QBBAEEAQQBP4PEAAQAAAAAF9ACEQIRAb8AUQARABEAEQA/A9EAEQAQAABX5AIkAiQBMwDiwCIAIgAigDqD4wAiACQAAJfAAAACR4FqgMqASoBKgEqAaoPLgEgAQABA18ECSQJJAW0AywBJgEkASwBvA8kAUQBBAEEX0AJVAlUBVQDVAF8AVQBVAFUD1QBVAFAAQpfAAl6CTgFPgN4AXoBEAEsAbYPNAFMAQQBD18ICEgESATIB0gESAQIAn4AiAMKBAoICAYTXwAAAADyAJIAkgCSAJIIkgiSCJ4HgAAAABVfAADEAKQIpAikCLwHAAAAAAAA/A8AAAAAF18AAIgI6AioBvwBqACoAPwPqACoBLgDAAAYXwAB5AikCKQIvAcAAAAH+AQEBIAEAAcACBtf8giSCB4HQAD8ByAIEAj/CRAICAn4CAAGH18AAAAEyASqAqwCqAH4D6gArASqBLgDAAAgXwAA8giSCJ4HAABACP4PQATQBEgBRgZACCVfBAHkCKQIvAigBxADzAgICPgPCADIAAgD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iAAACqIJcgQqA+YIIg7gAQAAbWKIAIgI/weIAEAIAghCDv4JQghCDv4JAAhuYggBiAj+D4gAIAhQBE4DwABCCE4I8AdgAG9imACYCP4PWAAACPgPAAgACP8PIAggCCAIcGKIAIgI/g+IAEAIEATQAz4AkAcWCBAIEAZxYogAiAj+D0gAAAf8AMQEBAU8A5AEcAgAAHNiiACIDP4DiAgADvwBZASkBSQCpAVkCAAIdmKAAIgI/g9IAAAISARIA/4ASANIBEgIAAB5YogAiAj+D4gAAAD+DyAEAAD+ByAIGAgQBnxiAAGIDPwDiAgADPwDBAD0BxQIFAn0CAAEfmKIAIgI/g9IAAAIEAQ+AtADEgXUCBQIEAZ/YgAAEAQQA/QABAqkCvQHrAIMAuQAIAMQBIBiiACICP4PSAAACGgEqAU+AigF6AQoCAAAhGKIAIgI/g9IAAAIeAgABP4EAAKMAVAAAACKYoAAiAj+B0gAAAD8B0QIRAh8CEQIRAj8CJFigACICP4HAAD8BwICAgD8DwQABAT8AwAAkmKIAIgI/w9IAAAAIggqCOoPNgCmAGIAAACTYoAAiAj+D0gAAA78AQQA/A8CAP4AAg8ACJViiACICP4HSAAACN4EQgVCAt4FUAgICAAAlmKIAIgI/g9IAEgAAAEiAUwBAAH+D4AAgACXYgAAiACICP4HSAAADOgDLgAoAOgHCAgABphiiACICP4HSAAADv4BIgAiACIA4g8iACIAmmKAAIgI/g9IAEAIBASkA3wA5AckCCQIIASbYgAAiAj+B0gAAA//APgHAAn4CA4K+AkABJxiiACICP4PSAAADIgDfgioBSgC6AUoCAgInmIICYgI/g+IAAAM/ANEAEQAxAFEAnwMAAigYogAiAj+D0gAAAD8DwQIFAvkCLQJBAoACKFigACICP4PSAAAANgHhAiCCEQICAgwBiAAomKIAIgI/g9IAEAAEADIBycIJQnICBAGEACkYogAiAj+B0gAAAz4A0gASgBKAEgA+AAAAKViiAiICP4PSAAAAP4PIgDyDDIDMgXuBAAIq2IIAYgM/gOICAAO+AHIBX4GSAXIBFgIAACsYoAAiAj+D0gAAACwD6wEogSgBKQEmA8gALFikACQCPwHUAAAALAHrgioCOgJCAn4CAAGtWKIAIgI/g9IAAAA/A8kBCIAPgziByIIIAa5YogAiAj+D4gAQAQIAkgB/g/IAEgDSAQAALxigACICP4HiAAAAPwBpACkAPwPpACkAPwBvWKIAIgI/gcIAOAPkASQBP4HkASQBPAPAADCYgAAkAj8B0AA6AyoAv4BqAD+D6gAuAcAAMRiiACICP4PiAAIAIAIiAiKCPoPiAiICAgIxWKIAIgI/g9IAAAI/AkkCSQJJAkkCfwJAAjGYogAiAj+B4gAAAz8AyIAogDiDyIBIgIAAMdigACICP4HSAAAAP4DIgKqCiIKIgb+AyACyWKAAIgI/g9IAAAEKATIBQoECAfoBAgEAADLYgAAiAj+B0gAAA/+AMgHAAn+CggK+AkABMxiCAGICP4HiAACACwBIAH+DyABLAEiAQAAzWIIAYgI/geIAAAA+A+IBI4EigSIBPgPAADQYogAiAj8B0gAAAi8BKQCpAGkCKQIvAcAANJiiABICP8PSAAAAP4PkgSSBJIEkgTyBAIE02KIAIgI/g9IAAgBgADkD1wERAREBMQPAADUYogAiAj+D0gAAAyIA34IqAUqAqoFaggICNZigACICP4HiAAgAJAAzgdICOgLSAjoCwgI12IAAIgI/g8AADgD5gIwCxAF8AMeCPAHAADYYoAAiAj+D0AAEADIAy4BKAHoCQgI+AcAANligACICP4HSAAAALwHIAT+ByAEIAS8DwAA2mIAARgJ/geYAAAImATUA5IAkADUD5gAoADbYoAAiAj/B0gAAACiD5oEhgSiBKIEngcAANxiAACUDJQC/AGSAAMAKAEqAf4PKgEqAQAB3WKIAIgI/gdIAEABFAFUAfwPVAFUAQQBAADfYoAAiAj+D0gAAAT+AwABvAwAAsABPgEADuBigABICP4HYAD+DIgDcAT8CQQI/AsACoAJ4WKIAIgI/g9IAAAO+AEIBIgHbgQIBQgFCA7iYoAAiAj/D4gAAA6QAX4MEATyB5QIVAgQBONigACQCPwHkAAABOgCuAqsCOgPiACIAggE5WKAAIgI/gdIAAAM/gOSAJIA/g+SAJII/gfmYoAAiAj+B4gAAASSBJYEkASYBJYEEAQAAOdiCAGICP4PiACAABgASAhICMoPSABYAAAA6GKAAIgI/geIAAACHAnQBH4FUALUBVQIEAjpYogAiAj+D0gAAAKkApwC1A+cAqQCJAIAAOxigABICP4PSAAAAJIPkgj+CJIIkgiRDxAA7WKAAIgI/g9IAAAEUATQBxAE/AEQBhQMAADvYoAAiAj/D0gAAAnSCCIK+gsmCNIIEgkAAPFigACICP4PSAAACIgE/gKIAIgA/gKIBIAI82KgAKgCagJsC3gL7gcoAygDbgKoAqAAAAD0YgABiAj+B4gAIAgYCSQJ4g8kCQgJMAgAAPdiAAEQCfwHkAAAACgBqAP8CqgKuAqoBiQA/GIAAQgJ/gfIAAAIiQT6A4gAiAD8D4sAgAD+YogAiAj+B0gAAACYD4QEogSiBKQEiAcwAP9iCAHIAfgB/AX6BfoD+gH8AfgB+AGIAQgBAWOQAJAI/AdQAAAAqAKoArwIqAjoB6gAIAACY4AAiAj+D0gAAAgkCSQJvg8kCSQJIAkAAAdjiABICP4PSAAAAN4HZAVkBWQFYgXiBxgACWMIAQgN/gMICEAIXAjEBXcGRAPEBFwIAAAOYwABEAn8B9AAAACoArgDrAqoCrgKqAagABFjgACICP4PSAAACYgE/gMAAP4HQAicCIQGFmOAAEgI/g9AAAQAVARUC0YJ1AhUCAQGAAAZY4gCSgIsArgKqgrsB6gCiAI+AkoCSAIAABpjAAAUAtQD/gOUC4AHtAOeA4QDPANAAyACH2MAAQgJ/gfIAAAIqAiIBv4BiAOoBIgIAAAgYwAAiAj+B0gAAAikBKYDvAC0D8wIrAiABCFjiAGICP4HSAAABC4FIAU+BSAFKAXmDwAAI2OAAIgI/g9IABAAWAlWCfQHXAFUAfABQAAkYwAAiAj+B0gAAAhEBEwDNgAkAFwPRABEACVjAACICP8HAACWAtICsgKaAtIPkgKWAgACKGOAAIgI/gdIAEAJLAUrA+gDKgMuBSgJAAgqYwAAiAz/AwAIkgb+AZII/gf8DwIA/gMAACtjgACICP4HSAAgCBwJYAn+DyAJHAkgCUAAL2OAAIgM/wOICAAO/gHCD1IE0gVSAVIOAAg6YwAAiAj/D0gAAgw+A+IEAAgiCf4JIgkiCT1jgACICP4HQAAQCPgIlASWAvQBnAeUCPAIQmNIAEgI/g8oACAAqge+BKoEqgS6BKIHIgBFY4AAiAj8B0gA4A+kArQC9A+sAqwK5AcAAEZjgACICP8HAAD+DwIEUgT6BVIEAgT+DwAASWOAAIgI/g9IAAAMvAMkBOQPpAikCLwIAAhMYwAAiAz+AwAIvAakAbwIAAf4AQAI/gcAAE1jiACICP4PSAAAAX4BagFqAeoPagF+AQABTmMIAQgJ/geIAAAA4g+sAqACvAKgCuwPAABPY4gASAj+D0gAAAS+BKoEqgeqBKoEvgQABFBjiACICP4HSAAAAO4PqgKqAqoKqgruDwAAVWMIAYgI/geIAAAA6A+oAqgC/g+oAqwK7AdcY4gASAz+AwAIvASsBawG/gSsBqwFvAgABF5jgACICP4PSAAACJQElgLUAZQIlgw0AwAAX2OAAIgI/gdIAAAI4AkuBCoCqgEqBC4I4AthY4AAiAj+D4gAIASYBSQEogUkBAgH0AQAAGJjiAz+A0AIEAj4BJQClgH0AZwClAT0BIAIY2MAAQgJ/geIAAAG/ASEBpYEhAa8CIAHAABnY4AASAj/B0gAAABqAr4Cqw+qAuoCqgIAAGhjiACICP4HSAAQAEwHUgV6BVIFRAVIB1AAbmNAAEgI/g9IAAAH/gAyB7IE8gSyBL4HAAByYwABEAn8D5AABALUB3AJXA1QDVQO1AhAA3ZjAACICP4HCABACfQJVAn8D1QJ8glQAQAAd2OAAIgM/wNICAIIqgaqBKoE/w+qCvoKIgh6YwABEAn8BxAAQAQoARgJTA9YASgBSA1AAHtjgACICP4PSABABwgAJAcqCCIJZAgoAwgEgGMAAIgI/gcAAPwPFAD0DwAAFA7qAQgGOAiCY8AARAb/AQAM/gMCAIIPggT7BJIEkg8CAINjgABECP8HBABgALUHtQD1D7UAvwTgAwAAiGOAAIgI/gfIAGAIaAikBKoHogS6BmoFAAiJY4gI/gdIAAAC+AKoAqgCrg+sAqwC/AIEAoxjAAAcAs0C/wL8Cv4H/AL8Av8CjQKcAgAAj2MAAQgJ/gcYAIwCqgLoA6gCqAqICPgHAACQY4gAiAj+D0gAAADQD0gFBgVEBFwFxA8AAJJjiACICP4PSABAAAgBKAHWDvwHKAEoAQAAlmMAAIgI/geIAAAA5A8UAMYIdAWkA+QEJAiYY4AAiAj+BwAA/g8KAOoOigjqD4oI7g4AAJljAAEICf4HiAAAAqwKpArqB6ICqgLqA4AAm2OAAJAI/AcAACgFvgcoBQAA/A9AAMAAAACgY4AAiAj+D4gAAAT0ApQIlgeUAJQC9AIEBKFjgACICP4HSAAABJQChAHUD4IBsgKKBAAAomMAAQgJ/gfAAAwEpAKUAcQPlAGkAqwEAAClY4AAiAj+B0gAAAikCqwLpgSkBrQFpAigAKdjAAGICP4PSAAMCKQIlAiGD5QIpAgMCAAAqGNIAEgI/g9AADAA/A+qBKgE/geoBKgEAASpY4AAkAj8B1AAAADoA7gCrALqB6gKuAroC6pjiABICP4PSAAAANQHXgVUBVQFXgXUBwAAsGMAAJQI/AeyADgG5gH8AxAIkgj+B5IAgACyYwgBCAn+BwgAAAG+A+oFqgSqAqoIvgcAALdjAACICP4HSAACDvgBTgcAAP4PAgD+AwAAuGMAARgJ/geYAAAC8ANSA1QD8A9cA1ID8AO6YwAAiAj+B0gAQABYCrwKWgkYBTwEWAKQAMljgACICPwHSAAACXQFHANcD3wDFAU0CRAAzWOAAEgI/g8oAAAIXAl8BdwDXgF8BVwFXAjPY0AARAT/AyQAAAD0D5QElwT0B5QElwT0D9BjAAEICf4HiAAADL4CqgSqD6oKqgq+CoAI0mMAAEQE/wNEAAAA6g+qBAoE/gcJBOkPAADWY4gAiAj+B0gAAATsB2wFbAVsBWwF7A8gAtpjBAGEDP8HxAAABt8DVQlVBVUDVQlfBwAA22OAAIgI/geIAAgIeAk2BZQDPANQBXAJAAjhYwAAkA78AQAM/AM0CLQK9Aq0D7QKvAoACONjAACICP4HQAAcD7AAsA/+ALAPsAC8DwAA6WOAAIgI/g9IAAAA/gdoBUAFfgVoBeQHFADqY0AAiAj+B0AAEgH+D0IAGgwAA/4AAAM4DO1jAAEICf4HiAAAAP4G6gSqBaoIqgi+BwAA7mMgAEgI/gdIAAAC+gK6AroC+g+6AroC+gL0Y4AAiAj+D4gAAgRWAvIJ1gbSBNkHVQhACPpjiACICP4HSADAAIwOpASsBOwHogSyBKoO/WMAAIgM/wNACB4IwAteCEAHVgjUCwQIAAQAZIAAiAj+B0AAEAC4BHYENAV8CbQKsACAAAFkAABICP4HAADyD0IAWAeqAtoCAgv+BwAAAmRAAIgI/g9IAAAIqgqYC94EmAaqBaoIgAAFZAAAiAj+B0AAGgj8BTgEugc4CO4JCggABg1kiACICP4PSAAACOwF7APsAewB7AXsCQAID2SAAFAI/AeQAAAAeAN4A3gBfgl4CXwHeAETZIAAiAz+A0gIAAzVA1YIfAlUD1cJVAkAABRkgACICP4HSAAAAKYJWglSCdYPWg1WD9IPFmQAAAgJ/geIAAACVArECqYKng+MCoQKAAAcZIgI/gdIAAAIvAi0CaAG/gSgBrQJvAgACB5kgACECP8HJACAD1oAWgdbBVoHWgDCDwAAKmTAAEgI/gdIAAAH/AB0BnUF9gV0BXQHFAAsZAAAEA78AYAM+AN+CfgHAADeDUICngUgCC1kAACICP4HSABAAG4HVgVcBWQFTgdEAAQANmRAAEgI/A8gAJAPaAB4B3QFcgV0BWgHEAA6ZAABBA3/B4QADAj/BasDqgH/BasDqg6CAERkAACIDPwDKAiABLwGvAG8BbwGvAakCQAARmSAAIgI/gdAABwFVA1cC9QJXAVUBVwJAABHZIAAiAj+B0gAAAasBKQE6geiBKoEqg4AAEpkAABICP4POALIATgBMAD+D6gE/gesBAAEVGQAAIgI/geAAIgCBAK0Au4OxAIEArQCgABYZIAAiAj+BwgA4A8UAFwH9gVcBxQI9AcAAGdkAABICP4PSABMAOgHaAVuBegHaAVsBQAAaWQADPwDBAC0A7QLtguEB7QDtAN0A3QDVAJ4ZIAASAj+D0gAAAl0CXYH9AF0A3YFdAkECXlkAAFEA3wD/AN+C/wL/A9+AvwCfANEAwABg2QAAvwD/AP+C/wLvAfYA9YDUgN2A1QCgAKHZAAAiAf+APAPXgD8B3AA9Ac6BsUBPAYABJBkkACQCPwHkAAYCPwL2AbeBtgC/g+YAgACkWSAAJAI/AcAAJgD/AvYC9wH2AP8AxgDAACSZIgI/gdIABAA9A++ArQK/g8QCO4GiAN4DJVkAACQCPwHAAD8DVgB/AUAAPgPJADkDyQAnmRICP4HWAAACPQK9Ar0CvYP9Ar0CvQKEAikZEAARAz/BwAA8g+/AtoPEAg4BMcDfAwAAKVkAAAICfwHCACgC7wK5A5ACygF/AeoCQAAqWSAAIQE/wNEAAAE+gFWCVMPVgH6ATIMAACrZAABkAj8B1AAAA38ASoB6A0oAegNKAHoDaxkAACICP4HSAACA9YPHgM2AK4DrQcoCwAKrWSAAIgI/gdYANQAVAe8BbwHlAW6BdIHkACuZIAAhA7/AWAE4Ae/BrUG9Q91BHUD/wVgBLBkAACICP4HoABOCfYFVgVAAU4F9gVWBUAJsmRAAEgI/g9IAAIJeAVuA+gBbgN4BWoJAAi1ZAAAiAj+B4gAAARcBd4FQA9cBU4FXAUAALxkAABIB/4AAA78ASwB3AesA38CpAMVBAADv2QAAIgI/gcIAOgMtAL0BBIA8gy0AuQECAjBZEAASAj+BwAAtAxkAwQA+gdUBfwHVAUABMJkAACICP4HCACcB8wFnAW8B5wFzAWYBwAAxWQAAIgI/gdAAHwEzAf8B/4H/AfMB3wEAATHZAAASAj+ByAAvgL6Ar4Cug++AvoCvgIAAMpkQAT8BPwH/gf8DvgPkAfuBqIG5gaoBAgBy2SAAEgI/gdIAAAAmgf8BdgF3gfYBf4FigfNZAAAkAz8AxAIwAW8BfQDlA/0A7wF4AkAAM5kFAA8Ar4DuAPOC7wLhA+oA7YDlAMsA0QC0mQAAYgI/geIAAgOxAGSB9oF8gO0CcQPAADUZIAAiAj+D0gAGA74Aa4MvA/MD7wPyA8AANpkgABICP4PAAT4AxgA2AX+A3wPbAFsBgAE4GQAAIgI/gcIAGAM1APkAr4CvAK8AuwPBADmZAAACA3+AwgJLAmUAdQJvg+0AfQBHA0AAOxkAACICPwHAABeDdQDVAwAAywE9A88CWQI9GSAAIgO/gEADPwDRAj0C/QL9gP0C9QLAAD6ZAAAiAz+A8AIdgfKDO4HCgBuBqoKrgoAAP5kAAGICP4HCADCCH4K3gdeB14H/gvCCgAIAGVUAMwCXgJMA+AL5gvUB8IDSANeAswCVAAPZQAAmAz+AwAI6AdmAvQPAADeB9QL9AoAABJliAj+B0gADAjeC14IXAZMAV4EXgisCyAAFGUAAIgI/gcAAP4H9gR+A/AH7gP2CP4HAAAYZQAAiAj+B0gE+APsD/wJxgH8B+wF/AkAABxlQAAkBP8DIACLD34B+gJ7BvoBegT7ByAAHWUAAJAI/AdQAMQD/AL8DzwA/AP8A+QHIAIkZQAAAABICP4P/gv0B/4O9A+uBPoHqAQAAC9lCAgoBGgEqAQoAz4CKAOoBGgEKAQICAAANmUAAPwDAAEAAf4PAAAwBG4EiAPoAhgECAg5ZQAA5AEkAiQBfAVgDDAEzgIIAegCGAQICDtlBAEEAfwBBAlkCRAEbgKIA4gCeAQICAAAPmUACAgG+AEqCMgHIAAQDO4CiAN4BAgIAAA/ZQQE9AMEAvwDJAJkCDAE7gIIA+gEGAgACEVlCADID0gEfgTID2AIPATKAogDeAQICAAASGUICKgEigKMAygEQAAwDM4CiAN4BAgIAABMZQAAkg+SBP4EkgSCDyAAFAzqAogDeAQICE9lQAD4AVYB9AVUBfQDYAkeBOUCxAM8BAQIUWUIAmgJCAn+D8gACglgCH4EiQPoAhgMAABWZQAEVALUAf4E1ATUA0AAfgaIAWgCGAYABFdlAAj8BVQFVAH8BWAAOAzMAogDeAQICAAAWGVQAlgJVAjyB0QAZAswCO4ECAPoBBgIAAhZZQACVAJUCd4P9AFYCTYIfASLA8gCOAwICFtlAADQBRgE1AQWA4gIMARuAogBeAIIDAAAXWUAAPYP0AH+D9AB9g8ACD4EyQPoBBgIAABeZQAA7g/gAX4CoAnuD0AIfgSIA+gEGAgAAGJlAAAIAvoDqgKqAv4PAAAwDO4CiAN4BAgIY2UAAOoPrwKqAq8KygcgABoMdQLEAzwEBAhmZQgC+ArYCtwO2AN4CmAI/gQIA/gECAgAAGxlRAD0A1YB1AkWDPQDMAhuBogB6AIYDAAIcGWgCKoKmAf+BJgHigggCD4EyQOIAngECAhyZQAA9A/0A/YCdAn0BwAA4Aw+AygD6AwACHRlQABcCDwIvg68CNwP2Aq2CrQKTAhECAAAdWUAAPoPDgP7Ag4J+gcQAD8MxAN8BgQIAAB3ZQAEvwKrAf8FqwW/A5gIPwTCA3ICDgwCBHhlCAl8C3wL/gV8BXwLYAkwBO4DeAQICAAAg2UAAF0JfgX/B1QDXgFoAOYDVgVcBWQFQASHZQAACAgICBgEaASIAgoBiAJoBBgECAgICIllIgQSDNIDVgFaAUsBSgFWAVYB0gcSABIAi2VkAGQPZAFUAVwP1gFUAVwPZAFkCWQHYACMZQgIaASOA3wCAAjUD/QHEAD+AxAEFg4AAI5lJAgkD6QAHAJUCVYPVAEsBSQApA8kAAAAkGWkCKwIrASsBZ4GwAKAAr4GrAWsCKwIoAiRZQAAJAT8AwAIKAbKATgCAAhECPwPRAgACJdlAAIQAiQBJAFIAQgBAAH+DwABgACAAAAAmWUMAKAD/g+gAKwAAAIkAUgBAAH+DwABAAGcZQAEWANUCPIPVAAEAyAAbAEAAf4PgAAAAJ9lQADIA3wF+AT4BXwFAAQoAIAA/weAAAAApGUAAAAO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rAL8BAQEAAB+Z4gBSAD/B0gAgAQ4BIYHYAQBBI4FMAYAAH9nCAOIAP4PiAAADPwDZAikBSQGpAVkCAAAgWeIA0gA/g9IAAAMhAN8CIQFNAIsBeAIAAiEZ4gBSAD+D0gAAACcAWoBCAnICQgM+AMAAIlniANIAP4PSACIAAAIRAhECPwPRAhECEQIkGeIA0gA/w9IAIgAAAz8AyIAIgDiDyIAIACVZ4gDSAD+D2gAgAg4BIgDfgDoBwgIOAgABpdnAACIAUgA/w8oACgCgAFIAP8PaACIAwABmmeIA0gA/w9IAKAIEARuBIgDyAI4BAgIAACcZwAAgAS+BKoCqgGqAf4PqgGqAr4EgAQAAJ1niAFIAP8PSACICCAEqAQoBT4CKAXoBAgInmeAAUgA/wdIAAAH/gAABIADfgCAAwAEAACgZ4gDSAD+D0gAAAEkARwBBgGEDzwBIAEQAaJniANIAP4PSAAAAPwPBAgUC+QItAkECgAIo2cAAAQBtACUBFQEfglUClQKlAq0AAQBAACqZ4gDSAD/D0AAEADIByQIIwkkCcgIEAYQAKtngAFIAP4PKABAD/wABAb0AQQC/AcADAAAr2eIAUgA/g9IAEAAEA+QBP4EkASQBJAHEAC2ZwAApAiUBI4ChAHcD4ABvAKkAqQEvAQABLdngAFIAP4PSAAADv4BCAzwA/wPBAT8DwAAxGeAAUgA/g8oAAAA9A8UAJQBfACUCRQI9AfPZwgBiAD+D0gAAAD4D4gEjgSKBIgE+A8AANBnAACEBIQEvgKsAewHrACsAb4ChASEBAAA0WcIAYgA/g9IAAAA/g+IBIgEiAT+DwgAAADSZwQJZQkRBRIDBAPEDx8DJAMkBSQJFAkAANNniASqBKoCgAKkAbQPjgGEAvwCwATABLAE1GcACVAJVAU0A3wD3A90AxwDFAU0CRAJAADYZ4gBSAD+DygAKAGAAPQPTAREBEQExA8EANxnCAOIAP4PSAAAAPwPJAkkCSQJJAnkCQQI4GcIA4gA/g9IAAAAWABICEoIzA9IAFgAAADlZwAASAgoCKgPWA1cDUgNWA2oDygISAgAAOxnAAAECPQEtAKUAf4PlAG0ApQE9AQECAAA72eIA0gA/g9IAAAA9AMUAfQJBAj8BwQAAADxZwAAiANIAP8PyAAICQAIigj6D4wIiAgICPNngANIAP4PAAD8CQIF+gIAAPwPBAD8AwAA9GegBL4EoAK/AqQBgA+fAaQCpAKkBKIEkAT7ZwAAJAgUCNQPrAquCqQKrArUDxQIJAgAAP9niAFIAP4PSAAAAOgDKAAqAPwPKAAoAugBA2iIAUgA/w9IAAAP/AAUDvQBUghSCNIHAAAEaAAEUARcAlAB0gDUD9AAUAFYAlQCUAQABAVoAAOIAP4PAAT+A0II/gdAAP4HQgD+D0AAB2iIAUgA/g9IAIgEIAKkCSQI5A8kAKQBIAYIaIgBSAD+DygAQAgQBFAEfgTIAyoFqgigBgtokANQAP8PUAAEBnwBRwjkD0QARAMEBAAAD2iIAUgA/g9IAEAEEgSWBJAEmASWBBAEAAARaAADiAD+D0gAAAbkARwDQADQCRAI/gcQABNoiANIAP4PQAAQCAgJJAniDyQJCAkwCAAAFmiIAUgA/g9oAPoPigV+BAoEfgSKBPoPAAAXaAQJdAlUBVQFfAPUD1QBfANUBVQFdAkECSFoiAFIAP8PSAAICGAEGATYAg4ByAIoBEgIKmiIA0gA/g9oAIAEEAROA8gA/g/IAUgCQAQ3aAgBiAD+D0gAAAFKAUoB+A9IAU4BCAEAADhoiAFIAP8PSACICCAEaAWYBE4CKAOoBIgIOWiIA0gA/w9IAAAA/g9SCNIIUgFSBn4FAAk8aMQBJAD/DwQATADkD2cEWwRaBGYE4gdAAD1oEARUAlQB3g9UAVQJEAT+AhAD0gQUCAAGPmhACGQJFAUEBTwDBg9EATwDBAUUBSQJAAhCaIgDSAD+D0gAAAgkCSQJvg8kCSQJIAkAAENogANIAP4PQAAMCYAE/gMAAP4HQAicCAQFRWiIA0gA/g8IACAO+AGWB1QIXArQCRAIAARGaIgDSAD+DygAQAD8DwQIVAr0C1QKVAoACEhoAACUCZQFtAVUA1YPVAF0A5QFlAUUCQAITGgAAAAJeAVYBVgD3g9cAVwDXAV8BQQJAABQaAgDiAD+DwAA/A8EANQDVALUAwQI/AcAAFFokAmYBV4FfgMWAYYPVgFaA1oFsAWACQAAU2jEASQA/w8kAAAE/QUlBSUFJQUlBf0FAQBcaIgDSAD/D0gAyghCCMQFcQZWAkAF3ARCCGNoiANIAP8PSAACBCwFIAU/BSAFKAXmDwAAZWiIAUgA/g8oAIAIVAQ0AxwAFAAyD1IAgABmaIgBSAD+D0gAAAF8AQIBkA8+AUgBRgEkAGhooASUBJACvgKAAagPpgGWApQCjASEBAAAaWjEASQA/wcUAAAO/AEEBCUE9QckBCQEAAB2aIABSAD+BwgA4g9SAVoB+g9WAVIJ8gcAAH9oiAFIAP4HSAAAAX4BagFqAeoHagF+AQABgWhMCWAJEgVYA0IDMg8OAUIDQgU+BQwJMAmFaBABkAD8D5AAoATYA6wCqALoC6gK6AeAAoZoAAOIAP4PSAAACSgN/gMAAPwPBAD8AwAAk2gIA4gA/g9IAAAAVAFEAcYPdAFEAUQBAACXaIgDSAD+DwAA/AisBqwG/AWsCKwI/AgAAJ1oAAAgAPwPAgD4AwAAqAauAJQPtACsAqQEomiEAUQA/g8kAAQA8QdWAVABXgFQBfYHAACmaAAAEgmKBF8ERgVqAkgCSgHfAEYACgAQAKdoiAFIAP4HKAAgAKoHvgSqBKoEugSiBwAAqGhACCoJGgV+BRkDqg8AAR4DQAVABX8JAAmtaIADSAD+D0gAQApYCR4FygaYBp4JqAgACK9oiAFIAP4PSAAABOoErAL4D6gArgS4AwAAsGgAA4gA/w9IAIAM6AOIAOgP/gQIB+oIIASzaIABSAD+D0gAAAy0AywApw8kALQPIAQAALVoAAA0CAwE3gNMAVQBQAJMAN4HDAgUCCQGtmiIA0gA/w9IAAAP/gAKAqoC6gdKCU4JAATAaAgBiAD+D0AAEAUIBSQEogQMBpAFUAQAAMRoRAlUBdQFzAPMAe4PzAHMA8wDzAVUBVQJyWiEA0QA/w8kAEAAngeqAKoA6w+qAL4EgAPLaIgBSAD+D2gAQAkIBf4FWAFYAf4BCA0AAM1okANQAP4PUAAAAPwPVAlUANQHfAkABQAA0miIAUgA/g9IAAAAbAI8Aq4PrAI8AmwCoADVaIQBRAD/D2QATAZEAVQE1wdUAEQBTAIAANhoAAD0DBQC/g8UAfQIYAQUAv4PFAL0DAAA2miAA0gA/g8ABP4Dkgj+BwAM/gOSCP4HAADfaIgBSAD/D0gAAAT8BKwCrAH+D6wBrAL8BOBoAAgYCQoFfAVYA94PWANYA34FCgUYCQAA42gIA4gA/g9IAIAIFAZUAP4PVABUBXwFEAjuaAAApASUAtQPjAKMBD4EjALUD5QBpAKABPFogANIAP4PSABACjQJ1AbeBJQGtAkUCAAA9WgAAMQBJAD/DyQAAAPfAPUH/wfVAF8DQAL6aIgBSAD+B0AAHAD8B/QHVgVUBWQFDAcAAAVpiANIAP4PCAAgALQHrAKuCywI5AcgAAAADWnIACgA/wcIAOAPBAT8BVwFXgVcBfwFBAQOaYgBSAD+DwAAMAD8D6oEqAT+B6gEqAQAABJpgAFIAP4PCAAgDf4DKAiACRwE5AN0BgwIHGmQA1AA/g8QAPAJOAk0BfIDNAM4BfgJEAgtaQAAkAD/DwAA/g8SAO4BAAD4D68C6A8AADBpgANIAP4PAAD8A1QC/A8AAP4PAgD+AwAAP2mAAVAA/AcAAKgA+A94BXgFfAX4D3gAgABKaRADkAD8D5AAAAj8B9QB1AXUA9QJ/AcAAFNpgAFIAP4DAAz+A0IAqgT6B6oEQgT+AwAMVGmAAUgA/g8AACwJfgkMB6ADHgVCCT4JAABaaQAAVAhMBl4DVATAD1QJTAleCUwI1AgACF5pAAOIAP4PQAAcCFQE3ANUAVwJVAlcB0AAY2nAASQA/w8UAIADfwDlD1UFVwVVBfUPBwBtaQgJagVsBXgDbgHoD2gBfgNsBWoFCAkAAHVpiANIAP8PCADiCaII7gj6C0IIkglyCgAAd2mAAUgA/g9IAAAAvA+oCoAKvgqkCqQPFAB8aYABSAD+DygAiAiqCpgH3gSYBqoFqggAAH1pAACkBKQEgAL8AdYH1AH8AYACrASiBAAAgmkAA4gA/g8AAPwHVAJ8CSAExAN8D0QIRASEaQADiAD/D0AAHgjACV4EQANOBtQLBAgABIZpgAFIAP4PCADwB7gC9A8WANYDBAjoBwgAlGkAA4gA/w8AAPwHVgJ8BwAA/A8EAPwDAACVaYgDSAD+DygADAGUD0QJJglECZQPLAMAAJtpgAFIAP4PKACACOwFvAOuD6wDbAUkBQAAnGmIAUgA/g8IAEAIXAbcAVYJVAlUCVQHAACoacQBJAD/DyAAggBKACYA9w+iAqoCqgIAAK5pAATiBOwErgKiAKAPsgCoAqYCqASiBAAAtGkAA4gA/g/IAAAAvA+iCpAKpA+cCoQKvA/LaQAAyAMoAP8PAAD8D74CvAL8A74K/AcQAs1pyAAoAP8HKAAIBugBfAd7BXwFdAV0BwAA0GmAAUgA/g8IAHwAVAhWB/wA1AdUCXwLAAjYaQgDiAD+D4gAAARWBVQA/A9UAlYFVAUAAP1piANIAP4PSAB6ANoP/wraCv8K2gr6DwAAAmrABOwE2gLAArwA1gfWAPwCiAL2BOAEAAAKaiQIFAl/CRQFUAVKAzYBQQM0BX8JFAkkCRFqiAdIAP8PSAGEASYJDA24Dw4BfgUQCQAAE2qAAUgA/g9oAAAIfAt8C/wFfgV8B3wJfAkZaogDSAD/D0gAHAVsAXwJbA98AWwFfAUABR5qAAOQAP4PAAD8BwQJ9ArUC1QJtAqECwAAH2qAAVAA/g9QAAAC9AL8AvYP9AL0AvQCEAIhaoABSAD+D2gAAAl0BXYD9AF0A3YFdAUECSNqhAFEAP8PRAAADSsDqgg+B2oCKwWiDAAAKWo4A7gA/Ae4ACgAgADsB7gHqAeoB6gHAAAqaogBSAD/D0gACAj6CV8FWgX6AV8FWgX6CTFqiANIAP4PAABeCToLjg0cBUIFegtCCV4JOWoAA4gA/w/IAOAItAq+DPQGAASQAP4PEABEagAAyAD+DwgA+gOqAqoC/g94BI4DeAwACEtqkANQAP4PEAAyD7IA8gf+BfIH0QCwDyAAWGqIAUgA/g8oAIAPWgFaB0oF3gZaAMoPAABZasABKAD+ByAA2gS6BboEtQS+B9oFEAQAAF9qiANIAP8PQADmDLgDtArfCKQHuAq0CKAEYWqAAUgA/g9IAAgEuAVsA+4KvAmsB6wBOAJraogBSAD/D0gAEgjyBX8FegX6AX8FcgXyCXFqgANIAP8PAAT8A0QErAdsBwQApAj0ByAAgGoAA4gA/w/IAHgIzAv8C/4L/AvMC/wLAACQaogBSAD/DygAiA98ACcH7gX2BeQF9AcEAJRqiANIAP8PQAAaB/wF2AXeB9gF/gWIBwAAomqAAUgA/g8IANgMuAL0BBYAxAyoAugEAAipagAByAH+B2gAeAXMAfwF/gfMAfwFhAUAAKxqAAOQAP4PAAAUBtQG9gN0C3YHVANUBAAAw2qAAUgA/gcAAP4HAgT+Bf4F/gX+Bf4FEgT7aoADSAD+DwgAfgkuC/4NAAVeBS4LXgkAAARrgAFIAP4PAAD+B+4E5gPwD+YD7gz+BwAACmsIA4gA/g+IATAB1A82D4APNg9UD3QJAAAga0AIMAgMBAoCiAF4AIgBCAJIBDgICAgAACFrAAAEBoQBCAhgCB4ECgPoAAgDSAQ4BAAIImsUBCQCxAE8AwQIMAQOA+gACAMoBBgIAAAjawAE/AMUABQA8gcCADAMDgPoAAgBOAYICCdrAAD8DwQFpATUBAQNYAweB/gACAN4DAgIMmuIAMQPogSQBJIE5AewDA4D+AAIAzgEAAg6awAACAn8BVgB/AUAATAMDgPoAAgDOAwIAD1rUAhYC1QI8gdUDQAIMAQOA+gACAM4BAgIPmsABKoCqgivB6oAogIwCA4G6AEIAzgMCAhHawAB/geqBKoFqgi+BwAAHA7KAQgCOAwAAElrJAStAv4H/AOuAf0EOAwHA+QADAMEBAAATGuAALwHrAW8B4QIvAewCA4G+AEIA3gMAABQawAA/gOCBNoFqgTaBQAMEAPuAAgDKAwYAFNrIAHsD6wHuAeoB+AMYAQcA/ABEALwDAAAYWsAAboPuweAB7sHmgcwAA8O5AEEA3wMAABiawAEAATwBwAEAAQABP4HIAQgBCAEIAQAAGNrAAQEBOQHBAQEBAQE/AdEBEQERAREBAAEZGsACPAPAAgACP4HIAQAAP4HIAggCBAIEAZlayAIIAu8CKAIIAggBP4HJAIkAqQBpAAgAGZrAAAQCNQHFATUB5QEEAT+ABAHFAgUCBAGZ2sACPAHAAT+ByACCApoCKgFPgIoBegECAhpa6AAoAV8CGAIIAUgBf4EJAKkASQApAAgAWprJAikCKQOlAiUCLwIhA+UCpQKpAqkCgAIb2sQANAHHATQBZAF3gWeBbQFFAT0B/AHEAByawgM6AMoAGwL6AdoAi4JfASsA7wEqAgoBnNrEA7QAVAE3ALQD9AAXgn0DFQDdAVUCRAEdGsADPwDBAhUCHQPFAiED1QK9Ao0CtQIAAB3awAM/AMECGwI/A5sCAQPbAr8CmwKpAgAAHhrAAh8B1QE1gc8BUAAPAe8APwPvACoBwAAeWsAAIQARAgkBFQEnAIUAZQAdAAUAAQAAAB7awAAxAhkBJwGFAH0AAQA/AdECCQINAgkBnxrwAAiCJ4EEgPyAAAARABEAP4PQgBCAEAAg2sAAMIIPgSSA3IAAAj4CIgG/gGIBvgIgAiJa8AAIgieBJIDcgAQAM4HqQLoCwgI+AcAAIprgABiCB4GkgFyBBAETgPIAP4PSAFIAkAEi2uAAOIIngSSA3IAAAioBP8EaANlBVUJQASWa0AAYgxeApIBcADkDwQE/AVuBWwF/AUEBJhrgABiCF4GkgFyCAIJqAUvBxgFXQsVC6AItGsAAPwPFAXkBBQNQAzeCEIHQgb+CWAIGAi1awAAAAL8D1ICUgIRCUAI3gVCAl4FoAgYCLdrAAz+A1UJVQk9B0AA4AheB0IG/gVgCAAAumsAAFIGVAHMD1MBAAjeBEIFQgJ+BeAEGAi8awAAbAxsA+4A7AcEAmAI3gRCA14DwAQACL9rAAf/APUOpQD1AqcEAASvAqECLwHoAgAEwGsAAHwJUglAB1QFPA1ACH4JQgb+CWAIAADBawAA/ATSBMAH1AQ8AkAI/gVCAv4FYAgAAMVrAABUATQL1goUB8QCEAjOBUIC3gVQCAAAy2sAACAA4Ak8BSQDpAF8CSQJJAf8ASABAADNawAAIADwAy4CogKqAqoKIgoiDv4DIAIAAM5rAABIAMQHcwJKAsoDegpKCkoO+gNCAkAAz2vAAMgC6AOmApQDlAPUA5QKlAr0B8QCwADSayABIgHqB2oFagX/B2oFag1qDeoHIgUAAdNrEAD4B7YFlAz0BwAAtA8sAKYPJAC0ByAI1GsAAAAA/g8gBCAEAAD+B0AIIAgQCBAHAADVawAAQAF+AUgBKAGADz4BSAFIAUQBJAEAANlrAABACn4L5AdkBVQDXgDkB2QKZAlQCUAE22sAACgBKAEoASQB/AckCaQIkgiSCJAIgAbhayQBJAH8ByQJoggQCMALfgpICkgKyAkIBOtrAADEBPwF7AXsA+4H7AvsCuwKfArECgAA72skASQB/AeSCIIIKApkChAJzgkQCswKAAQPbAAAAAj8ByQEIgQiBH4AogMiBCEIIgggBhFsAAAACPwHpASkBKQE5ASkAaQGvAiACAAGE2wIAPgBCgIIAgAI/g+SCJIE8gGSBp4IAAQUbCAAGABGAFUAVABUAFQAVADUAxQEBAgABBdsAAhYCUYFVAJUAtQF1ARUANQDFAwECAAEG2wQABgJhAUjAyoJKgmqB6oAKgHqAwoMAAYibAgAqAS2Bb4FfAd8BbwFvAUcAPwDBAwABiNsEAAYCUQFIwGqDyoBKgFqDSoA6gcCCAAGJ2wQAMgCxALeAtwP3ALcAtwCHAD8BwQIAAYobAgAUAlYC1YLXAVcB1wJXAkcAPwHBAgABi5sEAiICrYEXANcAlwEXAccCPwBDAYECAAG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AAQRcBAAJA8kAIAFvAT8DrwMvA78ArwEvAmAAh9wEQSmAwAAAgATDLoDOgP4DzoBuwe6A7oPLHAQDKIDhAA2BlQB/gcmAfIEbgVqAfoFAARMcAAAIghEBgQDdA7UDzYPhA92D1QPdA8AAFFwAAAiBqwBAATqA+oH+gXiAeoD+gXqBQAEY3AQACYPQAAXAk0DoAOcA7YL+gtcBxICQABrcAAIYAgYBAACgAF+AIABAAJABDgIAAgAAG1wAAACCEIEMgQCAsIBPgDCAAIDYgISBAAEb3BACHAEAAL+ARACBAAECAQI/AcEAAQAAABwcAQChAF0AA4I5AQkAgQB9AAEAWQCJAwAAHVwAAgACaoIKgQqAqoBKgIqBCoFvggACAAAdnBwBAAO/gEAARgFAAQgBCAE/gcgBCAEIAR4cAAAQAhICigJJAQWAtQBHAIkBKAJIAhACHxweAgABv4BEAEABjAAjgCICAgJCAz4AwAAfXAACAwJ0gQABAgD1gACAwgEDAXSCAAIAAB+cAAAmAiICGgECAIKAewACAMIBMgEGAgAAH9wOAgABv4BAAMIAPAHAAQABP4HAAQABPgPiXBwCAAG/gEAAjgIAgzyA5IAkgCSAPIBAACKcHAAAAz+AwACGAgwBA4C6AEIAygEGAgAAI5wAABACCgJpAQgBBgDxgEYAiAEpAUkCEAIknBAADAO/gEAARgKQAg4BAAE/gIAApgBIACVcDgIAAb+ARACAAjoByoAKgDoBwgICAYAAKtwOAgABv4BAAMIAEgEaAbaBUgEKAcIBAAArHBwCAAE/AMgAgAA/A8kCSQJJAkkCeQJBAitcAAM7AMoCKgJqAQuBqgBKAIoBCgJrAggCK5wcAgABPwDMAYAAPgHLgkoCegLCAr4CQAEs3AYCAAG/gEAAhgA4A8UAJwBfACUCRQI9Ae4cHAIAA7+AQACKAQwAA4A+A8oASgBKAEIALlwAAAADOACoACgBr4ApAKkBKQA5AIEBAAAunAAAYgMigLKALgGrACqAqgIuArgCIAHAAC8cDgIAAb+AQgBEAR0A14I9A9EAEQDRAQAAMFweAgABv4BCAMQADwHpAAkCPQPJACiAyAEwnB4CAAG/gEAARgBAASWBJAEmASWBBAEAADIcCAJEgcOA8oAagwaAAAEfAkAAQAF/gUACM9wAAgADPwBVAFUBVQBVgVUAVQLXAlABwAA2HA4CAAG/gEQAoAIiAT+AogAiAD+AogMAAjZcCAIEA7+AQADWABID64EtASkBLQETA9AANtwQAgwBv4BEAYABPgIiAj+B4gE+AYACAAA33B4CAAO/gEQAP4PAgQiBfoEogUCBP4PAADkcPAIAAz8AwAEEAUAAagD/AqoCrgKqAYkAOZwIAQYBAAD/wAIAwAI+QQJAu8BCQT5BQAI53B4CAAG/gEAApAIhASmA7wAtA/ECKQIgATrcAAIighiChQJAAQqA1oELgSaCIoKeAgAAO1wAAAkBCQDfwAUBoAAZAA/BwQAfAKABkAI+XAAACIIIgY+ADYFNgG3AHYCdgQ+ACICAgQJcQAAEAgUBPQBVAlcA1wBXANcCVwJFAcAAApxPAQADv4BCAMAAF4BVgHWD1YBVgFeAQAAFXEgCBAO/gEQAoAI+ASWAvQBnAL0BIAIAAAZcTgEAAb/AQgDIACsB6QEpgSkBLwEpAcgABpxAAAkChQLvgQMBKQDMAIMBH4FDAUUCCAEIXEoCCgN/gElAfwNJAH8BSQJ/AEkBSAIAAAmcRAIEAz4AV4BWA1YAfwBWg1YAVgBCA0ACDBxeAgABv4BAAI4ANAPSAUGBUQEXAXEDwAANnGICKgGbgJuABQFDAGAAGgGHgBoAooOgAg8cUAIOAQAAv4BEAikBPQDpgCkD/QIpAgABExxeAgABv4BAAKQCPwK1ArWD9QK1Ar8CAAATnEECfwEXQReAVwN/AAEAHYMBQH8AQQMAABVcQAAAAj+BLIAzgK6DAAA/gQSCRIDng8ACFlx8AgADPwDIAj0CpQK/AqUDvwKlAr0CgAAXnEAABgJVgVUAVwN9AEAABwN6gjIAjgFCAlkcTgEAAb+AQABEASEBL4CrAHsB74BhAIABGdxAAj8DZQAlADsDBQAzAFEBVQJVAHMDQAIaXE4CAAG/AEQAgAI/AusCqwCrAasBvwLAAhucQAAMA40APQBdAV+AXQFdAV4AfQBEgwAAH1xAAAQDv4BEA78A6wEbADqB6oEagL6DwAAhHE8CAAG/wEIAgAM/gCqBqsIqgqqAP4GAASKcQQEfAc/ALwAvgb8AAACZwSqAIkCRAwAAI9xAAAICvoK2gLaCv4D2gr6CtkC+QoICgAAlHEYACAM/gMQBCQBlA9ECSYJRAmUDyQBAACZcQAE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t3MEAiQC/AMkAgQAgA+ABP4EiASIBIgPCAC7cwAEJAL8AyQAAAz4A8gJfgZIBsgJGAgAAMJzAAQkBPwDJAIAAPQDFAH0CQQI/AcEAAAAynMAACQE/AMEAkAI/gdCAP4H/A9CAP4PQADNcwQCJAL8AyQBEAFICCQFkgTEBEgCEAEAAOBzBAQkAvwDJAIAAFwGSAH+D0gBSAJABAAA7XMAAEQE/AdEBAAC8AgABP4DAAj8D0QIBAjycwAAJAT8AyACDACMAvQClALUD5QClAIAAv5zJAQkAvwDJAoACPwFVANUAVQPVAn8CQAEA3QAAiQC/AMkAQwDaAIICP4HiAAKA2oEAAQFdAQCJAL8ASQBAAD8D1QEVgTUAVQDvASABAZ0AAQkAvwDJAIACXwIVAnUD/wPVAlUCXwJCXQABCQC/AMkAgAItAcsAKYPJAC0ByQIAAAQdAAEJAL8AyQCAAj0CRQEEALeARAEFAj0CyJ0AAQkAvwDJAKAANQC1Am8CMQHZACUAwAEJnQAAiQC/AEkAQAAtAe0AqwDLgj0DzQAAAAqdAAEJAL8AyQCAAgIBf4FWAFYAf4FCAUACDN0AAAkAvwBIAOIAP4PSAAAA8gA/g9IAIgDNHQAAFoAWgFeAXoBWgFYAXoFXgNaAVoAkAA8dAAIRAT8B0QGAADoBqgArA+oAKgB6AMIBEt0AAAkBPwDJAIAAPQHvAW2BbQPvAXwBQAFW3QAAiQC/AEgAQQE9gSUApAB8ACUApYC9ARcdAAAJAT8AwQI8Ae4AvQPFgDWAwQIyAcQAF50AAQkAvwDJAIAADwAsA+wB/4AsA+wALwPX3QAAJQOVAh8BFQGlApACVQJvARUAVQGAABqdAQCJAL8ASQBAAz+AKoGqgD+BqoBgg8AAHB0AAQkAvwDJAIACHwEVALUAf4HVghUC3wLg3QAAiQE/AMkAgQAdA9kA9YFZANECXQPAACHdAAAJAT8AwAM+gMqCMAHFgcqBOgPKAloCYt0AAAkAvwBJAAAAvQC9AL2D/QC9AL0AhACnnQAAiQC/AMgAQoEaAV+A+gBbgVoBW4JAACndIAAfAh0C7QLtAv8CwAPVAt2D1QLVAkAALB0AAIkAvwBJAUABP4Evge6Ab4CugJ+BRAFynQABCQE/AcgAggM/A/+B+wH7AfoC+gLAAjcdAAIAAb8AQQABAb8BQIEggc+CMIDAAwAAOJ0AAB0DfwB/A90AQAO/AEEBvwFBAL6DwAA43QEAE0N5gMADfwH/AsCCP4HWAHnD1QBAADkdAAE/AX+D/QJ7AHwDfwDBA78BQQG+gsADOZ0AAAEBAQO5AkcCNQEFAUUAPQHBAgECAQG7nQAAFgISA7kB3IHaAdiB2oBcg9kCEgISATvdAAA/AcEBbQE5AQQAQIM/guSAPIPAggABvZ0AACIDPoDiAD+D4oAAAj8D5QA9A8ECAQE93QAAEIIVAzAC2gJZAtWAUwBVA9kCGAEAAAEdQAAfAl8BVwHbAU8AIAPfAiUAPQPBAgABhh1AAAIAAgA/g+IBIgEiASIBP4PCAAIAAAAGnUAAAQBBA/+CVQJVAtUCVQL/gsECQQJAAAcdQAAkg+SBP4EkgcAAP4PiASIBIgE/g8IAB91AAAgCJAIjgiICIgI/g+ICIgIiAiICAAIInUADOQDJAm0CrwKrgqsD7wKtAqkCiQIAAAjdQAM5AMkCLwKpAqkCqYPtAqsCqQKIAggACV1AAArAiQC/wEkAQAIvgbqAb4EqgS+AwAAKHUAAAAM/AMkASQBJAH8DyQBJAkkCfwHAAApdQAAAAz+A5IAkgD+B5IIkgiSCpIK/gkABCt1AAAIAOgPqAKoAqgC/A+oAqwK7AcIAAAAMHUAAPwPRAREBEQE/AdEBEQERAREBPwPAAAxdQAA+A+IBIgEiAT+B4gEiASIBIgE+A8AADJ1AAAAAPwBlACUAJQA/A+UAJQAlAD8AQAAM3UAAPwDJAEkASQB/w8kASQBJAEkAfwDAAA1dQAAAAD8AyQBJAH/ByQJJAkkCfwJAAgABjd1AAAACXwJVAVUA/wBVAlUCVQJfAkABwAAOHVAACAA+AeuAqgC6AOoAugLCAgIDPgDAAA6dQAA/gciAv4DIgL+AwAACAgICPgHCAAIADt1AAD0DwQE9AVUBVQF/AVUBVQF9AUEBPQPRXUAAPgB/g+uD3gAIgnyBDoC5gkiDOADAABMdQAAAAG+CKoEagI+ACoAag+qAL4AAAEAAE91AACACPwP1AjUCPwI1APUBNQG/AiACAAAUXV4CAAG/AEABhAA/A9EBEQE/AdEBEQE/A9UdQAA/AckAvwDJAL8A4AAqAD+D6AArACAAFl1AAA8AKQPogqSCqIKgA+8CoQKRA88AAAAXHUAAEQA1A/UCvwK1g/UCsQKpAqkDyQAAABidQAAoACuAu4CrgLuB64CrgLuAq4CgAAAAGV1AAD8B/wDJAL8A5AAiA/WCKQI3AjED0AAZnUAAPwH/AMkAvwDAAgoCSgJvg8oCSgJAAhqdZAAlADcB7QFlAW8B5QFsgXaBdoHkABAAGt1SAB8BPwH/Af8B/4H/Af8B/wH/AdIBAAAcHUAAAAKvArsB6wGvAKsAqwG7Ae8CgAKAAB0dQAA/AckAvwHdAasA/QDXg1UDVQJVAcAAXZ1AAA4AAoP7AuoC64LqA+oC+wLCg84AAAAeHX8ByQC/AMkAvwDIAC0A7QCrgs0CPQHIAB/dUAA5gdZBdQHWAX/D+AEdgN5B7QIUghABoZ1AAB0BVQPXAzABwQA/A/0DvwP9A78D0QIinUAAPAJ/gj+D/4P/g+uD/4P/g/+CPAJAACOdQAE5AcEBPQDTAIECPQElAL+D5QC9AwAAI91AATEA/QDTAIACKQHPACmDywAPA9kCEQEkXUACW4JVAXUA1IBCA2iAyoE6g82CWIJIAiXdTgJgAT8AwQAJAAkCCcIpA9kAGQAJAAAAJl1MAkABfgDCABIBCgKrAmoCagIqAgoBAAAmnUYCYAM/AMECMQINAQmAqQBZAIEBAQIAACfdZgIgAb8AQQAhAD0B5UElgSUBJQElASEAKR1mASAAvwBBAD0A5QE9gSUBJQE9AQEAgAAq3WICLAO/AEECEQItAWWBpQG9AXECEQIAACudYwIQAb+AWIAIgDyBysIKwkqCfIIEgYiAK91OAGADPwDBAz0AxQAlgLUAxQA9AcECAQEsnWYAIAO/AEEDvQBVATWBXQCVAWUBDQIAAC5dbgIgAb8AUQAJAqUClYJFAWkBCQCRAEAALx1GAmADPwDBAAkBbQE1gjUCrQKlAAEAQAAvnWYCKAO/AEECIQEtASmAuQBpAKkBKQIAATFdZgIgAb8AQQA1A9UAFYD9ABUA1QI1A8AAMd1mASABvwBBATUBxQEFgT0B5QElASUBAAAynWYBIAG/AEEBCQFFAVWBdQHVAUUBSQFJATSdYgIkAb8AQQApAK0AqYC5A+kArQCpAIEANV1mAiABvwBBAD8D6wErgSsAawGfAUECQAA2HU4CYAE/AMECNQJVAtWCVQJVA3UCRQIAADbdZgIgA78AQQA7A+8Ar4C7A+8AqwK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JALkA3wA1AF+AVQB1Ad8AQABl3iEAPQHLATgB8QANAykA0YA9AcUCPQJAASYeEIA+gcWAvIBAAT8DKQC/wCkAP8CpAT8AJ94hAD0D0wEwAcIAHwNSAP8D2gDfAVICQAAp3gAAMoE6gL+D+oKgAr8CtQK1grUDvwAAACpeAAAhAD8ByQC5AsACPwHrAKsAqwG/A8ACLB4hAD8DyQE4AeIAA4J/A8ICPwPCgjICQAAsXgEAdQPLATEC/AHCACoDwgHfgKIBWoIAAazeIQA/AckAuQDAAisB2gALg2oAygErAkgALR4hAD0DywE5AcAAKgL2ArcCtgKqAsoCAAAuniEAPQPTATEB0wA5A9cCVYJ9A9UCVQJTAm8eAAAggD+ByICwAd+A6oEqgD+BqoBgg8AAL54wgD6ByYC4gEABP4DigjqB6oB6gKuBAAAwXiEAfwPJATkAwwIaA+OCOgOSAioD84IKA7FeEQA9AdMBMQHAAB0CFwG3AF2CVQJVAcAAMp4AABSAtIHegVuBWoHagLqB2oFegVCB0AA0HhQBVAFPANUDxYLfAsIC2YLUgu+D5gBgAHVeAAARAD0DywE4APID/wPzgjMD+wIyA8ACNp4hAH0DywEJATEB/wC3AbcDv4K3A/8AgQD6HgADvwBBAS0BLQOtAuWCoQKtAq0CrQOlAD0eEQA9A8sBMQHIACaCdoP1gjWDJoKIAgAAPd4QgD6BxYC8gOACHYHzAFfAMwB9QdUAQAA+ngAAIIA/gcSAuADSgjvBOoC+gDvAuoCAAwBeQAAQgD6BxYC4gEIDP8ArAb9AKwGLAAABw55hAD8ByQCxAsUCEwEXgfQD0wJXglUCRAIGXkAAAQB/APkCw4IVAfUAUAIDAfsDywJZAA6eQAAIAQkAqQBJAgkCOQPJAAkAKQBJAIgBDx5AACIAYoA7g9YAIgBAAD+BwAIAAgACAAGPnkAAAgBiADOD7gACAkgCCAI/g8gCCAIIAhBeQAAiABKAOwPWACIAAAA/A8EAHQCjAEAAEJ5AAGIAMoPeACIACAA/AcgCP4JEAj4CAAGSHkIAYgAzg94AIgJAAT8AyQAIgDiDyIAIABJeQgBiADuD1gAiAgACPAPAAj+DyAIIAgACFB5iACIAO4PWAAIAYAA+A9OBEgESATIDwAAVXmIAIgAzg98AAgI4AwAAvIHxAgwCGwGgABWeQgBiADKD7gAAAj8DyQJJAkkCSQJ/A8ACF15iAFIAO4PWACACDwEJAPkACQA5A88CAAGXnmIAYgA7g9cAIAA+AMoASgB/g8oAfgBAABfeQAAgASWBLQCtAC+B7QAtAK0ApYEgAQAAGB5gABJAOsHWACCAOoDKgEqAeoJAgj+BwAAZXkIAYgAzg94AAgAQAFKAUoB+A9KAUoBCAFoeQQJdAXUBdQB/AnUCdQH/AHUBdQFdA0ECW15EAAQAZgIbgRMAXQJSAlGD1gBZANUA4wMd3kIAYgAyg+4AAAEVALUAX4DVAlUD0QBAAB4eQgBigDqD5gAAADcD1QB9ABUC1QI3A8AAHp5CAGIAOoPWABACAgJ/gVYAVgB/gUICQAAgHkAAAQK/AuMA/wL3AveD/wDjAf8BwQKAACBeQAAFAlMBV4BTAlECVAPTAFeBQwFNAkgAIR5iACIAM4PfAAIAEIEKgIqCeoHKgG+AqAEhXmEAEQA5g9cAAQB8AGqAfgHrAGqAfgBAACNeYAAiADsDxgAwA98AMQH9ALUA1QI/AcAAI95iABIAO4HWACCAPoPagVqBeoHagV6BcIHpnkAACQFswWABesB/gHaB4ABvgOCAz4FAAWneQABigDqD5AABAB8D9wLXgtcC9wLfA8EAap5xAAkAPUPLQBAAv8CrQL/D6oCrQL/AgACrnmIAUoA6g+YAAAI/gv/CuoK/wrqCv4LAAixeQABigDqD5AAxA/8BfwH/gb8AvwP3AIAALl5AACED7wArASsBPwHrASsAqwKugiCBwAAunkAAIAP/ADUAtQC/APUAtQC1Aj8CIAPAAC7eQQABA90AWQFZAfWBVQFVANECXQJBAcEAL15EAAID+gBxAGUBbIHugWyB4QJ6A8IAAAAvnkgBCQCJAGkAGQA/A9iAKIAIgEiAiAEAAC/eQAAkAhUCFQENAN8ADQANAdSCFIIkASAAMB5iAhMCCwEnAOMALwAigqaCSoJSgdIAAAAwXkAApIBUgD+D1IAUgQAB/gEBgTABAAPAAjDeQAAUAhUCFQENAO8AJQANAdSCFQIUAYAAMZ5AAAYA5gA/A+UAAABRABEAPwPRABEAEAAyXkAACgEugS6AroBugH+D7oBugL5AigEAADLeQAAkgNSAP4PUgAACDgEgAN+AIADMAQICM15lANSAP4PUgACAPgBiACIAP4PiACIAPgB0XkAAJQDUgD+D1IAEAFCAUwBAAH+DwABAAHSeQAAlAFSAP4PEgCACDgEgAR+AgAB2AAAANV5EgOSAP4PUgAAAP4PIAQAAP4HIAgQCAgG2HkSA5IA/g9SAIAJYAT6B4IIYAgeCOAGAADfeRQDlAD8D1QAlAkACPwPJAkkCfwPAAgAAOR5AAAUA5QA/A+QAIQAtACEAPwPhAC0AIQA5nkgAawIbASsA7wDrg9sASwDbASsCCABAADneQAAFAOUAPwPkgAACPgIiAb+AYgG+AiACOl5lANUAPwPUgCSCBAETgJIAf4ASANIBEAI63mSA1IA/g9SAJICAAaQAXAA/g9QAJYBEAbveQAAlANUAPwPUgAACHwGRAFEAEQBfA4ACPB5kgNSAP4PUgCSAhACzwEECPwPBADsAQQC+HkUA5QA/A+SABoASA9ICUgJfglICUgPCAD7eQAAlAFUAPwPUgACCagErARWBXQCzAFAAP15FAOUAP4PUwAACZ4JUAhwBV8GUALQAV4AAHoQA5IA/g8SAAAB6gesALwApA+sAKoEqAMFehIDkgD+D0IACAj0BJIDkACSD+QICAgQBAt6AAAYA5gA/A8AATwIpAqkCqQPpAq8CgAIDXqSAVIA/g9SAAAA8gdUAVABXgFQBfYHAAAOegAAlANSAP4PAgA4DMoDSADMD04IeggABhp6AACUAVQA/A9SABAA/g+oBPwHqgSoBAAAIHoYA5gA+A+UAAAM/AMEANQH9ALUCwQI/AcjehAA+AVWBfQFXAX0BiAHpAD8D6QAIgcAAC56AADKASoA/wMACP4Krgr+D64K/QoACAAAMXoUA5IA/g+SAAAC6A+kAqQC6gOiCroK4gcyehQDkgD+D1IAEgDADxIAwg9aBUIF2g8AADN6JAIkAfwPogAABlgAVgVWC1QJXAHwBQAIN3qUA1QA/A9SAAAJfgmWBdYGvgZWBVYIXgA7eooBSgD+D0kAAADKB6oEgQQtBKEE7QcAADx6FAOUAPwPUgBABVwFtAJ2CbQG1ABcA0AEPXoUA5IA/geSABAAdAesB64HtAe2B5YHVAA/eooDSgD+D0kAgA9eAFYPVgVXB14Awg8CAEJ6FAOSAP4PUgCABnwArAysCf4KrAKsBvwIRnoSA5IA/g9SAIAIvAwsBSwF7gYsArwCgABMehAM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fXwsA6AA/g+gAAwBQABECEQI9A9MAEQAQACJfCwDoAD+D6AALAlgBFgGxAFACEYImAcgAJJ8LAYgAf4PoAAsAQAIaAiICw4IiA9oCAgIl3wIACAD/A+gACwBAAj8DyQJJAkkCfwPAAiYfAAALgOgAP4PJACAD4AE/gSIBIgEiA8AAJ58jAMgAP4PhAH8DxQE/AUUBPwEFAX0DwAAn3wECXQF1AXUBXwDVA9UAXwDVAVUBXQFBAmkfAAAgAD8AMQD1gLWAtQK9ArEDvwCgAAAAKV8AADyCJIIngc8A/4PKAAEA3AIkgieBwAAp3wsB6AA/g+oAAAM+AMICEgI7g9ICEgIAACqfAAAKAqoCqoKnAu+AogCmAacB6oKqAooCq58JgegAP4PoAAuAQAA/A9UBNYAVAN8BAAEsXxkCREFQQWMAyABkg8uAUIDwgV+BQwFMAm5fAMA0AH/D1AAkwGAALoAggDjB5oAkgCiAL18AAa4Af4PIAAIAwQIpAanAKQPpACMAoAMvnwCACwH4AC+DwAA1A/cAtwC3grcCtwPFADKfAwAIAP+DywAgA9+BMgDAAz+A5II/gcAANV8BgCgA/4P6AAACKgGqgCsDvgArAyqAIgO1nwGANgA/wNYABAP/AB0A/QC9gL0AvQDIADZfAwAoAH+D6gAJAlABNwHAAisC7wKqAqoC9x8AA78AQQIHAW8BS4Dhg8cA7wDHAUsBQAA33wGAKAB/g+MADoA1g//CtYK/wrWCv4PAADgfAMAkAH/D8IC/wEBAlUB/wfXAz0BkQKBAud8qAH+D6AAKAjgC/wL/Av8D/wL/AvcCwAI73wDANAA/w/eAY0HvQClB+8ApQetAL0HAAD4fIAEhASYA5QB4wDQD0gARAF0AUACgAQAAPt8AAAABJQE1ALcCLQIlA9SAEoBQgKCBIAE/nwAAJAO3ACyDIgCAAD8AwABAAEAAf4PAAAAfQAASAd8ANIPSAEAAOQHJAgkCCQIfAgABgR9SAd+ANAPTAAAAxAATgCICQgICAz4AwAABX0AAEgHdgDQD0wA4AoECAQI/A8ECAQIAAgKfQAAFAhUBVQFfAH0CVYPVAEcBZQJJAokAAt9SAduANAPTADgCggIOATIAg4DyAQ4BAgIDX1IB24A0A9MAAAB+A8IAcgAPgDICPgHAAAQfRAOnADyDsgAgAIECEQM/AtECPwPQAgAABR9SAduANAPTAEAAOgDCAEIAf4HBAnkCQAEGX1IB3YA0A9MAGQBAAT+ByIE/gEiBiEMAAAafUgHWAD2D2AAQAsEB/wAhAQkBTwD4AQgCBt9SAd2ANAPTAAAC3AITgbAAUIITgjQByAAIH0gACoJagVqA+oL/wlqByoBqgWqCSALIAghfUgHfgDQD0wAxAoACAgH+AAuCCgI6AcIACJ9AAA0CBQFVAX0AV4JVA80AbQFFAU0CQAAJ30ACB4JgAXeAcAJogmSD14BUgUeBSIJIAArfRAJHAlQBV4FtAGQD04BFAWUBRIJCAoAAC99AAAACD4FagXqAX4Jag8qAaoFPgUACAAIMH1IB3YA0A9MAcAA/A9EBEQE/AdEBEQE/A85fUgHbgDQD0wAAAMgAKIPngSCBKIEng8AAEJ9SAduANAPTACAAogATgQ1BTQFTAlAAAAAQ30QDtwAsgZIAEAHSABoBloFzAQoBggMAABEfUgHbgDQD0wAAAMACPwPJAkkCSQJ/A8ACEx9SAduANAPTAAAA0IIJgkqCZIPKgkmCUAIUH1IB24A0A9MAKADBACkD6QEvwSkBKQPJABVfbAN7ACiBJgCAAD0BzQJLAnkCTQJLAngBV59SAd4ANYPUAAACygImAQYA84DCAQoCCgAYX1IB24A0A/MAMQDkADID9YEpATcBEQPgABmfUgHbgDQD2wBIACQD4wEogSkBIgEkA8gAG59AAAsCCwFlgHUCcwJgA9eAVIFEgUeCQAAcX1ID3YA0Q9MAAAJBAS8AycALAC8DwQIAARyfQAAkA78AJIGSAIAAFgDdgjQD0wA4AIABHV9SAd2ANAPTAAACxAIiAamBaQEiAawDBAAdn1IB24A0A9MAQAA+AeWCJYI/AicCJQI8AaTfZAMvAHiDNgAAAo6CEIJEgnqD4IJPglGCJl9QAduANAPTAAAAf4PAASoBP4FoAQsBQAEmn0AAEgHfgDQD6wDgAlUBFQDXgBUBtQIBAScfTAO7ACiDJgCAACMDKQCpwCkD6QArAKADKB9MA7sAKICmAQABNoCVAjUD3QATAKABAAArX1IB24A0A9MAEADEAD+D6gE/AeqBKgEAACxfU4HcADsD0AB/A/sA+QDJAKsCyQI/AcAALJ9SAd4ANYPgAL8DwwAvAPkBLQEBAD8DwAAv31IB24A0A9sAQAAvgeqAKoA6w+qAL4EgAPKfQABPgUuBb4F7gGuB6IBWgMaAyYFQgUAAM99SAd2ANAPTAAAAV4EQAD8D2QJcQhGA4gE0X1IB24A0A9MAAAFIASqAioI6gc+AaAGAADSfUgDdgDQD0wA4AOEAJQHfgVUBVwF1gcQANp9SAduANAPzADABZwCrAksCO4PLAO8BAAE4H1IB3gA1g9IAQgAoAeUAJwA1g+cALQHAADjfSAIvAziAtgCgAQgBH4DtAq0B7wBIAYAAOh9SAduANAPTAAAD/wHrAKsD6wCrA+8AoQP6X1IB24A0A9MAEAJFARcA/QJ1AbSBtwFVAjvfUgHWAD2D2ACAAT0BbwHtgW0D7wF8AUABPR9SAd4ANYPSAAAAvwErAKsAf4PrAH8AgQE+32QDtwAsgTAAZwE1AeUBAQA8AwOA/gEAAgBfkgHXgDwD2wAgAIgBGoDqgpqB74AIAcAAAR+RANfAOgPJgAAAfwHvAK8AvwHvAq8CvwNI35AAnwBfAD8B/wASAIYAXwE1ANUANACgAAmfkgHbgDQD8wAQAL2D5gHFgTwD5YIEAgAACt+EA7eAHEEbAMBCHYG4AksCLsK+wsmCgAILn5AB34A0A9MAUAA7A8EANYHdAVUBdQHAAAxfhAO3gCxDMwCAAD3DwAEzgMBBOgHhgiYCD1+kA7cALIMiAIADPwChAaWCaQLhAD8BgAAPn5IB24A0A9MAAAK/Aj8Bf4F/AH8BfwJEAhBfgAIMAq+CjwL/AM8D4gCXgZkB1wKhAoAAEp+QAdOAPAP7AHAB/QHHgT0A5AG/geQDBYCVH6gAy4A8Ae8ABAA/Ae2AtgPPwPQBBYOAABefpAO3ACyBIgCAAiqCeoHrwEKD+oJqgmABWp+AAd4AJQGUgEIADQH8gX6BdIF9AX0BwQAa34AAH4Kfgd/B/4PfgsYB/YC0gp+CpgKgAhwfkgHbgDQD0wBAATwAt4B+gfqAdYC8AQAAHN+kA7cALICCAk+DOsD6wm+BzQMiwN4DAAAfH4QDtwAsgZIAv4PNAi6DzgJPgisDxALAAiMfpgO9gCRBkgBEgjuB/4H7wP+A+4H+gcACI9+gA7cAKIGWAEADPwD9An+C/4O/Av8C4QJln5QB3wAagIACXYE9QcQBPYPMAT+B9AMFgKgfqAEsAVsBSIFkAQAAPwBAAEAAQAB/g8AAKJ+AAAwCewEogSYBgAABAQEBPwHBAQEBAQEpH4AADAJqAVmBRAFQABEAEQA/A9EAEIAQACmfqAEuAXkBJIEgAIwAI4AiAgICQgM+AMAAKd+IAW4BeYEkAIQDIQDfAiEBTQCrAVgCAAIqn4AACAFuAVmBRAFAADEB0QIRAhECPwIAAarfgAAMAXoBaYEkAIACHQEBAP8CAQM/AMAAKx+IAW4BWYFEAQAAqgAqAD+D6gAqASIAwAAr34gBbgFZwUQBQAE9AEEAQQB/wcECfQNBASxfgAAMAXoBaYEkAIACHgIAAT+BAACmAEgALJ+AACYBdcEsQQAAP4PAgCyAdoBAgj+DwAAs34AADAFzgUiBQAA8A8QA/AAnggQCPAPAAC1fgAAMAXsBaIEkAAADv4BAAwAA/4AAAcACLd+AAAgBbgFZgUAAWAIWATEA0AIRgjYB2AAuH4gBbgFZgUwBQAA/A9ECEQE/AFEBkIIQAa5fgAAMAXsBKICmAoACDgEygIOA+gEGAQICLp+AAAwBawFYgUYAQAICAf4AE4ISAjIBwgAvX4AADAJrAVjBRgBAghCDP4LQghCDv4JAAi/fgAAuAXkBJICgAoQCFAEfgTIAyoFqggABMN+uATkBLICAABUBnwBVgj0D0QARAEEBgAAxH4AACAFuAVmBRABAAj8DyQJJAn8DwAIAADFfgAAIAm4BWYFAAD4AygBKAH+DygB+AEAAMZ+IAWwBW4FIgUAAPwPRAREBPwHRAT8DwAAx34gBbgE5gSQAgAIfAZEAUQARABEAXwOAAjIfgAAMAXoBaYEkAQQAEgCVgQkBVQFTAiAAMp+MAqsCWIJEAUAACwBIAH+DyABLAEiAQAAzX4wBZwE8gKIAiAAog+aBIYEogSiBJ4HAADOfiAF+AWmBJAEBACsAqwClA+0AqwCpAIAAM9+IA24BeYEkAAACKQIpAiUD6wIpAggCAAA0X4AADgL5gmQAQAIKA3+AwAA/A8EAHwChAHSfiAAmATkArICCABABugBCAh+BIgHaggIBtN+MAXsBKICmAIAAKQHpASkBL8EpASkBwAA1X4gBbwE4gSYAgAIpASmA7wAtA/ECKQIAATYfjAF7AWiBIACIAiQDqwJpgSIBpAEoAgAANl+IAW4BOYCgAIgAKAPsA+uBKgEsA8gAEAA234gBLgFZgUSAkAAqAKoAq4ClA+sAqQCIALcfgAAMAXsBKICkAIQAEgPtgSkBLQETA9AAN1+IAWcBOIEmAQAAPgHlgiWCPQInAjwCAAG3n4gCbgFZgUQAUAIOAiYBQoCyAUoCEgIAADffiAFuAVmBZIEEAJACGgHXgBID2gISAhIBuJ+AAAgCbgFZAUAAOAPvAK0ArQKtAr8DwAA434wBawE4gSYAgAIrAScA4wAvACaCSoHAADlfjAF6ASmAqACCAhEBeQGagLCBVoMQAQAAOd+IAC4BeYEsAIAAPgHBASgBP4FYASsBQAA6X4wBZwE8gKYCgAI3AVcBF4DXABcBNwJEADqfgAAmAT2ApICAAJUANQHfgVUBVwF1AcSAO1+IAW4BOYEkAIAALQIFAUeA9QBFAVwBRAI7n4AALAF7ASiBDgAoAe0AqwCrgs0CNQHNADwfiAFnATiBJgCAAD4AqgCqAKuD6wC/AIAAvN+AACwBWwFIgUAAPwDtAL0B7QKtAr8CwAA9H6wBOwEogKYAiAA/A+qBKgE+geoBKgEAAD1fiAAmAXWBLECAAC+B6oA6w+qAKoEvgMAAPd+IAX8BbIEAAz+A5II/gcADP4Dkgj+BwAA+H4AALAF7ASiAgAI/AcEANQH9AIECfwHAAD8fgAAIAW4BWYFAAUYAIgCqgisD6gAqAKABP1+AAAwBegFJAUAASgMqAMoBO4PKAkoCQAA/34AALgFZAUSBYgAQAQqAioJ6gcqAb4CoAQAfwAAOAqkC3MJAAyqCJoGBAmgCZIGnguiCAV/AAC8BeIEmQIIAOIHEgTyB14F8gfyBwAABn8AANgCTgJ5AQAE7wQ/AqABKAMmBOwFBAQOfwAAOAXmBJEAAAL8D1ICAAjeBUIC/gVgCBN/IAW8BOMEmALADFQC8gnWBtEG3QVVCAAIFH8QBawFYgUYBQAAtAecANYPnACUBLQDAAAVfwAAOAXkBLIECAKgCKoLmAbeBJgHmgSoCBZ/AAC4AuQCkgAABvwBlAfWA9QHVAHcBwAAGH8gBLwFYwUZAAAFbAVrBaoKqge+ASAGIAQZf5AE3AKjApgCAgDqD2IFfgV+BWIF6g8gABp/IAWwBG4FIAUAAHgBeAV8AXgJ/A/4AQABHX8AANwFswSIACII4AcECK8K6guuCqIKAAggfwAAOAXkBRIBAAz8A3QIrgr+D6wK/AoACCR/uASWAvECCAgGBIIE+gKqAOsCqgSOCAAAKH8ACqAJ+AmmAQAIXgk6C44NDAV6C0IJXgkpfyABuATmAgACjADkDxQA1gd0BVQF1AcAAC1/GAXWBbEEjAAgDPoBVglTD1YB+gUiBAAAMH+gArgC5gKQAAQE/Af8B/wH/Af8B/wHRAQ0fxAEvATjAhgAvgzrA+oJvgc0DMsDeAwAADZ/AABQAEgPRwREBPwHRAREBEQERA9AAAAAOH8AAKgHJgT8AyQCpAcAAAQE/AcEBAQEAAA6fwAAqAcmBPwHJAQEB8AAyA7+AcgC+ATACFB/EAAIB/4HJAcEATQP/g8UD+QPPg80DwQAUX8AAPwPBAAkA+QABAQkBsQBNAsECPwHAABVfwAABAFUAVQBVAHED0wBTAFUAVQBBAEAAFd/AAAeCZIIUgh+BVIGUgJeAlIB0gAeAAAAWn8AAJ4AsgiyDx4EEgQSAN4DEggSCN4PAABifwAAXAlUDVQLXAnUCVQJXAlUBVQFXAkAAGl/AAAcAtQD1APcA/QH9AP8A/QD9AM8AgACan8AArwKtAq0BuwBFAAUAOwPtAK0ArwCAAJufyAA3Ac0BDQE/Af0B/QH/Af0B/QHPAQABHB/IAD+B/oF+gX+BfoHCgDuAQoICgjuDwAAcn8gAa4AugC6B34FegV6BX4FegX6Bz4AIAB1fwAIDgT6APoB/gf6APoC/gD6AvoEngMAAHd/AABcCPQH9AH8CpQHdAa8CrQKtAq8CgAAhX8AAG4N2gFKDQ4FSgD6D64KqgrqD64KoAqKfwABSAFKAUwBSAH4D0gBTAFKAUgBAAEAAI5/QAhYCVoJXAVYA/gBWANcBVoFWAlACQAAlH+ACKgGqgCsAKgG+ACoAqwEqgCoAoAEAACefyABuAS4BHwEeAX4B3gFeAV8BfgHKAQAAKF/UARcApwCHgCcBVwEXANeAl4E3AVQBAAApH8AAagB+g+uBKoEvgcIAUoB+A9IAUsBAACofyAJLAyuAi4ILAn8BKwErAOuBKwIpAsACKl/QAPEC9QL1g/UA/wLVAlWB9YFVAtACQAEr38AACgBKg34Ay4BAAG+A2oEagVqCX4IwAe5fzAK/AveC94H/AfcA/wH3gfeC/wLVAtQCr1/FAIkASQJhAj8BwAAFAJkAQQJhAj8BwAAwX9IBMQEUgJaCtgPEABYBNoCUgpECsgPCADFfygI6AQ/A+gEAAiSCoIK/gsICEIM/g8ACMx/RAgsCSQJBA08CYAJLAksDVQJRAl8CQAAzn8QAEgCZwbkCUgAAgGSCP4HAACSCP4PAADSf0AAKACkD+QKxAr8CoAKrAqkCoQPfAAAANR/KAkqB/gBqwABAjAJAgj+BxABggj+BwAA2H+oCKgGvgG4B8QIgAhMCvwLCAhACvwPAALgfwACKgKuAq4C6gImD7ADZAKqAqoCLgIAAul/AAj8D+wH6g/qB/gOsgH+B5gB/g8AAAAA8H/8AqwCrg+sAvwCAAJYCvQPQgAUCvgHEAD5fwAJqAfsAQ4HbAkECZAL/AkACFQK/AkABPt/QADUD7IFvge6BZMHAAGSCP4HuAH+DwAA/H8AAAIL7gfuB+ID7gPgA+oD6gfiBw4LAAAAgAAE8AM+AOADMAIIAKQHnAeIB6QHvAcAAAGAAAAgASgBqACoB34JKAk4CagIqAgkBiAAA4AAAJAAlADUAlQBfgFUCVQJXAlUBxIAEAAFgAABIAGoAKgPqAr8CqgKuAqoCqgPJAAAAAyABAD0DxQAFAD0DxwAFAD0DxQAFAj0BwQADYCCCLoIigqKC7oGjgSKBLoGigWKBLoIgggQgAAAAAD0D/wD9AP0DwAA0AEQCP4HEAAAABWARAZUAf4P1AHUAgAIiAb+AYgA/g+IAAAAF4AAAFQGVAH+D1QBAAAkAfwHkgiSCJIIgAYYgAAAVAZUAf4PVAFUAQAEJAfkBCQEJAckCBmAAABEBlQB/g9UAQAA/AdECHwIRAj8CAAGM4AAAAQEBAT8A5QClAKUApQC/A8EAgQCAAA2gAQC/ANUAlQC/A8AAPwPBAAkAlwChAEAADiAIAQgBOwHqgWoBaAFsAWoBaYF6A8oBCAEO4ACAv4DUgJSAv4PAgDwDwAI/w8gCCAIAAA9gAIC/gNSAv4PAgEYDAgD/wDoBwgIGAgABj+AAgL+A1ICUgL+DwIJeAQAA/4AAANwBAgIQoAAAMQI/Aa8ArwBvAg8CLwFvAa8BqQJJAhGgAIC/gNSAlIC/g8CAEgAVAFTAkQNyABQAEqAAgT+A1IC/g8CAPgJBgXxA/wPBAD8AwAAS4BkBGQE1Af0BewF5gXcBfYF9gXkD2QEVARMgAIC/gNSAlIC/g8CAXgMRANEAEQBfAYACFSAAgL+A1ICUgL+DwIBSAxKA/gATANKBEAIVoAAAEQI/AjcCtwK/A+ACrwKpAqkCjwIAABYgAEC/wNJAkkC/w9BAPwBagF/BWoFfgNAAFqAAAAkCbwJvAW8BLwCpA/AAnQCVAUsBSQIXoAAAP4PKgBqBP4HwAX+BeoPagAqCP4HAABqgAIC/gNSAv4PAgB4A0sGyAhICE4BeAcAAG+AAQL/ASkB/wcAAN8JEgWwA4cHHAHSARAAcIACAv4DUgL+DwAE/AKEBpYIpAqEAPwGAABygEAA9gS2B7cHtgeiB4gH9gfSB/4P2AQABHSABAT8B1QC/A8kAFQDdA7eCHQIVAF0BwAId4AAAv4DUgL+DyQA7AemAugJIAT+A6ANLgR9gIQA/AusD/wPBAD0AtQM/AjWCvQI1AL0AIOAAAAIDKwDLACsAywA/g+sASwAvA8IAAAAhIBACU4JVAXUA1IFAAisAqwC/g+sArwCCAKFgAgMqgOqA6oPKgH/DyoBqg+qA74PCAAAAIaAgAT+BqoFqgSiBggArAKsAv4PrAK8AggCh4AgAJ4ElgbWB9YHzQfgD+wH1gecB6QEJACJgAAA+A8IAEgCSAK4AR4BKAFICggI+AcAAIuAAAz+A5IAkgj+BwAAEA/+ABAIEAjwBwAAjIAADP4Dkgj+BwAA/g8CAAIA/gcACAAGAACWgAAAAgD2D1ABUAFeAVAJUAlQCfYHAgAAAJiAAAz+AxIBogj+BwAAUACQCRAI/gcQAAAAmoAADP4DkgCSCP4HAAAgBCAE/gcgBCAEIASbgAAM/gOSAJII/g8AAAQEBAT8BwQEBAQABJ2AAAz+A5IAkgj+BwAARABEAPwPRABEAEAAoIAADP4Dkgj+BwAAoglyBCoD5ggiDOADAAChgAAM/gOSAJIM/gMACOAEXgVCAkIF3gRACKKAAAz+A5IAkgj+DwAAaASoBT4CKAXoBCgIpIAADP4DkgCSCP4HAABIDEgD/gBIA0gESAilgAAM/gOSCJII/gcAAP4HQgh+CEII/ggABqmAAADEBzwArAfsAewB7AHsBewF/AMEAAAAqoAADP4DkgiSCP4HAAgIB/gASghICMgHCACugAAM/gOSCP4PAAToAyoAKgDoBwgICAYAAK+AAAAQAPAPvAKwArACvgK0CrQK9AcQAAAAsoACAAoA6g+uAqoCqwKqAqoKrgrqBwoAEgC0gIAAqAByAOwP7AL8AuQC7ArsCuIHIAAAALqAAAz+A5II/g8AAOQDJAAkAPYPJAAkAuQBvoAAAB4AgA+AA7wDgAOsA7QLtAusByQAQAC/gAAI/geSAP4PAAD4AYgAiAD+D4gAiAD4AcCAAAz+A5II/gcAAEAI/g9ABNAETAFCBkAIwYAADP4Dkgj+BwAA6AwIAv4JCAj4BwAA4AHDgAAAfADUD9QD1AP8A9QD1AvUC9QHfAAAAMaAAAz+A5IAkgz+AwAI/AkkCSQJJAn8CQAIzIAgABQA1A/UAt4CwALAAt4K5ArmBxAAAADOgAAM/gOSCP4HAACwB6wEogSoBLAHIAAAANaAAAz+A5IIkgj+ByABJgH8DyABLAEiAQAA2oAADP4DkgiSCP4HAABECPwLJAhECIQIAADcgAAM/gOSCJII/gcAAJ4IkAj+D5AIkAgQCN6AAAz+A5II/gcgAPgHrgioCOgJCAn4CAAG4YAIAMgHSAJ/AkgCyAMACP4HkgCSCP4HAADngAAM/gOSCP4PAAgIB/4ACAT6B4oIaggoBO+AAAz+A5II/g8AAKgAuAOoCqwKiAqYBqgA8IAADP4Dkgj+BwAA7ASsBv4BrAKsBLwJAAjzgAAM/gOSCP4HAADID7YIpAi8CMQPgAAAAPaAAAz8AyQJ/A8AAGgJCAUOAqgFKATICAAA+IAACP4HkgD+D4gDRwLEAjQKxAsECPwHAAD9gAgA7A+qAqoKqAruDwAAngckCSQJoggQBgKBAAz+A5IIkgj+BxwAqA+oCqQKpAqkDxAABYFQADQAnA/cA9QDtAOGA7QLnAscB1AAMAAGgQAM/gOSCP4HIAD4DxYA1AdUCFwK0AkQBAeBAAz+A5II/gcADMQDnAgGB6QHpACcDwAACIEADP4Dkgj+DwAM/AMEAOQPEgDyAUoGQAgJgQAM/gOSCP4HAAQoA+oICgj6D8IAIAMQBAqBAABQAFQA1A/gAt4C0ALUCvQHVABQAAAAD4EADP4Dkgj+DwAE+AMICEoI7A9ICEgIAAAQgQAM/gOSCP4HAABEDEwDNgA0AEwPRAAAABGBAAj+B5IAkg7+AeAHCAXuBKgECAToDwAAE4EADP4Dkgj+BwAAiAjoDxwE6gRIAVgOAAAWgQAM/gOSCP4HAAA0AXQJdAn+B3QBVAEUARqBAAj+B5IA/g8AA/4CSANABAAA/A8EAPwDK4EADP4Dkgn+BwgA9AySA5AAkg/8CBAIAAQvgQAM/gOSCP4HAADoD6gCqAL8D6gCrgroBzGBAAz+A5II/gcAAHgESgfMAMwPSgh5CAAGM4EADP4Dkgj+BwAA7g8ABEEFzgQABO4PAAA4gQAM/AMkCfwPIASQBSgEpgQoBxAHoAQAAD6BAAz+A5II/gcAAPwB1AFUAX4HVAFUAXwBSoEADP4Dkgj+BwAAFADeB1QFVAVeBdQHAABLgQAM/gOSCP4PAAD0DwQA5gxUA5QFdAgACEyBAAj+B5IA/g8AAOgDuALsB6gK+AsoCAAEUIHADzwApA+kALQGhAWmBZQF1Aj0CJQPBABUgQAM/gOSCP4HAACkCJQIhg+UCKQILAgAAFWBAAz+A5II/geAAEwItAdGAPQHFAj0CQAEZYEADP4Dkgj+BwAB/gjqCqoKqg+qCr4KgAhmgQAM/wPJAP8HAADvDyAEtwQoBSIE7QcAAG6BAAz+A5II/gcABHwDVABUB/wIVAhUAXwHcIEADP4Dkgj+B5IAqgf+BqoEvgOqBLoIAABzgQAI/geyAP4PgAD8D6AExA/4BwQA/AMAAHiBAAz+AxII/gcAAP4G6gHqBOoD/gjABwAAeYEADP4Dkgj+BwAAfAXuBewC7AX8BAAEAAB6gQAM/gOSCP4HAAC8AqwJLAjuDywDvAQABHuBAAz+A5II/geAAXgOeAD4BQgI/gMIDAoGfoEACP4HkgH+D4AB6gS4Bq4GqApqC6kGgAB/gQAM/gOSCP4PAAjuBwAI/AtUCNQJ/AoACICBAAz+A5II/gcAAFQO1AFUCVYJVAlUBwAAioEADP4Dkgj+BwAAeAV4BXgBfAl4D3wBeAGPgQAAZAA8D/wHvAe+B7wHvA/8DwwPZAAAAJiBAAz+A5II/gckAdQF/AHUD/wB1AX0BQAAmoEADPgDCAD4CPgH/gP8B/wH/A3cDxgAAACbgQAM/gMCCP4HEADKBagFrgeoBcoFGgUAAJyBAAz+A5II/gcAAHQFdgf0AXYDdAV0BQAJnYEADP4Dkgj+B4AAVAVMAj4PTAJMBVQEAACggQAM/gO2CP4HAABUCqIKvgpABVQFAgI+AKiBAAj+B5IA/g9AALQGvgR0BQAATAwiAwABs4EACP4HkgD+DwAAVA9WC/wLVAvWC1QPAAG9gQAM/gOiCP4HEAD4B5YItA+cD7QP0A/AAMCB8AAOAPoPugP6A74DgAP2C9ILPgdYAEAAwoFAADwA/A/cA9wD/AOwA7wL9gu8BzQAEADJgQAM/gOiCP4HAADwB7gF9wBVDKQC6AwAAMqBAAz+A5II/gfgAN4G+gH6B+oH1gHwAgAE04EADP4Dkgj+D+QH/g90B/QFHgD8BJwHWAzjgQAA/geSBJIEkgSSBJ4HkgSSBPIEAgQAAOWBAAD8B6QEpAS8B+QEAAyAA3wAgAEABgAI6IEAAPwPlAScB5QEcAuYBKYHVA/UBPQPBADqgQAAAAD8DyQJJAknCSQJJAkkCfwPAAAAAO2BAAAACXwFXAVcA14BXAFcA1wFfAUACQAE84EECKQItAisCKQIpA+kCKQIlAikCAQIAAD0gQAAvASkBJQHlAS0AiAIfgSIA+gCGAQICPqBhAn8DdwP3A3cDd4P3A/cD9wP/A2ECQAA/IEAAPwPRARCBEIEAAREBEQERAREBPwPAAAAggAA1A9UBUQFRAUUBCQFAgViBXoFyg8AAAWCAAAcBfwF/AX6A/AB/AH8BfwF/AX8AwAABoIAAAAJ/AVSBQAFXgF0AVQFAAXUBTwJAAAHggAAAAn8BVQFAAU+AXQBAAVUBdQFPAkAAAiCAAAACfwFBAX8BSwBXAEkAfwFQAX8CQAJCYIAAMAAfAJaAsAC7gfcAsgCXAL8AsAAAAAKggAAJAD0B/QH9gfwBvAG9gf0B/QHlAcAAAyCAAAKAMoPSgRKBH4ESgRJBEkEyQcIAAAADYIQAFAAUAdYBVQF8gVUBVQFWAVQB1AAEAAOghAAUABID0QJUgl6CVIJVAlYCUgPUAAQABKCEABID0QF8wVEBQgHYABqCPIPLgDiAAAAFIIAAJIP/gSSBNAP1AE0CJwPFAA0AlQAUAMXghAASA9WBXwFWAcQAMAPqAL+D6gC6g8AABiCEABYD1QF8gVEDwwA9A9WBVQFdAUcDwAAHIIACbAIUgVWAtIBFgDSA1IC2Q9VAlACAAAeghgJWAn+BtQC/AHUAPwD1AK8B9QCkAIAAB+CQAhABvwBRABMAU4BVQJECEQI/A9AAEAAKoJADPwDRwBVCfwHAADoDygALgDoDwgEAAAsgkAM/ANOAEUN/AMACN4IQgVCBs4FUAgAADCCAABADPgD1Aj4DwAAfg4CAfoHAgj+CAAGMYJADPwD1gBECPwHEADoBycIJQnoCDAGAAA1gkAM/APWAEUI/AcAAOgHigiMCEgIWAgABjaCQAjAB3wAVgn8BwAA+A+IBI4EiAT4DwAAN4JADPwDVwFFDPwDAAhoBFgHzgRoBCgHCAg5gkAM/ANEAFcJ/AcAALgPhgSABI4EsAcgAEeCQAz4A14BSgj4D7QH7AQACCQK/AsiCgACWIJADPwDzwhFCPwHAAC+CKAH/wSgBrwFgAhmgkAP/gBbB/4BAAT/B9UE9wfcBI8HpASkB2+CAAAACPwHVARUBNYEVAFUAlQFfAWACAAAcIIUBCQCxAF8BgAA/g9SCNIIUgFSBn4FAAlygiAAEAD4B5QIlgiUCPQInAiQCPAJAAQAAHOCAAAoASgB/g8oAQgA+AeWCPQInAjwCAAGeoIAAAQAJAQuCiQJpAikCGQILghECAQGAAB+ggQIBAgkBM4EBAMEAgQDzgQkBAQIBAgAAIKCBAAkACQALgDkDyQAJAAkAi4C5AEEAAAAi4KEAJQAlACWCJQIlAj0B5YAlACUAIQAAACNgoQARAA0ALYAJAEkAiQIJAguCCQM5AMAAJKCBABEAMQHTgREBFQEZAREBE4ERAREBAQAl4IECAQJRApmCdQFVAdEAg4DxABEAAQAAACZgoQIpAikBK4EpAL0AaQBpAKuBKQEpAiECJyCggiSCJIIlwSSApIB8geSCJcIkgiSBIIAnYIECEQERAJeBEQMdApECkQJ3ghECEQIBAilgkQARAgkBK4DJAAUABQAJACuDyQARABEAKaCAAgEBvQBVgFUAVQBVAFWAUwBzAMEAAAArIKEAEQIxAiuBKQDhACECKQILgdEAIQABACtggAABAD0B5YIlAjwCJQIlAiWCJQI9AgEBq6CAgDiDyIALwIiAbIAcACiAC8LIgjiDwIAr4IIBIgDCACcBwgIKAhICIgIHAaIAAgHCACxggAABAGEAOQPDgAEAeQHjghECEQIJAgABrOCJAgkBCQGLgHkALQIpAikCK4IpAckACQAt4IACAQIxA8OCAQIBAjwD4QIjgiECAQIAAC4goQApAikCK4PpAykDKQMpAyuDKQGpAiECLmCBAgEBPQDlgCUAJQAkACUD5YAjACMAAAAvYIECJQE1ASWApQClAmUCZQI9geUAJQAhADHggQAFAFUAVYB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5APWD/AL6AvwC9QL9gvkDyQAIAC/hAQAFACUD/YA9Af0BfQF9Af2AJQIlAcEAMSEkACUALQH1gfUB9QH9Af0B9YH1AbUAJAAyYQAADQCFAFWD5QJVAlUCVQJlglUD1QDAAHLhAQARAjUDtYK1A70CtAO1ArWCtQMRAlEANaEAAAEAPQO9gr0CrwAvAa0CpYK9AoECAAE3YQEAAQIZA8OCWQPBAk8Dx4J1AmUDwQIAADmhEABRAX8BP4G/Ab8BvwG/gv8CvwGRAAAAOyEFAhUBMQHDgjkC9QLtAu0C7YLtAs0CkQA7oQACLQE8gMDBPoJWAtaC/4LXwtaC/oLAAIRhQQAdAzUA9YB9ArUCNQJ9gbUBtQI9AiABBOFAAjEC3wLfgv8D3wHfAf+B3wLfAvECQAIF4UEDPQDFAhWBNQBVA1UAVQF1glUAFQOBAAahQQP9ABUDNYB1A/wAQQEpAEmCPQPJAAAACGFJAmkCJQF3gG0CZQJhA/2AdQFtAwUCQAAI4UECXQHRAHuDwQAVAWQBXQJVgk0DxQBAAErhQQIVARUANYB1An0BfQB9gH0A/QF1AMAACyFBASUB/QHlgQEAFQPdABWD1YAdAd0CIQENYXEDzQA9A92BXQHdAXUDX4ElAf0CDQIAAY6hQQAxAcUAMYD1APUA9QD1gdUBhQE9AMAADyFRABUBMQHBgB0AfQH9Ab2BfQG9A70BwAAPYUUANQPxAfuD8QD1A+ECO4EJAPkBSQIAABDhUACSgJKD+sLSgt4D0oLRgvnC1YPQgEAAkmFJAgkBvQAdgF0DXAB9AF0DXYBdAEUDQAASoUEBnQABAauCEQFVABUA0QGLgiECTQIBANphUQIVAwEAo4AhAX0BfAD9AX2A/QJhAcEAG2FAAAkCHQHdgdwD/AHdAJ2D3QHdAckDwQAcoUEAOQB9AHmB/wB7AEEDP4DTADMD0QAAAB0hUIKYgnSCkcFIg0CCPoPqw+qD6oJ+g8CCH6FAABkACwP7gssC3gPLAvsC64LLA9kAAAAhIUkBEwHRAAWAfQB9AP0Af4F9Af0AfQBAAGHhQABNAGEDwYAtA6wALQOhADeCCwH5AUgCJuFAAD0D1QFVgV0BwQAlALeApQP1AKUAoAApoUEDvQBtAi2A/QLtAO0C/QDtge0C/QHBACphQAA+g86AMMN6gMoCKoKrgq/D6oKqgogCKqFBARUAVwJ3gd0AQQM9ANeAFQA1A9UAEAArIWEAJQIRAUGBfQDtA+0AfQDBgVEBZQIlACvhQACdAPUA9YP9A/UD9AP9A/WD1QPdAEAALCFAgiKDf4F2wHeBf4B3gX+Bd8B/gWKBQAAyYW0BLQC9A+2AZQCBADUD/4K3Ar0CtQPAADNhQAA9AT0B/YF9AfwBQQHXAVeBVQHVAQAAM+FAAl0B0QB9A/2A7QG9AYeD/wEFAfUCBAE0IUUBlQGVAPOCiQHBAD0CVQHXgFUD/QJAATVhYoEqgL6D6sDqgECDvoB+wOqA6oJ+g8AAN2FBANcB1wH/gv8C5gLQAc2BxQHdAqEAkQA5IUEDPQDVAn2DwQBdAX0AH4PZAL0BWQJAADlhQAItAXkBQYF9AGwD7QB1AN+A2wFBAUAAOmFIgRqAwIBNwCyD/IKsgqzD6oK6g+iAAAA+4UCACoMSgMLBeIDvgN2D5cPdgO+BeIFAgUHhiQM5AF8Df4BdA3kBAACVAH2D0wBTAYEAAuGRABkC0QI7gVkAnAI9Av2CvQC9Ab0BwAIEYYCCPoHCgRrBWoPagsKC2oLawtqDyoBCgAthgAAAAD+D/8H/gLgB8AC/gP/BT4A/gcAADiGBAD0D/QGfga0BvQLJA7+AH4F/AN0ARQFToYAAAAM8AMQCFAHfgHUAbQHlAi0CLAEEABPhgAAAAz4AwgIKAk+B1wBXAVMCVwNWAMIAFCGAADADzgAiA+oCr4K3ArcCswK3ApICCgAUYYAAAAP8AAQBlAAfgbUCLQKtAiUArAGAABUhgAM+AMICCgJKAs+DWwFbAtMC1wJWAkIAFWGAAz4AwgLqAaoBj4JXAjcC9wI3AtYCggAWoYAAAAP8AAQClAIfg60CLQOlAi0CpAIUABbhgAAgA9wABALUAp+D1QItA6UCrQKMAgAAF6GAAAADPwDBAiUC38HtgO2A7YH5gcsCgAAX4YgAO4EqgSqAyYG8AEYDDgDXwBaB0oEGAJnhgAM+AMYAd4PvA+MCxgI8gCSCJIIkgcAAGuGAAAABPgEiASIBP4HiASIBIgG+AQACAAAcYYABPQFNAU0BfQHNAUsB+wHBAj8AwAMAAZ5hgAA+ASIBP4D+AIABAQEBAT8BwQEBAQABH2GAAAACNwLVAlUCfQHVAVUBVQF3AUACAAIfoYABPgJjgf+B/gGAAgEAPwPJABEAIQAAACAhiAAFAjKDwgEGALwCIgIiAT+B4gEiAX4B4GGAAj4CYgE/gf4DgAIeASCBQwD4AQcCAAIgoYAAPgE/gOOA/gHAAB0AUQBRAl8DMADAACKhgAA+An+B44H+AYACBgI6gwKB4gDeAQICIyGAAD4BIgE/gf4BgAEKAEoAf4PJAEkAQABk4YAAPgEjgf+B/gGAADyCJIIngcAAP4PAACVhogASgjqCVoJTgnqB0oFSgVaB+oHSgxICJyG+AWIBP4HiAT4BBICIgGiCWII/gciAAAAo4YAAPgJiAT+B/gGAAw8AAIOwAkOCHALIAykhiAEIgTSBVYFWgXSB1YFWgVWB9IFIAgAAKqGAAD4CYgE/gf4BgAMJADIAgAC/g8AAQABr4YAAPgJiAT+B4gE+A4ACPwPIgjiDyIIAADAhgAA+A3IBP4D+AoADMgIygj6D8gIyAgACMaGAAT4Bf4HiAT4BgAI/A8kCSQJ/A8ACAAAx4YAAPgE/geIBPAGCADoBwoJjAiICFgIAAbJhgAI+AX+B4gE+AoAAFgARAJTBkQJyAAQAMuGAAASBMoFSgVSBd4HVgVWBVYH1gUSCAAA1IYAAvgCzgP+A0gCMAP+D2IEkgRiBP4PAADZhgAA+Az+B/4H+AYACCQJJAm/DyQJJAkgCNuGAAj4Bf4HiAT4BgAAXgZIAf4PSAFIAgAE5IYAAPgESAT+A3gDIAC4D6YErASwBKAPAADuhgAEFATUBUQFXAXGB0QFXAVEBdQFFAgAAPmGAAj4Bf4HiAT4CgAA5A9kAvQPbALkDwAA/oYABHgE/gN4AwABlAj8B5AMfgKQBVYIAAYAh0AAXAD0BXQFfAX0B3QFfAX0DTQI/AcAAAKHAAj4Cf4Hjgf4ClAASAVuBdQPbAVEBUAECIcACPgF/geIBIgE8A5MCVQF1ANUBVwJQAkShwAA+AX/B/gGAgi+B0II8AsCCv4LIgoACBOH+AWIBP8HiATwBhoP5gUACCQK/gsiCiIKFYcAAPgEjgf+B4gE+AIwDM4DyA9OCHkIAAYXhwAA+AX8B4gEcAKMD1QAVAH0AVQI3A8AABiHAAR8Av8DxAd4DCsC/AEkA/4FAgL+BwAAHIcAABQEpAekBrQGtge0BqwGjAaUBxQIAAAhhwAA+ARIAv4DeAMABtQHXgVUBV4F1AcQADuHAAD4BYgE/gf4CgAA/A88Az4DPAv8BxAAR4cAAPgJ+ASOB/gGAAj8A7QC9Ae0CvwNAARJhwAA+AmOB/4HiAT4BnAAqgL4D6wC+gIAAEyHAAR4Av4DOAOAAP4PkAAkAAgB/g+AAAAATof4CYgE/geIBHgB4AdeBGoFagVqCP4HAABXhwAE+AWOB/4HiAfwCLwK1ArWD9QK/AqACFmHAAj4Bf4HiAR4AsAHvALUB1YB1AdUAdwHYIcAAPgJmAj+B/gKAAD0D1QK1A9UCvQPBABmhwAI+AT+B4gEcAL+D5ICDghgCWIH3ggACHSH+AmIBP4HiAR4AIAHfwKAD/4DEgj+BwAAdocACPgF/gf4BgAAfA1IA/wPaAN8BUgJAACChwAI+AX+B4gGcAT8B1YFPAL4DwQA/AMAAIOHAAj4Bf4HiATwDgQIVAbcAVYJVAlUBwAAjYcEAPwP7ATsAnwJgAd4AIgI/geIBPgGAAiehwAA+ATOA/4DSAIwAX4GqgL+AaoJggcAAJ+HAAT4Av4DyAJ2A34JWgVaBdoBWgV+BQ4JoocAAGIE6AfuBuQG4AfyBugG7gboB3QIAAi6hwAA+AmOB/4HiATwBR4J6g1+DyoBvgsACsCHAAj4Cf4H+AYACJQC9ALuDtQCBANUAgAAxocABPgCSAL+A0gCMAtkCHYH9AF2A3QNAATLhwAE+AX+B4gE+AQAAlwENAl8CTIAWgaQANGHAAj4Bf4H+AYACPQDdAN0A3YP9AMQAgAA8ocAAKALrAqsB6wHPgisA6wKvAesBqAHAAj5h4QEfAQ3Bb4FtgV4B8oHtgWyBboHNggAAPuHAAT8Av8DRAJ+ATsL2g9+A+oHKwdqCwAJDYgACPgF/gfwBnwPPAO8B+ADMAf+AAgDOAQViAAI+AX+B/gCAgA6D0oH3gFaD2oBag9AAB+IAAD4Cf4HiARwAiYPeAt0APoPUAR+AwAMIYgAANQF3AW+B78Ftwk/AJcFrQesBaQFAAAiiAAAqgWeBf4H/gX+Cf8A/gX+B54FqgcgCDuILAAXBN4FQAV2Bf8HfgVwBWQFvwc0CBIAQIgABPgHCAQIBPwHCgQIBPgHCAQIBPgHAARFiAAA+Af8B/oH+AMCABwBIAH+DyABLAEAAEaIAAggCbwEJAS8AKYPfAEkAiQFvAQgCAAATIiIAEgA5A8SAAAAJAAkACQIJAjkDyQAIABNiIgARADzDwgAIgwiAoQBIAgiCOIPIgAAAFOIQABEAPMPCQDIAf8HCADDBRAE8gcSAAAAVIgAAMwA8g8YAIYI9QeUBAAAJAjkDyQAAABXiEAARADyDxkCUALeA1QCVAYABPIHEgAAAFmIAADIAOQPAgBUD3wFdAdkACQAJAjkByAAW4gEAEIA+Q8IAPoD3wLaB/4CAgDyBxIAAABdiAAAJADyDwgAeglaCf4H+gUJBCAA5A8gAGGIAABEAPIPCAn4Ba4D/AOsDfgBAAjkDyAAYogAAIwA4A8cALwHnAeYB7wHvAQAAOQPIABjiIAAiABICMgPKAgaBDwEyACIA0gEKAgACGWIAAAIAYoA6g+YAEgBAAD+DyAAQADAAIAAaIggATQJtAS0B3QEPgT0BDQBtAK0BCAIAABpiAgBiADuD5wAQAkcCOQEFAOEAnQEDAgAAGuICAGIAO4PnABIAQAIiARIBEQCMgIQAQAAbIgIAYgA7g+cAEgBAADQABAJEAj+BxAAAABwiBQBFAV8BVwH3AReBNwEXAFcA3wFFAUQBHeIAAAEAnQCVA5UCfYIVAlUAlQGdAkECQAAgYgAAhAC9AK0DrQJvgS0AbQCtAZ0BRAJAAiEiAQBhQD3D44AZAEADCICogF+AKEDIQQgBIuIkAKIArwKgg6ICcgIjgmYAqoGygrKCqgIjYgAAYwA7A9YAQAA8AcsCSgJ6AsICvgJAASSiAgBiADqD5gAAAj8CSQJJAkkCSQJ/AkACJaICAGIAOoP2AAAAPgPiASIBP8HiASIBPgPnIgAAYoA6g/YAAAESAJIAf4PSAFIAkgEAACriAgBiADKD7gBAAz4A8gISAl+BkgGyAkYCK2IhAKkAqQKlA6MCaYIvAnWAtYG1AXEBbQIsYgAAYgA6g/wACAA/A8CABAH/gCQAxYMAAC0iAgBiADsD5gAAACoALgDrAKoCpgKqAagAMGIAAFUC9QHXgRUAVQDEAz+AhAD0gQUCAAGwojWAtYC3gquDp4JxgSAAZ4CwAbABf4JAAjFiKACrAKQCrwOgAmoBKgBvAKoBqgEqAgAAMaICAGIAO4PnABIAQAELAUgBT4FIAXsDwAAz4gABEQFfA18D3wJ/gl8A3wFfAV8C0QLAAjUiBQA1A90APQHbAVkBWYFzAbUAKQPJAAAANWICAGIAO4PWACIAAABxA+yCIgIsgjED4gB2IiABKwCrAqsDoQJ3gSEAaYCrgasBKQIAADZiAABiADrD9gAgAIqAeoHvgSqBKoEvgcIANyICAEIAc4PuAAAAOgPqAKoAv4PqAKqCuoH3YiQAr4CmAqYDr4JgASoBKgBvgKoBqgEiAjhiAgBiADsD9gAAAB8CVQJVAn8D1QJfAkAAOSIAAGKAOoP2AAADPwDRAC2ApQPlAKUAgAA84gAApwEhQK2DrQJ9gS0AbQCtgaFBJwIAAD4iAgBigDqD9AAgAT8BNQC1A/8D9QB/AKABPmIgAJEAnwBfAf8BP4EfAF8AnwCfAXEBAAA/YgIAr4CnAq+BpwF/ASAAZwCwAbABb4JAAQCiQAAxAD1D2wAAASUBN8HlAQAAP8HIABAAAeJgABIAO4HeAAABT4F/gW8ArwCvAW8BAQEEIkIAYkAyg+4AAABvgeqBKoFqgaqCL4HAAASiSACFAL0AgQOZAl8CT4JfAI8BnwFJAkABCWJAAGIAMwP+AAADvwBdARcATwJ3A8cAQAAKokAAIgB7A/YACAI7AcACPwLVAhUCXwKAAgyiQABlADUB7AAAAT4A+gD7AP4B+gD6AMIAkSJQAXEBfwD7A/8CcYJ/APsBewF/AlECQAAX4kAAIgA7g/cAQAJTAVeAVAPTAFeBVQJEAByiQAFDAV8A34PfAt8CQAJfgP8BfwL4AtACX+JBAD0D5QE1AQ8BBQEFAR8BJQElAT0DwQAgYkAAIIIugiqC/4GqgSqBL4GqgWqBLoIgACGiUQBXAG8D1wA3AjsC/wH/Af8B/wLPAgACIeJAgBeB9YH1g/eB1YHFgz+A7YCtgr+BwIAi4kACAAI/AlUBVQDVAFUAVQHVAn8CQAIAASPiUgISAT8A0gBSAoACPwFVANUD1QJ/AkABJOJAAgMCPwL5AbkBuwC5ALkBuIK+gsCCAAElokIAYgAzg+4AAgJAAj8BVQDVA9UCfwJAASaiQAIOAgKCOwL6AbqAuwC6A7sCwoIOAgABKeJAAg8CPwL/Af8B/wDwAPsB+gL6AsoCAAEqokAAKQErALmD6wCoAj8BVQDVAFUD/wJAASziQAAMAHsB7gH6AeoB/wNVANUAVQH/AkABLqJAAAwCB4I3gvQB9oD2gPYD94LHggwCAAEvYkACD4I7gv+B+4H7gPAA/YH/Av8CzQI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AAAAAPwProsgACQI7A8ABAQCeAiCBQwCgAV4CAQIAAiviyAAJAjkBwgCQAJEAPwPRAAEAPwHAAgABrCLIAAiCOQPCAQAAMQHRAhECEQIRAj8CAAGsosgACII5AcAAogIiAT+A4gAiAD+D4gAgACziyAAJADoDwAEiAKoAKgA/g+oAKgEiAMAALaLEAASBvQBBAWADDoCIgGiCGII/gciACIAuIsgACIA7A8ABLAAjgCIAPgPiACIAIgAAAC5iyAAIgjkBwgCYAD4DwYAgAD+ByAIGAgIBrqLIAAiCOQPCAIgAJAHCAmGCIgIkAggBiAAvIsgACII5AcIBGAAGA6GBWAEBgUYB2AIAAC9iwAAJAjkBwgCAAz8AyQGxAEkAvwHAAgABL6LIAAiCOQHCAIgCqAIXgVCAkIGfgXgCCAIv4sgACIE7AcEAgAICAb4AUoISghICMgHCADAiyAAIgTkBwgCQAlIBEgD/gDIA3gEQAgAAMGLIAAiCOwHCAIACOQPBAgECPwPRAhECAQIxIsAACII7AcEBIACugCCAP4PggCyAIoAAADFiyAAJAjoDwgEAAD8DyQJJAkkCfwPAAgAAMaLIAAiBOwHCAIACHwGRAFEAEQARAF8DgAIyIsgACII7AcIAmACEAAOAPgPKAEoASgBKAHJiyAAIgjkDwgEAAD8DyQAJAHkDyICIgIAAMqLIAAiCOQHCAQAAlAISAkGBcgEUAIQAQAAzYsgACII5AcABgIA6gMqASoB6gkCCP4HAADPiyAAIgTsBwQCIACiD5oEhgSiBKIEngcAANGLIAAkCOgHAAIkAqQCrAKUD7QCrAIkAgAA1YsAACII4gcCBAgASATIBwgC/gAIBwoMCALXiyAAJAjoBwgCoACoAqgCvAioCOgHqACgANqLAAAiDOwDAA74AygAKALICX4EiAfqCAgG3YsAACQI6AcIAiAApA+kCPwIpAikCKIPIADeiwAAIgjsBwAAsg0uA8IE8AkCCv4LIgoCCuGLAAAiAOwPAAD4DxYA1AdUCFwK0AkQCAAE4osgACQI7AcABBAAyAOuAqgK6AsICPgHAADliyAAIgjsDwAEJAG0CKwEZwQkBhQFhAgAAOaLIAAiCOQHAAIIAEoBSgH4D0gBTgEIAQAA54sgACQI6AcAAhgACAEoAe4HqAiICJgEAADriwAAIgjkDwAA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gAT/BJgEmA8YAL+MAAQQBPwF9APsA/AB9AHsA+QD1AUMBAAAwIwAABQIzAvmCvQK7ALgAv4K8gryCx4IAAjDjBAACADcA8QL4AvqA+oD/gvqC+kDKgAAAMSMAAj8DVQFVAH8BUAA+A+sAqgCqAroBwAAx4wQCBII9Av0BuQG9AL2AuwG9Ab0CxQIAADKjAAI/A1UAVQF/AFIAOgJSAR+AogFbAgIBtOMIAAsCOwH/AbsAv4C7AL8AvwG/AcMCAAI24wAABwIzAXuBewF7AHgAfwF7gX8BRwIIADcjAAI/A1UAVQF/AUAAb4C6gmqBKoDvgiAB96MAAAcCMYP9g30DfYF9AX0DfYNxQ8cCAAA4IwACPwFVAVUAfwFIAC0B6QEpgSkBLQHJADijAAIPgj6B/4H+gf6A+AD4gfaB5oHJgggAOOMAAQ6CO4H7gf+B+8D7gP+B+4H7gc+CAIA5IwACPwFVAVUAfwDqAjsBBgH2ga8CbgJEATmjAAI/A1UAfwFAAjUDxQI0AeQBP4DEAwUBuqMIAAcCMwL7Ab6BvgC7gLqBuoG2gsKCAgA7YwABPwHVAFUA/wFAAGkB/4FpAW8BaYHIAD0jAAEeAJYAfwPWAE4AMAL7ArkAvQG7AcACPqMAAD8DVQB/AIICGwF+A9oAfgPbgPoBUAI/IwACPwNVAFUA/wGwA/sAv4C7Av+CuwHIAL9jAAArAh8BPwH/AP+A/wD/AP8B7QEpAQAAAiNAAj8BVQB/AUAAPwP5wrkCvwK5ArnD3wACo0AACgI/g9eDVwFXAV8BV4FXgXsDxwICAgPjQAMggO2CjoHugm7A7oFOgC6B7oPCgQAAB2NAAAACPwJBAQEBAQC9AEEBAQE/AkACAAAHo0ACAAI8AsQCBAEHgLUARQEFAT0BQQIAAAfjSAIEAj4CRQIFgQUAtQBHAQQBPAJAAgAACGNAAAUCNQLVAhUBlwBVARUBFQI1AsUCAAAIo0ACP4JAgT6AwIA/g4AAAgDiAhoCP8HCAAjjRAAFAjcC1wIXARcA14AXARcBNwFFAgAACSNAAAeCMAFQAReAkABZgRaBFoI1gsSACAAJY0ACP4IAgb6Af4MAABwCI4EiAN4BAgIAAAmjQAEfwf5AAEC/wIACP8HIAToACYDIQQAACeNAAAICMQLXghBBkQBTwRUBFQI0gsKCAAAKI0AAPAHDADsCSwELAK8ASoEKgTqBQgIAAApjQAAfA/0AAQC/AAADvwBNAzUAhQD8gQECCqNCAAICNQLVAhSBFoDUgB0BFQE1AUECAgAK40IACgI7AtqCFoESANoAGoEXATEBQgICAAsjQAI/g3yAwIC/gAADCQCIgYqCeIIIQgACC2NAAj8DeQDBAD8DhAAzAEKAcgJCAj4BwAALo0AAPwJBAT0AwQA/A4QAAgEDgQIBAgEOAQvjQAACAj8C2oIagZ+AWoEagRqCP4LCAgAADCNAAAoCLgJuAS4ArgIuAsICP4BCAYOCAgEMY0ACPwIBAb0AfwCAAhQBP4EUAdUCVAJAAQ0jQAI/A30AwQA/AYAAIAP/gSIBIgEiA8AADWNAAAgCPwLdAh0BHQDfgB0BHQE/AUgCAAAN40QAAgI3AtCCEgESANOAFgEagjiCxQAAAA4jQAAAAjcC1IIWwRAA1IATgRiBOIFHggAADmNAAhACN4LdghfBFYDVgBfBFYE1gUWCAAAOo0AABQI1AtOCGQGXAFABFwEVAjUCxwAAAA8jQAE/AL0AQQE/AAABugBCAh+BIgH6ggIBj6NAgg6COoFagR+BGoDagB+AmoE6gU6CAIAP40AAPwN9AMEAPwFwAD4D64CqAKoCugPCABBjQgABAjfBUAEagNqAGoCfgJqBOkFKggAAEKNAAj8BuQBBAT8BAAAyA/WBKQE1ARMD0AAQ40AAPwN5AP8DAAM+AMICEoI6g9ICEgIAABEjRAIEgjUBUAEaAJmA1YATAJUBNQFDAgAAEqNAAD8DeQDBAD8DgAAUANoCOYPaABIBxAES40AAPwN5AP8AAAI1A8UCNQHEAD+AxAMFgZMjQAA/A/0AQQE/AWAANQPfgVUBVgF1A8QAE6NAAj+BfIDAgD+BQAApAlUB/4BFAU0CQAAT40AABwIhgu0CLQEtgK0ALQEtgSFBRwIAABQjQAI/AkEBPQDBAD8DgAAvgDqC6oGqgm+B1SNAAj8B+QBBAT8BQAAqA+kBKYEtASkByAAVo0ACPQElAL+D5QB9AoACPgH1gMcCPQLAAhYjSAELgSeBV4EXgJeA0gAbAJeBJwFJAQkAFqNAAj8DeQD/AAACFoF/A9YAfgPXgX4CUAAW40AAKwIvAj8BbwEvgK8ALwE/AW0BCQJAABejSAALgicC04IfARAA24AXAROBJwFLAgoAGCNAAB+BAID+gACAn4AmAd/BXwFfwX8BwAAYY0AAPwN9AP8DAAA+AcOAOwPzAvIC9APAABijQAM4gO+Cv4H3gw/A/4M3gc+Af4PBgQAAGSNIAKkAaQIJAbkAT4IJAjkDyQApAAgAwACZo2ACSQE5AM+COQHJACACTQEygKIA3gECAhrjYAJJATkAz4I5AekAIAH5AE+COQHJACAA3CNIAgoBKgDKAQoBPwPKAkoCSgJKAkgCAAAdI0QBtQBFAL+A1QEVARQBAAE/gUIBBAEIAR1jRAG1AEUAf4DVARUBAAFzAQwBEwEggUABHaNIAykAyQE/gekCKQIAAgkCPwLJAgkCAAAd40QCNQHFAL+B5QIlAgACOQJJAokCjwKgAmBjRAG1AEUAf4DVARQBAQFUgUiBaQEiAQIBIWNAAjYBxgE/AeYCBAI1AtMCmQKZArcCwAIio0gDKgD/AeoCAAI+AmICAgKfgnICioKAAiLjSAGqAEoAv4DiAQgBBgFVgVUBVwF9AUABJWNIAaoASgC/AOoBQAFXATcBNwF3ATcBAAEmY0gDKgDKAL8B6gIAAj0CzAIvAiQCvQJAAifjQAIpAckAv8HpAgECPQLkAheCZAI9gsACKONFAAUBJ4D9AMQBP4EqgT+BQAE5AUcBQAEqI0QDNQDFAL+B5QIpAjvC14JSgluCN4LAACzjQAAAAg8BKQDJAQkCOQPJAkkCTwJAAgAALSNAAjeBxIE8geeAAAO/AEAAAQA/AAABwAIvo0ACN4HEgTyB54AAAj4DwAI/g9ACEAIAADDjQAI3gfyB5IEngQAACQMIgP+ACIDIgQgCMuNAAieDxII8geeDAAICAf/AEgLSgbKCUgAzI0ABN4HEgTyA14CAAhOBEgD/gBIA0gESAjRjQAE3gcSBPIHngQAAPoHtAj0CgQK/AkABNuNAASeDxIE8geeAAAM+APICX8GSAXYCAgI3Y0ABNwHFAT0A5wCAAD8DxQFFAUUBfQFAATfjQAI3gcSBPIHngAACPwPVAjUAVQGfAUACeGNAASeB/IHkgQOAuAM+AMOCPgHCADoAQAA6I0ABJ4H8gfyB44EIAC4A6gKrAq4CqgGqADqjQAAHgfyB5IEPgz4BxYA1AdUCFwK0AkQBO+NAAjeBxIE8geeBJAAiA/WCKQIvAjED4AA840ACN4H8geeBAAA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dAV0BfwPIASTjwAAfAJGAvQPIAD4D7QC8g+UARgI8AcAAJWPRAB0Ak4C5A9AAhAC9A60Cb4JtAJ0BRAJlo8AAHwBRgH0B0ABFAC0B7QF9gW0BZQHgACZjwAAdAJOAuQPFADuB7QK5A90BIoDeAQACJuPIAAkASwBPAEkAecPJAE0ASQBJAEgAAAAnI8AAEIFXgVWBdYFVgV3D1YF1gVeBQIFAACejwQAkg+SBP4EkgcQAEQBdAHGD3QBRAFAAJ+PAAT8A6QPpAS8BwAAWAFIAc4PaAFIAUAAo48AAEQJVAnHB3QBBAjwBJQC/g+UAvQEAAimjxAIzAfoAUAIEAf+AOAPCABaAcYPaAEAAKiPRABVCcYHdAEACHAG/gEAAFQBxw90AUAAqY9EAFUJxgd0AUAADgjkBwAAVAHHD3QBQACrjwgAWgnsB0ABHATyBIgEAARVAccPdAEAAK2PBADMD1IBegfWANYPAABUAccPdAFEAQAAr48IAFoJ7AdIAUgPawVoBwwAXQHvD0wBAACwjwAAAAz8A0QA1A9UCFQE1AFUAlQFVAlACLGPAACAAn4CIgbqBqoCKgpqCqoG6gJiAwACso8ADPwDbAnsCf4H7AnsBf4H7AXsBfwLQAm5jwAIIgTsAwgEAAgIC8gIPggICggK+AkABLqPQghGBMgHAAQECMQLPAgECgQKBAr8CQAIu49ICFIE1gMEBBAIEAgQCP8LEAgQCBAIAAi8j0IIQgTMBwAIAAqCCWIIPgjACAAJAAoAAL2PAAgkBOgDAAQECAQKBAr0CxQIDAgECAAAvo8gCCIE7AMABAgICAvICD4ISAiICAgLAAjBjyAIJgToAwAEJAgkCCQI/AsiCCIIIggABMKPAAgkBOgDCAQgCCQKJAr8CSQIJAgkCAAAxI8gCCQE6AMABDAECAmsCmgKKAooCggJAADFjyQIJAToBwAEJAgkCPQLJAgECPwJAAqACcePIAgiBOwDAAQICCgIyAgICggK/gkICAgIyI8kCCQE6AcACAQLxAg8CBQIFAoUCvQJBATOjwAIRgzIAwAE/AkECQAI/AsECAQJ/AgAANCPIAgkBOgHAAgQCtQJNAkUCVQJlAkUCgAI0Y9CCEIExAcACAAL/ggSCBII8gsSCBIIAADUjwAIQgTMBwAIAAv+CDIK0goSCdIKMgoCCtiPAAgiBOwDCASACEQIJAj8CwQIJAjECIAI2Y8ACCQE6AcACCgKKAnKCEwIuAgICQgKAADbjyAIIgTsAwAESAhIC/4ISAhICP4LSAhICNyPIAgkBOgHAAgQChQJ9AgUCPQLFAqQCQAA3Y8ABCIE7AMABFQEVARUBP4FVARUBMQFAADejwAIIgTsBwAEFAksCSYJ9AskCSQJBAkAAN+PIAgkBOgDAAQACfwIJAhkCOQIJAk8CgAI5o8ACE4EwAcEBfwEBgj8CwAI/AsECvwLAAjqjwAIJAToBwAI+AtICkgK/gtICkgK+AsAAOuPRAhEBMgHAAQACPgLSApOCkgKSAr4CwAI8I9CCEIEzAcABIgJaAgICP4LCAhqCIoJAAj0j5AI1AS0AwAE/AkECvQKlAr0CgQK/AsAAPePQghGBMgHAAgkC6gIYAj+C2AIqAgkCwAK+Y8ACCQE6AMIBGAICAv6CAwK+AsICOgIAAD9j0IIQgTEAwAE/AlUClYKVQpUClwKwAsACACQQAhCBMwHBAgACv4LKgpqCKoJXgpACgAAAZBCCEIEzAcABEgITgpICfgISglKCkgKAAgCkCAIJgToBwAEFAjUC1QKfApSClIK0gsQCAOQAAhECMgHAAScCEAK/gkACP4JQAqcCoAKBpAACE4MwAMIBOoIjgqICvgJiAiOCOoICAgJkAAIJAjoBwAIIAqsCWgIPgjoCygKKAogCQqQAAgiBOwHAAQiCPoLRggwCv4LAAg4CMAADZAAAJII9AaUBQAI9gsQCF4JEAmUCvILAAgPkAAIJAjoBwAELAgsC9wIXAicCqoKqgkgCBCQAAgiBOwDAAQSBaoIrgpSCuIJUgiKCAAEEpAgBCIE7AMABHQFVwXUBPwFVgRVBdwEAAQUkAAITgTABxAESAlUCFQK8glUCEgJUAkQCBeQAAgkDMgDEAQECHQK1ApUCtQL9AoECgAIGZAAAFQEfALYAwAE+AV4BXwFeAX4BQgEAAQakCAIIgTkAwAE+gmuCK4I+guuCK4K+gkAABuQAAgkBOgHQAguC/QIAAokCvwLJAokCgAAHZAACCYI6AcACEgK/gkICPwLEgjyCxIIAAAekAAA0gi8BpgFAAi8CrQK9Au0CrwKAAoAAB+QQghCBMwHAAh0ClQJ1Aj+C9QIVAl0CgQKIJAACCQI6AcABCAIrAuoCrwKqAqoCyAIAAAikAAIJgTgBwQIlAqSCq8K6guuCqoKCAoQCCOQAggmBOQDAAR8CVwJXAn+C1wJXAl8CQQJLpAACE4IwAcQCJQKVApUCP4LVAl8ChAKAAgxkAAIQgzMAwAE/gkCCOoJegnqCQIK/gkACDKQAAhGCMgHAAQQCP4LqAr8C6oKqAoICgAIOJBCCEQExAcQCHgKVgnWCHQI3AtQCnAKAAE7kCAIJAToAwAEnAhUCnwKVAlcCdQIHAgAADyQJAgoBOgHgAt8BWwN7A9sDWwN/A8ACAAAPpAACCIM4gMIBOgF/Aj8CwsI6ggEDOgPCABCkAAIRgTIAwAEKAluCdgIqArICa4IqAgICUWQQAhEBNgDAAX8CBQI1AnUCdQL9AncCQAIR5AACCQE7AcACP4Lagj+CX4Jagt+DMAPAABKkAAIRgzAAwQF/AgXCuQJDAhGCvQLVAhECEuQAAgiDOQDAAR6CXoJegn6C3oJegl6CQABTZAACCIE7AMABfwI1Au0CPYLtAj0C7wI4AtOkAAIQgjMBwAI4As+COIJegnqCT4I4AsAAE+QAAQiAuwDgALcBTwFvAW8BTwFPAf8BwACU5AgCCQE6AcABAgI+gu+CrgKvgr6CwgIAABUkAAIRgTIAwAE1An0CdQJ3gvUCfQJ1AkQCFWQAAhECMgHAAj8CtwL3AreCtwL/AqICgAIV5AACCIE7AMABO4IagpqCX8IagrqCi4IIARZkJAI9gaQBQAIuA6kDrwO9g+sDqwOpA6ACFyQAADRDLYCEAVCBPoJBgpcCPYLQgjBCgAAXpCQCPMEFAOABH4IAgvyCD4Kfgh1CXUKMAFgkAIIQgjCBwgEfAlcCdwI3gtcCfwJiAoACGOQAghCDMQDEAT8CfwK/Ar+CvwK/AqQCwAIZZAACCQM6AMABEwJfApkCuwLZApiCmoLQABokIAI1ggwBwQG9Al+DVQNRAsQCI4LeAoICmmQAAhGDMgDAAT0CTQI/Al2CfwJNAr0CQAIbZAACBEE9gMABP4Jvgq/Cr4Kvwr+Cx4IAARukAAEJgLoA4ACfAQUBXQEVgZUBXQEFAUAAHKQkAjUBLQHAAb8CQwItAqMCtwLjAq8CgAKdZAACCYI6AcABHwJbgtsCWwJfA3+D3wJBAF3kIAI1AS0AwAF/AjsC/wM7A78D+wMfAkACXiQAQgmBOQDgASuCu4K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SgJABAAAyJEAAJYBUgD+B1UAAAb/ASEA4QAhAz8MAATKkQAAKgOiAP4PowCqAKACrgKSD6oCpgIiAsuRBACsAfwPogCoAD4C+gK+AroHvgL6Ai4CzJEAAAAEvgSqBKoEqgT+B6oEqgS+BAAEAADNkQAAEAT0BfQF9AX8B/QF9AXyBfIFEAQAAM6RAAB8CVQJ/AdUBXwBAAgkCPQPLADkAAAAz5EAACAE/Af8B/wH/Af8B/wH/Af8ByAEIADRkRAAsAiQCZgLlgjxD5IIlAiYCpAIMAgAAN2RUAhYC1QI8gdUBEQFAAAgAP4PIAAgAAAA45FQCFgLVAjyB1QERAUQAM4ICAkIDPgDAADnkUAIWAtUCPIHVAYADP4DAAD8BwAA/g8AABWSUAhYCfYHVARUAQAIRAj8D0QIxA98CEAAHpJQCFgLVAjyB1QEWAUGASUJJAkEBfwDAAA0klAIWAtUCPIHVAUQBEgA1w9SAEwE0AcQAESSUAlcCPIHVAREARAETgRIA/4ASANIBEgIcZJQCFwJ8gdUBAAN+AMIAAgH7gQIBIgHAAh0kkAIXglAC2AJXgnQD1YJZA00CVQJRAgAAICSUAhYC1QI8gdUBwAA/g9KCMoBSgZ+CQAIg5JQCFwJ8gdSBAQNZAQ0AywAJgC0DzQIRAaFklAIXAnyB1IEhAT+DwIA6gMqAcII/gcAAJiSWARUBfIHUgREBRACGAGUD+YEnASEDwAArZJQCFwF8gdUBFQBAAioBP4FqAaqCaoIAAazklAIXAX2B0AFEAD8BJIGkAGSD/QIGAgQBLeSQAhQCVwE8gdEBggN9gcQAF4BEAn2BwAA0pIAAFAIXAXyB1QFAABIBa8Fkg+uBaIFQATqklALWAT2B0gEWAUIAOgPqAL+D6gC6g8AAO2SUAlYBVQE8gdUBAABegzMA0gAzA96CAAG/JIAAFALXAjyB1QH/AsMBKQD5AMMC/wHAAAEk1AIWAn2B1QERAUABNgCVgjUD3QATAVABSKTUAhYBfYHVARUAQAIKAmeBRgHWgcqC6gIJpMoBC4F+QMqBioHgAe+AOsPqgCqBL4DAAArk1AIWAlUBPIHRAcABL4E6gOqBqoJvgcAAC+TWAhUCfIHVAQEBSQA/gdkBWQFfgXkBwAAMpNQCFgJ9gdUBAAFogQqAOoPqgEqAr4CoAQ2k0gLXAjyB1QERAEUAFQP1Ah+CNQDVAVACUqTWAhUCfIHVAQEBfQEtAKUAf4PtAH0AgQES5NQCVgI9gdUBQQA4A8+ALIDqgI+CeAHAAB1k0gIXAnyB8QHMAwuA+AEqgb/C6oKvgoICH6TaAhsCWoE+QdqBwIM/giuCv4Prgr9CgAIjJNIBM4E+QdKBewFrQL+D6wA/A+vAvwEAACWk1AIWAhUCfIHVAQACfQLsAq+ArAC9gsACK6TQAhQC1wI8gfUBQAA/AvsCu4C7Ar8CwAK4ZNQCFgIVgnxB1IECg3qCG4HawFuD+oJCAQYlFAIXAXyB1QFAADyC3oLcwvzD3ILfgvyCzWUMAhaCvwHHAd0ALQHvgdUDP4FEAfWCAAGUZRQCFwJ8gcEB34Aqg/uCboPAAlOD0gJSA9wlAgIXAnyB0QFCADoD8QHkgL0D4QCaA8AAH2UUAhcBfIHVA0ACBgI3gXcA9wL3gusCygAiJSYAIYI9Q+UBIQEIAAgACAA/g8gACAAIACJlAAAmACGCPUPlASUBAAABAgECPwHBAAEAJOUAACYAIYI9A+UBKACHABKAIgJCAj4BwAAmZSYAIYA9Q+UBJQEAADyAIIA/giSCJIHAgCdlJgAhgj1D5QEAAToAQgBCAH+BwgJCAnoDZ6UmACGCPUPlASEDIAIOAgABP4DgAEIADAAn5SYAIYI9Q+UBAQE8AGQAJAA/g+QAJAA8AGglLgAhgjlD6QEBADwDxACkAF+AJAJ8A8AAKKUmACGAPUPlAQAAP4PAgIyAfoBAgj+BwAApZS4AIYI5Q+kBKQAAAz8AyQBJAkkCfwPAACmlAAAmACGCPQPlASEDDAIDgboAQgDOAQICKeUmACECPYHlASEAhAATgJICUgJCAz4AwAAqZSYAIYA9Q+UBAQEEAHuAQgJyAsICPgHAACulJgAhgj0D5QEhAwACEIO/glCCEIO/gkACLGUmACGCPUHlAQAAsgISAT+BEgHKgmqCQAEs5SAAKwI6geoBIACEAD8D5AEkASQBPwPEAC7lJgAhgT1B5QElAIEAIAPgAT+BJAEkA8AAL6UmACGCPUPlAQABP4BkgCSAP4PkgCSAP4BwZSYAIYI9Q+UBBQEwADODMgC/gFIAkgEQAjDlJgAhgj1D5QEhAQQAEgBVgJEDcgAEAAAAMWUmACGCPUHlASUAgAAvg+CBIIE/gTADwAA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AAT+AtAI3gfQAPYCAASblgAA/w8ZAO8AbAa3AK4EoAenALgCrgIiAJyWAAD+DwIAOgHGABAC9AL8AvYP/AL0AhACoJYAAP4PMgDOCQQEbAFkDWwJZAtyCeoBAAyjlgAA/g8yAM4AAAnuBZgDvwCYA+oPqAIAAKeWAAD+DzIAzAhABLYHgASqCfgMyAvOCCgJqJYAAP4PMgDMCOIHFATUC+wI7gl8DewPBAiqlgAA/g86AcYIUAS4AvQAEwj0BrgE6AwIALGWAAD+DwIB/gDADfYB8gf6C/IN+QH1DaAItpYQBFQFVAVUAlQK/gdUAVQCVAO8BJAEAAC7lhAIEAl4CXwJeAd4BXwFeAV4B3gJSAgACL6WAAAUBqQB5AAcAyAA/g+oBPoHqASoBAAAwJYAAFAAWADED+AK3grwCvAPxArECtgKEADBlgAG/gFCAPoHAgAiAPoHUgX6B1IFUgUAAMSWCAzoAx4IyAcIBCAD/AeqBKgE/AeqBKgExZYkBrwBZAj8ByQA8A+uBKgE/geqBKgEAADGlggICAV8BV4DXAPcD34BXQNcBVwFRAkAAceWAAAEDvwBrADsD+wK7ArsD+wK7Ar8CgQIzJYAAPAPAAT+BwAE/gcwAv4PqAT6B6gECATPlhAAuASmBLQE7A8gAPgPrgSoBPoHqAQIBNGWJAC0BI4ChA+8AkAEMAD+B0gF/AdKBUgF1ZaAD3wANAe0AjQJ/AcwAPwPqgT0B6gECATWlgAA7gSqBPoDrgLgBjAA/g+oBPoHqASoBNmWAAAICL8EvAS+BbwGiAK+ArwFvgW8BCQE3JYgAKQGlADGD7QCAAD+D6gEqgT6B6gEqATelgQIfAl8BaoDUg04AfwPqgSoBP4HqAQIBOKWgA/0ANQD1gLECPQHIAD+DygF/AcqBQAE45YAAPQJ1gX0A9YF9AUgAP4PqAT8B6oEqATolgQA9A8UAFQBFAD8DxQAVAFUChQI9A8EAOqWGADKCsoKygqKCr4KigrKCsoKyg8YAAAA75YACJgIygjqCcoGngTKBIoG2gnKCJgIAAjwlgAKGAmaBboFCgM+ARoJOgmKBxgBAAIAAPKWAAEMBWUFZQdFBV8FRQVlB2UHBQ0cCQAA85YcDMYDdgh2CX4HRgF2CXYJdglGCVwHAAD2loAAmACaAboFSgXeBcoFWg26C4oBmACAAPeWGADKD8oKygqKCr4PigrKCsoKyg8YAAAA+ZaAAJgA+gf6CuoK/grKCvoLegrKCRgEAAD7lgAAGADaB/oCygLeB9oK+grKCxgIAAYAAP6WAAFYC1wLXAvMBtwC3AJ8C0wLXAcAAAAAAJcAAFgAWg96AUoP3gFaD3oBSglYB0AAAAAElwAAHgAOCK4HhgHeBYYG1gLeCoYHHgAAAAaXAAhMCeYFdgsmCD4NRg32D3YNZg0MDQAAB5cYDNoDegn6B8oF3gXKB/oF+gXKB1gLAAkJlwAADAFmBeYG5gbGB94Gxg7mDuYHTAUAAAqXAAg4CYoLqgmKD74Jig+qD6oJCgs4CwAIDZcAAQwBpg+2C4YL3g+GC7YLpguMCAAAAAAOlxgCWgtKC2oLyg9uD0oPWgf6B0oLWgsYCBOXAAAOAA4I1guuCq4GBgKuBr4K5gsOCAAEFpcAAJgEigK6D4oCPgCKBroBug+KApgEAAQclwAAmAS6AroPugI+AL4H+gX6BfoFyAcAAB6XGADKD/oF+gXKBd4MCgj6C/oFygXYCwAIJ5cAAAAMTAPmD/YBRgMeCsYGdgPmC0wHAAEylxgIyg16CXoPygueAooOegv6CkoPWAIAADiXAABMB+YH9g/GB14DBgz2A/YC5grMBwAAOZcABuwBdQdtBW0FBQcvAuUCpQ+tAu0CoABClwAO7AFlBP0E/QZ1BOcHZQb9BvUG9QQgAEiXAAgMCeYL/gtGCa4PpgnmDU4LtgjkCAAAUpcQABQA/A+8ArwCvgK8ArwKvAr8BxQAEABWlwgC6AIOAugBAAD8D7wCvgK8CrwK/A8UAFmXEADcD9wC3grcDxAAWAlWCfQHXAHwAUAAXJcQCNwH3ALeCtwHAACIAqQK6geiAuoDgABelwABKAEoASgB/g8AAAAA/g8oASgBKAEAAWCXAAQIB3wHXgdcD1wAXgBcD1wHfAcIBwAEYZcADvwBBAQ0B3QHVA8GADQPdAc0B1QHAABilwAA8g8SBPIHXgVSBfIHEgQSBPIPAgAAAGmXAAAEAuQCvgK0AvQPtAK0Ar4C5AIEAgAAdJcEAu4C/A+uAuQCAAIwAP4PAAD+BxAICAZ2lwQA7gKsAvwPrgJAAP4HQgh+CEII/ggABouXAADkAq4C/A/uAgQKIAgkCb8PJAkkCQAAjZcEAO4CrAP+DuQCAABICcYJdAZEBegEQAiRlwQC7gL8D64CZAjgBwQIkAt+CNAIEAsAAJiXBAD+ArQC9A++AkAI9AcQAF4BEAn0BwAAoJcEAv4C9A+0Au4C/AaKA+gP6AGICvgHAACtlwQC7gL8D24A/g98CawH/ASsCPwIBAgAANOX/AKsAq4PrAb8BgAE7AeuBawPrAXsBQgE5pcAAJIAkgCSAJIA/w+SAJIAkgSSBIADAADnl6gAqAD8D6gAqAIAAXQMhAN8CAQI/AcAAOmXAAD0AtQC3g/UAvQCAACoAP4PqACoBIgD7ZcAAFAFUAVQBf4HAAQABP4HqASoBKgEAADzlxAAFADUB1QFVAVWBVQFVAVcBdQHFAAQAPWXIADoB2YFdAXkByAAEAEuBagICAj4BwAA9pcQANwHVgVcBdQHBACwB44EogSiBJ4HAAD7lxAA3AdVBVoF1AcEAPgPVANUA1QD/A8ACP+XlAC+ANUH4Af+B+4HzgfAB94HxgeaAAAAAZgACAQI/AusBqwGrAKsAqwGrAb8CwQIAAACmAQIBAj8DwQAAAj8C6wKrAKsBqwG/AsAAAWYBAEEAfwBBAEECPwHrAasAqwGrAb8CwAIBpgACPwHAAD4AwAA/g8AAPwHrAasAqwK/AsImEgIyAQkBBADBAj8C6wKrAKsAqwK/AsACBCYJAgkCPQPPADkCAAI/AusAqwCrAr8CwAAEZgAABQH9AAUAvQDAAj8B6wGrAKsAvwLAAgTmOgAiAD8D4gE6AIACPQHtAa8ArQK9AsAABeYAA74ASgMvAKoA1gI/AusCqwCrAb8BwAIGJgAAFgA1AdSAMQJDAT8B6wCrAKsBvwPAAAtmAAAfAhMBUwEfAcADPwJrAqsAqwG/AcACDuYEADeBRAEfwIUAZAA/g1WA1YDVgH+BQAEPJgAAHgGWAH8D1gBOAr8CawGrAKsBvwHAAhGmAAEvASsAvwPrAKcCPgJrAqsAqwG/AcACEyYQAxcA1wE3AdcCQAM/A1cCVwJXAn8DQAMTZggAawPtAVWBaQHDAD8B6wGrAKsCvwLAABPmAAM7AM8CK4JLAUkAvwLrAqsAqwG/AcACFSYAAzkAywIpgosBSQA/AusCqwCrAr8CwAIWJgAD/wAfAasAKwP/AEACPwHrAasAvwLAAhbmAQK/AvcCt4C/AsAAPwHrAasAqwG/AsAAF6YAACsBJgC3gGcAogI/AusBqwCrAL8BwAIZ5gADvoBKg+qB9oHgAcCCPoLrgaqAvoHAgxvmAAB/A3aARoJ+gO8AwAJ/AesBqwC/AsACHWYAAAECPQLFAgUBBQC3AEUBBQI9AsECAAAdpgAAAQIBAj8BwQAAAj6CQoE7gMKCPoJAAB3mAAAAAD8AxACEAEACPQFFATcAxQE9AkECHmYBAEEAfwBhAAACPoFCgQKA+4ACgIKBPoFepgADPwDAAD4AwAA/g8AAPwIDAbsAQwC/Ax7mAAESAQmApABAgj6BAoC7gEKAAoC+gQCCH2YAAASBvIBEgDyBwAC+ggKBu4BCgD6DgAAfpj8DwIA+gcKBPoCAAj6BAoG7gEKAPoOAAB/mAAA9ACEAP8PhARgAvoICgbuAQoA+g4ACIGYMAwMAuIJIAjvBxAA+gkKBO4DCgj6CQAAgpgwBAwD4gIAAt4HAAD6DAoC7gEKAPoNAASEmCIAKgjqBzYA4gAACPoECgbuAQoA+g4AAIWYAAjwB5AAngD0AQAI/AkMBOwDDAj8CQAIhpgQAFABTAJqDdAAAAj0BBQG3AEUAPQOAAiHmAAO/AEkDD4D5AYMAPAEFAbcARQA9A4ACIiYAACiCJIIige2BAAM+gkKBO4DCgj6CwAAiphIBFgESAP+AHgDSAjgBBQC3AEUAvQEAACRmCAAuAsgCPwFKAMgCPQJFATcAxQE9AkAAJOYAAAsCKwHvACqBwAE8ggSBt4BEgTyCQAAlpgABM8C1AHUD7IBAAryCBoG1gESBPIFAAiXmAAE/ATUAvwP1AH8AOAJFATcAxQI9AkAAJiYQAxcA1wE3AdcCQAM9AwUC9wIFAr0DAQMnJgACPIHGgGzBKoCEgj6BAoC7gEKAPoOAACdmKwAFAZeBXQFlA4cAPQJFAbcARQA9A0ABKCYBAr8C+wK7gL8CwAA9AkUBNwDFAj0CwAApJgACPwL/Av+C8wLPAPwCAoE7gMKCPoJAAComAAAAA78AQQE7AUsBfwHLAXEDPwHAAgABLGYAA7+AUIE+gNCAv4AAAPYBFYJUAncDQAAxJgEAPQN/AH8B6QP/gdmBPYD+gP6BwQIAATGmEAGygFqAGcG6wFiDP8DYQT9A2EH/wEABs6YAAAADv4BAgQaAqIB4gAaBwIA/gcACAAG0pgoBMoEDgLsAwAK/AcEAvQBBAL8BwAMAADYmHQN1AH8CdQH/APUASQN/AMUBuQB/AcADNuYUAhSBvoBQgBCAPoPQgBCAM4DFAUqCUgF3pgAAAQABAAEAAQABAAEAPwAIAdQCIgIiAbfmAAAEAAQCPgPtAiyCbQCtAb4CZAIEAgAAO+YCATkB9IE0gT0BgAO/gFiDKIFIgPiBAAI8pgIBPQHsgSyBPQGIAAcDIoD+AAIAzgECAj8mBAE/AeyBLIE9AYAAOwDLAHsCQQI/AcAAP2YCAAIBPwHugS6AvQGAAD4A5YE9AQEBPwE/pgQBPwHsgS6BPIGNAToASYA/A8kAOQDAAAFmQQA8g9aCVoF8gkAAIoM+gOIAP8PiQAAAAqZgACUAFwI/g/cCdwJ3AfcBf4NXAiUCAAAEJkQAJAAqAjuD9wLgAO2B9YHlgWuCKIAAAATmQQI8gdxBnUDIQSJBP8DWAAfAvgD2wYQABiZCAjsD1oJVgX0DQQAlAKUCPMHlACEAogEKJkQBPgHtASyBOwGHAD0D5QFlgWUBfwHAABSmQAA8A++BLIE9A5AAGoNegNvASoP+g0oBWWZMAAMCOoPCAQ4AAAO/AEEAAQA/A8ACAAGbZkwAAwIygcYAAAO/AE0DNQCFAPyBBIIAABumXAADAjqDwgEOAIACDAEDgPoAAgDKAQYCHCZIAAUAMoPGAIAAOgDJwAkAPwPJAAkAuQBcZlgABQAyg8YBEAA8AcsCSgJ6AsICvgJAARymTAADAjKBxgCCADiAyoBKgHqCQII/gcAAHWZcAAMCOoPCAQwAAQE/AeUBJQElAL8DwQCdpkgABQIygcYAggIoASuA7gApA/UCJQIAAR6mTAACgjlBwQCCApgCBQEhQOGAwQEdAhABHyZIAAUCMoPCAS4AoEI+geIAIgA/A+LAIAAf5kgABAAzg8YBIAClAj8DxAE/gKQBVYIAAaAmSAAHADKDwgEGACQBpgAlAjyD5QAmAKQBIGZIAAUCMoHGAIACFQJxAVsAkQDwgRaCEAAhZkgABQEygcIAjgA0A9IBQYFRARcBcQPAACGmSAAFATKBxACBAD8B/QHVQVWBWQFDAcAAIuZMAAMCMoHGAKQALgCbgQ8BWwJrAq4AIAAjZkgABQEygcYAwAIdAV2BXQD9AF2A3QFAAiPmTAAjg8oBBgEQAA+D7AK5A+cCoQKvA8AAJKZEAAcAOoHCAFgBN4F/gbeAv4G3gX+BAAAlpkAAAQA9A9XBVQFXAVUBVQFVwX0DwQAAACZmZAAVABUD7QKlAq8CpQKsgrSCtIPUACQAKiZAAC8ArwC/g78D/QP+A72DvIP/g7YAgACrJkACAAM/AFUAVQFVAH8DVQBVAtUCQAHAACzmQAG/gCqB/4CqgoAB/wHEAj+CRAI+AgABsGZAAb+AKoC/gmqC6oHAADWDAgDDgXRBBAIxZkABv4AqgP+C6oOgA3+AyIA4gAiAz4MAADGmQAG/gCqBv4CqgsAB/4PAgSiBXIEigUABdCZAA7+AKoG/g6qCaoHAACKCPoPjAiICAAI0pkABv4Aqgf+AoIKEAfMASoB6AkICPgHAADVmQAAFAjMBeYB5AXsAeAD/gHyA/IFHgMAANuZAAN/ANUDfwNVBcEDHAwkA/8CJAQ8BAAI3ZkABv4Aqgf+A6oPAAAYAPgHjgiICFgIQAb/mQAG/gCqBP4Bqg8AADwHigS4Bq4JIAgAAA6aAAb+AKoD/guKByAApAe0Aq4LNAjUByAAEpoABv4Aqgf+A4oPQACiCWYJ+g9aCeYNIAgTmgAG/gCqA/4GqgoKB+gIJgXyAyQH6AkICBmaAAb+A6oB/gmAD/wH7APsB+oDagX6BwAAMJoADP4Dkgj+B0QA9gXcC9YL3Af2C1QGQAA3mgAO/gCqAv4LqgcAAPQJagnSD2oP5g8gCEWaAAb+BqoB/gmCBwAA/AdUCuwLnAnECwAAVZoABn4H/gKqCQIHqA/6A94F2gf5AKkPAABXmgAG/geqAf4NggNwCLgG9gBUDLgC0AwAAFqaEAg6DP4D+gP6C9oDyAvsA9YLrAssBiQAX5oADv4Aqgf+DgAHfga6AP4PbAAUAywEAABsmgAAAAIEAnQCRAJEAkQCRAp8CEAHwAAAAG6aAAJ6AkIJQgj+BwAAEAyQA34AkAEQBhAIb5oAAnoCQglyCM4HAAD+DwAA/gcAAP4PAABwmgACegJCCkII/gcAAPwHEAj+CQgI+AgABnGaAAB6AkIKQgn+B/gPBAgUC+QIlAkECgAAc5oAAnQCRAlECPwHAABUDIgCiANUBBIIAAB0mgAAegJCCkII/gcAAPgPSABKAEgA+AAAAHaaAAJ0AkQIRAz8AzAISAVIAv4FSAR4CAAAeZoAAnoKQgl6CMYHEADOAykB6AkICPgHAAB7mgAA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" + } +} diff --git a/libs/fonts/pxt.json b/libs/fonts/pxt.json new file mode 100644 index 000000000..96ca515f7 --- /dev/null +++ b/libs/fonts/pxt.json @@ -0,0 +1,15 @@ +{ + "name": "fonts", + "description": "Fonts for displays (V2 only).", + "files": [ + "font12.jres" + ], + "public": true, + "disablesVariants": [ + "mbdal" + ], + "searchOnly": true, + "dependencies": { + "core": "file:../core" + } +} \ No newline at end of file diff --git a/libs/funk/targetoverrides.ts b/libs/funk/targetoverrides.ts index 5303f0be8..aec31a4b3 100644 --- a/libs/funk/targetoverrides.ts +++ b/libs/funk/targetoverrides.ts @@ -108,7 +108,7 @@ namespace radio { } /** - * Returns the serial number of the sender micro:bit from the last packet taken + * Returns the serial number of the sender Calliope mini from the last packet taken * from the radio queue (via ``receiveNumber``, ``receiveString``, etc) or 0 if * that packet did not send a serial number. */ @@ -138,7 +138,7 @@ namespace radio { } /** - * Returns the system time of the sender micro:bit at the moment when it sent the + * Returns the system time of the sender Calliope mini at the moment when it sent the * last packet taken from the radio queue (via ``receiveNumber``, * ``receiveString``, etc). */ diff --git a/libs/servo/targetoverrides.ts b/libs/servo/targetoverrides.ts index 3a05732f7..57d5eb1fe 100644 --- a/libs/servo/targetoverrides.ts +++ b/libs/servo/targetoverrides.ts @@ -1,6 +1,43 @@ namespace servos { - //% block="servo P0" fixedInstance whenUsed - export const P0 = new servos.PinServo(pins.P0); - //% block="servo P3" fixedInstance whenUsed - export const P3 = new servos.PinServo(pins.P3); -} \ No newline at end of file + + //% block="servo P0" fixedInstance whenUsed + export const P0 = new servos.PinServo(pins.P0); + //% block="servo P1" fixedInstance whenUsed + export const P1 = new servos.PinServo(pins.P1); + //% block="servo P2" fixedInstance whenUsed + export const P2 = new servos.PinServo(pins.P2); + //% block="servo P3" fixedInstance whenUsed + export const P3 = new servos.PinServo(pins.P3); + + //% block="servo C4" fixedInstance whenUsed + export const C4 = new servos.PinServo(pins.C4); + //% block="servo C5" fixedInstance whenUsed + export const C5 = new servos.PinServo(pins.C5); + //% block="servo C6" fixedInstance whenUsed + export const C6 = new servos.PinServo(pins.C6); + //% block="servo C7" fixedInstance whenUsed + export const C7 = new servos.PinServo(pins.C7); + //% block="servo C8" fixedInstance whenUsed + export const C8 = new servos.PinServo(pins.C8); + //% block="servo C9" fixedInstance whenUsed + export const C9 = new servos.PinServo(pins.C9); + //% block="servo C10" fixedInstance whenUsed + export const C10 = new servos.PinServo(pins.C10); + //% block="servo C11" fixedInstance whenUsed + export const C11 = new servos.PinServo(pins.C11); + //% block="servo C12" fixedInstance whenUsed + export const C12 = new servos.PinServo(pins.C12); + //% block="servo C13" fixedInstance whenUsed + export const C13 = new servos.PinServo(pins.C13); + //% block="servo C14" fixedInstance whenUsed + export const C14 = new servos.PinServo(pins.C14); + //% block="servo C15" fixedInstance whenUsed + export const C15 = new servos.PinServo(pins.C15); + //% block="servo C16" fixedInstance whenUsed + export const C16 = new servos.PinServo(pins.C16); + //% block="servo C17" fixedInstance whenUsed + export const C17 = new servos.PinServo(pins.C17); + //% block="servo C18" fixedInstance whenUsed + export const C18 = new servos.PinServo(pins.C18); +} + diff --git a/package-lock.json b/package-lock.json index bd51c4057..998331068 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "pxt-calliopemini", - "version": "6.0.41", + "version": "7.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "pxt-calliopemini", - "version": "6.0.41", + "version": "7.0.0", "license": "MIT", "dependencies": { - "pxt-common-packages": "11.0.1", - "pxt-core": "9.0.18" + "pxt-common-packages": "12.0.3", + "pxt-core": "10.2.11" }, "devDependencies": { "@types/dom-mediacapture-record": "^1.0.16", @@ -23,29 +23,40 @@ "react": "16.8.3", "react-dom": "16.11.0", "semantic-ui-less": "2.4.1", - "typescript": "4.2.3" + "typescript": "4.8.3" + } + }, + "node_modules/@blockly/field-colour": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@blockly/field-colour/-/field-colour-5.0.5.tgz", + "integrity": "sha512-qfSAVmGuv56aQyCt16NQpyn8/+KiAns4MJwb/aLIIJ0K1fcVqQL0lIKV5UFUjfra0yUAh/i/dSAOTZaHxyQs0g==", + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "blockly": "^11.0.0" } }, "node_modules/@blockly/keyboard-navigation": { - "version": "0.1.18", - "resolved": "https://registry.npmjs.org/@blockly/keyboard-navigation/-/keyboard-navigation-0.1.18.tgz", - "integrity": "sha512-0IfCjbQE+KRPsNXGSQxllTY+YzQkhBZ/J0RrWkrkp3nVCnRQPWUrbfx0WSKsunxiDaByzTS1X4EF1MZvuDun1A==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@blockly/keyboard-navigation/-/keyboard-navigation-0.6.5.tgz", + "integrity": "sha512-KnH9YZLUdp7Y4zHpjLnVXWF/4iR8hO5YK4FoQC3TK/IBFSZea8XeADiKRA8U4KsmdXzN6kGdpnu8YVG5loQwpw==", "engines": { "node": ">=8.17.0" }, "peerDependencies": { - "blockly": "5.20210325.0 - 6" + "blockly": "^11.0.0" } }, "node_modules/@blockly/plugin-workspace-search": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@blockly/plugin-workspace-search/-/plugin-workspace-search-4.0.10.tgz", - "integrity": "sha512-OYvJG9qsYfvicNiAiaxJ4Bn+ixIUnjbXeo+9MaeHt5+9bKwsp2hHp2IeecIpxBDJPtTBn3PG2JPOmRkib7bkoA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@blockly/plugin-workspace-search/-/plugin-workspace-search-9.1.0.tgz", + "integrity": "sha512-cono6n0tRD3L5DJxJ224IBwiCrfjKEERlyFiPBYVttuEcaw50teHoVSAnFwf1Mj2EaW96sUAh7rP8eqZIXxAdA==", "engines": { "node": ">=8.17.0" }, "peerDependencies": { - "blockly": "^6.20210701.0" + "blockly": "^11.0.0" } }, "node_modules/@crowdin/crowdin-api-client": { @@ -187,6 +198,14 @@ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "engines": { + "node": ">= 10" + } + }, "node_modules/@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -200,6 +219,11 @@ "@types/node": "*" } }, + "node_modules/@types/diff-match-patch": { + "version": "1.0.36", + "resolved": "https://registry.npmjs.org/@types/diff-match-patch/-/diff-match-patch-1.0.36.tgz", + "integrity": "sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==" + }, "node_modules/@types/dom-mediacapture-record": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-record/-/dom-mediacapture-record-1.0.16.tgz", @@ -256,6 +280,11 @@ "@types/node": "*" } }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" + }, "node_modules/@zip.js/zip.js": { "version": "2.4.20", "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.4.20.tgz", @@ -265,7 +294,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "peer": true + "deprecated": "Use your platform's native atob() and btoa() methods instead" }, "node_modules/accepts": { "version": "1.3.8", @@ -290,37 +319,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "peer": true, - "dependencies": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals/node_modules/acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "peer": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/acorn-node": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", @@ -379,11 +377,34 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/alphanum-sort": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -423,29 +444,22 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==", - "peer": true - }, "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dependencies": { "safer-buffer": "~2.1.0" } }, "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" + "minimalistic-assert": "^1.0.0" } }, "node_modules/asn1.js/node_modules/bn.js": { @@ -454,25 +468,33 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", + "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" + "object.assign": "^4.1.4", + "util": "^0.10.4" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" } }, "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", "dependencies": { - "inherits": "2.0.1" + "inherits": "2.0.3" } }, "node_modules/assertion-error": { @@ -488,10 +510,32 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.1.tgz", + "integrity": "sha512-u5w79Rd7SU4JaIlA/zFqG+gOiuq25q5VLyZ8E+ijJeILuTxVzZgp2CaGw/UTw6pXYN9XMO9yiqj/nEHmhTG5CA==" }, "node_modules/axios": { "version": "1.6.8", @@ -574,7 +618,7 @@ "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dependencies": { "tweetnacl": "^0.14.3" } @@ -611,12 +655,14 @@ } }, "node_modules/blockly": { - "version": "6.20210701.0", - "resolved": "https://registry.npmjs.org/blockly/-/blockly-6.20210701.0.tgz", - "integrity": "sha512-cNrwFOAxXE5Pbs1FJAyLTlSRzpNW/C+0gPT2rGQDOJVVKcyF3vhFC1StgnxvQNsv//ueuksKWIXxDuSWh1VI4w==", - "peer": true, + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/blockly/-/blockly-11.1.1.tgz", + "integrity": "sha512-PmInYM9zH1HcYMffqnfmeu2O3g0intsowy08S0KDu3q8/95TfGo1tcDYpeWNQDkPOEzN1yy3oocsRO4NPDHtKA==", "dependencies": { - "jsdom": "15.2.1" + "jsdom": "23.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/bn.js": { @@ -690,73 +736,62 @@ "browser-pack": "bin/cmd.js" } }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "peer": true - }, "node_modules/browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", "dependencies": { - "resolve": "1.1.7" + "resolve": "^1.17.0" } }, - "node_modules/browser-resolve/node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==" - }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "node_modules/browserify": { - "version": "16.2.3", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", - "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", + "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", "dependencies": { "assert": "^1.4.0", "browser-pack": "^6.0.1", - "browser-resolve": "^1.11.0", + "browser-resolve": "^2.0.0", "browserify-zlib": "~0.2.0", - "buffer": "^5.0.2", + "buffer": "~5.2.1", "cached-path-relative": "^1.0.0", "concat-stream": "^1.6.0", "console-browserify": "^1.1.0", "constants-browserify": "~1.0.0", "crypto-browserify": "^3.0.0", "defined": "^1.0.0", - "deps-sort": "^2.0.0", + "deps-sort": "^2.0.1", "domain-browser": "^1.2.0", "duplexer2": "~0.1.2", - "events": "^2.0.0", + "events": "^3.0.0", "glob": "^7.1.0", "has": "^1.0.0", "htmlescape": "^1.1.0", "https-browserify": "^1.0.0", "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", + "insert-module-globals": "^7.2.1", "JSONStream": "^1.0.3", "labeled-stream-splicer": "^2.0.0", - "mkdirp": "^0.5.0", - "module-deps": "^6.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.2.3", "os-browserify": "~0.3.0", "parents": "^1.0.1", - "path-browserify": "~0.0.0", + "path-browserify": "^1.0.0", "process": "~0.11.0", "punycode": "^1.3.2", "querystring-es3": "~0.2.0", "read-only-stream": "^2.0.0", "readable-stream": "^2.0.2", "resolve": "^1.1.4", - "shasum": "^1.0.0", + "shasum-object": "^1.0.0", "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^2.0.0", + "stream-browserify": "^3.0.0", + "stream-http": "^3.0.0", "string_decoder": "^1.1.1", "subarg": "^1.0.0", "syntax-error": "^1.1.1", @@ -764,7 +799,7 @@ "timers-browserify": "^1.0.1", "tty-browserify": "0.0.1", "url": "~0.11.0", - "util": "~0.10.1", + "util": "~0.12.0", "vm-browserify": "^1.0.0", "xtend": "^4.0.0" }, @@ -819,32 +854,23 @@ } }, "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", + "elliptic": "^6.5.5", + "hash-base": "~3.0", "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" }, "engines": { - "node": ">= 6" + "node": ">= 0.12" } }, "node_modules/browserify-zlib": { @@ -855,6 +881,15 @@ "pako": "~1.0.5" } }, + "node_modules/browserify/node_modules/buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, "node_modules/browserslist": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", @@ -942,12 +977,18 @@ "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==" }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -983,6 +1024,17 @@ "node": ">=4" } }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -1011,7 +1063,7 @@ "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "node_modules/chai": { "version": "3.5.0", @@ -1170,11 +1222,6 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1251,9 +1298,9 @@ } }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cors": { "version": "2.8.5", @@ -1592,30 +1639,17 @@ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "peer": true - }, "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "peer": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", + "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", "dependencies": { - "cssom": "~0.3.6" + "rrweb-cssom": "^0.6.0" }, "engines": { - "node": ">=8" + "node": ">=14" } }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "peer": true - }, "node_modules/csstype": { "version": "2.6.17", "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.17.tgz", @@ -1635,7 +1669,7 @@ "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dependencies": { "assert-plus": "^1.0.0" }, @@ -1643,14 +1677,6 @@ "node": ">=0.10" } }, - "node_modules/dashdash/node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } - }, "node_modules/dashjs": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/dashjs/-/dashjs-4.6.0.tgz", @@ -1673,20 +1699,16 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==" }, - "node_modules/dashjs/node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" - }, "node_modules/data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "peer": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dependencies": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/date-format": { @@ -1705,6 +1727,22 @@ "ms": "2.0.0" } }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, "node_modules/deep-eql": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", @@ -1724,12 +1762,6 @@ "node": "*" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "peer": true - }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -1738,15 +1770,36 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dependencies": { - "object-keys": "^1.0.12" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/defined": { @@ -1788,9 +1841,9 @@ } }, "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -1823,13 +1876,18 @@ "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=" }, "node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "engines": { "node": ">=0.3.1" } }, + "node_modules/diff-match-patch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==" + }, "node_modules/diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -1891,12 +1949,15 @@ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" }, "node_modules/domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "peer": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", "dependencies": { - "webidl-conversions": "^4.0.2" + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/domhandler": { @@ -1960,7 +2021,7 @@ "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -1977,9 +2038,9 @@ "integrity": "sha512-w16Dtd2zl7VZ4N4Db+FIa7n36sgPGCKjrKvUUmp5ialsikvcQLjcJR9RWnlYNxIyEHLdHaoIZEqKsPxU9MdyBg==" }, "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", + "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -2156,6 +2217,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -2198,28 +2278,6 @@ "node": ">=0.8.0" } }, - "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "peer": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -2232,35 +2290,17 @@ "node": ">=4" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "node_modules/events": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "engines": { - "node": ">=0.4.x" + "node": ">=0.8.x" } }, "node_modules/evp_bytestokey": { @@ -2320,7 +2360,7 @@ "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "engines": [ "node >=0.6.0" ] @@ -2335,12 +2375,6 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "peer": true - }, "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", @@ -2436,6 +2470,14 @@ "node": ">= 0.6.x" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "bin": { + "flat": "cli.js" + } + }, "node_modules/flatted": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", @@ -2460,10 +2502,18 @@ } } }, - "node_modules/forever-agent": { - "version": "0.6.1", + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "engines": { "node": "*" } @@ -2518,9 +2568,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/get-assigned-identifiers": { "version": "1.2.0", @@ -2536,13 +2589,18 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2580,19 +2638,11 @@ "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dependencies": { "assert-plus": "^1.0.0" } }, - "node_modules/getpass/node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } - }, "node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -2623,19 +2673,51 @@ "node": ">= 6" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, "node_modules/growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "engines": { "node": ">=4.x" } }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -2663,10 +2745,21 @@ "node": ">=4" } }, - "node_modules/has-symbols": { + "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { "node": ">= 0.4" }, @@ -2674,13 +2767,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dependencies": { - "has-symbols": "^1.0.2" - }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" }, @@ -2688,30 +2778,30 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "has-symbols": "^1.0.3" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" }, "engines": { - "node": ">= 6" + "node": ">=4" } }, "node_modules/hash.js": { @@ -2723,10 +2813,21 @@ "minimalistic-assert": "^1.0.1" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "bin": { "he": "bin/he" } @@ -2757,12 +2858,14 @@ "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" }, "node_modules/html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "peer": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dependencies": { - "whatwg-encoding": "^1.0.1" + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" } }, "node_modules/html-entities": { @@ -2871,6 +2974,64 @@ "node": ">=8.0.0" } }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -3001,9 +3162,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.3.tgz", + "integrity": "sha512-1aVsPEsJWMJq/pdMU61CDlm1URcW702MTB4w9/zUjMus6H/Py8o7g68Pr9D4I6QluWGt/KdmswuRhaA05xVR1w==", "dependencies": { "source-map": "~0.5.3" } @@ -3049,15 +3210,6 @@ "node": ">= 0.4" } }, - "node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/is-absolute-url": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", @@ -3088,6 +3240,21 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -3160,11 +3327,14 @@ } }, "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3217,6 +3387,20 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -3269,6 +3453,14 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -3277,6 +3469,11 @@ "node": ">=0.10.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -3333,10 +3530,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "node_modules/is-weakref": { "version": "1.0.1", @@ -3378,7 +3589,7 @@ "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "node_modules/jquery": { "version": "3.6.4", @@ -3406,46 +3617,40 @@ "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, "node_modules/jsdom": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", - "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", - "peer": true, - "dependencies": { - "abab": "^2.0.0", - "acorn": "^7.1.0", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.4.1", - "cssstyle": "^2.0.0", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.2.0", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=8" + "version": "23.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-23.0.0.tgz", + "integrity": "sha512-cbL/UCtohJguhFC7c2/hgW6BeZCNvP7URQGnx9tSJRYKCdnfbfWOrtuLTMfiB2VxKsx5wPHVsh/J0aBy9lIIhQ==", + "dependencies": { + "cssstyle": "^3.0.0", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.7", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.3", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.14.2", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "canvas": "^2.5.0" + "canvas": "^3.0.0" }, "peerDependenciesMeta": { "canvas": { @@ -3453,15 +3658,59 @@ } } }, + "node_modules/jsdom/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsdom/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsdom/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -3479,7 +3728,7 @@ "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/jsonfile": { "version": "4.0.0", @@ -3521,25 +3770,17 @@ } }, "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "engines": [ - "node >=0.6.0" - ], + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" - } - }, - "node_modules/jsprim/node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + }, "engines": { - "node": ">=0.8" + "node": ">=0.6.0" } }, "node_modules/karma": { @@ -3688,19 +3929,6 @@ "node": ">=4" } }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "peer": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/lie": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", @@ -3738,35 +3966,104 @@ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==" }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "peer": true - }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, - "node_modules/log4js": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", - "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "node_modules/log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.5" + "chalk": "^4.0.0" }, "engines": { - "node": ">=8.0" + "node": ">=10" } }, - "node_modules/log4js/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/log4js/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" @@ -3945,42 +4242,125 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "node_modules/mocha": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.1.0.tgz", - "integrity": "sha512-d6RWgYPILd+AoWVOxiD0UwUqRicnE1inTxMr40CXOgqYve1MvnKntoLAtLIcxjEeVjEoYYTe5QAq3mUc6/ySjQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" }, "bin": { "_mocha": "bin/_mocha", "mocha": "bin/mocha" }, "engines": { - "node": ">= 4.0.0" + "node": ">= 10.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/mocha/node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" } }, "node_modules/mocha/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dependencies": { - "ms": "2.0.0" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mocha/node_modules/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3991,42 +4371,144 @@ }, "engines": { "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/mocha/node_modules/has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/mocha/node_modules/minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } }, - "node_modules/mocha/node_modules/mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dependencies": { - "minimist": "0.0.8" + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mocha/node_modules/nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", "bin": { - "mkdirp": "bin/cmd.js" + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/mocha/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/mocha/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mocha/node_modules/supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { - "has-flag": "^2.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "engines": { + "node": ">=10" } }, "node_modules/module-deps": { @@ -4057,14 +4539,6 @@ "node": ">= 0.8.0" } }, - "node_modules/module-deps/node_modules/browser-resolve": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", - "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", - "dependencies": { - "resolve": "^1.17.0" - } - }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -4161,10 +4635,17 @@ } }, "node_modules/nwsapi": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.3.tgz", - "integrity": "sha512-jscxIO4/VKScHlbmFBdV1Z6LXnLO+ZR4VMtypudUdfwtKxUN3TQcNFIHLwKtrUbDyHN4/GycY9+oRGZ2XMXYPw==", - "peer": true + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", + "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } }, "node_modules/object-assign": { "version": "4.1.1", @@ -4175,9 +4656,12 @@ } }, "node_modules/object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4191,13 +4675,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -4258,23 +4742,6 @@ "wrappy": "1" } }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "peer": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -4327,15 +4794,19 @@ } }, "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" } }, "node_modules/parse-json": { @@ -4356,10 +4827,26 @@ "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" }, "node_modules/parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", - "peer": true + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, "node_modules/parseurl": { "version": "1.3.3", @@ -4370,9 +4857,9 @@ } }, "node_modules/path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, "node_modules/path-exists": { "version": "4.0.0", @@ -4423,8 +4910,13 @@ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, - "node_modules/picocolors": { - "version": "0.2.1", + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picocolors": { + "version": "0.2.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" }, @@ -4459,12 +4951,6 @@ "node": ">=8" } }, - "node_modules/pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "peer": true - }, "node_modules/pngjs": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", @@ -4473,6 +4959,14 @@ "node": ">=4.0.0" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "6.0.21", "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", @@ -5397,15 +5891,6 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "peer": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -5466,9 +5951,9 @@ "optional": true }, "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "node_modules/public-encrypt": { "version": "4.0.3", @@ -5500,7 +5985,7 @@ "node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, "node_modules/puppeteer": { "version": "13.0.1", @@ -5582,28 +6067,274 @@ } }, "node_modules/pxt-common-packages": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/pxt-common-packages/-/pxt-common-packages-11.0.1.tgz", - "integrity": "sha512-0kmA0AFWG+1k36gAC92FAhJJXWFiAHC4mRJcuKfyn4SdrAZRTAfJZMs5zVLhpQ8ZQTAm/oNgqp/xnn40mWOKPg==", + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/pxt-common-packages/-/pxt-common-packages-12.0.3.tgz", + "integrity": "sha512-8rJBsYo9B1ZawCtTln4bLLbsKjdxF0XSFocaTBTQ2Vm8GO28RiPBK5/sfOVzPOpdVAD8VgKnI4LRCfecOwDMlA==", "dependencies": { - "pxt-core": "8.6.32" + "pxt-core": "10.2.3" + } + }, + "node_modules/pxt-common-packages/node_modules/@blockly/keyboard-navigation": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@blockly/keyboard-navigation/-/keyboard-navigation-0.5.4.tgz", + "integrity": "sha512-kq2PR3JyY/LGbrEplLd/8Uz4HfNFMk9OUTnW5GAge2oDMJ92ZsjMQxFb/3ANABm7pbdq1RtMkCgQ986zZ2iJoQ==", + "engines": { + "node": ">=8.17.0" + }, + "peerDependencies": { + "blockly": "^10.2.0" + } + }, + "node_modules/pxt-common-packages/node_modules/@blockly/plugin-workspace-search": { + "version": "8.0.9", + "resolved": "https://registry.npmjs.org/@blockly/plugin-workspace-search/-/plugin-workspace-search-8.0.9.tgz", + "integrity": "sha512-Y4sWasQfKvZU1fZoM2dhn02XatuAjHtBj2xSojhBEgK/DENA4jhJz7IFowLnwAfbWHda57DqPnZoCpAod8FHoA==", + "engines": { + "node": ">=8.17.0" + }, + "peerDependencies": { + "blockly": "^10.0.0" + } + }, + "node_modules/pxt-common-packages/node_modules/blockly": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/blockly/-/blockly-10.4.1.tgz", + "integrity": "sha512-FcAnMU4/uJkOiY3p3OISDfko8iXFlEIF52L2l1EclShkLuC+igW670Q2I+RXhjIyWRA9Lv08BCQLWuGXlsAlKw==", + "dependencies": { + "jsdom": "22.1.0" + } + }, + "node_modules/pxt-common-packages/node_modules/browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dependencies": { + "resolve": "1.1.7" + } + }, + "node_modules/pxt-common-packages/node_modules/browserify": { + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", + "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", + "dependencies": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "^5.0.2", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp": "^0.5.0", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^2.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "browserify": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pxt-common-packages/node_modules/data-urls": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", + "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/pxt-common-packages/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/pxt-common-packages/node_modules/events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/pxt-common-packages/node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/pxt-common-packages/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pxt-common-packages/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pxt-common-packages/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pxt-common-packages/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/pxt-common-packages/node_modules/jsdom": { + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz", + "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", + "dependencies": { + "abab": "^2.0.6", + "cssstyle": "^3.0.0", + "data-urls": "^4.0.0", + "decimal.js": "^10.4.3", + "domexception": "^4.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.4", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.1", + "ws": "^8.13.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } } }, + "node_modules/pxt-common-packages/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/pxt-common-packages/node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, "node_modules/pxt-common-packages/node_modules/pxt-core": { - "version": "8.6.32", - "resolved": "https://registry.npmjs.org/pxt-core/-/pxt-core-8.6.32.tgz", - "integrity": "sha512-92pHZWodEX+k7ut6PH7k5X3sRDJ2ySBL6VYzesYWDmrTQPGYvVfR5VfrrWY45Ov0daImYyCCbqKHXSs0stiSYA==", + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/pxt-core/-/pxt-core-10.2.3.tgz", + "integrity": "sha512-rg5V8YTvyhA6dt2KXVo6LT5Rp4+tdKscqf+fjrKOQxzmYb2fUVNNbc/YYg0K651HRq5iCupT05E00DBTpDrO+A==", + "hasInstallScript": true, "dependencies": { - "@blockly/keyboard-navigation": "^0.1.18", - "@blockly/plugin-workspace-search": "^4.0.10", + "@blockly/keyboard-navigation": "0.5.4", + "@blockly/plugin-workspace-search": "8.0.9", + "@crowdin/crowdin-api-client": "^1.33.0", "@fortawesome/fontawesome-free": "^5.15.4", "@microsoft/applicationinsights-web": "^2.8.11", "@microsoft/immersive-reader-sdk": "1.1.0", + "@types/diff-match-patch": "^1.0.32", "@zip.js/zip.js": "2.4.20", + "adm-zip": "^0.5.12", + "axios": "^1.6.8", + "blockly": "10.4.1", "browserify": "16.2.3", "chai": "^3.5.0", "cssnano": "4.1.10", "dashjs": "^4.4.0", + "diff-match-patch": "^1.0.5", "dompurify": "2.0.17", "faye-websocket": "0.11.1", "karma": "6.3.10", @@ -5613,7 +6344,7 @@ "less": "3.13.1", "lzma": "2.3.2", "marked": "0.3.19", - "mocha": "5.1.0", + "mocha": "8.4.0", "pngjs": "3.4.0", "postcss": "6.0.21", "promise.prototype.finally": "^3.1.2", @@ -5630,24 +6361,132 @@ "npm": ">=8.0.0" } }, + "node_modules/pxt-common-packages/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==" + }, + "node_modules/pxt-common-packages/node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/pxt-common-packages/node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/pxt-common-packages/node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/pxt-common-packages/node_modules/tr46/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pxt-common-packages/node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/pxt-common-packages/node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/pxt-common-packages/node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/pxt-common-packages/node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/pxt-common-packages/node_modules/whatwg-url": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", + "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/pxt-common-packages/node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "engines": { + "node": ">=12" + } + }, "node_modules/pxt-core": { - "version": "9.0.18", - "resolved": "https://registry.npmjs.org/pxt-core/-/pxt-core-9.0.18.tgz", - "integrity": "sha512-2ZwHMT9AQrc/sO8dG2ZQzq19Te8KVcUdI4IY+FYvy2AWfD+3E2KY/fwlK3t8RQijjynQ2OC4Ur9I8zARnR45WA==", + "version": "10.2.11", + "resolved": "https://registry.npmjs.org/pxt-core/-/pxt-core-10.2.11.tgz", + "integrity": "sha512-7+spA8AXN0zGAz3xqmjuwH+Xm4qzwxV6EetfwIRbFhq7z9F7DgfByhgGPNBSMYI2Fz3OEQZgIqhTNUc6WdsogQ==", + "hasInstallScript": true, "dependencies": { - "@blockly/keyboard-navigation": "^0.1.18", - "@blockly/plugin-workspace-search": "^4.0.10", + "@blockly/field-colour": "5.0.5", + "@blockly/keyboard-navigation": "0.6.5", + "@blockly/plugin-workspace-search": "9.1.0", "@crowdin/crowdin-api-client": "^1.33.0", "@fortawesome/fontawesome-free": "^5.15.4", "@microsoft/applicationinsights-web": "^2.8.11", "@microsoft/immersive-reader-sdk": "1.1.0", + "@types/diff-match-patch": "^1.0.32", "@zip.js/zip.js": "2.4.20", "adm-zip": "^0.5.12", "axios": "^1.6.8", - "browserify": "16.2.3", + "blockly": "11.1.1", + "browserify": "17.0.0", "chai": "^3.5.0", "cssnano": "4.1.10", "dashjs": "^4.4.0", + "diff-match-patch": "^1.0.5", "dompurify": "2.0.17", "faye-websocket": "0.11.1", "karma": "6.3.10", @@ -5657,7 +6496,7 @@ "less": "3.13.1", "lzma": "2.3.2", "marked": "0.3.19", - "mocha": "5.1.0", + "mocha": "8.4.0", "pngjs": "3.4.0", "postcss": "6.0.21", "promise.prototype.finally": "^3.1.2", @@ -5699,15 +6538,6 @@ "node": ">=0.6" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", @@ -5716,6 +6546,11 @@ "node": ">=0.4.x" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -5841,127 +6676,41 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "peer": true, - "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", - "peer": true, - "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-native/node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/request-promise-native/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "peer": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/request/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/request/node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "picomatch": "^2.2.1" + }, "engines": { - "node": ">=0.8" + "node": ">=8.10.0" } }, - "node_modules/request/node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "node_modules/request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, "engines": { - "node": "*" + "node": ">= 4" } }, "node_modules/request/node_modules/form-data": { @@ -5977,58 +6726,10 @@ "node": ">= 0.12" } }, - "node_modules/request/node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "engines": { - "node": ">=4" - } - }, - "node_modules/request/node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/request/node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/request/node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/request/node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, "node_modules/request/node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "engines": { "node": ">=0.6" } @@ -6059,11 +6760,11 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -6117,6 +6818,11 @@ "inherits": "^2.0.1" } }, + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==" + }, "node_modules/rtlcss": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.2.1.tgz", @@ -6215,15 +6921,14 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", - "peer": true, + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dependencies": { - "xmlchars": "^2.1.1" + "xmlchars": "^2.2.0" }, "engines": { - "node": ">=8" + "node": ">=v12.22.7" } }, "node_modules/scheduler": { @@ -6253,6 +6958,30 @@ "semver": "bin/semver" } }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", @@ -6296,13 +7025,17 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6469,9 +7202,9 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -6492,14 +7225,6 @@ "node": ">=0.10.0" } }, - "node_modules/sshpk/node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } - }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -6513,22 +7238,26 @@ "node": ">= 0.6" } }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", - "peer": true, - "engines": { - "node": ">=0.10.0" + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" } }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/stream-combiner2": { @@ -6541,15 +7270,27 @@ } }, "node_modules/stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", "dependencies": { "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/stream-splicer": { @@ -6761,8 +7502,7 @@ "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "peer": true + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "node_modules/syntax-error": { "version": "1.4.0", @@ -6920,42 +7660,50 @@ } }, "node_modules/tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "peer": true, + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dependencies": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { "node": ">=6" } }, "node_modules/tough-cookie/node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "peer": true, + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "peer": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", "dependencies": { - "punycode": "^2.1.0" + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" } }, "node_modules/tr46/node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "peer": true, + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } @@ -6973,7 +7721,7 @@ "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -6984,19 +7732,7 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "peer": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "node_modules/type-detect": { "version": "1.0.0", @@ -7024,9 +7760,9 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typescript": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", - "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -7140,33 +7876,58 @@ } }, "node_modules/uri-js/node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } }, "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dependencies": { - "inherits": "2.0.3" + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, "node_modules/util-deprecate": { @@ -7188,11 +7949,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -7230,7 +7986,7 @@ "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "engines": [ "node >=0.6.0" ], @@ -7240,13 +7996,10 @@ "extsprintf": "^1.2.0" } }, - "node_modules/verror/node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "node_modules/vm-browserify": { "version": "1.1.2", @@ -7261,32 +8014,24 @@ "node": ">=0.10.0" } }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "peer": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, "node_modules/w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", - "peer": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dependencies": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "peer": true + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } }, "node_modules/websocket-driver": { "version": "0.7.4", @@ -7310,29 +8055,45 @@ } }, "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "peer": true, + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dependencies": { - "iconv-lite": "0.4.24" + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "peer": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "engines": { + "node": ">=18" + } }, "node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "peer": true, + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/which": { @@ -7361,15 +8122,76 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "peer": true, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dependencies": { + "ansi-regex": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, + "node_modules/workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==" + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -7422,16 +8244,15 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "peer": true, + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -7443,16 +8264,17 @@ } }, "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "peer": true + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "engines": { + "node": ">=18" + } }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "peer": true + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "node_modules/xtend": { "version": "4.0.2", @@ -7495,6 +8317,20 @@ "node": ">=10" } }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -7503,19 +8339,36 @@ "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } }, "dependencies": { + "@blockly/field-colour": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@blockly/field-colour/-/field-colour-5.0.5.tgz", + "integrity": "sha512-qfSAVmGuv56aQyCt16NQpyn8/+KiAns4MJwb/aLIIJ0K1fcVqQL0lIKV5UFUjfra0yUAh/i/dSAOTZaHxyQs0g==", + "requires": {} + }, "@blockly/keyboard-navigation": { - "version": "0.1.18", - "resolved": "https://registry.npmjs.org/@blockly/keyboard-navigation/-/keyboard-navigation-0.1.18.tgz", - "integrity": "sha512-0IfCjbQE+KRPsNXGSQxllTY+YzQkhBZ/J0RrWkrkp3nVCnRQPWUrbfx0WSKsunxiDaByzTS1X4EF1MZvuDun1A==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@blockly/keyboard-navigation/-/keyboard-navigation-0.6.5.tgz", + "integrity": "sha512-KnH9YZLUdp7Y4zHpjLnVXWF/4iR8hO5YK4FoQC3TK/IBFSZea8XeADiKRA8U4KsmdXzN6kGdpnu8YVG5loQwpw==", "requires": {} }, "@blockly/plugin-workspace-search": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@blockly/plugin-workspace-search/-/plugin-workspace-search-4.0.10.tgz", - "integrity": "sha512-OYvJG9qsYfvicNiAiaxJ4Bn+ixIUnjbXeo+9MaeHt5+9bKwsp2hHp2IeecIpxBDJPtTBn3PG2JPOmRkib7bkoA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@blockly/plugin-workspace-search/-/plugin-workspace-search-9.1.0.tgz", + "integrity": "sha512-cono6n0tRD3L5DJxJ224IBwiCrfjKEERlyFiPBYVttuEcaw50teHoVSAnFwf1Mj2EaW96sUAh7rP8eqZIXxAdA==", "requires": {} }, "@crowdin/crowdin-api-client": { @@ -7629,6 +8482,11 @@ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" + }, "@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -7642,6 +8500,11 @@ "@types/node": "*" } }, + "@types/diff-match-patch": { + "version": "1.0.36", + "resolved": "https://registry.npmjs.org/@types/diff-match-patch/-/diff-match-patch-1.0.36.tgz", + "integrity": "sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==" + }, "@types/dom-mediacapture-record": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-record/-/dom-mediacapture-record-1.0.16.tgz", @@ -7698,6 +8561,11 @@ "@types/node": "*" } }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" + }, "@zip.js/zip.js": { "version": "2.4.20", "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.4.20.tgz", @@ -7706,8 +8574,7 @@ "abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "peer": true + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" }, "accepts": { "version": "1.3.8", @@ -7723,30 +8590,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" }, - "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "peer": true, - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "peer": true - }, - "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "peer": true - } - } - }, "acorn-node": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", @@ -7790,11 +8633,27 @@ } } }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "alphanum-sort": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -7825,29 +8684,22 @@ "sprintf-js": "~1.0.2" } }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==", - "peer": true - }, "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "requires": { "safer-buffer": "~2.1.0" } }, "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" + "minimalistic-assert": "^1.0.0" }, "dependencies": { "bn.js": { @@ -7858,29 +8710,34 @@ } }, "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", + "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" + "object.assign": "^4.1.4", + "util": "^0.10.4" }, "dependencies": { "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", "requires": { - "inherits": "2.0.1" + "inherits": "2.0.3" } } } }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" + }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -7891,10 +8748,23 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" + }, "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.1.tgz", + "integrity": "sha512-u5w79Rd7SU4JaIlA/zFqG+gOiuq25q5VLyZ8E+ijJeILuTxVzZgp2CaGw/UTw6pXYN9XMO9yiqj/nEHmhTG5CA==" }, "axios": { "version": "1.6.8", @@ -7948,7 +8818,7 @@ "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "requires": { "tweetnacl": "^0.14.3" } @@ -7981,12 +8851,11 @@ } }, "blockly": { - "version": "6.20210701.0", - "resolved": "https://registry.npmjs.org/blockly/-/blockly-6.20210701.0.tgz", - "integrity": "sha512-cNrwFOAxXE5Pbs1FJAyLTlSRzpNW/C+0gPT2rGQDOJVVKcyF3vhFC1StgnxvQNsv//ueuksKWIXxDuSWh1VI4w==", - "peer": true, + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/blockly/-/blockly-11.1.1.tgz", + "integrity": "sha512-PmInYM9zH1HcYMffqnfmeu2O3g0intsowy08S0KDu3q8/95TfGo1tcDYpeWNQDkPOEzN1yy3oocsRO4NPDHtKA==", "requires": { - "jsdom": "15.2.1" + "jsdom": "23.0.0" } }, "bn.js": { @@ -8051,25 +8920,12 @@ "umd": "^3.0.0" } }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "peer": true - }, "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==" - } + "resolve": "^1.17.0" } }, "browser-stdout": { @@ -8078,48 +8934,48 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "browserify": { - "version": "16.2.3", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", - "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", + "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", "requires": { "assert": "^1.4.0", "browser-pack": "^6.0.1", - "browser-resolve": "^1.11.0", + "browser-resolve": "^2.0.0", "browserify-zlib": "~0.2.0", - "buffer": "^5.0.2", + "buffer": "~5.2.1", "cached-path-relative": "^1.0.0", "concat-stream": "^1.6.0", "console-browserify": "^1.1.0", "constants-browserify": "~1.0.0", "crypto-browserify": "^3.0.0", "defined": "^1.0.0", - "deps-sort": "^2.0.0", + "deps-sort": "^2.0.1", "domain-browser": "^1.2.0", "duplexer2": "~0.1.2", - "events": "^2.0.0", + "events": "^3.0.0", "glob": "^7.1.0", "has": "^1.0.0", "htmlescape": "^1.1.0", "https-browserify": "^1.0.0", "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", + "insert-module-globals": "^7.2.1", "JSONStream": "^1.0.3", "labeled-stream-splicer": "^2.0.0", - "mkdirp": "^0.5.0", - "module-deps": "^6.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.2.3", "os-browserify": "~0.3.0", "parents": "^1.0.1", - "path-browserify": "~0.0.0", + "path-browserify": "^1.0.0", "process": "~0.11.0", "punycode": "^1.3.2", "querystring-es3": "~0.2.0", "read-only-stream": "^2.0.0", "readable-stream": "^2.0.2", "resolve": "^1.1.4", - "shasum": "^1.0.0", + "shasum-object": "^1.0.0", "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^2.0.0", + "stream-browserify": "^3.0.0", + "stream-http": "^3.0.0", "string_decoder": "^1.1.1", "subarg": "^1.0.0", "syntax-error": "^1.1.1", @@ -8127,9 +8983,20 @@ "timers-browserify": "^1.0.1", "tty-browserify": "0.0.1", "url": "~0.11.0", - "util": "~0.10.1", + "util": "~0.12.0", "vm-browserify": "^1.0.0", "xtend": "^4.0.0" + }, + "dependencies": { + "buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + } } }, "browserify-aes": { @@ -8176,31 +9043,20 @@ } }, "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", + "elliptic": "^6.5.5", + "hash-base": "~3.0", "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" } }, "browserify-zlib": { @@ -8270,12 +9126,15 @@ "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==" }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "caller-callsite": { @@ -8299,6 +9158,11 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -8325,7 +9189,7 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "chai": { "version": "3.5.0", @@ -8463,11 +9327,6 @@ "delayed-stream": "~1.0.0" } }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -8529,9 +9388,9 @@ } }, "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "cors": { "version": "2.8.5", @@ -8800,27 +9659,12 @@ } } }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "peer": true - }, "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "peer": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", + "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "peer": true - } + "rrweb-cssom": "^0.6.0" } }, "csstype": { @@ -8842,16 +9686,9 @@ "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "requires": { "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } } }, "dashjs": { @@ -8875,23 +9712,16 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==" - }, - "path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" } } }, "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "peer": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" } }, "date-format": { @@ -8907,6 +9737,16 @@ "ms": "2.0.0" } }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" + }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, "deep-eql": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", @@ -8922,23 +9762,29 @@ } } }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "peer": true - }, "deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "requires": { - "object-keys": "^1.0.12" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "defined": { @@ -8968,9 +9814,9 @@ } }, "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -8997,9 +9843,14 @@ "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=" }, "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" + }, + "diff-match-patch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==" }, "diffie-hellman": { "version": "5.0.3", @@ -9056,12 +9907,11 @@ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" }, "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "peer": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", "requires": { - "webidl-conversions": "^4.0.2" + "webidl-conversions": "^7.0.0" } }, "domhandler": { @@ -9112,7 +9962,7 @@ "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -9129,9 +9979,9 @@ "integrity": "sha512-w16Dtd2zl7VZ4N4Db+FIa7n36sgPGCKjrKvUUmp5ialsikvcQLjcJR9RWnlYNxIyEHLdHaoIZEqKsPxU9MdyBg==" }, "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", + "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", "requires": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -9269,6 +10119,19 @@ "unbox-primitive": "^1.0.1" } }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -9299,45 +10162,20 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "peer": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "peer": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "peer": true - }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "events": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "evp_bytestokey": { "version": "1.0.3", @@ -9382,7 +10220,7 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" }, "fast-deep-equal": { "version": "3.1.3", @@ -9394,12 +10232,6 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "peer": true - }, "fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", @@ -9473,6 +10305,11 @@ } } }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" + }, "flatted": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", @@ -9483,10 +10320,18 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" }, "form-data": { "version": "4.0.0", @@ -9525,9 +10370,9 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "get-assigned-identifiers": { "version": "1.2.0", @@ -9540,13 +10385,15 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-stream": { @@ -9569,16 +10416,9 @@ "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "requires": { "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } } }, "glob": { @@ -9602,15 +10442,37 @@ "is-glob": "^4.0.1" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } }, "has": { "version": "1.0.3", @@ -9630,39 +10492,39 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, - "has-symbols": { + "has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "requires": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" } }, "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "hash.js": { @@ -9670,14 +10532,22 @@ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" } }, "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, "hex-color-regex": { "version": "1.1.0", @@ -9705,12 +10575,11 @@ "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" }, "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "peer": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "requires": { - "whatwg-encoding": "^1.0.1" + "whatwg-encoding": "^3.1.1" } }, "html-entities": { @@ -9795,6 +10664,48 @@ "requires-port": "^1.0.0" } }, + "http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "requires": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "dependencies": { + "agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "requires": { + "debug": "^4.3.4" + } + }, + "debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -9892,9 +10803,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.3.tgz", + "integrity": "sha512-1aVsPEsJWMJq/pdMU61CDlm1URcW702MTB4w9/zUjMus6H/Py8o7g68Pr9D4I6QluWGt/KdmswuRhaA05xVR1w==", "requires": { "source-map": "~0.5.3" }, @@ -9933,12 +10844,6 @@ "side-channel": "^1.0.4" } }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", - "peer": true - }, "is-absolute-url": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", @@ -9958,6 +10863,15 @@ "is-decimal": "^1.0.0" } }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -10012,11 +10926,11 @@ } }, "is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", "requires": { - "has": "^1.0.3" + "hasown": "^2.0.2" } }, "is-date-object": { @@ -10047,6 +10961,14 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -10078,11 +11000,21 @@ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, "is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -10118,10 +11050,18 @@ "has-symbols": "^1.0.2" } }, + "is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "requires": { + "which-typed-array": "^1.1.14" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "is-weakref": { "version": "1.0.1", @@ -10154,7 +11094,7 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "jquery": { "version": "3.6.4", @@ -10179,40 +11119,66 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, "jsdom": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", - "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", - "peer": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^7.1.0", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.4.1", - "cssstyle": "^2.0.0", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.2.0", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", - "xml-name-validator": "^3.0.0" + "version": "23.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-23.0.0.tgz", + "integrity": "sha512-cbL/UCtohJguhFC7c2/hgW6BeZCNvP7URQGnx9tSJRYKCdnfbfWOrtuLTMfiB2VxKsx5wPHVsh/J0aBy9lIIhQ==", + "requires": { + "cssstyle": "^3.0.0", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.7", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.3", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.14.2", + "xml-name-validator": "^5.0.0" + }, + "dependencies": { + "agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "requires": { + "debug": "^4.3.4" + } + }, + "debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "requires": { + "ms": "2.1.2" + } + }, + "https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "requires": { + "agent-base": "^7.0.2", + "debug": "4" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "json-parse-better-errors": { @@ -10221,9 +11187,9 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "json-schema-traverse": { "version": "0.4.1", @@ -10241,7 +11207,7 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "jsonfile": { "version": "4.0.0", @@ -10271,21 +11237,14 @@ } }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } } }, "karma": { @@ -10393,16 +11352,6 @@ } } }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "peer": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, "lie": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", @@ -10437,17 +11386,64 @@ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==" }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "peer": true - }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "requires": { + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "log4js": { "version": "6.9.1", "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", @@ -10595,35 +11591,90 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "mocha": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.1.0.tgz", - "integrity": "sha512-d6RWgYPILd+AoWVOxiD0UwUqRicnE1inTxMr40CXOgqYve1MvnKntoLAtLIcxjEeVjEoYYTe5QAq3mUc6/ySjQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - }, - "dependencies": { + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "requires": { - "ms": "2.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10634,30 +11685,85 @@ } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==" }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "requires": { - "minimist": "0.0.8" + "picomatch": "^2.2.1" } }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "requires": { - "has-flag": "^2.0.0" + "has-flag": "^4.0.0" } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" } } }, @@ -10681,16 +11787,6 @@ "subarg": "^1.0.0", "through2": "^2.0.0", "xtend": "^4.0.0" - }, - "dependencies": { - "browser-resolve": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", - "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", - "requires": { - "resolve": "^1.17.0" - } - } } }, "ms": { @@ -10767,10 +11863,14 @@ } }, "nwsapi": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.3.tgz", - "integrity": "sha512-jscxIO4/VKScHlbmFBdV1Z6LXnLO+ZR4VMtypudUdfwtKxUN3TQcNFIHLwKtrUbDyHN4/GycY9+oRGZ2XMXYPw==", - "peer": true + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", + "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { "version": "4.1.1", @@ -10778,9 +11878,9 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==" }, "object-keys": { "version": "1.1.1", @@ -10788,13 +11888,13 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, @@ -10834,20 +11934,6 @@ "wrappy": "1" } }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "peer": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -10888,15 +11974,16 @@ } }, "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" } }, "parse-json": { @@ -10914,10 +12001,19 @@ "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" }, "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", - "peer": true + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "requires": { + "entities": "^4.4.0" + }, + "dependencies": { + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + } + } }, "parseurl": { "version": "1.3.3", @@ -10925,9 +12021,9 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, "path-exists": { "version": "4.0.0", @@ -10966,6 +12062,11 @@ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, "picocolors": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", @@ -10990,17 +12091,16 @@ "find-up": "^4.0.0" } }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "peer": true - }, "pngjs": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==" }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==" + }, "postcss": { "version": "6.0.21", "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", @@ -11700,12 +12800,6 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "peer": true - }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -11754,9 +12848,9 @@ "optional": true }, "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "public-encrypt": { "version": "4.0.3", @@ -11790,7 +12884,7 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, "puppeteer": { "version": "13.0.1", @@ -11812,57 +12906,249 @@ }, "dependencies": { "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "requires": {} + } + } + }, + "pxt-common-packages": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/pxt-common-packages/-/pxt-common-packages-12.0.3.tgz", + "integrity": "sha512-8rJBsYo9B1ZawCtTln4bLLbsKjdxF0XSFocaTBTQ2Vm8GO28RiPBK5/sfOVzPOpdVAD8VgKnI4LRCfecOwDMlA==", + "requires": { + "pxt-core": "10.2.3" + }, + "dependencies": { + "@blockly/keyboard-navigation": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@blockly/keyboard-navigation/-/keyboard-navigation-0.5.4.tgz", + "integrity": "sha512-kq2PR3JyY/LGbrEplLd/8Uz4HfNFMk9OUTnW5GAge2oDMJ92ZsjMQxFb/3ANABm7pbdq1RtMkCgQ986zZ2iJoQ==", + "requires": {} + }, + "@blockly/plugin-workspace-search": { + "version": "8.0.9", + "resolved": "https://registry.npmjs.org/@blockly/plugin-workspace-search/-/plugin-workspace-search-8.0.9.tgz", + "integrity": "sha512-Y4sWasQfKvZU1fZoM2dhn02XatuAjHtBj2xSojhBEgK/DENA4jhJz7IFowLnwAfbWHda57DqPnZoCpAod8FHoA==", + "requires": {} + }, + "blockly": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/blockly/-/blockly-10.4.1.tgz", + "integrity": "sha512-FcAnMU4/uJkOiY3p3OISDfko8iXFlEIF52L2l1EclShkLuC+igW670Q2I+RXhjIyWRA9Lv08BCQLWuGXlsAlKw==", + "requires": { + "jsdom": "22.1.0" + } + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "requires": { + "resolve": "1.1.7" + } + }, + "browserify": { + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", + "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", + "requires": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "^5.0.2", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp": "^0.5.0", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^2.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "data-urls": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", + "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", + "requires": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.0" + } + }, + "debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "requires": { "ms": "2.1.2" } }, + "events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==" + }, + "html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "requires": { + "whatwg-encoding": "^2.0.0" + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "jsdom": { + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz", + "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", + "requires": { + "abab": "^2.0.6", + "cssstyle": "^3.0.0", + "data-urls": "^4.0.0", + "decimal.js": "^10.4.3", + "domexception": "^4.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.4", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.1", + "ws": "^8.13.0", + "xml-name-validator": "^4.0.0" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" }, - "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "requires": {} - } - } - }, - "pxt-common-packages": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/pxt-common-packages/-/pxt-common-packages-11.0.1.tgz", - "integrity": "sha512-0kmA0AFWG+1k36gAC92FAhJJXWFiAHC4mRJcuKfyn4SdrAZRTAfJZMs5zVLhpQ8ZQTAm/oNgqp/xnn40mWOKPg==", - "requires": { - "pxt-core": "8.6.32" - }, - "dependencies": { "pxt-core": { - "version": "8.6.32", - "resolved": "https://registry.npmjs.org/pxt-core/-/pxt-core-8.6.32.tgz", - "integrity": "sha512-92pHZWodEX+k7ut6PH7k5X3sRDJ2ySBL6VYzesYWDmrTQPGYvVfR5VfrrWY45Ov0daImYyCCbqKHXSs0stiSYA==", + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/pxt-core/-/pxt-core-10.2.3.tgz", + "integrity": "sha512-rg5V8YTvyhA6dt2KXVo6LT5Rp4+tdKscqf+fjrKOQxzmYb2fUVNNbc/YYg0K651HRq5iCupT05E00DBTpDrO+A==", "requires": { - "@blockly/keyboard-navigation": "^0.1.18", - "@blockly/plugin-workspace-search": "^4.0.10", + "@blockly/keyboard-navigation": "0.5.4", + "@blockly/plugin-workspace-search": "8.0.9", + "@crowdin/crowdin-api-client": "^1.33.0", "@fortawesome/fontawesome-free": "^5.15.4", "@microsoft/applicationinsights-web": "^2.8.11", "@microsoft/immersive-reader-sdk": "1.1.0", + "@types/diff-match-patch": "^1.0.32", "@zip.js/zip.js": "2.4.20", + "adm-zip": "^0.5.12", + "axios": "^1.6.8", + "blockly": "10.4.1", "browserify": "16.2.3", "chai": "^3.5.0", "cssnano": "4.1.10", "dashjs": "^4.4.0", + "diff-match-patch": "^1.0.5", "dompurify": "2.0.17", "faye-websocket": "0.11.1", "karma": "6.3.10", @@ -11872,7 +13158,7 @@ "less": "3.13.1", "lzma": "2.3.2", "marked": "0.3.19", - "mocha": "5.1.0", + "mocha": "8.4.0", "pngjs": "3.4.0", "postcss": "6.0.21", "promise.prototype.finally": "^3.1.2", @@ -11884,27 +13170,115 @@ "semantic-ui-less": "2.4.1", "terser": "5.6.0" } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==" + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "requires": { + "punycode": "^2.3.0" + }, + "dependencies": { + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + } + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "requires": { + "inherits": "2.0.3" + } + }, + "w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "requires": { + "xml-name-validator": "^4.0.0" + } + }, + "whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "requires": { + "iconv-lite": "0.6.3" + } + }, + "whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" + }, + "whatwg-url": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", + "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", + "requires": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + } + }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==" } } }, "pxt-core": { - "version": "9.0.18", - "resolved": "https://registry.npmjs.org/pxt-core/-/pxt-core-9.0.18.tgz", - "integrity": "sha512-2ZwHMT9AQrc/sO8dG2ZQzq19Te8KVcUdI4IY+FYvy2AWfD+3E2KY/fwlK3t8RQijjynQ2OC4Ur9I8zARnR45WA==", + "version": "10.2.11", + "resolved": "https://registry.npmjs.org/pxt-core/-/pxt-core-10.2.11.tgz", + "integrity": "sha512-7+spA8AXN0zGAz3xqmjuwH+Xm4qzwxV6EetfwIRbFhq7z9F7DgfByhgGPNBSMYI2Fz3OEQZgIqhTNUc6WdsogQ==", "requires": { - "@blockly/keyboard-navigation": "^0.1.18", - "@blockly/plugin-workspace-search": "^4.0.10", + "@blockly/field-colour": "5.0.5", + "@blockly/keyboard-navigation": "0.6.5", + "@blockly/plugin-workspace-search": "9.1.0", "@crowdin/crowdin-api-client": "^1.33.0", "@fortawesome/fontawesome-free": "^5.15.4", "@microsoft/applicationinsights-web": "^2.8.11", "@microsoft/immersive-reader-sdk": "1.1.0", + "@types/diff-match-patch": "^1.0.32", "@zip.js/zip.js": "2.4.20", "adm-zip": "^0.5.12", "axios": "^1.6.8", - "browserify": "16.2.3", + "blockly": "11.1.1", + "browserify": "17.0.0", "chai": "^3.5.0", "cssnano": "4.1.10", "dashjs": "^4.4.0", + "diff-match-patch": "^1.0.5", "dompurify": "2.0.17", "faye-websocket": "0.11.1", "karma": "6.3.10", @@ -11914,7 +13288,7 @@ "less": "3.13.1", "lzma": "2.3.2", "marked": "0.3.19", - "mocha": "5.1.0", + "mocha": "8.4.0", "pngjs": "3.4.0", "postcss": "6.0.21", "promise.prototype.finally": "^3.1.2", @@ -11942,16 +13316,16 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==" - }, "querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==" }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -12099,27 +13473,6 @@ "uuid": "^3.3.2" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", @@ -12130,44 +13483,10 @@ "mime-types": "^2.1.12" } }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" }, "tough-cookie": { "version": "2.4.3", @@ -12180,44 +13499,6 @@ } } }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "peer": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "peer": true, - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "dependencies": { - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "peer": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "peer": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -12229,11 +13510,11 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "requires": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -12275,6 +13556,11 @@ "inherits": "^2.0.1" } }, + "rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==" + }, "rtlcss": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.2.1.tgz", @@ -12339,12 +13625,11 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", - "peer": true, + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "requires": { - "xmlchars": "^2.1.1" + "xmlchars": "^2.2.0" } }, "scheduler": { @@ -12371,6 +13656,27 @@ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "optional": true }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", @@ -12408,13 +13714,14 @@ "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==" }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, "simple-concat": { @@ -12530,9 +13837,9 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -12543,13 +13850,6 @@ "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } } }, "stable": { @@ -12562,19 +13862,25 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", - "peer": true - }, "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "stream-combiner2": { @@ -12587,15 +13893,26 @@ } }, "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", "requires": { "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "stream-splicer": { @@ -12756,8 +14073,7 @@ "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "peer": true + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "syntax-error": { "version": "1.4.0", @@ -12888,38 +14204,40 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "peer": true, + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "dependencies": { "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "peer": true + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + }, + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==" } } }, "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "peer": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", "requires": { - "punycode": "^2.1.0" + "punycode": "^2.3.1" }, "dependencies": { "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "peer": true + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" } } }, @@ -12936,7 +14254,7 @@ "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "requires": { "safe-buffer": "^5.0.1" } @@ -12944,16 +14262,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "peer": true, - "requires": { - "prelude-ls": "~1.1.2" - } + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "type-detect": { "version": "1.0.0", @@ -12975,9 +14284,9 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "typescript": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", - "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", "dev": true }, "ua-parser-js": { @@ -13056,41 +14365,50 @@ }, "dependencies": { "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" } } }, "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "punycode": "^1.4.1", + "qs": "^6.12.3" }, "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + "qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "requires": { + "side-channel": "^1.0.6" + } } } }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - } + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, "util-deprecate": { @@ -13132,17 +14450,17 @@ "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" }, "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" } } }, @@ -13156,31 +14474,18 @@ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "peer": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", - "peer": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" + "xml-name-validator": "^5.0.0" } }, "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "peer": true + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" }, "websocket-driver": { "version": "0.7.4", @@ -13198,29 +14503,35 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "peer": true, + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "requires": { - "iconv-lite": "0.4.24" + "iconv-lite": "0.6.3" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } } }, "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "peer": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==" }, "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "peer": true, + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" } }, "which": { @@ -13243,11 +14554,59 @@ "is-symbol": "^1.0.3" } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "peer": true + "which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==" }, "wrap-ansi": { "version": "7.0.0", @@ -13288,23 +14647,20 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "peer": true, + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "requires": {} }, "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "peer": true + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==" }, "xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "peer": true + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "xtend": { "version": "4.0.2", @@ -13335,6 +14691,17 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } + }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -13343,6 +14710,11 @@ "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } } diff --git a/package.json b/package.json index e5ddb050f..d82271b3e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-calliopemini", - "version": "6.0.41", + "version": "7.0.0", "description": "calliope mini target for Microsoft MakeCode (PXT)", "keywords": [ "JavaScript", @@ -43,10 +43,10 @@ "react": "16.8.3", "react-dom": "16.11.0", "semantic-ui-less": "2.4.1", - "typescript": "4.2.3" + "typescript": "4.8.3" }, "dependencies": { - "pxt-common-packages": "11.0.1", - "pxt-core": "9.0.18" + "pxt-common-packages": "12.0.3", + "pxt-core": "10.2.16" } } diff --git a/pxtarget.json b/pxtarget.json index 036fd8482..9d2b074d4 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -22,6 +22,7 @@ "libs/settings", "libs/flashlog", "libs/datalogger", + "libs/fonts", "libs/audio-recording" ], "cloud": { @@ -206,7 +207,7 @@ "codalTarget": { "name": "codal-microbit-v2", "url": "https://github.com/calliope-edu/codal-microbit-v2", - "branch": "v0.2.63-calliope-rc1", + "branch": "v0.2.67-calliope-rc1", "type": "git" }, "codalBinary": "MICROBIT", @@ -389,7 +390,7 @@ "graphBackground": "#d9d9d9", "lineColors": [ "#6633cc", - "#3891A6", + "#2C7485", "#3454D1", "#EF767A", "#F46197", @@ -544,6 +545,7 @@ "sv-SE", "tr", "uk", + "vi", "zh-CN", "zh-TW" ], @@ -551,7 +553,8 @@ "editor.background": "#ecf0f1" }, "monacoFieldEditors": [ - "soundeffect-editor" + "soundeffect-editor", + "image-editor" ], "browserDbPrefixes": { "1": "v1", @@ -559,7 +562,8 @@ "3": "v3", "4": "v4", "5": "v5", - "6": "v6" + "6": "v6", + "7": "v7" }, "editorVersionPaths": { "0": "v0" @@ -614,7 +618,10 @@ "hideReplaceMyCode": true, "matchWebUSBDeviceInSim": true, "condenseProfile": true, - "cloudProfileIcon": "/static/profile/microbit-cloud.png" + "cloudProfileIcon": "/static/profile/microbit-cloud.png", + "timeMachine": true, + "timeMachineDiffInterval": 600000, + "timeMachineSnapshotInterval": 1800000 }, "queryVariants": { "hidemenu": { @@ -668,6 +675,12 @@ "appTheme": { "hideReplaceMyCode": false } + }, + "teachertool=1": { + "appTheme": { + "hideMenuBar": true, + "workspaceSearch": true + } } }, "ignoreDocsErrors": true, diff --git a/pxtwapp/pxtwapp/package.appxmanifest b/pxtwapp/pxtwapp/package.appxmanifest index 6a0a309bb..50472bbca 100644 --- a/pxtwapp/pxtwapp/package.appxmanifest +++ b/pxtwapp/pxtwapp/package.appxmanifest @@ -3,8 +3,8 @@ - MakeCode for micro:bit - Micro:bit Educational Foundation + MakeCode forCalliope mini + Calliope gGmbH images\storelogo.png @@ -21,7 +21,7 @@ - + diff --git a/sim/dalboard.ts b/sim/dalboard.ts index b850d4718..426a444db 100644 --- a/sim/dalboard.ts +++ b/sim/dalboard.ts @@ -202,6 +202,11 @@ namespace pxsim { screenshotAsync(width?: number): Promise { return this.viewHost.screenshotAsync(width); } + + kill() { + super.kill(); + this.viewHost.removeEventListeners(); + } } export function initRuntimeWithDalBoard() { diff --git a/sim/state/misc.ts b/sim/state/misc.ts index 91fe481ee..83a9a662a 100644 --- a/sim/state/misc.ts +++ b/sim/state/misc.ts @@ -35,7 +35,7 @@ namespace pxsim.basic { namespace pxsim.control { export var inBackground = thread.runInBackground; - export function onEvent(id: number, evid: number, handler: RefAction) { + export function onEvent(id: number, evid: number, handler: RefAction, flags: number) { if (id == DAL.MICROBIT_ID_BUTTON_AB) { const b = board().buttonPairState; if (!b.usesButtonAB) { @@ -43,7 +43,7 @@ namespace pxsim.control { runtime.queueDisplayUpdate(); } } - pxtcore.registerWithDal(id, evid, handler) + pxtcore.registerWithDal(id, evid, handler, flags) } export function eventTimestamp() { diff --git a/sim/state/record-audio.ts b/sim/state/record-audio.ts index 30a2afb15..488769510 100644 --- a/sim/state/record-audio.ts +++ b/sim/state/record-audio.ts @@ -4,12 +4,19 @@ namespace pxsim { stream: MediaStream; recorder: MediaRecorder; chunks: Blob[]; + audioURL: string; + // The inputBitRate when the current audioUrl was recorded + audioURLBitRate: number; + recording: HTMLAudioElement; audioPlaying: boolean = false; recordTimeoutID: any; currentlyErasing: boolean; + inputBitRate = record.defaultBitRate(); + outputBitRate = record.defaultBitRate(); + handleAudioPlaying = () => { this.audioPlaying = true; }; @@ -27,6 +34,16 @@ namespace pxsim { } } namespace pxsim.record { + // Arbitrarily chosen lower bound. Can't go much lower than this without bugs cropping up + const MIN_BIT_RATE = 3000; + // This is double the default in chrome (128000) + const MAX_BIT_RATE = 256000; + + const MAX_SAMPLE_RATE = 22000; + const MIN_SAMPLE_RATE = 1000; + + const MIN_RECORDING_TIME = 3000; + const MAX_RECORDING_TIME = 20000; let _initialized = false; function init() { @@ -37,74 +54,83 @@ namespace pxsim.record { } function stopRecorder(b: DalBoard): void { - b.recordingState.recorder.stop(); - b.recordingState.currentlyRecording = false; + const state = b.recordingState; + state.recorder.stop(); + state.currentlyRecording = false; runtime.queueDisplayUpdate(); - if (b.recordingState.stream.active) { - b.recordingState.stream.getAudioTracks().forEach(track => { + if (state.stream.active) { + for (const track of state.stream.getAudioTracks()) { track.stop(); track.enabled = false; - }); + } } } async function populateRecording(b: DalBoard) { - if (b.recordingState.currentlyErasing) { + const state = b.recordingState; + + if (state.currentlyErasing) { await erasingAsync(b); } - if (b.recordingState.chunks[0].size > 0) { - b.recordingState.audioURL = null; + if (state.chunks[0].size > 0) { + state.audioURL = null; const recordingType = pxsim.isSafari() ? "audio/mp4" : "audio/ogg; codecs=opus"; - const blob = new Blob(b.recordingState.chunks, { type: recordingType }); - b.recordingState.audioURL = window.URL.createObjectURL(blob); - b.recordingState.recording = new Audio(b.recordingState.audioURL); - b.recordingState.initListeners(); + const blob = new Blob(state.chunks, { type: recordingType }); + state.audioURL = window.URL.createObjectURL(blob); + state.recording = new Audio(state.audioURL); + state.initListeners(); } - b.recordingState.currentlyRecording = false; - b.recordingState.recorder = null; - b.recordingState.chunks = []; + state.currentlyRecording = false; + state.recorder = null; + state.chunks = []; } export async function record(): Promise { let b = board(); init(); - if (b.recordingState.recorder) { - b.recordingState.recorder.stop(); - clearTimeout(b.recordingState.recordTimeoutID); + const state = b.recordingState; + + if (state.recorder) { + state.recorder.stop(); + clearTimeout(state.recordTimeoutID); } - if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { + if (navigator.mediaDevices?.getUserMedia) { try { - b.recordingState.stream = await navigator.mediaDevices.getUserMedia({ video: false, audio: true }); - b.recordingState.recorder = new MediaRecorder(b.recordingState.stream); - b.recordingState.recorder.start(); - b.recordingState.currentlyRecording = true; + state.stream = await navigator.mediaDevices.getUserMedia({ video: false, audio: true }); + state.recorder = new MediaRecorder(state.stream, { audioBitsPerSecond: state.inputBitRate }); + state.recorder.start(); + state.currentlyRecording = true; runtime.queueDisplayUpdate(); + const recordBitRate = state.inputBitRate; - b.recordingState.recordTimeoutID = setTimeout(() => { + const duration = (1 - ((recordBitRate - MIN_BIT_RATE) / (MAX_BIT_RATE - MIN_BIT_RATE))) * (MAX_RECORDING_TIME - MIN_RECORDING_TIME) + MIN_RECORDING_TIME; + + state.recordTimeoutID = setTimeout(() => { stopRecorder(b); - }, 5000) + }, duration) - b.recordingState.recorder.ondataavailable = (e: BlobEvent) => { - b.recordingState.chunks.push(e.data); + state.recorder.ondataavailable = (e: BlobEvent) => { + state.chunks.push(e.data); } - b.recordingState.recorder.onstop = async () => { + state.recorder.onstop = async () => { await populateRecording(b); + state.audioURLBitRate = recordBitRate; } } catch (error) { console.log("An error occurred, could not get microphone access"); - if (b.recordingState.recorder) { - b.recordingState.recorder.stop(); + if (state.recorder) { + state.recorder.stop(); } - b.recordingState.currentlyRecording = false; + state.currentlyRecording = false; } } else { console.log("getUserMedia not supported on your browser!"); - b.recordingState.currentlyRecording = false; + state.currentlyRecording = false; } } @@ -139,20 +165,44 @@ namespace pxsim.record { init(); stopAudio(); - b.recordingState.audioPlaying = true; + + const state = b.recordingState; + + state.audioPlaying = true; setTimeout(async () => { - if (!b.recordingState.currentlyErasing && b.recordingState.recording) { + if (!state.currentlyErasing && state.recording) { try { const volume = AudioContextManager.isMuted() ? 0 : 1; - b.recordingState.recording.volume = volume; - await b.recordingState.recording.play(); - } catch (e) { + state.recording.volume = volume; + + const minPlaybackRate = 0.15 + + // 15 is the maximum playback rate that still produced sound in Chrome on Windows. + // In Firefox, it seems like 8 is the max. Higher numbers silently fail. + let maxPlaybackRate = 15; + if (isFirefox()) { + maxPlaybackRate = 8; + } + + const playbackRate = Math.max(minPlaybackRate, + Math.min( + maxPlaybackRate, + bitRateToSampleRate(state.outputBitRate) / bitRateToSampleRate(state.audioURLBitRate) + ) + ); + + state.recording.playbackRate = playbackRate; + state.recording.preservesPitch = false; + await state.recording.play(); + } + catch (e) { if (!(e instanceof DOMException)) { throw e; } } - } else { - b.recordingState.audioPlaying = false; + } + else { + state.audioPlaying = false; } }, 10) } @@ -221,14 +271,44 @@ namespace pxsim.record { } export function setInputSampleRate(sampleRate: number): void { + const b = board(); + if (!b) return; + b.recordingState.inputBitRate = sampleRateToBitRate(sampleRate); } export function setOutputSampleRate(sampleRate: number): void { + const b = board(); + if (!b) return; + b.recordingState.outputBitRate = sampleRateToBitRate(sampleRate); } export function setBothSamples(sampleRate: number): void { + setInputSampleRate(sampleRate); + setOutputSampleRate(sampleRate); + } + + /** + * The browser API doesn't allow us to control sample rate directly, but we + * can affect it by setting the bit rate. This maps the supported sample rates + * into a reasonable range of bit rates. + */ + function sampleRateToBitRate(sampleRate: number) { + return mapRange(sampleRate, MIN_SAMPLE_RATE, MAX_SAMPLE_RATE, MIN_BIT_RATE, MAX_BIT_RATE); + } + + function bitRateToSampleRate(bitRate: number) { + return mapRange(bitRate, MIN_BIT_RATE, MAX_BIT_RATE, MIN_SAMPLE_RATE, MAX_SAMPLE_RATE); + } + + function mapRange(value: number, inMin: number, inMax: number, outMin: number, outMax: number) { + value = Math.min(Math.max(inMin, value), inMax); + + return ((value - inMin) / (inMax - inMin)) * (outMax - outMin) + outMin; + } + export function defaultBitRate() { + return sampleRateToBitRate(11000); } } \ No newline at end of file diff --git a/sim/tsconfig.json b/sim/tsconfig.json index 5d47128aa..06beeb5b4 100644 --- a/sim/tsconfig.json +++ b/sim/tsconfig.json @@ -5,7 +5,7 @@ "noImplicitReturns": true, "declaration": true, "outFile": "../built/sim.js", - "rootDir": ".", + "rootDir": "..", "newLine": "LF", "moduleResolution": "node", "sourceMap": false, diff --git a/sim/visuals/mute.ts b/sim/visuals/mute.ts index 180e15dc9..942dfaa88 100644 --- a/sim/visuals/mute.ts +++ b/sim/visuals/mute.ts @@ -60,4 +60,10 @@ namespace pxsim { //Checking for iPhone, iPod or iPad as well as Safari in order to detect home screen browsers on iOS return !isChrome() && !isEdge() && !!navigator && /(Macintosh|Safari|iPod|iPhone|iPad)/i.test(navigator.userAgent); } + + //Safari and WebKit lie about being Firefox + export function isFirefox(): boolean { + return !isSafari() && !!navigator && (/Firefox/i.test(navigator.userAgent) || /Seamonkey/i.test(navigator.userAgent)); + } + } \ No newline at end of file diff --git a/targetconfig.json b/targetconfig.json index 7b8e91038..a15165e4b 100644 --- a/targetconfig.json +++ b/targetconfig.json @@ -1,268 +1,5 @@ { "packages": { - "approvedRepos": [ - "51bit/colorbit", - "51bit/sfc", - "51bit/smarttools", - "51bit/dfplayermini", - "coding4coconut/pxt-lcd128x160-st7735s", - "coding4coconut/pxt-oled128x128-sh1107", - "freenove/makecode-extension-starter-kit", - "joernalraun/pxt-remember-int", - "kitronikltd/pxt-kitronik-i2c-16-servo", - "kitronikltd/pxt-kitronik-game-controller", - "kitronikltd/pxt-kitronik-klef-piano", - "kitronikltd/pxt-kitronik-klimate", - "kitronikltd/pxt-kitronik-lampbit", - "kitronikltd/pxt-kitronik-robotics-board", - "kitronikltd/pxt-kitronik-rtc", - "kitronikltd/pxt-kitronik-servo-lite", - "kitronikltd/pxt-kitronik-stopbit", - "mkleinsb/pxt-max7219_8x8", - "mkleinsb/pxt-oled-ssd1306", - "mkleinsb/pxt-oledpaint", - "mkleinsb/pxt-callibot", - "mkleinsb/pxt-callicolor", - "mkleinsb/pxt-callicross", - "mkleinsb/pxt-callimotor", - "mkleinsb/pxt-calliope-buttons", - "mkleinsb/pxt-co2oled", - "mkleinsb/pxt-dht11", - "mkleinsb/pxt-esp-thingspeak", - "mkleinsb/pxt-gatorlog-calliope", - "mkleinsb/pxt-huskylens", - "mkleinsb/pxt-kitronik-zip-tile-calliope", - "mkleinsb/pxt-mpr121", - "mkleinsb/pxt-pca9685", - "mkleinsb/pxt-seeed-temperature", - "mkleinsb/pxt-serialmp3", - "mkleinsb/pxt-ky-040", - "mkleinsb/scrolltext", - "mkleinsb/pxt-bme680", - "mkleinsb/pxt-ir-calliope", - "mkleinsb/pxt-mcp23017", - "mkleinsb/pxt-seeed-temperatursensor", - "mkleinsb/pxt-automationbit-calliope", - "mkleinsb/pxt-bc95", - "mkleinsb/pxt-calliope-esp", - "mkleinsb/pxt-calliope-oled96", - "mkleinsb/pxt-columbuseye", - "mkleinsb/pxt-envirobit", - "mkleinsb/pxt-fischertechnik-calliope", - "mkleinsb/pxt-foldio", - "mkleinsb/pxt-ft-fototransistor-calliope", - "mkleinsb/pxt-graphs", - "mkleinsb/pxt-iot-environment-kit", - "mkleinsb/pxt-kitronik-robotics-board-calliope", - "mkleinsb/pxt-kitronik-zip-64", - "mkleinsb/pxt-makerbit-motor-calliope", - "mkleinsb/pxt-makerbit-touch", - "mkleinsb/pxt-makerbit-ultrasonic-calliope", - "mkleinsb/pxt-serial-rb", - "mkleinsb/pxt-thumbjoystick-calliope", - "mkleinsb/pxt-grove-ultrasonic-jacdac", - "mkleinsb/pxt-grove-soilmoisture-jacdac", - "mkleinsb/pxt-grove-lcd/jacdac", - "mkleinsb/co2-sensor-scd40/jacdac", - "mkleinsb/pxt-callicolor-jacdac", - "mkleinsb/pxt-calliserv-jacdac", - "microsoft/pxt-bluetooth-max6675", - "microsoft/pxt-bluetooth-midi", - "microsoft/pxt-bluetooth-temperature-sensor", - "microsoft/pxt-filesystem", - "microsoft/pxt-hacking-stem", - "microsoft/pxt-max6675", - "microsoft/pxt-microturtle", - "microsoft/pxt-midi", - "microsoft/pxt-neopixel", - "microsoft/pxt-radio-blockchain", - "microsoft/pxt-sonar", - "microsoft/pxt-ws2812b", - "microsoft/pxt-jacdac", - "microsoft/pxt-jacdac/accelerometer", - "microsoft/pxt-jacdac/acidity", - "microsoft/pxt-jacdac/air-pressure", - "microsoft/pxt-jacdac/air-quality-index", - "microsoft/pxt-jacdac/arcade-gamepad", - "microsoft/pxt-jacdac/azure-iot-hub-health", - "microsoft/pxt-jacdac/button", - "microsoft/pxt-jacdac/buzzer", - "microsoft/pxt-jacdac/character-screen", - "microsoft/pxt-jacdac/codal-message-bus", - "microsoft/pxt-jacdac/color", - "microsoft/pxt-jacdac/compass", - "microsoft/pxt-jacdac/dc-current-measurement", - "microsoft/pxt-jacdac/dc-voltage-measurement", - "microsoft/pxt-jacdac/distance", - "microsoft/pxt-jacdac/dmx", - "microsoft/pxt-jacdac/dot-matrix", - "microsoft/pxt-jacdac/dual-motors", - "microsoft/pxt-jacdac/e-co2", - "microsoft/pxt-jacdac/flex", - "microsoft/pxt-jacdac/gamepad", - "microsoft/pxt-jacdac/gyroscope", - "microsoft/pxt-jacdac/heart-rate", - "microsoft/pxt-jacdac/hid-joystick", - "microsoft/pxt-jacdac/hid-keyboard", - "microsoft/pxt-jacdac/hid-mouse", - "microsoft/pxt-jacdac/humidity", - "microsoft/pxt-jacdac/illuminance", - "microsoft/pxt-jacdac/led", - "microsoft/pxt-jacdac/led-single", - "microsoft/pxt-jacdac/led-strip", - "microsoft/pxt-jacdac/light-bulb", - "microsoft/pxt-jacdac/light-level", - "microsoft/pxt-jacdac/magnetic-field-level", - "microsoft/pxt-jacdac/magnetometer", - "microsoft/pxt-jacdac/model-runner", - "microsoft/pxt-jacdac/motion", - "microsoft/pxt-jacdac/motor", - "microsoft/pxt-jacdac/multitouch", - "microsoft/pxt-jacdac/potentiometer", - "microsoft/pxt-jacdac/power", - "microsoft/pxt-jacdac/pulse-oximeter", - "microsoft/pxt-jacdac/rain-gauge", - "microsoft/pxt-jacdac/real-time-clock", - "microsoft/pxt-jacdac/reflected-light", - "microsoft/pxt-jacdac/relay", - "microsoft/pxt-jacdac/rng", - "microsoft/pxt-jacdac/rotary-encoder", - "microsoft/pxt-jacdac/sensor-aggregator", - "microsoft/pxt-jacdac/servo", - "microsoft/pxt-jacdac/seven-segment-display", - "microsoft/pxt-jacdac/soil-moisture", - "microsoft/pxt-jacdac/solenoid", - "microsoft/pxt-jacdac/sound-level", - "microsoft/pxt-jacdac/speech-synthesis", - "microsoft/pxt-jacdac/switch", - "microsoft/pxt-jacdac/tcp", - "microsoft/pxt-jacdac/temperature", - "microsoft/pxt-jacdac/traffic-light", - "microsoft/pxt-jacdac/tvoc", - "microsoft/pxt-jacdac/uv-index", - "microsoft/pxt-jacdac/vibration-motor", - "microsoft/pxt-jacdac/water-level", - "microsoft/pxt-jacdac/weight-scale", - "microsoft/pxt-jacdac/wifi", - "microsoft/pxt-jacdac/wind-direction", - "microsoft/pxt-jacdac/wind-speed", - "calliope-net/i2c-liste", - "tinkertanker/pxt-alphanumeric-ht16k33", - "tinkertanker/pxt-continuous-servo", - "tinkertanker/pxt-iot-environment-kit", - "tinkertanker/pxt-ir-receiver", - "tinkertanker/pxt-oled-ssd1306", - "tinkertanker/pxt-range-vl53l0x", - "tinkertanker/pxt-realtimeclock-ds1307", - "tinkertanker/pxt-rotary-encoder-ky040", - "tinkertanker/pxt-smarthome", - "tinkertanker/pxt-tinkercademy-tinker-kit", - "alankrantas/pxt-dht11_dht22", - "alankrantas/pxt-esp8266_thingspeak", - "assirati/pxt-inventura", - "calliope-edu/co2-sensor-scd40", - "calliope-edu/pxt-hm3301_dust_sensor", - "calliope-edu/pxt-scd30", - "calliope-edu/pxt-tcs34725fn", - "calliope-edu/pxt-display", - "calliope-edu/pxt-grove", - "calliope-edu/pxt-rgblcd", - "calliope-edu/pxt-power", - "calliope-edu/pxt-sunlightsensor-si1151", - "calliope-edu/pxt-sunlightsensor-si1145", - "calliope-edu/pxt-ki-in-schulen", - "tinysuperlab/motionkitv2", - "tinysuperlab/motionkit", - "tinysuperlab/touchkit", - "cgs-matthew-pham/pxt-hitechnic-irseeker-v2", - "jcubuntu/pxt-ikb1", - "jdarling/pxt-pca9685", - "keigan-motor/pxt-keiganmotor", - "letstalkscience/pxt-cozir", - "lwchkg/pxt-proportional-font", - "makecode-extensions/apds9930", - "makecode-extensions/at24xx", - "makecode-extensions/bh1750", - "makecode-extensions/bme280", - "makecode-extensions/bmp180", - "makecode-extensions/bmp280", - "makecode-extensions/ds1302", - "makecode-extensions/ds1307", - "makecode-extensions/hts221", - "makecode-extensions/lis2dw12", - "makecode-extensions/lis2mdl", - "makecode-extensions/lps22", - "makecode-extensions/lsm6dso", - "makecode-extensions/ntc", - "makecode-extensions/oled12864_i2c", - "makecode-extensions/stts751", - "makecode-extensions/scrolltext", - "makecode-extensions/tm1637", - "makecode-extensions/tm1650", - "makecode-extensions/whaleysansfont", - "makecode-extensions/i2clcd1602", - "monkmakes/pxt-sensor", - "mu-opensource/pxt-muvision", - "pizayanz/pxt-linebeacon", - "rebeccaclavier/pxt-bmp280", - "sparkfun/pxt-gator-environment", - "sparkfun/pxt-gator-light", - "sparkfun/pxt-gator-microphone", - "sparkfun/pxt-gator-particle", - "sparkfun/pxt-gator-soil", - "sparkfun/pxt-gator-temp", - "vengit/pxt-sbrick", - "callitgs3/pxt-calliope-grovepcf85063tp", - "calliope-net/i2c-liste", - "calliope-edu/pxt-storage", - "MKleinSB/pxt-calliope-jacdac", - "calliope-edu/warte-bis", - "joernalraun/mkcd-ml-machine", - "wappsto/pxt-wappsto" - ], - "preferredRepos": [ - "calliope-edu/co2-sensor-scd40", - "calliope-edu/pxt-hm3301_dust_sensor", - "calliope-edu/pxt-tcs34725fn", - "calliope-edu/pxt-display", - "calliope-edu/pxt-grove", - "calliope-edu/pxt-rgblcd", - "calliope-edu/pxt-power", - "calliope-edu/pxt-sunlightsensor-si1151", - "calliope-edu/pxt-sunlightsensor-si1145", - "calliope-mini/pxt-scd30", - "tinysuperlab/motionkitv2", - "tinysuperlab/motionkit", - "tinysuperlab/touchkit", - "mkleinsb/pxt-ky-040", - "mkleinsb/pxt-max7219_8x8", - "mkleinsb/pxt-oled-ssd1306", - "mkleinsb/pxt-oledpaint", - "mkleinsb/pxt-callibot", - "mkleinsb/pxt-callicolor", - "mkleinsb/pxt-callicross", - "mkleinsb/pxt-callimotor", - "mkleinsb/pxt-calliope-buttons", - "mkleinsb/pxt-co2oled", - "mkleinsb/pxt-dht11", - "mkleinsb/pxt-esp-thingspeak", - "mkleinsb/pxt-gatorlog-calliope", - "mkleinsb/pxt-huskylens", - "mkleinsb/pxt-kitronik-zip-tile-calliope", - "mkleinsb/pxt-mpr121", - "mkleinsb/pxt-pca9685", - "mkleinsb/pxt-seeed-temperature", - "mkleinsb/pxt-serialmp3", - "mkleinsb/pxt-motor-jacdac", - "calliope-edu/pxt-ki-in-schulen", - "microsoft/pxt-microturtle", - "microsoft/pxt-neopixel", - "calliope-edu/pxt-faces", - "calliope-net/i2c-liste", - "calliope-edu/pxt-storage", - "calliope-edu/warte-bis", - "wappsto/pxt-wappsto" - ], "approvedRepoLib": { "calliope-edu/co2-sensor-scd40": { "tags": [ @@ -846,6 +583,22 @@ "Workbook": "calliope/arbeitsheft", "Calliope Links": "calliope/links" }, + "teachertool": { + "carousels": [ + { + "title": "Checklists for Tutorials", + "cardsUrl": "teachertool/carousels/checklists-for-tutorials/cards.json" + }, + { + "title": "Checklists for V2 Tutorials", + "cardsUrl": "teachertool/carousels/checklists-for-tutorials-v2/cards.json" + }, + { + "title": "Checklists for Games", + "cardsUrl": "teachertool/carousels/checklists-for-games/cards.json" + } + ] + }, "electronManifest": { "latest": "v6.0.15" } diff --git a/theme/style.less b/theme/style.less index 9d76b9531..c976f3b2c 100644 --- a/theme/style.less +++ b/theme/style.less @@ -1,6 +1,7 @@ /* Import all components */ @import 'pxtsemantic'; @import 'pxt'; +@import 'themepacks'; @import 'blockly-toolbox'; @import 'themes/default/globals/site.variables'; @import 'themes/pxt/globals/site.variables'; diff --git a/theme/themepacks.less b/theme/themepacks.less new file mode 100644 index 000000000..03c344080 --- /dev/null +++ b/theme/themepacks.less @@ -0,0 +1,82 @@ +/***************************************** + Theme overrides + source vars: pxt/theme/themepacks.less +******************************************/ + +@pxt_page_foreground_light: #767676; + +@pxt_headerbar_background: @blue; +@pxt_headerbar_background_glass: rgba(@pxt_headerbar_background, 0.25); +@pxt_headerbar_foreground: @white; +@pxt_headerbar_accent: darken(@pxt_headerbar_background, 8%); +@pxt_headerbar_accent_smoke: lighten(desaturate(@pxt_headerbar_background, 40%), 18%); + +@pxt_content_background: #E4E7F1; +@pxt_content_background_glass: rgba(@pxt_content_background, 0.25); +@pxt_content_foreground: @blue; +@pxt_content_accent: darken(@pxt_content_background, 8%); +@pxt_content_secondary_foreground: #666666; + +@pxt_button_primary_background: @primaryColor; +@pxt_button_primary_background_glass: rgba(@pxt_button_primary_background, 0.25); +@pxt_button_primary_foreground: @buttonTextColorDarkBackground; +@pxt_button_primary_accent: lighten(@pxt_button_primary_background, 8%); + +@pxt_button_secondary_background: @secondaryColor; +@pxt_button_secondary_background_glass: rgba(@pxt_button_primary_background, 0.25); +@pxt_button_secondary_foreground: @buttonTextColorDarkBackground; +@pxt_button_secondary_accent: lighten(@pxt_button_secondary_background, 8%); + +@pxt_success: #3AFFB3; +@pxt_info: #3ADCFF; +@pxt_warning: #FFD43A; +@pxt_error: #FF3A54; +@pxt_success_background: lighten(desaturate(@pxt_success, 40%), 10%); +@pxt_info_background: lighten(desaturate(@pxt_info, 40%), 10%); +@pxt_warning_background: lighten(desaturate(@pxt_warning, 40%), 10%); +@pxt_error_background: lighten(desaturate(@pxt_error, 40%), 10%); +@pxt_success_accent: darken(@pxt_success_background, 30%); +@pxt_info_accent: darken(@pxt_info_background, 30%); +@pxt_warning_accent: darken(@pxt_warning_background, 30%); +@pxt_error_accent: darken(@pxt_error_background, 20%); + +:root { + /// Page + --pxt-page-font: @pageFont; + --pxt-page-foreground-light: @pxt_page_foreground_light; + /// Header bar + --pxt-headerbar-background: @pxt_headerbar_background; + --pxt-headerbar-background-glass: @pxt_headerbar_background_glass; + --pxt-headerbar-foreground: @pxt_headerbar_foreground; + --pxt-headerbar-accent: @pxt_headerbar_accent; + --pxt-headerbar-accent-smoke: @pxt_headerbar_accent_smoke; + /// Content area + --pxt-content-background: @pxt_content_background; + --pxt-content-background-glass: @pxt_content_background_glass; + --pxt-content-foreground: @pxt_content_foreground; + --pxt-content-accent: @pxt_content_accent; + --pxt-content-secondary-foreground: @pxt_content_secondary_foreground; + /// Primary button + --pxt-button-primary-background: @pxt_button_primary_background; + --pxt-button-primary-background-glass: @pxt_button_primary_background_glass; + --pxt-button-primary-foreground: @pxt_button_primary_foreground; + --pxt-button-primary-accent: @pxt_button_primary_accent; + /// Secondary button + --pxt-button-secondary-background: @pxt_button_secondary_background; + --pxt-button-secondary-background-glass: @pxt_button_secondary_background_glass; + --pxt-button-secondary-foreground: @pxt_button_secondary_foreground; + --pxt-button-secondary-accent: @pxt_button_secondary_accent; + /// Status colors + --pxt-success: @pxt_success; + --pxt-info: @pxt_info; + --pxt-warning: @pxt_warning; + --pxt-error: @pxt_error; + --pxt-success-background: @pxt_success_background; + --pxt-info-background: @pxt_info_background; + --pxt-warning-background: @pxt_warning_background; + --pxt-error-background: @pxt_error_background; + --pxt-success-accent: @pxt_success_accent; + --pxt-info-accent: @pxt_info_accent; + --pxt-warning-accent: @pxt_warning_accent; + --pxt-error-accent: @pxt_error_accent; +}