nt. If it looks right here, it looks right everywhere.

---

# Heading 1
## Heading 2
### Heading 3
#### Heading 4
##### Heading 5
###### Heading 6

---

## Inline styles

This is **bold**, this is *italic*, this is ~~strikethrough~~, and this is `inline code`. You can also combine **bold and *italic*** together.

Here's a [link to GitHub](https://github.com) and an auto-linked URL: https://example.com

---

## Blockquote

> The best way to predict the future is to invent it.
>
> — Alan Kay

Nested:

> First level
>
> > Second level
> >
> > > Third level

---

## Lists

### Unordered

- containerd
- CRI-O
- Docker Engine
  - dockershim (removed)
  - cri-dockerd (replacement)
- runc
  - gVisor (runsc)
  - kata-runtime

### Ordered

1. Define the interface (CRI)
2. Implement the interface (containerd, CRI-O)
3. Remove the shim (dockershim)
4. Profit

### Task list

- [x] Define CRI
- [x] Implement containerd CRI plugin
- [x] Remove dockershim
- [ ] World domination

---

## Table

| Runtime | Type | CRI | OCI | Notes |
|---------|------|-----|-----|-------|
| containerd | High-level | Yes | Yes | Default for K8s |
| CRI-O | High-level | Yes | Yes | OpenShift default |
| runc | Low-level | No | Yes | Standard OCI runtime |
| gVisor | Low-level | No | Yes | User-space kernel |
| kata | Low-level | No | Yes | Lightweight VM |

---

## Code blocks — FizzBuzz (LeetCode #412)

### Bash

```bash
#!/bin/bash
for i in $(seq 1 15); do
  if (( i % 15 == 0 )); then
    echo "FizzBuzz"
  elif (( i % 3 == 0 )); then
    echo "Fizz"
  elif (( i % 5 == 0 )); then
    echo "Buzz"
  else
    echo "$i"
  fi
done
```

### TypeScript

```typescript
function fizzBuzz(n: number): string[] {
  const result: string[] = [];
  for (let i = 1; i <= n; i++) {
    if (i % 15 === 0) result.push("FizzBuzz");
    else if (i % 3 === 0) result.push("Fizz");
    else if (i % 5 === 0) result.push("Buzz");
    else result.push(String(i));
  }
  return result;
}
```

### JavaScript

```javascript
const fizzBuzz = (n) => {
  return Array.from({ length: n }, (_, i) => {
    const num = i + 1;
    if (num % 15 === 0) return "FizzBuzz";
    if (num % 3 === 0) return "Fizz";
    if (num % 5 === 0) return "Buzz";
    return String(num);
  });
};
```

### C#

```csharp
public class Solution {
    public IList<string> FizzBuzz(int n) {
        var result = new List<string>();
        for (int i = 1; i <= n; i++) {
            if (i % 15 == 0) result.Add("FizzBuzz");
            else if (i % 3 == 0) result.Add("Fizz");
            else if (i % 5 == 0) result.Add("Buzz");
            else result.Add(i.ToString());
        }
        return result;
    }
}
```

### Java

```java
class Solution {
    public List<String> fizzBuzz(int n) {
        List<String> result = new ArrayList<>();
        for (int i = 1; i <= n; i++) {
            if (i % 15 == 0) result.add("FizzBuzz");
            else if (i % 3 == 0) result.add("Fizz");
            else if (i % 5 == 0) result.add("Buzz");
            else result.add(String.valueOf(i));
        }
        return result;
    }
}
```

### Go

```go
func fizzBuzz(n int) []string {
	result := make([]string, 0, n)
	for i := 1; i <= n; i++ {
		switch {
		case i%15 == 0:
			result = append(result, "FizzBuzz")
		case i%3 == 0:
			result = append(result, "Fizz")
		case i%5 == 0:
			result = append(result, "Buzz")
		default:
			result = append(result, strconv.Itoa(i))
		}
	}
	return result
}
```

---

## Plain code block (no language)

```
kubelet → containerd → runc → container
```

---

## Horizontal rules

Three styles, all render the same:

---

***

___

---

## Image

![placeholder](https://via.placeholder.com/600x200/1c1c2e/5fdfdb?text=markdown+style+template)

---

## Footnote

This is a sentence with a footnote[^1].

[^1]: This is the footnote content.

---

## Math (if supported)

Inline: $E = mc^2$

Block:

$$
\sum_{i=1}^{n} i = \frac{n(n+1)}{2}
$$

---

## Summary / Details

<details>
<summary>Click to expand</summary>

Hidden content here. Supports **markdown** inside.

```typescript
console.log("revealed!");
```

</details>
