haliax 1.4.dev445__tar.gz → 1.4.dev446__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {haliax-1.4.dev445 → haliax-1.4.dev446}/PKG-INFO +1 -1
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/__about__.py +1 -1
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/scan.py +33 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_scan.py +59 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/.agents/projects/api_parity.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/.coveragerc +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/.flake8 +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/.github/workflows/publish_dev.yaml +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/.github/workflows/run_pre_commit.yaml +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/.github/workflows/run_quick_levanter_tests.yaml +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/.github/workflows/run_tests.yaml +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/.gitignore +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/.playbooks/add-types.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/.playbooks/wrap-non-named.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/.pre-commit-config.yaml +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/.readthedocs.yaml +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/AGENTS.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/AUTHORS.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/CONTRIBUTING.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/CONTRIBUTORS.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/LICENSE +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/README.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/api.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/broadcasting.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/cheatsheet.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/css/material.css +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/css/mkdocstrings.css +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/faq.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/data_parallel_mesh.png +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/data_parallel_mesh_replicated.png +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/device_mesh_1d.png +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/device_mesh_1d_zero.png +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/device_mesh_2d.png +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/device_mesh_2d_batch_partitioned.png +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/device_mesh_2d_data_replicated.png +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/device_mesh_2d_data_replicated_mlp_partitioned.png +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/device_mesh_2d_intermediate_fully_partitioned.png +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/figures/device_mesh_2d_zero.png +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/fp8.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/index.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/indexing.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/matmul.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/nn.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/partitioning.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/primer.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/rearrange.ipynb +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/rearrange.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/requirements.txt +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/scan.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/state-dict.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/tutorial.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/typing.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/docs/vmap.md +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/etc/license_header.txt +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/mkdocs.yml +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/pyproject.toml +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/__init__.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/__init__.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/compile_utils.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/dot.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/einsum.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/fp8.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/parsing.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/rearrange.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/scan.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/state_dict.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/_src/util.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/axis.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/core.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/debug.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/fft.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/field.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/haxtyping.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/hof.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/jax_utils.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/__init__.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/activations.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/attention.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/conv.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/dropout.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/embedding.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/linear.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/loss.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/mlp.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/mup.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/normalization.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/nn/pool.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/ops.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/partitioning.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/poly.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/quantization.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/random.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/specialized_fns.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/state_dict.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/tree.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/tree_util.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/types.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/util.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/src/haliax/wrap.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/core_test.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_attention.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_axis.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_bitwise_ops.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_conv.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_debug.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_dot.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_dtype_typing.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_einsum.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_fft.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_field.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_fp8.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_hof.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_int8.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_moe_linear.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_mup_coordinate_check.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_mup_embedding.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_mup_linear.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_namedarray_typing.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_nan_reductions.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_nn.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_ops.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_parsing.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_partitioning.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_poly_ops.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_pool.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_random.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_rearrange.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_scatter_gather.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_specialized_fns.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_state_dict.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_tree_util.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_utils.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/tests/test_visualize_sharding.py +0 -0
- {haliax-1.4.dev445 → haliax-1.4.dev446}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: haliax
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.dev446
|
|
4
4
|
Summary: Named Tensors for Legible Deep Learning in JAX
|
|
5
5
|
Project-URL: Homepage, https://github.com/stanford-crfm/haliax
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/stanford-crfm/haliax/issues/
|
|
@@ -150,6 +150,11 @@ class BlockFoldable(Protocol[M]):
|
|
|
150
150
|
"""
|
|
151
151
|
...
|
|
152
152
|
|
|
153
|
+
def get_layer(self, index: int) -> M:
|
|
154
|
+
"""Return the ``index``th layer of the folded module."""
|
|
155
|
+
|
|
156
|
+
...
|
|
157
|
+
|
|
153
158
|
|
|
154
159
|
class BlockSeq(ModuleWithStateDictSerialization, Generic[M]):
|
|
155
160
|
"""
|
|
@@ -377,6 +382,11 @@ class BlockSeq(ModuleWithStateDictSerialization, Generic[M]):
|
|
|
377
382
|
|
|
378
383
|
return state_dict
|
|
379
384
|
|
|
385
|
+
def get_layer(self, index: int) -> M:
|
|
386
|
+
"""Return the ``index``th block in this sequential container."""
|
|
387
|
+
|
|
388
|
+
return self.blocks[index]
|
|
389
|
+
|
|
380
390
|
@property
|
|
381
391
|
def _output_ckpt_name(self):
|
|
382
392
|
return f"BlockSeq[{self.Block}, {self.blocks[0].__class__.__name__}].outputs"
|
|
@@ -442,6 +452,12 @@ class Stacked(ModuleWithStateDictSerialization, Generic[M]):
|
|
|
442
452
|
Block: Axis = eqx.field(static=True)
|
|
443
453
|
gradient_checkpointing: ScanCheckpointPolicy = eqx.field(static=True)
|
|
444
454
|
|
|
455
|
+
@property
|
|
456
|
+
def Layers(self) -> Axis:
|
|
457
|
+
"""Alias for :attr:`Block` used by some downstream code."""
|
|
458
|
+
|
|
459
|
+
return self.Block
|
|
460
|
+
|
|
445
461
|
@classmethod
|
|
446
462
|
def init(
|
|
447
463
|
cls,
|
|
@@ -700,6 +716,23 @@ class Stacked(ModuleWithStateDictSerialization, Generic[M]):
|
|
|
700
716
|
unstacked_leaves = tuple(zip(*unstacked_leaves))
|
|
701
717
|
return tuple(map(lambda x: jax.tree_util.tree_unflatten(structure, x), unstacked_leaves))
|
|
702
718
|
|
|
719
|
+
def get_layer(self, index: int) -> M:
|
|
720
|
+
"""Return the ``index``th layer of this stacked module."""
|
|
721
|
+
|
|
722
|
+
def select_leaf(leaf):
|
|
723
|
+
if isinstance(leaf, haliax.NamedArray):
|
|
724
|
+
if haliax.selects_axis(leaf.axes, self.Block):
|
|
725
|
+
return leaf[self.Block, index]
|
|
726
|
+
else:
|
|
727
|
+
return leaf
|
|
728
|
+
if is_jax_or_hax_array_like(leaf):
|
|
729
|
+
if getattr(leaf, "shape", ()) and leaf.shape[0] == self.Block.size:
|
|
730
|
+
return leaf[index]
|
|
731
|
+
return leaf
|
|
732
|
+
return leaf
|
|
733
|
+
|
|
734
|
+
return haliax.tree_util.tree_map(select_leaf, self.stacked)
|
|
735
|
+
|
|
703
736
|
def to_state_dict(self, prefix: str | None = None) -> StateDict:
|
|
704
737
|
# this method needs to "devectorize" the blocks, so that we have a list of blocks h.0.FOO, h.1.FOO, etc.
|
|
705
738
|
# first just do the normal thing with our own dict, which we'll post-process
|
|
@@ -51,6 +51,65 @@ def test_unstacked():
|
|
|
51
51
|
assert hax.all(module.array == m.stacked.array[i])
|
|
52
52
|
|
|
53
53
|
|
|
54
|
+
def test_get_layer_stacked():
|
|
55
|
+
class Module(eqx.Module):
|
|
56
|
+
named: hax.NamedArray
|
|
57
|
+
array: jax.Array
|
|
58
|
+
static: int = eqx.static_field()
|
|
59
|
+
|
|
60
|
+
def __call__(self, x, *, key): # pragma: no cover - unused in this test
|
|
61
|
+
return x + self.array + self.static
|
|
62
|
+
|
|
63
|
+
@staticmethod
|
|
64
|
+
def init(named, array, static):
|
|
65
|
+
return Module(named=named, array=array, static=static)
|
|
66
|
+
|
|
67
|
+
Block = hax.Axis("block", 3)
|
|
68
|
+
E = hax.Axis("E", 4)
|
|
69
|
+
|
|
70
|
+
initial_named = hax.random.uniform(jax.random.PRNGKey(0), (Block, E))
|
|
71
|
+
arrays = jax.numpy.arange(Block.size)
|
|
72
|
+
|
|
73
|
+
stacked = Stacked.init(Block, Module)(named=initial_named, array=arrays, static=2)
|
|
74
|
+
|
|
75
|
+
layer = stacked.get_layer(1)
|
|
76
|
+
|
|
77
|
+
assert isinstance(layer, Module)
|
|
78
|
+
assert layer.static == 2
|
|
79
|
+
assert layer.named.axes == (E,)
|
|
80
|
+
assert hax.all(layer.named == initial_named["block", 1])
|
|
81
|
+
assert hax.all(layer.array == arrays[1])
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def test_get_layer_blockseq():
|
|
85
|
+
class Module(eqx.Module):
|
|
86
|
+
named: hax.NamedArray
|
|
87
|
+
array: jax.Array
|
|
88
|
+
static: int = eqx.static_field()
|
|
89
|
+
|
|
90
|
+
def __call__(self, x, *, key): # pragma: no cover - unused in this test
|
|
91
|
+
return x + self.array + self.static
|
|
92
|
+
|
|
93
|
+
@staticmethod
|
|
94
|
+
def init(named, array, static):
|
|
95
|
+
return Module(named=named, array=array, static=static)
|
|
96
|
+
|
|
97
|
+
Block = hax.Axis("block", 3)
|
|
98
|
+
E = hax.Axis("E", 4)
|
|
99
|
+
|
|
100
|
+
initial_named = hax.random.uniform(jax.random.PRNGKey(0), (Block, E))
|
|
101
|
+
arrays = jax.numpy.arange(Block.size)
|
|
102
|
+
|
|
103
|
+
seq = BlockSeq.init(Block, Module)(named=initial_named, array=arrays, static=2)
|
|
104
|
+
|
|
105
|
+
layer = seq.get_layer(2)
|
|
106
|
+
|
|
107
|
+
assert isinstance(layer, Module)
|
|
108
|
+
assert layer.static == 2
|
|
109
|
+
assert hax.all(layer.named == initial_named["block", 2])
|
|
110
|
+
assert hax.all(layer.array == arrays[2])
|
|
111
|
+
|
|
112
|
+
|
|
54
113
|
def test_vmap():
|
|
55
114
|
class Module(eqx.Module):
|
|
56
115
|
weight: hax.NamedArray
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|