MPE Home Metamath Proof Explorer < Previous   Next >
Nearby theorems
Mirrors  >  Home  >  MPE Home  >  Th. List  >  ncvspi Structured version   Visualization version   GIF version

Theorem ncvspi 25510
Description: The norm of a vector plus the imaginary scalar product of another. (Contributed by NM, 2-Feb-2007.) (Revised by AV, 8-Oct-2021.)
Hypotheses
Ref Expression
ncvsprp.v 𝑉 = (Base‘𝑊)
ncvsprp.n 𝑁 = (norm‘𝑊)
ncvsprp.s · = ( ·𝑠 ‘𝑊)
ncvsdif.p + = (+g‘𝑊)
ncvspi.f 𝐹 = (Scalar‘𝑊)
ncvspi.k 𝐾 = (Base‘𝐹)
Assertion
Ref Expression
ncvspi ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (𝑁‘(𝐴 + (i · 𝐵))) = (𝑁‘(𝐵 + ( -i · 𝐴))))

Proof of Theorem ncvspi
StepHypRef Expression
1 elin 4096 . . . . . . 7 (𝑊 ∈ (NrmVec ∩ ℂVec) ↔ (𝑊 ∈ NrmVec ∧ 𝑊 ∈ ℂVec))
2 nvcnlm 25048 . . . . . . . . 9 (𝑊 ∈ NrmVec → 𝑊 ∈ NrmMod)
3 nlmngp 25029 . . . . . . . . 9 (𝑊 ∈ NrmMod → 𝑊 ∈ NrmGrp)
42, 3syl 18 . . . . . . . 8 (𝑊 ∈ NrmVec → 𝑊 ∈ NrmGrp)
54adantr 486 . . . . . . 7 ((𝑊 ∈ NrmVec ∧ 𝑊 ∈ ℂVec) → 𝑊 ∈ NrmGrp)
61, 5sylbi 220 . . . . . 6 (𝑊 ∈ (NrmVec ∩ ℂVec) → 𝑊 ∈ NrmGrp)
763ad2ant1 1151 . . . . 5 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → 𝑊 ∈ NrmGrp)
8 nvclmod 25050 . . . . . . . . . 10 (𝑊 ∈ NrmVec → 𝑊 ∈ LMod)
9 lmodgrp 21175 . . . . . . . . . 10 (𝑊 ∈ LMod → 𝑊 ∈ Grp)
108, 9syl 18 . . . . . . . . 9 (𝑊 ∈ NrmVec → 𝑊 ∈ Grp)
1110adantr 486 . . . . . . . 8 ((𝑊 ∈ NrmVec ∧ 𝑊 ∈ ℂVec) → 𝑊 ∈ Grp)
121, 11sylbi 220 . . . . . . 7 (𝑊 ∈ (NrmVec ∩ ℂVec) → 𝑊 ∈ Grp)
13123ad2ant1 1151 . . . . . 6 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → 𝑊 ∈ Grp)
14 simp2l 1218 . . . . . 6 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → 𝐴 ∈ 𝑉)
15 id 23 . . . . . . . . . 10 (𝑊 ∈ ℂVec → 𝑊 ∈ ℂVec)
1615cvsclm 25480 . . . . . . . . 9 (𝑊 ∈ ℂVec → 𝑊 ∈ ℂMod)
171, 16simplbiim 514 . . . . . . . 8 (𝑊 ∈ (NrmVec ∩ ℂVec) → 𝑊 ∈ ℂMod)
18173ad2ant1 1151 . . . . . . 7 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → 𝑊 ∈ ℂMod)
19 simp3 1156 . . . . . . 7 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → i ∈ 𝐾)
20 simp2r 1219 . . . . . . 7 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → 𝐵 ∈ 𝑉)
21 ncvsprp.v . . . . . . . 8 𝑉 = (Base‘𝑊)
22 ncvspi.f . . . . . . . 8 𝐹 = (Scalar‘𝑊)
23 ncvsprp.s . . . . . . . 8 · = ( ·𝑠 ‘𝑊)
24 ncvspi.k . . . . . . . 8 𝐾 = (Base‘𝐹)
2521, 22, 23, 24clmvscl 25442 . . . . . . 7 ((𝑊 ∈ ℂMod ∧ i ∈ 𝐾 ∧ 𝐵 ∈ 𝑉) → (i · 𝐵) ∈ 𝑉)
2618, 19, 20, 25syl3anc 1399 . . . . . 6 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (i · 𝐵) ∈ 𝑉)
27 ncvsdif.p . . . . . . 7 + = (+g‘𝑊)
2821, 27grpcl 19184 . . . . . 6 ((𝑊 ∈ Grp ∧ 𝐴 ∈ 𝑉 ∧ (i · 𝐵) ∈ 𝑉) → (𝐴 + (i · 𝐵)) ∈ 𝑉)
2913, 14, 26, 28syl3anc 1399 . . . . 5 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (𝐴 + (i · 𝐵)) ∈ 𝑉)
30 ncvsprp.n . . . . . 6 𝑁 = (norm‘𝑊)
3121, 30nmcl 24968 . . . . 5 ((𝑊 ∈ NrmGrp ∧ (𝐴 + (i · 𝐵)) ∈ 𝑉) → (𝑁‘(𝐴 + (i · 𝐵))) ∈ ℝ)
327, 29, 31syl2anc 596 . . . 4 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (𝑁‘(𝐴 + (i · 𝐵))) ∈ ℝ)
3332recnd 11367 . . 3 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (𝑁‘(𝐴 + (i · 𝐵))) ∈ ℂ)
3433mullidd 11357 . 2 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (1 · (𝑁‘(𝐴 + (i · 𝐵)))) = (𝑁‘(𝐴 + (i · 𝐵))))
35 ax-icn 11289 . . . . . 6 i ∈ ℂ
3635absnegi 15600 . . . . 5 (abs‘ -i) = (abs‘i)
37 absi 15485 . . . . 5 (abs‘i) = 1
3836, 37eqtri 2786 . . . 4 (abs‘ -i) = 1
3938oveq1i 7456 . . 3 ((abs‘ -i) · (𝑁‘(𝐴 + (i · 𝐵)))) = (1 · (𝑁‘(𝐴 + (i · 𝐵))))
40 simp1 1154 . . . . 5 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → 𝑊 ∈ (NrmVec ∩ ℂVec))
4122, 24clmneg 25435 . . . . . . . . . . 11 ((𝑊 ∈ ℂMod ∧ i ∈ 𝐾) → -i = ((invg‘𝐹)‘i))
4216, 41sylan 592 . . . . . . . . . 10 ((𝑊 ∈ ℂVec ∧ i ∈ 𝐾) → -i = ((invg‘𝐹)‘i))
4322clmfgrp 25425 . . . . . . . . . . . 12 (𝑊 ∈ ℂMod → 𝐹 ∈ Grp)
4416, 43syl 18 . . . . . . . . . . 11 (𝑊 ∈ ℂVec → 𝐹 ∈ Grp)
45 eqid 2763 . . . . . . . . . . . 12 (invg‘𝐹) = (invg‘𝐹)
4624, 45grpinvcl 19230 . . . . . . . . . . 11 ((𝐹 ∈ Grp ∧ i ∈ 𝐾) → ((invg‘𝐹)‘i) ∈ 𝐾)
4744, 46sylan 592 . . . . . . . . . 10 ((𝑊 ∈ ℂVec ∧ i ∈ 𝐾) → ((invg‘𝐹)‘i) ∈ 𝐾)
4842, 47eqeltrd 2864 . . . . . . . . 9 ((𝑊 ∈ ℂVec ∧ i ∈ 𝐾) → -i ∈ 𝐾)
4948ex 418 . . . . . . . 8 (𝑊 ∈ ℂVec → (i ∈ 𝐾 → -i ∈ 𝐾))
501, 49simplbiim 514 . . . . . . 7 (𝑊 ∈ (NrmVec ∩ ℂVec) → (i ∈ 𝐾 → -i ∈ 𝐾))
5150imp 412 . . . . . 6 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ i ∈ 𝐾) → -i ∈ 𝐾)
52513adant2 1149 . . . . 5 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → -i ∈ 𝐾)
5321, 30, 23, 22, 24ncvsprp 25506 . . . . 5 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ -i ∈ 𝐾 ∧ (𝐴 + (i · 𝐵)) ∈ 𝑉) → (𝑁‘( -i · (𝐴 + (i · 𝐵)))) = ((abs‘ -i) · (𝑁‘(𝐴 + (i · 𝐵)))))
5440, 52, 29, 53syl3anc 1399 . . . 4 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (𝑁‘( -i · (𝐴 + (i · 𝐵)))) = ((abs‘ -i) · (𝑁‘(𝐴 + (i · 𝐵)))))
5521, 22, 23, 24, 27clmvsdi 25446 . . . . . . 7 ((𝑊 ∈ ℂMod ∧ ( -i ∈ 𝐾 ∧ 𝐴 ∈ 𝑉 ∧ (i · 𝐵) ∈ 𝑉)) → ( -i · (𝐴 + (i · 𝐵))) = (( -i · 𝐴) + ( -i · (i · 𝐵))))
5618, 52, 14, 26, 55syl13anc 1400 . . . . . 6 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → ( -i · (𝐴 + (i · 𝐵))) = (( -i · 𝐴) + ( -i · (i · 𝐵))))
5735, 35mulneg1i 11792 . . . . . . . . . 10 ( -i · i) = -(i · i)
58 ixi 11975 . . . . . . . . . . . 12 (i · i) = -1
5958negeqi 11580 . . . . . . . . . . 11 -(i · i) = - -1
60 negneg1e1 12339 . . . . . . . . . . 11 - -1 = 1
6159, 60eqtri 2786 . . . . . . . . . 10 -(i · i) = 1
6257, 61eqtri 2786 . . . . . . . . 9 ( -i · i) = 1
6362oveq1i 7456 . . . . . . . 8 (( -i · i) · 𝐵) = (1 · 𝐵)
6421, 22, 23, 24clmvsass 25443 . . . . . . . . 9 ((𝑊 ∈ ℂMod ∧ ( -i ∈ 𝐾 ∧ i ∈ 𝐾 ∧ 𝐵 ∈ 𝑉)) → (( -i · i) · 𝐵) = ( -i · (i · 𝐵)))
6518, 52, 19, 20, 64syl13anc 1400 . . . . . . . 8 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (( -i · i) · 𝐵) = ( -i · (i · 𝐵)))
66 simpr 490 . . . . . . . . . . 11 ((𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) → 𝐵 ∈ 𝑉)
6717, 66anim12i 625 . . . . . . . . . 10 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉)) → (𝑊 ∈ ℂMod ∧ 𝐵 ∈ 𝑉))
68673adant3 1150 . . . . . . . . 9 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (𝑊 ∈ ℂMod ∧ 𝐵 ∈ 𝑉))
6921, 23clmvs1 25447 . . . . . . . . 9 ((𝑊 ∈ ℂMod ∧ 𝐵 ∈ 𝑉) → (1 · 𝐵) = 𝐵)
7068, 69syl 18 . . . . . . . 8 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (1 · 𝐵) = 𝐵)
7163, 65, 703eqtr3a 2822 . . . . . . 7 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → ( -i · (i · 𝐵)) = 𝐵)
7271oveq2d 7462 . . . . . 6 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (( -i · 𝐴) + ( -i · (i · 𝐵))) = (( -i · 𝐴) + 𝐵))
73 clmabl 25423 . . . . . . . . . 10 (𝑊 ∈ ℂMod → 𝑊 ∈ Abel)
7416, 73syl 18 . . . . . . . . 9 (𝑊 ∈ ℂVec → 𝑊 ∈ Abel)
751, 74simplbiim 514 . . . . . . . 8 (𝑊 ∈ (NrmVec ∩ ℂVec) → 𝑊 ∈ Abel)
76753ad2ant1 1151 . . . . . . 7 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → 𝑊 ∈ Abel)
7721, 22, 23, 24clmvscl 25442 . . . . . . . 8 ((𝑊 ∈ ℂMod ∧ -i ∈ 𝐾 ∧ 𝐴 ∈ 𝑉) → ( -i · 𝐴) ∈ 𝑉)
7818, 52, 14, 77syl3anc 1399 . . . . . . 7 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → ( -i · 𝐴) ∈ 𝑉)
7921, 27ablcom 20046 . . . . . . 7 ((𝑊 ∈ Abel ∧ ( -i · 𝐴) ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) → (( -i · 𝐴) + 𝐵) = (𝐵 + ( -i · 𝐴)))
8076, 78, 20, 79syl3anc 1399 . . . . . 6 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (( -i · 𝐴) + 𝐵) = (𝐵 + ( -i · 𝐴)))
8156, 72, 803eqtrd 2802 . . . . 5 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → ( -i · (𝐴 + (i · 𝐵))) = (𝐵 + ( -i · 𝐴)))
8281fveq2d 6915 . . . 4 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (𝑁‘( -i · (𝐴 + (i · 𝐵)))) = (𝑁‘(𝐵 + ( -i · 𝐴))))
8354, 82eqtr3d 2800 . . 3 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → ((abs‘ -i) · (𝑁‘(𝐴 + (i · 𝐵)))) = (𝑁‘(𝐵 + ( -i · 𝐴))))
8439, 83eqtr3id 2812 . 2 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (1 · (𝑁‘(𝐴 + (i · 𝐵)))) = (𝑁‘(𝐵 + ( -i · 𝐴))))
8534, 84eqtr3d 2800 1 ((𝑊 ∈ (NrmVec ∩ ℂVec) ∧ (𝐴 ∈ 𝑉 ∧ 𝐵 ∈ 𝑉) ∧ i ∈ 𝐾) → (𝑁‘(𝐴 + (i · 𝐵))) = (𝑁‘(𝐵 + ( -i · 𝐴))))
Colors of variables:    wff setvar class
This proof depends on syntax axioms:   → wi 4   ∧ wa 401   ∧ w3a 1103   = wceq 1570   ∈ wcel 2147   ∩ cin 4092  ‘cfv 6561  (class class class)co 7446  ℝcr 11229  1c1 11231  ici 11232   · cmul 11235   -cneg 11572  abscabs 15433  Basecbs 17419  +gcplusg 17460  Scalarcsca 17463   ·𝑠 cvsca 17464  Grpcgrp 19176  invgcminusg 19177  Abelcabl 20028  LModclmod 21168  normcnm 24928  NrmGrpcngp 24929  NrmModcnlm 24932  NrmVeccnvc 24933  ℂModcclm 25416  ℂVecccvs 25477
This proof depends on axioms:  ax-mp 5  ax-1 6  ax-2 7  ax-3 8  ax-gen 1828  ax-4 1842  ax-5 1945  ax-6 2002  ax-7 2043  ax-8 2149  ax-9 2157  ax-10 2180  ax-11 2197  ax-12 2216  ax-ext 2735  ax-sep 5253  ax-nul 5264  ax-pow 5332  ax-pr 5396  ax-un 7778  ax-cnex 11286  ax-resscn 11287  ax-1cn 11288  ax-icn 11289  ax-addcl 11290  ax-addrcl 11291  ax-mulcl 11292  ax-mulrcl 11293  ax-mulcom 11294  ax-addass 11295  ax-mulass 11296  ax-distr 11297  ax-i2m1 11298  ax-1ne0 11299  ax-1rid 11300  ax-rnegex 11301  ax-rrecex 11302  ax-cnre 11303  ax-pre-lttri 11304  ax-pre-lttrn 11305  ax-pre-ltadd 11306  ax-pre-mulgt0 11307  ax-pre-sup 11308  ax-addf 11309  ax-mulf 11310
This proof depends on definitions:  df-bi 210  df-an 402  df-or 862  df-3or 1104  df-3an 1105  df-tru 1573  df-fal 1583  df-ex 1813  df-nf 1817  df-sb 2102  df-mo 2567  df-eu 2597  df-clab 2742  df-cleq 2755  df-clel 2839  df-nfc 2913  df-ne 2960  df-nel 3066  df-ral 3081  df-rex 3091  df-rmo 3369  df-reu 3370  df-rab 3417  df-v 3456  df-sbc 3743  df-csb 3852  df-ss 3901  df-pss 4017  df-dif 4050  df-in 4094  df-un 4154  df-nul 4282  df-if 4486  df-pw 4562  df-sn 4589  df-pr 4591  df-tp 4593  df-op 4839  df-uni 4871  df-iun 4956  df-br 5107  df-opab 5172  df-mpt 5191  df-tr 5217  df-id 5551  df-eprel 5556  df-po 5564  df-so 5565  df-fr 5609  df-we 5611  df-xp 5662  df-rel 5663  df-cnv 5664  df-co 5665  df-dm 5666  df-rn 5667  df-res 5668  df-ima 5669  df-pred 6325  df-ord 6386  df-on 6387  df-lim 6388  df-suc 6389  df-iota 6515  df-fun 6563  df-fn 6564  df-f 6565  df-f1 6566  df-fo 6567  df-f1o 6568  df-fv 6569  df-riota 7403  df-ov 7449  df-oprab 7450  df-mpo 7451  df-om 7905  df-1st 8028  df-2nd 8029  df-frecs 8330  df-wrecs 8361  df-recs 8410  df-rdg 8449  df-1o 8507  df-er 8748  df-map 8880  df-en 9005  df-dom 9006  df-sdom 9007  df-fin 9008  df-sup 9464  df-inf 9465  df-pnf 11375  df-mnf 11376  df-xr 11377  df-ltxr 11378  df-le 11379  df-sub 11573  df-neg 11574  df-div 12004  df-nn 12366  df-2 12435  df-3 12436  df-4 12437  df-5 12438  df-6 12439  df-7 12440  df-8 12441  df-9 12442  df-n0 12637  df-z 12724  df-dec 12845  df-uz 12996  df-q 13106  df-rp 13151  df-xneg 13271  df-xadd 13272  df-xmul 13273  df-fz 13670  df-seq 14175  df-exp 14235  df-cj 15298  df-re 15299  df-im 15300  df-sqrt 15434  df-abs 15435  df-struct 17357  df-sets 17374  df-slot 17392  df-ndx 17404  df-base 17420  df-ress 17441  df-plusg 17473  df-mulr 17474  df-starv 17475  df-tset 17479  df-ple 17480  df-ds 17482  df-unif 17483  df-0g 17644  df-topgen 17646  df-mgm 18848  df-sgrp 18940  df-mnd 18956  df-grp 19179  df-minusg 19180  df-subg 19365  df-cmn 20029  df-abl 20030  df-mgp 20394  df-ur 20441  df-ring 20494  df-cring 20495  df-subrg 20855  df-lmod 21170  df-psmet 21703  df-xmet 21704  df-met 21705  df-bl 21706  df-mopn 21707  df-cnfld 21712  df-top 23245  df-topon 23262  df-topsp 23284  df-bases 23297  df-xms 24672  df-ms 24673  df-nm 24934  df-ngp 24935  df-nlm 24938  df-nvc 24939  df-clm 25417  df-cvs 25478
This theorem is used by: (None)
  Copyright terms: Public domain W3C validator