{-# OPTIONS --without-K --rewriting --lossy-unification --overlapping-instances --instance-search-depth=4 #-}

open import lib.Basics
open import lib.NType2
open import lib.types.Sigma
open import lib.Equivalence2 hiding (linv; rinv)
open import lib.types.LoopSpace
open import 2Semigroup
open import 2Grp
open import Hmtpy2Grp
open import Codes
open import Decode0
open import Decode1

module Decode2 where

module _ {i} {G : Type i} {{η : CohGrp G}} where

  open CohGrp {{...}}

  open import Delooping G

  open WkSGrpNatIso

  module _ (x y : G) where

    abstract
    
      code-β-mu-opt :
        θ codes-β (mu x y) ◃∎
          =ₛ
        ! ((∙-ap fst (ap codes (loop x)) (ap codes (loop y)) 
          ap (ap fst) (∙-Ω-fmap (codes , idp) (loop x) (loop y))) 
          ap (ap fst  ap codes) (loop-comp x y)) ◃∙
        ap2 _∙_ (θ codes-β x) (θ codes-β y) ◃∙
        ! (ua-∘e ((λ z  mu z x) , mu-post-iso x) ((λ z  mu z y) , mu-post-iso y)) ◃∙
        ap ua (pair= (λ=  v  ! (al v x y))) prop-has-all-paths-↓) ◃∎
      code-β-mu-opt =
        codes-β-mu x y ∙ₛ
        code-β-mu-opt-g x y
          (! ((∙-ap fst (ap codes (loop x)) (ap codes (loop y)) 
            ap (ap fst) (∙-Ω-fmap (codes , idp) (loop x) (loop y))) 
            ap (ap fst  ap codes) (loop-comp x y)))

      code-β-mu-ap : (z : G) 
        ap  q  coe q z) (θ codes-β (mu x y)) ◃∎
          =ₛ
        ap  q  coe q z)
          (! ((∙-ap fst (ap codes (loop x)) (ap codes (loop y)) 
            ap (ap fst) (∙-Ω-fmap (codes , idp) (loop x) (loop y))) 
            ap (ap fst  ap codes) (loop-comp x y))) ◃∙
        ap  q  coe q z) (ap2 _∙_ (θ codes-β x) (θ codes-β y)) ◃∙
        ap  q  coe q z)
          (! (ua-∘e ((λ z  mu z x) , mu-post-iso x) ((λ z  mu z y) , mu-post-iso y))) ◃∙
        ! (app= (ap coe (ap ua (pair= (λ=  v  al v x y)) prop-has-all-paths-↓))) z) ◃∎
      code-β-mu-ap z =
        ap  q  coe q z) (θ codes-β (mu x y)) ◃∎
          =ₛ⟨ ap-seq-=ₛ  q  coe q z) code-β-mu-opt 
        ap  q  coe q z)
          (! ((∙-ap fst (ap codes (loop x)) (ap codes (loop y)) 
            ap (ap fst) (∙-Ω-fmap (codes , idp) (loop x) (loop y))) 
            ap (ap fst  ap codes) (loop-comp x y))) ◃∙
        ap  q  coe q z) (ap2 _∙_ (θ codes-β x) (θ codes-β y)) ◃∙
        ap  q  coe q z)
          (! (ua-∘e ((λ z  mu z x) , mu-post-iso x) ((λ z  mu z y) , mu-post-iso y))) ◃∙
        ap  q  coe q z) (ap ua (pair= (λ=  v  ! (al v x y))) prop-has-all-paths-↓)) ◃∎
          =ₛ₁⟨ 3 & 1 & 
            ap-∘  u  u z) coe
              (ap ua (pair= (λ=  v  ! (al v x y))) prop-has-all-paths-↓)) 
            ap  q  ap  u  u z) (ap coe (ap ua (pair= q prop-has-all-paths-↓))))
              (!-λ=  v  al v x y)) 
            ap  q  ap  u  u z) (ap coe (ap ua (pair= (! (λ=  v  al {{η}} v x y))) q))))
              (prop-has-all-paths {{↓-level}}_ _) 
            ap  q  ap  u  u z) (ap coe (ap ua q))) (! (Σ-! prop-has-all-paths-↓)) 
            ap (ap  u  u z)  ap coe) (ap-! ua (pair= (λ=  v  al v x y)) prop-has-all-paths-↓)) 
            ap (ap  u  u z)) (ap-! coe (ap ua (pair= (λ=  v  al v x y)) prop-has-all-paths-↓))) 
            ap-!  u  u z) (ap coe (ap ua (pair= (λ=  v  al v x y)) prop-has-all-paths-↓))) 
        ap  q  coe q z)
          (! ((∙-ap fst (ap codes (loop x)) (ap codes (loop y)) 
            ap (ap fst) (∙-Ω-fmap (codes , idp) (loop x) (loop y))) 
            ap (ap fst  ap codes) (loop-comp x y))) ◃∙
        ap  q  coe q z) (ap2 _∙_ (θ codes-β x) (θ codes-β y)) ◃∙
        ap  q  coe q z)
          (! (ua-∘e ((λ z  mu z x) , mu-post-iso x) ((λ z  mu z y) , mu-post-iso y))) ◃∙
        ! (app= (ap coe (ap ua (pair= (λ=  v  al v x y)) prop-has-all-paths-↓))) z) ◃∎ ∎ₛ

      code-β-mu-ap2 : (z : G) 
        ap loop (ap  q  coe q z) (θ codes-β (mu x y))) ◃∎
          =ₛ
        ap loop (ap  q  coe q z)
          (! ((∙-ap fst (ap codes (loop x)) (ap codes (loop y)) 
            ap (ap fst) (∙-Ω-fmap (codes , idp) (loop x) (loop y))) 
            ap (ap fst  ap codes) (loop-comp x y)))) ◃∙
        ap loop (ap  q  coe q z) (ap2 _∙_ (θ codes-β x) (θ codes-β y))) ◃∙
        ap loop (ap  q  coe q z)
          (! (ua-∘e ((λ z  mu z x) , mu-post-iso x) ((λ z  mu z y) , mu-post-iso y)))) ◃∙
        ap loop (! (app= (ap coe (ap ua (pair= (λ=  v  al v x y)) prop-has-all-paths-↓))) z)) ◃∎
      code-β-mu-ap2 z = ap-seq-=ₛ loop (code-β-mu-ap z)

      abstract
        loop-comp-decode6 : (z : G) 
          transport
               v  loop (transport codes-fst (loop y) v) == loop v  loop y)
              (! ( (transp-codes x z)))
              (ap loop ( (transp-codes y (mu z x)))  ! (loop-comp (mu z x) y)) ◃∙
          ! (transp-cst=idf (loop y) (loop (transport codes-fst (loop x) z))) ◃∙
          ap (transport  b  base == b) (loop y)) (ap loop ( (transp-codes x z))) ◃∙
          ap (transport  b  base == b) (loop y)) (! (loop-comp z x)) ◃∙
          ap (transport  b  base == b) (loop y)) (! (transp-cst=idf (loop x) (loop z))) ◃∙
          ! (transp-∙ (loop x) (loop y) (loop z)) ◃∙
          ap  p  transport  b  base == b) p (loop z)) (loop-comp x y) ◃∎
            =ₛ
          ap loop ( (transp-codes y (transport codes-fst (loop x) z))) ◃∙
          ! (loop-comp (transport codes-fst (loop x) z) y) ◃∙
          ! (transp-cst=idf (loop y) (loop (transport codes-fst (loop x) z))) ◃∙
          ap (transport  b  base == b) (loop y)) (ap loop ( (transp-codes x z))) ◃∙
          ap (transport  b  base == b) (loop y)) (! (loop-comp z x)) ◃∙
          ap (transport  b  base == b) (loop y)) (! (transp-cst=idf (loop x) (loop z))) ◃∙
          ! (transp-∙ (loop x) (loop y) (loop z)) ◃∙
          ap  p  transport  b  base == b) p (loop z)) (loop-comp x y) ◃∎
        loop-comp-decode6 z = 
          transport
             v  loop (transport codes-fst (loop y) v) == loop v  loop y)
            (! ( (transp-codes x z)))
            (ap loop ( (transp-codes y (mu z x)))  ! (loop-comp (mu z x) y)) ◃∙
          ! (transp-cst=idf (loop y) (loop (transport codes-fst (loop x) z))) ◃∙
          ap (transport  b  base == b) (loop y)) (ap loop ( (transp-codes x z))) ◃∙
          ap (transport  b  base == b) (loop y)) (! (loop-comp z x)) ◃∙
          ap (transport  b  base == b) (loop y)) (! (transp-cst=idf (loop x) (loop z))) ◃∙
          ! (transp-∙ (loop x) (loop y) (loop z)) ◃∙
          ap  p  transport  b  base == b) p (loop z)) (loop-comp x y) ◃∎
            =ₑ⟨ 0 & 1 &
              (ap loop ( (transp-codes y (transport codes-fst (loop x) z))) ◃∙
              ! (loop-comp (transport codes-fst (loop x) z) y) ◃∎) %
              =ₛ-in $
                apd-tr  v  ap loop ( (transp-codes y v))  ! (loop-comp v y))
                  (! ( (transp-codes x z))) 
          ap loop ( (transp-codes y (transport codes-fst (loop x) z))) ◃∙
          ! (loop-comp (transport codes-fst (loop x) z) y) ◃∙
          ! (transp-cst=idf (loop y) (loop (transport codes-fst (loop x) z))) ◃∙
          ap (transport  b  base == b) (loop y)) (ap loop ( (transp-codes x z))) ◃∙
          ap (transport  b  base == b) (loop y)) (! (loop-comp z x)) ◃∙
          ap (transport  b  base == b) (loop y)) (! (transp-cst=idf (loop x) (loop z))) ◃∙
          ! (transp-∙ (loop x) (loop y) (loop z)) ◃∙
          ap  p  transport  b  base == b) p (loop z)) (loop-comp x y) ◃∎ ∎ₛ