Definition local_out_of_reach mu (m : mem) (b : block) (ofs : Z): Prop :=
locBlocksTgt mu b = true /\
forall b0 delta, local_of mu b0 = Some (b, delta) ->
(~ Mem.perm m b0 (ofs - delta) Max Nonempty \/
pubBlocksSrc mu b0 = false).

(*Generic proof that the inital structured injection satisfies the match_genv, match_wd and match_valid conditions of the LSR*)
Lemma core_initial_wd : forall {F1 V1 F2 V2} (ge1: Genv.t F1 V1) (ge2: Genv.t F2 V2)
vals1 m1 j vals2 m2 DomS DomT
(MInj: Mem.inject j m1 m2)
(VInj: Forall2 (val_inject j) vals1 vals2)
(HypJ: forall b1 b2 d, j b1 = Some (b2, d) -> DomS b1 = true /\ DomT b2 = true)
(R: forall b, REACH m2 (fun b' => isGlobalBlock ge2 b' || getBlocks vals2 b') b = true ->
DomT b = true)
(PG: meminj_preserves_globals ge1 j)
(GenvsDomEQ: genvs_domain_eq ge1 ge2)
(HS: forall b, DomS b = true -> Mem.valid_block m1 b)
(HT: forall b, DomT b = true -> Mem.valid_block m2 b)
mu (Hmu: mu = initial_SM DomS DomT
(REACH m1 (fun b => isGlobalBlock ge1 b || getBlocks vals1 b))
(REACH m2 (fun b => isGlobalBlock ge2 b || getBlocks vals2 b)) j),
(forall b, REACH m1 (fun b' => isGlobalBlock ge1 b' || getBlocks vals1 b') b = true ->
DomS b = true) /\
SM_wd mu /\ sm_valid mu m1 m2 /\
meminj_preserves_globals ge1 (extern_of mu) /\
(forall b, isGlobalBlock ge1 b = true -> frgnBlocksSrc mu b = true) /\
REACH_closed m1 (vis mu) /\
REACH_closed m1 (mapped (as_inj mu)).