Skip to content

Commit 97accc4

Browse files
author
mathlib4-bot
committed
Merge remote-tracking branch 'upstream/master' into bump/v4.28.0
2 parents dd984bf + d7ea567 commit 97accc4

File tree

130 files changed

+2463
-1060
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

130 files changed

+2463
-1060
lines changed

.github/workflows/daily.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ jobs:
9999
notify-lean4checker:
100100
runs-on: ubuntu-latest
101101
needs: check-lean4checker
102-
if: always()
102+
if: github.repository == 'leanprover-community/mathlib4' && always()
103103
strategy:
104104
fail-fast: false
105105
matrix:
@@ -218,7 +218,7 @@ jobs:
218218
notify-mathlib_test_executable:
219219
runs-on: ubuntu-latest
220220
needs: check-mathlib_test_executable
221-
if: always()
221+
if: github.repository == 'leanprover-community/mathlib4' && always()
222222
strategy:
223223
fail-fast: false
224224
matrix:

Cache/IO.lean

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -459,10 +459,10 @@ Return tuples of the form ("module name", "path to .lean file").
459459
460460
The input string `arg` takes one of the following forms:
461461
462-
1. `Mathlib.Algebra.Fields.Basic`: there exists such a Lean file
463-
2. `Mathlib.Algebra.Fields`: no Lean file exists but a folder (TODO)
464-
3. `Mathlib/Algebra/Fields/Basic.lean`: the file exists (note potentially `\` on Windows)
465-
4. `Mathlib/Algebra/Fields/`: the folder exists (TODO)
462+
1. `Mathlib.Algebra.Field.Basic`: there exists such a Lean file
463+
2. `Mathlib.Algebra.Field`: no Lean file exists but a folder (TODO)
464+
3. `Mathlib/Algebra/Field/Basic.lean`: the file exists (note potentially `\` on Windows)
465+
4. `Mathlib/Algebra/Field/`: the folder exists (TODO)
466466
467467
Not supported yet:
468468

Mathlib.lean

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,7 @@ public import Mathlib.Algebra.Group.Int.Units
388388
public import Mathlib.Algebra.Group.Invertible.Basic
389389
public import Mathlib.Algebra.Group.Invertible.Defs
390390
public import Mathlib.Algebra.Group.Irreducible.Defs
391+
public import Mathlib.Algebra.Group.Irreducible.Indecomposable
391392
public import Mathlib.Algebra.Group.Irreducible.Lemmas
392393
public import Mathlib.Algebra.Group.MinimalAxioms
393394
public import Mathlib.Algebra.Group.Nat.Defs
@@ -608,6 +609,7 @@ public import Mathlib.Algebra.Homology.HomotopyCategory.Shift
608609
public import Mathlib.Algebra.Homology.HomotopyCategory.ShiftSequence
609610
public import Mathlib.Algebra.Homology.HomotopyCategory.ShortExact
610611
public import Mathlib.Algebra.Homology.HomotopyCategory.SingleFunctors
612+
public import Mathlib.Algebra.Homology.HomotopyCategory.SpectralObject
611613
public import Mathlib.Algebra.Homology.HomotopyCategory.Triangulated
612614
public import Mathlib.Algebra.Homology.HomotopyCofiber
613615
public import Mathlib.Algebra.Homology.ImageToKernel
@@ -1372,6 +1374,7 @@ public import Mathlib.AlgebraicTopology.FundamentalGroupoid.PUnit
13721374
public import Mathlib.AlgebraicTopology.FundamentalGroupoid.Product
13731375
public import Mathlib.AlgebraicTopology.FundamentalGroupoid.SimplyConnected
13741376
public import Mathlib.AlgebraicTopology.ModelCategory.Basic
1377+
public import Mathlib.AlgebraicTopology.ModelCategory.Bifibrant
13751378
public import Mathlib.AlgebraicTopology.ModelCategory.BrownLemma
13761379
public import Mathlib.AlgebraicTopology.ModelCategory.CategoryWithCofibrations
13771380
public import Mathlib.AlgebraicTopology.ModelCategory.Cylinder
@@ -1427,6 +1430,7 @@ public import Mathlib.AlgebraicTopology.SimplicialSet.Dimension
14271430
public import Mathlib.AlgebraicTopology.SimplicialSet.Finite
14281431
public import Mathlib.AlgebraicTopology.SimplicialSet.FiniteColimits
14291432
public import Mathlib.AlgebraicTopology.SimplicialSet.FiniteProd
1433+
public import Mathlib.AlgebraicTopology.SimplicialSet.HoFunctorMonoidal
14301434
public import Mathlib.AlgebraicTopology.SimplicialSet.HomotopyCat
14311435
public import Mathlib.AlgebraicTopology.SimplicialSet.Horn
14321436
public import Mathlib.AlgebraicTopology.SimplicialSet.HornColimits
@@ -2260,6 +2264,7 @@ public import Mathlib.CategoryTheory.Adjunction.Whiskering
22602264
public import Mathlib.CategoryTheory.Balanced
22612265
public import Mathlib.CategoryTheory.Bicategory.Adjunction.Adj
22622266
public import Mathlib.CategoryTheory.Bicategory.Adjunction.Basic
2267+
public import Mathlib.CategoryTheory.Bicategory.Adjunction.Cat
22632268
public import Mathlib.CategoryTheory.Bicategory.Adjunction.Mate
22642269
public import Mathlib.CategoryTheory.Bicategory.Basic
22652270
public import Mathlib.CategoryTheory.Bicategory.CatEnriched
@@ -3249,6 +3254,7 @@ public import Mathlib.Combinatorics.SimpleGraph.Coloring
32493254
public import Mathlib.Combinatorics.SimpleGraph.CompleteMultipartite
32503255
public import Mathlib.Combinatorics.SimpleGraph.ConcreteColorings
32513256
public import Mathlib.Combinatorics.SimpleGraph.Connectivity.Connected
3257+
public import Mathlib.Combinatorics.SimpleGraph.Connectivity.EdgeConnectivity
32523258
public import Mathlib.Combinatorics.SimpleGraph.Connectivity.Represents
32533259
public import Mathlib.Combinatorics.SimpleGraph.Connectivity.Subgraph
32543260
public import Mathlib.Combinatorics.SimpleGraph.Connectivity.WalkCounting
@@ -5416,6 +5422,7 @@ public import Mathlib.Order.CompleteLattice.Finset
54165422
public import Mathlib.Order.CompleteLattice.Group
54175423
public import Mathlib.Order.CompleteLattice.Lemmas
54185424
public import Mathlib.Order.CompleteLattice.MulticoequalizerDiagram
5425+
public import Mathlib.Order.CompleteLattice.PiLex
54195426
public import Mathlib.Order.CompleteLattice.SetLike
54205427
public import Mathlib.Order.CompleteLatticeIntervals
54215428
public import Mathlib.Order.CompletePartialOrder

Mathlib/Algebra/BigOperators/Ring/Finset.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,11 @@ theorem prod_add_ordered [LinearOrder ι] (s : Finset ι) (f g : ι → R) :
220220
mul_left_comm]
221221
exact mt (fun ha => (mem_filter.1 ha).1) ha'
222222

223+
theorem prod_one_add_ordered [LinearOrder ι] (s : Finset ι) (f : ι → R) :
224+
∏ i ∈ s, (1 + f i) = 1 + ∑ i ∈ s, f i * ∏ j ∈ s with j < i, (1 + f j) := by
225+
rw [prod_add_ordered]
226+
simp
227+
223228
/-- Summing `a ^ #t * b ^ (n - #t)` over all finite subsets `t` of a finset `s`
224229
gives `(a + b) ^ #s`. -/
225230
theorem sum_pow_mul_eq_add_pow (a b : R) (s : Finset ι) :
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/-
2+
Copyright (c) 2025 Oliver Nash. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Oliver Nash
5+
-/
6+
module
7+
8+
public import Mathlib.Algebra.Group.Irreducible.Defs
9+
public import Mathlib.Algebra.Group.Submonoid.Basic
10+
public import Mathlib.Algebra.Order.Monoid.Defs
11+
public import Mathlib.Order.Preorder.Finite
12+
13+
/-!
14+
# Indecomposable elements of monoids
15+
-/
16+
17+
@[expose] public section
18+
19+
open Set
20+
21+
variable {ι M : Type*} [Monoid M]
22+
23+
/-- Given a family of elements of a monoid, a member is said to be indecomposable if it cannot be
24+
written as a product of two others in a non-trivial way. -/
25+
@[to_additive (attr := simp) /-- Given a family of elements of an additive monoid, a member is said
26+
to be indecomposable if it cannot be written as a sum of two others in a non-trivial way.-/]
27+
def IsMulIndecomposable (v : ι → M) (s : Set ι) (i : ι) : Prop :=
28+
i ∈ s ∧ ∀ᵉ (j ∈ s) (k ∈ s), v i = v j * v k → v j = 1 ∨ v k = 1
29+
30+
@[to_additive]
31+
lemma isMulIndecomposable_id_univ [Subsingleton Mˣ] {x : M} (hx : x ≠ 1) :
32+
IsMulIndecomposable id univ x ↔ Irreducible x :=
33+
fun h ↦ ⟨by simpa, by simpa using h⟩, fun h ↦ by simpa using h.isUnit_or_isUnit⟩
34+
35+
/-- Given a finite family of points `v` in a monoid `M`, together with a morphism into a
36+
linearly-ordered monoid `f : M →* S`, the submonoid generated by those points of `v` which lie in
37+
the "half space" where `f > 1` is generated by the subset of such points which are indecomposable
38+
with respect to points in this half space. -/
39+
@[to_additive /-- Given a finite family of points `v` in an additive monoid `M`, together with a
40+
morphism into a linearly-ordered additive monoid `f : M →+ S`, the submonoid generated by those
41+
points of `v` which lie in the half space where `f > 0` is generated by the subset of such points
42+
which are indecomposable with respect to points in this half space.
43+
44+
If `v` is the set of roots of a crystallographic root system and `S = ℚ`, then this is
45+
[serre1965](Ch. V, §9, Lemma 2) and it may be used to prove that the root system has a base. -/]
46+
lemma Submonoid.closure_image_one_lt_and_isMulIndecomposable [Finite ι]
47+
{S : Type*} [CommMonoid S] [LinearOrder S] [IsOrderedCancelMonoid S]
48+
(v : ι → M) (f : M →* S) :
49+
closure (v '' {i | IsMulIndecomposable v {j | 1 < f (v j)} i}) =
50+
closure (v '' {i | 1 < f (v i)}) := by
51+
refine le_antisymm (closure_mono (image_mono <| by aesop)) (closure_le.mpr ?_)
52+
rintro - ⟨i, hi : 1 < f (v i), rfl⟩
53+
by_contra hi'
54+
let t : Set ι := {i | IsMulIndecomposable v {j | 1 < f (v j)} i}
55+
let s : Set ι := {j | 1 < f (v j) ∧ v j ∉ closure (v '' t)}
56+
have hne : s.Nonempty := ⟨i, hi, hi'⟩
57+
clear! i
58+
obtain ⟨i, hi⟩ := s.toFinite.exists_minimalFor (f ∘ v) s hne
59+
have ⟨(hi₀ : 1 < f (v i)), (hi₁ : v i ∉ _)⟩ : i ∈ s := hi.prop
60+
have hi₂ (k : ι) (hk₀ : 1 < f (v k)) (hk₁ : f (v k) < f (v i)) : v k ∈ closure (v '' t) := by
61+
by_contra hk₂; exact not_le.mpr hk₁ <| hi.le_of_le ⟨hk₀, hk₂⟩ hk₁.le
62+
have hi₃ : i ∉ t := by contrapose! hi₁; exact subset_closure <| mem_image_of_mem v hi₁
63+
obtain ⟨j, k, hj, hk, hjk⟩ : ∃ (j k : ι) (hj : 1 < f (v j)) (hk : 1 < f (v k)),
64+
v i = v j * v k := by
65+
grind [IsMulIndecomposable]
66+
have hj' : v j ∈ closure (v '' t) := hi₂ j hj <| by aesop
67+
have hk' : v k ∈ closure (v '' t) := hi₂ k hk <| by aesop
68+
replace hjk : v i ∈ closure (v '' t) := hjk ▸ mul_mem hj' hk'
69+
exact hi₁ hjk

Mathlib/Algebra/Homology/DerivedCategory/Ext/ExtClass.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ noncomputable def extClass : Ext.{w} S.X₃ S.X₁ 1 := by
8585
lemma extClass_hom [HasDerivedCategory.{w'} C] : hS.extClass.hom = hS.singleδ := by
8686
change SmallShiftedHom.equiv W Q hS.extClass = _
8787
dsimp [extClass, SmallShiftedHom.equiv]
88-
erw [SmallHom.equiv_comp, Iso.homToEquiv_apply]
88+
erw [SmallHom.equiv_comp]
8989
rw [SmallHom.equiv_mkInv, SmallHom.equiv_mk]
9090
dsimp [singleδ, triangleOfSESδ]
9191
rw [Category.assoc, Category.assoc, Category.assoc,
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/-
2+
Copyright (c) 2024 Joël Riou. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Joël Riou
5+
-/
6+
module
7+
8+
public import Mathlib.Algebra.Homology.HomotopyCategory.Triangulated
9+
public import Mathlib.CategoryTheory.Triangulated.SpectralObject
10+
11+
/-!
12+
# The spectral object with values in the homotopy category
13+
14+
Let `C` be an additive category. In this file, we show that the
15+
mapping cone defines a spectral object with values in the homotopy
16+
category of `ℤ`-indexed cochain complexes `C` that is indexed
17+
by the category `CochainComplex C ℤ`.
18+
(It follows that to any functor `ι ⥤ CochainComplex C ℤ` (e.g. a filtered
19+
complex), there is an associated spectral object indexed by `ι`.)
20+
21+
-/
22+
23+
@[expose] public section
24+
25+
namespace HomotopyCategory
26+
27+
open CategoryTheory Limits Triangulated CochainComplex.mappingCone
28+
29+
variable (C : Type*) [Category* C] [Preadditive C]
30+
[HasZeroObject C] [HasBinaryBiproducts C]
31+
32+
/-- The functor `ComposableArrows (CochainComplex C ℤ) 1 ⥤ CochainComplex C ℤ` which
33+
sends a morphism of cochain complexes to its mapping cone. -/
34+
@[simps]
35+
noncomputable def composableArrowsFunctor :
36+
ComposableArrows (CochainComplex C ℤ) 1 ⥤ CochainComplex C ℤ where
37+
obj f := CochainComplex.mappingCone (f.map' 0 1)
38+
map φ := map _ _ (φ.app 0) (φ.app 1) (ComposableArrows.naturality' φ 0 1)
39+
map_id _ := map_id _
40+
map_comp _ _ := map_comp _ _ _ _ _ _ _ _ _
41+
42+
/-- The spectral object with values in `(HomotopyCategory C (.up ℤ)` that
43+
is indexed by `CochainComplex C ℤ`. -/
44+
@[simps]
45+
noncomputable def spectralObjectMappingCone :
46+
SpectralObject (HomotopyCategory C (ComplexShape.up ℤ)) (CochainComplex C ℤ) where
47+
ω₁ := composableArrowsFunctor C ⋙ HomotopyCategory.quotient _ _
48+
δ'.app D := ((HomotopyCategory.quotient C (ComplexShape.up ℤ)).mapTriangle.obj
49+
(CochainComplex.mappingConeCompTriangle (D.map' 0 1) (D.map' 1 2))).mor₃
50+
δ'.naturality D₁ D₂ φ := by
51+
obtain ⟨_, _, _, f, g, rfl⟩ := ComposableArrows.mk₂_surjective D₁
52+
obtain ⟨_, _, _, f', g', rfl⟩ := ComposableArrows.mk₂_surjective D₂
53+
have eq := CochainComplex.mappingConeCompTriangle_mor₃_naturality f g f' g' φ
54+
dsimp [ComposableArrows.Precomp.map] at eq ⊢
55+
simp only [Category.assoc, ← Functor.map_comp_assoc]
56+
simp [eq]
57+
distinguished' D := by
58+
obtain ⟨_, _, _, f, g, rfl⟩ := ComposableArrows.mk₂_surjective D
59+
exact HomotopyCategory.mappingConeCompTriangleh_distinguished f g
60+
61+
end HomotopyCategory

Mathlib/Algebra/Module/Submodule/Map.lean

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -595,11 +595,8 @@ theorem orderIsoMapComap_symm_apply' (e : M ≃ₛₗ[τ₁₂] M₂) (p : Submo
595595

596596
theorem inf_comap_le_comap_add (f₁ f₂ : M →ₛₗ[τ₁₂] M₂) :
597597
comap f₁ q ⊓ comap f₂ q ≤ comap (f₁ + f₂) q := by
598-
rw [SetLike.le_def]
599-
intro m h
600-
change f₁ m + f₂ m ∈ q
601-
change f₁ m ∈ q ∧ f₂ m ∈ q at h
602-
apply q.add_mem h.1 h.2
598+
simp only [SetLike.le_def, mem_comap, mem_inf, LinearMap.add_apply]
599+
exact fun _ h ↦ add_mem h.1 h.2
603600

604601
lemma surjOn_iff_le_map [RingHomSurjective τ₁₂] {f : M →ₛₗ[τ₁₂] M₂} {p : Submodule R M}
605602
{q : Submodule R₂ M₂} : Set.SurjOn f p q ↔ q ≤ p.map f :=
@@ -619,11 +616,8 @@ variable (p : Submodule R M) (q : Submodule R₂ M₂)
619616
variable (pₗ : Submodule R N) (qₗ : Submodule R N₂)
620617

621618
theorem comap_le_comap_smul (fₗ : N →ₗ[R] N₂) (c : R) : comap fₗ qₗ ≤ comap (c • fₗ) qₗ := by
622-
rw [SetLike.le_def]
623-
intro m h
624-
change c • fₗ m ∈ qₗ
625-
change fₗ m ∈ qₗ at h
626-
apply qₗ.smul_mem _ h
619+
simp only [SetLike.le_def, mem_comap, LinearMap.smul_apply]
620+
exact fun _ h ↦ smul_mem _ _ h
627621

628622
/-- Given modules `M`, `M₂` over a commutative ring, together with submodules `p ⊆ M`, `q ⊆ M₂`,
629623
the set of maps $\{f ∈ Hom(M, M₂) | f(p) ⊆ q \}$ is a submodule of `Hom(M, M₂)`. -/

Mathlib/Algebra/Module/ZLattice/Basic.lean

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,7 @@ theorem map_fundamentalDomain {F : Type*} [NormedAddCommGroup F] [NormedSpace K
104104
theorem fundamentalDomain_reindex {ι' : Type*} (e : ι ≃ ι') :
105105
fundamentalDomain (b.reindex e) = fundamentalDomain b := by
106106
ext
107-
simp_rw [mem_fundamentalDomain, Basis.repr_reindex_apply]
108-
rw [Equiv.forall_congr' e]
109-
simp_rw [implies_true]
107+
simp [e.forall_congr_left]
110108

111109
variable [IsStrictOrderedRing K]
112110

Mathlib/Algebra/Order/GroupWithZero/Unbundled/Basic.lean

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -947,11 +947,6 @@ lemma zpow_pos (ha : 0 < a) : ∀ n : ℤ, 0 < a ^ n
947947
| (n : ℕ) => by rw [zpow_natCast]; exact pow_pos ha _
948948
| -(n + 1 : ℕ) => by rw [zpow_neg, inv_pos, zpow_natCast]; exact pow_pos ha _
949949

950-
omit [ZeroLEOneClass G₀] in
951-
lemma zpow_left_strictMonoOn₀ [MulPosMono G₀] (hn : 0 < n) :
952-
StrictMonoOn (fun a : G₀ ↦ a ^ n) {a | 0 ≤ a} := by
953-
lift n to ℕ using hn.le; simpa using pow_left_strictMonoOn₀ (by lia)
954-
955950
lemma zpow_right_mono₀ (ha : 1 ≤ a) : Monotone fun n : ℤ ↦ a ^ n := by
956951
refine monotone_int_of_le_succ fun n ↦ ?_
957952
rw [zpow_add_one₀ (zero_lt_one.trans_le ha).ne']
@@ -1048,6 +1043,24 @@ end ZPow
10481043

10491044
end ZeroLEOneClass
10501045

1046+
section MulPosMono
1047+
1048+
variable [MulPosMono G₀] {n : ℤ}
1049+
1050+
lemma zpow_left_monoOn₀ (hn : 0 ≤ n) : MonotoneOn (fun a : G₀ ↦ a ^ n) {a | 0 ≤ a} := by
1051+
lift n to ℕ using hn; simpa using pow_left_monotoneOn
1052+
1053+
lemma zpow_left_strictMonoOn₀ (hn : 0 < n) : StrictMonoOn (fun a : G₀ ↦ a ^ n) {a | 0 ≤ a} := by
1054+
lift n to ℕ using hn.le; simpa using pow_left_strictMonoOn₀ (by lia)
1055+
1056+
lemma zpow_le_zpow_left₀ (hn : 0 ≤ n) (ha : 0 ≤ a) (h : a ≤ b) : a ^ n ≤ b ^ n :=
1057+
zpow_left_monoOn₀ (G₀ := G₀) hn ha (by grind) h
1058+
1059+
lemma zpow_lt_zpow_left₀ (hn : 0 < n) (ha : 0 ≤ a) (h : a < b) : a ^ n < b ^ n :=
1060+
zpow_left_strictMonoOn₀ (G₀ := G₀) hn ha (by grind) h
1061+
1062+
end MulPosMono
1063+
10511064
end PosMulReflectLT
10521065

10531066
section MulPosReflectLT
@@ -1290,10 +1303,12 @@ lemma neg_of_div_neg_left (h : a / b < 0) (hb : 0 ≤ b) : a < 0 :=
12901303

12911304
end PosMulMono
12921305

1293-
variable [PosMulStrictMono G₀] {m n : ℤ}
1306+
variable {m n : ℤ}
12941307

12951308
section ZeroLEOne
12961309

1310+
variable [PosMulStrictMono G₀]
1311+
12971312
variable [ZeroLEOneClass G₀]
12981313

12991314
lemma inv_lt_one_iff₀ : a⁻¹ < 1 ↔ a ≤ 01 < a := by
@@ -1317,6 +1332,18 @@ lemma zpow_eq_one_iff_right₀ (ha₀ : 0 ≤ a) (ha₁ : a ≠ 1) {n : ℤ} : a
13171332

13181333
end ZeroLEOne
13191334

1335+
section MulPosMono
1336+
1337+
variable [PosMulReflectLT G₀] [MulPosMono G₀]
1338+
1339+
lemma zpow_le_zpow_iff_left₀ (ha : 0 ≤ a) (hb : 0 ≤ b) (hn : 0 < n) : a ^ n ≤ b ^ n ↔ a ≤ b :=
1340+
(zpow_left_strictMonoOn₀ (G₀ := G₀) hn).le_iff_le ha hb
1341+
1342+
lemma zpow_lt_zpow_iff_left₀ (ha : 0 ≤ a) (hb : 0 ≤ b) (hn : 0 < n) : a ^ n < b ^ n ↔ a < b :=
1343+
(zpow_left_strictMonoOn₀ (G₀ := G₀) hn).lt_iff_lt ha hb
1344+
1345+
end MulPosMono
1346+
13201347
variable [MulPosStrictMono G₀]
13211348

13221349
end GroupWithZero.LinearOrder

0 commit comments

Comments
 (0)