Installing Arch Linux on VMware Workstation

Before you begin

To install Workstation Player 14, VMware recommends(Vmware, n.d.) that you have the following: 1. An Intel CPU with VT-x support or an AMD CPU with AMD-V support. 2. 2 GB of RAM (4 GB or higher recommended) 3. A 16- or 32-bit display adapter 4. At least 1 GB of hard drive space

A list of these requirements can be found at the VMware Docs site.

To install Arch Linux, you must have an x64_86-compatible PC with at least 512MB of RAM and 800 MB of disk space available(Dario Giova, n.d.). Oh, and an active internet connection.

Getting VMware Workstation Player

To download VMware Workstation Player 14.1, visit my.vmware.com and click on the link to download. This will download the file in a .bundle package which must be installed from the command line. To run the installer in Linux, use the command

$sudo bash VMware-Player-*.x64_86.bundle

After this, an installer window will open asking if you accept their ToS/EULA. It will also ask for a path for system scripts, as well as a product key.

I installed VMware Workstation Player 14.1 on a system already running Arch Linux, and had to install vmware-patch to get player to detect my kernel.

Next we can get the Arch image.

Getting Arch Linux

To download the image file for installation, go to the Arch Linux Download page and select a mirror. (I chose the cat.pdx.edu mirror) Alternatively, you can download a torrent and get it from there, but don’t forget to seed.

Setting up your virtual machine

To set up your virtual machine, start VMware Workstation player and hit create a new virtual machine. You will be prompted to chose where to install the operating system from, so hit the “Use ISO image” radio button and point to the Arch .iso you just downloaded. Next, you select “Linux”" and “Other Linux 4.x Kernel” from the dropdown. You’ll be prompted to select a location to store your VM and then you will have to chose how big the hard drive you want. I went with the default 8 GB but you can use however much space you would like, provided you have the storage to do so. You can keep the default for virtual disk splitting selected and then hit next.

Finally, you will be brought to a window that says “Ready to Create Virtual Machine”, but we aren’t. Select “Customize Hardware” and a new window will pop up, shown below: Screenshot
Change the memory to the amount you want (remember, 512 MB is the bare minimum) and set the number of CPU to how many cores your host CPU has (if you are unsure, it’s okay to keep the value at 1). You can also click the Display tab and hit “3D Acceleration”.

Now you can hit close and finish the setup. Make sure you uncheck the “power on” selector before you finish, there’s one more step we need to accomplish before we get into things. Go to the folder that you selected to store your VM and open the xx.vmx file with a text editor (Don’t double click it!). We’re going to add the line

firmware = "efi"

to the very bottom of the file and then save it.

Now you’re ready to power on the system. You can double click the file you just edited, or open it through VMware workstation.

Installing Arch

Wait until the system loads the operating system splash screen, which will be similar to the one below:

Screenshot Select Boot Arch Linux (x64_86) and wait for the machine to load the installer from the .iso.

You will immediately be put into a command line interface. If this scares you, it shouldn’t. I will be here to guide you through the installation.

Type

$ ls /sys/firmware/efi/efivars

You can use tab completion after the first couple letters of each of the sub folders. If everything is done correctly, you should get an output similar to mine:

Screenshot
This means that you have EFI running. This is exactly what we want.

Next, we have to check that we have access to the internet. Type

$ ping -c www.google.com

If you don’t get any errors, you’re good to go.

Next, type

$ timedatectl set-ntp true

This will set the system clock.

Partitioning your hard disk

The next part will be a little finicky. Type

$ lsblk

and you will get an output like this: Screenshot

The drive that we want should be some form of sdX where X is a letter. In my case, it is sda. This is the drive we want to partition. Type

$ cfdisk /dev/sda

and you will be brought to a partition wizard.

Select gpt from the list (if asked) and then partition the hard drive. I like to have 4 seperate partions for an install:

  1. Boot partition, with 512MB
  2. Swap partition, which can very. An old rule of thumb is to use 2x the amount of RAM you have, so I chose 1GB
  3. Root partition, which can also very. I chose 3GB, but it is up to you. Depending on what you plan on using the vm for, you might want to go to as much as 1/3 of the disk space that you’re using.
  4. Home patition, which is just the leftover space.

Make sure that you select the proper filesystem types: Your boot partition should be Microsoft basic data, your swap should be Linux swap, and your home and root partitions should be Linux filesystem. You should have something like this when you’re done: Screenshot Don’t forget to hit Write before you quit. Now if you type

$ lsblk

you should see

Screenshot ### Mounting the filesystem Let’s mount the filesystem next. Type out everything below, and we’ll meet on the other side and see how things went.

$ mkfs.vfat -F32 /dev/sda1
$ mkswap /dev/sda2
$ mkfs.ext4 /dev/sda3
$ mkfs.ext4 /dev/sda4
$ swapon /dev/sda2

We just set the file system to fat32 for the boot partition, swap on the swap partition, and ext4 for the root and home partitions. After that, we told the computer to use the swap partition as swap.

Now we can actually mount them:

$ mount /dev/sda3 /mnt
$ mkdir /mnt/boot
$ mkdir /mnt/home
$ mount /dev/sda1 /mnt/boot
$ mount /dev/sda4 /mnt/home

If everything went according to plan, you have the skeleton of your Arch install all set up. Now we can get into the actual nuts and bolts of the installation, and the hard part is over with. If we run our trusty $lsblk, we should see Screenshot

Finding a mirror

This is where the actual installation part comes into play. First, we need to edit our mirror to find the best one to download from. Point your browser to the Mirror Status page and select a mirror you want to use there. I like to go down to the part of the window that says Sucessfully Syncing Mirrors and then sort the list by highest mirror score. Then I select the highest scoring mirror that is near me. Your mileage may vary.

Screenshot I am going to use a mirror in the United States, clarkson.edu. To use this mirror, you need to edit /etc/pacman.d/mirrorlist so that the mirror is at the type. type

$ nano /etc/pacman.d/mirrorlist

and then add Server = http://mirror.clarkson.edu/archlinux/$repo/os/$arch to the top of the list, above ## China.

Hit Ctrl + x to save, follow the prompts and quit. Now we can finally install Arch!

Pacstrap

Now that we’ve edited the mirror list, we can install Arch. Type

$ pacstrap -i /mnt base base-devel

and hit enter. You will be prompted to make some choices, just hit enter to accept the defaults and then hit y. The files will begin to download and install, so sit back, grab something to drink, do whatever. It might take a little while.

Screenshot
Screenshot

And all the heavy lifting is done! Let’s generate our filesystem table

$ genfstab /mnt >> /mnt/etc/fstab

Now that we’ve generated the fstab, let’s take a look at it

$ nano /mnt/etc/fstab

If it looks similar to this, you’re good: Screenshot

arch-chroot

Now we need to set the OS up to be self-sufficient. First, we need to arch-chroot into the filesystem.

$ arch-chroot /mnt

First things first, let’s select a timezone and set the system clock:

$ ln -sf /usr/share/zoneinfo/America/New_York /etc/localtime
$ hwclock --systohc.

The first line sets a symbolic link between the time zone and your local time. You can use a different zone if you’re in a different area using the command tzselect.

Now, edit the file /etc/locale-gen to uncomment your language. I’m going to use en_US.UTF-8 UTF-8, but you can use whatever you would normally use. Do this by typing

$ nano /etc/locale.gen

and then deleting the # before the one(s) you want to use. Screenshot
Save and exit, and then type

$ locale-gen

to finalize the change.

Next, set the language variable in /etc/locale.conf by typing

$ echo "LANG=en_US.UTF-8" >> /etc/locale.conf

We’re going to do something similar for our hostname. I’m choosing archVM for my hostname, so I’ll type

$ echo "archVM" >> /etc/hostname

and for hosts we’ll type

$ nano /etc/hosts

and edit it so that it looks like this:

127.0.0.1   localhost
::1         localhost
127.0.1.1   archVM.localdomain  archVM

Now we need to have systemd start the network connection on start up. To do this, type

$ systemctl enable dhcpcd.service

Let’s add a password to our root account by typing

$ passwd

and entering a password when prompted.

Finally, we need to install a bootloader.

Installing a bootloader

I used to use a mac, and as a result I’m partial to rEFInd as a bootloader. To install this, we have a couple steps. First, type

$ pacman -S refind-efi

and accept the prompts when they come up.

Once this installs, we can type

refind-install

and we should get the output below: Screenshot

As a final step, we need to edit /boot/refind_linux.conf because when the install script populated it, it was populated with the values for the .iso and not our boot disc. To edit that, you need to change the file

$ nano /boot/refind_linux.conf

Basically, where you see the part that says something like ro root=UUID-...-6d73ae6b5332, it needs to be placed on the line "boot with standard options" and the other two need to be deleted. Also, replace the ro with rw. When all is said and done, you should have something that looks like this:

Screenshot
save your changes, you’re in the home stretch!

Finishing touches

Now that we’re done, we can exit arch-chroot and finish our install.

$ exit

You’ll be kicked out of chroot jail, and ready to leave the installer limbo. Type

$ umount -R /mnt

You shouldn’t have any errors at this point. If you do, there’s a chance you left the /root directory when you were in chroot. To fix this you can just $arch-chroot /mnt back in, type $ cd, and then $ exit and try again. At this point, you’re finished with installing. Type

$ reboot

and cross your fingers; with any luck you’ll see Screenshot

Push enter and rEFInd will load into the OS. You’ll be greeted with this screen:

Screenshot
Screenshot

Congratulations! You just installed Arch Linux in a VM!

References

Dario Giova, et al, Jakub Klinkovský. n.d. “Arch Linux Installation Guide.” https://wiki.archlinux.org/index.php/Installation_guide.

LS0tCnRpdGxlOiAiSW5zdGFsbGluZyBBcmNoIG9uIFZNd2FyZSBXb3Jrc3RhdGlvbiIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwpiaWJsaW9ncmFwaHk6IHJlZi5iaWIKLS0tCgojIEluc3RhbGxpbmcgQXJjaCBMaW51eCBvbiBWTXdhcmUgV29ya3N0YXRpb24KIyMgQmVmb3JlIHlvdSBiZWdpbgpUbyBpbnN0YWxsIFdvcmtzdGF0aW9uIFBsYXllciAxNCwgVk13YXJlIHJlY29tbWVuZHNbQHZtd2FyMThdIHRoYXQgeW91IGhhdmUgdGhlIGZvbGxvd2luZzoKMS4gQW4gSW50ZWwgQ1BVIHdpdGggVlQteCBzdXBwb3J0IG9yIGFuIEFNRCBDUFUgd2l0aCBBTUQtViBzdXBwb3J0LgoyLiAyIEdCIG9mIFJBTSAoNCBHQiBvciBoaWdoZXIgcmVjb21tZW5kZWQpCjMuIEEgMTYtIG9yIDMyLWJpdCBkaXNwbGF5IGFkYXB0ZXIKNC4gQXQgbGVhc3QgMSBHQiBvZiBoYXJkIGRyaXZlIHNwYWNlCgpBIGxpc3Qgb2YgdGhlc2UgcmVxdWlyZW1lbnRzIGNhbiBiZSBmb3VuZCBhdCB0aGUgW1ZNd2FyZSBEb2NzXSh0dHBzOi8vZG9jcy52bXdhcmUuY29tL2VuL1ZNd2FyZS1Xb3Jrc3RhdGlvbi1QbGF5ZXItZm9yLUxpbnV4LzE0LjAvY29tLnZtd2FyZS5wbGF5ZXIubGludXgudXNpbmcuZG9jL0dVSUQtM0NGODdGMUQtRkQxNC00RkJBLUEwMEMtRjEzRDY1ODI1Q0E1Lmh0bWwpIHNpdGUuCgpUbyBpbnN0YWxsIEFyY2ggTGludXgsIHlvdSBtdXN0IGhhdmUgYW4geDY0Xzg2LWNvbXBhdGlibGUgUEMgd2l0aCBhdCBsZWFzdCA1MTJNQiBvZiBSQU0gYW5kIDgwMCBNQiBvZiBkaXNrIHNwYWNlIGF2YWlsYWJsZVtAZ2lvdmExOF0uIE9oLCBhbmQgYW4gYWN0aXZlIGludGVybmV0IGNvbm5lY3Rpb24uCgojIyBHZXR0aW5nIFZNd2FyZSBXb3Jrc3RhdGlvbiBQbGF5ZXIKVG8gZG93bmxvYWQgVk13YXJlIFdvcmtzdGF0aW9uIFBsYXllciAxNC4xLCB2aXNpdCBbbXkudm13YXJlLmNvbV0oaHR0cHM6Ly9teS52bXdhcmUuY29tL2VuL3dlYi92bXdhcmUvZnJlZSNkZXNrdG9wX2VuZF91c2VyX2NvbXB1dGluZy92bXdhcmVfd29ya3N0YXRpb25fcGxheWVyLzE0XzApIGFuZCBjbGljayBvbiB0aGUgbGluayB0byBkb3dubG9hZC4gVGhpcyB3aWxsIGRvd25sb2FkIHRoZSBmaWxlIGluIGEgYC5idW5kbGVgIHBhY2thZ2Ugd2hpY2ggbXVzdCBiZSBpbnN0YWxsZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgpUbyBydW4gdGhlIGluc3RhbGxlciBpbiBMaW51eCwgdXNlIHRoZSBjb21tYW5kCgpgYGAKJHN1ZG8gYmFzaCBWTXdhcmUtUGxheWVyLSoueDY0Xzg2LmJ1bmRsZQpgYGAKCkFmdGVyIHRoaXMsIGFuIGluc3RhbGxlciB3aW5kb3cgd2lsbCBvcGVuIGFza2luZyBpZiB5b3UgYWNjZXB0IHRoZWlyIFRvUy9FVUxBLiBJdCB3aWxsIGFsc28gYXNrIGZvciBhIHBhdGggZm9yIHN5c3RlbSBzY3JpcHRzLCBhcyB3ZWxsIGFzIGEgcHJvZHVjdCBrZXkuCgpJIGluc3RhbGxlZCBWTXdhcmUgV29ya3N0YXRpb24gUGxheWVyIDE0LjEgb24gYSBzeXN0ZW0gYWxyZWFkeSBydW5uaW5nIEFyY2ggTGludXgsIGFuZCBoYWQgdG8gaW5zdGFsbCBbdm13YXJlLXBhdGNoXShodHRwczovL2F1ci5hcmNobGludXgub3JnL3BhY2thZ2VzL3Ztd2FyZS1wYXRjaC8pIHRvIGdldCBwbGF5ZXIgdG8gZGV0ZWN0IG15IGtlcm5lbC4KCk5leHQgd2UgY2FuIGdldCB0aGUgQXJjaCBpbWFnZS4KCiMjIEdldHRpbmcgQXJjaCBMaW51eAoKVG8gZG93bmxvYWQgdGhlIGltYWdlIGZpbGUgZm9yIGluc3RhbGxhdGlvbiwgZ28gdG8gdGhlIFtBcmNoIExpbnV4IERvd25sb2FkIHBhZ2VdKGh0dHBzOi8vd3d3LmFyY2hsaW51eC5vcmcvZG93bmxvYWQvKSBhbmQgc2VsZWN0IGEgbWlycm9yLiAoSSBjaG9zZSB0aGUgW2NhdC5wZHguZWR1XShodHRwOi8vbWlycm9ycy5jYXQucGR4LmVkdS9hcmNobGludXgvaXNvLzIwMTguMDIuMDEvKSBtaXJyb3IpIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gZG93bmxvYWQgYSB0b3JyZW50IGFuZCBnZXQgaXQgZnJvbSB0aGVyZSwgYnV0IGRvbid0IGZvcmdldCB0byBzZWVkLgoKIyMgU2V0dGluZyB1cCB5b3VyIHZpcnR1YWwgbWFjaGluZQpUbyBzZXQgdXAgeW91ciB2aXJ0dWFsIG1hY2hpbmUsIHN0YXJ0IFZNd2FyZSBXb3Jrc3RhdGlvbiBwbGF5ZXIgYW5kIGhpdCBjcmVhdGUgYSBuZXcgdmlydHVhbCBtYWNoaW5lLiBZb3Ugd2lsbCBiZSBwcm9tcHRlZCB0byBjaG9zZSB3aGVyZSB0byBpbnN0YWxsIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGZyb20sIHNvIGhpdCB0aGUgIlVzZSBJU08gaW1hZ2UiIHJhZGlvIGJ1dHRvbiBhbmQgcG9pbnQgdG8gdGhlIEFyY2ggLmlzbyB5b3UganVzdCBkb3dubG9hZGVkLiBOZXh0LCB5b3Ugc2VsZWN0ICJMaW51eCIiIGFuZCAiT3RoZXIgTGludXggNC54IEtlcm5lbCIgZnJvbSB0aGUgZHJvcGRvd24uIFlvdSdsbCBiZSBwcm9tcHRlZCB0byBzZWxlY3QgYSBsb2NhdGlvbiB0byBzdG9yZSB5b3VyIFZNIGFuZCB0aGVuIHlvdSB3aWxsIGhhdmUgdG8gY2hvc2UgaG93IGJpZyB0aGUgaGFyZCBkcml2ZSB5b3Ugd2FudC4gSSB3ZW50IHdpdGggdGhlIGRlZmF1bHQgOCBHQiBidXQgeW91IGNhbiB1c2UgaG93ZXZlciBtdWNoIHNwYWNlIHlvdSB3b3VsZCBsaWtlLCBwcm92aWRlZCB5b3UgaGF2ZSB0aGUgc3RvcmFnZSB0byBkbyBzby4gWW91IGNhbiBrZWVwIHRoZSBkZWZhdWx0IGZvciB2aXJ0dWFsIGRpc2sgc3BsaXR0aW5nIHNlbGVjdGVkIGFuZCB0aGVuIGhpdCBuZXh0LgoKRmluYWxseSwgeW91IHdpbGwgYmUgYnJvdWdodCB0byBhIHdpbmRvdyB0aGF0IHNheXMgIlJlYWR5IHRvIENyZWF0ZSBWaXJ0dWFsIE1hY2hpbmUiLCBidXQgd2UgYXJlbid0LiBTZWxlY3QgIkN1c3RvbWl6ZSBIYXJkd2FyZSIgYW5kIGEgbmV3IHdpbmRvdyB3aWxsIHBvcCB1cCwgc2hvd24gYmVsb3c6CiFbU2NyZWVuc2hvdF0oLi9pbWFnZXMvc2NyZWVuc2hvdDAyLnBuZykgIApDaGFuZ2UgdGhlIG1lbW9yeSB0byB0aGUgYW1vdW50IHlvdSB3YW50IChyZW1lbWJlciwgNTEyIE1CIGlzIHRoZSBiYXJlIG1pbmltdW0pIGFuZCBzZXQgdGhlIG51bWJlciBvZiBDUFUgdG8gaG93IG1hbnkgY29yZXMgeW91ciBob3N0IENQVSBoYXMgKGlmIHlvdSBhcmUgdW5zdXJlLCBpdCdzIG9rYXkgdG8ga2VlcCB0aGUgdmFsdWUgYXQgMSkuIFlvdSBjYW4gYWxzbyBjbGljayB0aGUgRGlzcGxheSB0YWIgYW5kIGhpdCAiM0QgQWNjZWxlcmF0aW9uIi4KCk5vdyB5b3UgY2FuIGhpdCBjbG9zZSBhbmQgZmluaXNoIHRoZSBzZXR1cC4gTWFrZSBzdXJlIHlvdSB1bmNoZWNrIHRoZSAicG93ZXIgb24iIHNlbGVjdG9yIGJlZm9yZSB5b3UgZmluaXNoLCB0aGVyZSdzIG9uZSBtb3JlIHN0ZXAgd2UgbmVlZCB0byBhY2NvbXBsaXNoIGJlZm9yZSB3ZSBnZXQgaW50byB0aGluZ3MuIEdvIHRvIHRoZSBmb2xkZXIgdGhhdCB5b3Ugc2VsZWN0ZWQgdG8gc3RvcmUgeW91ciBWTSBhbmQgb3BlbiB0aGUgYHh4LnZteGAgZmlsZSB3aXRoIGEgdGV4dCBlZGl0b3IgKERvbid0IGRvdWJsZSBjbGljayBpdCEpLiBXZSdyZSBnb2luZyB0byBhZGQgdGhlIGxpbmUKYGBgCmZpcm13YXJlID0gImVmaSIKYGBgCnRvIHRoZSB2ZXJ5IGJvdHRvbSBvZiB0aGUgZmlsZSBhbmQgdGhlbiBzYXZlIGl0LgoKTm93IHlvdSdyZSByZWFkeSB0byBwb3dlciBvbiB0aGUgc3lzdGVtLiBZb3UgY2FuIGRvdWJsZSBjbGljayB0aGUgZmlsZSB5b3UganVzdCBlZGl0ZWQsIG9yIG9wZW4gaXQgdGhyb3VnaCBWTXdhcmUgd29ya3N0YXRpb24uCgojIyBJbnN0YWxsaW5nIEFyY2gKV2FpdCB1bnRpbCB0aGUgc3lzdGVtIGxvYWRzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHNwbGFzaCBzY3JlZW4sIHdoaWNoIHdpbGwgYmUgc2ltaWxhciB0byB0aGUgb25lIGJlbG93OgoKIVtTY3JlZW5zaG90XSguL2ltYWdlcy9zY3JlZW5zaG90MDMucG5nKQpTZWxlY3QgYEJvb3QgQXJjaCBMaW51eCAoeDY0Xzg2KWAgYW5kIHdhaXQgZm9yIHRoZSBtYWNoaW5lIHRvIGxvYWQgdGhlIGluc3RhbGxlciBmcm9tIHRoZSAuaXNvLgoKWW91IHdpbGwgaW1tZWRpYXRlbHkgYmUgcHV0IGludG8gYSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLiBJZiB0aGlzIHNjYXJlcyB5b3UsIGl0IHNob3VsZG4ndC4gSSB3aWxsIGJlIGhlcmUgdG8gZ3VpZGUgeW91IHRocm91Z2ggdGhlIGluc3RhbGxhdGlvbi4KClR5cGUKYGBgCiQgbHMgL3N5cy9maXJtd2FyZS9lZmkvZWZpdmFycwpgYGAKWW91IGNhbiB1c2UgdGFiIGNvbXBsZXRpb24gYWZ0ZXIgdGhlIGZpcnN0IGNvdXBsZSBsZXR0ZXJzIG9mIGVhY2ggb2YgdGhlIHN1YiBmb2xkZXJzLiBJZiBldmVyeXRoaW5nIGlzIGRvbmUgY29ycmVjdGx5LCB5b3Ugc2hvdWxkIGdldCBhbiBvdXRwdXQgc2ltaWxhciB0byBtaW5lOgoKIVtTY3JlZW5zaG90XSguL2ltYWdlcy9zY3JlZW5zaG90MDQucG5nKSAgClRoaXMgbWVhbnMgdGhhdCB5b3UgaGF2ZSBFRkkgcnVubmluZy4gVGhpcyBpcyBleGFjdGx5IHdoYXQgd2Ugd2FudC4KCk5leHQsIHdlIGhhdmUgdG8gY2hlY2sgdGhhdCB3ZSBoYXZlIGFjY2VzcyB0byB0aGUgaW50ZXJuZXQuIFR5cGUKYGBgCiQgcGluZyAtYyB3d3cuZ29vZ2xlLmNvbQpgYGAKCklmIHlvdSBkb24ndCBnZXQgYW55IGVycm9ycywgeW91J3JlIGdvb2QgdG8gZ28uCgpOZXh0LCB0eXBlCmBgYAokIHRpbWVkYXRlY3RsIHNldC1udHAgdHJ1ZQpgYGAKClRoaXMgd2lsbCBzZXQgdGhlIHN5c3RlbSBjbG9jay4KCiMjIyBQYXJ0aXRpb25pbmcgeW91ciBoYXJkIGRpc2sKVGhlIG5leHQgcGFydCB3aWxsIGJlIGEgbGl0dGxlIGZpbmlja3kuIFR5cGUKYGBgCiQgbHNibGsKYGBgCgphbmQgeW91IHdpbGwgZ2V0IGFuIG91dHB1dCBsaWtlIHRoaXM6CiFbU2NyZWVuc2hvdF0oLi9pbWFnZXMvc2NyZWVuc2hvdDA1LnBuZykKClRoZSBkcml2ZSB0aGF0IHdlIHdhbnQgc2hvdWxkIGJlIHNvbWUgZm9ybSBvZiBgc2RYYCB3aGVyZSBgWGAgaXMgYSBsZXR0ZXIuIEluIG15IGNhc2UsIGl0IGlzIGBzZGFgLiBUaGlzIGlzIHRoZSBkcml2ZSB3ZSB3YW50IHRvIHBhcnRpdGlvbi4gVHlwZQoKYGBgCiQgY2ZkaXNrIC9kZXYvc2RhCmBgYAoKYW5kIHlvdSB3aWxsIGJlIGJyb3VnaHQgdG8gYSBwYXJ0aXRpb24gd2l6YXJkLgoKU2VsZWN0IGBncHRgIGZyb20gdGhlIGxpc3QgKGlmIGFza2VkKSBhbmQgdGhlbiBwYXJ0aXRpb24gdGhlIGhhcmQgZHJpdmUuIEkgbGlrZSB0byBoYXZlIDQgc2VwZXJhdGUgcGFydGlvbnMgZm9yIGFuIGluc3RhbGw6CgoxLiBCb290IHBhcnRpdGlvbiwgd2l0aCA1MTJNQiAgCjIuIFN3YXAgcGFydGl0aW9uLCB3aGljaCBjYW4gdmVyeS4gQW4gb2xkIHJ1bGUgb2YgdGh1bWIgaXMgdG8gdXNlIDJ4IHRoZSBhbW91bnQgb2YgUkFNIHlvdSBoYXZlLCBzbyBJIGNob3NlIDFHQiAgCjMuIFJvb3QgcGFydGl0aW9uLCB3aGljaCBjYW4gYWxzbyB2ZXJ5LiBJIGNob3NlIDNHQiwgYnV0IGl0IGlzIHVwIHRvIHlvdS4gRGVwZW5kaW5nIG9uIHdoYXQgeW91IHBsYW4gb24gdXNpbmcgdGhlIHZtIGZvciwgeW91IG1pZ2h0IHdhbnQgdG8gZ28gdG8gYXMgbXVjaCBhcyAxLzMgb2YgdGhlIGRpc2sgc3BhY2UgdGhhdCB5b3UncmUgdXNpbmcuCjQuIEhvbWUgcGF0aXRpb24sIHdoaWNoIGlzIGp1c3QgdGhlIGxlZnRvdmVyIHNwYWNlLgoKTWFrZSBzdXJlIHRoYXQgeW91IHNlbGVjdCB0aGUgcHJvcGVyIGZpbGVzeXN0ZW0gdHlwZXM6IFlvdXIgYm9vdCBwYXJ0aXRpb24gc2hvdWxkIGJlIE1pY3Jvc29mdCBiYXNpYyBkYXRhLCB5b3VyIHN3YXAgc2hvdWxkIGJlIExpbnV4IHN3YXAsIGFuZCB5b3VyIGhvbWUgYW5kIHJvb3QgcGFydGl0aW9ucyBzaG91bGQgYmUgTGludXggZmlsZXN5c3RlbS4gWW91IHNob3VsZCBoYXZlIHNvbWV0aGluZyBsaWtlIHRoaXMgd2hlbiB5b3UncmUgZG9uZToKIVtTY3JlZW5zaG90XSguL2ltYWdlcy9zY3JlZW5zaG90MDYucG5nKQpEb24ndCBmb3JnZXQgdG8gaGl0IFdyaXRlIGJlZm9yZSB5b3UgcXVpdC4gTm93IGlmIHlvdSB0eXBlCmBgYAokIGxzYmxrCmBgYAoKeW91IHNob3VsZCBzZWUgCgohW1NjcmVlbnNob3RdKC4vaW1hZ2VzL3NjcmVlbnNob3QwNy5wbmcpCiMjIyBNb3VudGluZyB0aGUgZmlsZXN5c3RlbQpMZXQncyBtb3VudCB0aGUgZmlsZXN5c3RlbSBuZXh0LiBUeXBlIG91dCBldmVyeXRoaW5nIGJlbG93LCBhbmQgd2UnbGwgbWVldCBvbiB0aGUgb3RoZXIgc2lkZSBhbmQgc2VlIGhvdyB0aGluZ3Mgd2VudC4KYGBgCiQgbWtmcy52ZmF0IC1GMzIgL2Rldi9zZGExCiQgbWtzd2FwIC9kZXYvc2RhMgokIG1rZnMuZXh0NCAvZGV2L3NkYTMKJCBta2ZzLmV4dDQgL2Rldi9zZGE0CiQgc3dhcG9uIC9kZXYvc2RhMgpgYGAKCldlIGp1c3Qgc2V0IHRoZSBmaWxlIHN5c3RlbSB0byBmYXQzMiBmb3IgdGhlIGJvb3QgcGFydGl0aW9uLCBzd2FwIG9uIHRoZSBzd2FwIHBhcnRpdGlvbiwgYW5kIGV4dDQgZm9yIHRoZSByb290IGFuZCBob21lIHBhcnRpdGlvbnMuIEFmdGVyIHRoYXQsIHdlIHRvbGQgdGhlIGNvbXB1dGVyIHRvIHVzZSB0aGUgc3dhcCBwYXJ0aXRpb24gYXMgc3dhcC4KCk5vdyB3ZSBjYW4gYWN0dWFsbHkgbW91bnQgdGhlbToKYGBgCiQgbW91bnQgL2Rldi9zZGEzIC9tbnQKJCBta2RpciAvbW50L2Jvb3QKJCBta2RpciAvbW50L2hvbWUKJCBtb3VudCAvZGV2L3NkYTEgL21udC9ib290CiQgbW91bnQgL2Rldi9zZGE0IC9tbnQvaG9tZQpgYGAKCklmIGV2ZXJ5dGhpbmcgd2VudCBhY2NvcmRpbmcgdG8gcGxhbiwgeW91IGhhdmUgdGhlIHNrZWxldG9uIG9mIHlvdXIgQXJjaCBpbnN0YWxsIGFsbCBzZXQgdXAuIE5vdyB3ZSBjYW4gZ2V0IGludG8gdGhlIGFjdHVhbCBudXRzIGFuZCBib2x0cyBvZiB0aGUgaW5zdGFsbGF0aW9uLCBhbmQgdGhlIGhhcmQgcGFydCBpcyBvdmVyIHdpdGguIElmIHdlIHJ1biBvdXIgdHJ1c3R5IGAkbHNibGtgLCB3ZSBzaG91bGQgc2VlCiFbU2NyZWVuc2hvdF0oLi9pbWFnZXMvc2NyZWVuc2hvdDA4LnBuZykKCiMjIyBGaW5kaW5nIGEgbWlycm9yClRoaXMgaXMgd2hlcmUgdGhlIGFjdHVhbCBpbnN0YWxsYXRpb24gcGFydCBjb21lcyBpbnRvIHBsYXkuIEZpcnN0LCB3ZSBuZWVkIHRvIGVkaXQgb3VyIG1pcnJvciB0byBmaW5kIHRoZSBiZXN0IG9uZSB0byBkb3dubG9hZCBmcm9tLiBQb2ludCB5b3VyIGJyb3dzZXIgdG8gdGhlIFtNaXJyb3IgU3RhdHVzXShodHRwczovL3d3dy5hcmNobGludXgub3JnL21pcnJvcnMvc3RhdHVzLykgcGFnZSBhbmQgc2VsZWN0IGEgbWlycm9yIHlvdSB3YW50IHRvIHVzZSB0aGVyZS4gSSBsaWtlIHRvIGdvIGRvd24gdG8gdGhlIHBhcnQgb2YgdGhlIHdpbmRvdyB0aGF0IHNheXMgKlN1Y2Vzc2Z1bGx5IFN5bmNpbmcgTWlycm9ycyogYW5kIHRoZW4gc29ydCB0aGUgbGlzdCBieSBoaWdoZXN0IG1pcnJvciBzY29yZS4gVGhlbiBJIHNlbGVjdCB0aGUgaGlnaGVzdCBzY29yaW5nIG1pcnJvciB0aGF0IGlzIG5lYXIgbWUuIFlvdXIgbWlsZWFnZSBtYXkgdmFyeS4KCiFbU2NyZWVuc2hvdF0oLi9pbWFnZXMvc2NyZWVuc2hvdDA5LnBuZykKSSBhbSBnb2luZyB0byB1c2UgYSBtaXJyb3IgaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIFtjbGFya3Nvbi5lZHVdKGh0dHA6Ly9taXJyb3IuY2xhcmtzb24uZWR1L2FyY2hsaW51eC8pLiBUbyB1c2UgdGhpcyBtaXJyb3IsIHlvdSBuZWVkIHRvIGVkaXQgYC9ldGMvcGFjbWFuLmQvbWlycm9ybGlzdGAgc28gdGhhdCB0aGUgbWlycm9yIGlzIGF0IHRoZSB0eXBlLiB0eXBlCmBgYAokIG5hbm8gL2V0Yy9wYWNtYW4uZC9taXJyb3JsaXN0CmBgYAphbmQgdGhlbiBhZGQgYFNlcnZlciA9IGh0dHA6Ly9taXJyb3IuY2xhcmtzb24uZWR1L2FyY2hsaW51eC8kcmVwby9vcy8kYXJjaGAgdG8gdGhlIHRvcCBvZiB0aGUgbGlzdCwgYWJvdmUgYCMjIENoaW5hYC4KCkhpdCBgQ3RybCArIHhgIHRvIHNhdmUsIGZvbGxvdyB0aGUgcHJvbXB0cyBhbmQgcXVpdC4gTm93IHdlIGNhbiBmaW5hbGx5IGluc3RhbGwgQXJjaCEKCiMjIyBQYWNzdHJhcApOb3cgdGhhdCB3ZSd2ZSBlZGl0ZWQgdGhlIG1pcnJvciBsaXN0LCB3ZSBjYW4gaW5zdGFsbCBBcmNoLiBUeXBlCmBgYAokIHBhY3N0cmFwIC1pIC9tbnQgYmFzZSBiYXNlLWRldmVsCmBgYAphbmQgaGl0IGVudGVyLiBZb3Ugd2lsbCBiZSBwcm9tcHRlZCB0byBtYWtlIHNvbWUgY2hvaWNlcywganVzdCBoaXQgZW50ZXIgdG8gYWNjZXB0IHRoZSBkZWZhdWx0cyBhbmQgdGhlbiBoaXQgeS4gVGhlIGZpbGVzIHdpbGwgYmVnaW4gdG8gZG93bmxvYWQgYW5kIGluc3RhbGwsIHNvIHNpdCBiYWNrLCBncmFiIHNvbWV0aGluZyB0byBkcmluaywgZG8gd2hhdGV2ZXIuIEl0IG1pZ2h0IHRha2UgYSBsaXR0bGUgd2hpbGUuCgohW1NjcmVlbnNob3RdKC4vaW1hZ2VzL3NjcmVlbnNob3QxMC5wbmcpCgpBbmQgYWxsIHRoZSBoZWF2eSBsaWZ0aW5nIGlzIGRvbmUhIExldCdzIGdlbmVyYXRlIG91ciBmaWxlc3lzdGVtIHRhYmxlCgpgYGAKJCBnZW5mc3RhYiAvbW50ID4+IC9tbnQvZXRjL2ZzdGFiCmBgYAoKTm93IHRoYXQgd2UndmUgZ2VuZXJhdGVkIHRoZSBmc3RhYiwgbGV0J3MgdGFrZSBhIGxvb2sgYXQgaXQKCmBgYAokIG5hbm8gL21udC9ldGMvZnN0YWIKYGBgCgpJZiBpdCBsb29rcyBzaW1pbGFyIHRvIHRoaXMsIHlvdSdyZSBnb29kOgohW1NjcmVlbnNob3RdKC4vaW1hZ2VzL3NjcmVlbnNob3QxMS5wbmcpICAKCiMjIyBhcmNoLWNocm9vdAoKTm93IHdlIG5lZWQgdG8gc2V0IHRoZSBPUyB1cCB0byBiZSBzZWxmLXN1ZmZpY2llbnQuIEZpcnN0LCB3ZSBuZWVkIHRvIGFyY2gtY2hyb290IGludG8gdGhlIGZpbGVzeXN0ZW0uCgpgYGAKJCBhcmNoLWNocm9vdCAvbW50CmBgYAoKRmlyc3QgdGhpbmdzIGZpcnN0LCBsZXQncyBzZWxlY3QgYSB0aW1lem9uZSBhbmQgc2V0IHRoZSBzeXN0ZW0gY2xvY2s6CmBgYAokIGxuIC1zZiAvdXNyL3NoYXJlL3pvbmVpbmZvL0FtZXJpY2EvTmV3X1lvcmsgL2V0Yy9sb2NhbHRpbWUKJCBod2Nsb2NrIC0tc3lzdG9oYy4KYGBgClRoZSBmaXJzdCBsaW5lIHNldHMgYSAqc3ltYm9saWMgbGluayogYmV0d2VlbiB0aGUgdGltZSB6b25lIGFuZCB5b3VyIGxvY2FsIHRpbWUuIFlvdSBjYW4gdXNlIGEgZGlmZmVyZW50IHpvbmUgaWYgeW91J3JlIGluIGEgZGlmZmVyZW50IGFyZWEgdXNpbmcgdGhlIGNvbW1hbmQgYHR6c2VsZWN0YC4KCk5vdywgZWRpdCB0aGUgZmlsZSBgL2V0Yy9sb2NhbGUtZ2VuYCB0byB1bmNvbW1lbnQgeW91ciBsYW5ndWFnZS4gSSdtIGdvaW5nIHRvIHVzZSBgZW5fVVMuVVRGLTggVVRGLThgLCBidXQgeW91IGNhbiB1c2Ugd2hhdGV2ZXIgeW91IHdvdWxkIG5vcm1hbGx5IHVzZS4gRG8gdGhpcyBieSB0eXBpbmcKYGBgCiQgbmFubyAvZXRjL2xvY2FsZS5nZW4KYGBgCmFuZCB0aGVuIGRlbGV0aW5nIHRoZSAjIGJlZm9yZSB0aGUgb25lKHMpIHlvdSB3YW50IHRvIHVzZS4gCiFbU2NyZWVuc2hvdF0oLi9pbWFnZXMvc2NyZWVuc2hvdDEyLnBuZykgIApTYXZlIGFuZCBleGl0LCBhbmQgdGhlbiB0eXBlCmBgYAokIGxvY2FsZS1nZW4KYGBgCnRvIGZpbmFsaXplIHRoZSBjaGFuZ2UuCgpOZXh0LCBzZXQgdGhlIGxhbmd1YWdlIHZhcmlhYmxlIGluIGAvZXRjL2xvY2FsZS5jb25mYCBieSB0eXBpbmcKYGBgCiQgZWNobyAiTEFORz1lbl9VUy5VVEYtOCIgPj4gL2V0Yy9sb2NhbGUuY29uZgpgYGAKV2UncmUgZ29pbmcgdG8gZG8gc29tZXRoaW5nIHNpbWlsYXIgZm9yIG91ciBob3N0bmFtZS4gSSdtIGNob29zaW5nIGBhcmNoVk1gIGZvciBteSBob3N0bmFtZSwgc28gSSdsbCB0eXBlCmBgYAokIGVjaG8gImFyY2hWTSIgPj4gL2V0Yy9ob3N0bmFtZQpgYGAKCmFuZCBmb3IgaG9zdHMgd2UnbGwgdHlwZQpgYGAKJCBuYW5vIC9ldGMvaG9zdHMKYGBgCgphbmQgZWRpdCBpdCBzbyB0aGF0IGl0IGxvb2tzIGxpa2UgdGhpczoKYGBgCjEyNy4wLjAuMQlsb2NhbGhvc3QKOjoxCQkgICAgbG9jYWxob3N0CjEyNy4wLjEuMQlhcmNoVk0ubG9jYWxkb21haW4JYXJjaFZNCmBgYAoKTm93IHdlIG5lZWQgdG8gaGF2ZSBzeXN0ZW1kIHN0YXJ0IHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gb24gc3RhcnQgdXAuIFRvIGRvIHRoaXMsIHR5cGUKYGBgCiQgc3lzdGVtY3RsIGVuYWJsZSBkaGNwY2Quc2VydmljZQpgYGAKCkxldCdzIGFkZCBhIHBhc3N3b3JkIHRvIG91ciByb290IGFjY291bnQgYnkgdHlwaW5nCmBgYAokIHBhc3N3ZApgYGAKCmFuZCBlbnRlcmluZyBhIHBhc3N3b3JkIHdoZW4gcHJvbXB0ZWQuCgpGaW5hbGx5LCB3ZSBuZWVkIHRvIGluc3RhbGwgYSAqYm9vdGxvYWRlciouCgojIyMgSW5zdGFsbGluZyBhIGJvb3Rsb2FkZXIKSSB1c2VkIHRvIHVzZSBhIG1hYywgYW5kIGFzIGEgcmVzdWx0IEknbSBwYXJ0aWFsIHRvIHJFRkluZCBhcyBhIGJvb3Rsb2FkZXIuIFRvIGluc3RhbGwgdGhpcywgd2UgaGF2ZSBhIGNvdXBsZSBzdGVwcy4KRmlyc3QsIHR5cGUKCmBgYAokIHBhY21hbiAtUyByZWZpbmQtZWZpCmBgYAphbmQgYWNjZXB0IHRoZSBwcm9tcHRzIHdoZW4gdGhleSBjb21lIHVwLgoKT25jZSB0aGlzIGluc3RhbGxzLCB3ZSBjYW4gdHlwZQpgYGAKcmVmaW5kLWluc3RhbGwKYGBgCmFuZCB3ZSBzaG91bGQgZ2V0IHRoZSBvdXRwdXQgYmVsb3c6CiFbU2NyZWVuc2hvdF0oLi9pbWFnZXMvc2NyZWVuc2hvdDEzLnBuZykgIAoKQXMgYSBmaW5hbCBzdGVwLCB3ZSBuZWVkIHRvIGVkaXQgYC9ib290L3JlZmluZF9saW51eC5jb25mYCBiZWNhdXNlIHdoZW4gdGhlIGluc3RhbGwgc2NyaXB0IHBvcHVsYXRlZCBpdCwgaXQgd2FzIHBvcHVsYXRlZCB3aXRoIHRoZSB2YWx1ZXMgZm9yIHRoZSAuaXNvIGFuZCBub3Qgb3VyIGJvb3QgZGlzYy4gVG8gZWRpdCB0aGF0LCB5b3UgbmVlZCB0byBjaGFuZ2UgdGhlIGZpbGUKYGBgCiQgbmFubyAvYm9vdC9yZWZpbmRfbGludXguY29uZgpgYGAKCkJhc2ljYWxseSwgd2hlcmUgeW91IHNlZSB0aGUgcGFydCB0aGF0IHNheXMgc29tZXRoaW5nIGxpa2UgYHJvIHJvb3Q9VVVJRC0uLi4tNmQ3M2FlNmI1MzMyYCwgaXQgbmVlZHMgdG8gYmUgcGxhY2VkIG9uIHRoZSBsaW5lIGAiYm9vdCB3aXRoIHN0YW5kYXJkIG9wdGlvbnMiYCBhbmQgdGhlIG90aGVyIHR3byBuZWVkIHRvIGJlIGRlbGV0ZWQuIEFsc28sIHJlcGxhY2UgdGhlIGByb2Agd2l0aCBgcndgLiBXaGVuIGFsbCBpcyBzYWlkIGFuZCBkb25lLCB5b3Ugc2hvdWxkIGhhdmUgc29tZXRoaW5nIHRoYXQgbG9va3MgbGlrZSB0aGlzOgoKIVtTY3JlZW5zaG90XSguL2ltYWdlcy9zY3JlZW5zaG90MTQucG5nKSAgCnNhdmUgeW91ciBjaGFuZ2VzLCB5b3UncmUgaW4gdGhlIGhvbWUgc3RyZXRjaCEKIAojIyMgRmluaXNoaW5nIHRvdWNoZXMKTm93IHRoYXQgd2UncmUgZG9uZSwgd2UgY2FuIGV4aXQgYGFyY2gtY2hyb290YCBhbmQgZmluaXNoIG91ciBpbnN0YWxsLgpgYGAKJCBleGl0CmBgYApZb3UnbGwgYmUga2lja2VkIG91dCBvZiBjaHJvb3QgamFpbCwgYW5kIHJlYWR5IHRvIGxlYXZlIHRoZSBpbnN0YWxsZXIgbGltYm8uIFR5cGUKYGBgCiQgdW1vdW50IC1SIC9tbnQKYGBgCllvdSBzaG91bGRuJ3QgaGF2ZSBhbnkgZXJyb3JzIGF0IHRoaXMgcG9pbnQuIElmIHlvdSBkbywgdGhlcmUncyBhIGNoYW5jZSB5b3UgbGVmdCB0aGUgYC9yb290YCBkaXJlY3Rvcnkgd2hlbiB5b3Ugd2VyZSBpbiBjaHJvb3QuClRvIGZpeCB0aGlzIHlvdSBjYW4ganVzdCBgJGFyY2gtY2hyb290IC9tbnRgIGJhY2sgaW4sIHR5cGUgYCQgY2RgLCBhbmQgdGhlbiBgJCBleGl0YCBhbmQgdHJ5IGFnYWluLgpBdCB0aGlzIHBvaW50LCB5b3UncmUgZmluaXNoZWQgd2l0aCBpbnN0YWxsaW5nLiBUeXBlCmBgYAokIHJlYm9vdApgYGAKYW5kIGNyb3NzIHlvdXIgZmluZ2Vyczsgd2l0aCBhbnkgbHVjayB5b3UnbGwgc2VlIAohW1NjcmVlbnNob3RdKC4vaW1hZ2VzL3NjcmVlbnNob3QxNS5wbmcpICAKClB1c2ggZW50ZXIgYW5kIHJFRkluZCB3aWxsIGxvYWQgaW50byB0aGUgT1MuIFlvdSdsbCBiZSBncmVldGVkIHdpdGggdGhpcyBzY3JlZW46CgohW1NjcmVlbnNob3RdKC4vaW1hZ2VzL3NjcmVlbnNob3QxNi5wbmcpICAKCkNvbmdyYXR1bGF0aW9ucyEgWW91IGp1c3QgaW5zdGFsbGVkIEFyY2ggTGludXggaW4gYSBWTSEKCiMgUmVmZXJlbmNlcwo=