- Diagrammix 2 1 0 – Build Better Diagrams Faster Speed
- Diagrammix 2 1 0 – Build Better Diagrams Faster Speed Of Light
The Join Diagram tab shows the underlying tables even when complex and nested views are involved. You can quickly visualize the relationship between tables involved in the plan and easily reorganize the layout using drag-and-drop functionality.
- 10, 2005 - StarUML 5.0 Roadmap Replanned StarUML 5.0 roadmap is replanned for more test and feedbacks to get better stability. 1, 2005 - StarUML 5.0 Beta released StarUML 5.0 Beta is released and official site is launched.
- Diagrammix for Mac OS X demo. Fast and easy to use diagram tool. See for details. See also https://www.
The primary difference and reasons for updating the Windows Subsystem for Linux from WSL 1 to WSL 2 are to:
- increase file system performance,
- support full system call compatibility.
WSL 2 uses the latest and greatest in virtualization technology to run a Linux kernel inside of a lightweight utility virtual machine (VM). However, WSL 2 is not a traditional VM experience.
Comparing features
Feature | WSL 1 | WSL 2 |
---|---|---|
Integration between Windows and Linux | ✅ | ✅ |
Fast boot times | ✅ | ✅ |
Small resource foot print | ✅ | ✅ |
Runs with current versions of VMware and VirtualBox | ✅ | ✅ |
Managed VM | ❌ | ✅ |
Full Linux Kernel | ❌ | ✅ |
Full system call compatibility | ❌ | ✅ |
Performance across OS file systems | ✅ | ❌ |
As you can tell from the comparison table above, the WSL 2 architecture outperforms WSL 1 in several ways, with the exception of performance across OS file systems.
Performance across OS file systems
We recommend against working across operating systems with your files, unless you have a specific reason for doing so. For the fastest performance speed, store your files in the WSL file system if you are working in a Linux command line (Ubuntu, OpenSUSE, etc). If you're working in a Windows command line (PowerShell, Command Prompt), store your files in the Windows file system.
For example, when storing your WSL project files:
- Use the Linux file system root directory:
wsl$Ubuntu-18.04home<user name>Project
- Not the Windows file system root directory:
C:Users<user name>Project
All currently running distributions (
wsl -l
) are accessible via network connection. To get there run a command [WIN+R] (keyboard shortcut) or type in File Explorer address bar wsl$
to find respective distribution names and access their root file systems.You can also use windows commands inside WSL's Linux Terminal. Try opening a Linux distribution (ie Ubuntu), be sure that you are in the Linux home directory by entering this command:
cd ~
. Then open your Linux file system in File Explorer by entering (don't forget the period at the end): powershell.exe /c start .
Important
If you experience an error -bash: powershell.exe: command not found please refer to the WSL troubleshooting page to resolve it.
WSL 2 is only available in Windows 10, Version 1903, Build 18362 or higher. Check your Windows version by selecting the Windows logo key + R, type winver, select OK. (Or enter the
ver
command in Windows Command Prompt). You may need to update to the latest Windows version. For builds lower than 18362, WSL is not supported at all.Note
WSL 2 will work with VMware 15.5.5+ and VirtualBox 6+. Learn more in our WSL 2 FAQs.
What's new in WSL 2
WSL 2 is a major overhaul of the underlying architecture and uses virtualization technology and a Linux kernel to enable new features. The primary goals of this update are to increase file system performance and add full system call compatibility.
WSL 2 architecture
A traditional VM experience can be slow to boot up, is isolated, consumes a lot of resources, and requires your time to manage it. WSL 2 does not have these attributes.
WSL 2 provides the benefits of WSL 1, including seamless integration between Windows and Linux, fast boot times, a small resource footprint, and requires no VM configuration or management. While WSL 2 does use a VM, it is managed and run behind the scenes, leaving you with the same user experience as WSL 1.
Full Linux kernel
The Linux kernel in WSL 2 is built by Microsoft from the latest stable branch, based on the source available at kernel.org. This kernel has been specially tuned for WSL 2, optimizing for size and performance to provide an amazing Linux experience on Windows. The kernel will be serviced by Windows updates, which means you will get the latest security fixes and kernel improvements without needing to manage it yourself.
The WSL 2 Linux kernel is open source. If you'd like to learn more, check out the blog post Shipping a Linux Kernel with Windows written by the team that built it.
Increased file IO performance
File intensive operations like git clone, npm install, apt update, apt upgrade, and more are all noticeably faster with WSL 2.
The actual speed increase will depend on which app you're running and how it is interacting with the file system. Initial versions of WSL 2 run up to 20x faster compared to WSL 1 when unpacking a zipped tarball, and around 2-5x faster when using git clone, npm install and cmake on various projects.
Full system call compatibility
Diagrammix 2 1 0 – Build Better Diagrams Faster Speed
Linux binaries use system calls to perform functions such as accessing files, requesting memory, creating processes, and more. Whereas WSL 1 used a translation layer that was built by the WSL team, WSL 2 includes its own Linux kernel with full system call compatibility. Benefits include:
- A whole new set of apps that you can run inside of WSL, such as Docker and more.
- Any updates to the Linux kernel are immediately ready for use. (You don't have to wait for the WSL team to implement updates and add the changes).
WSL 2 uses a smaller amount of memory on startup
WSL 2 uses a lightweight utility VM on a real Linux kernel with a small memory footprint. The utility will allocate Virtual Address backed memory on startup. It is configured to start with a smaller proportion of your total memory that what was required for WSL 1.
Exceptions for using WSL 1 rather than WSL 2
We recommend that you use WSL 2 as it offers faster performance and 100% system call compatibility. However, there are a few specific scenarios where you might prefer using WSL 1. Consider using WSL 1 if:
- Your project files must be stored in the Windows file system. WSL 1 offers faster access to files mounted from Windows.
- If you will be using your WSL Linux distribution to access project files on the Windows file system, and these files cannot be stored on the Linux file system, you will achieve faster performance across the OS files systems by using WSL 1.
- A project which requires cross-compilation using both Windows and Linux tools on the same files.
- File performance across the Windows and Linux operating systems is faster in WSL 1 than WSL 2, so if you are using Windows applications to access Linux files, you will currently achieve faster performance with WSL 1.
Note
Consider trying the VS Code Remote WSL Extension to enable you to store your project files on the Linux file system, using Linux command line tools, but also using VS Code on Windows to author, edit, debug, or run your project in an internet browser without any of the performance slow-downs associated with working across the Linux and Windows file systems. Learn more.
Accessing network applications
Accessing Linux networking apps from Windows (localhost)
If you are building a networking app (for example an app running on a NodeJS or SQL server) in your Linux distribution, you can access it from a Windows app (like your Edge or Chrome internet browser) using
localhost
(just like you normally would).However, if you are running an older version of Windows (Build 18945 or less), you will need to get the IP address of the Linux host VM (or update to the latest Windows version).
To find the IP address of the virtual machine powering your Linux distribution:
- From your WSL distribution (ie Ubuntu), run the command:
ip addr
- Find and copy the address under the
inet
value of theeth0
interface. - If you have the grep tool installed, find this more easily by filtering the output with the command:
ip addr | grep eth0
- Connect to your Linux server using this IP address.
The picture below shows an example of this by connecting to a Node.js server using the Edge browser.
Accessing Windows networking apps from Linux (host IP)
If you want to access a networking app running on Windows (for example an app running on a NodeJS or SQL server) from your Linux distribution (ie Ubuntu), then you need to use the IP address of your host machine. While this is not a common scenario, you can follow these steps to make it work.- Obtain the IP address of your host machine by running this command from your Linux distribution:
cat /etc/resolv.conf
- Copy the IP address following the term: nameserver
.- Connect to any Windows server using the copied IP address.The picture below shows an example of this by connecting to a Node.js server running in Windows via curl.
Additional networking considerations
Connecting via remote IP addresses
When using remote IP addresses to connect to your applications, they will be treated as connections from the Local Area Network (LAN). This means that you will need to make sure your application can accept LAN connections.
For example, you may need to bind your application to
0.0.0.0
instead of 127.0.0.1
. In the example of a Python app using Flask, this can be done with the command: app.run(host='0.0.0.0')
. Please keep security in mind when making these changes as this will allow connections from your LAN.Accessing a WSL 2 distribution from your local area network (LAN)
When using a WSL 1 distribution, if your computer was set up to be accessed by your LAN, then applications run in WSL could be accessed on your LAN as well.
This isn't the default case in WSL 2. WSL 2 has a virtualized ethernet adapter with its own unique IP address. Currently, to enable this workflow you will need to go through the same steps as you would for a regular virtual machine. (We are looking into ways to improve this experience.)
Here's an example PowerShell command to add a port proxy that listens on port 4000 on the host and connects it to port 4000 to the WSL 2 VM with IP address 192.168.101.100.
IPv6 access
WSL 2 distributions currently cannot reach IPv6-only addresses. We are working on adding this feature.
Expanding the size of your WSL 2 Virtual Hard Disk
WSL 2 uses a Virtual Hard Disk (VHD) to store your Linux files. In WSL 2, a VHD is represented on your Windows hard drive as a .vhdx file.
The WSL 2 VHD uses the ext4 file system. This VHD automatically resizes to meet your storage needs and has an initial maximum size of 256GB. If the storage space required by your Linux files exceeds this size you may need to expand it. If your distribution grows in size to be greater than 256GB, you will see errors stating that you've run out of disk space. You can fix this error by expanding the VHD size.
To expand your maximum VHD size beyond 256GB:
- Terminate all WSL instances using the command:
wsl --shutdown
- Find your distribution installation package name ('PackageFamilyName')
- Using PowerShell (where 'distro' is your distribution name) enter the command:
Get-AppxPackage -Name '*<distro>*' | Select PackageFamilyName
- Locate the VHD file
fullpath
used by your WSL 2 installation, this will be yourpathToVHD
:%LOCALAPPDATA%Packages<PackageFamilyName>LocalState<disk>.vhdx
- Resize your WSL 2 VHD by completing the following commands:
- Open Windows Command Prompt with admin privileges and enter:
- Examine the output of the detail command. The output will include a value for Virtual size. This is the current maximum. Convert this value to megabytes. The new value after resizing must be greater than this value. For example, if the detail output shows Virtual size: 256 GB, then you must specify a value greater than 256000. Once you have your new size in megabytes, enter the following command in diskpart:
- Exit diskpart
- Launch your WSL distribution (Ubuntu, for example).
- Make WSL aware that it can expand its file system's size by running these commands from your Linux distribution command line.NoteYou may see this message in response to the first mount command: /dev: none already mounted on /dev. This message can safely be ignored.Copy the name of this entry, which will look like:
/dev/sdX
(with the X representing any other character). In the following example the value of X is b:NoteYou may need to install resize2fs. If so, you can use this command to install it:sudo apt install resize2fs
.The output will look similar to the following:
Note
In general do not modify, move, or access the WSL related files located inside of your AppData folder using Windows tools or editors. Doing so could cause your Linux distribution to become corrupted.
Sine waves confused me. Yes, I can mumble 'SOH CAH TOA' and draw lines within triangles. But what does it mean?
I was stuck thinking sine had to be extracted from other shapes. A quick analogy:
You: Geometry is about shapes, lines, and so on.
Alien: Oh? Can you show me a line?
You (looking around): Uh.. see that brick, there? A line is one edge of that brick.
Alien: So lines are part of a shape?
You: Sort of. Yes, most shapes have lines in them. But a line is a basic concept on its own: a beam of light, a route on a map, or even--
Alien: Bricks have lines. Lines come from bricks. Bricks bricks bricks.
Most math classes are exactly this. 'Circles have sine. Sine comes from circles. Circles circles circles.'
Argh! No - circles are one example of sine. In a sentence: Sine is a natural sway, the epitome of smoothness: it makes circles 'circular' in the same way lines make squares 'square'.
Let's build our intuition by seeing sine as its own shape, and then understand how it fits into circles and the like. Onward!
Sine vs Lines
Remember to separate an idea from an example: squares are examples of lines. Sine clicked when it became its own idea, not 'part of a circle.'
Let's observe sine in a simulator (Email readers, you may need to open the article directly):
Hubert will give the tour:
- Click start. Go, Hubert go! Notice that smooth back and forth motion? That's Hubert, but more importantly (sorry Hubert), that's sine! It's natural, the way springs bounce, pendulums swing, strings vibrate.. and many things move.
- Change 'vertical' to 'linear'. Big difference -- see how the motion gets constant and robotic, like a game of pong?
Let's explore the differences with video:
- Linear motion is constant: we go a set speed and turn around instantly. It's the unnatural motion in the robot dance (notice the linear bounce with no slowdown vs. the strobing effect).
- Sine changes its speed: it starts fast, slows down, stops, and speeds up again. It's the enchanting smoothness in liquid dancing (human sine wave and natural bounce).
Unfortunately, textbooks don't show sine with animations or dancing. Gemini 2: the duplicate finder 2 0 8. No, they prefer to introduce sine with a timeline (try setting 'horizontal' to 'timeline'):
(source)
Egads. This is the schematic diagram we've always been shown. Does it give you the feeling of sine? Not any more than a skeleton portrays the agility of a cat. Let's watch sine move and then chart its course.
The Unavoidable Circle
Circles have sine. Yes. But seeing the sine inside a circle is like getting the eggs back out of the omelette. It's all mixed together!
Let's take it slow. In the simulation, set Hubert to vertical:none and horizontal: sine*. See him wiggle sideways? That's the motion of sine. There's a small tweak: normally sine starts the cycle at the neutral midpoint and races to the max. This time, we start at the max and fall towards the midpoint. Sine that 'starts at the max' is called cosine, and it's just a version of sine (like a horizontal line is a version of a vertical line).
Ok. Time for both sine waves: put vertical as 'sine' and horizontal as 'sine*'. And.. we have a circle!
A horizontal and vertical 'spring' combine to give circular motion. Most textbooks draw the circle and try to extract the sine, but I prefer to build up: start with pure horizontal or vertical motion and add in the other.
Quick Q & A
A few insights I missed when first learning sine:
Sine really is 1-dimensional
Sine wiggles in one dimension. Really. We often graph sine over time (so we don't write over ourselves) and sometimes the 'thing' doing sine is also moving, but this is optional! A spring in one dimension is a perfectly happy sine wave.
(Source: Wikipedia, try not to get hypnotized.)
Circles are an example of two sine waves
Circles and squares are a combination of basic components (sines and lines). The circle is made from two connected 1-d waves, each moving the horizontal and vertical direction.
(Source http://1ucasvb.tumblr.com/)
But remember, circles aren't the origin of sines any more than squares are the origin of lines. They're examples, not the source.
What do the values of sine mean?
Sine cycles between -1 and 1. It starts at 0, grows to 1.0 (max), dives to -1.0 (min) and returns to neutral. I also see sine like a percentage, from 100% (full steam ahead) to -100% (full retreat).
What's is the input 'x' in sin(x)?
Tricky question. Sine is a cycle and x, the input, is how far along we are in the cycle.
Let's look at lines:
- You're traveling on a square. Each side takes 10 seconds.
- After 1 second, you are 10% complete on that side
- After 5 seconds, you are 50% complete
- After 10 seconds, you finished the side
Linear motion has few surprises. Now for sine (focusing on the '0 to max' cycle):
- We're traveling on a sine wave, from 0 (neutral) to 1.0 (max). This portion takes 10 seconds.
- After 5 seconds we are.. 70% complete! Sine rockets out of the gate and slows down. Most of the gains are in the first 5 seconds
- It takes 5 more seconds to get from 70% to 100%. And going from 98% to 100% takes almost a full second!
Despite our initial speed, sine slows so we gently kiss the max value before turning around. This smoothness makes sine, sine.
For the geeks: Press 'show stats' in the simulation. You'll see the percent complete of the total cycle, mini-cycle (0 to 1.0), and the value attained so far. Stop, step through, and switch between linear and sine motion to see the values.
Quick quiz: What's further along, 10% of a linear cycle, or 10% of a sine cycle? Sine. Remember, it barrels out of the gate at max speed. By the time sine hits 50% of the cycle, it's moving at the average speed of linear cycle, and beyond that, it goes slower (until it reaches the max and turns around).
So x is the 'amount of your cycle'. What's the cycle?
It depends on the context.
- Basic trig: 'x' is degrees, and a full cycle is 360 degrees
- Advanced trig: 'x' is radians (they are more natural!), and a full cycle is going around the unit circle (2*pi radians)
Play with values of x here:
But again, cycles depend on circles! Can we escape their tyranny?
Pi without Pictures
Imagine a sightless alien who only notices shades of light and dark. Could you describe pi to it? It's hard to flicker the idea of a circle's circumference, right?
Let's step back a bit. Sine is a repeating pattern, which means it must.. repeat! It goes from 0, to 1, to 0, to -1, to 0, and so on.
Let's define pi as the time sine takes from 0 to 1 and back to 0. Whoa! Now we're using pi without a circle too! Pi is a concept that just happens to show up in circles:
- Sine is a gentle back and forth rocking
- Pi is the time from neutral to max and back to neutral
- n * Pi (0 * Pi, 1 * pi, 2 * pi, and so on) are the times you are at neutral
- 2 * Pi, 4 * pi, 6 * pi, etc. are full cycles
Aha! That is why pi appears in so many formulas! Pi doesn't 'belong' to circles any more than 0 and 1 do -- pi is about sine returning to center! A circle is an example of a shape that repeats and returns to center every 2*pi units. But springs, vibrations, etc. return to center after pi too!
Question: If pi is half of a natural cycle, why isn't it a clean, simple number?
Let's answer a question with a question. Why does a 1x1 square have a diagonal of length $sqrt{2} = 1.414..$ (an irrational number)?
It's philosophically inconvenient when nature doesn't line up with our number system. I don't have a good intuition. My hunch is simple rules (1x1 square + Pythagorean Theorem) can still lead to complex outcomes.
How fast is sine?
I've been tricky. Previously, I said 'imagine it takes sine 10 seconds from 0 to max'. And now it's pi seconds from 0 to max back to 0? What gives?
- sin(x) is the default, off-the-shelf sine wave, that indeed takes pi units of time from 0 to max to 0 (or 2*pi for a complete cycle)
- sin(2x) is a wave that moves twice as fast
- sin(x/2) is a wave that moves twice as slow
So, we use sin(n*x) to get a sine wave cycling as fast as we need. Often, the phrase 'sine wave' is referencing the general shape and not a specific speed.
Part 2: Understanding the definitions of sine
That's a brainful -- take a break if you need it. Hopefully, sine is emerging as its own pattern. Now let's develop our intuition by seeing how common definitions of sine connect.
Definition 1: The height of a triangle / circle!
Sine was first found in triangles. You may remember 'SOH CAH TOA' as a mnemonic
- SOH: Sine is Opposite / Hypotenuse
- CAH: Cosine is Adjacent / Hypotenuse
- TOA: Tangent is Opposite / Adjacent
For a right triangle with angle x, sin(x) is the length of the opposite side divided by the hypotenuse. If we make the hypotenuse 1, we can simplify to:
- Sine = Opposite
- Cosine = Adjacent
And with more cleverness, we can draw our triangles with hypotenuse 1 in a circle with radius 1:
Voila! A circle containing all possible right triangles (since they can be scaled up using similarity). For example:
- sin(45) = .707
- Lay down a 10-foot pole and raise it 45 degrees. It is 10 * sin(45) = 7.07 feet off the ground
- An 8-foot pole would be 8 * sin(45) = 5.65 feet
These direct manipulations are great for construction (the pyramids won't calculate themselves). Unfortunately, after thousands of years we start thinking the meaning of sine is the height of a triangle. No no, it's a shape that shows up in circles (and triangles).
Realistically, for many problems we go into 'geometry mode' and start thinking 'sine = height' to speed through things. That's fine -- just don't get stuck there.
Definition 2: The infinite series
I've avoided the elephant in the room: how in blazes do we actually calculate sine!? Is my calculator drawing a circle and measuring it?
Glad to rile you up. Here's the circle-less secret of sine:
Sine is acceleration opposite to your current position
Using our bank account metaphor: Imagine a perverse boss who gives you a raise the exact opposite of your current bank account! If you have $50 in the bank, then your raise next week is $50. Of course, your income might be $75/week, so you'll still be earning some money $75 - $50 for that week), but eventually your balance will decrease as the 'raises' overpower your income.
But never fear! Once your account hits negative (say you're at $50), then your boss gives a legit $50/week raise. Again, your income might be negative, but eventually the raises will overpower it.
This constant pull towards the center keeps the cycle going: when you rise up, the 'pull' conspires to pull you in again. It also explains why neutral is the max speed for sine: If you are at the max, you begin falling and accumulating more and more 'negative raises' as you plummet. As you pass through then neutral point you are feeling all the negative raises possible (once you cross, you'll start getting positive raises and slowing down).
By the way: since sine is acceleration opposite to your current position, and a circle is made up of a horizontal and vertical sine.. you got it! Circular motion can be described as 'a constant pull opposite your current position, towards your horizontal and vertical center'.
Geeking Out With Calculus
Let's describe sine with calculus. Like e, we can break sine into smaller effects:
- Start at 0 and grow at unit speed
- At every instant, get pulled back by negative acceleration
How should we think about this? See how each effect above changes our distance from center:
- Our initial kick increases distance linearly: y (distance from center) = x (time taken)
- At any moment, we feel a restoring force of -x. We integrate twice to turn negative acceleration into distance:
Seeing how acceleration impacts distance is like seeing how a raise hits your bank account. The 'raise' must change your income, and your income changes your bank account (two integrals 'up the chain').
So, after 'x' seconds we might guess that sine is 'x' (initial impulse) minus x^3/3! (effect of the acceleration):
Something's wrong -- sine doesn't nosedive! With e, we saw that 'interest earns interest' and sine is similar. The 'restoring force' changes our distance by -x^3/3!, which creates another restoring force to consider. Consider a spring: the pull that yanks you down goes too far, which shoots you downward and creates another pull to bring you up (which again goes too far). Springs are crazy!
We need to consider every restoring force:
- y = x is our initial motion, which creates a restoring force of impact..
- y = -x^3/3!, which creates a restoring force of impact..
- y = x^5/5!, which creates a restoring force of impact..
- y = -x^7/7! which creates a restoring force of impact..
Just like e, sine can be described with an infinite series:
I saw this formula a lot, but it only clicked when I saw sine as a combination of an initial impulse and restoring forces. The initial push (y = x, going positive) is eventually overcome by a restoring force (which pulls us negative), which is overpowered by its own restoring force (which pulls us positive), and so on.
Diagrammix 2 1 0 – Build Better Diagrams Faster Speed Of Light
A few fun notes:
- Consider the 'restoring force' like 'positive or negative interest'. This makes the sine/e connection in Euler's formula easier to understand. Sine is like e, except sometimes it earns negative interest. There's more to learn here :).
- For very small angles, 'y = x' is a good guess for sine. We just take the initial impulse and ignore any restoring forces.
The Calculus of Cosine
Cosine is just a shifted sine, and is fun (yes!) now that we understand sine:
- Sine: Start at 0, initial impulse of y = x (100%)
- Cosine: Start at 1, no initial impulse
So cosine just starts off.. sitting there at 1. We let the restoring force do the work:
Again, we integrate -1 twice to get -x^2/2!. But this kicks off another restoring force, which kicks off another, and before you know it:
Definition 3: The differential equation
We've described sine's behavior with specific equations. A more succinct way (equation):
This beauty says:
- Our current position is y
- Our acceleration (2nd derivative, or y') is the opposite of our current position (-y)
Both sine and cosine make this true. I first hated this definition; it's so divorced from a visualization. I didn't realize it described the essence of sine, 'acceleration opposite your position'.
And remember how sine and e are connected? Well, e^x can be be described by (equation):
The same equation with a positive sign ('acceleration equal to your position')! When sine is 'the height of a circle' it's really hard to make the connection to e.
One of my great mathematical regrets is not learning differential equations. But I want to, and I suspect having an intuition for sine and e will be crucial.
Summing it up
The goal is to move sine from some mathematical trivia ('part of a circle') to its own shape:
- Sine is a smooth, swaying motion between min (-1) and max (1). Mathematically, you're accelerating opposite your position. This 'negative interest' keeps sine rocking forever.
- Sine happens to appear in circles and triangles (and springs, pendulums, vibrations, sound..).
- Pi is the time from neutral to neutral in sin(x). Similarly, pi doesn't 'belong' to circles, it just happens to show up there.
Let sine enter your mental toolbox (Hrm, I need a formula to make smooth changes..). Eventually, we'll understand the foundations intuitively (e, pi, radians, imaginaries, sine..) and they can be mixed into a scrumptious math salad. Enjoy!
Appendix
Using this approach, Alistair MacDonald made a great tutorial with code to build your own sine and cosine functions.
Join Over 450k Monthly Readers
Enjoy the article? There's plenty more to help you build a lasting, intuitive understanding of math. Join the newsletter for bonus content and the latest updates.