Description
A canonical map, also called a natural map, is a map that arises naturally from the definition or the construction of the object.
The following six constructions are supported: kernel, cokernel, image, coimage, cone, and cylinder.
The kernel of a complex map comes with a natural injection into the source complex. This natural map is always a complex morphism.
i1 : R = ZZ/101[a,b,c,d];
|
i2 : D = freeResolution coker vars R
1 4 6 4 1
o2 = R <-- R <-- R <-- R <-- R
0 1 2 3 4
o2 : Complex
|
i3 : C = (freeResolution coker matrix"a,b,c")[1]
1 3 3 1
o3 = R <-- R <-- R <-- R
-1 0 1 2
o3 : Complex
|
i4 : f = randomComplexMap(D, C, Cycle=>true)
1
o4 = -1 : 0 <----- R : -1
0
1 3
0 : R <------------------------------------------------------- R : 0
| -46a+17b-8c+26d -38a-2b+23c-10d -30a-18b-9c+37d |
4 3
1 : R <----------------------------------------------------------- R : 1
{1} | 38a+3b-10c+25d 30a+36b+14c-9d -47b-19c+2d |
{1} | -47a+17b-29c-8d -18a+39c-22d -24a+18b-32c-27d |
{1} | -13a+21b-34d 50a-22b-8c+24d -19a+39b+23c-18d |
{1} | -15a+34b+34c -28a+22b+2c -2a-10b+8c |
6 1
2 : R <--------------------------- R : 2
{2} | 24a-36b-30c-29d |
{2} | 19a+19b-10c-29d |
{2} | -8a-22b-29c-24d |
{2} | 2a+38b-47c |
{2} | 45a+22b+16c |
{2} | -47a-48b-34c |
o4 : ComplexMap
|
i5 : assert isComplexMorphism f
|
i6 : K1 = kernel f
1
o6 = R <-- image {1} | -14a-22b-50c-9d -32b+17c-42d -27a-21b+50c+27d | <-- image 0 <-- image 0
{1} | a+15b-13c+17d 22b+40c+33d -27b+6c+10d |
-1 {1} | 0 b+31c-38d a+27c-19d | 1 2
0
o6 : Complex
|
i7 : g = canonicalMap(source f, K1)
1 1
o7 = -1 : R <--------- R : -1
| 1 |
3
0 : R <--------------------------------------------------------- image {1} | -14a-22b-50c-9d -32b+17c-42d -27a-21b+50c+27d | : 0
{1} | -14a-22b-50c-9d -32b+17c-42d -27a-21b+50c+27d | {1} | a+15b-13c+17d 22b+40c+33d -27b+6c+10d |
{1} | a+15b-13c+17d 22b+40c+33d -27b+6c+10d | {1} | 0 b+31c-38d a+27c-19d |
{1} | 0 b+31c-38d a+27c-19d |
3
1 : R <----- image 0 : 1
0
1
2 : R <----- image 0 : 2
0
o7 : ComplexMap
|
i8 : degree g
o8 = 0
|
i9 : assert(isWellDefined g and isComplexMorphism g)
|
i10 : f2 = randomComplexMap(D, C)
1
o10 = -1 : 0 <----- R : -1
0
1 3
0 : R <------------------------------------------------------- R : 0
| 47a+19b-16c+7d 15a-23b+39c+43d -17a-11b+48c+36d |
4 3
1 : R <------------------------------------------------------------ R : 1
{1} | 35a+11b-38c+33d -47a+15b-37c-13d -48a-15b+39c |
{1} | 40a+11b+46c-28d -10a+30b-18c+39d 33a-49b-33c-19d |
{1} | a-3b+22c-47d 27a-22b+32c-9d 17a-20b+44c-39d |
{1} | -23a-7b+2c+29d -32a-20b+24c-30d 36a+9b-39c+4d |
6 1
2 : R <--------------------------- R : 2
{2} | 13a-26b+22c-49d |
{2} | -11a-8b+43c-8d |
{2} | 36a-3b-22c-30d |
{2} | 41a+16b-28c-6d |
{2} | 35a-9b-35c+6d |
{2} | 40a+3b-31c+25d |
o10 : ComplexMap
|
i11 : assert not isComplexMorphism f2
|
i12 : K2 = kernel f2
1
o12 = R <-- image {1} | -39a-21b+40c-31d -20b-28c+37d 24a+47b+6c+38d | <-- image 0 <-- image 0
{1} | a+9b+19c-2d -17b+26c-23d -49b-32c+5d |
-1 {1} | 0 b-c-19d a+28c-33d | 1 2
0
o12 : Complex
|
i13 : g2 = canonicalMap(source f2, K2)
1 1
o13 = -1 : R <--------- R : -1
| 1 |
3
0 : R <-------------------------------------------------------- image {1} | -39a-21b+40c-31d -20b-28c+37d 24a+47b+6c+38d | : 0
{1} | -39a-21b+40c-31d -20b-28c+37d 24a+47b+6c+38d | {1} | a+9b+19c-2d -17b+26c-23d -49b-32c+5d |
{1} | a+9b+19c-2d -17b+26c-23d -49b-32c+5d | {1} | 0 b-c-19d a+28c-33d |
{1} | 0 b-c-19d a+28c-33d |
3
1 : R <----- image 0 : 1
0
1
2 : R <----- image 0 : 2
0
o13 : ComplexMap
|
i14 : assert(isWellDefined g2 and isComplexMorphism g2)
|
i15 : Q = cokernel f
4 1
o15 = cokernel | -46a+17b-8c+26d -38a-2b+23c-10d -30a-18b-9c+37d | <-- cokernel {1} | 38a+3b-10c+25d 30a+36b+14c-9d -47b-19c+2d | <-- cokernel {2} | 24a-36b-30c-29d | <-- R <-- R
{1} | -47a+17b-29c-8d -18a+39c-22d -24a+18b-32c-27d | {2} | 19a+19b-10c-29d |
0 {1} | -13a+21b-34d 50a-22b-8c+24d -19a+39b+23c-18d | {2} | -8a-22b-29c-24d | 3 4
{1} | -15a+34b+34c -28a+22b+2c -2a-10b+8c | {2} | 2a+38b-47c |
{2} | 45a+22b+16c |
1 {2} | -47a-48b-34c |
2
o15 : Complex
|
i16 : g3 = canonicalMap(Q, target f)
1
o16 = 0 : cokernel | -46a+17b-8c+26d -38a-2b+23c-10d -30a-18b-9c+37d | <--------- R : 0
| 1 |
4
1 : cokernel {1} | 38a+3b-10c+25d 30a+36b+14c-9d -47b-19c+2d | <------------------- R : 1
{1} | -47a+17b-29c-8d -18a+39c-22d -24a+18b-32c-27d | {1} | 1 0 0 0 |
{1} | -13a+21b-34d 50a-22b-8c+24d -19a+39b+23c-18d | {1} | 0 1 0 0 |
{1} | -15a+34b+34c -28a+22b+2c -2a-10b+8c | {1} | 0 0 1 0 |
{1} | 0 0 0 1 |
6
2 : cokernel {2} | 24a-36b-30c-29d | <----------------------- R : 2
{2} | 19a+19b-10c-29d | {2} | 1 0 0 0 0 0 |
{2} | -8a-22b-29c-24d | {2} | 0 1 0 0 0 0 |
{2} | 2a+38b-47c | {2} | 0 0 1 0 0 0 |
{2} | 45a+22b+16c | {2} | 0 0 0 1 0 0 |
{2} | -47a-48b-34c | {2} | 0 0 0 0 1 0 |
{2} | 0 0 0 0 0 1 |
4 4
3 : R <------------------- R : 3
{3} | 1 0 0 0 |
{3} | 0 1 0 0 |
{3} | 0 0 1 0 |
{3} | 0 0 0 1 |
1 1
4 : R <------------- R : 4
{4} | 1 |
o16 : ComplexMap
|
i17 : assert(isWellDefined g3 and isComplexMorphism g3)
|
i18 : I = image f
o18 = image | -46a+17b-8c+26d -38a-2b+23c-10d -30a-18b-9c+37d | <-- image {1} | 38a+3b-10c+25d 30a+36b+14c-9d -47b-19c+2d | <-- image {2} | 24a-36b-30c-29d | <-- image 0 <-- image 0
{1} | -47a+17b-29c-8d -18a+39c-22d -24a+18b-32c-27d | {2} | 19a+19b-10c-29d |
0 {1} | -13a+21b-34d 50a-22b-8c+24d -19a+39b+23c-18d | {2} | -8a-22b-29c-24d | 3 4
{1} | -15a+34b+34c -28a+22b+2c -2a-10b+8c | {2} | 2a+38b-47c |
{2} | 45a+22b+16c |
1 {2} | -47a-48b-34c |
2
o18 : Complex
|
i19 : g4 = canonicalMap(target f, I)
1
o19 = 0 : R <------------------------------------------------------- image | -46a+17b-8c+26d -38a-2b+23c-10d -30a-18b-9c+37d | : 0
| -46a+17b-8c+26d -38a-2b+23c-10d -30a-18b-9c+37d |
4
1 : R <----------------------------------------------------------- image {1} | 38a+3b-10c+25d 30a+36b+14c-9d -47b-19c+2d | : 1
{1} | 38a+3b-10c+25d 30a+36b+14c-9d -47b-19c+2d | {1} | -47a+17b-29c-8d -18a+39c-22d -24a+18b-32c-27d |
{1} | -47a+17b-29c-8d -18a+39c-22d -24a+18b-32c-27d | {1} | -13a+21b-34d 50a-22b-8c+24d -19a+39b+23c-18d |
{1} | -13a+21b-34d 50a-22b-8c+24d -19a+39b+23c-18d | {1} | -15a+34b+34c -28a+22b+2c -2a-10b+8c |
{1} | -15a+34b+34c -28a+22b+2c -2a-10b+8c |
6
2 : R <--------------------------- image {2} | 24a-36b-30c-29d | : 2
{2} | 24a-36b-30c-29d | {2} | 19a+19b-10c-29d |
{2} | 19a+19b-10c-29d | {2} | -8a-22b-29c-24d |
{2} | -8a-22b-29c-24d | {2} | 2a+38b-47c |
{2} | 2a+38b-47c | {2} | 45a+22b+16c |
{2} | 45a+22b+16c | {2} | -47a-48b-34c |
{2} | -47a-48b-34c |
4
3 : R <----- image 0 : 3
0
1
4 : R <----- image 0 : 4
0
o19 : ComplexMap
|
i20 : assert(isWellDefined g4 and isComplexMorphism g4)
|
The coimage of a complex map comes with a natural surjection from the source complex. This natural map is always a complex morphism.
i21 : J = coimage f
3 1
o21 = cokernel | 1 | <-- cokernel {1} | -14a-22b-50c-9d -32b+17c-42d -27a-21b+50c+27d | <-- R <-- R
{1} | a+15b-13c+17d 22b+40c+33d -27b+6c+10d |
-1 {1} | 0 b+31c-38d a+27c-19d | 1 2
0
o21 : Complex
|
i22 : g5 = canonicalMap(J, source f)
1
o22 = -1 : cokernel | 1 | <----- R : -1
0
3
0 : cokernel {1} | -14a-22b-50c-9d -32b+17c-42d -27a-21b+50c+27d | <----------------- R : 0
{1} | a+15b-13c+17d 22b+40c+33d -27b+6c+10d | {1} | 1 0 0 |
{1} | 0 b+31c-38d a+27c-19d | {1} | 0 1 0 |
{1} | 0 0 1 |
3 3
1 : R <----------------- R : 1
{2} | 1 0 0 |
{2} | 0 1 0 |
{2} | 0 0 1 |
1 1
2 : R <------------- R : 2
{3} | 1 |
o22 : ComplexMap
|
i23 : assert(isWellDefined g5 and isComplexMorphism g5)
|
i24 : J2 = coimage f2
3 1
o24 = cokernel | 1 | <-- cokernel {1} | -39a-21b+40c-31d -20b-28c+37d 24a+47b+6c+38d | <-- R <-- R
{1} | a+9b+19c-2d -17b+26c-23d -49b-32c+5d |
-1 {1} | 0 b-c-19d a+28c-33d | 1 2
0
o24 : Complex
|
i25 : g6 = canonicalMap(J2, source f2)
1
o25 = -1 : cokernel | 1 | <----- R : -1
0
3
0 : cokernel {1} | -39a-21b+40c-31d -20b-28c+37d 24a+47b+6c+38d | <----------------- R : 0
{1} | a+9b+19c-2d -17b+26c-23d -49b-32c+5d | {1} | 1 0 0 |
{1} | 0 b-c-19d a+28c-33d | {1} | 0 1 0 |
{1} | 0 0 1 |
3 3
1 : R <----------------- R : 1
{2} | 1 0 0 |
{2} | 0 1 0 |
{2} | 0 0 1 |
1 1
2 : R <------------- R : 2
{3} | 1 |
o25 : ComplexMap
|
i26 : assert(isWellDefined g6 and isComplexMorphism g6)
|
The cone of a complex morphism comes with two natural maps. Given a map $f : C \to D$, let $E$ denote the cone of $f$. The first is a natural injection from the target $D$ of $f$ into $E$. The second is a natural surjection from $E$ to $C[-1]$. Together, these maps form a short exact sequence of complexes.
i27 : E = cone f
2 7 9 5 1
o27 = R <-- R <-- R <-- R <-- R
0 1 2 3 4
o27 : Complex
|
i28 : g = canonicalMap(E, target f)
2 1
o28 = 0 : R <--------- R : 0
| 0 |
| 1 |
7 4
1 : R <------------------- R : 1
{1} | 0 0 0 0 |
{1} | 0 0 0 0 |
{1} | 0 0 0 0 |
{1} | 1 0 0 0 |
{1} | 0 1 0 0 |
{1} | 0 0 1 0 |
{1} | 0 0 0 1 |
9 6
2 : R <----------------------- R : 2
{2} | 0 0 0 0 0 0 |
{2} | 0 0 0 0 0 0 |
{2} | 0 0 0 0 0 0 |
{2} | 1 0 0 0 0 0 |
{2} | 0 1 0 0 0 0 |
{2} | 0 0 1 0 0 0 |
{2} | 0 0 0 1 0 0 |
{2} | 0 0 0 0 1 0 |
{2} | 0 0 0 0 0 1 |
5 4
3 : R <------------------- R : 3
{3} | 0 0 0 0 |
{3} | 1 0 0 0 |
{3} | 0 1 0 0 |
{3} | 0 0 1 0 |
{3} | 0 0 0 1 |
1 1
4 : R <------------- R : 4
{4} | 1 |
o28 : ComplexMap
|
i29 : h = canonicalMap((source f)[-1], E)
1 2
o29 = 0 : R <----------- R : 0
| 1 0 |
3 7
1 : R <------------------------- R : 1
{1} | 1 0 0 0 0 0 0 |
{1} | 0 1 0 0 0 0 0 |
{1} | 0 0 1 0 0 0 0 |
3 9
2 : R <----------------------------- R : 2
{2} | 1 0 0 0 0 0 0 0 0 |
{2} | 0 1 0 0 0 0 0 0 0 |
{2} | 0 0 1 0 0 0 0 0 0 |
1 5
3 : R <--------------------- R : 3
{3} | 1 0 0 0 0 |
o29 : ComplexMap
|
i30 : assert(isWellDefined g and isWellDefined h)
|
i31 : assert(isComplexMorphism g and isComplexMorphism h)
|
i32 : assert isShortExactSequence(h,g)
|
The cylinder of a complex map comes with four natural maps. Given a map $f : C \to D$, let $F$ denote the cylinder of $f$. The first is the natural injection from the source $C$ of $f$ into the cylinder $F$. Together these two maps form a short exact sequence of complexes.
i33 : F = cylinder f
1 5 10 10 5 1
o33 = R <-- R <-- R <-- R <-- R <-- R
-1 0 1 2 3 4
o33 : Complex
|
i34 : g = canonicalMap(F, source f)
1 1
o34 = -1 : R <--------- R : -1
| 1 |
5 3
0 : R <----------------- R : 0
{0} | 0 0 0 |
{1} | 1 0 0 |
{1} | 0 1 0 |
{1} | 0 0 1 |
{0} | 0 0 0 |
10 3
1 : R <----------------- R : 1
{1} | 0 0 0 |
{1} | 0 0 0 |
{1} | 0 0 0 |
{2} | 1 0 0 |
{2} | 0 1 0 |
{2} | 0 0 1 |
{1} | 0 0 0 |
{1} | 0 0 0 |
{1} | 0 0 0 |
{1} | 0 0 0 |
10 1
2 : R <------------- R : 2
{2} | 0 |
{2} | 0 |
{2} | 0 |
{3} | 1 |
{2} | 0 |
{2} | 0 |
{2} | 0 |
{2} | 0 |
{2} | 0 |
{2} | 0 |
o34 : ComplexMap
|
i35 : h = canonicalMap(E, F)
2 5
o35 = 0 : R <----------------- R : 0
| 1 0 0 0 0 |
| 0 0 0 0 1 |
7 10
1 : R <------------------------------- R : 1
{1} | 1 0 0 0 0 0 0 0 0 0 |
{1} | 0 1 0 0 0 0 0 0 0 0 |
{1} | 0 0 1 0 0 0 0 0 0 0 |
{1} | 0 0 0 0 0 0 1 0 0 0 |
{1} | 0 0 0 0 0 0 0 1 0 0 |
{1} | 0 0 0 0 0 0 0 0 1 0 |
{1} | 0 0 0 0 0 0 0 0 0 1 |
9 10
2 : R <------------------------------- R : 2
{2} | 1 0 0 0 0 0 0 0 0 0 |
{2} | 0 1 0 0 0 0 0 0 0 0 |
{2} | 0 0 1 0 0 0 0 0 0 0 |
{2} | 0 0 0 0 1 0 0 0 0 0 |
{2} | 0 0 0 0 0 1 0 0 0 0 |
{2} | 0 0 0 0 0 0 1 0 0 0 |
{2} | 0 0 0 0 0 0 0 1 0 0 |
{2} | 0 0 0 0 0 0 0 0 1 0 |
{2} | 0 0 0 0 0 0 0 0 0 1 |
5 5
3 : R <--------------------- R : 3
{3} | 1 0 0 0 0 |
{3} | 0 1 0 0 0 |
{3} | 0 0 1 0 0 |
{3} | 0 0 0 1 0 |
{3} | 0 0 0 0 1 |
1 1
4 : R <------------- R : 4
{4} | 1 |
o35 : ComplexMap
|
i36 : assert(isWellDefined g and isWellDefined h)
|
i37 : assert(isComplexMorphism g and isComplexMorphism h)
|
i38 : assert isShortExactSequence(h,g)
|
The third is the natural injection from the target $D$ of $F$ into the cylinder $F$. The fourth is the natural surjection from the cylinder $F$ to the target $D$ of $f$. However, these two maps do not form a short exact sequence of complexes.
i39 : g' = canonicalMap(F, target f)
5 1
o39 = 0 : R <------------- R : 0
{0} | 0 |
{1} | 0 |
{1} | 0 |
{1} | 0 |
{0} | 1 |
10 4
1 : R <------------------- R : 1
{1} | 0 0 0 0 |
{1} | 0 0 0 0 |
{1} | 0 0 0 0 |
{2} | 0 0 0 0 |
{2} | 0 0 0 0 |
{2} | 0 0 0 0 |
{1} | 1 0 0 0 |
{1} | 0 1 0 0 |
{1} | 0 0 1 0 |
{1} | 0 0 0 1 |
10 6
2 : R <----------------------- R : 2
{2} | 0 0 0 0 0 0 |
{2} | 0 0 0 0 0 0 |
{2} | 0 0 0 0 0 0 |
{3} | 0 0 0 0 0 0 |
{2} | 1 0 0 0 0 0 |
{2} | 0 1 0 0 0 0 |
{2} | 0 0 1 0 0 0 |
{2} | 0 0 0 1 0 0 |
{2} | 0 0 0 0 1 0 |
{2} | 0 0 0 0 0 1 |
5 4
3 : R <------------------- R : 3
{3} | 0 0 0 0 |
{3} | 1 0 0 0 |
{3} | 0 1 0 0 |
{3} | 0 0 1 0 |
{3} | 0 0 0 1 |
1 1
4 : R <------------- R : 4
{4} | 1 |
o39 : ComplexMap
|
i40 : h' = canonicalMap(target f, F)
1 5
o40 = 0 : R <----------------------------------------------------------- R : 0
| 0 -46a+17b-8c+26d -38a-2b+23c-10d -30a-18b-9c+37d 1 |
4 10
1 : R <------------------------------------------------------------------------- R : 1
{1} | 0 0 0 38a+3b-10c+25d 30a+36b+14c-9d -47b-19c+2d 1 0 0 0 |
{1} | 0 0 0 -47a+17b-29c-8d -18a+39c-22d -24a+18b-32c-27d 0 1 0 0 |
{1} | 0 0 0 -13a+21b-34d 50a-22b-8c+24d -19a+39b+23c-18d 0 0 1 0 |
{1} | 0 0 0 -15a+34b+34c -28a+22b+2c -2a-10b+8c 0 0 0 1 |
6 10
2 : R <--------------------------------------------- R : 2
{2} | 0 0 0 24a-36b-30c-29d 1 0 0 0 0 0 |
{2} | 0 0 0 19a+19b-10c-29d 0 1 0 0 0 0 |
{2} | 0 0 0 -8a-22b-29c-24d 0 0 1 0 0 0 |
{2} | 0 0 0 2a+38b-47c 0 0 0 1 0 0 |
{2} | 0 0 0 45a+22b+16c 0 0 0 0 1 0 |
{2} | 0 0 0 -47a-48b-34c 0 0 0 0 0 1 |
4 5
3 : R <--------------------- R : 3
{3} | 0 1 0 0 0 |
{3} | 0 0 1 0 0 |
{3} | 0 0 0 1 0 |
{3} | 0 0 0 0 1 |
1 1
4 : R <------------- R : 4
{4} | 1 |
o40 : ComplexMap
|
i41 : assert(isWellDefined g' and isWellDefined h')
|
i42 : assert(isComplexMorphism g' and isComplexMorphism h')
|
i43 : assert not isShortExactSequence(h',g')
|
When $D == C$, the optional argument UseTarget selects the appropriate natural map.
i44 : f' = id_C
1 1
o44 = -1 : R <--------- R : -1
| 1 |
3 3
0 : R <----------------- R : 0
{1} | 1 0 0 |
{1} | 0 1 0 |
{1} | 0 0 1 |
3 3
1 : R <----------------- R : 1
{2} | 1 0 0 |
{2} | 0 1 0 |
{2} | 0 0 1 |
1 1
2 : R <------------- R : 2
{3} | 1 |
o44 : ComplexMap
|
i45 : F' = cylinder f'
2 7 9 5 1
o45 = R <-- R <-- R <-- R <-- R
-1 0 1 2 3
o45 : Complex
|
i46 : g = canonicalMap(F', C, UseTarget=>true)
2 1
o46 = -1 : R <--------- R : -1
| 0 |
| 1 |
7 3
0 : R <----------------- R : 0
{0} | 0 0 0 |
{1} | 0 0 0 |
{1} | 0 0 0 |
{1} | 0 0 0 |
{1} | 1 0 0 |
{1} | 0 1 0 |
{1} | 0 0 1 |
9 3
1 : R <----------------- R : 1
{1} | 0 0 0 |
{1} | 0 0 0 |
{1} | 0 0 0 |
{2} | 0 0 0 |
{2} | 0 0 0 |
{2} | 0 0 0 |
{2} | 1 0 0 |
{2} | 0 1 0 |
{2} | 0 0 1 |
5 1
2 : R <------------- R : 2
{2} | 0 |
{2} | 0 |
{2} | 0 |
{3} | 0 |
{3} | 1 |
o46 : ComplexMap
|
i47 : h = canonicalMap(F', C, UseTarget=>false)
2 1
o47 = -1 : R <--------- R : -1
| 1 |
| 0 |
7 3
0 : R <----------------- R : 0
{0} | 0 0 0 |
{1} | 1 0 0 |
{1} | 0 1 0 |
{1} | 0 0 1 |
{1} | 0 0 0 |
{1} | 0 0 0 |
{1} | 0 0 0 |
9 3
1 : R <----------------- R : 1
{1} | 0 0 0 |
{1} | 0 0 0 |
{1} | 0 0 0 |
{2} | 1 0 0 |
{2} | 0 1 0 |
{2} | 0 0 1 |
{2} | 0 0 0 |
{2} | 0 0 0 |
{2} | 0 0 0 |
5 1
2 : R <------------- R : 2
{2} | 0 |
{2} | 0 |
{2} | 0 |
{3} | 1 |
{3} | 0 |
o47 : ComplexMap
|
i48 : assert(isWellDefined g and isWellDefined h)
|
i49 : assert(g != h)
|
i50 : assert(isComplexMorphism g and isComplexMorphism h)
|