Repository: RoboEden/jux (language: python)

Issue:
Merge branch 'main' into dev



Discussion / hints:

Fix patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2f95fc8..bd6f834 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,8 +1,23 @@
 # Change Log
+
+## v3.0.0
+Major Change:
+  - Migrate to `luxai-s2==3.0.0`.
+
+## v2.2.0
+Major Change:
+  - Migrate to `luxai-s2==2.2.0`.
+  - Python 3.7 is no longer supported. Please use python 3.8 or above.
+  - Add support for python 3.11.
+  - Migrate to jax 0.4.16. But to be compatible with pytorch, we use `jax[cuda11_cudnn82]==0.4.7` by default.
+
+Fix:
+ - Class properties work correctly in batched mode now.
+
 ## v2.1.1
 Major changes:
-    - Upgrade luxai_s2 dependency to v2.1.9.
-    - Fix batching issue for data with properties. `env.state.board.valid_spawns_mask` correctly works now.
+  - Upgrade luxai_s2 dependency to v2.1.9.
+  - Fix batching issue for data with properties. `env.state.board.valid_spawns_mask` correctly works now.
 
 ## v2.1.0
 Major changes:
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 060a94d..abb450b 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,21 +1,23 @@
 # Development Setup
 
-We are going to support `python>=3.7,<3.11`.
+We are going to support `python>=3.8,<3.12`.
 
-## Install requirements
-Make sure you have nvcc, cuda-toolkit and cudnn installed. There are two ways to get them ready, either by conda or docker (recommended).
-
-For conda users, you can install them with the following commands.
+### Install JAX
+JAX is a main dependency of JUX, and must be installed by user manually.
 ```sh
-conda install -c nvidia cuda-nvcc cuda-python
-conda install cudnn
+pip install --upgrade "jax[cuda11_cudnn82]==0.4.7" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html
 ```
-For docker users, you can use the [NVIDIA CUDA docker image](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda) or the [PyTorch docker image](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch), which has all of them ready and compatible with each other.
 
-### Install JAX
-Please follow the [official installation guide](https://github.com/google/jax#installation) to install JAX. Note: JAX must be compatible with your cuDNN.
-- If cudnn >= 8.2 and < 8.6, please install `"jax[cuda11_cudnn82]"`.
-- If cudnn >= 8.6, please install `"jax[cuda11_cudnn86]"`.
+You can test whether jax is installed successfully by running the following command.
+```sh
+python -c "import jax.numpy as jnp; \
+    a = jnp.convolve(jnp.array([1, 2, 3]), jnp.array([0, 1, 0.5])); \
+    print(a); \
+    print(a.device());"
+# You shall get something like this:
+# [0.  1.  2.5 4.  1.5]
+# gpu:0
+```
 
 ### Install JUX
 Finally, upgrade your pip and install JUX.
diff --git a/README.md b/README.md
index 6c50d7a..dd5b66e 100644
--- a/README.md
+++ b/README.md
@@ -2,20 +2,23 @@
 JUX is a <ins>J</ins>ax-accelerated game core for L<ins>ux</ins> AI Challenge Season 2, aimed to maximize game environment throughput for reinforcement learning (RL) training.
 
 ## Installation
-### Install dependencies
-One of the main dependencies is JAX, which in turn relies on NVCC, CUDA Toolkit and cuDNN. There are two ways to get them ready, either by conda or docker (recommended).
 
-For conda users, you can install them with the following commands.
+### Install JAX
+JAX is a main dependency of JUX, and must be installed by user manually.
 ```sh
-conda install -c nvidia cuda-nvcc cuda-python
-conda install cudnn
+pip install --upgrade "jax[cuda11_cudnn82]==0.4.7" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html
 ```
-For docker users, you can use the [NVIDIA CUDA docker image](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda) or the [PyTorch docker image](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch), which has all of them ready and compatible with each other.
 
-### Install JAX
-Please follow the [official installation guide](https://github.com/google/jax#installation) to install JAX. Note: JAX must be compatible with your cuDNN.
-- If cudnn >= 8.2 and < 8.6, please install `"jax[cuda11_cudnn82]"`.
-- If cudnn >= 8.6, please install `"jax[cuda11_cudnn86]"`.
+You can test whether jax is installed successfully by running the following command.
+```sh
+python -c "import jax.numpy as jnp; \
+    a = jnp.convolve(jnp.array([1, 2, 3]), jnp.array([0, 1, 0.5])); \
+    print(a); \
+    print(a.device());"
+# You shall get something like this:
+# [0.  1.  2.5 4.  1.5]
+# gpu:0
+```
 
 ### Install JUX
 Finally, upgrade your pip and install JUX.
@@ -25,7 +28,7 @@ pip install juxai-s2
 ```
 
 ## Usage
-See [tutorial.ipynb](tutorial.ipynb) for a quick start. JUX is guaranteed to implement the same game logic as `luxai_s2==2.1.9`, if players' input actions are valid. When players' input actions are invalid, JUX and LuxAI-S2 may process them differently.
+See [tutorial.ipynb](tutorial.ipynb) for a quick start. JUX is guaranteed to implement the same game logic as `luxai_s2==3.0.0`, if players' input actions are valid. When players' input actions are invalid, JUX and LuxAI-S2 may process them differently.
 
 ## Performance
 JUX maps all game logic to array operators in JAX so that we can harvest the computational power of modern GPUs and support tons of environments running in parallel. We benchmarked JUX on several different GPUs, and increased the throughput by hundreds to thousands of times, compared with the original single-thread Python implementation.
diff --git a/jux/__init__.py b/jux/__init__.py
index 55fa725..4eb28e3 100644
--- a/jux/__init__.py
+++ b/jux/__init__.py
@@ -1,1 +1,1 @@
-__version__ = '2.1.1'
+__version__ = '3.0.0'
diff --git a/jux/actions.py b/jux/actions.py
index bb00d93..8aea26f 100644
--- a/jux/actions.py
+++ b/jux/actions.py
@@ -171,7 +171,7 @@ def is_valid(self, max_transfer_amount) -> bool:
 
 
 class ActionQueue(NamedTuple):
-    data: UnitAction  # UnitAction[UNIT_ACTION_QUEUE_SIZE, 5]
+    data: UnitAction  # UnitAction[UNIT_ACTION_QUEUE_SIZE]
     front: jnp.int8 = jnp.int8(0)
     rear: jnp.int8 = jnp.int8(0)
     count: jnp.int8 = jnp.int8(0)
diff --git a/jux/config.py b/jux/config.py
index 0dc4f85..e55b0ae 100644
--- a/jux/config.py
+++ b/jux/config.py
@@ -38,7 +38,7 @@ class EnvConfig(NamedTuple):
 
     ### Variable parameters that don't affect game logic much ###
     max_episode_length: int = 1000
-    map_size: int = 48
+    map_size: int = 64
     verbose: int = 1
 
     # this can be disabled to improve env FPS but assume your actions are well formatted
@@ -48,8 +48,8 @@ class EnvConfig(NamedTuple):
     ### Constants ###
     # you can only ever transfer in/out 3000 as this is the max cargo space.
     max_transfer_amount: int = 3000
-    MIN_FACTORIES: int = 2
-    MAX_FACTORIES: int = 5
+    MIN_FACTORIES: int = 4
+    MAX_FACTORIES: int = 10
     CYCLE_LENGTH: int = 50
     DAY_LENGTH: int = 30
     UNIT_ACTION_QUEUE_SIZE: int = 20  # when set to 1, then no action queue is used
diff --git a/jux/factory.py b/jux/factory.py
index 81f7883..2523d1b 100644
--- a/jux/factory.py
+++ b/jux/factory.py
@@ -25,7 +25,7 @@ def num_id(self):
     @property
     def occupancy(self) -> Position:
         edge_pos = self.pos.pos[..., None, :] + direct2delta_xy[1:]  # [4, 2]
-        corner_pos = edge_pos + direct2delta_xy[[2, 3, 4, 1], ]  # [4, 2]
+        corner_pos = edge_pos + direct2delta_xy[[2, 3, 4, 1], :]  # [4, 2]
         occupy = jnp.concatenate([self.pos.pos[..., None, :], edge_pos, corner_pos], axis=-2)  # [9, 2]
         occupy = Position(occupy)
         return occupy
diff --git a/jux/state/state.py b/jux/state/state.py
index 9f8e49a..10d4d74 100644
--- a/jux/state/state.py
+++ b/jux/state/state.py
@@ -39,7 +39,7 @@ class State(NamedTuple):
     env_cfg: EnvConfig
 
     seed: jnp.uint32  # the seed for reproducibility
-    rng_state: jax.random.KeyArray  # current rng state
+    rng_state: jax.Array  # current rng state
 
     env_steps: jnp.int16
     board: Board
@@ -111,8 +111,8 @@ def factory_idx(self):
 
     @property
     def factory_mask(self):
-        factory_mask = self.factory_idx < self.n_factories[:, None]
-        chex.assert_shape(factory_mask, (2, self.MAX_N_FACTORIES))
+        factory_mask = self.factory_idx < self.n_factories[..., None]
+        chex.assert_shape(factory_mask, (..., 2, self.MAX_N_FACTORIES))
         return factory_mask
 
     @property
@@ -128,8 +128,8 @@ def unit_idx(self):
 
     @property
     def unit_mask(self):
-        unit_mask = self.unit_idx < self.n_units[:, None]
-        chex.assert_shape(unit_mask, (2, self.MAX_N_UNITS))
+        unit_mask = self.unit_idx < self.n_units[..., None]
+        chex.assert_shape(unit_mask, (..., 2, self.MAX_N_UNITS))
         return unit_mask
 
     @property
@@ -818,12 +818,12 @@ def _handle_transfer_actions(self, actions: UnitAction, valid: Array) -> 'State'
         target_pos = Position(self.units.pos.pos + direct2delta_xy[actions.direction])  # int[2, U, 2]
         target_factory_id = self.board.factory_occupancy_map[target_pos.x, target_pos.y]  # int[2, U]
         target_factory_idx = self.factory_id2idx.at[target_factory_id] \
-                                                .get('fill', fill_value=imax(self.factory_id2idx.dtype))  # int[2, U, 2]
+                                                .get(mode='fill', fill_value=imax(self.factory_id2idx.dtype))  # int[2, U, 2]
         there_is_a_factory = target_factory_idx[..., 1] < self.n_factories[target_factory_idx[..., 0]]  # bool[2, U]
 
         target_unit_id = self.board.units_map[target_pos.x, target_pos.y]  # int[2, U]
         target_unit_idx = self.unit_id2idx.at[target_unit_id] \
-                                          .get('fill', fill_value=imax(self.unit_id2idx.dtype))  # int[2, U, 2]
+                                          .get(mode='fill', fill_value=imax(self.unit_id2idx.dtype))  # int[2, U, 2]
         there_is_an_unit = target_unit_idx[..., 1] < self.n_units[target_unit_idx[..., 0]]  # bool[2, U]
 
         transfer_to_factory = valid & there_is_a_factory  # bool[2, U]
diff --git a/jux/utils/__init__.py b/jux/utils/__init__.py
index 5af731d..dce39ce 100644
--- a/jux/utils/__init__.py
+++ b/jux/utils/__init__.py
@@ -9,6 +9,7 @@
 import luxai_s2
 import numpy as np
 from luxai_s2 import LuxAI_S2
+from luxai_s2.config import UnitConfig
 
 INT32_MAX = jnp.iinfo(jnp.int32).max
 INT16_MAX = jnp.iinfo(jnp.int16).max
@@ -64,12 +65,17 @@ def load_replay(replay: str) -> Tuple[LuxAI_S2, Generator[Dict, None, None]]:
     if 'configuration' in replay:
         # kaggle replay
         seed = replay['configuration']['seed']
-        env = LuxAI_S2()
+        replay['configuration']['env_cfg']['ROBOTS'] = {
+            'HEAVY': UnitConfig(**replay['configuration']['env_cfg']['ROBOTS']['HEAVY']),
+            'LIGHT': UnitConfig(**replay['configuration']['env_cfg']['ROBOTS']['LIGHT']),
+        }
+        env = LuxAI_S2(**replay['configuration']['env_cfg'])
         env.reset(seed=seed)
         actions = get_actions_from_replay(replay, replay['version'])
     elif 'observations' in replay and 'actions' in replay:
         # luxai_runner replay
         env = LuxAI_S2()
+        env.env_cfg.map_size = len(replay['observations'][0]['board']['rubble'])
         env.reset()
 
         # load board
diff --git a/pyproject.toml b/pyproject.toml
index a3b6e49..9aad378 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
 [project]
 name = "juxai-s2"
 description = "JUX is a jax-accelerated engine for Lux-2022."
-requires-python = ">=3.7, <3.11"
+requires-python = ">=3.8, <3.12"
 license = { file = "LICENSE" }
 readme = "README.md"
 authors = [
@@ -21,8 +21,8 @@ classifiers = [
     "Topic :: Scientific/Engineering :: Artificial Intelligence",
 ]
 dependencies = [
-    "luxai-s2==2.1.9",
-    # "jax[cuda]",
+    "luxai-s2==3.0.0",
+    "jax[cuda11_cudnn82]==0.4.7",
     "chex",
 ]
 dynamic = ["version"]
@@ -59,6 +59,8 @@ dev = [
 [tool.setuptools.dynamic]
 version = { attr = "jux.__version__" }
 
+[tool.setuptools_scm]
+
 [tool.yapf]
 column_limit = 120
 indent_width = 4
diff --git a/tox.ini b/tox.ini
index a1b3e08..45c2ae2 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,6 +1,6 @@
 # For more information about tox, see https://tox.readthedocs.io/en/latest/
 [tox]
-envlist = coverage_clean, py37, py38, py39, py310, lint, coverage_report
+envlist = coverage_clean, py38, py39, py310, py311, lint, coverage_report
 isolated_build = True
 requires =
     tox
@@ -14,7 +14,7 @@ deps =
     pytest-cov
     rich
     chex
-    jax[cuda11_cudnn82]
+    jax[cuda11_cudnn82]==0.4.7
 extras = torch
 install_command =
     pip install -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html {opts} {packages}
diff --git a/tutorial.ipynb b/tutorial.ipynb
index ab0895c..d6e55cb 100644
--- a/tutorial.ipynb
+++ b/tutorial.ipynb
@@ -1,1683 +1,1597 @@
 {
-    "cells": [
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "# Jux Tutorial"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "JUX is a jax-accelerated game core for Lux AI Challenge Season 2. This tutorial will guide you through the usage of JUX. Make sure you have fully understand [game rules](https://www.lux-ai.org/specs-2022-beta) of Lux AI Challenge Season 2 before going through this tutorial. This tutorial requires you to have basic knowledge of JAX."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": null,
-            "metadata": {},
-            "outputs": [],
-            "source": [
-                "# rich is needed by this tutorial for nice printing\n",
-                "%pip install rich"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "# The Art of Dancing with Shackles"
-            ]
-        },
-        {
-            "attachments": {},
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "Programming in JAX is an art of dancing with shackles.\n",
-                "\n",
-                "JAX in nature is a library aimed for array manipulation, not for general purpose programming. Programming in JAX is quite different from normal programming paradigm, and sometimes painful. Nearly all weird APIs you encountered in JUX are due to some limitation JAX exerts on us. Here are some of them:\n",
-                "\n",
-                "1. We need to map all if-else, for-loop, and other normal statements to JAX's **array operators**. Good news is that this part is done in JUX, and you don't need to worry about it.\n",
-                "\n",
-                "2. We need to adopt a **functional programming style**, which means we need to avoid mutating variables, and use immutable data structures. Every time you want to change a field of a class, you need to create a new instance of that class. This explains why you must pass in current game state to every function in JUX, and receive a new game state from them.\n",
-                "\n",
-                "3. We have **no advanced data structures** like list, dict, set, etc. All we have is just array, and we need to imitate all kinds of data structures with array.\n",
-                "\n",
-                "4. We must adopt a strange **attribute-first memory layout**, which is counter-intuitive for most programmers at first glance, but it is the key to understand the game state object.\n",
-                "\n",
-                "5. To make functions jittable, all arrays must be of **static shape and dtype**. In other word, we have no stuff like lists with dynamic length. Every list must be of fixed length. If not, pad it to a fixed length, and use another variable to record the actual length.\n",
-                "\n",
-                "But, what can we get from JAX? The answer is the massive parallel computation power and perfect portability. We need not to write any CUDA kernels or even any C++ code to enjoy the power of GPU. The whole project is implemented in pure python, so it can run on Linux/Windows/MacOS, and on CPU/GPU/TPU or any other XLA-compatible devices. This is cool, isn't it?"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "## Create a New Environment\n",
-                "\n",
-                "We first create a new `JuxEnv` object. This object is analogous to a `LuxAI_S2`."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 1,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "text/plain": [
-                            "JuxBufferConfig(MAX_N_UNITS=200, MAX_GLOBAL_ID=2000, MAX_N_FACTORIES=6, MAP_SIZE=48)"
-                        ]
-                    },
-                    "execution_count": 1,
-                    "metadata": {},
-                    "output_type": "execute_result"
-                }
-            ],
-            "source": [
-                "from jux.env import JuxEnv\n",
-                "from jux.config import JuxBufferConfig, EnvConfig\n",
-                "\n",
-                "jux_env = JuxEnv(\n",
-                "    env_cfg=EnvConfig(),\n",
-                "    buf_cfg=JuxBufferConfig(MAX_N_UNITS=200),\n",
-                ")\n",
-                "\n",
-                "jux_env.buf_cfg"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "Beside the `EnvConfig` configuration, we also need to specify the `JuxBufferConfig`. The most important parameter is the `MAX_N_UNITS`, which greatly affects the performance and memory usage. The default value is 1000. See the performance section in [README.md](README.md#performance) for more details.\n",
-                "\n",
-                "Then, we reset the environment."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 2,
-            "metadata": {},
-            "outputs": [],
-            "source": [
-                "state = jux_env.reset(seed=0)"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "The `reset()` function returns a `State` object, which stores the the current state of the game. Since LuxAI_S2 is a perfect information game, the `State` object is also our initial observation. The first time we call `reset()` takes several seconds for jax to compile it, and subsequent calls will be finished on the fly. Please run above cell again to see the difference."
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "We can visualize the game state by following code snippet. "
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 3,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "image/png": "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",
-                        "text/plain": [
-                            "<Figure size 640x480 with 1 Axes>"
-                        ]
-                    },
-                    "metadata": {},
-                    "output_type": "display_data"
-                }
-            ],
-            "source": [
-                "import matplotlib.pyplot as plt\n",
-                "img = jux_env.render(state, \"rgb_array\")\n",
-                "plt.axis('off')\n",
-                "plt.tight_layout()\n",
-                "plt.imshow(img)\n",
-                "plt.show()"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "## Step the Environment"
-            ]
-        },
-        {
-            "attachments": {},
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "Let's first load a replay, and create our `JuxEnv` and `State` from it."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 4,
-            "metadata": {},
-            "outputs": [],
-            "source": [
-                "import jux.utils\n",
-                "\n",
-                "lux_env, lux_actions = jux.utils.load_replay(f'https://www.kaggleusercontent.com/episodes/{46215591}.json')\n",
-                "\n",
-                "jux_env, state = JuxEnv.from_lux(lux_env, buf_cfg=JuxBufferConfig(MAX_N_UNITS=200))"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "This section we show how to step the environment. LuxAI_S2 has three phases:\n",
-                "1. the initial bid step\n",
-                "2. the factory placement steps\n",
-                "3. the normal steps\n",
-                "\n",
-                "To deal with three different phases, the `LuxAI_S2.step()` function is replaced with three phase-specific step functions:\n",
-                "1. `JuxEnv.step_bid()`\n",
-                "2. `JuxEnv.step_factory_placement()`\n",
-                "3. `JuxEnv.step_late_game()`\n",
-                "\n",
-                "Each of them has unique signature and deal a specific game phase."
-            ]
-        },
-        {
-            "attachments": {},
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "### Bid Step\n",
-                "\n",
-                "The first step is bid step, which is handled by `JuxEnv.step_bid()`. Jax adopts a functional programming style, so `JuxEnv` stores nothing about the game state. Every time we call `step_bid()`, the current game state shall be passed in, and a new game state is passed out. The same rule also applies to `step_factory_placement()` and `step_late_game()`."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 5,
-            "metadata": {},
-            "outputs": [
-                {
-                    "name": "stdout",
-                    "output_type": "stream",
-                    "text": [
-                        "bid action in Lux:\n",
-                        "{'player_0': {'bid': 0, 'faction': 'AlphaStrike'},\n",
-                        " 'player_1': {'bid': 0, 'faction': 'AlphaStrike'}}\n",
-                        "\n",
-                        "bid action in Jux:\n",
-                        "bid = [0 0], faction = [0 0]\n"
-                    ]
-                }
-            ],
-            "source": [
-                "import jux.actions\n",
-                "from pprint import pprint\n",
-                "\n",
-                "lux_act = next(lux_actions)\n",
-                "\n",
-                "print(\"bid action in Lux:\")\n",
-                "pprint(lux_act, compact=False)\n",
-                "\n",
-                "bid, faction = jux.actions.bid_action_from_lux(lux_act)\n",
-                "print()\n",
-                "print(\"bid action in Jux:\")\n",
-                "print(f\"{bid = !s}, {faction = !s}\")\n",
-                "\n",
-                "state, (observations, rewards, dones, infos) = jux_env.step_bid(state, bid, faction)"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "The argument `bid` and `faction` shall have following shapes."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 6,
-            "metadata": {},
-            "outputs": [
-                {
-                    "name": "stdout",
-                    "output_type": "stream",
-                    "text": [
-                        "bid: ShapedArray(int32[2])\n",
-                        "faction: ShapedArray(int8[2])\n"
-                    ]
-                }
-            ],
-            "source": [
-                "print(f\"bid: {bid.aval}\")\n",
-                "print(f\"faction: {faction.aval}\")"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "There are four factions, numbered from 0 to 3."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 7,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "text/plain": [
-                            "{0: <FactionTypes.AlphaStrike: 0>,\n",
-                            " 1: <FactionTypes.MotherMars: 1>,\n",
-                            " 2: <FactionTypes.TheBuilders: 2>,\n",
-                            " 3: <FactionTypes.FirstMars: 3>}"
-                        ]
-                    },
-                    "execution_count": 7,
-                    "metadata": {},
-                    "output_type": "execute_result"
-                }
-            ],
-            "source": [
-                "from jux.team import FactionTypes\n",
-                "\n",
-                "{int(f): f for f in FactionTypes}"
-            ]
-        },
-        {
-            "attachments": {},
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "Beside new game state, there are also other four return values, `observations`, `rewards`, `dones`, and `infos`.\n",
-                "1. `observations` contains the observations for each player. Since LuxAI_S2 is a perfect information game, the observations are simply the same `state` object, i.e., \n",
-                "    ```python\n",
-                "    observations['player_0'] == observations['player_1'] == state\n",
-                "    ```\n",
-                "2. `rewards` contains the sum of lichens each player owns.\n",
-                "3. `dones` is a dictionary of boolean values, which indicates whether the game is over for each player. It is gaurenteed that \n",
-                "    ```python\n",
-                "    dones['player_0'] == dones['player_1']\n",
-                "    ```\n",
-                "4. `infos` for each player is an empty dictionary, because there is no other infos to provide. \n",
-                "    ```python\n",
-                "    infos['player_0'] == infos['player_1'] == {}\n",
-                "    ```"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "### Factory Placement Steps\n",
-                "\n",
-                "The factory placement step is handled by `JuxEnv.step_factory_placement()`. The next player to place a factory is indicated by `state.next_player`."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 8,
-            "metadata": {},
-            "outputs": [
-                {
-                    "name": "stdout",
-                    "output_type": "stream",
-                    "text": [
-                        "lux_act = {'player_0': {'metal': 150, 'spawn': [27, 25], 'water': 150}, 'player_1': {}}\n",
-                        "player_0 place a factory at [27 25] with water=150, metal=150.\n",
-                        "lux_act = {'player_0': {}, 'player_1': {'metal': 150, 'spawn': [19, 31], 'water': 150}}\n",
-                        "player_1 place a factory at [19 31] with water=150, metal=150.\n",
-                        "lux_act = {'player_0': {'metal': 150, 'spawn': [7, 10], 'water': 150}, 'player_1': {}}\n",
-                        "player_0 place a factory at [ 7 10] with water=150, metal=150.\n",
-                        "lux_act = {'player_0': {}, 'player_1': {'metal': 150, 'spawn': [7, 3], 'water': 150}}\n",
-                        "player_1 place a factory at [7 3] with water=150, metal=150.\n"
-                    ]
-                }
-            ],
-            "source": [
-                "while state.real_env_steps < 0:\n",
-                "    lux_act = next(lux_actions)\n",
-                "    print(f\"{lux_act = }\")\n",
-                "    spawn, water, metal = jux.actions.factory_placement_action_from_lux(lux_act)\n",
-                "\n",
-                "    print(f\"player_{state.next_player!s} place a factory at {spawn[state.next_player]}\",\n",
-                "          f\"with water={water[state.next_player]}, metal={metal[state.next_player]}.\")\n",
-                "    state, (observations, rewards, dones, infos) = jux_env.step_factory_placement(state, spawn, water, metal)"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "The argument `spawn`, `water`, and `metal` have a leading dimension 2, but only \n",
-                "- `spawn[state.next_player]`\n",
-                "- `water[state.next_player]`\n",
-                "- `metal[state.next_player]`\n",
-                "\n",
-                "are used."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 9,
-            "metadata": {},
-            "outputs": [
-                {
-                    "name": "stdout",
-                    "output_type": "stream",
-                    "text": [
-                        "spawn: ShapedArray(int8[2,2])\n",
-                        "water: ShapedArray(int32[2])\n",
-                        "metal: ShapedArray(int32[2])\n"
-                    ]
-                }
-            ],
-            "source": [
-                "print(f\"spawn: {spawn.aval}\")\n",
-                "print(f\"water: {water.aval}\")\n",
-                "print(f\"metal: {metal.aval}\")"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "This is the current game state."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 10,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "image/png": "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",
-                        "text/plain": [
-                            "<Figure size 640x480 with 1 Axes>"
-                        ]
-                    },
-                    "metadata": {},
-                    "output_type": "display_data"
-                }
-            ],
-            "source": [
-                "img = jux_env.render(state, \"rgb_array\")\n",
-                "plt.axis('off')\n",
-                "plt.tight_layout()\n",
-                "plt.imshow(img)\n",
-                "plt.show()"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "### Normal Steps\n",
-                "\n",
-                "The normal steps are handled by `JuxEnv.step_late_game()`."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 11,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "image/png": "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",
-                        "text/plain": [
-                            "<Figure size 640x480 with 1 Axes>"
-                        ]
-                    },
-                    "metadata": {},
-                    "output_type": "display_data"
-                }
-            ],
-            "source": [
-                "from jux.actions import JuxAction\n",
-                "# prepare actions\n",
-                "lux_act = next(lux_actions)\n",
-                "jux_act = JuxAction.from_lux(state, lux_act)\n",
-                "\n",
-                "# step\n",
-                "state, (observations, rewards, dones, infos) = jux_env.step_late_game(state, jux_act)\n",
-                "\n",
-                "# render\n",
-                "img = jux_env.render(state, \"rgb_array\")\n",
-                "plt.axis('off')\n",
-                "plt.tight_layout()\n",
-                "plt.imshow(img)\n",
-                "plt.show()"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "`step_late_game()` takes an `JuxAction` object as input, which will be elaborated lately. The first time we call `step_late_game()` triggers the jax jit compilation, which is slow, but subsequent calls will be finished on the fly. You may run above cell again to see the difference."
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "## Understanding the `State`\n",
-                "\n",
-                "`State` object is a nested `NamedTuple`, with all leaves being `jax.numpy.ndarray`. It has following fields. "
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 12,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "text/plain": [
-                            "('env_cfg',\n",
-                            " 'seed',\n",
-                            " 'rng_state',\n",
-                            " 'env_steps',\n",
-                            " 'board',\n",
-                            " 'units',\n",
-                            " 'unit_id2idx',\n",
-                            " 'n_units',\n",
-                            " 'factories',\n",
-                            " 'factory_id2idx',\n",
-                            " 'n_factories',\n",
-                            " 'teams',\n",
-                            " 'global_id',\n",
-                            " 'place_first')"
-                        ]
-                    },
-                    "execution_count": 12,
-                    "metadata": {},
-                    "output_type": "execute_result"
-                }
-            ],
-            "source": [
-                "state._fields"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "### Board Information\n",
-                "\n",
-                "Information about the board, including rubble, ice, ore, and lichen, are stored in `state.board`."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 13,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "text/html": [
-                            "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Board</span><span style=\"font-weight: bold\">(</span>\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">seed</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int32<span style=\"font-weight: bold\">[])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">factories_per_team</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">map</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">GameMap</span><span style=\"font-weight: bold\">(</span>\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">rubble</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">ice</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>bool<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">ore</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>bool<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">symmetry</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[])</span>\n",
-                            "    <span style=\"font-weight: bold\">)</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">lichen</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int32<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">lichen_strains</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">units_map</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">factory_map</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">factory_occupancy_map</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">factory_pos</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">12</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">])</span>\n",
-                            "<span style=\"font-weight: bold\">)</span>\n",
-                            "</pre>\n"
-                        ],
-                        "text/plain": [
-                            "\u001b[1;35mBoard\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "    \u001b[33mseed\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint32\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mfactories_per_team\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mmap\u001b[0m=\u001b[1;35mGameMap\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "        \u001b[33mrubble\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m48\u001b[0m,\u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mice\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mbool\u001b[1m[\u001b[0m\u001b[1;36m48\u001b[0m,\u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33more\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mbool\u001b[1m[\u001b[0m\u001b[1;36m48\u001b[0m,\u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33msymmetry\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "    \u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mlichen\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint32\u001b[1m[\u001b[0m\u001b[1;36m48\u001b[0m,\u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mlichen_strains\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m48\u001b[0m,\u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33munits_map\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m48\u001b[0m,\u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mfactory_map\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m48\u001b[0m,\u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mfactory_occupancy_map\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m48\u001b[0m,\u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mfactory_pos\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m12\u001b[0m,\u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "\u001b[1m)\u001b[0m\n"
-                        ]
-                    },
-                    "metadata": {},
-                    "output_type": "display_data"
-                }
-            ],
-            "source": [
-                "import jux.tree_util\n",
-                "import rich\n",
-                "rich.print(jux.tree_util.map_to_aval(state.board))"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "### Factory Information\n",
-                "\n",
-                "All information about factories, including their position, cargo, and power, are stored in `state.factories`. `state.n_factories` indicates the number of factories each player has. Because we have just reset the environment, both players have 0 factory. The leaves of `state.factories` have shapes shown as below. "
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 14,
-            "metadata": {},
-            "outputs": [
-                {
-                    "name": "stdout",
-                    "output_type": "stream",
-                    "text": [
-                        "state.n_factories = DeviceArray([2, 2], dtype=int8)\n"
-                    ]
-                },
-                {
-                    "data": {
-                        "text/html": [
-                            "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Factory</span><span style=\"font-weight: bold\">(</span>\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">team_id</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_id</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">pos</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Position</span><span style=\"font-weight: bold\">(</span><span style=\"color: #808000; text-decoration-color: #808000\">pos</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">]))</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">power</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int32<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">cargo</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitCargo</span><span style=\"font-weight: bold\">(</span><span style=\"color: #808000; text-decoration-color: #808000\">stock</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int32<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4</span><span style=\"font-weight: bold\">]))</span>\n",
-                            "<span style=\"font-weight: bold\">)</span>\n",
-                            "</pre>\n"
-                        ],
-                        "text/plain": [
-                            "\u001b[1;35mFactory\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "    \u001b[33mteam_id\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m6\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33munit_id\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m6\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mpos\u001b[0m=\u001b[1;35mPosition\u001b[0m\u001b[1m(\u001b[0m\u001b[33mpos\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m6\u001b[0m,\u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mpower\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint32\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m6\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mcargo\u001b[0m=\u001b[1;35mUnitCargo\u001b[0m\u001b[1m(\u001b[0m\u001b[33mstock\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint32\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m6\u001b[0m,\u001b[1;36m4\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "\u001b[1m)\u001b[0m\n"
-                        ]
-                    },
-                    "metadata": {},
-                    "output_type": "display_data"
-                }
-            ],
-            "source": [
-                "print(f\"{state.n_factories = }\")\n",
-                "rich.print(jux.tree_util.map_to_aval(state.factories))"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "All leaves of `state.factories` have leading dimensions of `(2, MAX_N_FACTORIES)`. Data of player 0 are stored in `state.factories.xxx[0]` and data of player 1 are stored in `state.factories.xxx[1]`.\n",
-                "\n",
-                "Assume `state.n_factories` is `[2, 3]`, then player 0 has 2 factories, and player 1 has 3 factories. For player 0, the 2 factories he/she owns have power `state.factories.power[0, 0]` and `state.units.factories[0, 1]`, respectively. All values in `state.factories.power[0, 2:]` are invalid and undefined, because player 0 only has 2 factories. The same rule applies to other fields in `state.factories`. "
-            ]
-        },
-        {
-            "attachments": {},
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "#### Memory layout: Object-frist vs Attribute-first\n",
-                "The memory layout of `state.factories` is different from the classic object-oriented programming style. Take power as an example, the power of all units are stored in a single array. We call such kind of memory layout **attribute-first**, because it arranges the same attributes of all objects into consecutive memory space. \n",
-                "\n",
-                "In classic object-oriented programming, if we have a list of objects, we usually stores all attributes of an object in a single memory block, and maintain a list of such memory block. It usually looks like:\n",
-                "```python\n",
-                "[\n",
-                "    Factory(unit_id=0, power=0, ... ),\n",
-                "    Factory( ... ),\n",
-                "    Factory( ... ),\n",
-                "    Factory( ... ),\n",
-                "    ...\n",
-                "]\n",
-                "```\n",
-                "This is called **object-first** memory layout, because it arranges the same object into consecutive memory space.\n",
-                "\n",
-                "In **attribute-first** layout, we only have one `Factory` object, but its attributes have a leading batch dimension. It looks like:\n",
-                "```python\n",
-                "Factory(\n",
-                "    unit_id=[0, 1, 2, 3, ...],\n",
-                "    power=[0, 0, 0, 0, ...],\n",
-                "    ...\n",
-                ")\n",
-                "```\n",
-                "\n",
-                "The biggest advantage of attribute-first layout is that it is array-friendly. We can use array operations to manipulate the data. For example, we can implement factory power gain by a simple vector addition. \n",
-                "```python\n",
-                "new_power = state.factories.power + state.env_cfg.FACTORY_CHARGE\n",
-                "```"
-            ]
-        },
-        {
-            "attachments": {},
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "### Unit Information\n",
-                "\n",
-                "Information about units, including their unit type, position, cargo, and power, are stored in `state.units`. `state.n_units` indicates the number of units each player has. The leaves of `state.units` have shapes shown as below. Similar as factories, units are also stored in attribute-first layout. All leaves of `state.units` have leading dimensions of `(2, MAX_N_UNITS)`. More info about `state.units.action_queue` will be elaborated in next section."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 15,
-            "metadata": {},
-            "outputs": [
-                {
-                    "name": "stdout",
-                    "output_type": "stream",
-                    "text": [
-                        "state.n_units = DeviceArray([2, 2], dtype=int16)\n"
-                    ]
-                },
-                {
-                    "data": {
-                        "text/html": [
-                            "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Unit</span><span style=\"font-weight: bold\">(</span>\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">action_queue</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ActionQueue</span><span style=\"font-weight: bold\">(</span>\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">data</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitAction</span><span style=\"font-weight: bold\">(</span>\n",
-                            "            <span style=\"color: #808000; text-decoration-color: #808000\">action_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "            <span style=\"color: #808000; text-decoration-color: #808000\">direction</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "            <span style=\"color: #808000; text-decoration-color: #808000\">resource_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "            <span style=\"color: #808000; text-decoration-color: #808000\">amount</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "            <span style=\"color: #808000; text-decoration-color: #808000\">repeat</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "            <span style=\"color: #808000; text-decoration-color: #808000\">n</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>\n",
-                            "        <span style=\"font-weight: bold\">)</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">front</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">rear</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">count</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>\n",
-                            "    <span style=\"font-weight: bold\">)</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">team_id</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_id</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">pos</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Position</span><span style=\"font-weight: bold\">(</span><span style=\"color: #808000; text-decoration-color: #808000\">pos</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">]))</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">cargo</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitCargo</span><span style=\"font-weight: bold\">(</span><span style=\"color: #808000; text-decoration-color: #808000\">stock</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int32<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4</span><span style=\"font-weight: bold\">]))</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">power</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int32<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>\n",
-                            "<span style=\"font-weight: bold\">)</span>\n",
-                            "</pre>\n"
-                        ],
-                        "text/plain": [
-                            "\u001b[1;35mUnit\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "    \u001b[33munit_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33maction_queue\u001b[0m=\u001b[1;35mActionQueue\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "        \u001b[33mdata\u001b[0m=\u001b[1;35mUnitAction\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "            \u001b[33maction_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "            \u001b[33mdirection\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "            \u001b[33mresource_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "            \u001b[33mamount\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "            \u001b[33mrepeat\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "            \u001b[33mn\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "        \u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mfront\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mrear\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mcount\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "    \u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mteam_id\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33munit_id\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mpos\u001b[0m=\u001b[1;35mPosition\u001b[0m\u001b[1m(\u001b[0m\u001b[33mpos\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mcargo\u001b[0m=\u001b[1;35mUnitCargo\u001b[0m\u001b[1m(\u001b[0m\u001b[33mstock\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint32\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m4\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mpower\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint32\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "\u001b[1m)\u001b[0m\n"
-                        ]
-                    },
-                    "metadata": {},
-                    "output_type": "display_data"
-                }
-            ],
-            "source": [
-                "print(f\"{state.n_units = }\")\n",
-                "rich.print(jux.tree_util.map_to_aval(state.units))"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "## Understanding Robot Actions\n",
-                "\n",
-                "The whole actions system is designed upon three classes `UnitAction`, `ActionQueue` and `JuxActions`.\n",
-                "1. `UnitAction`: the class representing single robot action.\n",
-                "2. `ActionQueue`: a bi-directional queue storing a sequence of actions.\n",
-                "3. `JuxActions`: a NamedTuple containing both actions for factories and robots, mainly used as input to `JuxEnv.step_late_game()`.\n"
-            ]
-        },
-        {
-            "attachments": {},
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "### UnitAction\n",
-                "\n",
-                "Actions of robots are represented by `UnitAction` objects. There are five fields in `UnitAction`:\n",
-                "\n",
-                "| fields          | dtype | description                                          |\n",
-                "|:--------------- |:----- |:---------------------------------------------------- |\n",
-                "| `action_type`   | int8  | indicates the action type.                           |\n",
-                "| `direction`     | int8  | used in `MOVE` and `TRANSFER` actions.               |\n",
-                "| `resource_type` | int8  | used in `PICKUP` and `TRANSFER` actions.             |\n",
-                "| `amount`        | int16 | used in `PICKUP`, `TRANSFER` and `RECHARGE` actions. |\n",
-                "| `repeat`        | int8  | used in all actions.                                 |\n",
-                "| `n`             | int16 | used in all actions.                                 |"
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 16,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "text/html": [
-                            "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitAction</span><span style=\"font-weight: bold\">(</span>\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">action_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">DeviceArray</span><span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #808000; text-decoration-color: #808000\">dtype</span>=<span style=\"color: #800080; text-decoration-color: #800080\">int8</span><span style=\"font-weight: bold\">)</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">direction</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">DeviceArray</span><span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #808000; text-decoration-color: #808000\">dtype</span>=<span style=\"color: #800080; text-decoration-color: #800080\">int8</span><span style=\"font-weight: bold\">)</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">resource_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">DeviceArray</span><span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #808000; text-decoration-color: #808000\">dtype</span>=<span style=\"color: #800080; text-decoration-color: #800080\">int8</span><span style=\"font-weight: bold\">)</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">amount</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">DeviceArray</span><span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #808000; text-decoration-color: #808000\">dtype</span>=<span style=\"color: #800080; text-decoration-color: #800080\">int16</span><span style=\"font-weight: bold\">)</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">repeat</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">DeviceArray</span><span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #808000; text-decoration-color: #808000\">dtype</span>=<span style=\"color: #800080; text-decoration-color: #800080\">int16</span><span style=\"font-weight: bold\">)</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">n</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">DeviceArray</span><span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #808000; text-decoration-color: #808000\">dtype</span>=<span style=\"color: #800080; text-decoration-color: #800080\">int16</span><span style=\"font-weight: bold\">)</span>\n",
-                            "<span style=\"font-weight: bold\">)</span>\n",
-                            "</pre>\n"
-                        ],
-                        "text/plain": [
-                            "\u001b[1;35mUnitAction\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "    \u001b[33maction_type\u001b[0m=\u001b[1;35mDeviceArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m0\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mint8\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mdirection\u001b[0m=\u001b[1;35mDeviceArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m1\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mint8\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mresource_type\u001b[0m=\u001b[1;35mDeviceArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m0\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mint8\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mamount\u001b[0m=\u001b[1;35mDeviceArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m0\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mint16\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mrepeat\u001b[0m=\u001b[1;35mDeviceArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m0\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mint16\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mn\u001b[0m=\u001b[1;35mDeviceArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m1\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mint16\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "\u001b[1m)\u001b[0m\n"
-                        ]
-                    },
-                    "metadata": {},
-                    "output_type": "display_data"
-                }
-            ],
-            "source": [
-                "from jux.map.position import Direction\n",
-                "from jux.actions import UnitAction\n",
-                "import rich\n",
-                "\n",
-                "move_action = UnitAction.move(Direction.UP, repeat=0)\n",
-                "rich.print(move_action)"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "`action_type` must be one of `UnitActionType`. There are 6 types of actions, numbered from 0 to 5. Note: `DO_NOTHING` (-1) is a special one, designed for internal use only. Users should not use it. "
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 17,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "text/plain": [
-                            "{-1: <UnitActionType.DO_NOTHING: -1>,\n",
-                            " 0: <UnitActionType.MOVE: 0>,\n",
-                            " 1: <UnitActionType.TRANSFER: 1>,\n",
-                            " 2: <UnitActionType.PICKUP: 2>,\n",
-                            " 3: <UnitActionType.DIG: 3>,\n",
-                            " 4: <UnitActionType.SELF_DESTRUCT: 4>,\n",
-                            " 5: <UnitActionType.RECHARGE: 5>}"
-                        ]
-                    },
-                    "execution_count": 17,
-                    "metadata": {},
-                    "output_type": "execute_result"
-                }
-            ],
-            "source": [
-                "from jux.actions import UnitActionType\n",
-                "\n",
-                "{int(a): a for a in UnitActionType}"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "`direction` must be one of `Direction`. There are 5 directions, numbered from 0 to 4."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 18,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "text/plain": [
-                            "{0: <Direction.CENTER: 0>,\n",
-                            " 1: <Direction.UP: 1>,\n",
-                            " 2: <Direction.RIGHT: 2>,\n",
-                            " 3: <Direction.DOWN: 3>,\n",
-                            " 4: <Direction.LEFT: 4>}"
-                        ]
-                    },
-                    "execution_count": 18,
-                    "metadata": {},
-                    "output_type": "execute_result"
-                }
-            ],
-            "source": [
-                "from jux.map.position import Direction\n",
-                "\n",
-                "{int(a): a for a in Direction}"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "`resource_type` must be one of `ResourceType`. There are 4 types of resources, numbered from 0 to 3."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 19,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "text/plain": [
-                            "{0: <ResourceType.ice: 0>,\n",
-                            " 1: <ResourceType.ore: 1>,\n",
-                            " 2: <ResourceType.water: 2>,\n",
-                            " 3: <ResourceType.metal: 3>,\n",
-                            " 4: <ResourceType.power: 4>}"
-                        ]
-                    },
-                    "execution_count": 19,
-                    "metadata": {},
-                    "output_type": "execute_result"
-                }
-            ],
-            "source": [
-                "from jux.unit_cargo import ResourceType\n",
-                "\n",
-                "{int(a): a for a in ResourceType}"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "### Action Queue"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "The most complicated part about `units` is its action queue. The action queue for single unit has following structure."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 20,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "text/html": [
-                            "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ActionQueue</span><span style=\"font-weight: bold\">(</span>\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">data</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitAction</span><span style=\"font-weight: bold\">(</span>\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">action_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">direction</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">resource_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">amount</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">repeat</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">n</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>\n",
-                            "    <span style=\"font-weight: bold\">)</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">front</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">rear</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">count</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[])</span>\n",
-                            "<span style=\"font-weight: bold\">)</span>\n",
-                            "</pre>\n"
-                        ],
-                        "text/plain": [
-                            "\u001b[1;35mActionQueue\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "    \u001b[33mdata\u001b[0m=\u001b[1;35mUnitAction\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "        \u001b[33maction_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mdirection\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mresource_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mamount\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mrepeat\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mn\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "    \u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mfront\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mrear\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mcount\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "\u001b[1m)\u001b[0m\n"
-                        ]
-                    },
-                    "metadata": {},
-                    "output_type": "display_data"
-                }
-            ],
-            "source": [
-                "from jux.actions import ActionQueue\n",
-                "action_queue = ActionQueue.empty(capacity=state.env_cfg.UNIT_ACTION_QUEUE_SIZE)\n",
-                "rich.print(jux.tree_util.map_to_aval(action_queue))"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "Units' actions are stored in `state.units.action_queue`, which is a bi-directional queue implemented in jax. `ActionQueue` has four fields: `data`, `count`, `front`, and `rear`. \n",
-                "1. `data` is a `UnitAction` object, containing `UNIT_ACTION_QUEUE_SIZE` actions in attribute-first layout, so its attributes have a leading dimension of `UNIT_ACTION_QUEUE_SIZE`.\n",
-                "2. `count` indicates the number of actions in the queue.\n",
-                "3. `front` is the index of the first action in the queue. \n",
-                "4. `rear` is the index of the first empty slot in the queue, which is also the position for next push back. `(rear - 1) % capacity` is the index of the last action in the queue."
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "Above is the structure of action queue for a single unit. Now, let's have a look at `state.units.action_queue`, which contains the action queue for all units. The main difference is that all leaves are added with two leading dimensions of `(2, MAX_N_UNITS)`. Again, this is because we use attribute-first layout."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 21,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "text/html": [
-                            "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ActionQueue</span><span style=\"font-weight: bold\">(</span>\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">data</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitAction</span><span style=\"font-weight: bold\">(</span>\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">action_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">direction</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">resource_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">amount</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">repeat</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">n</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>\n",
-                            "    <span style=\"font-weight: bold\">)</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">front</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">rear</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">count</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>\n",
-                            "<span style=\"font-weight: bold\">)</span>\n",
-                            "</pre>\n"
-                        ],
-                        "text/plain": [
-                            "\u001b[1;35mActionQueue\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "    \u001b[33mdata\u001b[0m=\u001b[1;35mUnitAction\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "        \u001b[33maction_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mdirection\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mresource_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mamount\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mrepeat\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mn\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "    \u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mfront\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mrear\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mcount\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "\u001b[1m)\u001b[0m\n"
-                        ]
-                    },
-                    "metadata": {},
-                    "output_type": "display_data"
-                }
-            ],
-            "source": [
-                "rich.print(jux.tree_util.map_to_aval(state.units.action_queue))"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "`ActionQueue` provides several useful methods, such as `push_back()`, `push_front()`, `pop()` and `peek()`. However, all these methods can only be applied to the queues of a single unit. `state.units.action_queue` has two batch dimension, one for player, one for units, so we need to `vmap` these methods two times. The following code shows how to peek the next actions of all units. The returned `act` contains the next actions of all units, again, in attribute-first layout."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 22,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "text/html": [
-                            "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitAction</span><span style=\"font-weight: bold\">(</span>\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">action_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">direction</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">resource_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">amount</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">repeat</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">n</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>\n",
-                            "<span style=\"font-weight: bold\">)</span>\n",
-                            "</pre>\n"
-                        ],
-                        "text/plain": [
-                            "\u001b[1;35mUnitAction\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "    \u001b[33maction_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mdirection\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mresource_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mamount\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mrepeat\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mn\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "\u001b[1m)\u001b[0m\n"
-                        ]
-                    },
-                    "metadata": {},
-                    "output_type": "display_data"
-                }
-            ],
-            "source": [
-                "from jux.actions import ActionQueue\n",
-                "import jax\n",
-                "peek_vmap_vmap = jax.vmap(jax.vmap(ActionQueue.peek))\n",
-                "act = peek_vmap_vmap(state.units.action_queue)\n",
-                "rich.print(jux.tree_util.map_to_aval(act))"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "### JuxAction\n",
-                "\n",
-                "`JuxAction` is a NamedTuple containing both actions for factories and robots, mainly used as input to `JuxEnv.step_late_game()`. It has four fields: `factory_actions`, `unit_action_queue`, `unit_action_queue_count` and `unit_action_queue_update`.\n",
-                "1. `factory_actions`: the actions for each factories.\n",
-                "2. `unit_action_queue_update`: a boolean array indicating whether a unit's action queue should be updated or not in this turn.\n",
-                "3. `unit_action_queue`: What actions will be in the new action queue, If update.\n",
-                "4. `unit_action_queue_count`: How many actions will there be in the new action queue, if update."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 23,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "text/html": [
-                            "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">JuxAction</span><span style=\"font-weight: bold\">(</span>\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">factory_action</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_action_queue</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitAction</span><span style=\"font-weight: bold\">(</span>\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">action_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">direction</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">resource_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">amount</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">repeat</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">n</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>\n",
-                            "    <span style=\"font-weight: bold\">)</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_action_queue_count</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_action_queue_update</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>bool<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>\n",
-                            "<span style=\"font-weight: bold\">)</span>\n",
-                            "</pre>\n"
-                        ],
-                        "text/plain": [
-                            "\u001b[1;35mJuxAction\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "    \u001b[33mfactory_action\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m6\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33munit_action_queue\u001b[0m=\u001b[1;35mUnitAction\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "        \u001b[33maction_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mdirection\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mresource_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mamount\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mrepeat\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mn\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "    \u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33munit_action_queue_count\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33munit_action_queue_update\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mbool\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "\u001b[1m)\u001b[0m\n"
-                        ]
-                    },
-                    "metadata": {},
-                    "output_type": "display_data"
-                }
-            ],
-            "source": [
-                "jux_act = JuxAction.from_lux(state, lux_act)\n",
-                "rich.print(jux.tree_util.map_to_aval(jux_act))"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "There are four types of actions for factories: `DO_NOTHING`, `BUILD_LIGHT`, `BUILD_HEAVY` and `WATER`, numbered from -1 to 2."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 24,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "text/plain": [
-                            "{-1: <FactoryAction.DO_NOTHING: -1>,\n",
-                            " 0: <FactoryAction.BUILD_LIGHT: 0>,\n",
-                            " 1: <FactoryAction.BUILD_HEAVY: 1>,\n",
-                            " 2: <FactoryAction.WATER: 2>}"
-                        ]
-                    },
-                    "execution_count": 24,
-                    "metadata": {},
-                    "output_type": "execute_result"
-                }
-            ],
-            "source": [
-                "from jux.actions import FactoryAction\n",
-                "\n",
-                "{int(a): a for a in FactoryAction}"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "## Run a Batch of Environments\n",
-                "Running a single environment cannot take full advantage of the power of modern GPU. This section will show you how to run a batch of environments at once. We first create a `JuxEnvBatch` object."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 25,
-            "metadata": {},
-            "outputs": [],
-            "source": [
-                "from jux.env import JuxEnvBatch\n",
-                "\n",
-                "jux_env_batch = JuxEnvBatch(buf_cfg=JuxBufferConfig(MAX_N_UNITS=200))"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "Then, reset the environment to get initial states. Instead of passing in a single seed, we pass in a batch of seeds. The batch size is determined by the size of the seed array."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 26,
-            "metadata": {},
-            "outputs": [],
-            "source": [
-                "import jax.numpy as jnp\n",
-                "\n",
-                "batch_size = 10\n",
-                "seeds = jnp.arange(batch_size)\n",
-                "\n",
-                "states = jux_env_batch.reset(seeds)"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "According to our attribute-first memory layout, states is still a `State` object, but all leaves are added with a leading dimension of `batch_size`."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 27,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "text/html": [
-                            "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Factory</span><span style=\"font-weight: bold\">(</span>\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">team_id</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_id</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">pos</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Position</span><span style=\"font-weight: bold\">(</span><span style=\"color: #808000; text-decoration-color: #808000\">pos</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">]))</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">power</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int32<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">cargo</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitCargo</span><span style=\"font-weight: bold\">(</span><span style=\"color: #808000; text-decoration-color: #808000\">stock</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int32<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4</span><span style=\"font-weight: bold\">]))</span>\n",
-                            "<span style=\"font-weight: bold\">)</span>\n",
-                            "</pre>\n"
-                        ],
-                        "text/plain": [
-                            "\u001b[1;35mFactory\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "    \u001b[33mteam_id\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m6\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33munit_id\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m6\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mpos\u001b[0m=\u001b[1;35mPosition\u001b[0m\u001b[1m(\u001b[0m\u001b[33mpos\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m6\u001b[0m,\u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mpower\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint32\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m6\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mcargo\u001b[0m=\u001b[1;35mUnitCargo\u001b[0m\u001b[1m(\u001b[0m\u001b[33mstock\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint32\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m6\u001b[0m,\u001b[1;36m4\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "\u001b[1m)\u001b[0m\n"
-                        ]
-                    },
-                    "metadata": {},
-                    "output_type": "display_data"
-                }
-            ],
-            "source": [
-                "rich.print(jux.tree_util.map_to_aval(states.factories))"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "The states returned by `JuxEnvBatch.reset()` shares the same environmental config and jux buffer config. In addition, they are also guaranteed to have the same `states.board.factories_per_team`, so they take the same number of turns to place factories."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 28,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "text/plain": [
-                            "DeviceArray([2, 2, 2, 2, 2, 2, 2, 2, 2, 2], dtype=int8)"
-                        ]
-                    },
-                    "execution_count": 28,
-                    "metadata": {},
-                    "output_type": "execute_result"
-                }
-            ],
-            "source": [
-                "states.board.factories_per_team"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "Similarly, other arguments of `JuxEnvBatch.step_*()` are also batched. All arrays must have a leading dimension of `batch_size`."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 29,
-            "metadata": {},
-            "outputs": [
-                {
-                    "name": "stdout",
-                    "output_type": "stream",
-                    "text": [
-                        "bid: ShapedArray(int32[10,2])\n",
-                        "faction: ShapedArray(int8[10,2])\n"
-                    ]
-                }
-            ],
-            "source": [
-                "# bid step\n",
-                "bid = jnp.zeros((batch_size, 2), dtype=jnp.int32)\n",
-                "faction = jnp.zeros((batch_size, 2), dtype=jnp.int8)\n",
-                "\n",
-                "states, (observations, rewards, dones, infos) = jux_env_batch.step_bid(states, bid, faction)\n",
-                "\n",
-                "print(f\"bid: {bid.aval}\")\n",
-                "print(f\"faction: {faction.aval}\")"
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 30,
-            "metadata": {},
-            "outputs": [
-                {
-                    "name": "stdout",
-                    "output_type": "stream",
-                    "text": [
-                        "spawn: ShapedArray(int8[10,2,2])\n",
-                        "water: ShapedArray(int32[10,2])\n",
-                        "metal: ShapedArray(int32[10,2])\n"
-                    ]
-                }
-            ],
-            "source": [
-                "key = jax.random.PRNGKey(0)\n",
-                "water = jnp.ones((batch_size, 2), dtype=jnp.int32) * 150\n",
-                "metal = jnp.ones((batch_size, 2), dtype=jnp.int32) * 150\n",
-                "\n",
-                "# factory placement step\n",
-                "factories_per_team = states.board.factories_per_team[0]\n",
-                "for i in range(factories_per_team * 2):\n",
-                "    # random spawn position\n",
-                "    key, subkey = jax.random.split(key)\n",
-                "    spawn = jax.random.randint(subkey, (batch_size, 2, 2), 0, jux_env_batch.env_cfg.map_size, dtype=jnp.int8)\n",
-                "    states, (observations, rewards, dones, infos) = jux_env_batch.step_factory_placement(states, spawn, water, metal)\n",
-                "\n",
-                "print(f\"spawn: {spawn.aval}\")\n",
-                "print(f\"water: {water.aval}\")\n",
-                "print(f\"metal: {metal.aval}\")"
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 31,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "text/html": [
-                            "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">JuxAction</span><span style=\"font-weight: bold\">(</span>\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">factory_action</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_action_queue</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitAction</span><span style=\"font-weight: bold\">(</span>\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">action_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">direction</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">resource_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">amount</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">repeat</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">n</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>\n",
-                            "    <span style=\"font-weight: bold\">)</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_action_queue_count</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_action_queue_update</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>bool<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>\n",
-                            "<span style=\"font-weight: bold\">)</span>\n",
-                            "</pre>\n"
-                        ],
-                        "text/plain": [
-                            "\u001b[1;35mJuxAction\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "    \u001b[33mfactory_action\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m6\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33munit_action_queue\u001b[0m=\u001b[1;35mUnitAction\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "        \u001b[33maction_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mdirection\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mresource_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mamount\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mrepeat\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mn\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "    \u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33munit_action_queue_count\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33munit_action_queue_update\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mbool\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "\u001b[1m)\u001b[0m\n"
-                        ]
-                    },
-                    "metadata": {},
-                    "output_type": "display_data"
-                }
-            ],
-            "source": [
-                "# a dummy action\n",
-                "jux_action = JuxAction.empty(\n",
-                "    jux_env_batch.env_cfg, \n",
-                "    jux_env_batch.buf_cfg\n",
-                ")\n",
-                "jux_action = jax.tree_map(lambda x: x[None].repeat(batch_size, axis=0), jux_action)\n",
-                "rich.print(jux.tree_util.map_to_aval(jux_action))\n",
-                "\n",
-                "# late game step\n",
-                "states, (observations, rewards, dones, infos) = jux_env_batch.step_late_game(states, jux_action)"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "## Convert between PyTorch and JAX"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "Since PyTorch is widely used in the community, we provide a simple way to convert between PyTorch and JAX. Following code shows how to convert observations (state) from JAX array to PyTorch tensor, so it can be feed into PyTorch models."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 32,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "text/html": [
-                            "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">State</span><span style=\"font-weight: bold\">(</span>\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">env_cfg</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-style: italic\">None</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">seed</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">rng_state</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">env_steps</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">board</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Board</span><span style=\"font-weight: bold\">(</span>\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">seed</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">factories_per_team</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">map</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">GameMap</span><span style=\"font-weight: bold\">(</span>\n",
-                            "            <span style=\"color: #808000; text-decoration-color: #808000\">rubble</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "            <span style=\"color: #808000; text-decoration-color: #808000\">ice</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "            <span style=\"color: #808000; text-decoration-color: #808000\">ore</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "            <span style=\"color: #808000; text-decoration-color: #808000\">symmetry</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span><span style=\"font-weight: bold\">])</span>\n",
-                            "        <span style=\"font-weight: bold\">)</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">lichen</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">lichen_strains</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">units_map</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">factory_map</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">factory_occupancy_map</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">factory_pos</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">12</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">])</span>\n",
-                            "    <span style=\"font-weight: bold\">)</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">units</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Unit</span><span style=\"font-weight: bold\">(</span>\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">unit_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">action_queue</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ActionQueue</span><span style=\"font-weight: bold\">(</span>\n",
-                            "            <span style=\"color: #808000; text-decoration-color: #808000\">data</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitAction</span><span style=\"font-weight: bold\">(</span>\n",
-                            "                <span style=\"color: #808000; text-decoration-color: #808000\">action_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "                <span style=\"color: #808000; text-decoration-color: #808000\">direction</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "                <span style=\"color: #808000; text-decoration-color: #808000\">resource_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "                <span style=\"color: #808000; text-decoration-color: #808000\">amount</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "                <span style=\"color: #808000; text-decoration-color: #808000\">repeat</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "                <span style=\"color: #808000; text-decoration-color: #808000\">n</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>\n",
-                            "            <span style=\"font-weight: bold\">)</span>,\n",
-                            "            <span style=\"color: #808000; text-decoration-color: #808000\">front</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "            <span style=\"color: #808000; text-decoration-color: #808000\">rear</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "            <span style=\"color: #808000; text-decoration-color: #808000\">count</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>\n",
-                            "        <span style=\"font-weight: bold\">)</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">team_id</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">unit_id</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">pos</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Position</span><span style=\"font-weight: bold\">(</span><span style=\"color: #808000; text-decoration-color: #808000\">pos</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">]))</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">cargo</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitCargo</span><span style=\"font-weight: bold\">(</span><span style=\"color: #808000; text-decoration-color: #808000\">stock</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4</span><span style=\"font-weight: bold\">]))</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">power</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>\n",
-                            "    <span style=\"font-weight: bold\">)</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_id2idx</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2000</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">n_units</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">factories</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Factory</span><span style=\"font-weight: bold\">(</span>\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">team_id</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">unit_id</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">pos</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Position</span><span style=\"font-weight: bold\">(</span><span style=\"color: #808000; text-decoration-color: #808000\">pos</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">]))</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">power</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">cargo</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitCargo</span><span style=\"font-weight: bold\">(</span><span style=\"color: #808000; text-decoration-color: #808000\">stock</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4</span><span style=\"font-weight: bold\">]))</span>\n",
-                            "    <span style=\"font-weight: bold\">)</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">factory_id2idx</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">12</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">n_factories</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">teams</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Team</span><span style=\"font-weight: bold\">(</span>\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">team_id</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">faction</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">init_water</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">init_metal</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">factories_to_place</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">factory_strains</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">n_factory</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "        <span style=\"color: #808000; text-decoration-color: #808000\">bid</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">])</span>\n",
-                            "    <span style=\"font-weight: bold\">)</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">global_id</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span><span style=\"font-weight: bold\">])</span>,\n",
-                            "    <span style=\"color: #808000; text-decoration-color: #808000\">place_first</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">torch</span><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">.Size</span><span style=\"font-weight: bold\">([</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span><span style=\"font-weight: bold\">])</span>\n",
-                            "<span style=\"font-weight: bold\">)</span>\n",
-                            "</pre>\n"
-                        ],
-                        "text/plain": [
-                            "\u001b[1;35mState\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "    \u001b[33menv_cfg\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-                            "    \u001b[33mseed\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mrng_state\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33menv_steps\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mboard\u001b[0m=\u001b[1;35mBoard\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "        \u001b[33mseed\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mfactories_per_team\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mmap\u001b[0m=\u001b[1;35mGameMap\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "            \u001b[33mrubble\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m48\u001b[0m, \u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "            \u001b[33mice\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m48\u001b[0m, \u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "            \u001b[33more\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m48\u001b[0m, \u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "            \u001b[33msymmetry\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "        \u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mlichen\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m48\u001b[0m, \u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mlichen_strains\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m48\u001b[0m, \u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33munits_map\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m48\u001b[0m, \u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mfactory_map\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m48\u001b[0m, \u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mfactory_occupancy_map\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m48\u001b[0m, \u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mfactory_pos\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m12\u001b[0m, \u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "    \u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33munits\u001b[0m=\u001b[1;35mUnit\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "        \u001b[33munit_type\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33maction_queue\u001b[0m=\u001b[1;35mActionQueue\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "            \u001b[33mdata\u001b[0m=\u001b[1;35mUnitAction\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "                \u001b[33maction_type\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m200\u001b[0m, \u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "                \u001b[33mdirection\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m200\u001b[0m, \u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "                \u001b[33mresource_type\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m200\u001b[0m, \u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "                \u001b[33mamount\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m200\u001b[0m, \u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "                \u001b[33mrepeat\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m200\u001b[0m, \u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "                \u001b[33mn\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m200\u001b[0m, \u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "            \u001b[1m)\u001b[0m,\n",
-                            "            \u001b[33mfront\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "            \u001b[33mrear\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "            \u001b[33mcount\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "        \u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mteam_id\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33munit_id\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mpos\u001b[0m=\u001b[1;35mPosition\u001b[0m\u001b[1m(\u001b[0m\u001b[33mpos\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m200\u001b[0m, \u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mcargo\u001b[0m=\u001b[1;35mUnitCargo\u001b[0m\u001b[1m(\u001b[0m\u001b[33mstock\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m200\u001b[0m, \u001b[1;36m4\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mpower\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "    \u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33munit_id2idx\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2000\u001b[0m, \u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mn_units\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mfactories\u001b[0m=\u001b[1;35mFactory\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "        \u001b[33mteam_id\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m6\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33munit_id\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m6\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mpos\u001b[0m=\u001b[1;35mPosition\u001b[0m\u001b[1m(\u001b[0m\u001b[33mpos\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m6\u001b[0m, \u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mpower\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m6\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mcargo\u001b[0m=\u001b[1;35mUnitCargo\u001b[0m\u001b[1m(\u001b[0m\u001b[33mstock\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m6\u001b[0m, \u001b[1;36m4\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "    \u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mfactory_id2idx\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m12\u001b[0m, \u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mn_factories\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mteams\u001b[0m=\u001b[1;35mTeam\u001b[0m\u001b[1m(\u001b[0m\n",
-                            "        \u001b[33mteam_id\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mfaction\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33minit_water\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33minit_metal\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mfactories_to_place\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mfactory_strains\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m, \u001b[1;36m6\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mn_factory\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "        \u001b[33mbid\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m, \u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "    \u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mglobal_id\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
-                            "    \u001b[33mplace_first\u001b[0m=\u001b[1;35mtorch\u001b[0m\u001b[1;35m.Size\u001b[0m\u001b[1m(\u001b[0m\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
-                            "\u001b[1m)\u001b[0m\n"
-                        ]
-                    },
-                    "metadata": {},
-                    "output_type": "display_data"
-                }
-            ],
-            "source": [
-                "# remove env_cfg to reduce output size\n",
-                "torch_state = states._replace(env_cfg=None).to_torch()\n",
-                "rich.print(jax.tree_map(lambda x: x.shape, torch_state))"
-            ]
-        },
-        {
-            "attachments": {},
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "You can also convert between PyTorch tensors and JAX arrays by `jux.torch.from_torch` and `jux.torch.to_torch`. Typical usage is to convert actions generated by PyTorch models to JAX arrays, so they can be feed into `JuxEnv.step_*()`."
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 33,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "text/plain": [
-                            "DeviceArray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32)"
-                        ]
-                    },
-                    "execution_count": 33,
-                    "metadata": {},
-                    "output_type": "execute_result"
-                }
-            ],
-            "source": [
-                "import torch\n",
-                "import jux.torch\n",
-                "\n",
-                "jux.torch.from_torch(torch.arange(10))"
-            ]
-        },
-        {
-            "cell_type": "code",
-            "execution_count": 34,
-            "metadata": {},
-            "outputs": [
-                {
-                    "data": {
-                        "text/plain": [
-                            "tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], device='cuda:0', dtype=torch.int32)"
-                        ]
-                    },
-                    "execution_count": 34,
-                    "metadata": {},
-                    "output_type": "execute_result"
-                }
-            ],
-            "source": [
-                "jux.torch.to_torch(jnp.arange(10))"
-            ]
-        },
-        {
-            "cell_type": "markdown",
-            "metadata": {},
-            "source": [
-                "There is also a utility function `JuxAction.from_torch()` for build a valid `JuxAction` object from PyTorch tensors."
-            ]
-        }
-    ],
-    "metadata": {
-        "kernelspec": {
-            "display_name": "base",
-            "language": "python",
-            "name": "python3"
-        },
-        "language_info": {
-            "codemirror_mode": {
-                "name": "ipython",
-                "version": 3
-            },
-            "file_extension": ".py",
-            "mimetype": "text/x-python",
-            "name": "python",
-            "nbconvert_exporter": "python",
-            "pygments_lexer": "ipython3",
-            "version": "3.8.13"
-        },
-        "orig_nbformat": 4,
-        "vscode": {
-            "interpreter": {
-                "hash": "d4d1e4263499bec80672ea0156c357c1ee493ec2b1c70f0acce89fc37c4a6abe"
-            }
-        }
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Jux Tutorial"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "JUX is a jax-accelerated game core for Lux AI Challenge Season 2. This tutorial will guide you through the usage of JUX. Make sure you have fully understand [game rules](https://www.lux-ai.org/specs-2022-beta) of Lux AI Challenge Season 2 before going through this tutorial. This tutorial requires you to have basic knowledge of JAX."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Collecting rich\n",
+      "  Obtaining dependency information for rich from https://files.pythonhosted.org/packages/c1/d1/23ba6235ed82883bb416f57179d1db2c05f3fb8e5d83c18660f9ab6f09c9/rich-13.5.3-py3-none-any.whl.metadata\n",
+      "  Downloading rich-13.5.3-py3-none-any.whl.metadata (18 kB)\n",
+      "Collecting markdown-it-py>=2.2.0 (from rich)\n",
+      "  Obtaining dependency information for markdown-it-py>=2.2.0 from https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl.metadata\n",
+      "  Using cached markdown_it_py-3.0.0-py3-none-any.whl.metadata (6.9 kB)\n",
+      "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /home/stao/mambaforge/envs/jux/lib/python3.9/site-packages (from rich) (2.16.1)\n",
+      "Collecting mdurl~=0.1 (from markdown-it-py>=2.2.0->rich)\n",
+      "  Using cached mdurl-0.1.2-py3-none-any.whl (10.0 kB)\n",
+      "Downloading rich-13.5.3-py3-none-any.whl (239 kB)\n",
+      "\u001b[2K   \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m239.8/239.8 kB\u001b[0m \u001b[31m1.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m31m882.2 kB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\n",
+      "\u001b[?25hUsing cached markdown_it_py-3.0.0-py3-none-any.whl (87 kB)\n",
+      "Installing collected packages: mdurl, markdown-it-py, rich\n",
+      "Successfully installed markdown-it-py-3.0.0 mdurl-0.1.2 rich-13.5.3\n",
+      "Note: you may need to restart the kernel to use updated packages.\n"
+     ]
+    }
+   ],
+   "source": [
+    "# rich is needed by this tutorial for nice printing\n",
+    "%pip install rich"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# The Art of Dancing with Shackles"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Programming in JAX is an art of dancing with shackles.\n",
+    "\n",
+    "JAX in nature is a library aimed for array manipulation, not for general purpose programming. Programming in JAX is quite different from normal programming paradigm, and sometimes painful. Nearly all weird APIs you encountered in JUX are due to some limitation JAX exerts on us. Here are some of them:\n",
+    "\n",
+    "1. We need to map all if-else, for-loop, and other normal statements to JAX's **array operators**. Good news is that this part is done in JUX, and you don't need to worry about it.\n",
+    "\n",
+    "2. We need to adopt a **functional programming style**, which means we need to avoid mutating variables, and use immutable data structures. Every time you want to change a field of a class, you need to create a new instance of that class. This explains why you must pass in current game state to every function in JUX, and receive a new game state from them.\n",
+    "\n",
+    "3. We have **no advanced data structures** like list, dict, set, etc. All we have is just array, and we need to imitate all kinds of data structures with array.\n",
+    "\n",
+    "4. We must adopt a strange **attribute-first memory layout**, which is counter-intuitive for most programmers at first glance, but it is the key to understand the game state object.\n",
+    "\n",
+    "5. To make functions jittable, all arrays must be of **static shape and dtype**. In other word, we have no stuff like lists with dynamic length. Every list must be of fixed length. If not, pad it to a fixed length, and use another variable to record the actual length.\n",
+    "\n",
+    "But, what can we get from JAX? The answer is the massive parallel computation power and perfect portability. We need not to write any CUDA kernels or even any C++ code to enjoy the power of GPU. The whole project is implemented in pure python, so it can run on Linux/Windows/MacOS, and on CPU/GPU/TPU or any other XLA-compatible devices. This is cool, isn't it?"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Create a New Environment\n",
+    "\n",
+    "We first create a new `JuxEnv` object. This object is analogous to a `LuxAI_S2`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "JuxBufferConfig(MAX_N_UNITS=200, MAX_GLOBAL_ID=2000, MAX_N_FACTORIES=11, MAP_SIZE=64)"
+      ]
+     },
+     "execution_count": 1,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from jux.env import JuxEnv\n",
+    "from jux.config import JuxBufferConfig, EnvConfig\n",
+    "\n",
+    "jux_env = JuxEnv(\n",
+    "    env_cfg=EnvConfig(),\n",
+    "    buf_cfg=JuxBufferConfig(MAX_N_UNITS=200),\n",
+    ")\n",
+    "\n",
+    "jux_env.buf_cfg"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Beside the `EnvConfig` configuration, we also need to specify the `JuxBufferConfig`. The most important parameter is the `MAX_N_UNITS`, which greatly affects the performance and memory usage. The default value is 1000. See the performance section in [README.md](README.md#performance) for more details.\n",
+    "\n",
+    "Then, we reset the environment."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "state = jux_env.reset(seed=0)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The `reset()` function returns a `State` object, which stores the the current state of the game. Since LuxAI_S2 is a perfect information game, the `State` object is also our initial observation. The first time we call `reset()` takes several seconds for jax to compile it, and subsequent calls will be finished on the fly. Please run above cell again to see the difference."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "We can visualize the game state by following code snippet. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "import matplotlib.pyplot as plt\n",
+    "img = jux_env.render(state, \"rgb_array\")\n",
+    "plt.axis('off')\n",
+    "plt.tight_layout()\n",
+    "plt.imshow(img)\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Step the Environment"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Let's first load a replay, and create our `JuxEnv` and `State` from it."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import jux.utils\n",
+    "\n",
+    "lux_env, lux_actions = jux.utils.load_replay(f'https://www.kaggleusercontent.com/episodes/{46215591}.json')\n",
+    "\n",
+    "jux_env, state = JuxEnv.from_lux(lux_env, buf_cfg=JuxBufferConfig(MAX_N_UNITS=200))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This section we show how to step the environment. LuxAI_S2 has three phases:\n",
+    "1. the initial bid step\n",
+    "2. the factory placement steps\n",
+    "3. the normal steps\n",
+    "\n",
+    "To deal with three different phases, the `LuxAI_S2.step()` function is replaced with three phase-specific step functions:\n",
+    "1. `JuxEnv.step_bid()`\n",
+    "2. `JuxEnv.step_factory_placement()`\n",
+    "3. `JuxEnv.step_late_game()`\n",
+    "\n",
+    "Each of them has unique signature and deal a specific game phase."
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Bid Step\n",
+    "\n",
+    "The first step is bid step, which is handled by `JuxEnv.step_bid()`. Jax adopts a functional programming style, so `JuxEnv` stores nothing about the game state. Every time we call `step_bid()`, the current game state shall be passed in, and a new game state is passed out. The same rule also applies to `step_factory_placement()` and `step_late_game()`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "bid action in Lux:\n",
+      "{'player_0': {'bid': 0, 'faction': 'AlphaStrike'},\n",
+      " 'player_1': {'bid': 0, 'faction': 'AlphaStrike'}}\n",
+      "\n",
+      "bid action in Jux:\n",
+      "bid = [0 0], faction = [0 0]\n"
+     ]
+    }
+   ],
+   "source": [
+    "import jux.actions\n",
+    "from pprint import pprint\n",
+    "\n",
+    "lux_act = next(lux_actions)\n",
+    "\n",
+    "print(\"bid action in Lux:\")\n",
+    "pprint(lux_act, compact=False)\n",
+    "\n",
+    "bid, faction = jux.actions.bid_action_from_lux(lux_act)\n",
+    "print()\n",
+    "print(\"bid action in Jux:\")\n",
+    "print(f\"{bid = !s}, {faction = !s}\")\n",
+    "\n",
+    "state, (observations, rewards, dones, infos) = jux_env.step_bid(state, bid, faction)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The argument `bid` and `faction` shall have following shapes."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "bid: ShapedArray(int32[2])\n",
+      "faction: ShapedArray(int8[2])\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(f\"bid: {bid.aval}\")\n",
+    "print(f\"faction: {faction.aval}\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "There are four factions, numbered from 0 to 3."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{0: <FactionTypes.AlphaStrike: 0>,\n",
+       " 1: <FactionTypes.MotherMars: 1>,\n",
+       " 2: <FactionTypes.TheBuilders: 2>,\n",
+       " 3: <FactionTypes.FirstMars: 3>}"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from jux.team import FactionTypes\n",
+    "\n",
+    "{int(f): f for f in FactionTypes}"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Beside new game state, there are also other four return values, `observations`, `rewards`, `dones`, and `infos`.\n",
+    "1. `observations` contains the observations for each player. Since LuxAI_S2 is a perfect information game, the observations are simply the same `state` object, i.e., \n",
+    "    ```python\n",
+    "    observations['player_0'] == observations['player_1'] == state\n",
+    "    ```\n",
+    "2. `rewards` contains the sum of lichens each player owns.\n",
+    "3. `dones` is a dictionary of boolean values, which indicates whether the game is over for each player. It is gaurenteed that \n",
+    "    ```python\n",
+    "    dones['player_0'] == dones['player_1']\n",
+    "    ```\n",
+    "4. `infos` for each player is an empty dictionary, because there is no other infos to provide. \n",
+    "    ```python\n",
+    "    infos['player_0'] == infos['player_1'] == {}\n",
+    "    ```"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Factory Placement Steps\n",
+    "\n",
+    "The factory placement step is handled by `JuxEnv.step_factory_placement()`. The next player to place a factory is indicated by `state.next_player`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "lux_act = {'player_0': {'metal': 150, 'spawn': [27, 25], 'water': 150}, 'player_1': {}}\n",
+      "player_0 place a factory at [27 25] with water=150, metal=150.\n",
+      "lux_act = {'player_0': {}, 'player_1': {'metal': 150, 'spawn': [19, 31], 'water': 150}}\n",
+      "player_1 place a factory at [19 31] with water=150, metal=150.\n",
+      "lux_act = {'player_0': {'metal': 150, 'spawn': [7, 10], 'water': 150}, 'player_1': {}}\n",
+      "player_0 place a factory at [ 7 10] with water=150, metal=150.\n",
+      "lux_act = {'player_0': {}, 'player_1': {'metal': 150, 'spawn': [7, 3], 'water': 150}}\n",
+      "player_1 place a factory at [7 3] with water=150, metal=150.\n"
+     ]
+    }
+   ],
+   "source": [
+    "while state.real_env_steps < 0:\n",
+    "    lux_act = next(lux_actions)\n",
+    "    print(f\"{lux_act = }\")\n",
+    "    spawn, water, metal = jux.actions.factory_placement_action_from_lux(lux_act)\n",
+    "\n",
+    "    print(f\"player_{state.next_player!s} place a factory at {spawn[state.next_player]}\",\n",
+    "          f\"with water={water[state.next_player]}, metal={metal[state.next_player]}.\")\n",
+    "    state, (observations, rewards, dones, infos) = jux_env.step_factory_placement(state, spawn, water, metal)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The argument `spawn`, `water`, and `metal` have a leading dimension 2, but only \n",
+    "- `spawn[state.next_player]`\n",
+    "- `water[state.next_player]`\n",
+    "- `metal[state.next_player]`\n",
+    "\n",
+    "are used."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "spawn: ShapedArray(int8[2,2])\n",
+      "water: ShapedArray(int32[2])\n",
+      "metal: ShapedArray(int32[2])\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(f\"spawn: {spawn.aval}\")\n",
+    "print(f\"water: {water.aval}\")\n",
+    "print(f\"metal: {metal.aval}\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This is the current game state."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "img = jux_env.render(state, \"rgb_array\")\n",
+    "plt.axis('off')\n",
+    "plt.tight_layout()\n",
+    "plt.imshow(img)\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Normal Steps\n",
+    "\n",
+    "The normal steps are handled by `JuxEnv.step_late_game()`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "from jux.actions import JuxAction\n",
+    "# prepare actions\n",
+    "lux_act = next(lux_actions)\n",
+    "jux_act = JuxAction.from_lux(state, lux_act)\n",
+    "\n",
+    "# step\n",
+    "state, (observations, rewards, dones, infos) = jux_env.step_late_game(state, jux_act)\n",
+    "\n",
+    "# render\n",
+    "img = jux_env.render(state, \"rgb_array\")\n",
+    "plt.axis('off')\n",
+    "plt.tight_layout()\n",
+    "plt.imshow(img)\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "`step_late_game()` takes an `JuxAction` object as input, which will be elaborated lately. The first time we call `step_late_game()` triggers the jax jit compilation, which is slow, but subsequent calls will be finished on the fly. You may run above cell again to see the difference."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Understanding the `State`\n",
+    "\n",
+    "`State` object is a nested `NamedTuple`, with all leaves being `jax.numpy.ndarray`. It has following fields. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('env_cfg',\n",
+       " 'seed',\n",
+       " 'rng_state',\n",
+       " 'env_steps',\n",
+       " 'board',\n",
+       " 'units',\n",
+       " 'unit_id2idx',\n",
+       " 'n_units',\n",
+       " 'factories',\n",
+       " 'factory_id2idx',\n",
+       " 'n_factories',\n",
+       " 'teams',\n",
+       " 'global_id',\n",
+       " 'place_first')"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "state._fields"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Board Information\n",
+    "\n",
+    "Information about the board, including rubble, ice, ore, and lichen, are stored in `state.board`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Board</span><span style=\"font-weight: bold\">(</span>\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">seed</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int32<span style=\"font-weight: bold\">[])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">factories_per_team</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">map</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">GameMap</span><span style=\"font-weight: bold\">(</span>\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">rubble</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">ice</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>bool<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">ore</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>bool<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">symmetry</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[])</span>\n",
+       "    <span style=\"font-weight: bold\">)</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">lichen</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int32<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">lichen_strains</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">units_map</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">factory_map</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">factory_occupancy_map</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">48</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">factory_pos</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">22</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">])</span>\n",
+       "<span style=\"font-weight: bold\">)</span>\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[1;35mBoard\u001b[0m\u001b[1m(\u001b[0m\n",
+       "    \u001b[33mseed\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint32\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mfactories_per_team\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mmap\u001b[0m=\u001b[1;35mGameMap\u001b[0m\u001b[1m(\u001b[0m\n",
+       "        \u001b[33mrubble\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m48\u001b[0m,\u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mice\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mbool\u001b[1m[\u001b[0m\u001b[1;36m48\u001b[0m,\u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33more\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mbool\u001b[1m[\u001b[0m\u001b[1;36m48\u001b[0m,\u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33msymmetry\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
+       "    \u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mlichen\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint32\u001b[1m[\u001b[0m\u001b[1;36m48\u001b[0m,\u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mlichen_strains\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m48\u001b[0m,\u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33munits_map\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m48\u001b[0m,\u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mfactory_map\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m48\u001b[0m,\u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mfactory_occupancy_map\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m48\u001b[0m,\u001b[1;36m48\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mfactory_pos\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m22\u001b[0m,\u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
+       "\u001b[1m)\u001b[0m\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "import jux.tree_util\n",
+    "import rich\n",
+    "rich.print(jux.tree_util.map_to_aval(state.board))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Factory Information\n",
+    "\n",
+    "All information about factories, including their position, cargo, and power, are stored in `state.factories`. `state.n_factories` indicates the number of factories each player has. Because we have just reset the environment, both players have 0 factory. The leaves of `state.factories` have shapes shown as below. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "state.n_factories = Array([2, 2], dtype=int8)\n"
+     ]
     },
-    "nbformat": 4,
-    "nbformat_minor": 2
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Factory</span><span style=\"font-weight: bold\">(</span>\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">team_id</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">11</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_id</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">11</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">pos</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Position</span><span style=\"font-weight: bold\">(</span><span style=\"color: #808000; text-decoration-color: #808000\">pos</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">11</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">]))</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">power</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int32<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">11</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">cargo</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitCargo</span><span style=\"font-weight: bold\">(</span><span style=\"color: #808000; text-decoration-color: #808000\">stock</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int32<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">11</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4</span><span style=\"font-weight: bold\">]))</span>\n",
+       "<span style=\"font-weight: bold\">)</span>\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[1;35mFactory\u001b[0m\u001b[1m(\u001b[0m\n",
+       "    \u001b[33mteam_id\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m11\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33munit_id\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m11\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mpos\u001b[0m=\u001b[1;35mPosition\u001b[0m\u001b[1m(\u001b[0m\u001b[33mpos\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m11\u001b[0m,\u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mpower\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint32\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m11\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mcargo\u001b[0m=\u001b[1;35mUnitCargo\u001b[0m\u001b[1m(\u001b[0m\u001b[33mstock\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint32\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m11\u001b[0m,\u001b[1;36m4\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m\n",
+       "\u001b[1m)\u001b[0m\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "print(f\"{state.n_factories = }\")\n",
+    "rich.print(jux.tree_util.map_to_aval(state.factories))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "All leaves of `state.factories` have leading dimensions of `(2, MAX_N_FACTORIES)`. Data of player 0 are stored in `state.factories.xxx[0]` and data of player 1 are stored in `state.factories.xxx[1]`.\n",
+    "\n",
+    "Assume `state.n_factories` is `[2, 3]`, then player 0 has 2 factories, and player 1 has 3 factories. For player 0, the 2 factories he/she owns have power `state.factories.power[0, 0]` and `state.units.factories[0, 1]`, respectively. All values in `state.factories.power[0, 2:]` are invalid and undefined, because player 0 only has 2 factories. The same rule applies to other fields in `state.factories`. "
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "#### Memory layout: Object-frist vs Attribute-first\n",
+    "The memory layout of `state.factories` is different from the classic object-oriented programming style. Take power as an example, the power of all units are stored in a single array. We call such kind of memory layout **attribute-first**, because it arranges the same attributes of all objects into consecutive memory space. \n",
+    "\n",
+    "In classic object-oriented programming, if we have a list of objects, we usually stores all attributes of an object in a single memory block, and maintain a list of such memory block. It usually looks like:\n",
+    "```python\n",
+    "[\n",
+    "    Factory(unit_id=0, power=0, ... ),\n",
+    "    Factory( ... ),\n",
+    "    Factory( ... ),\n",
+    "    Factory( ... ),\n",
+    "    ...\n",
+    "]\n",
+    "```\n",
+    "This is called **object-first** memory layout, because it arranges the same object into consecutive memory space.\n",
+    "\n",
+    "In **attribute-first** layout, we only have one `Factory` object, but its attributes have a leading batch dimension. It looks like:\n",
+    "```python\n",
+    "Factory(\n",
+    "    unit_id=[0, 1, 2, 3, ...],\n",
+    "    power=[0, 0, 0, 0, ...],\n",
+    "    ...\n",
+    ")\n",
+    "```\n",
+    "\n",
+    "The biggest advantage of attribute-first layout is that it is array-friendly. We can use array operations to manipulate the data. For example, we can implement factory power gain by a simple vector addition. \n",
+    "```python\n",
+    "new_power = state.factories.power + state.env_cfg.FACTORY_CHARGE\n",
+    "```"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Unit Information\n",
+    "\n",
+    "Information about units, including their unit type, position, cargo, and power, are stored in `state.units`. `state.n_units` indicates the number of units each player has. The leaves of `state.units` have shapes shown as below. Similar as factories, units are also stored in attribute-first layout. All leaves of `state.units` have leading dimensions of `(2, MAX_N_UNITS)`. More info about `state.units.action_queue` will be elaborated in next section."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "state.n_units = Array([2, 2], dtype=int16)\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Unit</span><span style=\"font-weight: bold\">(</span>\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">action_queue</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ActionQueue</span><span style=\"font-weight: bold\">(</span>\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">data</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitAction</span><span style=\"font-weight: bold\">(</span>\n",
+       "            <span style=\"color: #808000; text-decoration-color: #808000\">action_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "            <span style=\"color: #808000; text-decoration-color: #808000\">direction</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "            <span style=\"color: #808000; text-decoration-color: #808000\">resource_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "            <span style=\"color: #808000; text-decoration-color: #808000\">amount</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "            <span style=\"color: #808000; text-decoration-color: #808000\">repeat</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "            <span style=\"color: #808000; text-decoration-color: #808000\">n</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>\n",
+       "        <span style=\"font-weight: bold\">)</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">front</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">rear</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">count</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>\n",
+       "    <span style=\"font-weight: bold\">)</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">team_id</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_id</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">pos</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Position</span><span style=\"font-weight: bold\">(</span><span style=\"color: #808000; text-decoration-color: #808000\">pos</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">]))</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">cargo</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitCargo</span><span style=\"font-weight: bold\">(</span><span style=\"color: #808000; text-decoration-color: #808000\">stock</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int32<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4</span><span style=\"font-weight: bold\">]))</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">power</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int32<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>\n",
+       "<span style=\"font-weight: bold\">)</span>\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[1;35mUnit\u001b[0m\u001b[1m(\u001b[0m\n",
+       "    \u001b[33munit_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33maction_queue\u001b[0m=\u001b[1;35mActionQueue\u001b[0m\u001b[1m(\u001b[0m\n",
+       "        \u001b[33mdata\u001b[0m=\u001b[1;35mUnitAction\u001b[0m\u001b[1m(\u001b[0m\n",
+       "            \u001b[33maction_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "            \u001b[33mdirection\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "            \u001b[33mresource_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "            \u001b[33mamount\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "            \u001b[33mrepeat\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "            \u001b[33mn\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
+       "        \u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mfront\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mrear\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mcount\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
+       "    \u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mteam_id\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33munit_id\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mpos\u001b[0m=\u001b[1;35mPosition\u001b[0m\u001b[1m(\u001b[0m\u001b[33mpos\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mcargo\u001b[0m=\u001b[1;35mUnitCargo\u001b[0m\u001b[1m(\u001b[0m\u001b[33mstock\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint32\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m4\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mpower\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint32\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
+       "\u001b[1m)\u001b[0m\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "print(f\"{state.n_units = }\")\n",
+    "rich.print(jux.tree_util.map_to_aval(state.units))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Understanding Robot Actions\n",
+    "\n",
+    "The whole actions system is designed upon three classes `UnitAction`, `ActionQueue` and `JuxActions`.\n",
+    "1. `UnitAction`: the class representing single robot action.\n",
+    "2. `ActionQueue`: a bi-directional queue storing a sequence of actions.\n",
+    "3. `JuxActions`: a NamedTuple containing both actions for factories and robots, mainly used as input to `JuxEnv.step_late_game()`.\n"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### UnitAction\n",
+    "\n",
+    "Actions of robots are represented by `UnitAction` objects. There are five fields in `UnitAction`:\n",
+    "\n",
+    "| fields          | dtype | description                                          |\n",
+    "|:--------------- |:----- |:---------------------------------------------------- |\n",
+    "| `action_type`   | int8  | indicates the action type.                           |\n",
+    "| `direction`     | int8  | used in `MOVE` and `TRANSFER` actions.               |\n",
+    "| `resource_type` | int8  | used in `PICKUP` and `TRANSFER` actions.             |\n",
+    "| `amount`        | int16 | used in `PICKUP`, `TRANSFER` and `RECHARGE` actions. |\n",
+    "| `repeat`        | int8  | used in all actions.                                 |\n",
+    "| `n`             | int16 | used in all actions.                                 |"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitAction</span><span style=\"font-weight: bold\">(</span>\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">action_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Array</span><span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #808000; text-decoration-color: #808000\">dtype</span>=<span style=\"color: #800080; text-decoration-color: #800080\">int8</span><span style=\"font-weight: bold\">)</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">direction</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Array</span><span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #808000; text-decoration-color: #808000\">dtype</span>=<span style=\"color: #800080; text-decoration-color: #800080\">int8</span><span style=\"font-weight: bold\">)</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">resource_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Array</span><span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #808000; text-decoration-color: #808000\">dtype</span>=<span style=\"color: #800080; text-decoration-color: #800080\">int8</span><span style=\"font-weight: bold\">)</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">amount</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Array</span><span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #808000; text-decoration-color: #808000\">dtype</span>=<span style=\"color: #800080; text-decoration-color: #800080\">int16</span><span style=\"font-weight: bold\">)</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">repeat</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Array</span><span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>, <span style=\"color: #808000; text-decoration-color: #808000\">dtype</span>=<span style=\"color: #800080; text-decoration-color: #800080\">int16</span><span style=\"font-weight: bold\">)</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">n</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Array</span><span style=\"font-weight: bold\">(</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>, <span style=\"color: #808000; text-decoration-color: #808000\">dtype</span>=<span style=\"color: #800080; text-decoration-color: #800080\">int16</span><span style=\"font-weight: bold\">)</span>\n",
+       "<span style=\"font-weight: bold\">)</span>\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[1;35mUnitAction\u001b[0m\u001b[1m(\u001b[0m\n",
+       "    \u001b[33maction_type\u001b[0m=\u001b[1;35mArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m0\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mint8\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mdirection\u001b[0m=\u001b[1;35mArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m1\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mint8\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mresource_type\u001b[0m=\u001b[1;35mArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m0\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mint8\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mamount\u001b[0m=\u001b[1;35mArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m0\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mint16\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mrepeat\u001b[0m=\u001b[1;35mArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m0\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mint16\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mn\u001b[0m=\u001b[1;35mArray\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m1\u001b[0m, \u001b[33mdtype\u001b[0m=\u001b[35mint16\u001b[0m\u001b[1m)\u001b[0m\n",
+       "\u001b[1m)\u001b[0m\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "from jux.map.position import Direction\n",
+    "from jux.actions import UnitAction\n",
+    "import rich\n",
+    "\n",
+    "move_action = UnitAction.move(Direction.UP, repeat=0)\n",
+    "rich.print(move_action)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "`action_type` must be one of `UnitActionType`. There are 6 types of actions, numbered from 0 to 5. Note: `DO_NOTHING` (-1) is a special one, designed for internal use only. Users should not use it. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{-1: <UnitActionType.DO_NOTHING: -1>,\n",
+       " 0: <UnitActionType.MOVE: 0>,\n",
+       " 1: <UnitActionType.TRANSFER: 1>,\n",
+       " 2: <UnitActionType.PICKUP: 2>,\n",
+       " 3: <UnitActionType.DIG: 3>,\n",
+       " 4: <UnitActionType.SELF_DESTRUCT: 4>,\n",
+       " 5: <UnitActionType.RECHARGE: 5>}"
+      ]
+     },
+     "execution_count": 18,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from jux.actions import UnitActionType\n",
+    "\n",
+    "{int(a): a for a in UnitActionType}"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "`direction` must be one of `Direction`. There are 5 directions, numbered from 0 to 4."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{0: <Direction.CENTER: 0>,\n",
+       " 1: <Direction.UP: 1>,\n",
+       " 2: <Direction.RIGHT: 2>,\n",
+       " 3: <Direction.DOWN: 3>,\n",
+       " 4: <Direction.LEFT: 4>}"
+      ]
+     },
+     "execution_count": 19,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from jux.map.position import Direction\n",
+    "\n",
+    "{int(a): a for a in Direction}"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "`resource_type` must be one of `ResourceType`. There are 4 types of resources, numbered from 0 to 3."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{0: <ResourceType.ice: 0>,\n",
+       " 1: <ResourceType.ore: 1>,\n",
+       " 2: <ResourceType.water: 2>,\n",
+       " 3: <ResourceType.metal: 3>,\n",
+       " 4: <ResourceType.power: 4>}"
+      ]
+     },
+     "execution_count": 20,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from jux.unit_cargo import ResourceType\n",
+    "\n",
+    "{int(a): a for a in ResourceType}"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Action Queue"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The most complicated part about `units` is its action queue. The action queue for single unit has following structure."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ActionQueue</span><span style=\"font-weight: bold\">(</span>\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">data</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitAction</span><span style=\"font-weight: bold\">(</span>\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">action_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">direction</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">resource_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">amount</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">repeat</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">n</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>\n",
+       "    <span style=\"font-weight: bold\">)</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">front</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">rear</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">count</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[])</span>\n",
+       "<span style=\"font-weight: bold\">)</span>\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[1;35mActionQueue\u001b[0m\u001b[1m(\u001b[0m\n",
+       "    \u001b[33mdata\u001b[0m=\u001b[1;35mUnitAction\u001b[0m\u001b[1m(\u001b[0m\n",
+       "        \u001b[33maction_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mdirection\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mresource_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mamount\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mrepeat\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mn\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
+       "    \u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mfront\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mrear\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mcount\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
+       "\u001b[1m)\u001b[0m\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "from jux.actions import ActionQueue\n",
+    "action_queue = ActionQueue.empty(capacity=state.env_cfg.UNIT_ACTION_QUEUE_SIZE)\n",
+    "rich.print(jux.tree_util.map_to_aval(action_queue))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Units' actions are stored in `state.units.action_queue`, which is a bi-directional queue implemented in jax. `ActionQueue` has four fields: `data`, `count`, `front`, and `rear`. \n",
+    "1. `data` is a `UnitAction` object, containing `UNIT_ACTION_QUEUE_SIZE` actions in attribute-first layout, so its attributes have a leading dimension of `UNIT_ACTION_QUEUE_SIZE`.\n",
+    "2. `count` indicates the number of actions in the queue.\n",
+    "3. `front` is the index of the first action in the queue. \n",
+    "4. `rear` is the index of the first empty slot in the queue, which is also the position for next push back. `(rear - 1) % capacity` is the index of the last action in the queue."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Above is the structure of action queue for a single unit. Now, let's have a look at `state.units.action_queue`, which contains the action queue for all units. The main difference is that all leaves are added with two leading dimensions of `(2, MAX_N_UNITS)`. Again, this is because we use attribute-first layout."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ActionQueue</span><span style=\"font-weight: bold\">(</span>\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">data</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitAction</span><span style=\"font-weight: bold\">(</span>\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">action_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">direction</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">resource_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">amount</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">repeat</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">n</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>\n",
+       "    <span style=\"font-weight: bold\">)</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">front</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">rear</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">count</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>\n",
+       "<span style=\"font-weight: bold\">)</span>\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[1;35mActionQueue\u001b[0m\u001b[1m(\u001b[0m\n",
+       "    \u001b[33mdata\u001b[0m=\u001b[1;35mUnitAction\u001b[0m\u001b[1m(\u001b[0m\n",
+       "        \u001b[33maction_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mdirection\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mresource_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mamount\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mrepeat\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mn\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
+       "    \u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mfront\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mrear\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mcount\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
+       "\u001b[1m)\u001b[0m\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "rich.print(jux.tree_util.map_to_aval(state.units.action_queue))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "`ActionQueue` provides several useful methods, such as `push_back()`, `push_front()`, `pop()` and `peek()`. However, all these methods can only be applied to the queues of a single unit. `state.units.action_queue` has two batch dimension, one for player, one for units, so we need to `vmap` these methods two times. The following code shows how to peek the next actions of all units. The returned `act` contains the next actions of all units, again, in attribute-first layout."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitAction</span><span style=\"font-weight: bold\">(</span>\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">action_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">direction</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">resource_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">amount</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">repeat</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">n</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>\n",
+       "<span style=\"font-weight: bold\">)</span>\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[1;35mUnitAction\u001b[0m\u001b[1m(\u001b[0m\n",
+       "    \u001b[33maction_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mdirection\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mresource_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mamount\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mrepeat\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mn\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
+       "\u001b[1m)\u001b[0m\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "from jux.actions import ActionQueue\n",
+    "import jax\n",
+    "peek_vmap_vmap = jax.vmap(jax.vmap(ActionQueue.peek))\n",
+    "act = peek_vmap_vmap(state.units.action_queue)\n",
+    "rich.print(jux.tree_util.map_to_aval(act))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### JuxAction\n",
+    "\n",
+    "`JuxAction` is a NamedTuple containing both actions for factories and robots, mainly used as input to `JuxEnv.step_late_game()`. It has four fields: `factory_actions`, `unit_action_queue`, `unit_action_queue_count` and `unit_action_queue_update`.\n",
+    "1. `factory_actions`: the actions for each factories.\n",
+    "2. `unit_action_queue_update`: a boolean array indicating whether a unit's action queue should be updated or not in this turn.\n",
+    "3. `unit_action_queue`: What actions will be in the new action queue, If update.\n",
+    "4. `unit_action_queue_count`: How many actions will there be in the new action queue, if update."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">JuxAction</span><span style=\"font-weight: bold\">(</span>\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">factory_action</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">11</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_action_queue</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitAction</span><span style=\"font-weight: bold\">(</span>\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">action_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">direction</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">resource_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">amount</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">repeat</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">n</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>\n",
+       "    <span style=\"font-weight: bold\">)</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_action_queue_count</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_action_queue_update</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>bool<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>\n",
+       "<span style=\"font-weight: bold\">)</span>\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[1;35mJuxAction\u001b[0m\u001b[1m(\u001b[0m\n",
+       "    \u001b[33mfactory_action\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m11\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33munit_action_queue\u001b[0m=\u001b[1;35mUnitAction\u001b[0m\u001b[1m(\u001b[0m\n",
+       "        \u001b[33maction_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mdirection\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mresource_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mamount\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mrepeat\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mn\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
+       "    \u001b[1m)\u001b[0m,\n",
+       "    \u001b[33munit_action_queue_count\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33munit_action_queue_update\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mbool\u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
+       "\u001b[1m)\u001b[0m\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "jux_act = JuxAction.from_lux(state, lux_act)\n",
+    "rich.print(jux.tree_util.map_to_aval(jux_act))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "There are four types of actions for factories: `DO_NOTHING`, `BUILD_LIGHT`, `BUILD_HEAVY` and `WATER`, numbered from -1 to 2."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{-1: <FactoryAction.DO_NOTHING: -1>,\n",
+       " 0: <FactoryAction.BUILD_LIGHT: 0>,\n",
+       " 1: <FactoryAction.BUILD_HEAVY: 1>,\n",
+       " 2: <FactoryAction.WATER: 2>}"
+      ]
+     },
+     "execution_count": 25,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from jux.actions import FactoryAction\n",
+    "\n",
+    "{int(a): a for a in FactoryAction}"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Run a Batch of Environments\n",
+    "Running a single environment cannot take full advantage of the power of modern GPU. This section will show you how to run a batch of environments at once. We first create a `JuxEnvBatch` object."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 55,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from jux.env import JuxEnvBatch\n",
+    "\n",
+    "jux_env_batch = JuxEnvBatch(buf_cfg=JuxBufferConfig(MAX_N_UNITS=200))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Then, reset the environment to get initial states. Instead of passing in a single seed, we pass in a batch of seeds. The batch size is determined by the size of the seed array."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 60,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import jax.numpy as jnp\n",
+    "\n",
+    "batch_size = 10\n",
+    "seeds = jnp.arange(batch_size)\n",
+    "\n",
+    "states = jux_env_batch.reset(seeds)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Note that the default env rendering function is CPU based and only works for non batched environments. In order to render the environments, we recommend you construct the images you need yourself when needed, especially since generating evaluation videos of 1000s of parallel environments is slow due to I/O of video creationg becoming a bottleneck. Regardless, visualizations are helpful and an example showing the distribution of resources on each batched environment is shown below."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 107,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAADyCAYAAACceXYXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAACGtUlEQVR4nO29eZxU1Zn//3SzNISlETWNRlAmMVHHUaMiINEkSoa44AKKIqugBmiQxZUk6sRRwQUXkEWRfRVURIxKDEYyScAFx/nGSYZo4vwgEtoYhQZkk67fH06d+lRxn6rn1L1VXbf5vF+vvPJw+9xzzz33PPecuj6f85QlEomEEEIIIYQQQgghhBBSRMrruwGEEEIIIYQQQggh5NCDH6UIIYQQQgghhBBCSNHhRylCCCGEEEIIIYQQUnT4UYoQQgghhBBCCCGEFB1+lCKEEEIIIYQQQgghRYcfpQghhBBCCCGEEEJI0eFHKUIIIYQQQgghhBBSdPhRihBCCCGEEEIIIYQUHX6UIoQQQgghhBBCCCFFhx+lCCGEEEIIIYQQQkjRKdhHqalTp8pxxx0nzZo1k86dO8ubb75ZqEsRQiKAPktIvKDPEhIv6LOExAv6LCHFoSAfpZ5++mkZN26c3HXXXfLOO+/IqaeeKj169JCPP/64EJcjhISEPktIvKDPEhIv6LOExAv6LCHFoyyRSCSirrRz587SqVMnefzxx0VEpK6uTtq3by+jRo2S22+/Peu5dXV1smXLFmnVqpWUlZVF3TRCYkMikZAdO3bI0UcfLeXlhVXa0mcJCQ99lpB4QZ8lJF7QZwmJF1afbRz1hfft2ycbNmyQ8ePHu2Pl5eXSvXt3Wbdu3UHl9+7dK3v37nX//uijj+Skk06KulmExJbNmzfLMcccU7D66bOERAt9lpB4QZ8lJF7QZwmJF7l8NvKPUp988okcOHBAqqqq0o5XVVXJ//zP/xxUfsKECfKzn/3soONvv/22tGzZUvbv3++OffHFF4H2gQMHch63lMkMGsO/1dXVHdTGoHOCymMZzdbqxy+K+KUd7UaNGgXaWEarJyzaPeBx7TkUoi+0e0a0+8fy2I+Z5+DfGjduHHjcUgaPo92kSRMREdm5c6eceeaZ0qpVq8D2RkVUPvub3/xGWrZsqT5vzdbGjXbcimWca9fT3jt43PJ+wDGFdtDzzjyea3yI6OMp27W1ftF81vLetTxPX38f/W+POfuxfxvtbO1eRt7xcNr5U++5KbAc9plWl+bLWp8my+zcuVPOPvvs2Phs//79pWnTpuo9+mJ552ar3zJn1dbWBp57xBFHBJ5recbLf7nB2V1PSO/TfDn99NMDr5Wtr33nb+34L3/5S2f36NHDq54XX3wx8H6QK6+8Mu+2aXbmOYhvX2jn/rTp8Qf9/YudtfL6uR1j47Nxn2erfzrJ2Q/fMdLZcZlnB41JfyZLpt0beO24zLMa1t8Mlt8lh/o8G3ef5dqYPhtUphA+G/lHKV/Gjx8v48aNc/+ura2V9u3by1e+8hVp0aKFOujx+JIlS5xt+Uik8c616S+Tb8++M7Dc+eefH3jccu1sH8GCylsWYJaPUlHyi1/8ImeZH/zgB84O88LVFpq//vWvA49379498LjlQ1S28lof+9rPPPOMswcMGODsoJdvsh9KLexX89mWLVtKq1atVJ/VXuzYJ8jll1+esy2Zfo3Pc8WKFYHnXHrppTnb5Dvxar5sGRO+k6o2njLHMo4vy3vB0heaLy9fvjywTg3tGQy5+T5nz3n4Dq86s5XX/FzrF23sIEH9Gzefbdq0aV4fpcK8T8N+lMIfCJaPOFqZNH9snPK7E0880dl//vOf1bbmonnz5s7W/LdQH6Uuu+wyr/J43b59+wYeD9PXiHXhjOVmzpwZWGb48OFe15hcXuPscU3SP1DFxWfznWcR3x+12eZZxPLevPx7pzq7RYsWzi7leRbt5+ek/8cP3/W3ZZ5dvHhxznN79eoVeByxrLF9eeGFF9S/4XsHMb2DPey4zbM+Pvv000/nvE7YtbHlnEKsjS2/2wrhs3hutnKFWBv7fkzEMitXrnT2xRdfHFg+LL5r40L7bOQfpY444ghp1KiR1NTUpB2vqamRdu3aHVS+oqJCKioqom4GIcQIfZaQeEGfJSRe0GcJiRf0WUKKS+Q7xDVt2lTOOOMMWbNmjTtWV1cna9aska5du0Z9OUJISOizhMQL+iwh8YI+S0i8oM8SUlwKIt8bN26cDBo0SM4880w566yz5NFHH5Vdu3bJtddea67jwIED7n94LElUkr189Lj4gkKZmiU0D0PltPJYBsMdv/vd7+Zsm0X6ZukXvMd8ePXVVwOPW+7Bdy8o5LXXXnM2yiwtoavY5v8ccnfa31DKaWmH5R4WLFjg7EGDBh1URgu9LwRR+GwikTD707PPPpuzDEoBMFQdwfBWK9o5ml+gj2fuNZYkjKzAMjafe+65wOM4njLbj+MLGTx4cOBxPF97j2hh5tgOyxjQnsG8R1ISPN9Q52zXtchYtL10LCHdSbsAyWxVovDZKNi3b59XeZTshAWfn+abFvpf2CXw+De/+c3A+v/4xz8Glsd9pLRxM/HJlOT2J8OvUttUqH0gg+pHfOe3MPNhNjTJHjJ9+nRna1I+JFOyV2yKPc9q72XL2lCbc6LklVdecTa2z3eLDN95dtWqVc5GyZm2t0s2SZXv2B44cKCzsb+XLl2a81x8nvh8rrjiisDyeP+++xPdedi3nX36nLtytk1E5Pnnn3d2z549A69heU9ra464zrO5fHbZsmXOtqylLGtj63xo8fOLLrrI2fhsbvy3yc5+9M7U/nD4O0zDsgWNxbfy2ZvJdx9iPF9bV191VWou992ORtvCBNHWp8//+j1nz37ox4HXDbs2LqbPFuSj1FVXXSV///vf5c4775StW7fKaaedJq+88spBm8URQkoD+iwh8YI+S0i8oM8SEi/os4QUj4JtdD5y5EgZOXJk7oKEkJKAPktIvKDPEhIv6LOExAv6LCHFod6z72nkku9ZQsE+/fRTr2seN2lU2r8/A/uwww7Leb4mzcPjxZRkaXIkSxaObBK/MCnDf/WrXwUeP/fcc73q+f73v+9sS1YgRJMboGRPy7wYFux7bAeOi/qQ7xWKMGMf045rWGUtlveF5r+W0FWUu2qyUW2cana2LDdhmDt3rrNRSmABZdMaeA9///vfnX3kkUfmPFcLS7eEQ2eOL0v4MrYVQ9R//vOfB56L5RcuXOjs/v37H3RNEsyuXbvUv7Vs2bKILcmfk08+2dlRZrwtlBQuXyzvKd/MgNmYNWtWXu0USZfyVVdX511PHAkzz2pZR/H4WwPT10Od5qfWSigdw3elJknR5lm8njafavjOs4hlno1SPjt//vxI6tEyYlnKa3MaHj9zHmQjV55ZNoLWtJnXsGxzEkRDmGfxHvv06eNslPJpWNbG2bDIxRBcD11wwQXOnnZPKtPgyy+/7GzfOcp3bWwhWz/i+6zz/Hu86tXAtXHm+zIJvjexTKey3NuZaL5y2bmptYg2/4ZdGxfTZ4u3uiGEEEIIIYQQQggh5P/gRylCCCGEEEIIIYQQUnRKVr6XzFaghZmhtOPHrf7F2Zglom3btoF1v3PtzwKPZ0q2UM71v3D8tr/+Rm1zLlC+hhI07T61bHWWjFAaFlkftk0kvd2afOazzz6TICzSR0tocZhsRGHDr3Es/Phv6wLb9NJLLzkb+wjHW1pINIBSoGQmvmJmGKlPtGfjG2KciUU6hn186aWXOluTDePz/sUvfhFYJ0oPMNRZG78Yuqxl2NBA6URmCD/+W8vsg1IClPJhW7VsIxpa6PKRELqsgf3SpEkTZ2tSAO24iB6+7Ctr1rKKBGU+bAiyAl+aNm3qbN9MfJns3LnT2a1bt/Y615KhcX2/nzj7nGUPeLYuf3AMYca9TJ8tdMY9JEzmQotcyiLhKIa/FFPuWMqEGU+dMt7dmGkKscjCPvnkk8Bzcb2uSfl++MMfBp5rWSfiOMWMe2Fl8jU1NTnL4KbYb/T/aWCZzgtTMiKcQ3FbEVzH9O3b16udlt8MOE/ib6xsGdpwmxR8hpZ5Vmtfrq03GvI8i2s6XANrGRat25RoGSR9f0uilE+rRzsXfyPiWNHmEC0Tn+VdpvWjSMb7rADzQ+b7MlcZ9GVtiwzLc8Ks1vh7Jp+1MWZGRTCrZiF8lrM1IYQQQgghhBBCCCk6/ChFCCGEEEIIIYQQQopOycr3kmiSCjx+92f/6ewDEFqmSjZA4qdJ+URExm/5XfAfPDNRvPbaaznLIFqYnhYeN/bfpzr70TuD05aGlYKdd955ztbuB2V6GKapyfoqKysDjxdatqD1Y7aMe2ljIUC2IyJy4YUXOjst7FSR7B0K4LO0ZBWJEk2yh9IDLaOnJk/JJhcLAiVoWqirRT7w9qDUOwvDfrGezHGN/+7Xr5+zFy1aFHgNlPKlSQwUuQG245prrknZX3wQ3Kb/y1CXCUpXES2kW5NTZt7//v37A8/XQF/WMvFp747k2DlUJLfFoLa21tnaXFHK4Fi5f2Yqu86dI1O+kk2+V2po8glNcotoa7dC3S+2aVyT4wtyjVLCkhlRwzIv+0rFMrG8fzUZGJ7buHHwTxbfDJCWftGyyOYDSvwys3y7MmBrZRDtfnpff5uzn515f2B5xJIRGrH6LMp/UHapZVzU5vUgWVhDmGctPotZ+Sz1aBI9kYxsb55bKVje2dpzRb/WQL8O48tWH9f+ZpHi+oK/Q3CdrLWhP6yTtbWxZWsSnIvDro01/y2Ez5buCogQQgghhBBCCCGENFj4UYoQQgghhBBCCCGEFJ2Sle9lZt7LhqUchpahzOqHkElNIFNWrrYF1atlbELpm9ZW33Di119/3dk9u53obMxUcv755weeawm/zNa+7t27O9tXmqixdu1aZ2dm/ktiCTP0DeXUQmi1LC/Z6tK4+OKLnW3JrpZ8DnELUS4rK3P/S4J9ZckwoYXJayGqmZneHqv7i7MXL17sbC3TlJaFQgtd1s7V0DKVWMA2pIXzQ19gezKlQFoWk8GDBzt77ty5gdfGTEAa/QYMcHav62519nNP+WU10/pRuze0r/zReGcvmqLLZHPJ7qzHtTJxzb7XqFEj78xrIrrkAzPxYZ/v2bMnzxYefD0Lmr+fvWSCwB9ynqvND5Y+w/Jaxr1mzZqlnaNtOZDveBTR1yj5PPegOlEmcHuLf3b2g3v+J/DcbPd1/fXXO3vmzJl5t+/mim/lfW6pk2uexXkvymsi2vtUk5tY+N+bpjj7CGXLA3y/WLCsB6+88kpnh834W2iw3ZhRF+X52vyr+bu2vkEpmHVLDcvvIe3alq1a4jrP5vJZy71n1pckm2QPSVvTKc8J5WX4HtGefxhZq7ZFRiHke/0zto7Q3pGYJTMqKZ92n77namhSPpREZvNfyzW0sVoIn2WkFCGEEEIIIYQQQggpOvwoRQghhBBCCCGEEEKKTsnK93zQJDgYKqeFjlnD6XzDKxEtpFCTCSBY3lcqh1I+Cyj3y9YOC1omPkudv/rVr3LWj+dma3cQ2NeYIQTJPI7ZuCxt0o5rWdTCZrcpBcrLyw/qA80ftUwgmkwPwVDcAYkP0/8Iz1bLOIft0GRImr9rIe2+8iJLOLwWGo19rGUtybyGJTwa2bp1a+BxDG/GOlfOmRRYXgMz/WlgiPXAgQOdjX2NUoXMbEH9RqV8bf6jqfGG93ztTfc6+4kJtzi7lLOgFRqL7MIXlKlljrndu3cHntOyZcvA477ts/imr6wtjAwO5W5t2rRJ+9v27dud/cUXXzhby4QVBi0M3/ddpmVEu6XZCc6+//M/OFtbA2VeG6V82hpqxowZzh45MpV5+GZTy+NJ0DyL79Ns/et7nSQoFbOe4wuuA/pAhlzf9TYSJksXHi+ErCdKwkhxEW0cIZljCtds2tYmw378kLO1ebbQWbfrE5+1sQVt+4ts/ofjFqWykzPX0P+HJQtcVFiyVEeZiQ/XkwsWLAhsU7t27ZytrYd9icpPNfA+UeqcuX7Aclomvp49ezpbW3MVwmcP3ZU3IYQQQgghhBBCCKk3+FGKEEIIIYQQQgghhBSd2Mr3ftL6FGf/+7Z3na1J9sKGzWkyHwyLs2SesLTJV3ZnQQuzw/vCEEprXRdAxsKXX345sLwm5UMby/iGgPuGcmK/Y4jiqlWr1GtgFrVLLrkk7zYhKGHru//9nHWWOrkyeaGvYJa8OiXjB2INy8W/aRIxlPL5oskOMWuJJpmwZEnxHfta2HNmXRa5ggXfDGSY3c9X6oxgiPWQIUMCy2SGKPf+/qnOXrFihbOvuOIKZ8975A5nazIRS+bOuHLgwAE5cOCA+izDSPms5zZv3tzZKOXbuXOn1/U0UHqDRLk+SKLJ4O6dnvL9f7sxJYv49NNP1fO1THwWfLNgaX2hyZjR3rdvn7MfLk/NY9j+AyG2P8hGdXW1sxtyxj3EJ2MmPm9f2ZnmN/lgubYmS9fGiG/WbW0O1DLTausHlPWIRCftsYD9iO3A+XHQoEE568G+uHjgGGdfcd5pzrbOsyj/QckxHr/88sudrfn/Cy+8EHg9zI4YV4J81rKFwdVXX+1sy9oYsfq7JSuj79xv2YYD0bahsPisZeubbGvjoUOHOnvWrFmBdWX6fL5gu9HvkFXzHgk8jvegSQuxDG6ZkM1nsU14XFtDaN9CLM/EAiOlCCGEEEIIIYQQQkjR4UcpQgghhBBCCCGEEFJ0YiXfs2TJQCxhfdlAyYdFsmWR8hVCmqdlt9No27ats7GPtCw6VjBD3UsvvRRYxiLl08oj//qv/xp43CLZ08JArePixRdfdPall16asx3IxF3/HXhtKXBWhmJQVlYmZWVlpjBOLQR0wIABgeXzkaJZQkjDyEd8w4lR4ofnamHZlhBda/Y933enJVwZpXkWQoX0Qju162bKObT7f+6555yN0gCUHlikIX369Dmo/rhm7QuTCUjzZUt5EZE9e/Z4XS8M+FzX9/uJs89ZlsriaMlKp8naNGn/LUNT8hUMkc8cZ9aMVz7lLRl/tQzG2v2gryBh5XgkN7nmWXwGYTLF4bnZpHwWn9fO19qHsnSLdERDWzf0uu5WZ784/9HA8tddd52zNVmPSGGydIXB8v7W+m7YsGE5z818F2nyH+24NZNjkmeeecbZySzVcZtnfXwWwb7CrSM6L7wnsHw+/q5ln4tqbWzZ2gLXwJZnq43fZ15719kvL0plGLSujbVr33DDDc7W7gH7a+bMmYFlcO360sLJgWUQlBbOnj07sMzRRx+d81r4LhPx91nL2ljrR9+1sbdn//rXv5aePXvK0UcfLWVlZfL888+n/T2RSMidd94pRx11lDRv3ly6d+8u778f//1yCIkr9FlC4gV9lpB4QZ8lJF7QZwkpLbw/Su3atUtOPfVUmTp1auDfH3jgAZk8ebLMmDFD3njjDWnRooX06NGjqP81lBCSgj5LSLygzxISL+izhMQL+iwhpYW3XuuCCy5Iy7iGJBIJefTRR+WnP/2pkzXNnz9fqqqq5Pnnn0/LJJCLRCJxUPjgLc1OcDZmvmrUu3dgHWEz6vTq1SutPT5gqPurr77qda4WmpiZqSdfMIzOIkvMhhZarWW1s4Rco7wQ6/zhD38YWF6r0yLZCztG7mhzmrNRmqfhI2+JSgpRLJ9NZhjRQuwtEhENSzbDzHIaYULstbBp38wT2E7M+DNv3jyv9mTLvqddDxk+fHjOa6CPP/HEEznLWLj++usDj+M9PPXUU151jhw5Mu3f06ZNc7b2nmratKmz8Rni+LzqqqtytjVqiuWzQWhSvjCZ+OpzEa9lrDp7yYRUIUP2QXzemvRCk/Vp0jfMyici8pPhwWMNsbxHLdn3fCWIFizv/myE3XIhFy9/I7XkveCDYAlivtTnPItE9V7KJuHWMrNpaNITBNuNkqKBAwc6O4x8D99lKNnT1olYP8rannzySfV6KKXZsmVLzvaFAdcx+Kywry3z7JrlqTld6y8km3wPbczKifIs3/Gpzb9RUIo+i2Vw7A+UTc7OnbcvO10W3ZuzTFTvEd9MeWHa84ulqTVftt8M51/5I2f/6tmU1M6yHtbWRFq2Qm1t7PvbEyWEvmvjzPI/+lHq/rEd2rsNxzquCQoxB0UqzP3www9l69at0r17d3essrJSOnfuLOvWrYvyUoSQCKDPEhIv6LOExAv6LCHxgj5LSPGJdKPz5Jf7zE0Nq6qq1OiEvXv3yt69e92/a2tro2wSISQL9FlC4gV9lpB4QZ8lJF7QZwkpPvWewmDChAlSWVnp/te+ffv6bhIhJAv0WULiBX2WkHhBnyUkXtBnCQlHpJFSSV1zTU2NHHXUUe54TU2NnHbaaYHnjB8/XsaNG+f+XVtba3JkTI/ZZ8//5NlikWXLlqXqgRTfIvreCmH2ISr0flG+WO9lxYoVgceTWmsRkZUrVzrbd48ZjYsuusirvLaPhaZ7x/vKpoP9+9//7uwjjzzS2Q/i2PMcF4Xck8ZKlD6b1M0jqDnW9j/x3TsL90zAlKki2VM35yLbHhpB4F5Q2l4Xlj1WfMcBnosa8Ew9fFT7s1jap/2XQ9xjIzMtbVB7tGtZ2oD7a4mIjBo1ytlTpqTSA+O7qVmzZs7GFLg4VrV9daLa882XYs6zvvtL4T4ipQK+r7Vnpu2ppM2PUe3HdMvQy9P+jftN3T/z2cBzfjwstU7x3UfKsr+F7z5SiHbdfN59Wru1vb0e2rvR2TdXfCuwzqj3kbJSiHkW9/fT+sp3TtPInGctc0iYNaDmg1HNs5b9RrX2LPvlO2l/69P9dOUucqOlc7eAe1ZZfMXSF5b9tTLfodo5M2em9uqx7C9nSTVfTAq9NtaeGa6TfPfsQX/PtndqmH1VNbR3jbanlGX9hPtBaqAP4d5JuG9S5hh6/bngPZnCrI1xD1OtTmyTtobQzu3eJ7WvHbYf+/fxxx+3NDvtd4Nln76lS5cGHtfa3bdvX1M7gojU2zt27Cjt2rWTNWvWuGO1tbXyxhtvSNeuXQPPqaiokNatW6f9jxBSHOizhMQL+iwh8YI+S0i8oM8SUny8I6V27twpH3zwgfv3hx9+KO+++660bdtWOnToIGPGjJF77rlHjj/+eOnYsaPccccdcvTRR8tll10WZbsJIUbos4TEC/osIfGCPktIvKDPElJaeH+Uevvtt+X73/+++3cyVHHQoEEyd+5cufXWW2XXrl1yww03yLZt2+Q73/mOvPLKK2kyCR/GNTk+Zxnf1MNLliwJPI5SPpGD5XxJNBkS2j//+c9ztqO+JHuIJsuzgpI9JKqQ28aNU0P0ulsnOnvm/bflPFd7NlbJHoISEMQif8QQR01W8MgXHwQej4Ji+Wwu+Z4WuqulVbVw/Z70kOEuhnMskgZMpayFqGr34Jvedu7cuTnLhwnzF9HbZHl3an7k+6wsvuL73sBQ+cz2YFs1KZ8mBdXke/Pnp5IxX3PNNc5OPv+oJLnFnmejIlNCmcQ6R2vldu3alXebLJK99f1+4uxzlj0QeK7m72HkbtmkMCjt06QeE598xtmarA+voUkwtTZY7k3rI18JlohNghimvwtJsefZESNGuGMoHdH8S5MFocwq2zV98X2Xo6QI52icH1Ey7zvPYnmU+WOqde1cBFPIi4hMnz49Zzss7Rs5cmRgGZyvNFDKh2sF7blhX2j25MmTc143GxZ5mjbPamnn4zrPBq2NEewrnEO1tTGuTzX/tUp3CyHlGzJkiLPDrI01tHtDeRySzUc1v7OsWaZOnRpYXltzWNbYGvje0Xw2HyxbAPhuBfL00087++qrr85aRybeH6W+973vZf0xUlZWJnfffbfcfffdvlUTQgoAfZaQeEGfJSRe0GcJiRf0WUJKi3rPvkcIIYQQQgghhBBCDj0izb5XCDovvMfZb/T/aWAZlERFKYNCOd8VV1zhbAxZw6/sKGXzDak74ogj8mniQXzyySeR1FOfaNlQZj/0Y696XnjhhbzbgNn2RNLleyjb0Rjb+Bte16uvDCNRUlZWZpbmIL5SvmHDUlko1u9I/5tFuqDhG3JrCUvWyqBszIJFYpApx7FIYSzhxFpGD98Qel/5Xtj6LZn88Hpz5sxxtiVz1OLFi52dfCc0BD/2vQff8Pxs4zQMhx12mLO1Z4/XxvFy9pIJAn8ILK+NG02+pmUeRXL9V/qgcnj8tut7B7YVZX0/GX5Vzvo1LFI+S4Yoi6wvWzlLhiDk/s//4GxtPZGUJ5VixshsBM2zv+s73tlpYxnQZEEW/7P6KNZrkQX6EmYu1uZczESFawttzFmzCqKMDuV1GlaJqw+YoRHlnto8a7lWZv9q/aFJEzHDqEVGGPTeids8m2ttjOCWJZa1MY7ZbOA4txAmc6dF+ob+GGaM49o4H7/B9S2OU8vaePTo0c5+7LHHcl7bkt1Tw+KzY8eOdfYjjzwSeK5I+lj66KOPcl7bQlVVVeDx5LWt4z9enk0IIYQQQgghhBBCGgT8KEUIIYQQQgghhBBCik7JyvfKysoOCmlDKZ/GUrBRZoVSC03Wkg0tnDRM2KEm2evVq1fOc5977rmcdRZbynf55alsQYPG/ruzLzv35Lzr1EKaNcJkE8yU7GksXbo0Z5nOntdeDHa/fv1EJLoMI8Ui6bOWsFdL5jqLb85rnZ7B8gmlnKVe3/62SAksmfUsWPoiW4iuJXQ2bLadILBPMQOKlvFEkwpqZLsv/NvDDz+cs304Ji3PFjNBJSUJcZMVlJeXS3l5uWl8RSUpsWLJuNe6dWtn+453S1Y+TaanlbeE7Vuzx1nkaxZZ373TU5lwUMqnrWkscjxEe5db5EjZMmb6nq/JJcNIgksRn3m2urra2b7+odWZieW9GQbMNIZoYy0MM2bMcLYmmc+8R8z4hXI55Gtf+1rOa6P8Jwy+0iFf+ebmzZtN7cB7xmtr7x208Tkg/fv3P6iOOBDksyi57bY0lVkcM2lqkkvr71ZfULKHGWlnt7D9NkqCUkFLpsAwFKovkG49Bzl7/UsLA8ugdA7bhH6N2fpuvPFGZ0f12wPrufnmm52duf7F87V3k6+sr6amxtk4jpK+T/keIYQQQgghhBBCCClZ+FGKEEIIIYQQQgghhBSdkpXvlZeXhw7JRclePvTt29fZmmQPQ9Issjss/8wzqQw5Wth6v1F3OXvRlJ85G7MBYj0amlTwkksuCTxuzVx36aWXBh6f/+idztakhhrYFyjH6927d1Bx7/BNTdaIGfYKBYY4atkKfMMdS4WkFMgSPu4rndGesRYuXwzwPn0zm2hs3brV2RgCa5GuWrPvYbsxnNiXMFk7fGV6yLhx45zdqUfqHf3W6iV51yliy5CEGZUwm1USzJxD/Nm9e3fOMi1btvSqM0yWTK3MwpfWO3tQz27O1qRsSDYpn0UiuWHDhsDjGt85KfUeQSnfj4f1CWyTr7zZIq3D+q3yPUvGPosMXGt3Un67a9cu72yo9Umuefa3V9/u7BsbfR5YBvtq+PDhzkaJNTKotm3avzNl80lwHkT5T5dF9zob5zgLYdYTiCbH0+ZuTYKUbZ5FKR+2T+vXQoDzsiahQ7D9mLErSnC+12RL2u8q7O/k/Bq3edbHZ4sh5dOydWJdYSR7iK9kz/f9YPH9zOzbTz31VGA5bZ38uxfnB5bXnqe2htAkfuibmowXM/35/jbENXMmDz30UOBxi+TY8jvO12fj9auXEEIIIYQQQgghhDQI+FGKEEIIIYQQQgghhBSdko2BbNSokTRq1MgUMj5w4MDA4wsWLMh5HczQl+0altBSi9zQElaO9Sydlso4ePWInzobpXy+oGRPC/3MFhIaRlYWJvvNs88+6+w+ffoEHtfqx8x6Fple5rjwlYJqMj20sa2YyStJVBllikXSZzWu+FuFs5/+akpWoD2zKCV7GFqMYfxhMhJhnb7nWqRiSD5ZS1ByoEkdLHKhMDI9TUrgC4YfY19bJXuFyFwTFI4cJOkrZerq6g7qD4tPaOPGcu6+ffu829miRYucZbZv3+5VJ84DvrK+/hd2CSyDWCRxme9L7Xq+kj0NlPLhte6bsczZmKFPk+Bp2fp8M6xm3n+YjIPa2irXs81nPNYnueZZDd95FkGJj0h6lts0KZByju8bF59ZmPWmdm84hjRpnpbNMbMfNR/xnWc1wsy/iG92v0JtH4HzpiVzIx5Pzq9xm2ej8FmU8iEoGcX+HLzj8LRymm8iw4YNc7bv2jjMePFdDyOazyKZPmfJsKvZGlqGZ60d2njAtS7Wif6ryfHyeQaYpc83CzPKffE4SsKTmamtPstIKUIIIYQQQgghhBBSdPhRihBCCCGEEEIIIYQUnZKV7zVp0iRruNfQoUOdjSFnGGY7YMCAwDKWHeNFbCHg2TLJBJWx8PTTqQw5mAEQ0TL3WcIMn3/+eWf37NnTq20i/vKXMJI9S51XXZWSG2DfWcD+zdbO/v37Bx7XZH2aTG/IkCGBx4PGV9xClMvKyg7qw95bmgaWverjrwQe18KKoySqTHlhwCxuYUKXs6FlEkEbM7poGYJQdheVlE+jffv2zr7ppptylre870T0kGhfsO+aNk2N7aT/4rGGgO+7XgtJtz6nZs2aOVt7H+/cudOrTRoo6UYw66WvrE/zOat8FM/5/e9/r5aLAlwr3XZ9KrMtZuhDKR8SRmaXLUOhRYIX5jiSbEdSXhAXguZZ5Jmj9jobkzv6ylGsWOZs34xaiO/6UZOEWbaqsGTPzHwnYDmU2WM5nGfxHWnJuoVz4ubNmwPLaOWjwnLdTHC+xzY9+uijgeW1dyeSnF/jNs/m8lkEM/FZfEvbzuLsjH9rGfcQbZsLDbwnlBFattiIat07a9YsZwdtgyKSXdaG486yZp48eXLONuH1cO3p+y675ZZbnD1p0iRnow8tWf2Ws9/+xVJn5/OOD5PVD9cTaPuujRkpRQghhBBCCCGEEEKKDj9KEUIIIYQQQgghhJCiU7LyvcaNG0vjxo3VcDIMe9VC4oJCyETsYbkaWsY9S7jckiXB2aK0a2P5y7/7L6b2+bBq1apQ569cudLZl19+ubOfe+45Z1tCFrVMSJgFT3tuvpnxEGtGDN+wSyyPUtNsmYcyzw3K7lXKlJeXS3l5uVz+1/zbjSHGSJdF95rO12QCKJcrNBjGjPhmDfSVPKDsSCQ9rBkzDGkyjurqamdPnTo18BpRSfksWN6tFll2lARlAkLiljEzXyzyKI3MMG5t7tu9e7d/wyLAMta09cTiV9509qCe3bzOzfzbSSed5Ow//OEPprb7oEmVNCnfj4elMt5GJd/LlsksTF3a2i8ILBsHkvMssuKYlASxri5YdqKBfXjdddc5O5vMHa9fKPl5vvhuZ2Ehm6xv7ty5Xudr9ujRo51tkfJZuPXWWwOPP/DAAznPzUeyF0Y6qPkp9sv+/ftFJH7zbC6f1dbM2no4LbOlUWKP56DPamtj9H9tTathkfIVYgsL9MVBgwY5e/bs2abzw2Tf0/DdBsiXvj06ORslfoiWrc+K1j70w1wZU60+y0gpQgghhBBCCCGEEFJ0+FGKEEIIIYQQQgghhBSdskQxNA8e1NbWSmVlpXz44YfSqlUrmTZtWmA5zAyg7fqOdliZhxYi6VtXGKmZJUxTyyiEHHHEEV51iohccsklzn7xxRdN5ySxhCZiuF+/fv1yltf6XevfmpoaZ2NmPASzNVrBe5s/f76zUbKnZVvJJUHdsWOHdOzYUbZv3y6tW7f2bluxSPrsJ598Iq1bt5YHH3zQ/e0/+qTCx589ep+z0Tcx+1Fa9sxtbQKvh1K+MFl98kELdbaEN2thzFGFLmeO62uvvdbZmmzUYmtSPt9MHVGBGUmyvb80yYWW/cc3sxHWmZQY1NbWyjHHHBMbnx0yZEhemYws8r18QtX37dun/q1YaJlTtXvWQth9s8Rl+9sf//hH+w0Y6dQpFfavXVeboyY+mcr+ixn6LM8829ix9pNvvdn4/PPP5YorroiNzybnWe3dp62BtXlWWycjmVI+7XlENZeFmWcRbZ1o+W2gHc+U62ljDSXzYebZm2++OfBamlTn9ttvDzyuMXHixJxlrFI+lPdjuxHLPWDm3aCxGrd5NgqfveYfrQLPjXI9bNnmwtcHkUKsgTO3rUiS7bd5IXx27NixgWW0tQLiu5a2+Gw2UM6nbS2A+MoLcQx3vuDL3/MHvtgvf/zdz3P6rFdPTJgwQTp16iStWrWSr371q3LZZZfJxo0b08rs2bNHqqur5fDDD5eWLVtK79690z4IEEKKB32WkHhBnyUkXtBnCYkX9FlCSg+vj1Jr166V6upqWb9+vbz66quyf/9++dd//VfZtWuXKzN27FhZtWqVLF++XNauXStbtmyRXr16Rd5wQkhu6LOExAv6LCHxgj5LSLygzxJSenilyXrllVfS/j137lz56le/Khs2bJBzzz1Xtm/fLrNmzZLFixfLeeedJyIic+bMkRNPPFHWr18vXbp0MV+rvLxcGjVqpGbS8M2+EDYjhxa+ZqnLIpEr5tf3Tz75JPB427ZtnY1yPRH/8EKtv1BeiDIJlOz5XsvSv5pkD8kno4eWZc9XIhXUX1HIo4rps2VlZVnDPPF+MLxTO2de60+dPai2bWCZzHDjQmQCikpKYKnfKqdNku39ky1jUBRgnSip0+RMyP3335+zfu3eUB6KYf6Z5bV71o6jNM8iV0B5QnI8x81n64NSkOiF5bdXpyQy5yxLZbKyZNmzZt8rhM8i1jYlwfe0lqEPQVkfkk/2PS2bXr4Z9xCUyORLfcyzlvFlmWc1CSTWOWzYsLRzsmXmKyQo/wkz/2r3rGVi7DkoJc3p/f1T0/5mGbO+YMY5Ldu3BYsfoNxPkwX5zo0iIg899JCzUS6UlPOIiLy1OpVd3CIDT/Z13ObZKHx2QZttzsatLdb3+4mzj5s0ytymICxZ+UoNlCxqUr5MovLZkSNHOhufZxjJXpixjb6ZLROmRUYaJmsgll//0kIR+VLKahlToTx7+/btIpL6mLFhwwbZv3+/dO/e3ZU54YQTpEOHDrJu3brAOvbu3Su1tbVp/yOEFAb6LCHxgj5LSLygzxISL+izhNQ/eX+UqqurkzFjxki3bt3k5JNPFpEvv1g2bdpU2rRpk1a2qqpK3YBtwoQJUllZ6f6X7eseISR/6LOExAv6LCHxgj5LSLygzxJSGnjJ95Dq6mp577335De/+U2oBowfPz4ttLO2tlbat28v5eXlUl5eLjfeeKP7W5gMevnI9yxhs1pdeO6iRYtM18uXI488MvB4mMSKmRn2Lr300pznaLJAC/lmzhFJfzYDBw4MrBMzpqhysXnznD1kyBDTtS1ZiyySvaDwyKizmxXaZ5Pcemsq4548kJK2CJwTFJItovfJ3Fb/cPaTRcj6poWZYtZPi3/5yhy0+vF9MmvWLFNdUWUM1Z4PjgELlvG8adOmwOM4vrTse5n3q/UfSiMee+wx9fwgsl2vEBTLZwvN/v37i3atsFhkbWcvmZA6bpA/WY7n+lsUnHbaac62yHs138fjtwy93NnYZk3W9+NhfQLrzKwXsazffKV8q1evFpHo5aTF8lmLBM13ns1XAhk1FhlRIRKHa2vDVfMecXZm9j0E24TzNG7tgGjrgzD3Fua54drtAVy7AZhhT0Tko48+ylkvjquknEekOHOohbj5LIJzUZSbV2g+qElotTEbldTXKs2zoGVj95XvWSRuFqJ612prujFjxqT923drD8s4jIq8PkqNHDlSXnzxRfn1r38txxxzjDverl072bdvn2zbti3t63JNTY06oCoqKqSioiKfZhBCjNBnCYkX9FlC4gV9lpB4QZ8lpHTw+jyXSCRk5MiRsmLFCnnttdekY8eOaX8/44wzpEmTJrJmzRp3bOPGjbJp0ybp2rVrNC0mhJihzxISL+izhMQL+iwh8YI+S0jp4RUpVV1dLYsXL5aVK1dKq1atnK62srJSmjdvLpWVlTJ06FAZN26ctG3bVlq3bi2jRo2Srl27RpIRSAuBt+x0P3PmzMDj119/vXo9S8a92bNnq+cH1aOFOFqyw1ky9PXpkwqN1+SOzzzzTM56Mlm5cqX3OT4sWLDA2YMHD/Y61xJOiOHT2jPDMtZwSot8D8tEFe5ppT58Nk3aoUittD7BfsNQ2nwyI0YFSuoKEW6O9SPatdA/5syZo9arheiGkQZUV1cH1qPZUUkIEe1esmXfK4TUA8dnsv4wGZeS1Pc8a0F7rvXpp1GBGWIt/O9NU5yNmfg0Fvw8tUnugIvSf9xoa5xvfvObzv7Tn/7k1T4kaMyK2DKw+WaO0mR9eO7EJ/W1iCbzs8j3kCh8Mhf1Pc8il/8Vl/W5l/gLD9vubPTffOY6lPlElQnXkkXVdy3lm+Uym2TPAkr5LBmrtLWPZR677777nI2Z9TS0+8fMtpMmTVLPz5TzBYEyedySxdIXQfN4XOdZy7tLs6dPn+7ss0OuZ6LKrIdSvuuuu87ZFskePmPf9uC1cCygnW1trP3ejkq+p/msZW2MGTAtmTE1UEaaeV+WtXG3noOc/dtVqa1tCu2zXh+lkk7xve99L+34nDlz3A+lRx55RMrLy6V3796yd+9e6dGjh0ybNs3nMoSQiKDPEhIv6LOExAv6LCHxgj5LSOnh9VHK8pW+WbNmMnXqVJk6dWrejSKERAN9lpB4QZ8lJF7QZwmJF/RZQkqPvLPvFZq6ujqpq6szheVqYWMYQqfVky1c2Tds1gKGvmkyNS3sEEMONSlf3+o7Ao8vmvIzZ19xxRXOzkfKh+D9aFkAEcvzxFDpa6+9Nu96EIvEL5v0RLueFr4ZRqaXHIelkpnESiKRMPuJlmFEO78YEgzfEGLLvWrPUBsTUUrOtD6z9CVKXLX3K9ZjkahGNZ5RSpCZVQTxzTDiC0oSkrLGYozTUkN7b8Yp414Yjps0ytl1IGXRxn7/C3Xph0UuFwbNJ3yleZqczpJdCsugxC9bO7LJ/JJky+rXkAiaZx988EFnn6Ocp42h6WAPHz7c2dnWLZh1CyU8SBgpn7aRNG63YXm/W+ZZlBrhFg5hJXsalkxWjz/+eM4y2r1hBj3fzFoaOM9mln/kkUfEB8uzwjpHjhx50LXjNs/mWhtr8kitr/LJJq+tb9GX8RmgXNCCb5Y9lOAhTz31VM7ylnvGTOzz5883tcl3XGnfDyxr42yS2KA6fcl2ruXd+R8r5+Qsg+NFW+/5+mz95XwlhBBCCCGEEEIIIYcs/ChFCCGEEEIIIYQQQopOycr3kuGOWii5RbKHIWojRowIPG7N4BGVrGbIkCE5y6BkLVsGgULyySefeJ+D8r0Va38fWKb390/NWQ+GOGIItdZ3llB9XxlotmtYZHqoQcfwYx/ZViEyhhWSpOTWF0v2zClTpgQeD4sW0qxlxIsK7Cft3aIdt74TFi5c6OxrrrkmsAz2PWbAxOO+7bNk+NJo3759zjLIww8/7OyxY8eazkFphK+P5ZKXxk1y64P27tKesZZJsyHz26tT2XK6LU1ly7HI40RsGX+/8Y1vOPuDDz7wal9Ukj2LtNDi+5n3b5H5WeZQRJP+feekYIlYqZOcZy3yD+Sjjz5ytpYxLVcGpSB8pXyIRdaXLUN2Eq192pjQpEaYJQ/rHDBggLMz32U4z2pYMnqiZNGyXtV89tvnX5nzXOTtXyx1dj5rTsymN3ny5MAyli0aUA6P4NovKS+N2zwbtDb29V+NfLJcos8i2EaLX/uiyW8RLYufZe2p2ZnrX0tGT0tGRMvaGNeoiMXHH3ggdzbfzZs3OxvXz/msjRHLu0Dz2aDvLVafZaQUIYQQQgghhBBCCCk6/ChFCCGEEEIIIYQQQopOScv3MrPvWaR8iG+oemZ4mRa+huF7Wmixb3hpVFKtpdPucbYmoykG2A7sY5R0LF682KtOzAiGWVI0fLPeIZlyA1/JHoJyIQx1zhX6GTf5Xq4MIxYJhyVrRbZr+GbQQzBc2bfvw4STW7KWhMn0J6L7Wr6ZITPbhM9Nk211ubB/zvqv+sEZgcct0hPfLEAi/llsMFQex1ryPhuaTC3MO/RQ5OwlE1L/MMhVM33Wsk4JMy9Yti6wSPbeeeedwPpPP/30wPoR7VqZ17OcY5EEZ2b4S7Ju3bqc55YiPlluUdqhgZLTkWU7A8tY18aa7F2b43wz9IWZZ1Gap2GR7GW2oW/fvs5esmRJ3u3bunVrzjLa3Ldk9Vt5X/fMf7068PgbLy8ynW/xwaiyYcZ1nvXxWQTXPVFiaYvvM0Pf1+aZMP47c+ZMZ2Pmem0dms1nLb/tNSmglpXTkqEdKYQEFescN26cszPv1yLFt6yNUaY3bdo0Zwd9e2D2PUIIIYQQQgghhBBSsvCjFCGEEEIIIYQQQggpOiUr3ztw4MBB4V7WDDa5yhcD3+wZUYW3Pv30086+4oorAss880xwNpoowXZgeLNFsoehmVo2tjCykigzq/k+N0u2hriGKCd9VgsN9Q0Z1jI7ZAMzd2iglMASchtVhrZCnIvjJjPDD2bDLASFeH9ZsEj58sEiH9HkoXH12fLycikvLzdnoQ3CV3LVtGnTrO1JsmfPHq92IK1btw5s3/bt2wPLt23b1tmffvqp17UwaxaCsqhzlqWy6FgzUlqkdl//+ted/ec//zlnW61bFwSV+a//+i+v+rV6rPK7MJI9rZ6GQHKeHTNmjDv26KOPBpbVspnic1pWtRvqtrXBdz2Nay6LlM9SfxhJu+VcTf6TeW4YyR7im30Pt4J4+tVBkbQB6XxBv8DjmbI+X//CbS581ztxnWeD1sYW0H8tPpFN7ofnz5gxw9na7yHLc8Vzo/JZ3KZFOxczUPfr1y+wjDV7qIb2W/WN/j91dpdF93rXmwT9t1vPYP+1bGehgdn3UMon4v8txbcvMVtjcqsdyvcIIYQQQgghhBBCSMnCj1KEEEIIIYQQQgghpOiUrHwvma1AC8ebPn164HkYElfItsWB5cuXF/V6miwBw5u18ECU7BUaq3zCFxx7kydPzlleC4lM2nEZZ0mCQpS1vrZIR0aPHu1sTZ6Qea4lRBQzZmJGDww5xUx8vu3WsDxPDEXGe/HNVClysJwvXzR5EqJlQCkEmiQlk7Dh7kk0yR5KRZP3XGyZeCEII+XLB+0azZs3d/bu3bsDyyAtW7bMWeawww5z9meffRZY5ogjjnA2+j76U1VVVc5rdVs60dk4KrL1qdb3C36eyhQ34KKuprqCsEgCkffee8+r/nfffdfZp556auC1EGtfaFjuX3sfderUSUS+HFuaZKQUCZpnca7ELKTYPyj3y6wviZZxKrMPLe94ba60SPm0bMca2lpKy5SF1NTUOBsl7wsXLsx5bli0uRXXH7iFRbbMlT6gLOjpVzd4nZvpcw899FDe7bBskxCUvS1u82zUPovSrLC/EyzZn7FNODa1Mvh8MOvlkCFDAsugHM8CnrtgwQJnX3XVVV71iKS3G9fZ2tyiSfa0zMz4fEaOHOnsMP6L21bgGtaylZFIev/h+wXHFaJljdcI47OMlCKEEEIIIYQQQgghRYcfpQghhBBCCCGEEEJI0SlZ+V5dXd1B4V5amKEW3htWXoMZChCU/4QBQ+pQRuQLygrCZNz65JNP8j4383xLOwYMGOBVfyGkJL5yhmxYxtuUKVOcPXz4cGcHZXqJW4hy0mctmR0sWXHyCUu2PE/ffrXcD14XfdlyD1dffbWz9+3bF3guZtIsRvZMDZQ44vgNk+XIgpZlb8nqt5z99i+WqudPmjQpknZg6PoXX3zh7Av6jRIRkQNf7I/kOqWCxVe0DKlRokn5LJK9qLBI9hCLTDzTP7Ac9n3/C7s4W5Py+aK9Kzdu3Jh3nYhvVp9saOeHycrn24ZSIdc8O3bsWGejLAjR5tmgLMCZZbKdo7UpzDtCm2e19mmyGO05FypLrSaf194jWhY0ra+nTZvm7D7dT8+niXmRKfGxrJU3b96c9/VQ4hjXedbHZ61zRRAoG8vMJrx161ZnW7ZksID3o22po2GR7GnZpTWf1bLPZ47RZcuWBZ5vGctaP2rbPIwYMcLZvlnsUFqrZeJD0M9wmwtNlpeJ7/vbcg++PstIKUIIIYQQQgghhBBSdPhRihBCCCGEEEIIIYQUnZKV7yWzFaBkb32/nzj77CUTnK2FtyKWzA6WLAQiutRu6NChgcejkulZiCrjVlh8Q5cRS6h/GDlAWGkehjJqEg3MsoCSPa3OoLD5Qmcxi5pktkxLOL/l+WnPMtsz1voMj1ukBChTw/Bb7X58/RrPRRlYkIxTROS5557zqr8YYLi2Rcr3y2UpOXT3PsMCy1jClVGy984vg8OwrWCIs+/c0aNvdahrlxJh5K0Wn2vatKmpLk26gJK9Fi1aeLSu9AgrE0cp34cffuh17p/+9Cdnf+Mb33D2Bx984N2OXGiSqmwyu7Ayv3xoyPMsyoLweVhkfVgPZs0S8Z9nsV7rOjuJZXsOLRuXNm569+4dWAbbuWLFisBzw25zgffjuxWIRS7zu77jnY2/k3zrQfr26ORVPhNtnrVkv20IRL021n5fYJlMiR4+c5SgWUBpGq6NLeAY378/JeEaOHCgs+fPn+9sTbKH4HHMlotg9vmwWdbxfEvGTE1yHGZtXKis8RpaBlTt2vje0TIUmq7rU3j69OlyyimnSOvWraV169bStWtXefnll93f9+zZI9XV1XL44YdLy5YtpXfv3mnpVgkhxYU+S0i8oM8SEi/os4TEC/osIaWH10epY445RiZOnCgbNmyQt99+W8477zy59NJL5b//+79F5Mv/KrNq1SpZvny5rF27VrZs2SK9evUqSMMJIbmhzxISL+izhMQL+iwh8YI+S0jp4SXf69mzZ9q/7733Xpk+fbqsX79ejjnmGJk1a5YsXrxYzjvvPBH5cnf9E088UdavXy9dunQJqjJyLGGpUWWEshIm9Jxf5lPMmjUr8LgmmywU2vjRjqP8C8t8v3cqrHX1kqkRtS6dOPgs8thjj4U6X/O1MJkbMctNGNCXMXsIZgwpRTDUG8O4MVxZk0BEJeVDUErw4IMPas1WueWWWwLbhxn6tHaff+WPAo9HSdx81pd8fLHQkj3fNhUqfF4L0cfxuGnTpkiuVQjJHmLJVJrtHKQQmXeTRLEeLFWfRZneb6++3dndPOuZPXt22r+1zMnac0J5e5hnaclMZpFhazL5lStX5t22fBj6+VedPbfVPwLLWH4/oHTmuEmjnL0lqLDomcJQMp/Pc7r11ludjf2N83QhfdmHUvVZX7SMwNm2lNC2UYlqXsM2aVJfi89aQDmtJuXLluUWx+Mb/X/qbJSg4W9MlCX7ys2jWhsjmJka5bBhMl6KpEtuLfM3SoXDiO3zfjscOHBAli5dKrt27ZKuXbvKhg0bZP/+/dK9e3dX5oQTTpAOHTrIunXr1Hr27t0rtbW1af8jhEQPfZaQeEGfJSRe0GcJiRf0WUJKA++PUr///e+lZcuWUlFRIcOGDZMVK1bISSedJFu3bpWmTZtKmzZt0spXVVVl3VRtwoQJUllZ6f6HX+cIIeGhzxISL+izhMQL+iwh8YI+S0hp4Z1971vf+pa8++67sn37dnnmmWdk0KBBsnbt2rwbMH78eBk3bpz7d21trbRv395lK0DSdnT3zNBmCQ+87rrr0v6tZQnBl5K2E78GhgFqcrRSQAuDzEQL98TsCJZQUa0eSx9hGYuUzyIryBwvWsY2y3jT6r3ivNOcjZm8Xlo4+aDzwlAsn/VBy/6D5CPFtWTZLEbmiiRh5LcWKYs1E5DFBzG7KUoALEQViq2hZeLLBy1021JeY9W8L8fzjh075JRTfp5/4/6PYvlsWVmZlJWVxS4DWRBRyUKK+X7IBvpU2FD8+sDyTsh8Zpb3d9REVXcpzrMWsM+3bEkJvnBtW4x5Fq+N8jIcI9p7CjPuaeB+QFiPJuUrlMwM51kEf2+g/AnBfteyXfnlVYt2bkUK8R6N6zwbxOTJkwOPjx49OvA4PnuL/1l/P2AWPPydM3fuXNP5SbRtSsL4rPY71PedbV0nd154j7Of+dV/OTvMDjHYFzNmzAgsc8MNN+SsZ9kv33F2oXzWl3MvS2Vl7dP99MAyvj7r/VGqadOmLpXwGWecIW+99ZY89thjctVVV8m+fftk27ZtaV+Xa2pqsn64qaiokIqKCt9mEEKM0GcJiRf0WULiBX2WkHhBnyWktAj9nwLq6upk7969csYZZ0iTJk1kzZo17m8bN26UTZs2SdeuXcNehhASEfRZQuIFfZaQeEGfJSRe0GcJqV+8IqXGjx8vF1xwgXTo0EF27Nghixcvltdff11Wr14tlZWVMnToUBk3bpy0bdtWWrduLaNGjZKuXbvmlamgrq5O6urqQsndLCF+xc7EhxRCyocyHd8QR5TcZfL8r98LPH75d/8lZzsQDBXF8GgtVLpU5I6WcRJmvB0zaznU85G5vlwU02dzETazXn2BsoKoyOZrUYEZ/pBnISwZJaTI/940xdm+Ur6o8A1RziZxwhD6Bx54IO82YYgyhlNHSSn5bDHQZB7anLBr1y5nt2zZ0qtOXywSHq0Mymu6LZ0YSXvihEUKZZ3jSj37Xin5rGWexSxNGrhNhbaes3L99alMw9o6TssIF4YrrrjC2ZqM6IUXXshZj1X+YwHnU5xnkSeeeMLZmpTPQiH6NJPbb09ldUR/DjPPFoP68NnHH388ZxmL/1ZXVwcet/5G0rJnIuizKOvTbO1drm2D48ull17qbM2XX3zxRe96w77bSglc51rXwxYefvhhZ+NzxjV6VN9SvD5KffzxxzJw4ED529/+JpWVlXLKKafI6tWr5Qc/+IGIfLlPTHl5ufTu3Vv27t0rPXr0iCydOiHEH/osIfGCPktIvKDPEhIv6LOElB5eH6VyfYVt1qyZTJ06VaZOnRqqUYSQaKDPEhIv6LOExAv6LCHxgj5LSOlRuJhoQgghhBBCCCGEEEIUvLPvFRtfnSKGVw4fPjywTCHTC0eNlunB0i8r1v4+8Li2D5S2B42IyNJpqVSZV4/4aWAZbd8HbR8pbd+PQqfkDrs/hW/aYCyv6asxpa8MHpx320oZTHVr2WMEdeP79u1z9hdffOHs/fv3p52vac21/csse100BK655hpn434CjRunpoD16V3pBfos9q/vu1ZLK2uhEOnSRWzv2p6DxoqIyIEvQnQi8Wbnzp2BxysrK52N4/Gzzz4LLG+Zcwo9LzU0Nm7c6Oxvfetbzsbnkc23sL8t75FC7jt1qJM59i37wGnPA9OfW/ab0Z69lrIe5zpcK+BYQ7s+x03afo3K/k+4vxRyNti/6/eT4DoBbQ9E370bb7311rR/F/P3FOfZL8HoLRzLuJ6dOXNm2jlYTluv+fqC9uzDjAncb/WII45wtta2KPeFxrXxtddeG0md+I4LszZGnn51g7Mt/pttbYz+jH354IMP5qz3t1en9pM7e8mEwDK+PstZnBBCCCGEEEIIIYQUHX6UIoQQQgghhBBCCCFFp+TlexoWCdX06dOdHSataiaapM439DEzvDKIoUOHOlsLU0TJEvbLgAGp8pcNudnZKOvTpHyZPP30087u/f1Tc5bXJHuYQhTxTQuuYSnfo28qnerqJakw2HzkGZYQTHxuWvkhQ4Z41Xmoock+M593lKG8DQkcU9h/+O5Ik5ACWwOPpssKUCqN10J/12QIFskehisj7/xymbMt4cbZoN8VDut7XCvn+27evn17zjIoDdDa4Dsv/a7veGd3WzrR69xsWFM9x4FsfmaR9mnPJF//PVT8XpN15UN9Sd5wTAyGbQ5wHkPJnrbeRHr16uXs5557LmQL82fLli3OPlqR8mmgdOZ3N01J1aNIanxZsvotZ99yS7g11qHibz589NFHOct87WtfCzyOay/czgJ/U4ikb09RCP/V3tcoKcT2zZkzJ7A92jYyK1ascDb6bD5rfrwGjkdt+xBtXtLWupb1AfrsU0895WxNZutLNsneLbfc4mzL71M8jmMV55QtUF77RmKBkVKEEEIIIYQQQgghpOjwoxQhhBBCCCGEEEIIKTqxle8hlrBXlI5g9o+woaQYmlgItIxgKOvDsEEMbcewvOdnP+RsTcpnkeVlA8OpNYlVVDI9DZREas8GJXso5fvF0mlBxUXEP+MeMmPGDK/ycaWsrEzKyspMUjvLOLBkC8kWnq89M6zrUMmotXjxYmf379/f2fPnzw8sj/1iCcXF8vhMMBuqBd/ncXr3Ps5++xdL1XJaiDeOkYcffjjn9VAGPnRoSiaC75FDjSZNmjhbe3579uxxdrNmzUJdr3Xr1s6ura31Ohcle2HeTZpML0rJnkYcpXxWKZ62HrNm7PPhj3/8o4ikZ3aNA0Hz7OTJk4vaBnzHF3qe1Z63NiYsW0Ro6+RSWQ9ov2lGjBgRWB7nWS0LFsrkw9wnzrki6fMu9uW4ceOc/dBDD4kPeM8NQe6X9FlfNMnejTfe6GyUxGVbG+P1582b52yU+Vl8VvN3PG7xWfy9iJk0tTqxPSjlQ/Lp4759+zpby9CpZfXG7NUIbh2EaL6JoJ9apHza1hZI5trY8qw0v8MxiVK+qHyWkVKEEEIIIYQQQgghpOjwoxQhhBBCCCGEEEIIKTolK98rLy83h7yjvATDXjXZSZThoPUV7quFOGrHMZRz5ZxJztZ23l+0aJF3mzQ5xOzZs53tK3cM078o5UPJJpJNsqcR1fjRMism+66+MtzkS9JnLbIYS4iuRbKX+Sw0GVlmOw9lFi5c6GzfvkD5miXbiAV8ZhgOjGHCV/3gDGdr4cqZYcian1qyjSAomcAwbmz3y4u+zHi0Y8cOOemkn+ess1RI+izeF8rxCgFK+UREmjdvnnddlZWVgcd95XjZMnoGlUGZXn2+Tzp06ODsTZs21Vs7cvGnP/3J2d/85jednemzvpn1DsV3edA8m61sISjmPKtlx9Las2DBAmdjFmhN4qdJc/JByxzmm1V069bgnLdRzbNheGv1krR/a/1nkdlqUiAE1+5Dh355rbjOsxrYD9raGOWQWma4bGtjDcvcp6HJwHx9FqV8ljrRx6PE8lsE+ziMlDxMtk1f8lkbjx492tmPPfaY1/XC+OyhN6MTQgghhBBCCCGEkHqHH6UIIYQQQgghhBBCSNEpWfleULYClDtpWek0yR7KxvLJtoFhjZoUzBctTFML3cV707LMWaR8Fokfhj2L2LJ0YQYFDYukTkMLLbWEQT711FOBx/PJxBhV9h8kaByWSiYYK40aNZJGjRp5hwNr4xHBOrXMFiIi1113naWpgdeuL9CvfccW9tff//73tL/hvzVZgQWL5FZ75hgC3K3nIGejHA/Rss0geC6GtGeOHS302xKKbHkOQdmfSmE85UMYyV7YjKq7d+92dosWLZy9a9euwPKYfU+7XpjMer73o5UvxDxRH9coJr5rs0NR1hc0z958cyqjsiWLqC+Z/Ynrb8s6zuJfiCU7FIJrT03KhxIhrBO3qohy3FxzzTWB9eI6G6X0FqZOnRp4XOtTTRJnQZuLrfMsHsdscZgp8lCZZ5M+i2j3gGsaxLI2tshqg9oWhMVnLc9eI8x8ir6s/Tatqalxdj7rXy0Tn/ab+YknngisR9ueQisTFW+8nHqv5eOzGlhG+70dxmfj5dmEEEIIIYQQQgghpEHAj1KEEEIIIYQQQgghpOiUrHwvF75Z3DQwFA2lZSK28ELfMFJNehRG5uSbOUgLkc8WuleI8ELf8E2NMJkLnnzySWdnk/L5yiQyx1ISTWrZEAgKUUYsYy2sHAVlmhZZge9Y0+TBvmgSXZQoa2G1KFVAH8oMUc6U80UNXluTJ2hgBj1Nyoehzu3bt3c29kuUUhXfkPOgMG5ryHzciXI+QMleIbBI+Xwzhmpo87JGQ5PfaXzjG99wtraVQCb5bLMQdI2GRq55VgPfoZs3bw7VhmHDhnmVx+enyVwQnLs1H/EdE9r2EtY1cKFZ3+8nzj5u0qhI6tQkeL6yPpyjs2XysmS29e3jIEla3ObZpM9q77ubbrrJ2YVaG2vX1rY28QWft/b73OKz2rMNMx9k0rdv31DnJ8HfeZb1gWV7Ci27tAWU7CFhfba6utrZjz/+eGCZ4cOHB9bj67OMlCKEEEIIIYQQQgghRYcfpQghhBBCCCGEEEJI0SlZ+V4y3LHQ4bT5SPEwDM2SoUALd/NFyzKntds3E1+UWOr1lR2OGDHC2dOmTXP2qFHBoc7Y75ZxpEn5RGwZCjTJnkaue45biHJQxkwLljBvtLVxENSeKEBfs4QoI9qY0GSA+Mw1WQFmHtGkfCJ6xhHMCoTXwyxEiEXapLUby7/9i6WB9U+aNCnwuCY30aR8+RBVlphkPXHzWR8s/oR9tWfPnlDXa9mypbN37tzp7NraWmcfdthhge3zld5bxrVlnl38ypvO7n9hl8AyWntEDh05ny9RSjfiTq55FqVA+G7FMYgyknwytIV5Bj/60Y+cjVI+SybkQmddw/vSJPZWFi9e7OwBAwY4GzMC4vW6LLo3dW2lTQhmacN+6dQjJU3q26NT4LkWKaclK7JIYSR7CL6D4zrPFmttjFhkssXA12ct2fc06b3WF5ltsDwL7RoWfH0Wy99yi9el1HsulM+OHDkyZ5vCrI1DveEnTpwoZWVlMmbMGHdsz549Ul1dLYcffri0bNlSevfunZaakRBSf9BnCYkX9FlC4gV9lpB4QZ8lpP7J+6PUW2+9JU888YSccsopacfHjh0rq1atkuXLl8vatWtly5Yt0qtXr9ANJYSEgz5LSLygzxISL+izhMQL+iwhpUFe8r2dO3dKv379ZObMmXLPPfe449u3b5dZs2bJ4sWL5bzzzhMRkTlz5siJJ54o69evly5dumhVHkR5eXleobq+co58rmGR7z322GOB52phffmEUAe1J2jXexH/jHvZpGgYZq3dvyV01CKN0OQW+F8zECwzevRoZ2vPQ7t/lPJlEmaM+YQdRxmqXgo+awkTPXDgQGB5TT6JGR9ERAZsa5P6xxMTAq+H52jZMDUsWYG08jimtH5Cv9MyNVpDifEaKNnTyljq8ZXyWeTNt956q7MfeOCBnO0JmzlKAyUtGKKcK+OeSGosxM1ng/ANVY/ynvHaKNkLg2Vu0cavZmvz6aCe3Zw9b9VvnW2R8pH4U2rzLMpFHnroocDyYaV8Gha5K0r5CiFdDSvBS1JVVRXqfE0aj2B/aRml8Xlq8+x/rlkeeK5lbi0UvlIo7X0c13k2l8+izBafse/aGLezyFwba/OO5bcabh2jgVtSaOtYRBsHWgZty7Yz+ayNLWUsNoLvUXy/+q6NNTRfRul2WHy3a4hqbZyXZ1dXV8tFF10k3bt3Tzu+YcMG2b9/f9rxE044QTp06CDr1q0LrGvv3r1SW1ub9j9CSLTQZwmJF/RZQuIFfZaQeEGfJaR08I6UWrp0qbzzzjvy1ltvHfS3rVu3StOmTaVNmzZpx6uqqtT/YjFhwgT52c9+5tsMQogR+iwh8YI+S0i8oM8SEi/os4SUFl4fpTZv3iyjR4+WV199VZo1axZJA8aPH58WrlhbWyvt27d32QosIV9a2Bhiyd6SGe6I0h6UglmkKpbQ5ahCpbXMV4jl/rFMtn6PKgQxjHwPj3e+oJ+z31q9JLB+DYuUMRPf0GEMUfcZz1FkGaoPn7X0oxZ+jDaGK1uyRYiIzGv9aeofSpYfX8mehm9467BhwwLLoKwPy0Qp89H8yPLuwPahrA3PffTRR519C6QPySe7aRCWbEH5gKHViPbuaNKkibODJKVRZAUqps+K2N8z+/bty1mmefPmgTaye/futH/v2rXLdP0klZWVOcto92QJw8dn2LRpU2fjs8d30/79+wOPD7ioq7MLlVWvUFLWKPj6179e300oGvU9zz744IPORgkHvqNwDdunJuWbZy8Jlrnng68sxjLHWealQmTlQzkS9jVm0ssEM+tpaPejZdceO3assy0ZQwvRFzfffLOz8R1nvfbkyZPzvnahsu/Vh89auPyvqZ/ly6pScwv6ypQpU3LWY10/htnOwgJK+bStX7TtUrSM6DNmzAjVJm3LG20dgPbs2bMDy2tgGZRp4rYVUfmsJgPNx2e79Rzk7N+umhd4LhLV2tirJzZs2CAff/yxnH766dK4cWNp3LixrF27ViZPniyNGzeWqqoq2bdvn2zbti3tvJqaGjUFekVFhbRu3Trtf4SQaKDPEhIv6LOExAv6LCHxgj5LSOnhFSl1/vnny+9///u0Y9dee62ccMIJctttt0n79u2lSZMmsmbNGundu7eIiGzcuFE2bdokXbt2DaqSEFJA6LOExAv6LCHxgj5LSLygzxJSenh9lGrVqpWcfPLJacdatGghhx9+uDs+dOhQGTdunLRt21Zat24to0aNkq5du3pnBGrUqNFB4V6YWUCTkYSRvGSGsWG4syZzsUjQtGugJEVrtybxwzZMnTrV2TfeeGNgnRh+rPUX9m82MExPa5MlVDUq+d47v1yW81ooKdJkYXg8M9xRez5an40YMcLZ+UpQowhRLqbPJsFng1kitKwi2jPQjluvbSFTspvEkikwKrQMI1FeS/O1efPmBRVXxyy+a/B5Iigluf3223PWifz4xz929n333RdYplBSPpRJ+L6/opQV1IfPhkGT6SH47Fu0aJH2N1/5XiFkKwtfWu/sIZed62yc6w4//HBnf/ppSiacbd4g0RBGyl4IOVMm9eGz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",
+      "text/plain": [
+       "<Figure size 1200x500 with 5 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "import cv2\n",
+    "import numpy as np\n",
+    "# create images of each episode from board state data in a vectorized fashion. These will generate colors close to the real visualizer, \n",
+    "# serves as good starting point for building your own visualizations\n",
+    "# it's a bit more complex to further generate some other details in the game for visualization e.g. units, text etc., in addition to trying to generate \n",
+    "# 1000s of videos of episodes at a time, making it no faster than simply just evaluating on CPU (I/O of creating videos becomes a bottleneck)\n",
+    "# we leave that to you the user to decide what to do with visualization with some useful vectorized code below\n",
+    "\n",
+    "rubble = states.board.map.rubble[i]\n",
+    "imgs = np.zeros((batch_size, 64, 64, 3))\n",
+    "for c in [0, 1, 2]:\n",
+    "    imgs[:, :, :, c] = ((np.array(states.board.map.rubble) / 100)*(1-0.411) + 0.411)\n",
+    "# color in ice and ore\n",
+    "imgs[states.board.map.ice == True] = np.array([72, 219, 251]) / 255.0\n",
+    "imgs[states.board.map.ore == True] = np.array([44, 62, 80]) / 255.0\n",
+    "imgs[states.board.factory_occupancy_map\n",
+    "\n",
+    "# for sake of space, we will just plot the first 5 environments\n",
+    "fig,axs = plt.subplots(1, 5, figsize=(12,5))\n",
+    "axs = axs.flatten()\n",
+    "for i in range(len(axs)):\n",
+    "    ax = axs[i]    \n",
+    "    ax.imshow(imgs[i])\n",
+    "plt.tight_layout()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "According to our attribute-first memory layout, states is still a `State` object, but all leaves are added with a leading dimension of `batch_size` as shown below. E.g. `unit_id` transforms from shape `(2, 11)` to `(batch_size, 2, 11)`"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 110,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Factory</span><span style=\"font-weight: bold\">(</span>\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">team_id</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">11</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_id</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">11</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">pos</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">Position</span><span style=\"font-weight: bold\">(</span><span style=\"color: #808000; text-decoration-color: #808000\">pos</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">11</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span><span style=\"font-weight: bold\">]))</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">power</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int32<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">11</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">cargo</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitCargo</span><span style=\"font-weight: bold\">(</span><span style=\"color: #808000; text-decoration-color: #808000\">stock</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int32<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">11</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4</span><span style=\"font-weight: bold\">]))</span>\n",
+       "<span style=\"font-weight: bold\">)</span>\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[1;35mFactory\u001b[0m\u001b[1m(\u001b[0m\n",
+       "    \u001b[33mteam_id\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m11\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33munit_id\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m11\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mpos\u001b[0m=\u001b[1;35mPosition\u001b[0m\u001b[1m(\u001b[0m\u001b[33mpos\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m11\u001b[0m,\u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mpower\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint32\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m11\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33mcargo\u001b[0m=\u001b[1;35mUnitCargo\u001b[0m\u001b[1m(\u001b[0m\u001b[33mstock\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint32\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m11\u001b[0m,\u001b[1;36m4\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m\n",
+       "\u001b[1m)\u001b[0m\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "rich.print(jux.tree_util.map_to_aval(states.factories))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The states returned by `JuxEnvBatch.reset()` shares the same environmental config and jux buffer config. In addition, they are also guaranteed to have the same `states.board.factories_per_team`, so they take the same number of turns to place factories."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 116,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Array([6, 6, 6, 6, 6, 6, 6, 6, 6, 6], dtype=int8)"
+      ]
+     },
+     "execution_count": 116,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "states.board.factories_per_team"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Similarly, other arguments of `JuxEnvBatch.step_*()` are also batched. All arrays must have a leading dimension of `batch_size`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 112,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "bid: ShapedArray(int32[10,2])\n",
+      "faction: ShapedArray(int8[10,2])\n"
+     ]
+    }
+   ],
+   "source": [
+    "# bid step\n",
+    "bid = jnp.zeros((batch_size, 2), dtype=jnp.int32)\n",
+    "faction = jnp.zeros((batch_size, 2), dtype=jnp.int8)\n",
+    "\n",
+    "states, (observations, rewards, dones, infos) = jux_env_batch.step_bid(states, bid, faction)\n",
+    "\n",
+    "print(f\"bid: {bid.aval}\")\n",
+    "print(f\"faction: {faction.aval}\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 113,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "spawn: ShapedArray(int8[10,2,2])\n",
+      "water: ShapedArray(int32[10,2])\n",
+      "metal: ShapedArray(int32[10,2])\n"
+     ]
+    }
+   ],
+   "source": [
+    "key = jax.random.PRNGKey(0)\n",
+    "water = jnp.ones((batch_size, 2), dtype=jnp.int32) * 150\n",
+    "metal = jnp.ones((batch_size, 2), dtype=jnp.int32) * 150\n",
+    "\n",
+    "# factory placement step\n",
+    "factories_per_team = states.board.factories_per_team[0]\n",
+    "for i in range(factories_per_team * 2):\n",
+    "    # random spawn position\n",
+    "    key, subkey = jax.random.split(key)\n",
+    "    spawn = jax.random.randint(subkey, (batch_size, 2, 2), 0, jux_env_batch.env_cfg.map_size, dtype=jnp.int8)\n",
+    "    states, (observations, rewards, dones, infos) = jux_env_batch.step_factory_placement(states, spawn, water, metal)\n",
+    "\n",
+    "print(f\"spawn: {spawn.aval}\")\n",
+    "print(f\"water: {water.aval}\")\n",
+    "print(f\"metal: {metal.aval}\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 114,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">JuxAction</span><span style=\"font-weight: bold\">(</span>\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">factory_action</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">11</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_action_queue</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">UnitAction</span><span style=\"font-weight: bold\">(</span>\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">action_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">direction</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">resource_type</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">amount</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">repeat</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>,\n",
+       "        <span style=\"color: #808000; text-decoration-color: #808000\">n</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int16<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">20</span><span style=\"font-weight: bold\">])</span>\n",
+       "    <span style=\"font-weight: bold\">)</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_action_queue_count</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>int8<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>,\n",
+       "    <span style=\"color: #808000; text-decoration-color: #808000\">unit_action_queue_update</span>=<span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">ShapedArray</span><span style=\"font-weight: bold\">(</span>bool<span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>,<span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">200</span><span style=\"font-weight: bold\">])</span>\n",
+       "<span style=\"font-weight: bold\">)</span>\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "\u001b[1;35mJuxAction\u001b[0m\u001b[1m(\u001b[0m\n",
+       "    \u001b[33mfactory_action\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m11\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33munit_action_queue\u001b[0m=\u001b[1;35mUnitAction\u001b[0m\u001b[1m(\u001b[0m\n",
+       "        \u001b[33maction_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mdirection\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mresource_type\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mamount\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mrepeat\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "        \u001b[33mn\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint16\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m,\u001b[1;36m20\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
+       "    \u001b[1m)\u001b[0m,\n",
+       "    \u001b[33munit_action_queue_count\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mint8\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+       "    \u001b[33munit_action_queue_update\u001b[0m=\u001b[1;35mShapedArray\u001b[0m\u001b[1m(\u001b[0mbool\u001b[1m[\u001b[0m\u001b[1;36m10\u001b[0m,\u001b[1;36m2\u001b[0m,\u001b[1;36m200\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m\n",
+       "\u001b[1m)\u001b[0m\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# a dummy action\n",
+    "jux_action = JuxAction.empty(\n",
+    "    jux_env_batch.env_cfg, \n",
+    "    jux_env_batch.buf_cfg\n",
+    ")\n",
+    "jux_action = jax.tree_map(lambda x: x[None].repeat(batch_size, axis=0), jux_action)\n",
+    "rich.print(jux.tree_util.map_to_aval(jux_action))\n",
+    "\n",
+    "# late game step\n",
+    "states, (observations, rewards, dones, infos) = jux_env_batch.step_late_game(states, jux_action)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Convert between PyTorch and JAX"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Since PyTorch is widely used in the community, we provide a simple way to convert between PyTorch and JAX. Following code shows how to convert observations (state) from JAX array to PyTorch tensor, so it can be feed into PyTorch models."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [],
+   "source": [
+    "# remove env_cfg to reduce output size\n",
+    "torch_state = states._replace(env_cfg=None).to_torch()\n",
+    "rich.print(jax.tree_map(lambda x: x.shape, torch_state))"
+   ]
+  },
+  {
+   "attachments": {},
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "You can also convert between PyTorch tensors and JAX arrays by `jux.torch.from_torch` and `jux.torch.to_torch`. Typical usage is to convert actions generated by PyTorch models to JAX arrays, so they can be feed into `JuxEnv.step_*()`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import torch\n",
+    "import jux.torch\n",
+    "\n",
+    "jux.torch.from_torch(torch.arange(10))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "jux.torch.to_torch(jnp.arange(10))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "There is also a utility function `JuxAction.from_torch()` for build a valid `JuxAction` object from PyTorch tensors."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.0"
+  },
+  "vscode": {
+   "interpreter": {
+    "hash": "d4d1e4263499bec80672ea0156c357c1ee493ec2b1c70f0acce89fc37c4a6abe"
+   }
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
 }


Test patch:
diff --git a/tests/map_generator/test_generator.py b/tests/map_generator/test_generator.py
index b995dab..ee6b325 100644
--- a/tests/map_generator/test_generator.py
+++ b/tests/map_generator/test_generator.py
@@ -42,8 +42,8 @@ def test_map(self):
         seed = 42
         map_type = MapType.MOUNTAIN
         symmetry = SymmetryType.HORIZONTAL
-        width = 48
-        height = 48
+        width = 64
+        height = 64
         # config.update("jax_disable_jit", True)
         map_generator = self.variant(
             GameMap.random_map,
diff --git a/tests/state/test_state.py b/tests/state/test_state.py
index a77d189..4b9f11c 100644
--- a/tests/state/test_state.py
+++ b/tests/state/test_state.py
@@ -239,7 +239,7 @@ def assert_state_eq(jux_state, lux_state):
     def test_team_lichen_score(self):
         env, actions = jux.utils.load_replay("https://www.kaggleusercontent.com/episodes/46215591.json")
         for act in actions:
-            _, lux_rewards, _, _ = env.step(act)
+            _, lux_rewards, _, _, _ = env.step(act)
         lux_rewards = jnp.array(list(lux_rewards.values()))
 
         buf_cfg = JuxBufferConfig(MAX_N_UNITS=200)
@@ -262,7 +262,7 @@ def test_step_bid(self):
         for seed in range(10):
             random.seed(seed)
             env = LuxAI_S2()
-            obs = env.reset(seed)
+            obs, _ = env.reset(seed)
             n_factory = (-obs['player_0']['real_env_steps'] - 1) // 2
             init_water_metal = env.env_cfg.INIT_WATER_METAL_PER_FACTORY * n_factory
             bid_range = (-init_water_metal, init_water_metal)
@@ -332,11 +332,11 @@ def test_step_factory_placement(self):
 
             # create env
             env = LuxAI_S2()
-            obs = env.reset(seed)
+            obs, _ = env.reset(seed)
 
             np.random.seed(seed)
             # skip bid step
-            obs, _, _, _ = env.step({
+            obs, _, _, _, _ = env.step({
                 'player_0': {
                     'bid': np.random.randint(-3, 3),
                     'faction': FactionTypes(0).name,
@@ -378,7 +378,7 @@ def test_step_factory_placement(self):
                 # valid = obs['player_0']['board']['valid_spawns_mask'][spawn[0], spawn[1]]
 
                 # step
-                obs, _, _, _ = env.step(lux_act)
+                obs, _, _, _, _ = env.step(lux_act)
                 jux_state = state_step_factory_placement(jux_state, *jux_act)
 
                 lux_state = State.from_lux(env.state)
diff --git a/tests/test_actions.py b/tests/test_actions.py
index abf90a7..d3ee19f 100644
--- a/tests/test_actions.py
+++ b/tests/test_actions.py
@@ -2,6 +2,7 @@
 
 import chex
 import numpy as np
+import pytest
 from luxai_s2 import actions as lux_actions
 from luxai_s2.actions import Action as LuxAction
 
@@ -73,6 +74,11 @@ def test_push_pop(self):
 class TestJuxAction():
 
     def test_to_from_lux_torch(self):
+        try:
+            import torch
+        except ImportError:
+            pytest.skip("torch is not installed")
+
         env, actions = jux.utils.load_replay("tests/replay2.0_0.json.gz")
         while env.env_steps < 30:
             act = next(actions)
diff --git a/tests/test_env.py b/tests/test_env.py
index 0bc0994..d708c09 100644
--- a/tests/test_env.py
+++ b/tests/test_env.py
@@ -36,7 +36,7 @@ def test_step_bid_and_factory_placement(self):
         lux_act = next(actions)
         jux_bid, jux_faction = jux.actions.bid_action_from_lux(lux_act)
 
-        lux_obs, lux_rewards, lux_dones, lux_infos = lux_env.step(lux_act)
+        lux_obs, lux_rewards, lux_dones, truncations, lux_infos = lux_env.step(lux_act)
         jux_state, (jux_obs, jux_rewards, jux_dones, jux_infos) = jux_env.step_bid(jux_state, jux_bid, jux_faction)
 
         lux_obs = lux_obs['player_0']
@@ -60,7 +60,7 @@ def test_step_bid_and_factory_placement(self):
             lux_act = next(actions)
             jux_act = jux.actions.factory_placement_action_from_lux(lux_act)
 
-            lux_obs, lux_rewards, lux_dones, lux_infos = lux_env.step(lux_act)
+            lux_obs, lux_rewards, lux_dones, truncations, lux_infos = lux_env.step(lux_act)
             jux_state, (jux_obs, jux_rewards, jux_dones,
                         jux_infos) = jux_env.step_factory_placement(jux_state, *jux_act)
 
@@ -105,7 +105,7 @@ def test_step_late_game(self):
             for i, lux_act in enumerate(actions):
                 print(f"steps: {lux_env.env_steps}")
 
-                lux_obs, lux_rewards, lux_dones, lux_infos = lux_env.step(lux_act)
+                lux_obs, lux_rewards, lux_dones, truncations, lux_infos = lux_env.step(lux_act)
 
                 jux_act = JuxAction.from_lux(jux_state, lux_act)
                 jux_state, (jux_obs, jux_rewards, jux_dones, jux_infos) = jux_env.step_late_game(jux_state, jux_act)