Novena Documentation Release PVT2

contributors like you

May 29, 2015

Contents

1 Quickstart: Desktop 3

2 Quickstart: Just the Board 5

3 Common Tasks 9 3.1 Installing and Running on a SATA Disk...... 9 3.2 Flashing Factory Image to microSD Card...... 11 3.3 Pairing a Bluetooth Keyboard...... 11 3.4 Creating a Simple WiFi Access Point (Hotspot)...... 11 3.5 Upgrading the Kernel and u-boot...... 12 3.6 Compiling and Installing the Kernel...... 13 3.7 Using an External HDMI Monitor...... 13

4 The Hardware 15 4.1 Revisions...... 15

5 Default Distribution (Debian) 17

6 FPGA Hacking 19 6.1 GPBB FPGA Communications Quickstart...... 19

7 Porting Operating Systems 21 7.1 GNU/Linux Distributions...... 21 7.2 Other Operating Systems...... 21

8 Source and Licensing 23

9 About The Guide Sources 25

10 Documentation License 27

i ii Novena Documentation, Release PVT2

The Novena Open Hardware Laptop, in Board, Desktop, and Laptop configurations. Photos: Crowdsupply

Contents 1 Novena Documentation, Release PVT2

2 Contents CHAPTER 1

Quickstart: Desktop

Note: This page is a work-in-progress stub. Contributions welcome!

The “Laptop” hardware has not yet shipped as of January 2015. For now, start with the Desktop Assembly Guide. See also Quickstart: Just the Board.

3 Novena Documentation, Release PVT2

4 Chapter 1. Quickstart: Desktop CHAPTER 2

Quickstart: Just the Board

This page runs through the steps of configuring a “bare” Novena mainboard for use as a display-less system using the factory-installed microSD card as the rootfs media.

Fig. 2.1: Novena PVT2 “Just-The-Board” contents (December 2014)

Before you begin... You will need a 3.3V USB-FTDI cable and a computer to work from (as a terminal). You will also need an Ethernet cable if you want wired networking.

First, before applying power, attach the FTDI cable with the USB side connected to your host machine and the UART end connected to the Novena. The correct UART connection is described on the “Using Novena PVT1” wiki page, and is shown below. Open a terminal program on the work machine and open the FTDI device using 115200 baud as the speed and “normal” settings for everything else (eg, 8n1). For example, on a UNIX machine you could use the screen command line program:

5 Novena Documentation, Release PVT2

Fig. 2.2: Novena PVT2 board with FTDI UART cable attached to console port (note wire colors and orientation)

Fig. 2.3: Pinout of Novena PVT2 board console port, wire colors correspond to default FTDI UART connector

6 Chapter 2. Quickstart: Just the Board Novena Documentation, Release PVT2

screen /dev/ttyUSB0 115200 # Should be a blank screen until the Novena boots. # Type "Ctrl-A" then "k" to quit when you are done.

Or you could use minicom or GtkTerm or whatever your favorite is. If you get access errors, you might need to add yourself to dialout or plugdev or a group like that, then completely log out and log back in: $ ls -l /dev/ttyUSB0 crw-rw---- 1 root dialout 188, 0 May 28 21:10 /dev/ttyUSB0 $ groups SOMEBODY cdrom floppy audio dip video plugdev netdev $ sudo usermod SOMEBODY -a -G dialout $ groups SOMEBODY cdrom floppy audio dip video plugdev netdev $ # Still need to logout and back in, then: $ groups SOMEBODY dialout cdrom floppy audio dip video plugdev netdev

Finally, connect power to the Novena board’s DC barrel jack. You should see u-boot and then kernel boot messages stream out the console. Eventually you will enter the “first run” menu system, which was created by xobs specifically for the Novena. You should be able to make reasonable selections for yourself by reading the prompts; a US-centric set of defaults for a headless (aka, no display) system might be: • “Configuring console-data”: select “Don’t touch keymap” • “Configuring locales”: “en_US.UTF-8 UTF-8” or yours • “Configuring locales”: the locale you selected • “Configuring tzdata”: your region, or “none of the above” to get to UTC • Enter a new root password • Create a user account • Choose a hostname or accept the autogenerated one • Disable graphical logins Following all the prompts, the system should get configured and you will be able to login as the user you created. Blessed be! The next step will be to get networking up and running so you can upgrade and/or install new software.

Note: You need a wired connection to install required utilities before you can configure the wireless interfaces.

Configure Ethernet Networking Attach ethernet cable to a switch/router to the left-hand port (eth0). If DHCP is enabled on the local network, the interface should be configured automatically. Test the connection with: sudo ifconfig eth0 sudo ping www.mit.edu

Configure WiFi Networking Install packages (over the wired connection); be sure to add your user to the netdev group when prompted: sudo apt-get install wireless-tools iw wicd-curses

7 Novena Documentation, Release PVT2

Run wicd-curses to connect to a wireless access point. You should be presented with a list of detected stations; hit enter to connect to a station, or right arrow and then scroll down to enter a WPA/WPA2 password (if necessary). You could also install network-manager instead of wicd and use the nmtui command to connect to networks and manage wired networking as well. After networking is configured Once networking is going, you should definately update the apt package database, and you may wish to upgrade all existing packages (from the factory image) to the most recent available versions. The default configured debian mirror (to download updates from) is in the United States. You might want to change the /etc/apt/sources.list file to point to something closer; changing to http.debian.net will auto-select a good mirror wherever you are in the world. To update package information, a process which should run reasonably fast even the first time: sudo apt-get update

The upgrade step could take 30+ minutes all together, even given a fast connection, because disk I/O operations on the built-in microSD card are very slow. Don’t start this process until you are patient enough to let it finish without interruption. You don’t really need to do the upgrade up front before you start experimenting, it’s just a good idea to stay patched with bug fixes and security updates. To upgrade all packages with new versions, run: sudo apt-get upgrade

You may encounter a dpkg problem with the dbus package (“Package libdbus-1-3:armhf is not configured yet.”). If this happens run sudo apt-get install -f to fix configuration, then sudo apt-get upgrade to finish the upgrade. You will almost certainly find youself needing i2c control utilities if you will be hacking on the Novena, eg to compile the FPGA userland tools, so now would be a good time to do: sudo apt-get install i2c-tools libi2c-dev

Fixing Audio The version of pulseaudio-novena that shipped with PVT2 boards (v1.0) has some known problems that prevent audio from working correctly out of the box. Later versions (v1.1) fix this, but as of January 10th 2015 have not been pushed to the Kosagi apt repository as a package update. As a work around, one can either build a new .deb and install that, or as a hack just copy the updated configuration files by hand to the correct paths. After this the audio will need to be unmuted and turned up using alsamixer as usual. mplayer works fine for playing audio files from the (headless) command line.

8 Chapter 2. Quickstart: Just the Board CHAPTER 3

Common Tasks

3.1 Installing and Running Debian Linux on a SATA Disk

These instructions will result in a system that boots u-boot and the Linux kernel from the internal microSD slot, then loads the rootfs and entire userland from an ext4 partition on a SATA hard disk. In addition to increased disk capacity, using a SATA disk as a rootfs should vastly improve disk I/O and thus general system performance. Connect the SATA disk while the system is powered down, then boot up from the microSD card. Note that there are two SATA-like connectors on the Novena mainboard: one is for power from the battery board, and the other is the actual SATA connection. It isn’t possible to connect to the wrong port because the polarities are flipped. It’s strongly recommended to use some form of an enclosure or mechanical support to prevent the SATA disk from coming detatched while in use, which could obviously result in data loss. First make sure required tools are installed: sudo apt-get install parted debootstrap

We’re going to assume that the SATA disk is blank and unpartitioned, and all data on the disk will be overwritten. We’re going to use the offical novena-image.sh install script. Checkout out xobs’ novena-image repo: sudo apt-get install apt-cacher-ng cd git clone https://github.com/xobs/novena-image

You’ll almost certainly want to install apt-cacher-ng and change the mirror setting (in sata-install.sh) to --mirror "http://127.0.0.1:3142/http.debian.net/debian" (the default is a debian mirror in Hong Kong). We recommend copying sata-install.sh to local-install.sh and making changes there. See the novena- image.sh documentation for more details. To configure the kosagi repositories by default, you can download the kosagi-repo debian package and kosagi signing key with: # WARNING: this isn't a secure way to verify the signing key gpg --keyserver keyserver..com --recv-keys 03C7B7EC gpg --export 03C7B7EC > kosagi.key # WARNING: https is not available for this server wget http://repo.novena.io/repo/pool/main/k/kosagi-repo/kosagi-repo_1.0-r1_all.deb wget http://repo.novena.io/repo/pool/main/n/novena-eeprom/novena-eeprom_2.1-1_armhf.deb wget http://repo.novena.io/repo/pool/main/n/novena-firstrun/novena-firstrun_1.4-r1_all.deb

9 Novena Documentation, Release PVT2

If you are running from the microSD card and have limited space, you’ll probably want to cull down the default installed package list significantly. Here is an example local-install.sh: #!/bin/bash if [ -z $1 ] then echo "Usage: $0 [device]" echo "E.g. $0 /dev/sda" exit 1 fi echo "Constructing a disk image on $1" exec sudo ./novena-image.sh \ -d $1 \ -m "http://127.0.0.1:3142/http.debian.net/debian" \ -t sata \ -s jessie \ -k kosagi.key \ -a kosagi-repo_1.0-r1_all.deb \ -a novena-eeprom_2.1-1_armhf.deb \ -a novena-firstrun_1.4-r1_all.deb \ -l "sudo openssh-server ntp ntpdate \ vim powermgmt-base i2c-tools"

When local-install.sh looks good, run the script: # WARNING: VERY DANGEROUS COMMAND! sudo ./local-install.sh /dev/sda

To actually boot from SATA you must set a flag in EEPROM. Run novena-eeprom and take note of the Features list, then add sataroot to the list and write it: # Edit this list for your board novena-eeprom -f es8328,pcie,gbit,hdmi,eepromoops,sataroot -w

The novena-image.sh script should have taken care of setting the SATA disk’s ID correct, so you’re ready to reboot! After booting into this fresh system, you might want to loop back to the Quickstart: Just the Board page. A few errata and things that might pop up: • need to fix /etc/apt/sources.list to remove localhost prefix (from apt-cacher-ng) • run apt-get install -f to fix any outstanding apt issues • need to add deb http://repo.novena.io/repo/ jessie main to get kosagi updates (if kosagi- repo wasn’t installed) • if they aren’t already installed, run apt-get install novena-eeprom kosagi-repo novena-disable-ssp novena-usb-hub (etc) • need to create a user (adduser, then usermod -G to add to sudo group) • need to install a fuller set of packages if only a subset were installed to save disk space earlier

10 Chapter 3. Common Tasks Novena Documentation, Release PVT2

3.2 Flashing Factory Image to microSD Card

3.3 Pairing a Bluetooth Keyboard

First you need to install the firmware-atheros package followed by a reboot: sudo apt-get install firmware-atheros

After rebooting, you need to enable bluetooth and pair it with your keyboard: bluetoothctl -a power on scan on

If everything goes correctly, your bluetooth keyboard should be listed: pair

Pressing tab will auto-complete for you (if a bluetooth device has been found). A number will appear on your screen which you need to type on your keyboard and press enter. Now you can connect to your keyboard and trust it so that in the future the keyboard will be connected to automatically: connect trust default-agent quit

3.4 Creating a Simple WiFi Access Point (Hotspot)

Warning: Unfortunately, the shipped Novena kernel (3.17.0-rc5-00217-gfd79638) does not include netfilter support, which is required for iptables to no NAT IPv4 masquerading. The below instructions will only partially work, and clients won’t have actual internet access. Upgrading to the 3.19 linux-novena kernel should resolve this problem, as the necessary modules are compiled in by default. You can test by running sudo iptables -L; if this returns an error about kmod and insmod, you need to upgrade.

The PCIe 802.11 WiFi card that ships with the Novena supports Access Point mode (AP, also known as ‘master’ mode), so in addition to connecting to wireless gateways and routers as a client, Novena can share connections or even act as a router/gateway itself. If you aren’t using the included PCIe card for WiFi (eg, using a USB dongle), you’ll need to check that your hardware supports AP mode: sudo iw list | less # must have 'AP' in "Supported interface modes"

The included PCIe card is based on the Atheros AR9462 chipset. As background, creating a wireless station and allowing clients to connect is relatively simple. Sharing an upstream internet connection (eg, from the wired ethernet jacks) is a bit more complicated. There are at least two common methods to do so. The first is network bridging, where the Novena routes packets between the two network connections without acting as a gateway in any other way. In this configuration a pre-existing router would act as a DHCP server and gateway to the outside network. In the second configuration Novena would act as a router/gateway itself and do NAT (Network Address Translation). In this configuration clients would get DHCP and DNS from Novena on a

3.2. Flashing Factory Image to microSD Card 11 Novena Documentation, Release PVT2

private subnetwork. The Novena would translate the IP addresses on any packets going to and from connected clients to the upstream internet. NetworkManager is an easiest way to create an access point, and it uses the NAT scheme by default, with dnsmasq and iptables behind the scenes supplying DNS/DHCP and NAT rewriting respectively. These directions assume you have network-manager already installed.

Note: These directions describe a simple mechanism for sharing an internet connection. This is not intentended to be a way to have the Novena run as a secure or robust wireless gateway. In particular, no firewall is in place, your Novena may not be very security hardened by default, the default settings may not play well with some devices or networks, etc, etc.

If you have a headless (no GUI) system, you can control NetworkManager using nmtui, otherwise you can use the Gnome GUI. First make sure you have a working wired (ethernet) connection to the internet. Then create a new shared WiFi connection. It’s recommended to give the connection (distinct from the SSID) a short name like “wlan0-ap” instead of the default “Wi-Fi connection 1”. Select or enter wlan0 as the hardware device. In WiFi settings choose an SSID and set the Mode to “Access Point”. Add WPA2 security if you like. In the IPv4 network section change the configuration from “Automatic” to “Shared”. The other settings can be left as defaults. Make sure “Automatically connect” is selected. Save and exit. The connection may come up automatically after a few minutes. Unlike wired connections, the connection will not show up in the list of available WiFi connections in the nmtui “Active a connection” list. You can check /var/log/daemon.log for status and error messages, or nmcli connection for a list of active connections. You can force NetworkManager to bring up the connection with: sudo nmcli connection up wlan0-ap # where 'wlan0-ap' is the connection name you chose earlier

To shutdown the access point and return Novena to client mode, the easiest route seems to be disabling the Auto- connect flag in the wlan0-ap settings, then run sudo nmcli connection down wlan0-ap, wait a minute, then you should be given a list of access points to connect to as usual.

3.5 Upgrading the Kernel and u-boot

The Novena kernel developers (aka, xobs) occasionally publishes updates to the linux kernel that shipped with the Novena boards. These updates come in the form of apt packges (.deb) in the repo.novena.io repository, but they are not automatically installed in the /boot partition of the onboard microSD card, so upgrading these packages and rebooting is not sufficient to upgrade your board. On the other hand, the u-boot-novena bootloader package will install itself on /boot if it is already mounted. The following steps will install an updated linux kernel and compiled device tree file (.dtb) to the appropriate lo- cation. It assumes that /boot has been mounted with the microSD first partition (aka, /dev/mmcblk0p1), and that the repo.novena.io repository is configured and keys are installed. You will also have to change the 3.19.0-00270-g3d69696 filename part to the version of the kernel that has actually been fetched. sudo apt-get update sudo apt-get install u-boot-novena linux-firmware-image-novena \ linux-headers-novena linux-image-novena # Backup the old files sudo cp /boot/zimage /boot/zimage.old sudo cp /boot/novena.dtb /boot/novena.dtb.old # Copy in the new files; vmlinuz is already in zimage format sudo cp /usr/share/linux-novena/vmlinuz-3.19.0-00270-g3d69696.dtb /boot/novena.dtb

12 Chapter 3. Common Tasks Novena Documentation, Release PVT2

sudo cp /usr/share/linux-novena/vmlinuz-3.19.0-00270-g3d69696 /boot/zimage # Flush filesystem data to the card sync # Reboot! sudo reboot

3.6 Compiling and Installing the Kernel

Check out the novena kernel tree: git clone https://github.com/xobs/novena-linux

Check out the version you want to build. For example: cd novena-linux git checkout v3.19-novena

Set the default build configuration and compile the kernel: make novena_defconfig make -j4

Now that the kernel is compiled, we must install it and its corresponding set of modules. For the time being the kernel needs to be on the small /boot partition on the sd card: sudo make modules_install sudo cp arch/arm/boot/dts/imx6q-novena.dtb /boot/novena.dtb sudo cp arch/arm/boot/zImage /boot/zimage

If you have trouble booting the new kernel, hold down the user (square) button during boot. That should select the kernel in the sd card’s recovery partition. If all else fails, reflash the sd card with a factory image. Kosagi’s latest kernel build is available in their repo as the ‘linux-image-novena’ package. The ‘u-boot-novena’ package also contains a script to maintain the sdcard card partition, so if this is installed, the traditional debian ‘fakeroot make-kpkg’ method will work without the manual copying above.

3.7 Using an External HDMI Monitor

These instructions are oriented towards users of a bare mainboard system, not Desktop or Laptop folks trying to use a secondary display. Attaching an HDMI monitor should Just Work as a console login; you’ll need a USB keyboard or other input device to log in. Note that when an external monitor is attached at boottime, the kernel boot and console login stops working on the UART serial connection and is redirected to the monitor instead. For a simple -based desktop with common applications, install: sudo apt-get install task-xfce-desktop xorg-novena \ xserver-xorg-video-armada xserver-xorg-video-armada-etnaviv iceweasel \ arandr libetnaviv

Note: As of January 2015, there seems to be an issue with the novena-xorg package that prevents the “armada” driver from working. A workaround is to edit the file /usr/share/X11/xorg.conf.d/60-novena.conf and add the following lines to the top:

3.6. Compiling and Installing the Kernel 13 Novena Documentation, Release PVT2

Section "Files" ModulePath "/usr/lib/xorg/modules/" ModulePath "/usr/lib/arm-linux-gnueabihf/xorg/modules/" EndSection

If this does not work, you can also try replacing the armada driver in that file with fbdev (and comment out the following option lines) to use a (slow) raw framebuffer device instead.

After future reboots, when the external display is attached you should get a friendly GUI login screen. To start up X without rebooting, run startxfce4 from the console login.

14 Chapter 3. Common Tasks CHAPTER 4

The Hardware

Note: This page is a work-in-progress stub.

Specs go here. Links to errata.

4.1 Revisions

How to identify variants (PVT1, PVT2, DVT, etc).

Fig. 4.1: Novena PVT2-A Silkscreen

15 Novena Documentation, Release PVT2

16 Chapter 4. The Hardware CHAPTER 5

Default Distribution (Debian)

Note: This page is a work-in-progress stub.

The wiki has directions on how to download, verify, and flash a copy of the original microSD image to recover from any mistakes or bugs that would result in a “bricked” or unbootable system. See the “Novena Image script” wiki page for details on building a debian image from scratch.

17 Novena Documentation, Release PVT2

18 Chapter 5. Default Distribution (Debian) CHAPTER 6

FPGA Hacking

The general purpose FPGA on the Novena mainboard is a Xilinx Spartan6 XC6SLX45 device in the CSG324 BGA package with a -3 speedgrade. It is connected to the ARM CPU via SPI for bitstream configuration, via i2c for low- speed communications, and via a 16-bit memory interface (“EIM”) for faster communications. The FPGA also has its own DRAM chip and an expansion header to which extra hardware can be attached.

Table 6.1: Novena FPGA Specifications (from Xilinx) Part Number Xilinx Spartan6 XC6SLX45 Slices 6822 Logic Cells 43661 CLB Flip-Flops 54576 Max Distributed RAM 50 KB (401 Kb) Block RAM 261 KB (116x 18 Kb blocks) Clock Management Tiles (CMT) 4 DSP48A Slices 58 PCIe Hard Blocks None Memory Controller Blocks 2 Gigabit Transcievers (GTP) None Bitfile Size 1.49 MB (11.9 Mb) US Market Price $53 (@100, December 2014) For those just getting started with FPGA development, two sources of free/libre learning resources are the free range factory website (including the libre “Free Range VHDL” book, and a mirror of opencores.org), and Xess Corp’s free “FPGAs? Now What?!” book (pdf). These guides cover a lot of context about getting vendor software installed, HDL languages, FPGA hardware resources, timing and constraint specification, the compilation and synthesis process, and the various toolchain workflows; this content won’t be repeated here.

6.1 GPBB FPGA Communications Quickstart

The General Purpose Breakout Board (GPBB) comes installed on the expansion port header of all Novenas. It’s got some LEDs and analog I/O (see the wiki for details), which make it great for simple FPGA experimentation and blinky light displays. Before we can control the GPBB from linux, we need to load a bitfile to the FPGA (which controls the expansion header) and install some userland software to talk to the FPGA over the EIM interface. Run these commands from a Novena with the GPBB attached to compile the userland programs:

19 Novena Documentation, Release PVT2

sudo apt-get install i2c-tools libi2c-dev cd # sic. git clone https://github.com/bunnie/novena-gpbb-example cd novena-gpbb-example make -j4

Then use the helper script and bitfile included in the novena-gpbb-example repo to configure the FPGA (this would need to be done after every power cycle of the board): sudo ./configure.sh novena_fpga.bit

And check if we can read metadata from the hardware: sudo ./novena-gpbb -v

Finally, make with the blinkenlights and toggle the four LEDs on the GPBB, connected to I/O port B, pins 0 to 3: sudo ./novena-gpbb -oeb 1 # set port B to drive for BIT in 0 1 2 3; do sudo ./novena-gpbb -p_set b $BIT # Set pin sleep 1 done sudo ./novena-gpbb -p b 00 # Write 0x00, i.e. reset all pins sudo ./novena-gpbb -oeb 0 # return port B to tristate mode

Joy!

20 Chapter 6. FPGA Hacking CHAPTER 7

Porting Operating Systems

In general, if trying to port things to the Novena, a good place to start would be finding existing ports to other hardware platforms based on the Freescale i.MX6 processors. Eg, the Wandboard, the Gateworks Ventana, the Solidrun CuBox- i4Pro, and Boundary Devices’ Nitrogen6.

7.1 GNU/Linux Distributions

It should be reasonably easy to port arbitrary GNU/Linux distributions to Novena. Either the existing microSD boot partition, u-boot, and kernel can be used (with the distro rootfs on a SATA disk), or an entire fresh image could be generated. Many of xobs’s patches to the Linux kernel have been upstreamed to mainline, which helps immensely. Additional work will be necessary on non-debian-based distributions to port the userland utilities for things like EEP- ROM access and pulseaudio support. All these utilities are of course , and can be found by poking around on the Novena wiki (try starting at Novena packaing overview). Some earlier work had been done on an OpenEmbedded build.

7.2 Other Operating Systems

Wikipedia states that basic i.MX6 support has been included in FreeBSD, OpenBSD, and Android. There is probably also vendor (Freescale) support for some proprietary industrial operating systems like QNX and VxWorks. Beyond that it will probably be a matter of studying the documentation and refering to the Linux implementation for pointers.

21 Novena Documentation, Release PVT2

22 Chapter 7. Porting Operating Systems CHAPTER 8

Source and Licensing

Note: This page is a work-in-progress stub.

Links to source (hardware, firmware, software), licenses, and means for contributing patches.

23 Novena Documentation, Release PVT2

24 Chapter 8. Source and Licensing CHAPTER 9

About The Guide Sources

This is Sphinx-based documentation, built from reStructured Text sources. Build locally with make html (you’ll need the python-sphinx package or equivalent on your platform). The output will pop out at _build/html/index.html. The live version (currently at https://novena-guide.readthedocs.org/) is hosted by ReadTheDocs using github hooks for auto builds. For context, and pointers for how to make changes and contributions, see https://docs.readthedocs.org. The sources are hosted at https://github.com/bnewbold/novena-guide. Contributions by patch or pull-request are wel- come! Please indicate that you agree with the licensing terms. If you don’t want to use the github system, you can send patches or plain text corrections or comments to “bnewbold” at the domain of “robocracy.org”. The documentation infrastructure supports both multiple variants (eg, tweaked docs for derivative or future hardware) and translations. If you’d like to help with a translation it’s probably best to get in touch first to make sure efforts aren’t duplicated.

25 Novena Documentation, Release PVT2

26 Chapter 9. About The Guide Sources CHAPTER 10

Documentation License

Unless otherwise indicated, all content in this guide (including photos, diagrams, text, etc, but not including code snippets or scripts) are released under the Creative Commons Attribution license (“CC-BY 3.0”). Basically you can do whatever you want with it (even print it out and sell it) as long as you give give credit (eg, link back here). Unless otherwise indicated, all code snippets and scripts included in-line in this guide are considered short and trivial enough to be reused in any way under fair use guidelines, and additionally no attribtion is required. To be pedantic, all code snippets and in-line scripts are released under the Creative Commons Zero license (“CC0 1.0 Universal”, commited into the international public domain to the greatest degree possible). Direct links to license texts: • https://creativecommons.org/licenses/by/3.0/ • https://creativecommons.org/publicdomain/zero/1.0/

27